amxmodx/editor/studio/UnitPlugins.pas
Christian Hammacher 62e1856229 Added 3 more plugin messages (SCM_PAWN_FILECOUNT, SCM_CPP_FILECOUNT, SCM_OTHER_FILECOUNT)
Fixed load bug (if you loaded a textfile and the tab "Other projects" wasn't active you got an error message)
2005-10-13 14:49:40 +00:00

1075 lines
31 KiB
ObjectPascal
Executable File

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;
TShortcutEvent = function (pCharCode, pKeyData: 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;
{ 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;
function Plugin_Shortcut(CharCode, KeyData: 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_SETTINGS_REMOVEPAGE = WM_USER + $194;
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_FILECOUNT = WM_USER + $195;
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_FILECOUNT = WM_USER + $196;
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_FILECOUNT = WM_USER + $197;
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_EDITOR_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, 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;
{ 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;
function Plugin_Shortcut(CharCode, KeyData: Integer): Boolean;
var Func: TShortcutEvent;
i: integer;
Handles: TIntegerArray;
begin
Result := True;
Handles := GetDLLHandles;
for i := 0 to High(Handles) do begin
@Func := GetProcAddress(Handles[i], 'Shortcut');
if @Func <> nil then begin
case Func(CharCode, KeyData) of
PLUGIN_HANDLED: Result := False;
PLUGIN_STOP: begin
Result := False;
exit;
end;
end;
end;
end;
SetLength(Handles, 0);
Handles := nil;
end;
end.