| Index: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| index baca5a46da5d827f732e502d3aa28a2854eb9608..16e232150324f70d0af6387a60ced967d552ad38 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| @@ -246,52 +246,92 @@ class DestroyViewTreeNodeTransaction : public ViewManagerTransaction {
|
| DISALLOW_COPY_AND_ASSIGN(DestroyViewTreeNodeTransaction);
|
| };
|
|
|
| -class HierarchyTransaction : public ViewManagerTransaction {
|
| +class AddChildTransaction : public ViewManagerTransaction {
|
| public:
|
| - enum HierarchyChangeType {
|
| - TYPE_ADD,
|
| - TYPE_REMOVE
|
| - };
|
| - HierarchyTransaction(HierarchyChangeType hierarchy_change_type,
|
| - Id child_id,
|
| - Id parent_id,
|
| - ViewManagerSynchronizer* synchronizer)
|
| + AddChildTransaction(Id child_id,
|
| + Id parent_id,
|
| + ViewManagerSynchronizer* synchronizer)
|
| : ViewManagerTransaction(synchronizer),
|
| - hierarchy_change_type_(hierarchy_change_type),
|
| child_id_(child_id),
|
| parent_id_(parent_id) {}
|
| - virtual ~HierarchyTransaction() {}
|
| + virtual ~AddChildTransaction() {}
|
|
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - switch (hierarchy_change_type_) {
|
| - case TYPE_ADD:
|
| - service()->AddNode(
|
| - parent_id_,
|
| - child_id_,
|
| - GetAndAdvanceNextServerChangeId(),
|
| - ActionCompletedCallback());
|
| - break;
|
| - case TYPE_REMOVE:
|
| - service()->RemoveNodeFromParent(
|
| - child_id_,
|
| - GetAndAdvanceNextServerChangeId(),
|
| - ActionCompletedCallback());
|
| - break;
|
| - }
|
| + service()->AddNode(parent_id_,
|
| + child_id_,
|
| + GetAndAdvanceNextServerChangeId(),
|
| + ActionCompletedCallback());
|
| }
|
|
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| - // TODO(beng): Failure means either one of the nodes specified didn't exist,
|
| - // or we passed the same node id for both params. Roll back?
|
| + // TODO(beng): recovery?
|
| }
|
|
|
| - const HierarchyChangeType hierarchy_change_type_;
|
| const Id child_id_;
|
| const Id parent_id_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(HierarchyTransaction);
|
| + DISALLOW_COPY_AND_ASSIGN(AddChildTransaction);
|
| +};
|
| +
|
| +class RemoveChildTransaction : public ViewManagerTransaction {
|
| + public:
|
| + RemoveChildTransaction(Id child_id,
|
| + ViewManagerSynchronizer* synchronizer)
|
| + : ViewManagerTransaction(synchronizer),
|
| + child_id_(child_id) {}
|
| + virtual ~RemoveChildTransaction() {}
|
| +
|
| + private:
|
| + // Overridden from ViewManagerTransaction:
|
| + virtual void DoCommit() OVERRIDE {
|
| + service()->RemoveNodeFromParent(
|
| + child_id_,
|
| + GetAndAdvanceNextServerChangeId(),
|
| + ActionCompletedCallback());
|
| + }
|
| +
|
| + virtual void DoActionCompleted(bool success) OVERRIDE {
|
| + // TODO(beng): recovery?
|
| + }
|
| +
|
| + const Id child_id_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RemoveChildTransaction);
|
| +};
|
| +
|
| +class ReorderNodeTransaction : public ViewManagerTransaction {
|
| + public:
|
| + ReorderNodeTransaction(Id node_id,
|
| + Id relative_id,
|
| + OrderDirection direction,
|
| + ViewManagerSynchronizer* synchronizer)
|
| + : ViewManagerTransaction(synchronizer),
|
| + node_id_(node_id),
|
| + relative_id_(relative_id),
|
| + direction_(direction) {}
|
| + virtual ~ReorderNodeTransaction() {}
|
| +
|
| + private:
|
| + // Overridden from ViewManagerTransaction:
|
| + virtual void DoCommit() OVERRIDE {
|
| + service()->ReorderNode(node_id_,
|
| + relative_id_,
|
| + direction_,
|
| + GetAndAdvanceNextServerChangeId(),
|
| + ActionCompletedCallback());
|
| + }
|
| +
|
| + virtual void DoActionCompleted(bool success) OVERRIDE {
|
| + // TODO(beng): recovery?
|
| + }
|
| +
|
| + const Id node_id_;
|
| + const Id relative_id_;
|
| + const OrderDirection direction_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ReorderNodeTransaction);
|
| };
|
|
|
| class SetActiveViewTransaction : public ViewManagerTransaction {
|
| @@ -495,20 +535,23 @@ void ViewManagerSynchronizer::AddChild(Id child_id,
|
| Id parent_id) {
|
| DCHECK(connected_);
|
| pending_transactions_.push_back(
|
| - new HierarchyTransaction(HierarchyTransaction::TYPE_ADD,
|
| - child_id,
|
| - parent_id,
|
| - this));
|
| + new AddChildTransaction(child_id, parent_id, this));
|
| Sync();
|
| }
|
|
|
| void ViewManagerSynchronizer::RemoveChild(Id child_id, Id parent_id) {
|
| DCHECK(connected_);
|
| + pending_transactions_.push_back(new RemoveChildTransaction(child_id, this));
|
| + Sync();
|
| +}
|
| +
|
| +void ViewManagerSynchronizer::Reorder(
|
| + Id node_id,
|
| + Id relative_node_id,
|
| + OrderDirection direction) {
|
| + DCHECK(connected_);
|
| pending_transactions_.push_back(
|
| - new HierarchyTransaction(HierarchyTransaction::TYPE_REMOVE,
|
| - child_id,
|
| - parent_id,
|
| - this));
|
| + new ReorderNodeTransaction(node_id, relative_node_id, direction, this));
|
| Sync();
|
| }
|
|
|
| @@ -638,7 +681,6 @@ void ViewManagerSynchronizer::OnNodeHierarchyChanged(
|
| Id old_parent_id,
|
| Id server_change_id,
|
| mojo::Array<INodePtr> nodes) {
|
| - // TODO: deal with |nodes|.
|
| next_server_change_id_ = server_change_id + 1;
|
|
|
| BuildNodeTree(this, nodes);
|
| @@ -652,6 +694,19 @@ void ViewManagerSynchronizer::OnNodeHierarchyChanged(
|
| ViewTreeNodePrivate(old_parent).LocalRemoveChild(node);
|
| }
|
|
|
| +void ViewManagerSynchronizer::OnNodeReordered(Id node_id,
|
| + Id relative_node_id,
|
| + OrderDirection direction,
|
| + Id server_change_id) {
|
| + next_server_change_id_ = server_change_id + 1;
|
| +
|
| + ViewTreeNode* node = GetNodeById(node_id);
|
| + ViewTreeNode* relative_node = GetNodeById(relative_node_id);
|
| + if (node && relative_node) {
|
| + ViewTreeNodePrivate(node).LocalReorder(relative_node, direction);
|
| + }
|
| +}
|
| +
|
| void ViewManagerSynchronizer::OnNodeDeleted(Id node_id, Id server_change_id) {
|
| next_server_change_id_ = server_change_id + 1;
|
|
|
|
|