From bd4b61b421cb333618b381b21a92a8d7e6838186 Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 6 Mar 2008 22:59:24 +0000 Subject: [PATCH] IDEIntf: added handlers for opened and close project git-svn-id: trunk@14451 - --- examples/openglcontrol/openglcontrol_demo.lpi | 4 +- ide/main.pp | 70 +++++++++++++------ ideintf/lazideintf.pas | 57 ++++++++++++++- 3 files changed, 105 insertions(+), 26 deletions(-) diff --git a/examples/openglcontrol/openglcontrol_demo.lpi b/examples/openglcontrol/openglcontrol_demo.lpi index c227f512d0..e20026f7d2 100644 --- a/examples/openglcontrol/openglcontrol_demo.lpi +++ b/examples/openglcontrol/openglcontrol_demo.lpi @@ -25,10 +25,10 @@ - + - + diff --git a/ide/main.pp b/ide/main.pp index 99b850f5a3..0961c0bce7 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -7561,8 +7561,10 @@ begin end; function TMainIDE.DoNewProject(ProjectDesc: TProjectDescriptor):TModalResult; -var i:integer; -Begin +var + i:integer; + HandlerResult: TModalResult; +begin DebugLn('TMainIDE.DoNewProject A'); // init the descriptor (it can now ask the user for options) @@ -7597,36 +7599,45 @@ Begin // create new project (TProject will automatically create the mainunit) Project1:=CreateProjectObject(ProjectDesc,ProjectDescriptorProgram); - Project1.BeginUpdate(true); try - Project1.CompilerOptions.CompilerPath:='$(CompPath)'; - UpdateCaption; - if ProjInspector<>nil then ProjInspector.LazProject:=Project1; + Project1.BeginUpdate(true); + try + Project1.CompilerOptions.CompilerPath:='$(CompPath)'; + UpdateCaption; + if ProjInspector<>nil then ProjInspector.LazProject:=Project1; - // add and load default required packages - PkgBoss.AddDefaultDependencies(Project1); + // add and load default required packages + PkgBoss.AddDefaultDependencies(Project1); - if ProjectDesc.CreateStartFiles(Project1)<>mrOk then begin - debugln('TMainIDE.DoNewProject ProjectDesc.CreateStartFiles failed'); + if ProjectDesc.CreateStartFiles(Project1)<>mrOk then begin + debugln('TMainIDE.DoNewProject ProjectDesc.CreateStartFiles failed'); + end; + + // rebuild codetools defines + MainBuildBoss.RescanCompilerDefines(true,true); + // (i.e. remove old project specific things and create new) + IncreaseCompilerParseStamp; + Project1.DefineTemplates.AllChanged; + Project1.DefineTemplates.Active:=true; + finally + Project1.EndUpdate; end; - // rebuild codetools defines - MainBuildBoss.RescanCompilerDefines(true,true); - // (i.e. remove old project specific things and create new) - IncreaseCompilerParseStamp; - Project1.DefineTemplates.AllChanged; - Project1.DefineTemplates.Active:=true; + // set all modified to false + for i:=0 to Project1.UnitCount-1 do + Project1.Units[i].ClearModifieds; + Project1.Modified:=false; + Result:=mrOk; finally - Project1.EndUpdate; + // call handlers + HandlerResult:=DoCallProjectChangedHandler(lihtOnProjectOpened,Project1); + if not (HandlerResult in [mrOk,mrCancel,mrAbort]) then + HandlerResult:=mrCancel; + if (Result=mrOk) then + Result:=HandlerResult; end; - // set all modified to false - for i:=0 to Project1.UnitCount-1 do - Project1.Units[i].ClearModifieds; - Project1.Modified:=false; - //DebugLn('TMainIDE.DoNewProject end '); - Result:=mrOk; end; function TMainIDE.DoSaveProject(Flags: TSaveFlags):TModalResult; @@ -7788,6 +7799,11 @@ begin debugln('TMainIDE.DoCloseProject DebugBoss.DoStopProject failed'); exit; end; + + // call handlers + Result:=DoCallProjectChangedHandler(lihtOnProjectClose,Project1); + if Result=mrAbort then exit; + // close all loaded files while SourceNotebook.Notebook<>nil do begin Result:=DoCloseEditorFile(SourceNotebook.Notebook.PageCount-1, @@ -7817,6 +7833,7 @@ var LastDesigner: TDesigner; AnUnitInfo: TUnitInfo; FileReadable: Boolean; + HandlerResult: TModalResult; begin // close the old project if SomethingOfProjectIsModified then begin @@ -8007,7 +8024,14 @@ begin end; end; end; + // call handlers + HandlerResult:=DoCallProjectChangedHandler(lihtOnProjectOpened,Project1); + if not (HandlerResult in [mrOk,mrCancel,mrAbort]) then + HandlerResult:=mrCancel; + if (Result=mrOk) then + Result:=HandlerResult; end; + if Result=mrAbort then exit; {$IFDEF IDE_VERBOSE} debugln('TMainIDE.DoOpenProjectFile end CodeToolBoss.ConsistencyCheck=',IntToStr(CodeToolBoss.ConsistencyCheck)); {$ENDIF} diff --git a/ideintf/lazideintf.pas b/ideintf/lazideintf.pas index b8224b607e..674e9558b8 100644 --- a/ideintf/lazideintf.pas +++ b/ideintf/lazideintf.pas @@ -115,10 +115,14 @@ type TFindSourceFlags = set of TFindSourceFlag; TModalResultFunction = function(Sender: TObject): TModalResult of object; + TLazProjectChangedFunction = function(Sender: TObject; + AProject: TLazProject): TModalResult of object; TLazarusIDEHandlerType = ( lihtOnSavingAll, // called before IDE saves everything - lihtOnSavedAll // called after IDE saved everything + lihtOnSavedAll, // called after IDE saved everything + lihtOnProjectOpened,// called after IDE opened a project + lihtOnProjectClose // called before IDE closes a project ); { TLazIDEInterface } @@ -140,6 +144,8 @@ type procedure DoCallNotifyHandler(HandlerType: TLazarusIDEHandlerType); function DoCallModalFunctionHandler(HandlerType: TLazarusIDEHandlerType ): TModalResult; + function DoCallProjectChangedHandler(HandlerType: TLazarusIDEHandlerType; + AProject: TLazProject): TModalResult; procedure SetMainBarSubTitle(const AValue: string); virtual; public constructor Create(TheOwner: TComponent); override; @@ -230,6 +236,16 @@ type procedure AddHandlerOnSavedAll(const OnSaveAllEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnSavedAll(const OnSaveAllEvent: TModalResultFunction); + procedure AddHandlerOnProjectOpened( + const OnProjectOpenedEvent: TLazProjectChangedFunction; + AsLast: boolean = false); + procedure RemoveHandlerOnProjectOpened( + const OnProjectOpenedEvent: TLazProjectChangedFunction); + procedure AddHandlerOnProjectClose( + const OnProjectCloseEvent: TLazProjectChangedFunction; + AsLast: boolean = false); + procedure RemoveHandlerOnProjectClose( + const OnProjectCloseEvent: TLazProjectChangedFunction); end; var @@ -280,6 +296,21 @@ begin end; end; +function TLazIDEInterface.DoCallProjectChangedHandler( + HandlerType: TLazarusIDEHandlerType; AProject: TLazProject): TModalResult; +var + i: Integer; + CurResult: TModalResult; +begin + Result:=mrOk; + i:=FLazarusIDEHandlers[HandlerType].Count; + while FLazarusIDEHandlers[HandlerType].NextDownIndex(i) do begin + CurResult:=TLazProjectChangedFunction(FLazarusIDEHandlers[HandlerType][i])(Self,AProject); + if CurResult=mrAbort then exit(mrAbort); + if CurResult<>mrOk then Result:=mrCancel; + end; +end; + constructor TLazIDEInterface.Create(TheOwner: TComponent); begin LazarusIDE:=Self; @@ -335,6 +366,30 @@ begin RemoveHandler(lihtOnSavedAll,TMethod(OnSaveAllEvent)); end; +procedure TLazIDEInterface.AddHandlerOnProjectOpened( + const OnProjectOpenedEvent: TLazProjectChangedFunction; AsLast: boolean); +begin + AddHandler(lihtOnProjectOpened,TMethod(OnProjectOpenedEvent)); +end; + +procedure TLazIDEInterface.RemoveHandlerOnProjectOpened( + const OnProjectOpenedEvent: TLazProjectChangedFunction); +begin + RemoveHandler(lihtOnProjectOpened,TMethod(OnProjectOpenedEvent)); +end; + +procedure TLazIDEInterface.AddHandlerOnProjectClose( + const OnProjectCloseEvent: TLazProjectChangedFunction; AsLast: boolean); +begin + AddHandler(lihtOnProjectClose,TMethod(OnProjectCloseEvent)); +end; + +procedure TLazIDEInterface.RemoveHandlerOnProjectClose( + const OnProjectCloseEvent: TLazProjectChangedFunction); +begin + RemoveHandler(lihtOnProjectClose,TMethod(OnProjectCloseEvent)); +end; + initialization RegisterPropertyEditor(TypeInfo(AnsiString), THTMLBrowserHelpViewer,'BrowserPath',TFileNamePropertyEditor);