2
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3
* http://www.gnu.org/licenses/gpl-3.0.html
6
* $Id: cctreectrl.cpp 9043 2013-05-04 04:39:36Z mortenmacfly $
7
* $HeadURL: http://svn.code.sf.net/p/codeblocks/code/branches/release-16.xx/src/plugins/codecompletion/cctreectrl.cpp $
13
#ifdef CC_BUILDTREE_MEASURING
14
#include <wx/stopwatch.h>
18
#include <wx/gdicmn.h> // wxPoint, wxSize
20
#include "cctreectrl.h"
22
// class CCTreeCtrlData
24
CCTreeCtrlData::CCTreeCtrlData(SpecialFolder sf, Token* token, short int kindMask, int parentIdx) :
28
m_TokenIndex(token ? token->m_Index : -1),
29
m_TokenKind(token ? token->m_TokenKind : tkUndefined),
30
m_TokenName(token ? token->m_Name : _T("")),
31
m_ParentIndex(parentIdx),
32
m_Ticket(token ? token->GetTicket() : 0)
36
// class CCTreeCtrlExpandedItemData
38
CCTreeCtrlExpandedItemData::CCTreeCtrlExpandedItemData(const CCTreeCtrlData* data, const int level) :
46
IMPLEMENT_DYNAMIC_CLASS(CCTreeCtrl, wxTreeCtrl)
48
CCTreeCtrl::CCTreeCtrl()
50
Compare = &CBNoCompare;
53
CCTreeCtrl::CCTreeCtrl(wxWindow *parent, const wxWindowID id,
54
const wxPoint& pos, const wxSize& size, long style) :
55
wxTreeCtrl(parent, id, pos, size, style)
57
Compare = &CBNoCompare;
60
void CCTreeCtrl::SetCompareFunction(const BrowserSortType type)
65
Compare = &CBAlphabetCompare;
68
Compare = &CBKindCompare;
71
Compare = &CBScopeCompare;
74
Compare = &CBLineCompare;
78
Compare = &CBNoCompare;
84
int CCTreeCtrl::OnCompareItems(const wxTreeItemId& item1, const wxTreeItemId& item2)
86
return Compare((CCTreeCtrlData*)GetItemData(item1), (CCTreeCtrlData*)GetItemData(item2));
89
int CCTreeCtrl::CBAlphabetCompare (CCTreeCtrlData* lhs, CCTreeCtrlData* rhs)
93
if (lhs->m_SpecialFolder != sfToken || rhs->m_SpecialFolder != sfToken)
95
if (!lhs->m_Token || !rhs->m_Token)
97
return wxStricmp(lhs->m_Token->m_Name, rhs->m_Token->m_Name);
100
int CCTreeCtrl::CBKindCompare(CCTreeCtrlData* lhs, CCTreeCtrlData* rhs)
104
if (lhs->m_SpecialFolder != sfToken || rhs->m_SpecialFolder != sfToken)
106
if (lhs->m_TokenKind == rhs->m_TokenKind)
107
return CBAlphabetCompare(lhs, rhs);
109
return lhs->m_TokenKind - rhs->m_TokenKind;
112
int CCTreeCtrl::CBScopeCompare(CCTreeCtrlData* lhs, CCTreeCtrlData* rhs)
116
if (lhs->m_SpecialFolder != sfToken || rhs->m_SpecialFolder != sfToken)
119
if (lhs->m_Token->m_Scope == rhs->m_Token->m_Scope)
120
return CBKindCompare(lhs, rhs);
122
return rhs->m_Token->m_Scope - lhs->m_Token->m_Scope;
125
int CCTreeCtrl::CBLineCompare (CCTreeCtrlData* lhs, CCTreeCtrlData* rhs)
129
if (lhs->m_SpecialFolder != sfToken || rhs->m_SpecialFolder != sfToken)
131
if (!lhs->m_Token || !rhs->m_Token)
133
if (lhs->m_Token->m_FileIdx == rhs->m_Token->m_FileIdx)
135
return (lhs->m_Token->m_Line > rhs->m_Token->m_Line) * 2 - 1; // from 0,1 to -1,1
139
return (lhs->m_Token->m_FileIdx > rhs->m_Token->m_FileIdx) * 2 - 1;
143
int CCTreeCtrl::CBNoCompare(cb_unused CCTreeCtrlData* lhs, cb_unused CCTreeCtrlData* rhs)
148
// This does not really do what it says !
149
// It only removes doubles, if they are neighbours, so the tree should be sorted !!
150
// The last one (after sorting) remains.
151
void CCTreeCtrl::RemoveDoubles(const wxTreeItemId& parent)
153
if (Manager::IsAppShuttingDown() || (!(parent.IsOk())))
156
#ifdef CC_BUILDTREE_MEASURING
159
// we 'll loop backwards so we can delete nodes without problems
160
wxTreeItemId existing = GetLastChild(parent);
161
while (parent.IsOk() && existing.IsOk())
163
wxTreeItemId prevItem = GetPrevSibling(existing);
164
if (!prevItem.IsOk())
166
CCTreeCtrlData* dataExisting = (CCTreeCtrlData*)(GetItemData(existing));
167
CCTreeCtrlData* dataPrev = (CCTreeCtrlData*)(GetItemData(prevItem));
170
dataExisting->m_SpecialFolder == sfToken &&
171
dataPrev->m_SpecialFolder == sfToken &&
172
dataExisting->m_Token &&
174
(dataExisting->m_Token->DisplayName() == dataPrev->m_Token->DisplayName()))
178
else if (existing.IsOk())
179
existing = GetPrevSibling(existing);
181
#ifdef CC_BUILDTREE_MEASURING
182
CCLogger::Get()->DebugLog(F(_T("RemoveDoubles took : %ld"), sw.Time()));