void CStandardNodePositioning::ApplyTo (IRevisionGraphLayout* layout) { // we need access to actual data IStandardLayoutNodeAccess* nodeAccess = dynamic_cast<IStandardLayoutNodeAccess*>(layout); if (nodeAccess == NULL) return; // calculate the displacement for every node (member subTreeShift) CSize treeShift (0,0); for (index_t i = 0, count = nodeAccess->GetNodeCount(); i < count; ++i) { CStandardLayoutNodeInfo* node = nodeAccess->GetNode(i); if (node->node->GetSource() == NULL) { // we found a root -> place it std::vector<long> columnStarts; std::vector<long> ColumnEnds; PlaceBranch (node, columnStarts, ColumnEnds); // actually move the node rects to thier final position ShiftNodes (node, treeShift); treeShift.cx = BoundingRect (node).right + 100; } } }
void CStrictOrderNodePositioning::ApplyTo (IRevisionGraphLayout* layout) { // we need access to actual data IStandardLayoutNodeAccess* nodeAccess = dynamic_cast<IStandardLayoutNodeAccess*>(layout); if (nodeAccess == NULL) return; // assign columns and rows std::vector<std::pair<revision_t, CStandardLayoutNodeInfo*> > nodes; SortRevisions (nodeAccess, nodes); std::vector<int> columnWidths; AssignColumns (nodes, columnWidths); AssignRows (nodes); // post-processing ShiftNodes (nodes, columnWidths); }
void CStandardNodePositioning::ShiftNodes ( CStandardLayoutNodeInfo* node , CSize delta) { // walk along this branch delta += node->treeShift; for ( ; node != NULL; node = node->nextInBranch) { node->rect += delta; node->subTreeShift += delta; // shift sub-branches for ( CStandardLayoutNodeInfo* branch = node->firstSubBranch ; branch != NULL ; branch = branch->nextBranch) { ShiftNodes (branch, node->subTreeShift); } } }