mirror of
http://gitlab.expertsoft.com.ua/git/expertcad
synced 2026-01-11 17:25:39 +02:00
350 lines
9.3 KiB
ObjectPascal
350 lines
9.3 KiB
ObjectPascal
unit PcPluginDlg;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
DlgBase,BlockFrm,FileCtrl,plgDial,pcPlgInt,PCTypesUtils;
|
|
|
|
type
|
|
TPCPluginDlg = class(TDlgBase)
|
|
private
|
|
{ Private declarations }
|
|
Dial : TfrmPlugin;
|
|
fDirectory: String;
|
|
FPlugins : TstringList;
|
|
FPluginHandles: Array [0..255] of THandle;
|
|
Procedure GetCommand( comId: integer; values: string; valueI: integer );
|
|
procedure SetDirectory(const Value: String);
|
|
function GetVisible: Boolean;
|
|
protected
|
|
{ Protected declarations }
|
|
|
|
public
|
|
{ Public declarations }
|
|
constructor create(Aowner: TComponent);override;
|
|
Destructor Destroy;override;
|
|
procedure Show;override;
|
|
Procedure SyncronizeContext;
|
|
Procedure Syncronize;override;
|
|
Procedure Locate(px,py:Integer);override;
|
|
Procedure LoadPlugins;
|
|
Procedure UnLoadPlugins;
|
|
Procedure GetPlugins(List: TStringList);
|
|
Function GetPluginNames:String;
|
|
Function GetPluginCount:Integer;
|
|
Function GetPluginName(PluginIdx:Integer):String;
|
|
Function GetPluginVerbCount(PluginIdx:Integer):Integer;
|
|
Function GetPluginVerbName(PluginIdx,VerbIdx:Integer):String;
|
|
Function GetPluginVerbs(PluginIdx: integer):String;
|
|
Procedure DoPluginVerb(PluginIdx,VerbIdx: integer);
|
|
Function GetPluginInfoText(PluginIdx:Integer):String;
|
|
published
|
|
{ Published declarations }
|
|
Property CadControl;
|
|
Property PluginsDirectory:String read fDirectory write SetDirectory;
|
|
Property Visible:Boolean read GetVisible;
|
|
end;
|
|
|
|
TGetVerbsProc = Function:pchar;stdcall;
|
|
TDoVerbProc = Procedure (VerbIndex: integer);stdcall;
|
|
TInitProc = Procedure (OwnerApp:integer);stdcall;
|
|
TInfoProc = Function:String;stdcall;
|
|
|
|
implementation
|
|
{$R *.DCR}
|
|
|
|
{ TPCPluginDlg }
|
|
|
|
constructor TPCPluginDlg.create(Aowner: TComponent);
|
|
var dir: String;
|
|
begin
|
|
inherited create(Aowner);
|
|
dial := TfrmPlugin.create(self);
|
|
oncommand := GetCommand;
|
|
DlgName := 'Plugins';
|
|
Fplugins := TStringList.Create;
|
|
RegRead('PlgDir',dir);
|
|
PluginsDirectory := dir;
|
|
end;
|
|
|
|
destructor TPCPluginDlg.Destroy;
|
|
begin
|
|
UnLoadPlugins;
|
|
FPlugins.Free;
|
|
Dial.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.DoPluginVerb(PluginIdx, VerbIdx: integer);
|
|
var DoVerbProc : TDoVerbProc;
|
|
Begin
|
|
If (FPlugins = nil) or (FPlugins.count < PluginIdx+1) then
|
|
begin
|
|
end
|
|
else
|
|
begin
|
|
SetControlForPlugins(CadControl);
|
|
@DoVerbProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('DoVerb'));
|
|
if @DoVerbProc <> nil then
|
|
begin
|
|
DoVerbProc(VerbIdx);
|
|
CadControl.Refresh;
|
|
CadControl.Updated := True;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TPCPluginDlg.GetCommand(comId: integer; values: string;
|
|
valueI: integer);
|
|
begin
|
|
case ComId of
|
|
0: begin
|
|
PluginsDirectory := ValueS;
|
|
end;
|
|
1: begin
|
|
LoadPlugins;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginCount: Integer;
|
|
begin
|
|
result := 0;
|
|
if assigned(FPlugins) then result := FPlugins.Count;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginInfoText(PluginIdx: Integer): String;
|
|
var InfoProc : TinfoProc;
|
|
begin
|
|
Result := '';
|
|
If (FPlugins = nil) or (FPlugins.count < PluginIdx+1) then
|
|
begin
|
|
end
|
|
else
|
|
begin
|
|
SetControlForPlugins(CadControl);
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetName'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Name'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Name'+': '+Copy(FPlugins[PluginIdx],1,Length(FPlugins[PluginIdx])-4)+#13;
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetDesc'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Description'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Description'+': '+'N/A'+#13;
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetCompany'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Company'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Company'+': '+'N/A'+#13;
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetDate'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Date'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Date'+': '+'N/A'+#13;
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetVersion'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Version'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Version'+': '+'N/A'+#13;
|
|
@InfoProc := nil;
|
|
@InfoProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetLicence'));
|
|
if @InfoProc <> nil then
|
|
Result := Result+'Licence'+': '+InfoProc+#13
|
|
else
|
|
Result := Result+'Licence'+': '+'N/A'+#13+#13;
|
|
|
|
Result := Result+'Verbs Provided'+#13+'-------------------'+#13+GetPluginVerbs(PluginIdx);
|
|
end;
|
|
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginName(PluginIdx: Integer): String;
|
|
begin
|
|
If (FPlugins = nil) or (FPlugins.count < PluginIdx+1) then
|
|
begin
|
|
result := '';
|
|
end else begin
|
|
result := Copy(ExtractFileName(FPlugins[PluginIdx]),1,
|
|
length(ExtractFileName(FPlugins[PluginIdx]))-4);
|
|
end;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginNames: String;
|
|
var a: integer;
|
|
begin
|
|
result := '';
|
|
if not ((FPlugins = nil) or (FPlugins.count = 0)) then
|
|
begin
|
|
for a := 0 to FPlugins.count -1 do
|
|
begin
|
|
result := result+#13+
|
|
Copy(ExtractFileName(FPlugins[a]),1,
|
|
length(ExtractFileName(FPlugins[a]))-4);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.GetPlugins(List: TStringList);
|
|
var a: integer;
|
|
begin
|
|
if not ((FPlugins = nil) or (FPlugins.count = 0)) then
|
|
begin
|
|
for a := 0 to FPlugins.count -1 do
|
|
begin
|
|
List.Add(Copy(ExtractFileName(FPlugins[a]),1,
|
|
length(ExtractFileName(FPlugins[a]))-4));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginVerbCount(PluginIdx: Integer): Integer;
|
|
var verbs: String;
|
|
List: TstringList;
|
|
begin
|
|
verbs := GetPluginVerbs(PluginIdx);
|
|
List := TstringList.Create;
|
|
List.text := Verbs;
|
|
result := List.Count;
|
|
list.Free;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginVerbName(PluginIdx,
|
|
VerbIdx: Integer): String;
|
|
var verbs: String;
|
|
List: TstringList;
|
|
begin
|
|
result := '';
|
|
verbs := GetPluginVerbs(PluginIdx);
|
|
List := TstringList.Create;
|
|
List.text := Verbs;
|
|
if (VerbIdx > -1) and (VerbIdx < List.Count) then result := List[VerbIdx];
|
|
List.Free;
|
|
|
|
end;
|
|
|
|
function TPCPluginDlg.GetPluginVerbs(PluginIdx: integer): String;
|
|
var GetVerbsProc : TGetVerbsProc;
|
|
Begin
|
|
If (FPlugins = nil) or (FPlugins.count < PluginIdx+1) then
|
|
begin
|
|
result := '';
|
|
end
|
|
else
|
|
begin
|
|
@GetVerbsProc := GetProcAddress(FPluginHandles[PluginIdx],pchar('GetVerbs'));
|
|
if @GetVerbsProc <> nil then
|
|
result := GetVerbsProc;
|
|
end;
|
|
end;
|
|
|
|
function TPCPluginDlg.GetVisible: Boolean;
|
|
begin
|
|
Result := Dial.Visible;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.LoadPlugins;
|
|
var FileRec:TWIN32FindData;
|
|
FHandle: THandle;
|
|
a,b: integer;
|
|
InitProc : TInitProc;
|
|
Begin
|
|
If FDirectory = '' then exit;
|
|
UnLoadPlugins;
|
|
FHandle := FindFirstFile(pchar(FDirectory+'*.pce'),FileRec);
|
|
if FHandle <> INVALID_HANDLE_VALUE then
|
|
begin
|
|
FPlugins.Add(FileRec.cFileName);
|
|
while FindNextFile(Fhandle,FileRec) do
|
|
begin
|
|
FPlugins.Add(FileRec.cFileName);
|
|
end;
|
|
end;
|
|
For a := 0 to FPlugins.count -1 do
|
|
begin
|
|
FPluginHandles[a] := LoadLibrary(pchar(FDirectory+FPlugins[a]));
|
|
@InitProc := GetProcAddress(FPluginHandles[a],pchar('Init'));
|
|
if @InitProc <> nil then
|
|
InitProc(HInstance);
|
|
end;
|
|
b := FPlugins.count;
|
|
FHandle := FindFirstFile(pchar(FDirectory+'*.dll'),FileRec);
|
|
if FHandle <> INVALID_HANDLE_VALUE then
|
|
begin
|
|
FPlugins.Add(FileRec.cFileName);
|
|
while FindNextFile(Fhandle,FileRec) do
|
|
begin
|
|
FPlugins.Add(FileRec.cFileName);
|
|
end;
|
|
end;
|
|
For a := b to FPlugins.count -1 do
|
|
begin
|
|
FPluginHandles[a] := LoadLibrary(pchar(FDirectory+FPlugins[a]));
|
|
@InitProc := GetProcAddress(FPluginHandles[a],pchar('Init'));
|
|
if @InitProc <> nil then
|
|
InitProc(HInstance);
|
|
end;
|
|
SyncronizeContext;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.Locate(px, py: Integer);
|
|
begin
|
|
Dial.Left := px;
|
|
Dial.Top := py;
|
|
end;
|
|
|
|
|
|
procedure TPCPluginDlg.SetDirectory(const Value: String);
|
|
begin
|
|
fDirectory := Value;
|
|
if fDirectory <> '' then begin
|
|
if fDirectory[Length(fDirectory)] <> '\' then fDirectory := fDirectory + '\';
|
|
end;
|
|
if (fDirectory <> '') then RegWrite('PlgDir',Value);
|
|
if not (csDesigning in self.ComponentState) then LoadPlugins;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.Show;
|
|
begin
|
|
SyncronizeContext;
|
|
dial.showModal;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.Syncronize;
|
|
begin
|
|
If Dial.Visible then SyncronizeContext;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.SyncronizeContext;
|
|
var i: Integer;
|
|
begin
|
|
Dial.ListBox1.Clear;
|
|
Dial.InfoList.Clear;
|
|
for i := 0 to FPlugins.Count-1 do
|
|
begin
|
|
Dial.Listbox1.Items.Add(Copy(FPlugins[i],1,Length(FPlugins[i])-4));
|
|
Dial.InfoList.Add(GetPluginInfoText(i));
|
|
end;
|
|
Dial.Edit1.text := FDirectory;
|
|
end;
|
|
|
|
procedure TPCPluginDlg.UnLoadPlugins;
|
|
var a: integer;
|
|
Begin
|
|
For a := 0 to FPlugins.count -1 do
|
|
begin
|
|
FreeLibrary(FPluginHandles[a]);
|
|
end;
|
|
FPlugins.Clear;
|
|
end;
|
|
|
|
end.
|