{ ***************************************************************************** See the file COPYING.modifiedLGPL.txt, included in this distribution, for details about the license. ***************************************************************************** Author: Mattias Gaertner Abstract: Interface to the general IDE functions. } unit LazIDEIntf; {$mode objfpc}{$H+} interface uses Classes, SysUtils, // LCL Forms, Controls, // LazUtils LazMethodList, AvgLvlTree, // BuildIntf BaseIDEIntf, IDEOptionsIntf, CompOptsIntf, ProjectIntf, IDEExternToolIntf, PackageIntf, // IdeIntf IDEOptEditorIntf, SrcEditorIntf, IDEWindowIntf; type TIDEDirective = ( idedNone, idedBuildCommand, // Filename plus params to build the file // default is '$(CompPath) $(EdFile)' idedBuildWorkingDir,// Working directory for building. Default is the // directory of the file idedBuildScan, // Flags controlling what messages should be scanned for // during building. See TIDEDirBuildScanFlag. idedRunCommand, // Filename plus params to run the file // default is '$NameOnly($(EdFile))' idedRunWorkingDir, // Working directory for building. Default is the // directory of the file idedRunFlags // Flags for run. See TIDEDirRunFlag ); TIDEDirectives = set of TIDEDirective; TIDEDirBuildScanFlag = ( idedbsfNone, idedbsfFPC, // scan for FPC messages. FPC+ means on (default) and FPC- off. idedbsfMake // scan for MAKE messages. MAKE- means on (default) and MAKE- off. ); TIDEDirBuildScanFlags = set of TIDEDirBuildScanFlag; TIDEDirRunFlag = ( idedrfNone, idedrfBuildBeforeRun, // BUILD+ means on (default for non script), BUILD- means off idedrfMessages // show output in Messages window ); TIDEDirRunFlags = set of TIDEDirRunFlag; const IDEDirectiveNames: array[TIDEDirective] of string = ( '', 'BuildCommand', 'BuildWorkingDir', 'BuildScan', 'RunCommand', 'RunWorkingDir', 'RunFlags' ); IDEDirBuildScanFlagNames: array[TIDEDirBuildScanFlag] of string = ( '', 'FPC', 'MAKE' ); IDEDirRunFlagNames: array[TIDEDirRunFlag] of string = ( '', 'BUILD', 'MESSAGES' ); type // open file flags // Normally you don't need to pass any flags. TOpenFlag = ( ofProjectLoading,// this open is part of opening a whole project ofOnlyIfExists, // do not auto create non existing files ofRevert, // reload file if already open, any user changes are lost without question ofQuiet, // less messages ofAddToRecent, // add file to recent files ofRegularFile, // open as regular file (e.g. do not open projects/packages) ofVirtualFile, // open the virtual file ofConvertMacros, // replace macros in filename ofUseCache, // do not update file from disk ofMultiOpen, // set during loading multiple files ofDoNotLoadResource,// do not open form, datamodule, ... (overriding default) ofDoLoadResource,// do open form, datamodule, ... (overriding default) ofLoadHiddenResource,// load component hidden ofAddToProject, // add file to project (if exists) ofInternalFile, // opening data from an internal source (e.g. an editor macro (pascal script) from memory) ofDoNotActivateSourceEditor // do not active the source editor window ); TOpenFlags = set of TOpenFlag; const OpnFlagsPlainFile = [ofOnlyIfExists,ofQuiet,ofRegularFile,ofVirtualFile,ofDoNotLoadResource]; type // new file flags // Normally you don't need to pass any flags. TNewFlag = ( nfIsPartOfProject, // force IsPartOfProject, // default is to use a heuristic nfIsNotPartOfProject,// forbid IsPartOfProject nfOpenInEditor, // open in editor nfSave, // save file instantly nfAddToRecent, // add file to recent files nfQuiet, // less messages nfConvertMacros, // replace macros in filename nfBeautifySrc, // beautify custom source nfCreateDefaultSrc,// create initial source based on the type nfAskForFilename // ask for filename ); TNewFlags = set of TNewFlag; // save file flags // Normally you don't need to pass any flags. TSaveFlag = ( sfSaveAs, sfSaveToTestDir, sfProjectSaving, sfCheckAmbiguousFiles, sfSaveNonProjectFiles, sfDoNotSaveVirtualFiles, sfCanAbort, // show 'Cancel all' button in error messages sfQuietUnitCheck, // don't ask questions when adding unit dependency. sfSkipReferences // dont update references to this file, e.g. uses sections ); TSaveFlags = set of TSaveFlag; // close file flags // Normally you don't need to pass any flags. TCloseFlag = ( cfSaveFirst, // check if modified and save cfQuiet, cfProjectClosing, cfCloseDependencies, cfSaveDependencies // set cfSaveFirst to close the dependencies ); TCloseFlags = set of TCloseFlag; // build project flags // Normally you don't need to pass any flags. TProjectBuildFlag = ( pbfDoNotCompileDependencies, pbfDoNotCompileProject, pbfCompileDependenciesClean, pbfDoNotSaveEditorFiles, pbfSkipLinking, pbfSkipAssembler, pbfSkipTools, pbfCreateMakefile ); TProjectBuildFlags = set of TProjectBuildFlag; // find unit flags // Normally you don't need to pass any flags. TFindUnitFileFlag = ( fuffIgnoreUninstallPackages ); TFindUnitFileFlags = set of TFindUnitFileFlag; // selected part of IDE TTabDisplayState = ( tdsNone, tdsCode, // focussing sourcenotebook or source tab tdsDesign, // focussing designer form/design tab tdsOther // focussing other (user defined) tab assigned to module (like History Tab) ); // find source flags // Normally you don't need to pass any flags. TFindSourceFlag = ( fsfSearchForProject, fsfUseIncludePaths, fsfUseDebugPath, fsfMapTempToVirtualFiles, fsfSkipPackages ); TFindSourceFlags = set of TFindSourceFlag; TFindUnitsOfOwnerFlag = ( fuooListed, // add units listed in lpi/lpk aka project inspector/package editor fuooUsed, // add units used by main source file (depends on current build mode and environment) fuooPackages, // extends fuooListed and fuooUsed by units from used packages fuooSourceEditor // add units in source editor ); TFindUnitsOfOwnerFlags = set of TFindUnitsOfOwnerFlag; TModalResultFunction = function(Sender: TObject): TModalResult of object; TLazProjectChangedFunction = function(Sender: TObject; AProject: TLazProject): TModalResult of object; TModalHandledFunction = function(Sender: TObject; var Handled: boolean ): TModalResult of object; TLazPackageBuildingEvent = function(Package: TIDEPackage): TModalResult of object; TGetFPCFrontEndParams = function(Sender: TObject; var Params: string // these parameters are passed to fpc. // Global options should be prependended, project options should be appended. ): boolean of object; TSaveEditorFileStep = ( sefsSaveAs, // called after user selected a new filename and IDE did some sanity checks sefsBeforeWrite, // called before writing to disk, aFile.Filename=TargetFilename sefsAfterWrite, // called after writing to disk, aFile.Filename=TargetFilename sefsSavedAs // see sefsSaveAs, called after writing and cleaning up, TargetFilename is old filename ); TSaveEditorFileEvent = function(Sender: TObject; aFile: TLazProjectFile; SaveStep: TSaveEditorFileStep; TargetFilename: string): TModalResult of object; TShowDesignerFormOfSourceFunction = procedure(Sender: TObject; AEditor: TSourceEditorInterface; AComponentPaletteClassSelected: Boolean) of object; TGetFPCFrontEndPath = function(Sender: TObject; var Path: string // this path is prepended to fpc. ): boolean of object; TLazarusIDEHandlerType = ( lihtSavingAll, // called before IDE saves everything lihtSavedAll, // called after IDE saved everything lihtSaveEditorFile, // called when IDE saves an editor file to disk lihtSaveAsEditorFile, // called after user selected a new filename for an editor file lihtIDERestoreWindows, // called when IDE is restoring the windows (before opening the first project) lihtIDEClose, // called when IDE is shutting down (after closequery, so no more interactivity) lihtProjectOpening,// called before IDE opens a project lihtProjectOpened,// called after IDE opened a project lihtProjectClose, // called before IDE closes a project lihtProjectBuilding, // called before IDE builds the project lihtProjectDependenciesCompiling, // called before IDE compiles dependencies of project lihtProjectDependenciesCompiled, // called after IDE compiled dependencies of project lihtPackageBuilding, // called before IDE builds a package lihtProjectBuildingFinished, // called after IDE builds the project lihtLazarusBuilding, // called before IDE builds Lazarus IDE lihtLazarusBuildingFinished, // called after IDE builds Lazarus IDE lihtLoadSafeCustomData, // called before saving and after loading CustomData lihtQuickSyntaxCheck, // called when quick syntax check is clicked (menu item or shortcut) lihtGetFPCFrontEndParams, // called when the IDE gets the parameters of the 'fpc' front end tool lihtGetFPCFrontEndPath, // called when the IDE gets the path of the 'fpc' front end tool lihtFPCSrcDirScanned, // called after IDE scanned the FPC source directory lihtShowDesignerFormOfSource, // called after showing a designer form for code editor (AEditor can be nil!) lihtShowSourceOfActiveDesignerForm, // called after showing a code of designer form lihtChangeToolStatus, //called when IDEToolStatus has changed (e.g. itNone->itBuilder etc.) lihtRunDebugInit, // called when Run was clicked, after building, before debugger class is initialized lihtRunDebug, // called when Run was clicked, after building, after debugger class was initialized, before starting the debugger lihtRunWithoutDebugBuilding, // called when Run a project without debugger was clicked, before building lihtRunWithoutDebugInit, // called when Run a project without debugger was clicked, after building lihtRunFinished //called when ran program finishes ); TLazToolStatus = ( itNone, // The default mode. All editing allowed. itExiting, // the ide is shutting down itBuilder, // compiling (the project, a package, IDE itself, an external tool) // Loading/Saving/Debugging is not allowed. itDebugger, // debugging the project. // Loading/Saving/Compiling is not allowed. itCodeTools, // the CodeToolBoss is working and has called the progress event. itCodeToolAborting,// the CodeToolBoss is working and is about to abort itCustom // this state is not used yet. ); TLazToolStatusChangeEvent = procedure(Sender: TObject; OldStatus, NewStatus: TLazToolStatus) of object; { TLazBuildingFinishedEvent = procedure(Sender: TObject; BuildSuccessful: Boolean) of object; TLazLoadSaveCustomDataEvent = procedure(Sender: TObject; Load: boolean; CustomData: TStringToStringTree; // on save this is a temporary clone free for altering PathDelimChanged: boolean ) of object; } { TLazIDEInterface } TLazIDEInterface = class(TComponent) private FToolStatus: TLazToolStatus; FMainBarSubTitle: string; FOpenEditorsOnCodeToolChange: boolean; FOpenMainSourceOnCodeToolChange: boolean; FSaveClosedSourcesOnCodeToolChange: boolean; FCheckFilesOnDiskEnabled: boolean; procedure AddHandler(HandlerType: TLazarusIDEHandlerType; const AMethod: TMethod; AsLast: boolean = false); procedure RemoveHandler(HandlerType: TLazarusIDEHandlerType; const AMethod: TMethod); protected FLazarusIDEHandlers: array[TLazarusIDEHandlerType] of TMethodList; FOwningComponent: TComponent; FIDEStarted: boolean; FIDEIsClosing: Boolean; FLastActivatedWindows: TFPList; // used to find the last form so you can display the correct tab FLastFormActivated: TCustomForm; procedure SetToolStatus(const AToolStatus: TLazToolStatus); virtual; function GetActiveProject: TLazProject; virtual; abstract; function DoCallModalFunctionHandler(HandlerType: TLazarusIDEHandlerType ): TModalResult; function DoCallModalHandledHandler(HandlerType: TLazarusIDEHandlerType; var Handled: boolean): TModalResult; procedure DoCallNotifyHandler(HandlerType: TLazarusIDEHandlerType); overload; procedure DoCallNotifyHandler(HandlerType: TLazarusIDEHandlerType; Sender: TObject); overload; procedure DoCallShowDesignerFormOfSourceHandler(Sender: TObject; AEditor: TSourceEditorInterface; AComponentPaletteClassSelected: Boolean); procedure DoCallBuildingFinishedHandler(HandlerType: TLazarusIDEHandlerType; Sender: TObject; BuildSuccessful: Boolean); procedure SetMainBarSubTitle(const AValue: string); virtual; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; property OwningComponent: TComponent read FOwningComponent; property ToolStatus: TLazToolStatus read FToolStatus write SetToolStatus; // the main window with the IDE menu function GetMainBar: TForm; virtual; abstract; property MainBarSubTitle: string read FMainBarSubTitle write SetMainBarSubTitle; // find file function FindUnitFile(const AFilename: string; TheOwner: TObject = nil; Flags: TFindUnitFileFlags = []): string; virtual; abstract; function FindSourceFile(const AFilename, BaseDirectory: string; Flags: TFindSourceFlags): string; virtual; abstract; // file function DoNewEditorFile(NewFileDescriptor: TProjectFileDescriptor; NewFilename: string; const NewSource: string; NewFlags: TNewFlags): TModalResult; function DoNewFile(NewFileDescriptor: TProjectFileDescriptor; var NewFilename: string; NewSource: string; NewFlags: TNewFlags; NewOwner: TObject): TModalResult; virtual; abstract; function DoSaveEditorFile(AEditor: TSourceEditorInterface; Flags: TSaveFlags): TModalResult; virtual; abstract; function DoSaveEditorFile(const Filename: string; Flags: TSaveFlags): TModalResult; virtual; abstract; function DoSaveAll(Flags: TSaveFlags): TModalResult; virtual; abstract; function DoCloseEditorFile(AEditor: TSourceEditorInterface; Flags: TCloseFlags):TModalResult; virtual; abstract; function DoCloseEditorFile(const Filename: string; Flags: TCloseFlags): TModalResult; virtual; abstract; function DoOpenEditorFile(AFileName:string; PageIndex, WindowIndex: integer; Flags: TOpenFlags): TModalResult; virtual; abstract; function DoOpenFileAndJumpToIdentifier(const AFilename, AnIdentifier: string; PageIndex, WindowIndex: integer; Flags: TOpenFlags): TModalResult; virtual; abstract; function DoOpenFileAndJumpToPos(const AFilename: string; const CursorPosition: TPoint; TopLine: integer; PageIndex, WindowIndex: integer; Flags: TOpenFlags): TModalResult; overload; function DoOpenFileAndJumpToPos(const AFilename: string; const CursorPosition: TPoint; TopLine, BlockTopLine, BlockBottomLine: integer; PageIndex, WindowIndex: integer; Flags: TOpenFlags): TModalResult; virtual; abstract; overload; function DoRevertEditorFile(const Filename: string): TModalResult; virtual; abstract; function DoOpenComponent(const UnitFilename: string; OpenFlags: TOpenFlags; CloseFlags: TCloseFlags; out Component: TComponent): TModalResult; virtual; abstract; procedure DoDropFiles(Sender: TObject; const FileNames: array of String; WindowIndex: integer = -1); virtual; abstract; function DoConfigureBuildFile: TModalResult; virtual; abstract; function DoBuildFile({%H-}ShowAbort: Boolean; Filename: string = '' // if empty use active source editor file ): TModalResult; virtual; abstract; function DoRunFile(Filename: string = '' // if empty use active source editor file ): TModalResult; virtual; abstract; // project property ActiveProject: TLazProject read GetActiveProject; function DoNewProject(ProjectDesc: TProjectDescriptor): TModalResult; virtual; abstract; function DoSaveProject(Flags: TSaveFlags): TModalResult; virtual; abstract; function DoCloseProject: TModalResult; virtual; abstract; function DoOpenProjectFile(AFileName: string; Flags: TOpenFlags): TModalResult; virtual; abstract; function DoPublishProject(Flags: TSaveFlags; ShowDialog: boolean): TModalResult; virtual; abstract; function DoBuildProject(const AReason: TCompileReason; Flags: TProjectBuildFlags; FinalizeResources: boolean = True): TModalResult; virtual; abstract; function DoRunProject: TModalResult; virtual; abstract; function DoRunProjectWithoutDebug: TModalResult; virtual; abstract; function DoRunProjectWithDebug: TModalResult; virtual; abstract; function GetProjectFileForProjectEditor(AEditor: TSourceEditorInterface): TLazProjectFile; virtual; abstract; function DoCallProjectChangedHandler(HandlerType: TLazarusIDEHandlerType; AProject: TLazProject): TModalResult; function DoCallPackageBuildingHandler(APackage: TIDEPackage): TModalResult; function DoCallRunDebugInit(var Handled: boolean): TModalResult; function DoCallRunDebug(var Handled: boolean): TModalResult; function DoCallRunWithoutDebugBuilding(var Handled: boolean): TModalResult; function DoCallRunWithoutDebugInit(var Handled: boolean): TModalResult; procedure DoCallRunFinishedHandler; function DoAddUnitToProject(AEditor: TSourceEditorInterface): TModalResult; virtual; abstract; // project inspector function GetProjectInspectorSelection: TFPList; virtual; abstract; // configs class function GetPrimaryConfigPath: String; virtual; abstract; class function GetSecondaryConfigPath: String; virtual; abstract; procedure CopySecondaryConfigFile(const AFilename: String); virtual; abstract; function DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass = nil; ACaption: String = ''): Boolean; overload; function DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass; ACaption: String; AOptionsFilter: array of TAbstractIDEOptionsClass; ASettings: TIDEOptionsEditorSettings): Boolean; overload; virtual; abstract; // filenames, paths function CreateNewUniqueFilename(const Prefix, Ext: string; NewOwner: TObject; Flags: TSearchIDEFileFlags; TryWithoutNumber: boolean): string; virtual; abstract; function GetTestBuildDirectory: string; virtual; abstract; function GetCompilerFilename: string; virtual; abstract; function GetFPCompilerFilename: string; virtual; abstract; function GetFPCFrontEndOptions: string; virtual; abstract; // codetools function BeginCodeTools: boolean; virtual; abstract; function DoShowCodeToolBossError: TMessageLine; virtual; abstract; procedure DoJumpToCodeToolBossError; virtual; abstract; function NeedSaveSourceEditorChangesToCodeCache(AEditor: TSourceEditorInterface): boolean; virtual; abstract; function SaveSourceEditorChangesToCodeCache(AEditor: TSourceEditorInterface): boolean; virtual; abstract; // true if something was saved function FindUnitsOfOwner(TheOwner: TObject; Flags: TFindUnitsOfOwnerFlags): TStrings; virtual; abstract; property OpenEditorsOnCodeToolChange: boolean read FOpenEditorsOnCodeToolChange write FOpenEditorsOnCodeToolChange; property SaveClosedSourcesOnCodeToolChange: boolean read FSaveClosedSourcesOnCodeToolChange write FSaveClosedSourcesOnCodeToolChange; property OpenMainSourceOnCodeToolChange: boolean read FOpenMainSourceOnCodeToolChange write FOpenMainSourceOnCodeToolChange; // progress and error messages function ShowProgress(const SomeText: string; Step, MaxStep: integer): boolean; virtual; abstract; // False if canceled by user function GetSelectedCompilerMessage: TMessageLine; virtual; abstract; function DoJumpToCompilerMessage(FocusEditor: boolean; Msg: TMessageLine = nil // if nil then it jumps to first message ): boolean; virtual; abstract; procedure DoJumpToNextCompilerMessage(aMinUrgency: TMessageLineUrgency; DirectionDown: boolean); virtual; abstract; procedure DoJumpToNextError(DirectionDown: boolean); procedure DoShowMessagesView(BringToFront: boolean = true); virtual; abstract; function DoCheckFilesOnDisk(Instantaneous: boolean = false): TModalResult; virtual; abstract; // call this after changing TargetOS/TargetCPU of the ActiveProject procedure PrepareBuildTarget(Quiet: boolean; ScanFPCSrc: TScanModeFPCSources = smsfsBackground); virtual; abstract; procedure AbortBuild; virtual; abstract; // search results procedure DoShowSearchResultsView(State: TIWGetFormState = iwgfShowOnTop); virtual; abstract; procedure DoJumpToNextSearchResult(DirectionDown: boolean); virtual; abstract; // designer function GetDesignerForProjectEditor(AEditor: TSourceEditorInterface; LoadForm: boolean): TIDesigner; virtual; abstract; function GetDesignerWithProjectFile(AFile: TLazProjectFile; LoadForm: boolean): TIDesigner; virtual; abstract; function GetProjectFileWithRootComponent(AComponent: TComponent): TLazProjectFile; virtual; abstract; function GetProjectFileWithDesigner(ADesigner: TIDesigner): TLazProjectFile; virtual; abstract; procedure DoShowDesignerFormOfSrc(AEditor: TSourceEditorInterface); virtual; abstract; overload; procedure DoShowMethod(AEditor: TSourceEditorInterface; const AMethodName: String); virtual; abstract; procedure DoShowDesignerFormOfSrc(AEditor: TSourceEditorInterface; out AForm: TCustomForm); virtual; abstract; overload; // events procedure RemoveAllHandlersOfObject(AnObject: TObject); procedure AddHandlerOnSavingAll(const OnSaveAllEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnSavingAll(const OnSaveAllEvent: TModalResultFunction); procedure AddHandlerOnSavedAll(const OnSaveAllEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnSavedAll(const OnSaveAllEvent: TModalResultFunction); procedure AddHandlerOnSaveEditorFile(const OnSaveEditorFile: TSaveEditorFileEvent; AsLast: boolean = false); procedure RemoveHandlerOnSaveEditorFile(const OnSaveEditorFile: TSaveEditorFileEvent); procedure AddHandlerOnIDERestoreWindows(const OnIDERestoreWindowsEvent: TNotifyEvent; AsLast: boolean = false); procedure RemoveHandlerOnIDERestoreWindows( const OnIDERestoreWindowsEvent: TNotifyEvent); procedure AddHandlerOnIDEClose(const OnIDECloseEvent: TNotifyEvent; AsLast: boolean = false); procedure RemoveHandlerOnIDEClose(const OnIDECloseEvent: TNotifyEvent); procedure AddHandlerOnProjectOpening( const OnProjectOpeningEvent: TLazProjectChangedFunction; AsLast: boolean = false); procedure RemoveHandlerOnProjectOpening( const OnProjectOpeningEvent: TLazProjectChangedFunction); 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); procedure AddHandlerOnProjectBuilding( const OnProjBuildingEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnProjectBuilding( const OnProjBuildingEvent: TModalResultFunction); procedure AddHandlerOnProjectBuildingFinished( const OnProjBuildingFinishedEvent: TLazBuildingFinishedEvent; AsLast: boolean = false); procedure RemoveHandlerOnProjectBuildingFinished( const OnProjBuildingFinishedEvent: TLazBuildingFinishedEvent); procedure AddHandlerOnProjectDependenciesCompiling( const OnProjDependenciesCompilingEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnProjectDependenciesCompiling( const OnProjDependenciesCompilingEvent: TModalResultFunction); procedure AddHandlerOnProjectDependenciesCompiled( const OnProjDependenciesCompiledEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnProjectDependenciesCompiled( const OnProjDependenciesCompiledEvent: TModalResultFunction); procedure AddHandlerOnPackageBuilding( const OnPkgBuildingEvent: TLazPackageBuildingEvent; AsLast: boolean = false); procedure RemoveHandlerOnPackageBuilding( const OnPkgBuildingEvent: TLazPackageBuildingEvent); procedure AddHandlerOnLazarusBuilding( const OnLazBuildingEvent: TModalResultFunction; AsLast: boolean = false); procedure RemoveHandlerOnLazarusBuilding( const OnLazBuildingEvent: TModalResultFunction); procedure AddHandlerOnLazarusBuildingFinished( const OnLazBuildingFinishedEvent: TLazBuildingFinishedEvent; AsLast: boolean = false); procedure RemoveHandlerOnLazarusBuildingFinished( const OnLazBuildingFinishedEvent: TLazBuildingFinishedEvent); procedure AddHandlerOnLoadSaveCustomData(const OnLoadSaveEvent: TLazLoadSaveCustomDataEvent; AsLast: boolean = false); procedure RemoveHandlerOnLoadSaveCustomData(const OnLoadSaveEvent: TLazLoadSaveCustomDataEvent; AsLast: boolean = false); procedure AddHandlerOnQuickSyntaxCheck( const OnQuickSyntaxCheckEvent: TModalHandledFunction; AsLast: boolean = false); procedure RemoveHandlerOnQuickSyntaxCheck( const OnQuickSyntaxCheckEvent: TModalHandledFunction); procedure AddHandlerGetFPCFrontEndParams( const Handler: TGetFPCFrontEndParams; AsLast: boolean = false); procedure RemoveHandlerGetFPCFrontEndParams( const Handler: TGetFPCFrontEndParams); function CallHandlerGetFPCFrontEndParams(Sender: TObject; var Params: string): boolean; procedure AddHandlerGetFPCFrontEndPath( const Handler: TGetFPCFrontEndPath; AsLast: boolean = false); procedure RemoveHandlerGetFPCFrontEndPath(const Handler: TGetFPCFrontEndPath); function CallHandlerGetFPCFrontEndPath(Sender: TObject; var Path: string): boolean; procedure AddHandlerFPCSrcDirScanned( const Handler: TNotifyEvent; AsLast: boolean = false); procedure RemoveHandlerGetFPCSrcDirScanned(const Handler: TNotifyEvent); procedure CallHandlerFPCSrcDirScanned(Sender: TObject); procedure AddHandlerOnShowDesignerFormOfSource( const OnShowDesignerFormOfSourceEvent: TShowDesignerFormOfSourceFunction; AsLast: boolean = false); procedure RemoveHandlerOnShowDesignerFormOfSource( const OnShowDesignerFormOfSourceEvent: TShowDesignerFormOfSourceFunction); procedure AddHandlerOnShowSourceOfActiveDesignerForm( const OnShowSourceOfActiveDesignerForm: TNotifyEvent; AsLast: boolean = false); procedure RemoveHandlerOnShowSourceOfActiveDesignerForm( const OnShowSourceOfActiveDesignerForm: TNotifyEvent); procedure AddHandlerOnChangeToolStatus( const OnChangeToolStatus: TLazToolStatusChangeEvent; AsLast: boolean = false); procedure RemoveHandlerOnChangeToolStatus( const OnChangeToolStatus: TLazToolStatusChangeEvent); procedure AddHandlerOnRunDebugInit(const Event: TModalHandledFunction; AsLast: boolean = false); procedure RemoveHandlerOnRunDebugInit(const Event: TModalHandledFunction); procedure AddHandlerOnRunDebug(const Event: TModalHandledFunction; AsLast: boolean = false); procedure RemoveHandlerOnRunDebug(const Event: TModalHandledFunction); procedure AddHandlerOnRunWithoutDebugBuilding(const Event: TModalHandledFunction; AsLast: boolean = false); procedure RemoveHandlerOnRunWithoutDebugBuilding(const Event: TModalHandledFunction); procedure AddHandlerOnRunWithoutDebugInit(const Event: TModalHandledFunction; AsLast: boolean = false); procedure RemoveHandlerOnRunWithoutDebugInit(const Event: TModalHandledFunction); procedure AddHandlerOnRunFinished(const OnRunFinishedEvent: TNotifyEvent; AsLast: boolean = false); procedure RemoveHandlerOnRunFinished(const OnRunFinishedEvent: TNotifyEvent); property IDEStarted: boolean read FIDEStarted; property IDEIsClosing: boolean read FIDEIsClosing; property LastActivatedWindows: TFPList read FLastActivatedWindows; property LastFormActivated: TCustomForm read FLastFormActivated write FLastFormActivated; property CheckFilesOnDiskEnabled: boolean read FCheckFilesOnDiskEnabled write FCheckFilesOnDiskEnabled; end; { TIDETabMaster } TIDETabMaster = class protected function GetTabDisplayState: TTabDisplayState; virtual; abstract; function GetTabDisplayStateEditor(Index: TSourceEditorInterface): TTabDisplayState; virtual; abstract; public procedure BeginUpdate; virtual; abstract; procedure EndUpdate; virtual; abstract; function AutoSizeInShowDesigner(AControl: TControl): Boolean; virtual; abstract; function GetDesigner(ASourceEditor: TSourceEditorInterface; ATabDisplayState: TTabDisplayState): TIDesigner; virtual; procedure ToggleFormUnit; virtual; abstract; procedure JumpToCompilerMessage(ASourceEditor: TSourceEditorInterface); virtual; abstract; procedure ShowCode(ASourceEditor: TSourceEditorInterface); virtual; abstract; procedure ShowDesigner(ASourceEditor: TSourceEditorInterface; AIndex: Integer = 0); virtual; abstract; procedure ShowForm(AForm: TCustomForm); virtual; abstract; public property TabDisplayState: TTabDisplayState read GetTabDisplayState; property TabDisplayStateEditor[Index: TSourceEditorInterface]: TTabDisplayState read GetTabDisplayStateEditor; end; var LazarusIDE: TLazIDEInterface = nil; // will be set by the IDE IDETabMaster: TIDETabMaster = nil; type TLazarusIDEBootHandlerType = ( libhTransferMacrosCreated, // called after IDEMacros were created libhEnvironmentOptionsLoaded // called after IDE loaded environment options ); procedure AddBootHandler(ht: TLazarusIDEBootHandlerType; const OnBoot: TProcedure); implementation type TArrayOfProc = array of TProcedure; var BootHandlers: array[TLazarusIDEBootHandlerType] of TArrayOfProc; procedure AddBootHandler(ht: TLazarusIDEBootHandlerType; const OnBoot: TProcedure); var l: Integer; begin l:=length(BootHandlers[ht]); SetLength(BootHandlers[ht],l+1); BootHandlers[ht][l]:=OnBoot; end; procedure RunBootHandlers(ht: TLazarusIDEBootHandlerType);Public name 'ideintf_LazIDEIntf_RunBootHandlers'; var i: Integer; begin for i:=0 to length(BootHandlers[ht])-1 do BootHandlers[ht][i](); end; { TIDETabMaster } function TIDETabMaster.GetDesigner(ASourceEditor: TSourceEditorInterface; ATabDisplayState: TTabDisplayState): TIDesigner; begin case ATabDisplayState of tdsDesign: Result := ASourceEditor.GetDesigner(True); else Result := nil; end; end; { TLazIDEInterface } procedure TLazIDEInterface.AddHandler(HandlerType: TLazarusIDEHandlerType; const AMethod: TMethod; AsLast: boolean); begin if FLazarusIDEHandlers[HandlerType]=nil then FLazarusIDEHandlers[HandlerType]:=TMethodList.Create; FLazarusIDEHandlers[HandlerType].Add(AMethod,AsLast); end; procedure TLazIDEInterface.RemoveHandler(HandlerType: TLazarusIDEHandlerType; const AMethod: TMethod); begin FLazarusIDEHandlers[HandlerType].Remove(AMethod); end; procedure TLazIDEInterface.SetMainBarSubTitle(const AValue: string); begin if FMainBarSubTitle=AValue then exit; FMainBarSubTitle:=AValue; end; procedure TLazIDEInterface.SetToolStatus(const AToolStatus: TLazToolStatus); var xMethod: TLazToolStatusChangeEvent; I: Integer; OldToolStatus: TLazToolStatus; begin if FToolStatus=aToolStatus then Exit; OldToolStatus:=FToolStatus; FToolStatus:=AToolStatus; for I := 0 to FLazarusIDEHandlers[lihtChangeToolStatus].Count-1 do begin xMethod := TLazToolStatusChangeEvent(FLazarusIDEHandlers[lihtChangeToolStatus][I]); xMethod(Self, OldToolStatus, AToolStatus); end; end; function TLazIDEInterface.DoCallModalFunctionHandler( HandlerType: TLazarusIDEHandlerType): TModalResult; var i: Integer; CurResult: TModalResult; Handler: TMethodList; begin Result:=mrOk; Handler:=FLazarusIDEHandlers[HandlerType]; i:=Handler.Count; while Handler.NextDownIndex(i) do begin CurResult:=TModalResultFunction(Handler[i])(Self); if CurResult=mrAbort then exit(mrAbort); if CurResult<>mrOk then Result:=mrCancel; end; end; function TLazIDEInterface.DoCallProjectChangedHandler( HandlerType: TLazarusIDEHandlerType; AProject: TLazProject): TModalResult; var i: Integer; CurResult: TModalResult; Handler: TMethodList; begin Result:=mrOk; LastActivatedWindows.Clear; // IDE windows may change. Handler:=FLazarusIDEHandlers[HandlerType]; i:=Handler.Count; while Handler.NextDownIndex(i) do begin CurResult:=TLazProjectChangedFunction(Handler[i])(Self,AProject); if CurResult=mrAbort then exit(mrAbort); if CurResult<>mrOk then Result:=mrCancel; end; end; function TLazIDEInterface.DoCallModalHandledHandler( HandlerType: TLazarusIDEHandlerType; var Handled: boolean): TModalResult; var i: longint; Handler: TMethodList; begin Handler:=FLazarusIDEHandlers[HandlerType]; i:=Handler.Count; while Handler.NextDownIndex(i) do begin Handled:=false; Result:=TModalHandledFunction(Handler[i])(Self,Handled); if Handled then exit; end; Result:=mrOk; end; procedure TLazIDEInterface.DoCallNotifyHandler(HandlerType: TLazarusIDEHandlerType); begin FLazarusIDEHandlers[HandlerType].CallNotifyEvents(Self); end; procedure TLazIDEInterface.DoCallNotifyHandler(HandlerType: TLazarusIDEHandlerType; Sender: TObject); begin FLazarusIDEHandlers[HandlerType].CallNotifyEvents(Sender); end; function TLazIDEInterface.DoCallPackageBuildingHandler(APackage: TIDEPackage): TModalResult; var I: Integer; Handler: TLazPackageBuildingEvent; CurResult: TModalResult; begin Result := mrOK; if not Assigned(FLazarusIDEHandlers[lihtPackageBuilding]) then Exit; for I := 0 to FLazarusIDEHandlers[lihtPackageBuilding].Count-1 do begin Handler := TLazPackageBuildingEvent(FLazarusIDEHandlers[lihtPackageBuilding][I]); CurResult := Handler(APackage); if CurResult=mrAbort then Exit(mrAbort); if CurResult<>mrOK then Result := mrCancel; end; end; procedure TLazIDEInterface.DoCallShowDesignerFormOfSourceHandler(Sender: TObject; AEditor: TSourceEditorInterface; AComponentPaletteClassSelected: Boolean); var i: Integer; Handler: TMethodList; begin Handler:=FLazarusIDEHandlers[lihtShowDesignerFormOfSource]; i := Handler.Count; while Handler.NextDownIndex(i) do TShowDesignerFormOfSourceFunction(Handler[i])(Sender, AEditor, AComponentPaletteClassSelected); end; procedure TLazIDEInterface.DoJumpToNextError(DirectionDown: boolean); begin DoJumpToNextCompilerMessage(mluError, DirectionDown); end; constructor TLazIDEInterface.Create(TheOwner: TComponent); begin LazarusIDE:=Self; FCheckFilesOnDiskEnabled:=True; inherited Create(TheOwner); end; destructor TLazIDEInterface.Destroy; var HandlerType: TLazarusIDEHandlerType; begin for HandlerType := Low(TLazarusIDEHandlerType) to High(TLazarusIDEHandlerType) do FreeAndNil(FLazarusIDEHandlers[HandlerType]); inherited Destroy; LazarusIDE:=nil; end; function TLazIDEInterface.DoNewEditorFile( NewFileDescriptor: TProjectFileDescriptor; NewFilename: string; const NewSource: string; NewFlags: TNewFlags): TModalResult; begin Result:=DoNewFile(NewFileDescriptor,NewFilename,NewSource,NewFlags,nil); end; function TLazIDEInterface.DoOpenFileAndJumpToPos(const AFilename: string; const CursorPosition: TPoint; TopLine: integer; PageIndex, WindowIndex: integer; Flags: TOpenFlags): TModalResult; begin Result := DoOpenFileAndJumpToPos(AFilename, CursorPosition, TopLine, TopLine, TopLine, PageIndex, WindowIndex, Flags); end; function TLazIDEInterface.DoOpenIDEOptions(AEditor: TAbstractIDEOptionsEditorClass; ACaption: String): Boolean; begin Result := DoOpenIDEOptions(AEditor, ACaption, [], []); end; procedure TLazIDEInterface.DoCallBuildingFinishedHandler( HandlerType: TLazarusIDEHandlerType; Sender: TObject; BuildSuccessful: Boolean); var I: Integer; xMethod: TLazBuildingFinishedEvent; begin for I := 0 to FLazarusIDEHandlers[HandlerType].Count-1 do begin xMethod := TLazBuildingFinishedEvent(FLazarusIDEHandlers[HandlerType][I]); xMethod(Sender, BuildSuccessful); end; end; function TLazIDEInterface.DoCallRunDebugInit(var Handled: boolean ): TModalResult; begin Result:=DoCallModalHandledHandler(lihtRunDebugInit,Handled); end; function TLazIDEInterface.DoCallRunDebug(var Handled: boolean): TModalResult; begin Result:=DoCallModalHandledHandler(lihtRunDebug,Handled); end; function TLazIDEInterface.DoCallRunWithoutDebugBuilding(var Handled: boolean ): TModalResult; begin Result:=DoCallModalHandledHandler(lihtRunWithoutDebugBuilding,Handled); end; function TLazIDEInterface.DoCallRunWithoutDebugInit(var Handled: boolean ): TModalResult; begin Result:=DoCallModalHandledHandler(lihtRunWithoutDebugInit,Handled); end; procedure TLazIDEInterface.DoCallRunFinishedHandler; begin DoCallNotifyHandler(lihtRunFinished); end; procedure TLazIDEInterface.RemoveAllHandlersOfObject(AnObject: TObject); var HandlerType: TLazarusIDEHandlerType; begin for HandlerType:=Low(HandlerType) to High(HandlerType) do FLazarusIDEHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); end; procedure TLazIDEInterface.AddHandlerOnSavingAll( const OnSaveAllEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtSavingAll,TMethod(OnSaveAllEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnSavingAll( const OnSaveAllEvent: TModalResultFunction); begin RemoveHandler(lihtSavingAll,TMethod(OnSaveAllEvent)); end; procedure TLazIDEInterface.AddHandlerOnSavedAll( const OnSaveAllEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtSavedAll,TMethod(OnSaveAllEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnSavedAll( const OnSaveAllEvent: TModalResultFunction); begin RemoveHandler(lihtSavedAll,TMethod(OnSaveAllEvent)); end; procedure TLazIDEInterface.AddHandlerOnSaveEditorFile( const OnSaveEditorFile: TSaveEditorFileEvent; AsLast: boolean); begin AddHandler(lihtSaveEditorFile,TMethod(OnSaveEditorFile),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnSaveEditorFile( const OnSaveEditorFile: TSaveEditorFileEvent); begin RemoveHandler(lihtSaveEditorFile,TMethod(OnSaveEditorFile)); end; procedure TLazIDEInterface.AddHandlerOnIDERestoreWindows( const OnIDERestoreWindowsEvent: TNotifyEvent; AsLast: boolean); begin AddHandler(lihtIDERestoreWindows,TMethod(OnIDERestoreWindowsEvent),AsLast); end; procedure TLazIDEInterface.AddHandlerOnLazarusBuilding( const OnLazBuildingEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtLazarusBuilding,TMethod(OnLazBuildingEvent), AsLast); end; procedure TLazIDEInterface.AddHandlerOnLazarusBuildingFinished( const OnLazBuildingFinishedEvent: TLazBuildingFinishedEvent; AsLast: boolean); begin AddHandler(lihtLazarusBuildingFinished,TMethod(OnLazBuildingFinishedEvent), AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnIDERestoreWindows( const OnIDERestoreWindowsEvent: TNotifyEvent); begin RemoveHandler(lihtIDERestoreWindows,TMethod(OnIDERestoreWindowsEvent)); end; procedure TLazIDEInterface.RemoveHandlerOnLazarusBuilding( const OnLazBuildingEvent: TModalResultFunction); begin RemoveHandler(lihtLazarusBuilding,TMethod(OnLazBuildingEvent)); end; procedure TLazIDEInterface.RemoveHandlerOnLazarusBuildingFinished( const OnLazBuildingFinishedEvent: TLazBuildingFinishedEvent); begin RemoveHandler(lihtLazarusBuildingFinished,TMethod(OnLazBuildingFinishedEvent)); end; procedure TLazIDEInterface.AddHandlerOnLoadSaveCustomData( const OnLoadSaveEvent: TLazLoadSaveCustomDataEvent; AsLast: boolean); begin AddHandler(lihtLoadSafeCustomData,TMethod(OnLoadSaveEvent),AsLast); end; procedure TLazIDEInterface.AddHandlerOnPackageBuilding(const OnPkgBuildingEvent: TLazPackageBuildingEvent; AsLast: boolean); begin AddHandler(lihtPackageBuilding, TMethod(OnPkgBuildingEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnLoadSaveCustomData( const OnLoadSaveEvent: TLazLoadSaveCustomDataEvent; AsLast: boolean); begin RemoveHandler(lihtLoadSafeCustomData,TMethod(OnLoadSaveEvent)); end; procedure TLazIDEInterface.RemoveHandlerOnPackageBuilding(const OnPkgBuildingEvent: TLazPackageBuildingEvent); begin RemoveHandler(lihtPackageBuilding, TMethod(OnPkgBuildingEvent)); end; procedure TLazIDEInterface.AddHandlerOnIDEClose( const OnIDECloseEvent: TNotifyEvent; AsLast: boolean); begin AddHandler(lihtIDEClose,TMethod(OnIDECloseEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnIDEClose( const OnIDECloseEvent: TNotifyEvent); begin RemoveHandler(lihtIDEClose,TMethod(OnIDECloseEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectOpening( const OnProjectOpeningEvent: TLazProjectChangedFunction; AsLast: boolean); begin AddHandler(lihtProjectOpening,TMethod(OnProjectOpeningEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectOpening( const OnProjectOpeningEvent: TLazProjectChangedFunction); begin RemoveHandler(lihtProjectOpening,TMethod(OnProjectOpeningEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectOpened( const OnProjectOpenedEvent: TLazProjectChangedFunction; AsLast: boolean); begin AddHandler(lihtProjectOpened,TMethod(OnProjectOpenedEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectOpened( const OnProjectOpenedEvent: TLazProjectChangedFunction); begin RemoveHandler(lihtProjectOpened,TMethod(OnProjectOpenedEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectClose( const OnProjectCloseEvent: TLazProjectChangedFunction; AsLast: boolean); begin AddHandler(lihtProjectClose,TMethod(OnProjectCloseEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectClose( const OnProjectCloseEvent: TLazProjectChangedFunction); begin RemoveHandler(lihtProjectClose,TMethod(OnProjectCloseEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectBuilding( const OnProjBuildingEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtProjectBuilding,TMethod(OnProjBuildingEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectBuilding( const OnProjBuildingEvent: TModalResultFunction); begin RemoveHandler(lihtProjectBuilding,TMethod(OnProjBuildingEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectDependenciesCompiling( const OnProjDependenciesCompilingEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtProjectDependenciesCompiling, TMethod(OnProjDependenciesCompilingEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectDependenciesCompiling( const OnProjDependenciesCompilingEvent: TModalResultFunction); begin RemoveHandler(lihtProjectDependenciesCompiling, TMethod(OnProjDependenciesCompilingEvent)); end; procedure TLazIDEInterface.AddHandlerOnProjectDependenciesCompiled( const OnProjDependenciesCompiledEvent: TModalResultFunction; AsLast: boolean); begin AddHandler(lihtProjectDependenciesCompiled, TMethod(OnProjDependenciesCompiledEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnProjectDependenciesCompiled( const OnProjDependenciesCompiledEvent: TModalResultFunction); begin RemoveHandler(lihtProjectDependenciesCompiled, TMethod(OnProjDependenciesCompiledEvent)); end; procedure TLazIDEInterface.AddHandlerOnQuickSyntaxCheck( const OnQuickSyntaxCheckEvent: TModalHandledFunction; AsLast: boolean); begin AddHandler(lihtQuickSyntaxCheck,TMethod(OnQuickSyntaxCheckEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnQuickSyntaxCheck( const OnQuickSyntaxCheckEvent: TModalHandledFunction); begin RemoveHandler(lihtQuickSyntaxCheck,TMethod(OnQuickSyntaxCheckEvent)); end; procedure TLazIDEInterface.AddHandlerGetFPCFrontEndParams( const Handler: TGetFPCFrontEndParams; AsLast: boolean); begin AddHandler(lihtGetFPCFrontEndParams,TMethod(Handler),AsLast); end; procedure TLazIDEInterface.RemoveHandlerGetFPCFrontEndParams( const Handler: TGetFPCFrontEndParams); begin RemoveHandler(lihtGetFPCFrontEndParams,TMethod(Handler)); end; function TLazIDEInterface.CallHandlerGetFPCFrontEndParams(Sender: TObject; var Params: string): boolean; var i: longint; begin i:=FLazarusIDEHandlers[lihtGetFPCFrontEndParams].Count; while FLazarusIDEHandlers[lihtGetFPCFrontEndParams].NextDownIndex(i) do begin if not TGetFPCFrontEndParams(FLazarusIDEHandlers[lihtGetFPCFrontEndParams][i])(Self,Params) then exit(false); end; Result:=true; end; procedure TLazIDEInterface.AddHandlerGetFPCFrontEndPath( const Handler: TGetFPCFrontEndPath; AsLast: boolean); begin AddHandler(lihtGetFPCFrontEndPath,TMethod(Handler),AsLast); end; procedure TLazIDEInterface.AddHandlerOnProjectBuildingFinished( const OnProjBuildingFinishedEvent: TLazBuildingFinishedEvent; AsLast: boolean); begin AddHandler(lihtProjectBuildingFinished,TMethod(OnProjBuildingFinishedEvent),AsLast); end; procedure TLazIDEInterface.AddHandlerOnChangeToolStatus( const OnChangeToolStatus: TLazToolStatusChangeEvent; AsLast: boolean); begin AddHandler(lihtChangeToolStatus,TMethod(OnChangeToolStatus),AsLast); end; procedure TLazIDEInterface.RemoveHandlerGetFPCFrontEndPath( const Handler: TGetFPCFrontEndPath); begin RemoveHandler(lihtGetFPCFrontEndPath,TMethod(Handler)); end; procedure TLazIDEInterface.RemoveHandlerOnProjectBuildingFinished( const OnProjBuildingFinishedEvent: TLazBuildingFinishedEvent); begin RemoveHandler(lihtProjectBuildingFinished,TMethod(OnProjBuildingFinishedEvent)); end; procedure TLazIDEInterface.RemoveHandlerOnChangeToolStatus( const OnChangeToolStatus: TLazToolStatusChangeEvent); begin RemoveHandler(lihtChangeToolStatus,TMethod(OnChangeToolStatus)); end; procedure TLazIDEInterface.AddHandlerOnRunDebugInit( const Event: TModalHandledFunction; AsLast: boolean); begin AddHandler(lihtRunDebugInit,TMethod(Event),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnRunDebugInit( const Event: TModalHandledFunction); begin RemoveHandler(lihtRunDebugInit,TMethod(Event)); end; procedure TLazIDEInterface.AddHandlerOnRunDebug( const Event: TModalHandledFunction; AsLast: boolean); begin AddHandler(lihtRunDebug,TMethod(Event),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnRunDebug( const Event: TModalHandledFunction); begin RemoveHandler(lihtRunDebug,TMethod(Event)); end; procedure TLazIDEInterface.AddHandlerOnRunWithoutDebugBuilding( const Event: TModalHandledFunction; AsLast: boolean); begin AddHandler(lihtRunWithoutDebugBuilding,TMethod(Event),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnRunWithoutDebugBuilding( const Event: TModalHandledFunction); begin RemoveHandler(lihtRunWithoutDebugBuilding,TMethod(Event)); end; procedure TLazIDEInterface.AddHandlerOnRunWithoutDebugInit( const Event: TModalHandledFunction; AsLast: boolean); begin AddHandler(lihtRunWithoutDebugInit,TMethod(Event),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnRunWithoutDebugInit( const Event: TModalHandledFunction); begin RemoveHandler(lihtRunWithoutDebugInit,TMethod(Event)); end; procedure TLazIDEInterface.AddHandlerOnRunFinished( const OnRunFinishedEvent: TNotifyEvent; AsLast: boolean); begin AddHandler(lihtRunFinished,TMethod(OnRunFinishedEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnRunFinished( const OnRunFinishedEvent: TNotifyEvent); begin RemoveHandler(lihtRunFinished,TMethod(OnRunFinishedEvent)); end; function TLazIDEInterface.CallHandlerGetFPCFrontEndPath(Sender: TObject; var Path: string): boolean; var i: longint; begin i:=FLazarusIDEHandlers[lihtGetFPCFrontEndPath].Count; while FLazarusIDEHandlers[lihtGetFPCFrontEndPath].NextDownIndex(i) do begin if not TGetFPCFrontEndPath(FLazarusIDEHandlers[lihtGetFPCFrontEndPath][i])(Self,Path) then exit(false); end; Result:=true; end; procedure TLazIDEInterface.AddHandlerFPCSrcDirScanned( const Handler: TNotifyEvent; AsLast: boolean); begin AddHandler(lihtFPCSrcDirScanned,TMethod(Handler),AsLast); end; procedure TLazIDEInterface.RemoveHandlerGetFPCSrcDirScanned( const Handler: TNotifyEvent); begin RemoveHandler(lihtFPCSrcDirScanned,TMethod(Handler)); end; procedure TLazIDEInterface.CallHandlerFPCSrcDirScanned(Sender: TObject); begin FLazarusIDEHandlers[lihtFPCSrcDirScanned].CallNotifyEvents(Sender); end; procedure TLazIDEInterface.AddHandlerOnShowDesignerFormOfSource( const OnShowDesignerFormOfSourceEvent: TShowDesignerFormOfSourceFunction; AsLast: boolean); begin AddHandler(lihtShowDesignerFormOfSource,TMethod(OnShowDesignerFormOfSourceEvent),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnShowDesignerFormOfSource( const OnShowDesignerFormOfSourceEvent: TShowDesignerFormOfSourceFunction); begin RemoveHandler(lihtShowDesignerFormOfSource,TMethod(OnShowDesignerFormOfSourceEvent)); end; procedure TLazIDEInterface.AddHandlerOnShowSourceOfActiveDesignerForm( const OnShowSourceOfActiveDesignerForm: TNotifyEvent; AsLast: boolean); begin AddHandler(lihtShowSourceOfActiveDesignerForm,TMethod(OnShowSourceOfActiveDesignerForm),AsLast); end; procedure TLazIDEInterface.RemoveHandlerOnShowSourceOfActiveDesignerForm( const OnShowSourceOfActiveDesignerForm: TNotifyEvent); begin RemoveHandler(lihtShowSourceOfActiveDesignerForm,TMethod(OnShowSourceOfActiveDesignerForm)); end; end.