1
////////////////////////////////////////////////////////////////////////////
2
// NoteCase notes manager project <http://notecase.sf.net>
4
// This code is licensed under BSD license.See "license.txt" for more details.
6
// File: Implements iterator/helper methods for traversing NoteDocument object
7
////////////////////////////////////////////////////////////////////////////
9
#include "DocumentIterator.h"
12
DocumentIterator::DocumentIterator(NoteDocument &doc) : m_doc(doc)
16
DocumentIterator::~DocumentIterator()
20
int DocumentIterator::GetChildCount(int nParentID, bool bRecursive)
23
for(unsigned int i=0; i<m_doc.GetNodeCount(); i++)
25
if(m_doc.m_lstNodes[i].m_nParentID == nParentID)
29
nCount += GetChildCount(m_doc.m_lstNodes[i].m_nID, true);
35
int DocumentIterator::GetChildIdx(int nParentID, int nSiblingIdx)
37
for(unsigned int i=0; i<m_doc.GetNodeCount(); i++)
39
if(m_doc.m_lstNodes[i].m_nParentID == nParentID)
41
if(m_doc.m_lstNodes[i].m_nSiblingIdx == nSiblingIdx)
49
int DocumentIterator::NodeIdx2RecursiveIdx(int nIdx)
51
int nRecursiveIdx = -1;
55
int nParentID = m_doc.GetNodeByIdx(nIdx).m_nParentID;
56
int nSiblingIdx = m_doc.GetNodeByIdx(nIdx).m_nSiblingIdx;
58
//count the current node
64
nIdx = GetChildIdx(nParentID, nSiblingIdx-1); //previous sibling
66
//recursively go to the last node child
67
int nID = m_doc.GetNodeByIdx(nIdx).m_nID;
68
int nChildCount = GetChildCount(nID);
69
while(nChildCount > 0)
71
nIdx = GetChildIdx(nID, nChildCount-1);
72
nID = m_doc.GetNodeByIdx(nIdx).m_nID;
73
nChildCount = GetChildCount(nID);
77
nIdx = m_doc.GetIdxFromID(nParentID); //
85
int DocumentIterator::RecursiveIdx2NodeIdx(int nIdx)
88
return RecursiveGetIdx(nIdx, ROOT_PARENT_ID, nCounter);
91
int DocumentIterator::RecursiveGetIdx(int nRIdx, int nParentID, int &nCounter)
93
int nChildCnt = GetChildCount(nParentID);
96
//recurse into children
97
for(int i=0; i<nChildCnt; i++)
101
int nChildIdx = GetChildIdx(nParentID, i);
104
if(nCounter == nRIdx)
107
int nChildID = m_doc.GetNodeByIdx(nChildIdx).m_nID;
108
int nIdxNode = RecursiveGetIdx(nRIdx, nChildID, nCounter);
115
return -1; //not found at this level
118
bool DocumentIterator::IsSiblingByIdx(int nIdx1, int nIdx2)
120
//siblings are nodes with the same aprent
121
return (m_doc.GetNodeByIdx(nIdx1).m_nParentID == m_doc.GetNodeByIdx(nIdx2).m_nParentID);
124
bool DocumentIterator::IsAncestorByIdx(int nAncestorIdx, int nIdx)
126
int nAncestorID = m_doc.GetNodeByIdx(nAncestorIdx).m_nID;
128
//check each parent node up to the tree root
130
while (nNodeIdx >= 0)
132
int nPID = m_doc.GetNodeByIdx(nNodeIdx).m_nParentID;
133
if(nPID == nAncestorID)
134
return true; //parent or grandparent or ...
136
nNodeIdx = m_doc.GetIdxFromID(nPID); //recurse to the parent node
139
return false; //not an ancestor
142
NoteNode &DocumentIterator::GetNodeByID(int nID)
144
int nIdx = m_doc.GetIdxFromID(nID);
146
return m_doc.GetNodeByIdx(nIdx);
149
int DocumentIterator::CalcNodeLevel(int nIdx)
152
int nParentID = m_doc.GetNodeByIdx(nIdx).m_nParentID;
153
while(nParentID >= 0){
155
nParentID = GetNodeByID(nParentID).m_nParentID;
1
////////////////////////////////////////////////////////////////////////////
2
// NoteCase notes manager project <http://notecase.sf.net>
4
// This code is licensed under BSD license.See "license.txt" for more details.
6
// File: Implements iterator/helper methods for traversing NoteDocument object
7
////////////////////////////////////////////////////////////////////////////
9
#include "DocumentIterator.h"
12
DocumentIterator::DocumentIterator(NoteDocument &doc) : m_doc(doc)
16
DocumentIterator::~DocumentIterator()
20
int DocumentIterator::GetChildCount(int nParentID, bool bRecursive)
23
for(unsigned int i=0; i<m_doc.GetNodeCount(); i++)
25
if(m_doc.m_lstNodes[i].m_nParentID == nParentID)
29
nCount += GetChildCount(m_doc.m_lstNodes[i].m_nID, true);
35
int DocumentIterator::GetChildIdx(int nParentID, int nSiblingIdx)
37
for(unsigned int i=0; i<m_doc.GetNodeCount(); i++)
39
if(m_doc.m_lstNodes[i].m_nParentID == nParentID)
41
if(m_doc.m_lstNodes[i].m_nSiblingIdx == nSiblingIdx)
49
int DocumentIterator::NodeIdx2RecursiveIdx(int nIdx)
51
int nRecursiveIdx = -1;
55
int nParentID = m_doc.GetNodeByIdx(nIdx).m_nParentID;
56
int nSiblingIdx = m_doc.GetNodeByIdx(nIdx).m_nSiblingIdx;
58
//count the current node
64
nIdx = GetChildIdx(nParentID, nSiblingIdx-1); //previous sibling
66
//recursively go to the last node child
67
int nID = m_doc.GetNodeByIdx(nIdx).m_nID;
68
int nChildCount = GetChildCount(nID);
69
while(nChildCount > 0)
71
nIdx = GetChildIdx(nID, nChildCount-1);
72
nID = m_doc.GetNodeByIdx(nIdx).m_nID;
73
nChildCount = GetChildCount(nID);
77
nIdx = m_doc.GetIdxFromID(nParentID); //
85
int DocumentIterator::RecursiveIdx2NodeIdx(int nIdx)
88
return RecursiveGetIdx(nIdx, ROOT_PARENT_ID, nCounter);
91
int DocumentIterator::RecursiveGetIdx(int nRIdx, int nParentID, int &nCounter)
93
int nChildCnt = GetChildCount(nParentID);
96
//recurse into children
97
for(int i=0; i<nChildCnt; i++)
101
int nChildIdx = GetChildIdx(nParentID, i);
104
if(nCounter == nRIdx)
107
int nChildID = m_doc.GetNodeByIdx(nChildIdx).m_nID;
108
int nIdxNode = RecursiveGetIdx(nRIdx, nChildID, nCounter);
115
return -1; //not found at this level
118
bool DocumentIterator::IsSiblingByIdx(int nIdx1, int nIdx2)
120
//siblings are nodes with the same aprent
121
return (m_doc.GetNodeByIdx(nIdx1).m_nParentID == m_doc.GetNodeByIdx(nIdx2).m_nParentID);
124
bool DocumentIterator::IsAncestorByIdx(int nAncestorIdx, int nIdx)
126
int nAncestorID = m_doc.GetNodeByIdx(nAncestorIdx).m_nID;
128
//check each parent node up to the tree root
130
while (nNodeIdx >= 0)
132
int nPID = m_doc.GetNodeByIdx(nNodeIdx).m_nParentID;
133
if(nPID == nAncestorID)
134
return true; //parent or grandparent or ...
136
nNodeIdx = m_doc.GetIdxFromID(nPID); //recurse to the parent node
139
return false; //not an ancestor
142
NoteNode &DocumentIterator::GetNodeByID(int nID)
144
int nIdx = m_doc.GetIdxFromID(nID);
146
return m_doc.GetNodeByIdx(nIdx);
149
int DocumentIterator::CalcNodeLevel(int nIdx)
152
int nParentID = m_doc.GetNodeByIdx(nIdx).m_nParentID;
153
while(nParentID >= 0){
155
nParentID = GetNodeByID(nParentID).m_nParentID;