From 125b3d57ba40ea3d34a551f47c9c7d4a566b9e67 Mon Sep 17 00:00:00 2001 From: mattias Date: Wed, 5 Jun 2013 15:03:13 +0000 Subject: [PATCH] IDE: codeexplorer: save active page git-svn-id: trunk@41549 - --- ide/codeexplopts.pas | 58 +++++++++++++++++++++++++++++++++++++++++--- ide/codeexplorer.pas | 28 +++++++++++++-------- 2 files changed, 73 insertions(+), 13 deletions(-) diff --git a/ide/codeexplopts.pas b/ide/codeexplopts.pas index d0ff1e5e45..bcb5d91aff 100644 --- a/ide/codeexplopts.pas +++ b/ide/codeexplopts.pas @@ -43,6 +43,12 @@ uses type { TCodeExplorerOptions } + TCodeExplorerPage = ( + cepNone, + cepCode, + cepDirectives + ); + TCodeExplorerRefresh = ( cerManual, // only via refresh button cerSwitchEditorPage,// everytime the source editor switches to another page @@ -90,6 +96,7 @@ const DefaultCodeExplorerCategories = [cecUses, cecTypes,cecVariables,cecConstants,cecProcedures]; cefcAll = [low(TCEObserverCategory)..high(TCEObserverCategory)]; + DefaultCodeExplorerPage = cepCode; DefaultCodeObserverCategories = [ cefcLongProcs, cefcEmptyProcs, @@ -143,15 +150,20 @@ type FMode : TCodeExplorerMode; FObserverIgnoreConstants: TAvgLvlTree;// tree of AnsiString FOptionsFilename: string; + FPage: TCodeExplorerPage; FRefresh: TCodeExplorerRefresh; + FSavedChangeStep: integer; + function GetModified: boolean; procedure SetCategories(const AValue: TCodeExplorerCategories); procedure SetFollowCursor(const AValue: boolean); procedure SetLongParamListCount(const AValue: integer); procedure SetLongProcLineCount(const AValue: integer); procedure SetMode(const AValue: TCodeExplorerMode); + procedure SetModified(AValue: boolean); procedure SetNestedProcCount(const AValue: integer); procedure SetObserveCharConst(const AValue: boolean); procedure SetObserverCategories(const AValue: TCEObserverCategories); + procedure SetPage(AValue: TCodeExplorerPage); procedure SetRefresh(const AValue: TCodeExplorerRefresh); public class function GetGroupCaption:string; override; @@ -167,6 +179,7 @@ type procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure IncreaseChangeStep; + property Modified: boolean read GetModified write SetModified; public // observer: ignore constants function CreateListOfCOIgnoreConstants: TStrings; @@ -193,6 +206,7 @@ type property OptionsFilename: string read FOptionsFilename write FOptionsFilename; property FollowCursor: boolean read FFollowCursor write SetFollowCursor default true; property Categories: TCodeExplorerCategories read FCategories write SetCategories default DefaultCodeExplorerCategories; + property Page: TCodeExplorerPage read FPage write SetPage default DefaultCodeExplorerPage; property ChangeStep: integer read FChangeStep write FChangeStep; public // Observer @@ -210,6 +224,11 @@ const cerDefault = cerSwitchEditorPage; + CodeExplorerPageNames: array[TCodeExplorerPage] of string = ( + '?', + 'Code', + 'Directives' + ); CodeExplorerRefreshNames: array[TCodeExplorerRefresh] of string = ( 'Manual', 'SwitchEditorPage', @@ -248,6 +267,7 @@ const var CodeExplorerOptions: TCodeExplorerOptions = nil; // set by the IDE +function CodeExplorerPageNameToEnum(const s: string): TCodeExplorerPage; function CodeExplorerRefreshNameToEnum(const s: string): TCodeExplorerRefresh; function CodeExplorerModeNameToEnum(const s: string): TCodeExplorerMode; function CodeExplorerCategoryNameToEnum(const s: string): TCodeExplorerCategory; @@ -258,6 +278,12 @@ function dbgs(c: TCodeExplorerCategory): string; overload; implementation +function CodeExplorerPageNameToEnum(const s: string): TCodeExplorerPage; +begin + for Result:=Low(TCodeExplorerPage) to High(TCodeExplorerPage) do + if SysUtils.CompareText(CodeExplorerPageNames[Result],s)=0 then exit; + Result:=DefaultCodeExplorerPage; +end; function CodeExplorerRefreshNameToEnum(const s: string): TCodeExplorerRefresh; begin @@ -342,6 +368,14 @@ begin IncreaseChangeStep; end; +procedure TCodeExplorerOptions.SetModified(AValue: boolean); +begin + if AValue then + IncreaseChangeStep + else + FSavedChangeStep:=FChangeStep; +end; + procedure TCodeExplorerOptions.SetNestedProcCount(const AValue: integer); begin if FNestedProcCount=AValue then exit; @@ -364,6 +398,13 @@ begin IncreaseChangeStep; end; +procedure TCodeExplorerOptions.SetPage(AValue: TCodeExplorerPage); +begin + if FPage=AValue then Exit; + FPage:=AValue; + IncreaseChangeStep; +end; + procedure TCodeExplorerOptions.SetFollowCursor(const AValue: boolean); begin if FFollowCursor=AValue then exit; @@ -393,6 +434,11 @@ begin IncreaseChangeStep; end; +function TCodeExplorerOptions.GetModified: boolean; +begin + Result:=FSavedChangeStep<>FChangeStep; +end; + constructor TCodeExplorerOptions.Create; begin FOptionsFilename:= @@ -434,6 +480,7 @@ begin FMode:=cemCategory; FRefresh:=cerDefault; FFollowCursor:=true; + FPage:=DefaultCodeExplorerPage; FCategories:=DefaultCodeExplorerCategories; FObserverCategories:=DefaultCodeObserverCategories; FLongProcLineCount:=DefaultCOLongProcLineCount; @@ -455,6 +502,7 @@ begin FRefresh:=Src.Refresh; FMode:=Src.Mode; FFollowCursor:=Src.FollowCursor; + FPage:=Src.Page; FCategories:=Src.Categories; FObserverCategories:=Src.ObserverCategories; FLongProcLineCount:=Src.LongProcLineCount; @@ -505,6 +553,7 @@ procedure TCodeExplorerOptions.Save; var XMLConfig: TXMLConfig; begin + if FileExistsCached(FOptionsFilename) and not Modified then exit; try InvalidateFileStateCache; XMLConfig:=TXMLConfig.CreateClean(FOptionsFilename); @@ -513,6 +562,7 @@ begin SaveToXMLConfig(XMLConfig,'CodeExplorer/'); XMLConfig.Flush; XMLConfig.Free; + Modified:=false; except on E: Exception do begin DebugLn('[TCodeExplorerOptions.Save] error writing "',FOptionsFilename,'" ',E.Message); @@ -535,7 +585,8 @@ begin FMode:=CodeExplorerModeNameToEnum( XMLConfig.GetValue(Path+'Mode/Value','')); FFollowCursor:=XMLConfig.GetValue(Path+'FollowCursor',true); - + FPage:=CodeExplorerPageNameToEnum(XMLConfig.GetValue(Path+'Page/Value','')); + FCategories:=[]; for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do if XMLConfig.GetValue(Path+'Categories/'+CodeExplorerCategoryNames[c], @@ -606,7 +657,9 @@ begin CodeExplorerModeNames[FMode], CodeExplorerModeNames[cemCategory]); XMLConfig.SetDeleteValue(Path+'FollowCursor',FFollowCursor,true); - + XMLConfig.SetDeleteValue(Path+'Page/Value',CodeExplorerPageNames[FPage], + CodeExplorerPageNames[DefaultCodeExplorerPage]); + for c:=FirstCodeExplorerCategory to high(TCodeExplorerCategory) do XMLConfig.SetDeleteValue(Path+'Categories/'+CodeExplorerCategoryNames[c], c in FCategories,c in DefaultCodeExplorerCategories); @@ -660,7 +713,6 @@ begin end; end; end; - end; procedure TCodeExplorerOptions.IncreaseChangeStep; diff --git a/ide/codeexplorer.pas b/ide/codeexplorer.pas index 6ed27b09c4..aeb83480f0 100644 --- a/ide/codeexplorer.pas +++ b/ide/codeexplorer.pas @@ -67,12 +67,6 @@ type ); TCodeExplorerViewFlags = set of TCodeExplorerViewFlag; - TCodeExplorerPage = ( - cepNone, - cepCode, - cepDirectives - ); - TCodeObsStackItemType = ( cositNone, cositBegin, @@ -153,6 +147,7 @@ type procedure IdleTimer1Timer(Sender: TObject); procedure JumpToMenuItemClick(Sender: TObject); procedure JumpToImplementationMenuItemClick(Sender: TObject); + procedure OnCloseIDE(Sender: TObject); procedure ShowSrcEditPosMenuItemClick(Sender: TObject); procedure MainNotebookPageChanged(Sender: TObject); procedure CodeModeSpeedButtonClick(Sender: TObject); @@ -455,7 +450,7 @@ end; { TCodeExplorerView } -procedure TCodeExplorerView.CodeExplorerViewCREATE(Sender: TObject); +procedure TCodeExplorerView.CodeExplorerViewCreate(Sender: TObject); begin FMode := CodeExplorerOptions.Mode; UpdateMode; @@ -463,7 +458,10 @@ begin Name:=NonModalIDEWindowNames[nmiwCodeExplorerName]; Caption := lisMenuViewCodeExplorer; - MainNotebook.ActivePage:=CodePage; + case CodeExplorerOptions.Page of + cepDirectives: MainNotebook.ActivePage:=DirectivesPage; + else MainNotebook.ActivePage:=CodePage; + end; CodePage.Caption:=lisCode; CodeRefreshSpeedButton.Hint:=dlgUnitDepRefresh; @@ -512,6 +510,7 @@ begin fNodesWithPath:=TAvgLvlTree.Create(@CompareViewNodePathsAndParams); Application.AddOnUserInputHandler(@OnUserInput); + LazarusIDE.AddHandlerOnIDEClose(@OnCloseIDE); end; procedure TCodeExplorerView.CodeExplorerViewDestroy(Sender: TObject); @@ -628,6 +627,11 @@ begin JumpToSelection(true); end; +procedure TCodeExplorerView.OnCloseIDE(Sender: TObject); +begin + CodeExplorerOptions.Save; +end; + procedure TCodeExplorerView.ShowSrcEditPosMenuItemClick(Sender: TObject); begin SelectSourceEditorNode; @@ -635,6 +639,10 @@ end; procedure TCodeExplorerView.MainNotebookPageChanged(Sender: TObject); begin + if MainNotebook.ActivePage=DirectivesPage then + CodeExplorerOptions.Page:=cepDirectives + else + CodeExplorerOptions.Page:=cepCode; Refresh(true); end; @@ -2348,8 +2356,8 @@ begin Result:=SelectCodePosition(TCodeBuffer(SrcEdit.CodeToolsBuffer),xy.x,xy.y); end; -function TCodeExplorerView.SelectCodePosition(CodeBuf: TCodeBuffer; - X, Y: integer): Boolean; +function TCodeExplorerView.SelectCodePosition(CodeBuf: TCodeBuffer; X, + Y: integer): boolean; var CodePos: TCodeXYPosition; CleanPos: integer;