505 lines
23 KiB
MQL5
505 lines
23 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
|||
|
|
//| Tree |
|
|||
|
|
//| Copyright 2006-2011, www.FXmaster.de |
|
|||
|
|
//| www.FXmaster.de |
|
|||
|
|
//+------------------------------------------------------------------+
|
|||
|
|
#property copyright "Copyright 2006-2011, www.FXmaster.de"
|
|||
|
|
#property link "www.FXmaster.de"
|
|||
|
|
#property version "1.00"
|
|||
|
|
|
|||
|
|
#include "Node.mqh"
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------ class CTreeBase
|
|||
|
|
class CTreeBase
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
CNode *m_root; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int m_maxid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
|||
|
|
|
|||
|
|
//--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
CTreeBase(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
~CTreeBase(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Clear(CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CNode* FindNode(int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ID, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
CNode* FindNode(string txt, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> txt, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int GetID(string txt, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Text, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int GetMaxID(CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int AddNode(int id, string text, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ID <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int AddNode(string txt, string text, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int AddNode(CNode *root, string text); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> root
|
|||
|
|
};
|
|||
|
|
//------------------------------------------------------------------ CTreeBase
|
|||
|
|
void CTreeBase::CTreeBase()
|
|||
|
|
{
|
|||
|
|
m_maxid=0; m_root=new CNode;
|
|||
|
|
m_root.m_id=m_maxid; m_root.m_text="__base__";
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ ~CTreeBase
|
|||
|
|
void CTreeBase::~CTreeBase()
|
|||
|
|
{
|
|||
|
|
delete m_root; m_maxid=0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ Reset
|
|||
|
|
void CTreeBase::Clear(CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
root.m_uses=0; root.m_tick=0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (!NIL(root.m_next[i])) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
delete root.m_next[i];
|
|||
|
|
ArrayResize(root.m_next, 0);
|
|||
|
|
m_maxid=GetMaxID(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ FindNode
|
|||
|
|
CNode* CTreeBase::FindNode(int id, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return(NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root.m_id==id) return(root); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CNode *node; int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node=FindNode(id, root.m_next[i]); if (!NIL(node)) return(node); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
return(NULL);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ FindNode
|
|||
|
|
CNode* CTreeBase::FindNode(string txt, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return(NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root.m_text==txt) return(root); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CNode *node; int n;
|
|||
|
|
n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node=FindNode(txt, root.m_next[i]); if (!NIL(node)) return(node); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
return(NULL);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ GetID
|
|||
|
|
int CTreeBase::GetID(string txt, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(txt, root); if (NIL(node)) return(-1);
|
|||
|
|
return(node.m_id);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ GetMaxID
|
|||
|
|
int CTreeBase::GetMaxID(CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return(-1); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int max=root.m_id;
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
max=MathMax(max, GetMaxID(root.m_next[i]));
|
|||
|
|
}
|
|||
|
|
return(max);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ AddNode
|
|||
|
|
int CTreeBase::AddNode(int id, string text, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(-1);
|
|||
|
|
int size=ArraySize(node.m_next); bool b=false; int i;
|
|||
|
|
for (i=0; i<size; i++) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(node.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (node.m_next[i].m_text==text) { b=true; break; }
|
|||
|
|
}
|
|||
|
|
if (b) return(node.m_next[i].m_id); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ArrayResize(node.m_next, size+1); node.m_next[size]=new CNode; m_maxid++;
|
|||
|
|
node.m_next[size].m_id=m_maxid; node.m_next[size].m_text=text; node.m_next[size].m_prev=node;
|
|||
|
|
return(node.m_next[size].m_id);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ AddNode
|
|||
|
|
int CTreeBase::AddNode(string txt, string text, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(txt, root); if (NIL(node)) return(-1);
|
|||
|
|
int size=ArraySize(node.m_next); bool b=false; int i;
|
|||
|
|
for (i=0; i<size; i++) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(node.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (node.m_next[i].m_text==text) { b=true; break; }
|
|||
|
|
}
|
|||
|
|
if (b) return(node.m_next[i].m_id); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ArrayResize(node.m_next, size+1); node.m_next[size]=new CNode; m_maxid++;
|
|||
|
|
node.m_next[size].m_id=m_maxid; node.m_next[size].m_text=text; node.m_next[size].m_prev=node;
|
|||
|
|
return(node.m_next[size].m_id);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ AddNode
|
|||
|
|
int CTreeBase::AddNode(CNode *node, string text)
|
|||
|
|
{
|
|||
|
|
if (node==NULL) node=m_root; if (NIL(node)) return(-1);
|
|||
|
|
int size=ArraySize(node.m_next); bool b=false; int i;
|
|||
|
|
for (i=0; i<size; i++) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(node.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (node.m_next[i].m_text==text) { b=true; break; }
|
|||
|
|
}
|
|||
|
|
if (b) return(node.m_next[i].m_id); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ArrayResize(node.m_next, size+1);
|
|||
|
|
node.m_next[size]=new CNode; m_maxid++;
|
|||
|
|
node.m_next[size].m_id=m_maxid; node.m_next[size].m_prev=node;
|
|||
|
|
node.m_next[size].m_text=text;
|
|||
|
|
return(node.m_next[size].m_id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define TG_ALL 0x00000001
|
|||
|
|
#define TG_ID 0x00000002
|
|||
|
|
#define TG_TEXT 0x00000004
|
|||
|
|
#define TG_PATH 0x00000008
|
|||
|
|
#define TG_FILE 0x00000010
|
|||
|
|
#define TG_CLASS 0x00000020
|
|||
|
|
#define TG_FUNC 0x00000040
|
|||
|
|
#define TG_DESC 0x00000080
|
|||
|
|
#define TG_EDIT 0x00000100
|
|||
|
|
#define TG_BRKUSE 0x00000200
|
|||
|
|
#define TG_UP 0x00000400
|
|||
|
|
//------------------------------------------------------------------ class CTreeCtrl
|
|||
|
|
class CTreeCtrl : public CTreeBase
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
int m_mode; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TraceView)
|
|||
|
|
|
|||
|
|
//--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
CTreeCtrl() { m_bBreak=true; m_mode=0; m_root.m_path=""; m_root.m_file="__base__"; m_root.m_line=0; m_root.m_func="__base__"; m_root.m_class="__base__"; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
~CTreeCtrl() { delete m_root; m_maxid=0; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Reset(CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void SetDataBy(int mode, int id, string text, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
void SetDataBy(int mode, int id, int data, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
string GetDataBy(int mode, int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
bool IsExpand(int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_expand <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
bool ExpandIt(int id, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_expand, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
void ExpandBy(int mode, CNode *node, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
bool IsCheck(int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_check <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
bool CheckIt(int id, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_check <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
void CheckBy(int mode, CNode *node, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
bool IsSelect(int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_select <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
bool SelectIt(int id, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_select <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
void SelectBy(int mode, CNode *node, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
bool IsBreak(int id, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_break <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
bool BreakIt(int id, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_break, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
void BreakBy(int mode, CNode *node, bool state, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool m_bBreak; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
void SortBy(int mode, bool ascend, CNode *root=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void GroupBy(int mode, CTreeCtrl* atree, CNode* node=NULL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
};
|
|||
|
|
//------------------------------------------------------------------ Reset
|
|||
|
|
void CTreeCtrl::Reset(CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
root.m_uses=0; root.m_tick=0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (!NIL(root.m_next[i])) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Reset(root.m_next[i]);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ SetDataBy
|
|||
|
|
void CTreeCtrl::SetDataBy(int mode, int id, string text, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return;
|
|||
|
|
if (bool(mode&TG_TEXT)) node.m_text=text;
|
|||
|
|
if (bool(mode&TG_PATH)) node.m_path=text;
|
|||
|
|
if (bool(mode&TG_FILE)) node.m_file=text;
|
|||
|
|
if (bool(mode&TG_CLASS)) node.m_class=text;
|
|||
|
|
if (bool(mode&TG_FUNC)) node.m_func=text;
|
|||
|
|
if (bool(mode&TG_DESC)) node.m_desc=text;
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ SetDataBy
|
|||
|
|
void CTreeCtrl::SetDataBy(int mode, int id, int data, CNode *root=NULL)
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return;
|
|||
|
|
if (bool(mode&TG_ID)) node.m_id=data;
|
|||
|
|
if (bool(mode&TG_EDIT)) node.m_edit=bool(data);
|
|||
|
|
if (bool(mode&TG_BRKUSE)) node.m_brkuse=data;
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ GetDataBy
|
|||
|
|
string CTreeCtrl::GetDataBy(int mode, int id, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return("");
|
|||
|
|
switch(mode)
|
|||
|
|
{
|
|||
|
|
case TG_ID: return(string(node.m_id));
|
|||
|
|
case TG_TEXT: return(node.m_text);
|
|||
|
|
case TG_PATH: return(node.m_path);
|
|||
|
|
case TG_FILE: return(node.m_file);
|
|||
|
|
case TG_CLASS: return(node.m_class);
|
|||
|
|
case TG_FUNC: return(node.m_func);
|
|||
|
|
case TG_DESC: return(node.m_desc);
|
|||
|
|
case TG_EDIT: return(string(node.m_edit));
|
|||
|
|
case TG_BRKUSE: return(string(node.m_brkuse));
|
|||
|
|
}
|
|||
|
|
return("");
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ IsExpand
|
|||
|
|
bool CTreeCtrl::IsExpand(int id, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_expand <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
return(node.m_expand);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ ExpandIt
|
|||
|
|
bool CTreeCtrl::ExpandIt(int id, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_expand, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
node.m_expand=state; return(true); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ ExpandBy
|
|||
|
|
void CTreeCtrl::ExpandBy(int mode, CNode *node, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (mode!=TG_ALL && mode!=TG_UP && mode!=(TG_ALL|TG_UP))
|
|||
|
|
if (NIL(node)) { Print(__FUNCTION__+" node==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool b=true;
|
|||
|
|
if (bool(mode&TG_ID)) b=b&&(root.m_id==node.m_id);
|
|||
|
|
if (bool(mode&TG_TEXT)) b=b&&(root.m_text==node.m_text);
|
|||
|
|
if (bool(mode&TG_PATH)) b=b&&(root.m_path==node.m_path);
|
|||
|
|
if (bool(mode&TG_FILE)) b=b&&(root.m_file==node.m_file);
|
|||
|
|
if (bool(mode&TG_CLASS)) b=b&&(root.m_class==node.m_class);
|
|||
|
|
if (bool(mode&TG_FUNC)) b=b&&(root.m_func==node.m_func);
|
|||
|
|
if (bool(mode&TG_DESC)) b=b&&(root.m_desc==node.m_desc);
|
|||
|
|
if (bool(mode&TG_EDIT)) b=b&&(root.m_edit==node.m_edit);
|
|||
|
|
if (bool(mode&TG_BRKUSE)) b=b&&(root.m_brkuse==node.m_brkuse);
|
|||
|
|
|
|||
|
|
if (b) root.m_expand=state; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (!bool(mode&TG_UP))
|
|||
|
|
{
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ExpandBy(mode, node, state, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (!NIL(root.m_prev)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ExpandBy(TG_UP, node, state, root.m_prev); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------ IsCheck
|
|||
|
|
bool CTreeCtrl::IsCheck(int id, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_check <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
return(node.m_check);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ CheckIt
|
|||
|
|
bool CTreeCtrl::CheckIt(int id, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_check <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
node.m_check=state; return(true); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ CheckBy
|
|||
|
|
void CTreeCtrl::CheckBy(int mode, CNode *node, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (mode!=TG_ALL) if (NIL(node)) { Print(__FUNCTION__+" node==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool b=true;
|
|||
|
|
if (bool(mode&TG_ID)) b=b&&(root.m_id==node.m_id);
|
|||
|
|
if (bool(mode&TG_TEXT)) b=b&&(root.m_text==node.m_text);
|
|||
|
|
if (bool(mode&TG_PATH)) b=b&&(root.m_path==node.m_path);
|
|||
|
|
if (bool(mode&TG_FILE)) b=b&&(root.m_file==node.m_file);
|
|||
|
|
if (bool(mode&TG_CLASS)) b=b&&(root.m_class==node.m_class);
|
|||
|
|
if (bool(mode&TG_FUNC)) b=b&&(root.m_func==node.m_func || node.m_func=="");
|
|||
|
|
if (bool(mode&TG_DESC)) b=b&&(root.m_desc==node.m_desc);
|
|||
|
|
if (bool(mode&TG_EDIT)) b=b&&(root.m_edit==node.m_edit);
|
|||
|
|
if (bool(mode&TG_BRKUSE)) b=b&&(root.m_brkuse==node.m_brkuse);
|
|||
|
|
|
|||
|
|
if (b) root.m_check=state; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (!bool(mode&TG_UP))
|
|||
|
|
{
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CheckBy(mode, node, state, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (!NIL(root.m_prev)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CheckBy(TG_UP, node, state, root.m_prev); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------ IsSelect
|
|||
|
|
bool CTreeCtrl::IsSelect(int id, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_select <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
return(node.m_select);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ SelectIt
|
|||
|
|
bool CTreeCtrl::SelectIt(int id, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_select <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
node.m_select=state; return(true); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ SelectBy
|
|||
|
|
void CTreeCtrl::SelectBy(int mode, CNode *node, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (mode!=TG_ALL) if (NIL(node)) { Print(__FUNCTION__+" node==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) { Print(__FUNCTION__+" root==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool b=true;
|
|||
|
|
if (bool(mode&TG_ID)) b=b&&(root.m_id==node.m_id);
|
|||
|
|
if (bool(mode&TG_TEXT)) b=b&&(root.m_text==node.m_text);
|
|||
|
|
if (bool(mode&TG_PATH)) b=b&&(root.m_path==node.m_path);
|
|||
|
|
if (bool(mode&TG_FILE)) b=b&&(root.m_file==node.m_file);
|
|||
|
|
if (bool(mode&TG_CLASS)) b=b&&(root.m_class==node.m_class);
|
|||
|
|
if (bool(mode&TG_FUNC)) b=b&&(root.m_func==node.m_func || node.m_func=="");
|
|||
|
|
if (bool(mode&TG_DESC)) b=b&&(root.m_desc==node.m_desc);
|
|||
|
|
if (bool(mode&TG_EDIT)) b=b&&(root.m_edit==node.m_edit);
|
|||
|
|
if (bool(mode&TG_BRKUSE)) b=b&&(root.m_brkuse==node.m_brkuse);
|
|||
|
|
|
|||
|
|
if (b) root.m_select=state; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (!bool(mode&TG_UP))
|
|||
|
|
{
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SelectBy(mode, node, state, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (!NIL(root.m_prev)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SelectBy(TG_UP, node, state, root.m_prev); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ IsBreak
|
|||
|
|
bool CTreeCtrl::IsBreak(int id, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_break <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
return(node.m_break);
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ BreakIt
|
|||
|
|
bool CTreeCtrl::BreakIt(int id, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_break, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
CNode *node=FindNode(id, root); if (NIL(node)) return(false);
|
|||
|
|
node.m_break=state; return(true); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ BreakBy
|
|||
|
|
void CTreeCtrl::BreakBy(int mode, CNode *node, bool state, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (mode!=TG_ALL) if (NIL(node)) { Print(__FUNCTION__+" node==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) { Print(__FUNCTION__+" root==0"); return; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool b=true;
|
|||
|
|
if (bool(mode&TG_ID)) b=b&&(root.m_id==node.m_id);
|
|||
|
|
if (bool(mode&TG_TEXT)) b=b&&(root.m_text==node.m_text);
|
|||
|
|
if (bool(mode&TG_PATH)) b=b&&(root.m_path==node.m_path);
|
|||
|
|
if (bool(mode&TG_FILE)) b=b&&(root.m_file==node.m_file);
|
|||
|
|
if (bool(mode&TG_CLASS)) b=b&&(root.m_class==node.m_class);
|
|||
|
|
if (bool(mode&TG_FUNC)) b=b&&(root.m_func==node.m_func || node.m_func=="");
|
|||
|
|
if (bool(mode&TG_DESC)) b=b&&(root.m_desc==node.m_desc);
|
|||
|
|
if (bool(mode&TG_EDIT)) b=b&&(root.m_edit==node.m_edit);
|
|||
|
|
if (bool(mode&TG_BRKUSE)) b=b&&(root.m_brkuse==node.m_brkuse);
|
|||
|
|
|
|||
|
|
if (b) root.m_break=state; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (!bool(mode&TG_UP))
|
|||
|
|
{
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BreakBy(mode, node, state, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (!NIL(root.m_prev)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BreakBy(TG_UP, node, state, root.m_prev); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------ SortBy
|
|||
|
|
void CTreeCtrl::SortBy(int mode, bool ascend, CNode *root=NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
bool b=true; CNode *node;
|
|||
|
|
while (b && n>1)
|
|||
|
|
{
|
|||
|
|
b=false;string st1="", st2="";
|
|||
|
|
for (int i=1; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
st1=root.m_next[i-1].m_text; st2=root.m_next[i].m_text;
|
|||
|
|
if (mode==TG_ID) { st1=string(root.m_next[i-1].m_id); st2=string(root.m_next[i].m_id); }
|
|||
|
|
if (mode==TG_PATH) { st1=root.m_next[i-1].m_path; st2=root.m_next[i].m_path; }
|
|||
|
|
if (mode==TG_FILE) { st1=root.m_next[i-1].m_file; st2=root.m_next[i].m_file; }
|
|||
|
|
if (mode==TG_CLASS) { st1=root.m_next[i-1].m_class; st2=root.m_next[i].m_class; }
|
|||
|
|
if (mode==TG_FUNC) { st1=root.m_next[i-1].m_func; st2=root.m_next[i].m_func; }
|
|||
|
|
if (mode==TG_DESC) { st1=root.m_next[i-1].m_desc; st2=root.m_next[i].m_desc; }
|
|||
|
|
if (mode==TG_EDIT) { st1=string(root.m_next[i-1].m_edit); st2=string(root.m_next[i].m_edit); }
|
|||
|
|
if (mode==TG_BRKUSE) { st1=string(root.m_next[i-1].m_brkuse); st2=string(root.m_next[i].m_brkuse); }
|
|||
|
|
StringToLower(st1); StringToLower(st2);
|
|||
|
|
|
|||
|
|
if ((ascend && st1>=st2) || (!ascend && st1<st2))
|
|||
|
|
{ b=true; node=root.m_next[i-1]; root.m_next[i-1]=root.m_next[i]; root.m_next[i]=node; }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SortBy(mode, ascend, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//------------------------------------------------------------------ GroupBy
|
|||
|
|
void CTreeCtrl::GroupBy(int mode, CTreeCtrl* atree, CNode* root=NULL)
|
|||
|
|
{
|
|||
|
|
if (NIL(atree) || atree==NULL) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root==NULL) root=m_root; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (NIL(root)) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (root!=m_root)
|
|||
|
|
{
|
|||
|
|
int id; string st=" ";
|
|||
|
|
if (mode==TG_PATH) st=root.m_path; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (mode==TG_FILE) st=root.m_file; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (mode==TG_CLASS) st=root.m_class; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
id=atree.AddNode(0, st);
|
|||
|
|
atree.SetDataBy(TG_PATH, id, root.m_path);
|
|||
|
|
atree.SetDataBy(TG_FILE, id, root.m_file);
|
|||
|
|
atree.SetDataBy(TG_CLASS, id, root.m_class);
|
|||
|
|
|
|||
|
|
id=atree.AddNode(st, root.m_func);
|
|||
|
|
CNode *node=atree.FindNode(id);
|
|||
|
|
node.m_uses=root.m_uses; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_tick=root.m_tick; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_tick0=root.m_tick0; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_last=root.m_last; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_path=root.m_path; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node.m_file=root.m_file; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node.m_line=root.m_line; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node.m_class=root.m_class; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node.m_func=root.m_func; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
node.m_desc=root.m_desc; // <20><><EFBFBD>.<2E><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_edit=root.m_edit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
node.m_brkuse=root.m_brkuse; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
int n=ArraySize(root.m_next);
|
|||
|
|
for (int i=0; i<n; i++) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (NIL(root.m_next[i])) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
GroupBy(mode, atree, root.m_next[i]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|