lazarus/components/instantsearch/reginstantsearch.pas
2023-01-05 12:49:17 +01:00

220 lines
7.0 KiB
ObjectPascal

unit reginstantsearch;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, idemcindexer, LazIDEIntf, System.UITypes, ProjectIntf;
Type
{ TInstantSearchHandler }
TInstantSearchHandler = class(TObject)
// event handler to rescan FPC directory
Procedure RescanFPCDir(sender : TObject);
// Called when user opens project
function HandleProjectOpen(Sender: TObject; AProject: TLazProject): TModalResult;
// Called when user closes project
function HandleProjectClose(Sender: TObject; AProject: TLazProject): TModalResult;
// Called from project menu
Procedure MarkProjectIndexable(Sender: TObject);
// Called from project menu
Procedure IndexActiveProject(Sender: TObject);
// Called when project inspector popup menu is shown
Procedure OnPrjInspPopup(Sender : TObject);
// Called when project inspector popup menu is shown
Procedure OnMainmenuPopup(Sender : TObject);
// Called when source trees definitions change;
Procedure DoSourceTreesChanged(Sender : TObject);
end;
procedure Register;
implementation
uses
IDEOptionsIntf, LCLType, IDECommands, IDEWindowIntf, MenuIntf, IDEOptEditorIntf,
frmInstantSearch, instantsearchstrings, frainstantsearchoptions, IDEExternToolIntf,
ideinstantsearch;
var
IDEInstantSearchOptionsFrameID: integer = 2000;
InstantSearchHandler : TInstantSearchHandler;
PopupMenuCmdIndex : TIDEMenuCommand;
PopupMenuCmdMarkIndexable : TIDEMenuCommand;
MainMenuCmdIndex : TIDEMenuCommand;
MainMenuCmdMarkIndexable : TIDEMenuCommand;
procedure Register;
var
CmdCatInstantSearch: TIDECommandCategory;
ViewInstantSearchFormCommand: TIDECommand;
CmdIndexProject,
CmdMarkIndexable : TIDECommand;
MenuItemCaption: String;
begin
TInstantSearchForm.OptionsFrameClass:=TIDEInstantSearchOptionsFrame;
IDEInstantSearchManager.CreateDefaultTrees;
IDEInstantSearchManager.Load;
InstantSearchHandler:=TInstantSearchHandler.Create;
LazarusIDE.AddHandlerFPCSrcDirScanned(@InstantSearchHandler.RescanFPCDir,True);
LazarusIDE.AddHandlerOnProjectOpened(@InstantSearchHandler.HandleProjectOpen,True);
LazarusIDE.AddHandlerOnProjectClose(@InstantSearchHandler.HandleProjectClose);
IDEInstantSearchManager.OnSourceTreesChanged:=@InstantSearchHandler.DoSourceTreesChanged;
// LazarusIDE.AddHandlerPr
// register shortcut and menu item
MenuItemCaption:=lrsInstantSearchMenu;
// search shortcut category
CmdCatInstantSearch:=RegisterIDECommandCategory(Nil,'InstantSearch',lrsInstantSearch);
// register shortcut
ViewInstantSearchFormCommand:=RegisterIDECommand(CmdCatInstantSearch,
'ViewInstantSearchForm',
MenuItemCaption,
IDEShortCut(VK_F, [ssCtrl,ssAlt]), // <- set here your default shortcut
CleanIDEShortCut, nil, @ShowInstantSearchForm);
// register menu item in View menu
RegisterIDEMenuCommand(itmViewMainWindows,
'ViewInstantSearchForm',
MenuItemCaption, nil, nil, ViewInstantSearchFormCommand);
// register dockable Window
InstantSearchFormCreator:=IDEWindowCreators.Add(
'InstantSearchForm',
@CreateInstantSearchForm, nil,
'100', '100', '300', '300' // default place at left=100, top=100, right=300, bottom=300
// you can also define percentage values of screen or relative positions, see wiki
);
// add IDE options frame
IDEInstantSearchOptionsFrameID:=RegisterIDEOptionsEditor(GroupEnvironment,TIDEInstantSearchOptionsFrame,
IDEInstantSearchOptionsFrameID)^.Index;
// Commands
CmdMarkIndexable:=RegisterIDECommand(CmdCatInstantSearch ,'InstantSearchMarkIndexable',
lrsMarkProjectIndexable,
IDEShortCut(VK_M, [ssCtrl,ssAlt]), // <- set here your default shortcut
CleanIDEShortCut,
@InstantSearchHandler.MarkProjectIndexable);
CmdIndexProject:=RegisterIDECommand(CmdCatInstantSearch ,'InstantSearchIndex',
lrsIndexProject,
IDEShortCut(VK_I, [ssCtrl,ssAlt]), // <- set here your default shortcut
CleanIDEShortCut,
@InstantSearchhandler.IndexActiveProject);
// Project inspector menu items
PopupMenuCmdMarkIndexable:=RegisterIDEMenuCommand(ProjectInspectorItemsMenuRoot,'InstantSearchMarkIndexable'+'ProjectInspector',
lrsMarkProjectIndexable,
Nil,Nil,CmdMarkIndexable);
PopupMenuCmdIndex:=RegisterIDEMenuCommand(ProjectInspectorItemsMenuRoot,'InstantSearchIndex'+'ProjectInspector',
lrsIndexProject,
Nil,Nil,CmdIndexProject);
// Register handler to update visibility
ProjectInspectorItemsMenuRoot.AddHandlerOnShow(@InstantSearchHandler.OnPrjInspPopup);
// Main project menu items
MainMenuCmdMarkIndexable:=RegisterIDEMenuCommand(mnuProject,'MarkInstantSearchIndexable'+'MainMenu',
lrsMarkProjectIndexable,
Nil,Nil,CmdMarkIndexable);
MainMenuCmdIndex:=RegisterIDEMenuCommand(mnuProject,'InstantSearchIndex'+'MainMenu',
lrsIndexProject,
Nil,Nil,CmdIndexProject);
// Register handler to update visibility
mnuProject.AddHandlerOnShow(@InstantSearchHandler.OnMainMenuPopup);
end;
{ TInstantSearchHandler }
procedure TInstantSearchHandler.RescanFPCDir(sender: TObject);
begin
IDEInstantSearchManager.RescanFPCDir;
end;
function TInstantSearchHandler.HandleProjectOpen(Sender: TObject;
AProject: TLazProject): TModalResult;
Var
aTreeID : String;
begin
Result:=mrOK;
aTreeID:=aProject.CustomSessionData[SInstantSearchID];
if (aTreeID='') then
begin
if IDEInstantSearchManager.IndexProjectStrategy=ipsAll then
aTreeID:=IDEInstantSearchManager.AssignProjectTreeID(aProject)
else
begin
if IDEInstantSearchManager.IndexProjectStrategy=ipsTimed then
IDEInstantSearchManager.StartMarkProjectTimer(aProject);
end;
end;
IDEInstantSearchManager.ProjectTreeName:=aTreeID;
IDEInstantSearchManager.SearchProject:=(aTreeID<>'');
if Assigned(InstantSearchForm) then
InstantSearchForm.ActiveProjectChanged;
end;
function TInstantSearchHandler.HandleProjectClose(Sender: TObject;
AProject: TLazProject): TModalResult;
begin
Result:=mrOK;
IDEInstantSearchManager.ClearMarkProjectTimer;
end;
procedure TInstantSearchHandler.MarkProjectIndexable(Sender: TObject);
begin
IDEInstantSearchManager.MarkProjectIndexed(LazarusIDE.ActiveProject);
end;
procedure TInstantSearchHandler.IndexActiveProject(Sender: TObject);
begin
if assigned(LazarusIDE.ActiveProject) then
IDEInstantSearchManager.IndexProjectFiles(LazarusIDE.ActiveProject);
end;
procedure TInstantSearchHandler.OnPrjInspPopup(Sender: TObject);
var
hasID : Boolean;
begin
HasID:=LazarusIDE.ActiveProject.CustomSessionData[SInstantSearchID] <>'';
PopupMenuCmdMarkIndexable.Visible:=Not HasID;
PopupMenuCmdIndex.Visible:=HasID;
end;
procedure TInstantSearchHandler.OnMainmenuPopup(Sender: TObject);
var
hasID : Boolean;
begin
HasID:=LazarusIDE.ActiveProject.CustomSessionData[SInstantSearchID] <>'';
MainMenuCmdMarkIndexable.Visible:=Not HasID;
MainMenuCmdIndex.Visible:=HasID;
end;
procedure TInstantSearchHandler.DoSourceTreesChanged(Sender: TObject);
begin
if Assigned(InstantSearchForm) then
InstantSearchForm.TreesChanged;
end;
finalization
FreeAndNil(InstantSearchHandler);
end.