Пример #1
0
void DocHistory::AddChildren(int parent_pos, const doc_id& di, const doc_id& sel_doc, const Catalyst& catalyst) {
	wxASSERT(di.IsDocument());

	const int childCount = catalyst.GetChildCount(di);
	for (int i = 0; i < childCount; ++i) {
		const doc_id child = catalyst.GetChildID(di, i);
		item new_item;
		new_item.doc = child;
		new_item.date = catalyst.GetDocDate(child);
		new_item.parent = parent_pos;

		// Find the insert pos
		size_t n;
		for (n = parent_pos+1; n < m_items.size(); ++n) {
			if (new_item.date < m_items[n].date) {
				m_items.insert(m_items.begin()+n, new_item);

				// The indexes under the insertion has moved, so
				// we also have to update any references to this range
				if (m_selectedNode >= (int)n) ++m_selectedNode;
				for (size_t n2 = n+1; n2 < m_items.size(); ++n2) {
					int& parent = m_items[n2].parent;
					if (parent >= (int)n) ++parent;
				}
				break;
			}
		}
		if (n == m_items.size()) {
			m_items.push_back(new_item);
		}

		// Check if this is the selected node
		if (child.IsDocument()) {
			if (child == sel_doc) m_selectedNode = n;

			AddChildren(n, child, sel_doc, catalyst);
		}
		else if (child.SameDoc(sel_doc)) m_selectedNode = n;
	}
}