Index: mojo/services/view_manager/view_manager_connection.cc |
diff --git a/mojo/services/view_manager/view_manager_connection.cc b/mojo/services/view_manager/view_manager_connection.cc |
index 8d4d0a6438ec31f1a7336fed2ddfdb1d7ab66464..ada5e84b17288773cb3029dde7fe70c3d2f71052 100644 |
--- a/mojo/services/view_manager/view_manager_connection.cc |
+++ b/mojo/services/view_manager/view_manager_connection.cc |
@@ -170,6 +170,23 @@ void ViewManagerConnection::ProcessNodeHierarchyChanged( |
NodesToINodes(to_send)); |
} |
+void ViewManagerConnection::ProcessNodeReorder(const Node* node, |
+ const Node* relative_node, |
+ OrderDirection direction, |
+ Id server_change_id, |
+ bool originated_change) { |
+ if (originated_change || |
+ !known_nodes_.count(NodeIdToTransportId(node->id())) || |
+ !known_nodes_.count(NodeIdToTransportId(relative_node->id()))) { |
+ return; |
+ } |
+ |
+ client()->OnNodeReordered(NodeIdToTransportId(node->id()), |
+ NodeIdToTransportId(relative_node->id()), |
+ direction, |
+ server_change_id); |
+} |
+ |
void ViewManagerConnection::ProcessNodeViewReplaced( |
const Node* node, |
const View* new_view, |
@@ -267,6 +284,12 @@ bool ViewManagerConnection::CanAddNode(const Node* parent, |
return (IsNodeDescendantOfRoots(child) || child->id().connection_id == id_); |
} |
+bool ViewManagerConnection::CanReorderNode(const Node* node, |
+ const Node* relatve_node) const { |
sky
2014/06/11 19:36:44
relative_node.
|
+ return node->id().connection_id == id_ && |
sky
2014/06/11 19:36:44
You should also check: both nodes are non-null, an
|
+ node->GetParent() == relatve_node->GetParent(); |
+} |
+ |
bool ViewManagerConnection::CanDeleteNode(const NodeId& node_id) const { |
return node_id.connection_id == id_; |
} |
@@ -553,6 +576,27 @@ void ViewManagerConnection::RemoveNodeFromParent( |
callback.Run(success); |
} |
+void ViewManagerConnection::ReorderNode(Id node_id, |
+ Id relative_node_id, |
+ OrderDirection direction, |
+ Id server_change_id, |
+ const Callback<void(bool)>& callback) { |
+ bool success = false; |
+ if (server_change_id == root_node_manager_->next_server_change_id()) { |
+ Node* node = GetNode(NodeIdFromTransportId(node_id)); |
+ Node* relative_node = GetNode(NodeIdFromTransportId(relative_node_id)); |
+ if (CanReorderNode(node, relative_node)) { |
+ success = true; |
+ RootNodeManager::ScopedChange change( |
+ this, root_node_manager_, |
+ RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false); |
+ node->GetParent()->Reorder(node, relative_node, direction); |
+ root_node_manager_->ProcessNodeReorder(node, relative_node, direction); |
+ } |
+ } |
+ callback.Run(success); |
+} |
+ |
void ViewManagerConnection::GetNodeTree( |
Id node_id, |
const Callback<void(Array<INodePtr>)>& callback) { |