unit UnitPlugins; interface uses SysUtils, Classes, Windows, Messages, Forms, ComCtrls; type TCodeSnippetClick = function (pTitle, pCategory: PChar; pCode: PChar): Integer; cdecl; TFileAction = function (pFilename: PChar): Integer; cdecl; TDocChange = function (pIndex: Integer; pFilename: PChar; pHighlighter: PChar; pRestoreCaret: Boolean): Integer; cdecl; TProjectsChange = function (pOldIndex, pNewIndex: Integer): Integer; cdecl; TCreateNewFile = function (Item: Byte): Integer; cdecl; TDisplaySearch = function (pSearchList: PChar; pSelected: PChar): Integer; cdecl; TSearch = function (pExpression, pSearchList: PChar; pCaseSensivity, pWholeWords, pSearchFromCaret, pSelectedOnly, pRegEx, pForward: Boolean): Integer; cdecl; TSearchReplace = function (pExpression, pReplace, pExpList, pRepList: PChar; pCaseSensivity, pWholeWords, pSearchFromCaret, pSelectedOnly, pRegEx, pForward: Boolean): Integer; cdecl; TVisibleControlChange = function (pControl: Integer; pShow: Boolean): Integer; cdecl; TCompile = function (pCompileType: Integer; Lang, Filename: PChar): Integer; cdecl; TShowHelp = function (pHelpType: Integer): Integer; cdecl; TCustomItemClick = function (pCaption: PChar): Integer; cdecl; TThemeChanged = function (pTheme: PChar): Integer; cdecl; TModified = function (pModifiedText: PChar): Integer; cdecl; TKeyPress = function (pKey: PChar): Integer; cdecl; TEditorClick = function: Integer; cdecl; TUpdateSel = function (pSelStart, pSelLength, pFirstVisibleLine: Integer): Integer; cdecl; TCallTipShow = function (pList: PChar): Integer; cdecl; TCallTipClick = function (pPosition: Integer): Integer; cdecl; TAutoCompleteShow = function (pList: PChar): Integer; cdecl; TAutoCompleteSelect = function (pText: PChar): Integer; cdecl; TAppMsg = function (pHwnd: HWND; pMessage: Integer; pWParam, pLParam: Integer; pTime: Integer; pPt: TPoint): Integer; cdecl; TUpdateCodeTools = function (pLang, pFilename, pCurrProjects: PChar): Integer; cdecl; TOutputEvent = function (pItemIndex: Integer): Integer; cdecl; type TIntegerArray = array of Integer; type TLoadInfo = record { Plugin values } sPluginName: PChar; sPluginDescription: PChar; { Form Handles } hAllFilesForm: HWND; hAutoIndent: HWND; hClose: HWND; hConnGen: HWND; hGoToLine: HWND; hHTMLPreview: HWND; hHudMsgGenerator: HWND; hInfo: HWND; hIRCPaster: HWND; hMainForm: HWND; hMenuGenerator: HWND; hMOTDGen: HWND; hPluginsIniEditor: HWND; hReplace: HWND; hSearch: HWND; hSelectColor: HWND; hSettings: HWND; hSocketsTerminal: HWND; hSplashscreen: HWND; { Important Control Handles } hOutput: HWND; hCodeExplorer: HWND; hCodeInspector: HWND; // even if it won't be useful hNotes: HWND; { Other } pApplication: Pointer; // this is only useful for Delphi developers end; type PLoadInfo = ^TLoadInfo; TLoadPlugin = procedure (LoadInfo: PLoadInfo); cdecl; TUnloadPlugin = procedure; cdecl; function SendStudioMsg(eMessage: Integer; eData: String; eIntData: Integer): Integer; function LoadPlugin(ListItem: TListItem): Boolean; procedure UnloadPlugin(ListItem: TListItem); function Plugin_CodeSnippetClick(Title, Category: String; Code: String): Boolean; function Plugin_FileLoad(Filename: String; Loading: Boolean): Boolean; function Plugin_FileSave(Filename: String; Saving: Boolean): Boolean; function Plugin_DocChange(Index: Integer; Filename, Highlighter: String; RestoreCaret, Changing: Boolean): Boolean; function Plugin_ProjectsChange(OldIndex, NewIndex: Integer; Changing: Boolean): Boolean; function Plugin_CreateNewFile(Item: Byte; Creating: Boolean): Boolean; function Plugin_Search(SearchList, Selected: String; Displaying, SearchAgain: Boolean; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; function Plugin_SearchReplace(Expression, Replace, ExpList, RepList: String; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; function Plugin_VisibleControlChange(Control: Integer; Show: Boolean): Boolean; function Plugin_Compile(CompileType: Integer; Lang, Filename: String; Compiling: Boolean): Boolean; function Plugin_ShowHelp(HelpType: Integer): Boolean; function Plugin_CustomItemClick(Caption: String): Boolean; function Plugin_ThemeChange(Theme: String): Boolean; function Plugin_Modified(ModifiedStr: PAnsiChar): Boolean; function Plugin_KeyPress(Key: Char): Boolean; function Plugin_EditorClick(DoubleClick: Boolean): Boolean; function Plugin_UpdateSel(SelStart, SelLength, FirstVisibleLine: Integer): Boolean; function Plugin_CallTipShow(List: PChar): Boolean; function Plugin_CallTipClick(Position: Integer): Boolean; function Plugin_AutoCompleteShow(List: PChar): Boolean; function Plugin_AutoCompleteSelect(Text: PChar): Boolean; function Plugin_AppMsg(hwnd: HWND; Message: Integer; wParam, lParam: Integer; time: Integer; pt: TPoint): Boolean; function Plugin_UpdateCodeExplorer(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; function Plugin_UpdateCodeInspector(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; function Plugin_OutputDblClick(ItemIndex: Integer): Boolean; function Plugin_OutputPopup(ItemIndex: Integer): Boolean; const { Return values for dlls } PLUGIN_CONTINUE = 0; // continue... PLUGIN_STOP = 1; // stop calling funcs and don't handle the command PLUGIN_HANDLED = 2; // don't handle the command { Compile values } COMP_DEFAULT = 0; COMP_STARTHL = 1; COMP_UPLOAD = 2; { Help values } HELP_DEFAULT = 0; HELP_SEARCH = 1; HELP_FORUMS = 2; HELP_ABOUT = 3; { Controls for visible state } CTRL_OUTPUT = 0; // Output list CTRL_CODETOOLS_MAIN = 1; // Code-Tools window CTRL_CODETOOLS_ITEM = 2; // Code-Tools tab CTRL_NOTES = 3; // Notes tab { Languages } NEW_PAWN_PLUGIN = 0; NEW_PAWN_EMPTYPLUGIN = 1; NEW_PAWN_HEADER = 2; NEW_CPP_MODULE = 3; NEW_CPP_UNIT = 4; NEW_CPP_HEADER = 5; NEW_OTHER_TEXTFILE = 6; NEW_OTHER_HTML = 7; NEW_OTHER_SQL = 8; NEW_OTHER_XML = 9; const SCM_SHOWPROGRESS = WM_USER + $100; SCM_HIDEPROGRESS = WM_USER + $101; SCM_UPDATEPROGRESS = WM_USER + $102; SCM_LOADCODESNIPPETS = WM_USER + $103; SCM_CODESNIPPETCLICK = WM_USER + $104; SCM_MIRC_CMD = WM_USER + $105; SCM_RELOADINI = WM_USER + $106; SCM_SELECTLANGUAGE = WM_USER + $107; SCM_LOADFILE = WM_USER + $108; SCM_CURRPROJECTS = WM_USER + $109; SCM_COMPILE = WM_USER + $110; SCM_COMPILE_UPLOAD = WM_USER + $111; SCM_COMPILE_STARTHL = WM_USER + $112; SCM_MENU_LOADIMAGE = WM_USER + $113; SCM_MENU_ADDITEM = WM_USER + $114; SCM_MENU_ADDSUBITEM = WM_USER + $115; SCM_MENU_FAKECLICK = WM_USER + $116; SCM_MENU_SHOWITEM = WM_USER + $117; SCM_MENU_HIDEITEM = WM_USER + $118; SCM_PLUGIN_LOAD = WM_USER + $119; SCM_PLUGIN_UNLOAD = WM_USER + $120; SCM_SETTINGS_CREATEPAGE = WM_USER + $121; SCM_CODEINSPECTOR_CLEAR = WM_USER + $122; SCM_CODEINSPECTOR_ADD = WM_USER + $123; SCM_CODEINSPECTOR_ADDCOMBO = WM_USER + $124; SCM_CODEINSPECTOR_SETVALUE = WM_USER + $125; SCM_CODEINSPECTOR_SETNAME = WM_USER + $126; SCM_CODEINSPECTOR_GETVALUE = WM_USER + $127; SCM_CODEINSPECTOR_GETNAME = WM_USER + $128; SCM_CODEINSPECTOR_COUNT = WM_USER + $129; SCM_CODEINSPECTOR_BEGINUPDATE = WM_USER + $130; SCM_CODEINSPECTOR_ENDUPDATE = WM_USER + $131; SCM_CODEINSPECTOR_DELETE = WM_USER + $132; SCM_PAWN_NEWFILE = WM_USER + $133; SCM_PAWN_SAVEFILE = WM_USER + $134; SCM_PAWN_CLOSEFILE = WM_USER + $135; SCM_PAWN_ISUNTITLED = WM_USER + $136; SCM_PAWN_ACTIVATE = WM_USER + $137; SCM_PAWN_ACTIVATEDOC = WM_USER + $138; SCM_PAWN_GETNOTES = WM_USER + $139; SCM_PAWN_SETNOTES = WM_USER + $140; SCM_PAWN_GETFILENAME = WM_USER + $141; SCM_PAWN_SETFILENAME = WM_USER + $142; SCM_PAWN_GETTEXT = WM_USER + $143; SCM_PAWN_SETTEXT = WM_USER + $144; SCM_CPP_NEWFILE = WM_USER + $145; SCM_CPP_SAVEFILE = WM_USER + $146; SCM_CPP_CLOSEFILE = WM_USER + $147; SCM_CPP_ISUNTITLED = WM_USER + $148; SCM_CPP_ACTIVATE = WM_USER + $149; SCM_CPP_ACTIVATEDOC = WM_USER + $150; SCM_CPP_ACTIVATEIDE = WM_USER + $151; SCM_CPP_GETNOTES = WM_USER + $152; SCM_CPP_SETNOTES = WM_USER + $153; SCM_CPP_GETFILENAME = WM_USER + $154; SCM_CPP_SETFILENAME = WM_USER + $155; SCM_CPP_GETTEXT = WM_USER + $156; SCM_CPP_SETTEXT = WM_USER + $157; SCM_OTHER_NEWFILE = WM_USER + $158; SCM_OTHER_SAVEFILE = WM_USER + $159; SCM_OTHER_CLOSEFILE = WM_USER + $160; SCM_OTHER_ISUNTITLED = WM_USER + $161; SCM_OTHER_ACTIVATE = WM_USER + $162; SCM_OTHER_ACTIVATEDOC = WM_USER + $163; SCM_OTHER_GETNOTES = WM_USER + $164; SCM_OTHER_SETNOTES = WM_USER + $165; SCM_OTHER_GETFILENAME = WM_USER + $166; SCM_OTHER_SETFILENAME = WM_USER + $167; SCM_OTHER_GETTEXT = WM_USER + $168; SCM_OTHER_SETTEXT = WM_USER + $169; SCM_OUTPUT_SHOW = WM_USER + $170; SCM_OUTPUT_HIDE = WM_USER + $171; SCM_OUTPUT_ADD = WM_USER + $172; SCM_OUTPUT_CLEAR = WM_USER + $173; SCM_OUTPUT_DELETE = WM_USER + $174; SCM_OUTPUT_GETTEXT = WM_USER + $175; SCM_OUTPUT_GETITEM = WM_USER + $176; SCM_OUTPUT_INDEXOF = WM_USER + $177; SCM_ACTIVE_DOCUMENT = WM_USER + $178; SCM_ACTIVE_PROJECTS = WM_USER + $179; SCM_EDITOR_SETTEXT = WM_USER + $180; SCM_EDITOR_GETTEXT = WM_USER + $181; SCM_EDTIOR_SETCALLTIPS = WM_USER + $182; SCM_EDITOR_SHOWCALLTIP = WM_USER + $183; SCM_EDITOR_SETAUTOCOMPLETE = WM_USER + $184; SCM_EDITOR_SHOWAUTOCOMPLETE = WM_USER + $185; SCM_EDITOR_GETSELSTART = WM_USER + $186; SCM_EDTIOR_GETSELLENGTH = WM_USER + $187; SCM_EDITOR_SETSELSTART = WM_USER + $188; SCM_EDITOR_SETSELLENGH = WM_USER + $189; SCM_REMOVE_MENUITEM = WM_USER + $190; SCM_REMOVE_IMAGE = WM_USER + $191; SCM_SETTHEME = WM_USER + $192; SCM_GETTHEME = WM_USER + $193; implementation uses UnitfrmSettings, UnitMainTools, UnitfrmAllFilesForm, UnitfrmAutoIndent, UnitfrmClose, UnitfrmConnGen, UnitfrmGoToLine, UnitfrmHTMLPreview, UnitfrmHudMsgGenerator, UnitfrmInfo, UnitfrmMain, UnitfrmMenuGenerator, UnitfrmMOTDGen, UnitfrmPluginsIniEditor, UnitfrmReplace, UnitfrmSearch, UnitfrmSelectColor, UnitfrmSocketsTerminal, UnitfrmSplashscreen, UnitLanguages, UnitCodeExplorerUpdater, UnitCodeInspector, UnitCodeSnippets, UnitCodeUtils, UnitCompile, UnitfrmIRCPaster, UnitMenuGenerators, UnitReadThread, UnitTextAnalyze; function LoadPlugin(ListItem: TListItem): Boolean; var eLoadInfo: TLoadInfo; LoadInfo: PLoadInfo; eHandle: Cardinal; eFunc, eFunc2: TLoadPlugin; begin Result := False; with eLoadInfo do begin sPluginName := 'Untitled'; sPluginDescription := 'No description'; { Handles } hAllFilesForm := frmAllFilesForm.Handle; hAutoIndent := frmAutoIndent.Handle; hClose := frmClose.Handle; hConnGen := frmConnGen.Handle; hGoToLine := frmGoToLine.Handle; hHTMLPreview := frmHTMLPreview.Handle; hHudMsgGenerator := frmHudMsgGenerator.Handle; hInfo := frmInfo.Handle; hIRCPaster := frmIRCPaster.Handle; hMainForm := frmMain.Handle; hMenuGenerator := frmMenuGenerator.Handle; hMOTDGen := frmMOTDGen.Handle; hPluginsIniEditor := frmPluginsIniEditor.Handle; hReplace := frmReplace.Handle; hSearch := frmSearch.Handle; hSelectColor := frmSelectColor.Handle; hSettings := frmSettings.Handle; hSocketsTerminal := frmSocketsTerminal.Handle; hSplashscreen := frmSplashscreen.Handle; { Important Control Handles } hOutput := frmMain.lstOutput.Handle; hCodeExplorer := frmMain.trvExplorer.Handle; hCodeInspector := frmMain.jviCode.Handle; // even if it won't be useful hNotes := frmMain.rtfNotes.Handle; { Other } pApplication := @Application; // this is only useful for Delphi developers end; eHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])); if eHandle = 0 then exit; @eFunc := GetProcAddress(eHandle, 'PluginLoad'); @eFunc2 := GetProcAddress(eHandle, 'PluginUnload'); if @eFunc2 <> nil then begin if @eFunc <> nil then begin try LoadInfo := @eLoadInfo; eFunc(LoadInfo); ListItem.Data := Pointer(eHandle); ListItem.Caption := eLoadInfo.sPluginName; ListItem.SubItems[1] := eLoadInfo.sPluginDescription; ListItem.SubItems[2] := 'Loaded'; except on E: Exception do Application.MessageBox(PChar(E.Message), PChar(Application.Title), MB_ICONERROR); end; end else MessageBox(Application.Handle, PChar('Error loading plugin:' + #13 + 'PluginLoad function not found.'), PChar(ExtractFileName(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])), MB_ICONERROR); end else MessageBox(Application.Handle, PChar('Error loading plugin:' + #13 + 'PluginUnload function not found.'), PChar(ExtractFileName(ExtractFilePath(ParamStr(0)) + 'plugins\' + ListItem.SubItems[0])), MB_ICONERROR); end; procedure UnloadPlugin(ListItem: TListItem); var eFunc: TUnloadPlugin; begin @eFunc := GetProcAddress(Cardinal(ListItem.Data), 'PluginUnload'); if @eFunc <> nil then eFunc; FreeLibrary(Cardinal(ListItem.Data)); ListItem.Data := nil; ListItem.Caption := '-'; ListItem.SubItems[1] := '-'; ListItem.SubItems[2] := 'Unloaded'; end; function SendStudioMsg(eMessage: Integer; eData: String; eIntData: Integer): Integer; var eStudioHandle: HWND; eCopyDataStruct: TCopyDataStruct; begin with eCopyDataStruct do begin dwData := eIntData; cbData := Length(eData) + 1; lpData := PChar(eData); end; eStudioHandle := FindWindow('TfrmMain', 'AMXX-Studio'); if eStudioHandle <> 0 then Result := SendMessage(eStudioHandle, WM_COPYDATA, eMessage, LongInt(@eCopyDataStruct)) else Result := 0; end; function GetDLLHandles: TIntegerArray; var i, eCount: integer; begin SetLength(Result, 0); eCount := 0; if not Started then exit; for i := 0 to frmSettings.lvPlugins.Items.Count -1 do begin if frmSettings.lvPlugins.Items[i].Data <> nil then begin SetLength(Result, eCount +1); Result[eCount] := Cardinal(frmSettings.lvPlugins.Items[i].Data); Inc(eCount, 1); end; end; end; function Plugin_CodeSnippetClick(Title, Category: String; Code: String): Boolean; var Func: TCodeSnippetClick; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'CodeSnippetClick'); if @Func <> nil then begin case Func(PChar(Title), PChar(Category), PChar(Code)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_FileLoad(Filename: String; Loading: Boolean): Boolean; var Func: TFileAction; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Loading then @Func := GetProcAddress(Handles[i], 'Loading') else @Func := GetProcAddress(Handles[i], 'Loaded'); if @Func <> nil then begin case Func(PChar(Filename)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_FileSave(Filename: String; Saving: Boolean): Boolean; var Func: TFileAction; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Saving then @Func := GetProcAddress(Handles[i], 'Saving') else @Func := GetProcAddress(Handles[i], 'Saved'); if @Func <> nil then begin case Func(PChar(Filename)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_DocChange(Index: Integer; Filename, Highlighter: String; RestoreCaret, Changing: Boolean): Boolean; var Func: TDocChange; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Changing then @Func := GetProcAddress(Handles[i], 'DocChanging') else @Func := GetProcAddress(Handles[i], 'DocChanged'); if @Func <> nil then begin case Func(Index, PChar(Filename), PChar(Highlighter), RestoreCaret) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_ProjectsChange(OldIndex, NewIndex: Integer; Changing: Boolean): Boolean; var Func: TProjectsChange; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Changing then @Func := GetProcAddress(Handles[i], 'ProjectsChanging') else @Func := GetProcAddress(Handles[i], 'ProjectsChanged'); if @Func <> nil then begin case Func(OldIndex, NewIndex) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_CreateNewFile(Item: Byte; Creating: Boolean): Boolean; var Func: TCreateNewFile; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Creating then @Func := GetProcAddress(Handles[i], 'CreatingNewFile') else @Func := GetProcAddress(Handles[i], 'CreatedNewFile'); if @Func <> nil then begin case Func(Item) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_Search(SearchList, Selected: String; Displaying, SearchAgain: Boolean; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; var Func: TSearch; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Displaying then @Func := GetProcAddress(Handles[i], 'DisplayingSearch') else if SearchAgain then @Func := GetProcAddress(Handles[i], 'SearchAgain') else @Func := GetProcAddress(Handles[i], 'Search'); if @Func <> nil then begin case Func(PChar(Selected), PChar(SearchList), CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_SearchReplace(Expression, Replace, ExpList, RepList: String; CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward: Boolean): Boolean; var Func: TSearchReplace; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'SearchReplace'); if @Func <> nil then begin case Func(PChar(Expression), PChar(Replace), PChar(ExpList), PChar(RepList), CaseSensivity, WholeWords, SearchFromCaret, SelectedOnly, RegEx, Forward) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_VisibleControlChange(Control: Integer; Show: Boolean): Boolean; var Func: TVisibleControlChange; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'VisibleControlChange'); if @Func <> nil then begin case Func(Control, Show) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_Compile(CompileType: Integer; Lang, Filename: String; Compiling: Boolean): Boolean; var Func: TCompile; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Compiling then @Func := GetProcAddress(Handles[i], 'Compiling') else @Func := GetProcAddress(Handles[i], 'Compile'); if @Func <> nil then begin case Func(CompileType, PChar(Lang), PChar(Filename)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_ShowHelp(HelpType: Integer): Boolean; var Func: TShowHelp; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'ShowHelp'); if @Func <> nil then begin case Func(HelpType) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_CustomItemClick(Caption: String): Boolean; var Func: TCustomItemClick; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'CustomItemClick'); if @Func <> nil then begin case Func(PChar(Caption)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_ThemeChange(Theme: String): Boolean; var Func: TThemeChanged; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'ThemeChanged'); if @Func <> nil then begin case Func(PChar(Theme)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_Modified(ModifiedStr: PAnsiChar): Boolean; var Func: TModified; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'Modified'); if @Func <> nil then begin case Func(ModifiedStr) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_KeyPress(Key: Char): Boolean; var Func: TKeyPress; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'KeyPress'); if @Func <> nil then begin case Func(PChar(String(Key))) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_EditorClick(DoubleClick: Boolean): Boolean; var Func: TEditorClick; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if DoubleClick then @Func := GetProcAddress(Handles[i], 'DoubleClick') else @Func := GetProcAddress(Handles[i], 'Click'); if @Func <> nil then begin case Func of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_UpdateSel(SelStart, SelLength, FirstVisibleLine: Integer): Boolean; var Func: TUpdateSel; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'UpdateSel'); if @Func <> nil then begin case Func(SelStart, SelLength, FirstVisibleLine) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_CallTipShow(List: PChar): Boolean; var Func: TCallTipShow; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'CallTipShow'); if @Func <> nil then begin case Func(List) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_CallTipClick(Position: Integer): Boolean; var Func: TCallTipClick; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'CallTipClick'); if @Func <> nil then begin case Func(Position) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_AutoCompleteShow(List: PChar): Boolean; var Func: TAutoCompleteShow; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'AutoCompleteShow'); if @Func <> nil then begin case Func(List) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_AutoCompleteSelect(Text: PChar): Boolean; var Func: TAutoCompleteSelect; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'AutoCompleteSelect'); if @Func <> nil then begin case Func(Text) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_AppMsg(hwnd: HWND; Message: Integer; wParam, lParam: Integer; time: Integer; pt: TPoint): Boolean; var Func: TAppMsg; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'AppMessage'); if @Func <> nil then begin case Func(hwnd, Message, wParam, lParam, time, pt) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_UpdateCodeExplorer(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; var Func: TUpdateCodeTools; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Updating then @Func := GetProcAddress(Handles[i], 'UpdatingCodeExplorer') else @Func := GetProcAddress(Handles[i], 'UpdatedCodeExplorer'); if @Func <> nil then begin case Func(PChar(Lang), PChar(Filename), PChar(CurrProjects)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_UpdateCodeInspector(Lang, Filename, CurrProjects: String; Updating: Boolean): Boolean; var Func: TUpdateCodeTools; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin if Updating then @Func := GetProcAddress(Handles[i], 'UpdatingCodeInspector') else @Func := GetProcAddress(Handles[i], 'UpdatedCodeInspector'); if @Func <> nil then begin case Func(PChar(Lang), PChar(Filename), PChar(CurrProjects)) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_OutputDblClick(ItemIndex: Integer): Boolean; var Func: TOutputEvent; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'OutputDoubleClick'); if @Func <> nil then begin case Func(ItemIndex) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; function Plugin_OutputPopup(ItemIndex: Integer): Boolean; var Func: TOutputEvent; i: integer; Handles: TIntegerArray; begin Result := True; Handles := GetDLLHandles; for i := 0 to High(Handles) do begin @Func := GetProcAddress(Handles[i], 'OutputPopup'); if @Func <> nil then begin case Func(ItemIndex) of PLUGIN_HANDLED: Result := False; PLUGIN_STOP: begin Result := False; exit; end; end; end; end; SetLength(Handles, 0); Handles := nil; end; end.