2
* This file is licensed under the GNU General Public License, version 3
3
* http://www.gnu.org/licenses/gpl-3.0.html
8
#include "workspacebrowserbuilder.h"
11
#include <projectmanager.h>
12
#include <cbproject.h>
14
#include <wx/settings.h>
16
#include <wx/string.h>
19
namespace compatibility { typedef TernaryCondTypedef<wxMinimumVersion<2,5>::eval, wxTreeItemIdValue, long int>::eval tree_cookie_t; };
21
WorkspaceBrowserBuilder::WorkspaceBrowserBuilder(ParserF* parser, wxTreeCtrl* treeTop, wxTreeCtrl* treeBottom)
22
: m_pActiveProject(0),
26
m_pImlist = new wxImageList(16, 16);
29
prefix2 = ConfigManager::GetDataFolder() + _T("/images/fortranproject/");
31
bmp = cbLoadBitmap(prefix2 + _T("ctor_public.png"), wxBITMAP_TYPE_PNG);
34
bmp = cbLoadBitmap(prefix2 + _T("class_public.png"), wxBITMAP_TYPE_PNG);
36
m_ImgNr["module"] = 1;
37
bmp = cbLoadBitmap(prefix2 + _T("method_public.png"), wxBITMAP_TYPE_PNG);
39
m_ImgNr["subroutine"] = 2;
40
bmp = cbLoadBitmap(prefix2 + _T("method_protected.png"), wxBITMAP_TYPE_PNG);
42
m_ImgNr["function"] = 3;
43
bmp = cbLoadBitmap(prefix2 + _T("method_private.png"), wxBITMAP_TYPE_PNG);
45
m_ImgNr["program"] = 4;
46
bmp = cbLoadBitmap(prefix2 + _T("typedef.png"), wxBITMAP_TYPE_PNG);
49
bmp = cbLoadBitmap(prefix2 + _T("interface.png"), wxBITMAP_TYPE_PNG);
51
m_ImgNr["interface"] = 6;
52
bmp = cbLoadBitmap(prefix2 + _T("funcs_folder.png"), wxBITMAP_TYPE_PNG);
54
m_ImgNr["function_folder"] = 7;
55
bmp = cbLoadBitmap(prefix2 + _T("others_folder.png"), wxBITMAP_TYPE_PNG);
57
m_ImgNr["others_folder"] = 8;
58
bmp = cbLoadBitmap(prefix2 + _T("symbols_folder.png"), wxBITMAP_TYPE_PNG);
60
m_ImgNr["symbols_folder"] = 9;
61
bmp = cbLoadBitmap(prefix2 + _T("preproc.png"), wxBITMAP_TYPE_PNG);
63
m_ImgNr["preproc"] = 10;
64
bmp = cbLoadBitmap(prefix2 + _T("var_public.png"), wxBITMAP_TYPE_PNG);
66
m_ImgNr["variable"] = 11;
67
bmp = cbLoadBitmap(prefix2 + _T("interface_function.png"), wxBITMAP_TYPE_PNG);
69
m_ImgNr["interface_function"] = 12;
70
bmp = cbLoadBitmap(prefix2 + _T("interface_subroutine.png"), wxBITMAP_TYPE_PNG);
72
m_ImgNr["interface_subroutine"] = 13;
73
bmp = cbLoadBitmap(prefix2 + _T("procedure.png"), wxBITMAP_TYPE_PNG);
75
m_ImgNr["procedure"] = 14;
77
bmp = cbLoadBitmap(prefix2 + _T("subroutine_private.png"), wxBITMAP_TYPE_PNG);
79
m_ImgNr["subroutine_private"] = 15;
80
bmp = cbLoadBitmap(prefix2 + _T("function_private.png"), wxBITMAP_TYPE_PNG);
82
m_ImgNr["function_private"] = 16;
83
bmp = cbLoadBitmap(prefix2 + _T("var_private.png"), wxBITMAP_TYPE_PNG);
85
m_ImgNr["variable_private"] = 17;
86
bmp = cbLoadBitmap(prefix2 + _T("var_protected.png"), wxBITMAP_TYPE_PNG);
88
m_ImgNr["variable_protected"] = 18;
89
bmp = cbLoadBitmap(prefix2 + _T("typedef_private.png"), wxBITMAP_TYPE_PNG);
91
m_ImgNr["type_private"] = 19;
92
bmp = cbLoadBitmap(prefix2 + _T("interface_private.png"), wxBITMAP_TYPE_PNG);
94
m_ImgNr["interface_private"] = 20;
95
bmp = cbLoadBitmap(prefix2 + _T("access_list_private.png"), wxBITMAP_TYPE_PNG);
97
m_ImgNr["access_list_private"] = 21;
98
bmp = cbLoadBitmap(prefix2 + _T("access_list_public.png"), wxBITMAP_TYPE_PNG);
100
m_ImgNr["access_list_public"] = 22;
101
bmp = cbLoadBitmap(prefix2 + _T("access_list_protected.png"), wxBITMAP_TYPE_PNG);
103
m_ImgNr["access_list_protected"] = 23;
104
bmp = cbLoadBitmap(prefix2 + _T("procedure_private.png"), wxBITMAP_TYPE_PNG);
106
m_ImgNr["procedure_private"] = 24;
107
bmp = cbLoadBitmap(prefix2 + _T("interface_function_private.png"), wxBITMAP_TYPE_PNG);
109
m_ImgNr["interface_function_private"] = 25;
110
bmp = cbLoadBitmap(prefix2 + _T("interface_subroutine_private.png"), wxBITMAP_TYPE_PNG);
112
m_ImgNr["interface_subroutine_private"] = 26;
113
bmp = cbLoadBitmap(prefix2 + _T("class.png"), wxBITMAP_TYPE_PNG);
115
m_ImgNr["submodule"] = 27;
116
bmp = cbLoadBitmap(prefix2 + _T("interface_subroutine_gen_private.png"), wxBITMAP_TYPE_PNG);
118
m_ImgNr["interface_sub_gen_private"] = 28;
119
bmp = cbLoadBitmap(prefix2 + _T("interface_subroutine_gen.png"), wxBITMAP_TYPE_PNG);
121
m_ImgNr["interface_sub_gen"] = 29;
122
bmp = cbLoadBitmap(prefix2 + _T("interface_function_gen_private.png"), wxBITMAP_TYPE_PNG);
124
m_ImgNr["interface_fun_gen_private"] = 30;
125
bmp = cbLoadBitmap(prefix2 + _T("interface_function_gen.png"), wxBITMAP_TYPE_PNG);
127
m_ImgNr["interface_fun_gen"] = 31;
128
bmp = cbLoadBitmap(prefix2 + _T("typedef_abstract.png"), wxBITMAP_TYPE_PNG);
130
m_ImgNr["type_abstract"] = 32;
131
bmp = cbLoadBitmap(prefix2 + _T("typedef_abstract_private.png"), wxBITMAP_TYPE_PNG);
133
m_ImgNr["type_abstract_private"] = 33;
134
bmp = cbLoadBitmap(prefix2 + _T("dtor_public.png"), wxBITMAP_TYPE_PNG);
136
m_ImgNr["procedure_final"] = 34;
138
m_ImgNr["none"] = -1;
141
m_pTreeTop = treeTop;
142
m_pTreeBottom = treeBottom;
143
m_pTreeTop->SetImageList(m_pImlist);
144
m_pTreeBottom->SetImageList(m_pImlist);
147
WorkspaceBrowserBuilder::~WorkspaceBrowserBuilder()
153
void WorkspaceBrowserBuilder::Init(const wxString& active_filename,
154
cbProject* active_project,
155
const BrowserOptions& options)
157
m_ActiveFilename = active_filename;
158
m_pActiveProject = active_project;
164
void WorkspaceBrowserBuilder::BuildTree()
166
if (Manager::IsAppShuttingDown())
171
wxTreeItemId root = m_pTreeTop->GetRootItem();
174
root = m_pTreeTop->AddRoot(_("Symbols"), m_ImgNr["symbols_folder"], m_ImgNr["symbols_folder"], new TreeDataF(sfRoot));
175
m_pTreeTop->SetItemHasChildren(root);
179
wxString oldParentText;
180
bool oldParent_isRoot = false;
181
wxTreeItemId oldSel = m_pTreeTop->GetSelection();
184
oldSelText = m_pTreeTop->GetItemText(oldSel);
185
wxTreeItemId oldParent = m_pTreeTop->GetItemParent(oldSel);
186
oldParent_isRoot = (root == oldParent);
187
if (oldParent.IsOk())
189
oldParentText = m_pTreeTop->GetItemText(oldParent);
194
m_pTreeTop->Freeze();
195
wxArrayString expandedBottomNodes;
196
if (m_Options.visibleBottomTree)
198
MakeExpandedNodesArray(expandedBottomNodes);
199
m_pTreeBottom->Hide();
200
m_pTreeBottom->Freeze();
203
m_pTreeTop->DeleteChildren(root);
205
wxTreeItemId root_bot = m_pTreeBottom->GetRootItem();
207
m_pTreeBottom->DeleteChildren(root_bot);
209
if (!Manager::IsAppShuttingDown())
212
m_pTreeTop->Expand(root);
213
if (!m_Options.visibleBottomTree)
216
while ( i < m_ExpandedNodes.GetCount() )
218
wxTreeItemId item = FindItemByName(m_pTreeTop, m_ExpandedNodes[i]);
221
m_pTreeTop->Expand(item);
226
m_ExpandedNodes.RemoveAt(i);
231
m_ExpandedNodes.Clear();
234
if (m_Options.visibleBottomTree)
236
m_pTreeBottom->Thaw();
237
m_pTreeBottom->Show();
245
if (!oldSelText.IsEmpty())
247
if ( !oldParent_isRoot )
249
wxTreeItemId item = FindItemByName(m_pTreeTop, oldParentText, oldSelText); // refresh selection
251
m_pTreeTop->SelectItem(item);
255
wxTreeItemId item = FindItemByName(m_pTreeTop, oldSelText); // refresh selection
258
m_pTreeTop->SelectItem(item);
259
ExpandBottomNodes(expandedBottomNodes);
265
void WorkspaceBrowserBuilder::DeleteTopRootChildren()
267
if (Manager::IsAppShuttingDown())
270
wxTreeItemId root = m_pTreeTop->GetRootItem();
273
m_pTreeTop->DeleteChildren(root);
277
void WorkspaceBrowserBuilder::MakeExpandedNodesArray(wxArrayString &expandedBottomNodes)
279
if (!m_Options.visibleBottomTree)
282
wxTreeItemIdValue cookie;
283
wxTreeItemId root = m_pTreeBottom->GetRootItem();
286
wxTreeItemId item = m_pTreeBottom->GetFirstChild(root, cookie);
289
if (m_pTreeBottom->IsExpanded(item))
291
wxTreeItemIdValue cookie2;
292
wxTreeItemId item2 = m_pTreeBottom->GetFirstChild(item, cookie2);
295
if (m_pTreeBottom->IsExpanded(item2))
297
expandedBottomNodes.Add(m_pTreeBottom->GetItemText(item));
298
expandedBottomNodes.Add(m_pTreeBottom->GetItemText(item2));
300
item2 = m_pTreeBottom->GetNextChild(item, cookie2);
303
item = m_pTreeBottom->GetNextChild(root, cookie);
307
void WorkspaceBrowserBuilder::ExpandBottomNodes(wxArrayString &expandedBottomNodes)
309
if (!m_Options.visibleBottomTree)
312
for (size_t i=1; i<expandedBottomNodes.Count(); i+=2)
314
wxTreeItemId item = FindItemByName(m_pTreeBottom, expandedBottomNodes.Item(i-1), expandedBottomNodes.Item(i));
316
m_pTreeBottom->Expand(item);
320
bool WorkspaceBrowserBuilder::HasChildren(TokenF* tokenParent, int tokenKindMask)
323
for (size_t j=0; j < tokenParent->m_Children.GetCount(); ++j)
325
TokenF* tok1 = tokenParent->m_Children.Item(j);
326
if (tok1->m_TokenKind & tokenKindMask)
335
bool WorkspaceBrowserBuilder::HasGlobalFunctionsOthers(int tokenKindMask)
338
if (Manager::IsAppShuttingDown())
341
switch (m_Options.displayFilter)
345
if (!m_ActiveFilename.IsEmpty())
346
has = FileHasTokens(UnixFilename(m_ActiveFilename), tokenKindMask);
351
for (FilesList::iterator it = m_pActiveProject->GetFilesList().begin(); it != m_pActiveProject->GetFilesList().end(); ++it)
353
ProjectFile* pf = *it;
354
if (FileHasTokens(UnixFilename(pf->file.GetFullPath()), tokenKindMask))
365
TokensArrayF* pTokens = m_pParser->GetTokens();
366
for (size_t i=0; i< pTokens->GetCount(); ++i)
368
TokenF* token = pTokens->Item(i);
369
if (token->m_TokenKind == tkFile)
371
for (size_t j=0; j < token->m_Children.GetCount(); ++j)
373
TokenF* tok1 = token->m_Children.Item(j);
374
if (tok1->m_TokenKind & tokenKindMask)
390
bool WorkspaceBrowserBuilder::FileHasTokens(const wxString& fileName, int tokenKindMask)
392
TokensArrayF* pTokens = m_pParser->GetTokens();
395
for (size_t i=0; i< pTokens->GetCount(); ++i)
397
TokenF* token = pTokens->Item(i);
399
if (token->m_TokenKind == tkFile && token->m_Filename.IsSameAs(fileName))
401
for (size_t j=0; j < token->m_Children.GetCount(); ++j)
403
TokenF* tok1 = token->m_Children.Item(j);
404
if (tok1->m_TokenKind & tokenKindMask)
416
void WorkspaceBrowserBuilder::AddTreeChildren(wxTreeCtrl* tree, wxTreeItemId parent, int tokenKindMask)
418
if (Manager::IsAppShuttingDown())
421
switch (m_Options.displayFilter)
425
if (!m_ActiveFilename.IsEmpty() &&
426
(!m_Options.showIncludeSeparately ||
427
(m_Options.showIncludeSeparately && !m_pParser->IsIncludeFile(m_ActiveFilename))))
429
AddFileNodes(tree, parent, UnixFilename(m_ActiveFilename), tokenKindMask);
435
for (FilesList::iterator it = m_pActiveProject->GetFilesList().begin(); it != m_pActiveProject->GetFilesList().end(); ++it)
437
ProjectFile* pf = *it;
438
if (!m_Options.showIncludeSeparately ||
439
(m_Options.showIncludeSeparately && !m_pParser->IsIncludeFile(pf->file.GetFullPath())))
440
AddFileNodes(tree, parent, UnixFilename(pf->file.GetFullPath()), tokenKindMask);
446
TokensArrayF* pTokens = m_pParser->GetTokens();
447
for (size_t i=0; i< pTokens->GetCount(); ++i)
449
TokenF* token = pTokens->Item(i);
450
if (token->m_TokenKind == tkFile &&
451
(!m_Options.showIncludeSeparately ||
452
(m_Options.showIncludeSeparately && !m_pParser->IsIncludeFile(token->m_Filename))))
454
AddChildrenNodes(tree, parent, token, tokenKindMask);
462
bool WorkspaceBrowserBuilder::AddFileNodes(wxTreeCtrl* tree, wxTreeItemId parent, wxString file, int tokenKindMask)
464
TokensArrayF* pTokens = m_pParser->GetTokens();
466
for (size_t i=0; i< pTokens->GetCount(); ++i)
468
TokenF* token = pTokens->Item(i);
470
if (token->m_TokenKind == tkFile && token->m_Filename.IsSameAs(file))
472
return AddChildrenNodes(tree, parent, token, tokenKindMask);
478
bool WorkspaceBrowserBuilder::AddChildrenNodes(wxTreeCtrl* tree, wxTreeItemId parent, TokenF* parToken, int tokenKindMask)
481
bool sorted = m_Options.sortAlphabetically;
482
TokensArrayF* pTokens = &parToken->m_Children;
484
if (parToken->m_TokenKind == tkType)
486
count += AddTypeChildren(tree, parent, pTokens);
490
int childKM = tkFunction | tkProgram | tkSubroutine | tkPreprocessor | tkInterface | tkInterfaceExplicit | tkBlockData |
491
tkType | tkVariable | tkProcedure | tkAccessList;
492
int interfaceMask = tkInterface | tkInterfaceExplicit;
493
int funChildKM = childKM ^ tkVariable;
495
if (!m_Options.showLocalVariables && (parToken->m_TokenKind == tkSubroutine || parToken->m_TokenKind == tkFunction || parToken->m_TokenKind == tkProgram))
497
childKM = childKM ^ tkVariable;
498
if (tokenKindMask & tkVariable)
499
tokenKindMask = tokenKindMask ^ tkVariable;
502
for (size_t i=0; i< pTokens->GetCount(); ++i)
504
TokenF* token = pTokens->Item(i);
505
if (token->m_TokenKind & tokenKindMask)
507
if (token->m_TokenKind & interfaceMask)
509
count += AddInterfaceNode(tree, parent, token);
513
wxString nameDisp = token->m_DisplayName;
514
if (token->m_TokenKind == tkVariable)
515
nameDisp << _T(" : ") << token->m_PartFirst;
516
wxTreeItemId idni = AddNodeIfNotThere(tree, parent, nameDisp, GetTokenKindImageIdx(token), new TreeDataF(sfToken, token), sorted);
518
if (tree == m_pTreeTop && !m_Options.visibleBottomTree)
520
if (!m_Options.showLocalVariables && (token->m_TokenKind == tkSubroutine || token->m_TokenKind == tkFunction))
522
if (HasChildren(token, funChildKM))
523
tree->SetItemHasChildren(idni);
527
if (HasChildren(token, childKM))
528
tree->SetItemHasChildren(idni);
531
else if(tree == m_pTreeBottom && HasChildren(token, childKM))
533
AddChildrenNodes(tree, idni, token, childKM);
541
int WorkspaceBrowserBuilder::AddInterfaceNode(wxTreeCtrl* tree, wxTreeItemId parent, TokenF* parToken)
544
bool sorted = m_Options.sortAlphabetically;
546
if (!parToken->m_Name.IsEmpty())
549
if (parToken->m_DisplayName.StartsWith(_T("%%")))
551
name = parToken->m_DisplayName.Mid(2);
555
name = parToken->m_DisplayName;
557
AddNodeIfNotThere(tree, parent, name, GetTokenKindImageIdx(parToken), new TreeDataF(sfToken, parToken), sorted);
562
TokensArrayF* pTokens = &parToken->m_Children;
565
int childKM = tkFunction | tkSubroutine;
567
for (size_t i=0; i< pTokens->GetCount(); ++i)
569
TokenF* token = pTokens->Item(i);
570
if (token->m_TokenKind & childKM)
572
if (token->m_TokenKind == tkFunction)
574
if (token->m_TokenAccess == taPublic)
575
imageIdx = m_ImgNr["interface_function"];
577
imageIdx = m_ImgNr["interface_function_private"];
581
if (token->m_TokenAccess == taPublic)
582
imageIdx = m_ImgNr["interface_subroutine"];
584
imageIdx = m_ImgNr["interface_subroutine_private"];
586
AddNodeIfNotThere(tree, parent, token->m_DisplayName, imageIdx, new TreeDataF(sfToken, token), sorted);
595
int WorkspaceBrowserBuilder::AddTypeChildren(wxTreeCtrl* tree, wxTreeItemId parent, TokensArrayF* pTokens)
598
bool sorted = m_Options.sortAlphabetically;
599
TokensArrayF varTokens;
600
TokensArrayF otherTokens;
602
for (size_t i=0; i<pTokens->GetCount(); ++i)
604
TokenF* token = pTokens->Item(i);
605
if (token->m_TokenKind == tkVariable)
610
for (j=0; j<varTokens.GetCount(); j++)
612
if (token->m_DisplayName.CmpNoCase(varTokens.Item(j)->m_DisplayName) < 0)
615
varTokens.Insert(token, j);
619
varTokens.Add(token);
627
if (token->m_DisplayName.StartsWith(_T("%%")))
628
name = token->m_DisplayName.Mid(2);
630
name = token->m_DisplayName;
632
for (j=0; j<otherTokens.GetCount(); j++)
634
if (name.CmpNoCase(otherTokens.Item(j)->m_DisplayName) < 0)
637
otherTokens.Insert(token, j);
641
otherTokens.Add(token);
646
for (size_t i=0; i<varTokens.GetCount(); ++i)
649
nameDisp << varTokens.Item(i)->m_DisplayName << _T(" : ") << varTokens.Item(i)->m_PartFirst;
650
AddNodeIfNotThere(tree, parent, nameDisp,
651
GetTokenKindImageIdx(varTokens.Item(i)), new TreeDataF(sfToken, varTokens.Item(i)), false);
655
for (size_t i=0; i<otherTokens.GetCount(); ++i)
658
if (otherTokens.Item(i)->m_DisplayName.StartsWith(_T("%%")))
659
name = otherTokens.Item(i)->m_DisplayName.Mid(2);
661
name = otherTokens.Item(i)->m_DisplayName;
662
AddNodeIfNotThere(tree, parent, name,
663
GetTokenKindImageIdx(otherTokens.Item(i)), new TreeDataF(sfToken, otherTokens.Item(i)), false);
670
bool WorkspaceBrowserBuilder::SelectNode(wxTreeItemId node)
672
// m_pTreeTop node was selected
673
if (Manager::IsAppShuttingDown() || (!(node.IsOk())) || m_AtWork)
676
m_pTreeBottom->Freeze();
677
wxTreeItemId root = m_pTreeBottom->GetRootItem();
679
root = m_pTreeBottom->AddRoot(_T("Members"));
681
m_pTreeBottom->DeleteChildren(root);
682
TreeDataF* data = (TreeDataF*)m_pTreeTop->GetItemData(node);
685
switch (data->m_SpecialFolder)
689
AddTreeChildren(m_pTreeBottom, root, tkFunction | tkProgram | tkSubroutine);
694
AddTreeChildren(m_pTreeBottom, root, tkPreprocessor | tkInterface | tkBlockData);
695
if (m_Options.showIncludeSeparately)
696
AddIncludeFiles(m_pTreeBottom, root);
701
wxTreeItemId rootFuncs = m_pTreeBottom->AppendItem(root, _("Procedures"), m_ImgNr["function_folder"]);
702
wxTreeItemId rootOthers = m_pTreeBottom->AppendItem(root, _("Others"), m_ImgNr["others_folder"]);
704
TokenF* pToken = data->m_pToken;
705
AddChildrenNodes(m_pTreeBottom, rootFuncs, pToken, tkFunction | tkSubroutine | tkProcedure);
706
AddChildrenNodes(m_pTreeBottom, rootOthers, pToken, tkType | tkInterface | tkInterfaceExplicit | tkAccessList | tkVariable);
708
m_pTreeBottom->Expand(rootFuncs);
709
m_pTreeBottom->Expand(rootOthers);
717
m_pTreeBottom->Thaw();
721
wxTreeItemId WorkspaceBrowserBuilder::AddNodeIfNotThere(wxTreeCtrl* tree, wxTreeItemId parent, const wxString& name, int imgIndex, TreeDataF* data, bool sorted)
723
SpecialFolder new_type = data->m_SpecialFolder;
725
compatibility::tree_cookie_t cookie = 0;
727
wxTreeItemId insert_after; // node to insert after; we 'll be looping all children so we might as well sort at the same time
728
wxTreeItemId existing = tree->GetFirstChild(parent, cookie);
729
while (existing.IsOk())
731
wxString itemText = tree->GetItemText(existing);
732
if (itemText.IsSameAs(name))
734
if (tree->GetItemImage(existing) == imgIndex)
736
tree->SetItemImage(existing, imgIndex, wxTreeItemIcon_Normal);
737
tree->SetItemImage(existing, imgIndex, wxTreeItemIcon_Selected);
738
delete tree->GetItemData(existing); // make Valgrind happy
739
tree->SetItemData(existing, data);
747
TreeDataF* existing_data = (TreeDataF*)tree->GetItemData(existing);
750
SpecialFolder existing_type = existing_data->m_SpecialFolder;
752
// first go special folders
753
if ((existing_type & (sfGFuncs | sfOthers)) &&
754
!(new_type & (sfGFuncs | sfOthers)))
756
insert_after = existing;
758
// then everything else, alphabetically
759
else if (name.CmpNoCase(itemText) >= 0)
761
insert_after = existing;
763
else // name.CmpNoCase(itemText) < 0
769
existing = tree->GetNextChild(parent, cookie);
773
existing = tree->InsertItem(parent, insert_after, name, imgIndex, imgIndex, data);
775
existing = tree->AppendItem(parent, name, imgIndex, imgIndex, data);
779
void WorkspaceBrowserBuilder::CreateSpecialFolders()
781
wxTreeItemId parent = m_pTreeTop->GetRootItem();
782
wxTreeItemId gfuncs = AddNodeIfNotThere(m_pTreeTop, parent, _("Global procedures"), m_ImgNr["function_folder"], new TreeDataF(sfGFuncs, 0));
783
wxTreeItemId others = AddNodeIfNotThere(m_pTreeTop, parent, _("Others"), m_ImgNr["others_folder"], new TreeDataF(sfOthers, 0));
785
if (!m_Options.visibleBottomTree)
787
if (HasGlobalFunctionsOthers(tkFunction | tkProgram | tkSubroutine))
788
m_pTreeTop->SetItemHasChildren(gfuncs);
789
if (HasGlobalFunctionsOthers(tkPreprocessor | tkInterface | tkBlockData) ||
790
(m_Options.showIncludeSeparately && m_pParser->HasIncludeFiles()))
791
m_pTreeTop->SetItemHasChildren(others);
795
void WorkspaceBrowserBuilder::ExpandTop()
797
if (Manager::IsAppShuttingDown())
800
CreateSpecialFolders();
801
wxTreeItemId root = m_pTreeTop->GetRootItem();
802
AddTreeChildren(m_pTreeTop, root, tkModule | tkSubmodule);
805
void WorkspaceBrowserBuilder::ExpandTopNode(wxTreeItemId node)
807
if (Manager::IsAppShuttingDown() || (!(node.IsOk())) || (node == m_pTreeTop->GetRootItem()))
810
m_pTreeTop->Freeze();
811
TreeDataF* data = (TreeDataF*)m_pTreeTop->GetItemData(node);
815
switch (data->m_SpecialFolder)
819
AddTreeChildren(m_pTreeTop, node, tkFunction | tkProgram | tkSubroutine);
824
AddTreeChildren(m_pTreeTop, node, tkPreprocessor | tkInterface | tkBlockData);
825
if (m_Options.showIncludeSeparately)
826
AddIncludeFiles(m_pTreeTop, node);
831
TokenF* pToken = data->m_pToken;
832
AddChildrenNodes(m_pTreeTop, node, pToken, tkFunction | tkSubroutine | tkInterface | tkType | tkVariable |
833
tkProcedure | tkAccessList | tkInterfaceExplicit);
838
disName = m_pTreeTop->GetItemText(node);
839
if (m_ExpandedNodes.Index(disName) == wxNOT_FOUND)
840
m_ExpandedNodes.Add(disName);
845
void WorkspaceBrowserBuilder::CollapsTopNode(wxTreeItemId node)
847
if (Manager::IsAppShuttingDown() || (!(node.IsOk())) || (node == m_pTreeTop->GetRootItem()))
850
int indx = m_ExpandedNodes.Index(m_pTreeTop->GetItemText(node));
851
if (indx != wxNOT_FOUND)
853
m_ExpandedNodes.RemoveAt(indx);
857
void WorkspaceBrowserBuilder::SelectItem(TokenF* token)
859
if (Manager::IsAppShuttingDown())
863
if (token && token->m_pParent)
865
if (token->m_pParent->m_TokenKind == tkFile)
867
if (token->m_TokenKind == tkFunction)
869
item = FindItemByName(m_pTreeTop, _("Global procedures"));
872
m_pTreeTop->SelectItem(item);
873
item = FindItemByName(m_pTreeBottom, token->m_DisplayName);
875
m_pTreeBottom->SelectItem(item);
878
else if (token->m_TokenKind == tkPreprocessor)
880
item = FindItemByName(m_pTreeTop, _("Preprocessor symbols"));
883
m_pTreeTop->SelectItem(item);
884
item = FindItemByName(m_pTreeBottom, token->m_DisplayName);
886
m_pTreeBottom->SelectItem(item);
889
else if (token->m_TokenKind == tkModule || token->m_TokenKind == tkSubmodule)
891
item = FindItemByName(m_pTreeTop, token->m_DisplayName);
893
m_pTreeTop->SelectItem(item);
896
else if (token->m_pParent->m_TokenKind == tkModule || token->m_pParent->m_TokenKind == tkSubmodule)
898
item = FindItemByName(m_pTreeTop, token->m_pParent->m_DisplayName);
901
m_pTreeTop->SelectItem(item);
902
item = FindItemByName(m_pTreeBottom, token->m_DisplayName);
904
m_pTreeBottom->SelectItem(item);
910
wxTreeItemId WorkspaceBrowserBuilder::FindItemByName(wxTreeCtrl* tree, wxString name, wxString name2)
912
bool foundFirst = false;
913
wxTreeItemId firstItem;
915
wxTreeItemIdValue cookie;
916
wxTreeItemId root = tree->GetRootItem();
919
wxTreeItemId item = tree->GetFirstChild(root, cookie);
922
if (tree->GetItemText(item).IsSameAs(name))
933
else if(name2.IsEmpty())
935
wxTreeItemIdValue cookie2;
936
wxTreeItemId item2 = tree->GetFirstChild(item, cookie2);
939
if (tree->GetItemText(item2).IsSameAs(name))
943
item2 = tree->GetNextChild(item, cookie2);
946
item = tree->GetNextChild(root, cookie);
948
if (!name2.IsEmpty() && foundFirst)
950
wxTreeItemIdValue cookie3;
951
wxTreeItemId item2 = tree->GetFirstChild(firstItem, cookie3);
954
if (tree->GetItemText(item2).IsSameAs(name2))
958
item2 = tree->GetNextChild(item, cookie3);
966
int WorkspaceBrowserBuilder::GetTokenKindImageIdx(TokenF* token)
969
return m_ImgNr["none"];
971
switch (token->m_TokenKind)
973
case tkUse: return m_ImgNr["use"];
975
case tkModule: return m_ImgNr["module"];
979
if (token->m_TokenAccess == taPrivate)
980
return m_ImgNr["subroutine_private"];
982
return m_ImgNr["subroutine"];
986
if (token->m_TokenAccess == taPrivate)
987
return m_ImgNr["function_private"];
989
return m_ImgNr["function"];
991
case tkProgram: return m_ImgNr["program"];
995
if (token->m_TokenAccess == taPrivate)
997
if (token->m_IsAbstract)
998
return m_ImgNr["type_abstract_private"];
1000
return m_ImgNr["type_private"];
1004
if (token->m_IsAbstract)
1005
return m_ImgNr["type_abstract"];
1007
return m_ImgNr["type"];
1012
if (token->m_TypeDefinition.IsSameAs(_T("subroutine")))
1014
if (token->m_TokenAccess == taPrivate)
1015
return m_ImgNr["interface_sub_gen_private"];
1017
return m_ImgNr["interface_sub_gen"];
1019
else if (token->m_TypeDefinition.IsSameAs(_T("function")))
1021
if (token->m_TokenAccess == taPrivate)
1022
return m_ImgNr["interface_fun_gen_private"];
1024
return m_ImgNr["interface_fun_gen"];
1028
if (token->m_TokenAccess == taPrivate)
1029
return m_ImgNr["interface_private"];
1031
return m_ImgNr["interface"];
1034
case tkInterfaceExplicit:
1036
if (token->m_TokenAccess == taPrivate)
1037
return m_ImgNr["interface_private"];
1039
return m_ImgNr["interface"];
1042
case tkCommonblock: return m_ImgNr["none"];
1044
case tkPreprocessor: return m_ImgNr["preproc"];
1046
case tkFile: return m_ImgNr["none"];
1050
if (token->m_TokenAccess == taPrivate)
1051
return m_ImgNr["variable_private"];
1052
else if (token->m_TokenAccess == taProtected)
1053
return m_ImgNr["variable_protected"];
1055
return m_ImgNr["variable"];
1058
case tkInterfaceFunction: return m_ImgNr["interface_function"];
1060
case tkInterfaceSubroutine: return m_ImgNr["interface_subroutine"];
1064
if (token->m_TypeDefinition.IsSameAs(_T("subroutine")))
1066
if (token->m_TokenAccess == taPrivate)
1067
return m_ImgNr["subroutine_private"];
1069
return m_ImgNr["subroutine"];
1071
else if (token->m_TypeDefinition.IsSameAs(_T("function")))
1073
if (token->m_TokenAccess == taPrivate)
1074
return m_ImgNr["function_private"];
1076
return m_ImgNr["function"];
1080
if (token->m_TokenAccess == taPrivate)
1081
return m_ImgNr["procedure_private"];
1083
return m_ImgNr["procedure"];
1089
if (token->m_TokenAccess == taPrivate)
1090
return m_ImgNr["access_list_private"];
1091
else if (token->m_TokenAccess == taProtected)
1092
return m_ImgNr["access_list_protected"];
1094
return m_ImgNr["access_list_public"];
1097
case tkSubmodule: return m_ImgNr["submodule"];
1099
case tkProcedureFinal: return m_ImgNr["procedure_final"];
1101
default: return m_ImgNr["none"];
1105
wxImageList* WorkspaceBrowserBuilder::GetImageList()
1110
void WorkspaceBrowserBuilder::MarkSymbol(const wxString& filename, int line)
1112
if (Manager::IsAppShuttingDown() || m_AtWork)
1116
bool unmarked = true;
1117
wxTreeItemIdValue cookie;
1118
wxTreeItemId root = m_pTreeTop->GetRootItem();
1121
wxTreeItemId item = m_pTreeTop->GetFirstChild(root, cookie);
1122
wxTreeItemId itemGlob;
1123
bool haveGlob = false;
1124
wxTreeItemId itemOthers;
1125
bool haveOthers = false;
1128
TreeDataF* data = (TreeDataF*)m_pTreeTop->GetItemData(item);
1131
switch (data->m_SpecialFolder)
1147
if (m_pTreeTop->IsBold(item))
1149
if (!data->m_pToken->m_Filename.IsSameAs(filename)
1150
|| ((int)data->m_pToken->m_LineStart > line)
1151
|| ((int)data->m_pToken->m_LineEnd < line))
1153
MarkItem(m_pTreeTop, item, false);
1154
if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(item))
1156
MarkChildSymbol(m_pTreeTop, item, line, false);
1165
if (data->m_pToken->m_Filename.IsSameAs(filename))
1167
if (((int)data->m_pToken->m_LineStart <= line) && ((int)data->m_pToken->m_LineEnd >= line))
1170
MarkItem(m_pTreeTop, item);
1171
if ((m_pTreeTop->GetSelection() == item) && m_Options.visibleBottomTree)
1173
MarkBottomSymbol(filename, line);
1175
else if (m_Options.visibleBottomTree)
1177
UnmarkBottomSymbol();
1179
else if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(item))
1181
MarkChildSymbol(m_pTreeTop, item, line);
1195
item = m_pTreeTop->GetNextChild(root, cookie);
1198
if (haveGlob && found)
1200
if (m_Options.visibleBottomTree && (m_pTreeTop->GetSelection() == itemGlob))
1202
UnmarkBottomSymbol();
1204
else if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(itemGlob) && m_pTreeTop->GetLastChild(itemGlob).IsOk())
1206
MarkChildSymbol(m_pTreeTop, itemGlob, line, false);
1208
if (m_pTreeTop->IsBold(itemGlob))
1209
MarkItem(m_pTreeTop, itemGlob, false);
1213
bool foundGlob = false;
1214
if (m_Options.visibleBottomTree && (m_pTreeTop->GetSelection() == itemGlob))
1216
foundGlob = MarkBottomSymbol(filename, line);
1218
else if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(itemGlob) && m_pTreeTop->GetLastChild(itemGlob).IsOk())
1220
foundGlob = MarkGlobalSymbol(m_pTreeTop, itemGlob, filename, line);
1224
foundGlob = IsLineInGlobals(filename, line);
1225
if (m_Options.visibleBottomTree && foundGlob && (m_pTreeTop->GetSelection() != itemGlob))
1227
UnmarkBottomSymbol();
1232
MarkItem(m_pTreeTop, itemGlob);
1235
else if (m_pTreeTop->IsBold(itemGlob))
1237
MarkItem(m_pTreeTop, itemGlob, false);
1241
if (haveOthers && found)
1243
if (m_Options.visibleBottomTree && (m_pTreeTop->GetSelection() == itemOthers))
1245
UnmarkBottomSymbol();
1247
else if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(itemOthers) && m_pTreeTop->GetLastChild(itemOthers).IsOk())
1249
MarkChildSymbol(m_pTreeTop, itemOthers, line, false);
1250
MarkGlobalSymbol(m_pTreeTop, itemOthers, filename, line);
1252
if (m_pTreeTop->IsBold(itemOthers))
1253
MarkItem(m_pTreeTop, itemOthers, false);
1255
else if (haveOthers)
1257
bool foundOthers = false;
1258
if (m_Options.visibleBottomTree && (m_pTreeTop->GetSelection() == itemOthers))
1260
foundOthers = MarkBottomSymbol(filename, line);
1262
else if (!m_Options.visibleBottomTree && m_pTreeTop->HasChildren(itemOthers) && m_pTreeTop->GetLastChild(itemOthers).IsOk())
1264
foundOthers = MarkGlobalSymbol(m_pTreeTop, itemOthers, filename, line);
1268
foundOthers = (m_Options.showIncludeSeparately && m_pParser->IsIncludeFile(filename));
1269
if (m_Options.visibleBottomTree && foundOthers && (m_pTreeTop->GetSelection() != itemOthers))
1271
UnmarkBottomSymbol();
1276
MarkItem(m_pTreeTop, itemOthers);
1279
else if (m_pTreeTop->IsBold(itemOthers))
1281
MarkItem(m_pTreeTop, itemOthers, false);
1285
if (!found && m_Options.visibleBottomTree)
1287
UnmarkBottomSymbol();
1291
void WorkspaceBrowserBuilder::MarkItem(wxTreeCtrl* tree, wxTreeItemId& item, bool mark)
1295
tree->SetItemBold(item, mark);
1302
bool WorkspaceBrowserBuilder::MarkBottomSymbol(const wxString& filename, int line)
1305
bool foundFile = false;
1306
bool unmarked = true;
1307
wxTreeItemIdValue cookie;
1308
wxTreeItemId root = m_pTreeBottom->GetRootItem();
1311
wxTreeItemId item = m_pTreeBottom->GetFirstChild(root, cookie);
1314
bool goInside = false;
1315
TreeDataF* data = (TreeDataF*)m_pTreeBottom->GetItemData(item);
1318
if (data->m_SpecialFolder == sfToken)
1320
if (m_pTreeBottom->IsBold(item))
1322
if (!data->m_pToken->m_Filename.IsSameAs(filename)
1323
|| (int)data->m_pToken->m_LineStart > line
1324
|| (int)data->m_pToken->m_LineEnd < line)
1326
MarkItem(m_pTreeBottom, item, false);
1334
if (data->m_pToken->m_Filename.IsSameAs(filename))
1336
if (((int)data->m_pToken->m_LineStart <= line) && ((int)data->m_pToken->m_LineEnd >= line))
1339
MarkItem(m_pTreeBottom, item);
1345
else if(data->m_SpecialFolder == sfFile)
1347
if (data->m_pToken->m_Filename.IsSameAs(filename))
1349
MarkItem(m_pTreeBottom, item);
1354
MarkItem(m_pTreeBottom, item, false);
1362
bool unmarked2 = true;
1363
wxTreeItemIdValue cookie2;
1364
wxTreeItemId item2 = m_pTreeBottom->GetFirstChild(item, cookie2);
1365
while (item2.IsOk())
1367
TreeDataF* data2 = (TreeDataF*)m_pTreeBottom->GetItemData(item2);
1370
if (data2->m_SpecialFolder == sfToken)
1372
if (m_pTreeBottom->IsBold(item2))
1374
if (!data2->m_pToken->m_Filename.IsSameAs(filename)
1375
|| (int)data2->m_pToken->m_LineStart > line
1376
|| (int)data2->m_pToken->m_LineEnd < line)
1378
MarkItem(m_pTreeBottom, item2, false);
1386
if (data2->m_pToken->m_Filename.IsSameAs(filename))
1388
if (((int)data2->m_pToken->m_LineStart <= line) && ((int)data2->m_pToken->m_LineEnd >= line))
1391
MarkItem(m_pTreeBottom, item2);
1398
item2 = m_pTreeBottom->GetNextChild(item, cookie2);
1401
item = m_pTreeBottom->GetNextChild(root, cookie);
1403
return (found || foundFile);
1407
void WorkspaceBrowserBuilder::UnmarkBottomSymbol()
1410
bool goInside = false;
1411
wxTreeItemIdValue cookie;
1412
wxTreeItemId root = m_pTreeBottom->GetRootItem();
1415
wxTreeItemId item = m_pTreeBottom->GetFirstChild(root, cookie);
1418
TreeDataF* data = (TreeDataF*)m_pTreeBottom->GetItemData(item);
1421
if (m_pTreeBottom->IsBold(item))
1423
MarkItem(m_pTreeBottom, item, false);
1433
wxTreeItemIdValue cookie2;
1434
wxTreeItemId item2 = m_pTreeBottom->GetFirstChild(item, cookie2);
1435
while (item2.IsOk())
1437
TreeDataF* data2 = (TreeDataF*)m_pTreeBottom->GetItemData(item2);
1440
if (data2->m_SpecialFolder == sfToken)
1442
if (m_pTreeBottom->IsBold(item2))
1444
MarkItem(m_pTreeBottom, item2, false);
1450
item2 = m_pTreeBottom->GetNextChild(item, cookie2);
1455
item = m_pTreeBottom->GetNextChild(root, cookie);
1460
void WorkspaceBrowserBuilder::MarkChildSymbol(wxTreeCtrl* tree, wxTreeItemId& root, int line, bool mark)
1463
bool unmarked = true;
1464
wxTreeItemIdValue cookie;
1467
wxTreeItemId item = tree->GetFirstChild(root, cookie);
1470
TreeDataF* data = (TreeDataF*)tree->GetItemData(item);
1473
if (data->m_SpecialFolder == sfToken)
1475
if (tree->IsBold(item))
1479
if (((int)data->m_pToken->m_LineStart > line) || ((int)data->m_pToken->m_LineEnd < line))
1481
MarkItem(tree, item, false);
1488
MarkItem(tree, item, false);
1492
if (((int)data->m_pToken->m_LineStart <= line) && ((int)data->m_pToken->m_LineEnd >= line))
1495
MarkItem(tree, item);
1500
else if (data->m_SpecialFolder == sfFile)
1502
if ((tree->IsBold(item) && !mark) || (!tree->IsBold(item) && mark))
1503
MarkItem(tree, item, mark);
1504
MarkChildSymbol(tree, item, line, mark);
1507
item = tree->GetNextChild(root, cookie);
1511
bool WorkspaceBrowserBuilder::MarkGlobalSymbol(wxTreeCtrl* tree, wxTreeItemId& root, const wxString& filename, int line)
1514
bool foundFile = false;
1515
wxTreeItemIdValue cookie;
1518
wxTreeItemId item = tree->GetFirstChild(root, cookie);
1521
TreeDataF* data = (TreeDataF*)tree->GetItemData(item);
1524
if (data->m_SpecialFolder == sfToken)
1526
if (tree->IsBold(item))
1528
MarkItem(tree, item, false);
1532
if (data->m_pToken->m_Filename.IsSameAs(filename))
1534
if (((int)data->m_pToken->m_LineStart <= line) && ((int)data->m_pToken->m_LineEnd >= line))
1536
MarkItem(tree, item);
1542
else if (data->m_SpecialFolder == sfFile)
1544
bool isSameFile = data->m_pToken->m_Filename.IsSameAs(filename);
1547
MarkItem(tree, item);
1551
MarkItem(tree, item, false);
1552
wxTreeItemIdValue cookie2;
1553
wxTreeItemId item2 = tree->GetFirstChild(item, cookie2);
1555
while (item2.IsOk())
1557
TreeDataF* data2 = (TreeDataF*)tree->GetItemData(item2);
1560
if (data2->m_SpecialFolder == sfToken)
1562
if (tree->IsBold(item2))
1564
MarkItem(tree, item2, false);
1566
if (!found && isSameFile)
1568
if (((int)data2->m_pToken->m_LineStart <= line) && ((int)data2->m_pToken->m_LineEnd >= line))
1570
MarkItem(tree, item2);
1576
item2 = tree->GetNextChild(item, cookie2);
1580
item = tree->GetNextChild(root, cookie);
1582
return (found || foundFile);
1586
bool WorkspaceBrowserBuilder::IsLineInGlobals(const wxString& file, int line)
1588
if (m_Options.showIncludeSeparately && m_pParser->IsIncludeFile(file))
1591
int tokenKindMask = tkFunction | tkProgram | tkSubroutine;
1592
TokensArrayF* pTokens = m_pParser->GetTokens();
1594
bool foundFileToken = false;
1595
for (size_t i=0; i < pTokens->GetCount(); ++i)
1597
TokenF* token = pTokens->Item(i);
1599
if (token->m_TokenKind == tkFile && token->m_Filename.IsSameAs(file))
1601
switch (m_Options.displayFilter)
1605
foundFileToken = true;
1610
for (FilesList::iterator it = m_pActiveProject->GetFilesList().begin(); it != m_pActiveProject->GetFilesList().end(); ++it)
1612
ProjectFile* pf = *it;
1613
foundFileToken = UnixFilename(pf->file.GetFullPath()).IsSameAs(file);
1619
default: // bdfWorkspace
1621
foundFileToken = true;
1627
TokensArrayF* children = &token->m_Children;
1628
for (size_t j=0; j < children->GetCount(); ++j)
1630
TokenF* childToken = children->Item(j);
1631
if (childToken->m_TokenKind & tokenKindMask)
1633
if ( ((int)childToken->m_LineStart <= line) && ((int)childToken->m_LineEnd >= line) )
1648
void WorkspaceBrowserBuilder::MakeVisibleCurrent()
1650
if (Manager::IsAppShuttingDown() || m_AtWork)
1653
wxTreeItemIdValue cookie;
1654
wxTreeItemId root = m_pTreeTop->GetRootItem();
1657
wxTreeItemId item = m_pTreeTop->GetFirstChild(root, cookie);
1660
if (m_pTreeTop->IsBold(item))
1662
m_pTreeTop->SelectItem(item);
1663
m_pTreeTop->EnsureVisible(item);
1666
item = m_pTreeTop->GetNextChild(root, cookie);
1669
if (m_Options.visibleBottomTree)
1671
root = m_pTreeBottom->GetRootItem();
1674
item = m_pTreeBottom->GetFirstChild(root, cookie);
1678
if (m_pTreeBottom->IsBold(item))
1680
m_pTreeBottom->SelectItem(item);
1681
m_pTreeBottom->EnsureVisible(item);
1684
else if (m_pTreeBottom->HasChildren(item))
1686
wxTreeItemIdValue cookie2;
1687
wxTreeItemId item2 = m_pTreeBottom->GetFirstChild(item, cookie2);
1688
while (item2.IsOk())
1690
if (m_pTreeBottom->IsBold(item2))
1692
m_pTreeBottom->SelectItem(item2);
1693
m_pTreeBottom->EnsureVisible(item2);
1697
item2 = m_pTreeBottom->GetNextChild(item, cookie2);
1702
item = m_pTreeBottom->GetNextChild(root, cookie);
1707
void WorkspaceBrowserBuilder::AddIncludeFiles(wxTreeCtrl* tree, wxTreeItemId parent)
1709
if (Manager::IsAppShuttingDown())
1712
int tokenKindMask = tkModule | tkFunction | tkProgram | tkSubroutine | tkInterface | tkInterfaceExplicit | tkBlockData |
1713
tkType | tkVariable | tkProcedure | tkAccessList | tkCommonblock | tkSubmodule;
1715
bool sorted = m_Options.sortAlphabetically;
1716
switch (m_Options.displayFilter)
1720
if (m_pParser->IsIncludeFile(m_ActiveFilename))
1722
TokenF* fileToken= m_pParser->FindFile(m_ActiveFilename);
1725
wxFileName fn(m_ActiveFilename);
1726
wxString tn = _("include '");
1727
tn << fn.GetFullName() << _("'");
1728
wxTreeItemId idni = AddNodeIfNotThere(tree, parent, tn, m_ImgNr["symbols_folder"], new TreeDataF(sfFile, fileToken), sorted);
1729
AddFileNodes(tree, idni, UnixFilename(m_ActiveFilename), tokenKindMask);
1736
for (FilesList::iterator it = m_pActiveProject->GetFilesList().begin(); it != m_pActiveProject->GetFilesList().end(); ++it)
1738
ProjectFile* pf = *it;
1739
if (m_pParser->IsIncludeFile(pf->file.GetFullPath()))
1741
TokenF* fileToken= m_pParser->FindFile(pf->file.GetFullPath());
1744
wxString tn = _("include '");
1745
tn << pf->file.GetFullName() << _("'");
1746
wxTreeItemId idni = AddNodeIfNotThere(tree, parent, tn, m_ImgNr["symbols_folder"], new TreeDataF(sfFile, fileToken), sorted);
1747
AddFileNodes(tree, idni, UnixFilename(pf->file.GetFullPath()), tokenKindMask);
1755
TokensArrayF* pTokens = m_pParser->GetTokens();
1756
for (size_t i=0; i< pTokens->GetCount(); ++i)
1758
TokenF* token = pTokens->Item(i);
1759
if (token->m_TokenKind == tkFile &&
1760
m_pParser->IsIncludeFile(token->m_Filename))
1762
wxString tn = _("include '");
1763
tn << token->m_DisplayName << _("'");
1764
wxTreeItemId idni = AddNodeIfNotThere(tree, parent, tn, m_ImgNr["symbols_folder"], new TreeDataF(sfFile, token), sorted);
1765
AddChildrenNodes(tree, idni, token, tokenKindMask);
1773
void WorkspaceBrowserBuilder::SetActiveProject(cbProject* prj)
1775
m_pActiveProject = prj;