From 96686c47314cbb25f61d87dd03a72a36bad9b7f4 Mon Sep 17 00:00:00 2001 From: bart <9132501-flyingsheep@users.noreply.gitlab.com> Date: Tue, 30 Sep 2014 20:42:50 +0000 Subject: [PATCH] PoChecker: save and restore windowgeometry of Results form and GraphicalSummary form. git-svn-id: trunk@46381 - --- components/pochecker/graphstat.pp | 30 +++- components/pochecker/pocheckermain.pp | 18 +-- components/pochecker/pocheckersettings.pp | 171 +++++++++++++++------- components/pochecker/resultdlg.pp | 41 +++++- 4 files changed, 194 insertions(+), 66 deletions(-) diff --git a/components/pochecker/graphstat.pp b/components/pochecker/graphstat.pp index d3eb8f54d6..4c9b39639b 100644 --- a/components/pochecker/graphstat.pp +++ b/components/pochecker/graphstat.pp @@ -7,7 +7,8 @@ interface uses Classes, SysUtils, Types, FileUtil, Forms, Controls, Graphics, Dialogs, {$ifndef POCHECKERSTANDALONE} LazIDEIntf, {$endif} - ExtCtrls, PoFamilies, PoCheckerConsts, LCLProc, StdCtrls, ComCtrls; + ExtCtrls, PoFamilies, PoCheckerConsts, LCLProc, StdCtrls, ComCtrls, + PoCheckerSettings; type @@ -37,12 +38,16 @@ type FPoFamilyStats: TPoFamilyStats; FImgList: TImageList; FOldHintHidePause: Integer; + FSettings: TPoCheckerSettings; + procedure LoadConfig; + Procedure SaveConfig; function CreateBitmap(AStat: TStat): TBitmap; procedure AddToListView(AStat: TStat; ABmp: TBitmap); procedure DrawGraphs; public { public declarations } property PoFamilyStats: TPoFamilyStats read FPoFamilyStats write FPoFamilyStats; + property Settings: TPoCheckerSettings read FSettings write FSettings; end; var @@ -83,6 +88,7 @@ procedure TGraphStatForm.FormShow(Sender: TObject); begin FOldHintHidePause := Application.HintHidePause; Application.HintHidePause := 5000; + LoadConfig; end; procedure TGraphStatForm.ListViewMouseMove(Sender: TObject; Shift: TShiftState; @@ -141,6 +147,27 @@ begin {$endif} end; +procedure TGraphStatForm.LoadConfig; +var + ARect: TRect; +begin + if not Assigned(FSettings) then Exit; + ARect := FSettings.GraphFormGeometry; + //debugln('TGraphStatForm.LoadConfig: ARect = ',dbgs(ARect)); + if not IsDefaultRect(ARect) and IsValidRect(ARect) then + begin + ARect := FitToRect(ARect, Screen.WorkAreaRect); + BoundsRect := ARect; + end; +end; + +procedure TGraphStatForm.SaveConfig; +begin + //debugln('TGraphStatForm.SaveConfig: BoundsRect = ',dbgs(BoundsRect)); + if not Assigned(FSettings) then Exit; + Settings.GraphFormGeometry := BoundsRect; +end; + procedure TGraphStatForm.FormCreate(Sender: TObject); begin Caption := sGrapStatFormCaption; @@ -169,6 +196,7 @@ end; procedure TGraphStatForm.FormDestroy(Sender: TObject); begin if Assigned(FImgList) then FImgList.Free; + SaveConfig; end; function TGraphStatForm.CreateBitmap(AStat: TStat): TBitmap; diff --git a/components/pochecker/pocheckermain.pp b/components/pochecker/pocheckermain.pp index 8a412f34ba..be7952de5b 100644 --- a/components/pochecker/pocheckermain.pp +++ b/components/pochecker/pocheckermain.pp @@ -392,8 +392,8 @@ begin (PoFamily.ChildName <> FSelectedPoName) then PoFamily.ChildName := FSelectedPoName; PoFamily.RunTests(TestTypes, TestOptions, ErrorCount, WarningCount, SL); - debugln('RunSelectedTests: ', Format(sTotalErrors, [ErrorCount])); - debugln(' ', Format(sTotalWarnings, [WarningCount])); + //debugln('RunSelectedTests: ', Format(sTotalErrors, [ErrorCount])); + //debugln(' ', Format(sTotalWarnings, [WarningCount])); if (ErrorCount > 0) or (WarningCount > 0) or (pttCheckStatistics in TestTypes) then begin @@ -407,6 +407,7 @@ begin ResultDlg.PoFamilyStats := PoFamily.PoFamilyStats else ResultDlg.PoFamilyStats := nil; + ResultDlg.Settings := FPoCheckerSettings; mr := ResultDlg.ShowModal; finally ResultDlg.Free; @@ -455,20 +456,17 @@ end; procedure TPoCheckerForm.LoadConfig; -function IsSaneRect(ARect: TRect): Boolean; -const - MinWH = 50; //arbitrary -begin - Result := (ARect.Right > ARect.Left + MinWH) and - (ARect.Bottom > ARect.Bottom + MinWH); -end; var ARect: TRect; begin FPoCheckerSettings := TPoCheckerSettings.Create; FPoCheckerSettings.LoadConfig; ARect := FPoCheckerSettings.MainFormGeometry; - if IsSaneRect(ARect) then BoundsRect := ARect; + if not IsDefaultRect(ARect) and IsValidRect(ARect) then + begin + ARect := FitToRect(ARect, Screen.WorkAreaRect); + BoundsRect := ARect; + end; //DebugLn(' TestOptions after loading = '); //DebugLn(' ',DbgS(FPoCheckerSettings.TestOptions)); diff --git a/components/pochecker/pocheckersettings.pp b/components/pochecker/pocheckersettings.pp index 1c8bcdc703..3588b24229 100644 --- a/components/pochecker/pocheckersettings.pp +++ b/components/pochecker/pocheckersettings.pp @@ -29,9 +29,12 @@ type FChildrenPoList: TStrings; FLastSelectedFile: String; FMainFormGeometry: TRect; + FGraphFormGeometry: TRect; + FResultsFormGeometry: TRect; function LoadLastSelectedFile: String; function LoadTestTypes: TPoTestTypes; function LoadTestOptions: TPoTestOptions; + procedure LoadWindowsGeometry; procedure LoadMasterPoList(List: TStrings); procedure LoadChildrenPoList(List: TStrings); procedure SaveLastSelectedFile; @@ -56,13 +59,116 @@ type property ChildrenPoList: TStrings read FChildrenPoList write FChildrenPoList; property LastSelectedFile: String read FLastSelectedFile write FLastSelectedFile; property MainFormGeometry: TRect read FMainFormGeometry write FMainFormGeometry; + property ResultsFormGeometry: TRect read FResultsFormGeometry write FResultsFormGeometry; + property GraphFormGeometry: TRect read FGraphFormGeometry write FGraphFormGeometry; end; function DbgS(PoTestTypes: TPoTestTypes): String; overload; function DbgS(PoTestOpts: TPoTestOptions): String; overload; +function FitToRect(const ARect, FitIn: TRect): TRect; +function IsDefaultRect(ARect: TRect): Boolean; +function IsValidRect(ARect: TRect): Boolean; + implementation +function FitToRect(const ARect, FitIn: TRect): TRect; +begin + Result := ARect; + if (Result.Right - Result.Left) > (FitIn.Right - FitIn.Left) then + Result.Right := Result.Left + (FitIn.Right - FitIn.Left); + if (Result.Bottom - Result.Top) > (FitIn.Bottom - FitIn.Top) then + Result.Bottom := Result.Top + (FitIn.Bottom - FitIn.Top); + if Result.Left < FitIn.Left then + begin + Result.Right := Result.Right + (FitIn.Left - Result.Left); + Result.Left := FitIn.Left; + end; + if Result.Right > FitIn.Right then + begin + Result.Left := Result.Left - (Result.Right - FitIn.Right); + Result.Right := Result.Right - (Result.Right - FitIn.Right); + end; + if Result.Top < FitIn.Top then + begin + Result.Bottom := Result.Bottom + (FitIn.Top - Result.Top); + Result.Top := FitIn.Top; + end; + if Result.Bottom > FitIn.Bottom then + begin + Result.Top := Result.Top - (Result.Bottom - FitIn.Bottom); + Result.Bottom := Result.Bottom - (Result.Bottom - FitIn.Bottom); + end; + + //if Result.Right > FitIn.Right then Result.Right := FitIn.Right; + //if Result.Bottom > FitIn.Bottom then Result.Bottom := FitIn.Bottom; +end; + +function IsDefaultRect(ARect: TRect): Boolean; +begin + Result := (ARect.Left = -1) and (ARect.Top = -1) and + (ARect.Right = -1) and (Arect.Bottom = -1); +end; + +function IsValidRect(ARect: TRect): Boolean; +begin + Result := (ARect.Right > ARect.Left) and + (ARect.Bottom > ARect.Top); +end; + +const + TestTypeNames: array[TPoTestType] of String = ( + 'CheckNumberOfItems', + 'CheckForIncompatibleFormatArguments', + 'CheckMissingIdentifiers', + 'CheckForMismatchesInUntranslatedStrings', + 'CheckForDuplicateUntranslatedValues', + 'CheckStatistics' + ); + TestoptionNames: array[TPoTestOption] of String = ( + 'FindAllChildren', + 'IgnoreFuzzyStrings' + ); + + pLoadSettings = 'General/LoadSettings/'; + pLastSelected = 'LastSelected/'; + pTestTypes = 'TestTypes/'; + pTestOptions = 'TestOptions/'; + pWindowsGeometry = 'General/WindowsGeometry/'; + pMasterPoFiles = 'MasterPoFiles/'; + pChildrenPoFiles = 'ChildrenPoFiles/'; + +var + DefaultRect: TRect; + +function DbgS(PoTestTypes: TPoTestTypes): String; overload; +var + Typ: TPoTestType; +begin + Result := '['; + for Typ := Low(TPotestType) to High(TPoTesttype) do + begin + if (Typ in PoTestTypes) then Result := Result + TestTypeNames[Typ]; + end; + if (Result[Length(Result)] = ',') then System.Delete(Result,Length(Result),1); + Result := Result + ']'; +end; + +function DbgS(PoTestOpts: TPoTestOptions): String; overload; +var + Opt: TPoTestOption; +begin + Result := '['; + for Opt := Low(TPotestOption) to High(TPoTestOption) do + begin + if (Opt in PoTestOpts) then Result := Result + TestOptionNames[opt]; + end; + if (Result[Length(Result)] = ',') then System.Delete(Result,Length(Result),1); + Result := Result + ']'; +end; + + + { TPoCheckerSettings } {$ifdef pocheckerstandalone} function AppName: String; @@ -101,53 +207,6 @@ end; {$endif} -const - TestTypeNames: array[TPoTestType] of String = ( - 'CheckNumberOfItems', - 'CheckForIncompatibleFormatArguments', - 'CheckMissingIdentifiers', - 'CheckForMismatchesInUntranslatedStrings', - 'CheckForDuplicateUntranslatedValues', - 'CheckStatistics' - ); - TestoptionNames: array[TPoTestOption] of String = ( - 'FindAllChildren', - 'IgnoreFuzzyStrings' - ); - - pLoadSettings = 'General/LoadSettings/'; - pLastSelected = 'LastSelected/'; - pTestTypes = 'TestTypes/'; - pTestOptions = 'TestOptions/'; - pWindowsGeometry = 'General/WindowsGeometry/'; - pMasterPoFiles = 'MasterPoFiles/'; - pChildrenPoFiles = 'ChildrenPoFiles/'; - -function DbgS(PoTestTypes: TPoTestTypes): String; overload; -var - Typ: TPoTestType; -begin - Result := '['; - for Typ := Low(TPotestType) to High(TPoTesttype) do - begin - if (Typ in PoTestTypes) then Result := Result + TestTypeNames[Typ]; - end; - if (Result[Length(Result)] = ',') then System.Delete(Result,Length(Result),1); - Result := Result + ']'; -end; - -function DbgS(PoTestOpts: TPoTestOptions): String; overload; -var - Opt: TPoTestOption; -begin - Result := '['; - for Opt := Low(TPotestOption) to High(TPoTestOption) do - begin - if (Opt in PoTestOpts) then Result := Result + TestOptionNames[opt]; - end; - if (Result[Length(Result)] = ',') then System.Delete(Result,Length(Result),1); - Result := Result + ']'; -end; function TPoCheckerSettings.LoadLastSelectedFile: String; begin @@ -184,6 +243,13 @@ begin end; end; +procedure TPoCheckerSettings.LoadWindowsGeometry; +begin + FConfig.GetValue(pWindowsGeometry+'MainForm/Value',FMainFormGeometry,DefaultRect); + FConfig.GetValue(pWindowsGeometry+'ResultsForm/Value',FResultsFormGeometry,DefaultRect); + FConfig.GetValue(pWindowsGeometry+'GraphForm/Value',FGraphFormGeometry,DefaultRect); +end; + procedure TPoCheckerSettings.LoadMasterPoList(List: TStrings); begin if not Assigned(List) then Exit; @@ -227,7 +293,9 @@ end; procedure TPoCheckerSettings.SaveWindowsGeometry; begin - FConfig.SetDeleteValue(pWindowsGeometry+'MainForm/Value',FMainFormGeometry,Rect(-1,-1,-1,-1)); + FConfig.SetDeleteValue(pWindowsGeometry+'MainForm/Value',FMainFormGeometry,DefaultRect); + FConfig.SetDeleteValue(pWindowsGeometry+'ResultsForm/Value',FResultsFormGeometry,DefaultRect); + FConfig.SetDeleteValue(pWindowsGeometry+'GraphForm/Value',FGraphFormGeometry,DefaultRect); end; procedure TPoCheckerSettings.SaveMasterPoList; @@ -250,8 +318,8 @@ begin FFilename := GetAndCreateConfigPath; if (FFilename <> '') then FFilename := AppendPathDelim(FFilename); FFilename := FFilename + 'pochecker.xml'; - debugln('TPoCheckerSettings.Create: Filename = '); - debugln('"',Filename,'"'); + //debugln('TPoCheckerSettings.Create: Filename = '); + //debugln('"',Filename,'"'); //FFilename := 'pochecker.xml'; @@ -283,6 +351,7 @@ begin FTestTypes := LoadTestTypes; FTestOptions := LoadTestOptions; FLastSelectedFile := LoadLastSelectedFile; + LoadWindowsGeometry; LoadMasterPoList(FMasterPoList); LoadChildrenPoList(FChildrenPoList); end; @@ -318,5 +387,7 @@ begin end; end; +Initialization + DefaultRect := Rect(-1, -1, -1, -1); end. diff --git a/components/pochecker/resultdlg.pp b/components/pochecker/resultdlg.pp index 89cce557b6..cee13806c5 100644 --- a/components/pochecker/resultdlg.pp +++ b/components/pochecker/resultdlg.pp @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Buttons, ClipBrd, LCLType, LCLProc, SynEdit, SynHighlighterPo, - PoFamilies, GraphStat, PoCheckerConsts; + PoFamilies, GraphStat, PoCheckerConsts, PoCheckerSettings; type @@ -33,10 +33,14 @@ type private PoHL: TSynPoSyn; FPoFamilyStats: TPoFamilyStats; + FSettings: TPoCheckerSettings; procedure SaveToFile; + procedure LoadConfig; + procedure SaveConfig; public property Log: TStringList read FLog write FLog; property PoFamilyStats: TPoFamilyStats read FPoFamilyStats write FPoFamilyStats; + property Settings: TPoCheckerSettings read FSettings write FSettings; end; implementation @@ -72,6 +76,7 @@ end; procedure TResultDlgForm.FormDestroy(Sender: TObject); begin FLog.Free; + SaveConfig; end; procedure TResultDlgForm.FormKeyDown(Sender: TObject; var Key: Word; @@ -90,6 +95,7 @@ procedure TResultDlgForm.FormShow(Sender: TObject); begin LogMemo.Lines.Assign(FLog); GraphStatBtn.Visible := (PoFamilyStats <> nil) and (PoFamilyStats.Count > 0); + LoadConfig; end; procedure TResultDlgForm.GraphStatBtnClick(Sender: TObject); @@ -97,10 +103,14 @@ var mr: TModalResult; begin GraphStatForm := TGraphStatForm.Create(nil); - GraphStatForm.PoFamilyStats := Self.PoFamilyStats; - mr := GraphStatForm.ShowModal; - FreeAndNil(GraphStatForm); - if mr = mrOpenEditorFile then ModalResult := mr; // To inform pocheckermain + try + GraphStatForm.PoFamilyStats := Self.PoFamilyStats; + GraphStatForm.Settings := Self.Settings; + mr := GraphStatForm.ShowModal; + if mr = mrOpenEditorFile then ModalResult := mr; // To inform pocheckermain + finally + FreeAndNil(GraphStatForm); + end; end; procedure TResultDlgForm.SaveBtnClick(Sender: TObject); @@ -127,5 +137,26 @@ begin end; end; +procedure TResultDlgForm.LoadConfig; +var + ARect: TRect; +begin + if not Assigned(FSettings) then Exit; + ARect := FSettings.ResultsFormGeometry; + //debugln('TResultDlgForm.LoadConfig: ARect = ',dbgs(ARect)); + if not IsDefaultRect(ARect) and IsValidRect(ARect) then + begin + ARect := FitToRect(ARect, Screen.WorkAreaRect); + BoundsRect := ARect; + end; +end; + +procedure TResultDlgForm.SaveConfig; +begin + //debugln('TResultDlgForm.SaveConfig: BoundsRect = ',dbgs(BoundsRect)); + if not Assigned(FSettings) then Exit; + Settings.ResultsFormGeometry := BoundsRect; +end; + end.