From 3d26d69da887416eae11e7f22b7e5cebde978fc6 Mon Sep 17 00:00:00 2001 From: mattias Date: Fri, 8 Oct 2010 15:54:42 +0000 Subject: [PATCH] IDE: compiler options: added OnChanged handlers git-svn-id: trunk@27622 - --- ide/compileroptions.pp | 4 +- ide/project.pp | 117 ++++++++++++++++++++++++++++++++++++---- ideintf/projectintf.pas | 23 ++++++++ 3 files changed, 133 insertions(+), 11 deletions(-) diff --git a/ide/compileroptions.pp b/ide/compileroptions.pp index 983c80fbb8..a31941e400 100644 --- a/ide/compileroptions.pp +++ b/ide/compileroptions.pp @@ -568,7 +568,7 @@ type function SaveToFile(AFilename: string): TModalResult; procedure Assign(Source: TPersistent); override; function IsEqual(CompOpts: TBaseCompilerOptions): boolean; virtual; - procedure CreateDiff(CompOpts: TBaseCompilerOptions; Diff: TStrings); + procedure CreateDiffAsText(CompOpts: TBaseCompilerOptions; Diff: TStrings); function CreateDiff(CompOpts: TBaseCompilerOptions; Tool: TCompilerDiffTool = nil): boolean; virtual; @@ -3127,7 +3127,7 @@ begin Tool.Free; end; -procedure TBaseCompilerOptions.CreateDiff(CompOpts: TBaseCompilerOptions; +procedure TBaseCompilerOptions.CreateDiffAsText(CompOpts: TBaseCompilerOptions; Diff: TStrings); var Tool: TCompilerDiffTool; diff --git a/ide/project.pp b/ide/project.pp index f8d9f923c9..848645b773 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -522,7 +522,7 @@ type procedure Assign(Source: TPersistent); override; function IsEqual(CompOpts: TBaseCompilerOptions): boolean; override; function CreateDiff(CompOpts: TBaseCompilerOptions; - Tool: TCompilerDiffTool): boolean; override; + Tool: TCompilerDiffTool = nil): boolean; override; procedure InvalidateOptions; function GetEffectiveLCLWidgetType: string; override; public @@ -598,6 +598,7 @@ type FChangeStamp: integer; fLastSavedChangeStamp: integer; FItems: TStrings; + fOnChanged: TMethodList; function GetMacros(const Name: string): string; function GetModified: boolean; function GetNames(Index: integer): string; @@ -621,6 +622,9 @@ type procedure IncreaseChangeStamp; procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string; ClearModified: boolean = true); + procedure AddOnChangedHandler(const Handler: TNotifyEvent); + procedure RemoveOnChangedHandler(const Handler: TNotifyEvent); + public property Modified: boolean read GetModified write SetModified; property CfgVars: TCTCfgScriptVariables read FCfgVars; end; @@ -629,32 +633,46 @@ type TProjectBuildMode = class(TComponent) private + FChangeStamp: int64; FCompilerOptions: TProjectCompilerOptions; FBuildMacroValues: TProjectBuildMacros; FIdentifier: string; FInSession: boolean; + fOnChanged: TMethodList; + procedure SetIdentifier(const AValue: string); procedure SetInSession(const AValue: boolean); + procedure OnItemChanged(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; + procedure Clear; + function Equals(Src: TProjectBuildMode): boolean; reintroduce; + procedure Assign(Src: TProjectBuildMode); reintroduce; procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string; ClearModified: boolean = true); - property Identifier: string read FIdentifier;// arbitrary string + property ChangeStamp: int64 read FChangeStamp; + procedure IncreaseChangeStamp; + procedure AddOnChangedHandler(const Handler: TNotifyEvent); + procedure RemoveOnChangedHandler(const Handler: TNotifyEvent); + public + property InSession: boolean read FInSession write SetInSession; + property Identifier: string read FIdentifier write SetIdentifier;// arbitrary string + + // copied by Assign, compared by Equals, cleared by Clear property CompilerOptions: TProjectCompilerOptions read FCompilerOptions; property BuildMacroValues: TProjectBuildMacros read FBuildMacroValues; - property InSession: boolean read FInSession write SetInSession; end; { TProjectBuildModes } TProjectBuildModes = class(TComponent) private - FActive: TProjectBuildMode; FChangeStamp: integer; fItems: TFPList; + fOnChanged: TMethodList; function GetItems(Index: integer): TProjectBuildMode; - procedure SetActive(const AValue: TProjectBuildMode); + procedure OnItemChanged(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -666,7 +684,8 @@ type property Items[Index: integer]: TProjectBuildMode read GetItems; default; property ChangeStamp: integer read FChangeStamp; procedure IncreaseChangeStamp; - property Active: TProjectBuildMode read FActive write SetActive; + procedure AddOnChangedHandler(const Handler: TNotifyEvent); + procedure RemoveOnChangedHandler(const Handler: TNotifyEvent); end; { TProject } @@ -6304,12 +6323,14 @@ begin FItems:=TStringList.Create; FCfgVars:=TCTCfgScriptVariables.Create; FChangeStamp:=CTInvalidChangeStamp; + fOnChanged:=TMethodList.Create; end; destructor TProjectBuildMacros.Destroy; begin FreeAndNil(FItems); FreeAndNil(FCfgVars); + FreeAndNil(fOnChanged); inherited Destroy; end; @@ -6388,6 +6409,7 @@ end; procedure TProjectBuildMacros.IncreaseChangeStamp; begin CTIncreaseChangeStamp(FChangeStamp); + if fOnChanged<>nil then fOnChanged.CallNotifyEvents(Self); end; procedure TProjectBuildMacros.LoadFromXMLConfig(XMLConfig: TXMLConfig; @@ -6437,6 +6459,17 @@ begin Modified:=false; end; +procedure TProjectBuildMacros.AddOnChangedHandler(const Handler: TNotifyEvent); +begin + fOnChanged.Add(TMethod(Handler)); +end; + +procedure TProjectBuildMacros.RemoveOnChangedHandler(const Handler: TNotifyEvent + ); +begin + fOnChanged.Remove(TMethod(Handler)); +end; + { TProjectBuildMode } procedure TProjectBuildMode.SetInSession(const AValue: boolean); @@ -6445,20 +6478,56 @@ begin FInSession:=AValue; end; +procedure TProjectBuildMode.OnItemChanged(Sender: TObject); +begin + IncreaseChangeStamp; +end; + +procedure TProjectBuildMode.SetIdentifier(const AValue: string); +begin + if FIdentifier=AValue then exit; + FIdentifier:=AValue; + IncreaseChangeStamp; +end; + constructor TProjectBuildMode.Create(AOwner: TComponent); begin inherited Create(AOwner); + fOnChanged:=TMethodList.Create; + FChangeStamp:=CTInvalidChangeStamp64; FBuildMacroValues:=TProjectBuildMacros.Create; + FBuildMacroValues.AddOnChangedHandler(@OnItemChanged); FCompilerOptions:=TProjectCompilerOptions.Create(Self); + FCompilerOptions.AddOnChangedHandler(@OnItemChanged); end; destructor TProjectBuildMode.Destroy; begin + FreeAndNil(fOnChanged); FreeAndNil(FCompilerOptions); FreeAndNil(FBuildMacroValues); inherited Destroy; end; +procedure TProjectBuildMode.Clear; +begin + CompilerOptions.Clear; + BuildMacroValues.Clear; +end; + +function TProjectBuildMode.Equals(Src: TProjectBuildMode): boolean; +begin + Result:=CompilerOptions.CreateDiff(Src.CompilerOptions) + and BuildMacroValues.Equals(Src.BuildMacroValues); +end; + +procedure TProjectBuildMode.Assign(Src: TProjectBuildMode); +begin + if Equals(Src) then exit; + CompilerOptions.Assign(Src.CompilerOptions); + BuildMacroValues.Assign(Src.BuildMacroValues); +end; + procedure TProjectBuildMode.LoadFromXMLConfig(XMLConfig: TXMLConfig; const Path: string); begin @@ -6475,6 +6544,23 @@ begin FCompilerOptions.SaveToXMLConfig(XMLConfig,Path+'CompilerOptions/'); end; +procedure TProjectBuildMode.IncreaseChangeStamp; +begin + CTIncreaseChangeStamp64(FChangeStamp); + if fOnChanged<>nil then fOnChanged.CallNotifyEvents(Self); +end; + +procedure TProjectBuildMode.AddOnChangedHandler(const Handler: TNotifyEvent); +begin + fOnChanged.Add(TMethod(Handler)); +end; + +procedure TProjectBuildMode.RemoveOnChangedHandler(const Handler: TNotifyEvent + ); +begin + fOnChanged.Remove(TMethod(Handler)); +end; + { TProjectBuildModes } function TProjectBuildModes.GetItems(Index: integer): TProjectBuildMode; @@ -6482,22 +6568,22 @@ begin Result:=TProjectBuildMode(fItems[Index]); end; -procedure TProjectBuildModes.SetActive(const AValue: TProjectBuildMode); +procedure TProjectBuildModes.OnItemChanged(Sender: TObject); begin - if FActive=AValue then exit; - FActive:=AValue; IncreaseChangeStamp; end; constructor TProjectBuildModes.Create(AOwner: TComponent); begin inherited Create(AOwner); + fOnChanged:=TMethodList.Create; fItems:=TFPList.Create; FChangeStamp:=CTInvalidChangeStamp; end; destructor TProjectBuildModes.Destroy; begin + FreeAndNil(fOnChanged); Clear; FreeAndNil(fItems); inherited Destroy; @@ -6530,6 +6616,7 @@ function TProjectBuildModes.Add(Identifier: string): TProjectBuildMode; begin Result:=TProjectBuildMode.Create(Self); Result.FIdentifier:=Identifier; + Result.AddOnChangedHandler(@OnItemChanged); fItems.Add(Result); end; @@ -6541,6 +6628,18 @@ end; procedure TProjectBuildModes.IncreaseChangeStamp; begin CTIncreaseChangeStamp(FChangeStamp); + if fOnChanged<>nil then fOnChanged.CallNotifyEvents(Self); +end; + +procedure TProjectBuildModes.AddOnChangedHandler(const Handler: TNotifyEvent); +begin + fOnChanged.Add(TMethod(Handler)); +end; + +procedure TProjectBuildModes.RemoveOnChangedHandler(const Handler: TNotifyEvent + ); +begin + fOnChanged.Remove(TMethod(Handler)); end; initialization diff --git a/ideintf/projectintf.pas b/ideintf/projectintf.pas index 51fb9fba1f..024b841656 100644 --- a/ideintf/projectintf.pas +++ b/ideintf/projectintf.pas @@ -185,6 +185,7 @@ type protected FChangeStamp: int64; FSavedChangeStamp: int64; + fOnChanged: TMethodList; // Paths: @@ -296,6 +297,7 @@ type procedure SetUnitPaths(const AValue: String); virtual; abstract; public constructor Create(const TheOwner: TObject); virtual; + destructor Destroy; override; function IsActive: boolean; virtual; public property Owner: TObject read fOwner write fOwner; @@ -304,6 +306,8 @@ type property ChangeStamp: int64 read FChangeStamp; procedure IncreaseChangeStamp; class function InvalidChangeStamp: int64; + procedure AddOnChangedHandler(const Handler: TNotifyEvent); + procedure RemoveOnChangedHandler(const Handler: TNotifyEvent); // search paths: property IncludePath: String read GetIncludePaths write SetIncludePaths; @@ -1826,10 +1830,17 @@ end; constructor TLazCompilerOptions.Create(const TheOwner: TObject); begin inherited Create; + fOnChanged:=TMethodList.Create; FChangeStamp:=InvalidChangeStamp; FOwner := TheOwner; end; +destructor TLazCompilerOptions.Destroy; +begin + FreeAndNil(fOnChanged); + inherited Destroy; +end; + function TLazCompilerOptions.IsActive: boolean; begin Result:=false; @@ -1841,6 +1852,7 @@ begin inc(fChangeStamp) else fChangeStamp:=Low(int64)+1; + if fOnChanged<>nil then fOnChanged.CallNotifyEvents(Self); end; class function TLazCompilerOptions.InvalidChangeStamp: int64; @@ -1848,6 +1860,17 @@ begin Result:=Low(int64); end; +procedure TLazCompilerOptions.AddOnChangedHandler(const Handler: TNotifyEvent); +begin + fOnChanged.Add(TMethod(Handler)); +end; + +procedure TLazCompilerOptions.RemoveOnChangedHandler(const Handler: TNotifyEvent + ); +begin + fOnChanged.Remove(TMethod(Handler)); +end; + { TNewItemProjectFile } function TNewItemProjectFile.LocalizedName: string;