From 08bcabd139eeb0098e5a3ca3c1cc0f336a6c5081 Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 1 Jan 2008 11:16:31 +0000 Subject: [PATCH] IDE: codeexplorer: implemented category mode git-svn-id: trunk@13555 - --- ide/codeexplopts.pas | 41 +++++++++++------ ide/codeexplorer.pas | 105 +++++++++++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 46 deletions(-) diff --git a/ide/codeexplopts.pas b/ide/codeexplopts.pas index 99fadbbff4..18ee10e8f8 100644 --- a/ide/codeexplopts.pas +++ b/ide/codeexplopts.pas @@ -53,6 +53,7 @@ type ); TCodeExplorerCategory = ( + cecNone, cecUses, cecTypes, cecVariables, @@ -63,6 +64,7 @@ type TCodeExplorerCategories = set of TCodeExplorerCategory; const + FirstCodeExplorerCategory = cecUses; DefaultCodeExplorerCategories = [cecUses, cecTypes,cecVariables,cecConstants,cecProcedures]; @@ -132,6 +134,7 @@ const 'Source' ); CodeExplorerCategoryNames: array[TCodeExplorerCategory] of string = ( + '?', 'Uses', 'Types', 'Variables', @@ -148,6 +151,7 @@ function ShowCodeExplorerOptions: TModalResult; function CodeExplorerRefreshNameToEnum(const s: string): TCodeExplorerRefresh; function CodeExplorerModeNameToEnum(const s: string): TCodeExplorerMode; function CodeExplorerCategoryNameToEnum(const s: string): TCodeExplorerCategory; +function CodeExplorerLocalizedString(const c: TCodeExplorerCategory): string; implementation @@ -169,11 +173,24 @@ end; function CodeExplorerCategoryNameToEnum(const s: string): TCodeExplorerCategory; begin - for Result:=Low(TCodeExplorerCategory) to High(TCodeExplorerCategory) do + for Result:=FirstCodeExplorerCategory to High(TCodeExplorerCategory) do if CompareText(CodeExplorerCategoryNames[Result],s)=0 then exit; Result:=cecTypes; end; +function CodeExplorerLocalizedString(const c: TCodeExplorerCategory): string; +begin + case c of + cecUses: Result:=lisCEUses; + cecTypes: Result:=lisCETypes; + cecVariables: Result:=lisCEVariables; + cecConstants: Result:=lisCEConstants; + cecProcedures: Result:=lisCEProcedures; + cecProperties: Result:=lisCEProperties; + else Result:='?'; + end; +end; + function ShowCodeExplorerOptions: TModalResult; var CodeExplorerDlg: TCodeExplorerDlg; @@ -277,7 +294,7 @@ begin FFollowCursor:=XMLConfig.GetValue(Path+'FollowCursor',true); FCategories:=[]; - for c:=low(TCodeExplorerCategory) to high(TCodeExplorerCategory) do + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do if XMLConfig.GetValue(Path+'Categories/'+CodeExplorerCategoryNames[c], c in DefaultCodeExplorerCategories) then Include(FCategories,c); @@ -296,7 +313,7 @@ begin CodeExplorerModeNames[cemCategory]); XMLConfig.SetDeleteValue(Path+'FollowCursor',FFollowCursor,true); - for c:=low(TCodeExplorerCategory) to high(TCodeExplorerCategory) do + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do XMLConfig.SetDeleteValue(Path+'Categories/'+CodeExplorerCategoryNames[c], c in FCategories,c in DefaultCodeExplorerCategories); end; @@ -337,8 +354,8 @@ begin FollowCursorCheckBox.Checked:=Options.FollowCursor; - for c:=low(TCodeExplorerCategory) to high(TCodeExplorerCategory) do - CategoriesCheckGroup.Checked[ord(c)]:=c in Options.Categories; + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do + CategoriesCheckGroup.Checked[ord(c)-1]:=c in Options.Categories; end; procedure TCodeExplorerDlg.SaveFormToOptions; @@ -360,13 +377,15 @@ begin Options.FollowCursor:=FollowCursorCheckBox.Checked; NewCategories:=[]; - for c:=low(TCodeExplorerCategory) to high(TCodeExplorerCategory) do - if CategoriesCheckGroup.Checked[ord(c)] then + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do + if CategoriesCheckGroup.Checked[ord(c)-1] then include(NewCategories,c); Options.Categories:=NewCategories; end; procedure TCodeExplorerDlg.CodeExplorerDlgCreate(Sender: TObject); +var + c: TCodeExplorerCategory; begin FOptions:=TCodeExplorerOptions.Create; Caption:=lisCEOCodeExplorer; @@ -388,12 +407,8 @@ begin CategoryPage.Caption:=lisCECategories; CategoriesCheckGroup.Caption:=lisCEOnlyUsedInCategoryMode; - CategoriesCheckGroup.Items.Add(lisCEUses); // 0 - CategoriesCheckGroup.Items.Add(lisCETypes); // 1 - CategoriesCheckGroup.Items.Add(lisCEVariables); // 2 - CategoriesCheckGroup.Items.Add(lisCEConstants); // 3 - CategoriesCheckGroup.Items.Add(lisCEProcedures);// 4 - CategoriesCheckGroup.Items.Add(lisCEProperties);// 5 + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do + CategoriesCheckGroup.Items.Add(CodeExplorerLocalizedString(c)); end; procedure TCodeExplorerDlg.CodeExplorerDlgDestroy(Sender: TObject); diff --git a/ide/codeexplorer.pas b/ide/codeexplorer.pas index f22d8b7353..1508e24bad 100644 --- a/ide/codeexplorer.pas +++ b/ide/codeexplorer.pas @@ -114,13 +114,15 @@ type procedure RefreshSpeedButtonClick(Sender: TObject); private FCodeFilename: string; + fCategoryNodes: array[TCodeExplorerCategory] of TTreeNode; FDirectivesFilename: string; FFlags: TCodeExplorerViewFlags; FLastCodeFilter: string; FLastCodeChangeStep: integer; FLastDirectivesFilter: string; FLastDirectivesChangeStep: integer; - FMode : TCodeExplorerMode; + FMode: TCodeExplorerMode; + FLastMode: TCodeExplorerMode; FOnGetCodeTree: TOnGetCodeTree; FOnGetDirectivesTree: TOnGetDirectivesTree; FOnJumpToCode: TOnJumpToCode; @@ -190,7 +192,7 @@ type property OnGetDirectivesTree: TOnGetDirectivesTree read FOnGetDirectivesTree write FOnGetDirectivesTree; property OnJumpToCode: TOnJumpToCode read FOnJumpToCode write FOnJumpToCode; - property Mode: TCodeExplorerMode read FMode write FMode; + property Mode: TCodeExplorerMode read FMode write SetMode; property CodeFilename: string read FCodeFilename; property CodeFilter: string read GetCodeFilter write SetCodeFilter; property DirectivesFilename: string read FDirectivesFilename; @@ -287,8 +289,8 @@ procedure TCodeExplorerView.CodeExplorerViewCREATE(Sender: TObject); begin LoadCodeExplorerOptions; - - SetMode(CodeExplorerOptions.Mode); + + Mode:=CodeExplorerOptions.Mode; Name:=NonModalIDEWindowNames[nmiwCodeExplorerName]; Caption := lisMenuViewCodeExplorer; @@ -551,6 +553,7 @@ var NodeImageIndex: Integer; ShowNode: Boolean; ShowChilds: Boolean; + Category: TCodeExplorerCategory; begin while CodeNode<>nil do begin ShowNode:=true; @@ -576,7 +579,6 @@ begin // don't show class node (the type node is already shown) if (CodeNode.Desc in [ctnClass,ctnClassInterface]) then begin ShowNode:=false; - ShowChilds:=true; end; // don't show keyword nodes @@ -590,21 +592,50 @@ begin if CodeNode.Desc=ctnEndPoint then ShowNode:=false; - // ToDo: add options to CodeExplorerOptions to make this optional - // and add check items to the popup menu for easy toggle - // don't show type/var/const section nodes - if (CodeNode.Desc in AllDefinitionSections) then begin - ShowNode:=false; - ShowChilds:=true; - end; - // don't show class visibility section nodes if (CodeNode.Desc in AllClassSections) then begin ShowNode:=false; - ShowChilds:=true; end; - ViewNode:=ParentViewNode; + if Mode=cemCategory then begin + // category mode: do not show sections + if (CodeNode.Desc in AllDefinitionSections) then begin + ShowNode:=false; + end; + + // category mode: put nodes in categories + Category:=cecNone; + case CodeNode.Desc of + ctnUsesSection: Category:=cecUses; + ctnTypeDefinition,ctnGenericType: Category:=cecTypes; + ctnVarDefinition: Category:=cecVariables; + ctnConstDefinition: Category:=cecConstants; + ctnProcedure: Category:=cecProcedures; + ctnProperty: + if (CodeNode.Parent=nil) + or (CodeNode.Parent.Desc in [ctnInterface,ctnImplementation]) then + Category:=cecProperties; + end; + if Category<>cecNone then begin + ShowNode:=Category in CodeExplorerOptions.Categories; + ShowChilds:=false; + if ShowNode then begin + if fCategoryNodes[Category]=nil then begin + NodeData:=TViewNodeData.Create(CodeNode.Parent); + fCategoryNodes[Category]:=CodeTreeview.Items.AddChildObject(nil, + CodeExplorerLocalizedString(Category),NodeData); + end; + ParentViewNode:=fCategoryNodes[Category]; + InFrontViewNode:=nil; + end; + end; + + // category mode: do not show code sections + if (CodeNode.Desc in AllCodeSections) then begin + ShowNode:=false; + end; + end; + if ShowNode then begin NodeData:=TViewNodeData.Create(CodeNode); NodeText:=GetCodeNodeDescription(ACodeTool,CodeNode); @@ -620,6 +651,8 @@ begin ViewNode.ImageIndex:=NodeImageIndex; ViewNode.SelectedIndex:=NodeImageIndex; InFrontViewNode:=ViewNode; + end else begin + ViewNode:=ParentViewNode; end; if ShowChilds then CreateNodes(ACodeTool,CodeNode.FirstChild,ViewNode,nil,true); @@ -696,19 +729,18 @@ end; procedure TCodeExplorerView.SetMode(AMode: TCodeExplorerMode); begin + if FMode=AMode then exit; FMode:=AMode; - case FMode of - cemCategory : - begin - ModeSpeedButton.Caption:='C'; // To-Do: Change it to use image instead of 'C'. - ModeSpeedButton.Hint:= lisCEModeShowSourceNodes; - end; - cemSource : - begin - ModeSpeedButton.Caption:='S'; // To-Do: Change it to use image instead of 'S'. - ModeSpeedButton.Hint:= lisCEModeShowCategories; - end; + if FMode=cemCategory then + begin + ModeSpeedButton.Caption:='C'; // To-Do: Change it to use image instead of 'C'. + ModeSpeedButton.Hint:=lisCEModeShowSourceNodes; + end + else begin + ModeSpeedButton.Caption:='S'; // To-Do: Change it to use image instead of 'S'. + ModeSpeedButton.Hint:=lisCEModeShowCategories; end; + Refresh(true); end; procedure TCodeExplorerView.KeyUp(var Key: Word; Shift: TShiftState); begin @@ -811,6 +843,7 @@ procedure TCodeExplorerView.RefreshCode(OnlyVisible: boolean); var OldExpanded: TTreeNodeExpandedState; ACodeTool: TCodeTool; + c: TCodeExplorerCategory; begin if (FUpdateCount>0) or (OnlyVisible and ((CurrentPage<>cepCode) or (not IsVisible))) then begin @@ -818,10 +851,10 @@ begin exit; end; Exclude(FFlags,cevCodeRefreshNeeded); - + try Include(FFlags,cevRefreshing); - + CodeFilterEdit.Text:=lisCEFilter; // get the codetool with the updated codetree @@ -838,12 +871,14 @@ begin end else begin if (ACodeTool.MainFilename=FCodeFilename) and (ACodeTool.Scanner<>nil) - and (ACodeTool.Scanner.ChangeStep=FLastCodeChangeStep) then begin + and (ACodeTool.Scanner.ChangeStep=FLastCodeChangeStep) + and (Mode=FLastMode) then begin // still the same source exit; end; end; + FLastMode:=Mode; // remember the codetools ChangeStep if ACodeTool<>nil then begin FCodeFilename:=ACodeTool.MainFilename; @@ -858,6 +893,8 @@ begin CodeTreeview.BeginUpdate; OldExpanded:=TTreeNodeExpandedState.Create(CodeTreeView); + for c:=low(TCodeExplorerCategory) to high(TCodeExplorerCategory) do + fCategoryNodes[c]:=nil; if (ACodeTool=nil) or (ACodeTool.Tree=nil) or (ACodeTool.Tree.Root=nil) then begin CodeTreeview.Items.Clear; @@ -1112,10 +1149,12 @@ var begin Data1:=TViewNodeData(Node1.Data); Data2:=TViewNodeData(Node2.Data); - if (Data1.Desc in SortDesc) - and (Data2.Desc in SortDesc) then begin - Result:=SysUtils.CompareText(Node1.Text,Node2.Text); - if Result<>0 then exit; + if (Mode=cemCategory) then begin + if (Data1.Desc in SortDesc) + and (Data2.Desc in SortDesc) then begin + Result:=SysUtils.CompareText(Node1.Text,Node2.Text); + if Result<>0 then exit; + end; end; if Data1.StartPos