void UIHierarchy::AddBefore(UIHierarchyNode *forParent) { UIHierarchyNode *checkNode = NULL; if (!iheritanceQueue.empty()) { checkNode = *(iheritanceQueue.begin()); iheritanceQueue.pop_front(); } for (List<UIHierarchyNode *>::reverse_iterator it = forParent->children.rbegin(); it != forParent->children.rend(); it++) { if (checkNode) { if ((*it) == checkNode) { checkNode = NULL; if ((*it)->isOpen && !iheritanceQueue.empty()) { AddBefore((*it)); if(addPos + (int32)scrollContainer->relativePosition.y + cellHeight <= -size.y) { return; } if(addPos + (int32)scrollContainer->relativePosition.y <= size.y * 2) { AddCellAtPos(delegate->CellForNode(this, (*it)->userNode), addPos, cellHeight, (*it)); } addPos -= cellHeight; } } } else { if(addPos + (int32)scrollContainer->relativePosition.y + cellHeight <= -size.y) { return; } if ((*it)->isOpen) { AddBefore((*it)); if(addPos + (int32)scrollContainer->relativePosition.y + cellHeight <= -size.y) { return; } } if(addPos + (int32)scrollContainer->relativePosition.y <= size.y * 2) { AddCellAtPos(delegate->CellForNode(this, (*it)->userNode), addPos, cellHeight, (*it)); } addPos -= cellHeight; } } }
CTreeElement<T> * CTree<T>::Add(CTreeElement<T> * Node, const T& Element, bool * Added) { if (Added) (* Added) = true; if (!Node) Node = m_Head; if (!Node) { m_Head = new CTreeElement<T>(Element); return m_Head; } /* hack: try to add to parent's last element */ if (Node->m_Parent) { if (m_Sorted) { if (Greater(Element, Node->m_Parent->m_LastChild->m_Element)) { return AddAfter(Node->m_Parent->m_LastChild, Element); } else if (m_Unique && (Equal(Node->m_Parent->m_LastChild->m_Element, Element))) { if (Added) (* Added) = false; return Node->m_Parent->m_LastChild; } } Node = Node->m_Parent->m_Child; } else Node = m_Head; /* classic insertion */ while(1) { if (m_Unique && Equal(Node->m_Element, Element)) { if (Added) (* Added) = false; return Node; } else if (m_Sorted && (Greater(Node->m_Element, Element))) return AddBefore(Node, Element); if (Node->m_Next) Node = Node->m_Next; else break; } return AddAfter(Node, Element); }
CTreeElement<T> * CTree<T>::AddChild(CTreeElement<T> * Node, const T& Element, bool * Added) { if (Added) (* Added) = true; if (!Node) Node = m_Head; if (!Node) { m_Head = new CTreeElement<T>(Element); return m_Head; } /* hack: check the last element first */ if (m_Sorted && Node->m_LastChild) { if (Greater(Element, Node->m_LastChild->m_Element)) { return AddAfter(Node->m_LastChild, Element); } else if (m_Unique && (Equal(Node->m_LastChild->m_Element, Element))) { if (Added) (* Added) = false; return Node->m_LastChild; } } /* classic add to the tree */ CTreeElement<T> * Current = Node->m_Child; if (!Current) return AddChildFirst(Node, Element); while(1) { if (m_Unique && Equal(Current->m_Element, Element)) { if (Added) (* Added) = false; return Current; } else if (m_Sorted && (Greater(Current->m_Element, Element))) { return AddBefore(Current, Element); } if (Current->m_Next) Current = Current->m_Next; else break; } return AddAfter(Current, Element); }
void UIHierarchy::AddCellsBefore(UIHierarchyNode *beforeNode) { iheritanceQueue.clear(); UIHierarchyNode *nd = beforeNode; while (nd != baseNode) { iheritanceQueue.push_front(nd); nd = nd->parent; } AddBefore(baseNode); }