mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
428 lines
13 KiB
ObjectPascal
428 lines
13 KiB
ObjectPascal
{
|
|
Double Commander
|
|
-------------------------------------------------------------------------
|
|
Plugins WCX options page
|
|
|
|
Copyright (C) 2006-2019 Alexander Koblov (alexx2000@mail.ru)
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
}
|
|
|
|
unit fOptionsPluginsWCX;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
//Lazarus, Free-Pascal, etc.
|
|
Classes, SysUtils, ComCtrls, StdCtrls, Grids, Buttons, Controls, ExtCtrls,
|
|
|
|
//DC
|
|
fOptionsFrame, uWCXModule, foptionspluginsbase;
|
|
|
|
type
|
|
{ TfrmOptionsPluginsWCX }
|
|
TfrmOptionsPluginsWCX = class(TfrmOptionsPluginsBase)
|
|
procedure stgPluginsWCXDragDrop(Sender, {%H-}Source: TObject; X, Y: integer);
|
|
procedure btnToggleViewClick(Sender: TObject);
|
|
procedure btnAddPluginClick(Sender: TObject);
|
|
procedure btnEnablePluginClick(Sender: TObject);
|
|
procedure btnRemovePluginClick(Sender: TObject);
|
|
procedure btnTweakPluginClick(Sender: TObject);
|
|
procedure btnConfigPluginClick(Sender: TObject);
|
|
protected
|
|
procedure Init; override;
|
|
procedure Load; override;
|
|
function Save: TOptionsEditorSaveFlags; override;
|
|
procedure Done; override;
|
|
procedure stgPluginsOnSelection(Sender: TObject; {%H-}aCol, aRow: integer); override;
|
|
procedure ActualAddPlugin(sPluginFilename: string); override;
|
|
public
|
|
class function GetTitle: string; override;
|
|
function ExtraOptionsSignature(CurrentSignature: dword): dword; override;
|
|
procedure ShowPluginsTable; override;
|
|
end;
|
|
|
|
var
|
|
tmpWCXPlugins: TWCXModuleList;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
//Lazarus, Free-Pascal, etc.
|
|
StrUtils, LCLProc, Forms, Dialogs,
|
|
|
|
//DC
|
|
uDCUtils, uLng, uGlobs, uShowMsg, fTweakPlugin, dmCommonData, DCStrUtils,
|
|
uDefaultPlugins;
|
|
|
|
const
|
|
COLNO_ACTIVE = 0;
|
|
COLNO_NAME = 1;
|
|
COLNO_EXT = 2;
|
|
COLNO_FILENAME = 3;
|
|
|
|
{ TfrmOptionsPluginsWCX }
|
|
|
|
{ TfrmOptionsPluginsWCX.Init }
|
|
procedure TfrmOptionsPluginsWCX.Init;
|
|
begin
|
|
PluginType := ptWCX;
|
|
inherited Init;
|
|
tmpWCXPlugins := TWCXModuleList.Create;
|
|
stgPlugins.OnDragDrop := @stgPluginsWCXDragDrop;
|
|
btnToggleOptionPlugins.OnClick := @btnToggleViewClick;
|
|
btnToggleOptionPlugins.Visible := True;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.Load }
|
|
procedure TfrmOptionsPluginsWCX.Load;
|
|
begin
|
|
tmpWCXPlugins.Assign(gWCXPlugins);
|
|
ShowPluginsTable;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.Save }
|
|
function TfrmOptionsPluginsWCX.Save: TOptionsEditorSaveFlags;
|
|
begin
|
|
gWCXPlugins.Assign(tmpWCXPlugins);
|
|
Result := [];
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.Done }
|
|
procedure TfrmOptionsPluginsWCX.Done;
|
|
begin
|
|
FreeAndNil(tmpWCXPlugins);
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.GetTitle }
|
|
class function TfrmOptionsPluginsWCX.GetTitle: string;
|
|
begin
|
|
Result := rsOptionsEditorPlugins + ' WCX';
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.ExtraOptionsSignature }
|
|
function TfrmOptionsPluginsWCX.ExtraOptionsSignature(CurrentSignature: dword): dword;
|
|
begin
|
|
Result := tmpWCXPlugins.ComputeSignature(CurrentSignature);
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.ShowPluginsTable }
|
|
procedure TfrmOptionsPluginsWCX.ShowPluginsTable;
|
|
var
|
|
I, iIndex: integer;
|
|
sFileName, sExt: string;
|
|
iRememberOriginalRow, iRow: integer;
|
|
begin
|
|
iRememberOriginalRow := stgPlugins.Row;
|
|
|
|
case gWCXConfigViewMode of
|
|
wcvmByPlugin:
|
|
begin
|
|
btnToggleOptionPlugins.Caption := rsOptPluginShowByExtension;
|
|
btnToggleOptionPlugins.Glyph.Assign(ImgByExtension.Picture.Bitmap);
|
|
stgPlugins.RowCount := stgPlugins.FixedRows;
|
|
end;
|
|
|
|
wcvmByExtension:
|
|
begin
|
|
btnToggleOptionPlugins.Caption := rsOptPluginShowByPlugin;
|
|
btnToggleOptionPlugins.Glyph.Assign(ImgByPlugin.Picture.Bitmap);
|
|
stgPlugins.RowCount := succ(tmpWCXPlugins.Count);
|
|
end;
|
|
end;
|
|
|
|
for I := 0 to pred(tmpWCXPlugins.Count) do
|
|
begin
|
|
// get associated extension
|
|
sExt := tmpWCXPlugins.Ext[I];
|
|
|
|
//get file name
|
|
sFileName := tmpWCXPlugins.FileName[I];
|
|
|
|
case gWCXConfigViewMode of
|
|
wcvmByPlugin:
|
|
begin
|
|
iIndex := stgPlugins.Cols[COLNO_FILENAME].IndexOf(sFileName);
|
|
if iIndex < 0 then
|
|
begin
|
|
stgPlugins.RowCount := stgPlugins.RowCount + 1;
|
|
iRow := pred(stgPlugins.RowCount);
|
|
stgPlugins.Cells[COLNO_ACTIVE, iRow] := IfThen(tmpWCXPlugins.Enabled[I], '+', '-');
|
|
stgPlugins.Cells[COLNO_NAME, iRow] := ExtractOnlyFileName(sFileName);
|
|
stgPlugins.Cells[COLNO_EXT, iRow] := sExt + #32;
|
|
stgPlugins.Cells[COLNO_FILENAME, iRow] := sFileName;
|
|
end
|
|
else
|
|
begin
|
|
stgPlugins.Cells[COLNO_EXT, iIndex] := stgPlugins.Cells[COLNO_EXT, iIndex] + sExt + #32;
|
|
stgPlugins.Cells[COLNO_ACTIVE, iIndex] := stgPlugins.Cells[COLNO_ACTIVE, iIndex] + IfThen(tmpWCXPlugins.Enabled[I], '+', '-');
|
|
end;
|
|
end;
|
|
|
|
wcvmByExtension:
|
|
begin
|
|
stgPlugins.Cells[COLNO_ACTIVE, succ(I)] := IfThen(tmpWCXPlugins.Enabled[I], '+', '-');
|
|
stgPlugins.Cells[COLNO_NAME, succ(I)] := ExtractOnlyFileName(sFileName);
|
|
stgPlugins.Cells[COLNO_EXT, succ(I)] := sExt;
|
|
stgPlugins.Cells[COLNO_FILENAME, succ(I)] := sFileName;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if iRememberOriginalRow <> -1 then
|
|
stgPlugins.Row := iRememberOriginalRow;
|
|
|
|
stgPluginsOnSelection(stgPlugins, 0, stgPlugins.Row);
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.stgPluginsOnSelection }
|
|
procedure TfrmOptionsPluginsWCX.stgPluginsOnSelection(Sender: TObject; aCol, aRow: integer);
|
|
var
|
|
bEnable: boolean = False;
|
|
bEnabled: boolean;
|
|
begin
|
|
if (aRow > 0) and (aRow < stgPlugins.RowCount) then
|
|
begin
|
|
bEnabled := (stgPlugins.Cells[COLNO_ACTIVE, aRow][1] = '-');
|
|
btnEnablePlugin.Caption := IfThen(bEnabled, rsOptPluginEnable, rsOptPluginDisable);
|
|
if bEnabled then
|
|
btnEnablePlugin.Glyph.Assign(ImgSwitchDisable.Picture.Bitmap)
|
|
else
|
|
btnEnablePlugin.Glyph.Assign(ImgSwitchEnable.Picture.Bitmap);
|
|
bEnable := True;
|
|
end;
|
|
btnEnablePlugin.Enabled := bEnable;
|
|
btnRemovePlugin.Enabled := bEnable;
|
|
btnTweakPlugin.Enabled := bEnable;
|
|
btnConfigPlugin.Enabled := bEnable;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.stgPluginsWCXDragDrop }
|
|
procedure TfrmOptionsPluginsWCX.stgPluginsWCXDragDrop(Sender, Source: TObject; X, Y: integer);
|
|
var
|
|
iDestCol, iDestRow, iSourceRow: integer;
|
|
begin
|
|
case gWCXConfigViewMode of
|
|
wcvmByPlugin:
|
|
begin
|
|
MsgError(rsOptPluginSortOnlyWhenByExtension);
|
|
end;
|
|
|
|
wcvmByExtension:
|
|
begin
|
|
stgPlugins.MouseToCell(X, Y, {%H-}iDestCol, {%H-}iDestRow);
|
|
if iDestRow > 0 then
|
|
begin
|
|
iSourceRow := stgPlugins.Row; //We need to that because after having done the following "MoveColRow", the "stgPlugins.Row" changed! So we need to remember original index.
|
|
stgPlugins.MoveColRow(False, iSourceRow, iDestRow);
|
|
tmpWCXPlugins.Move(pred(iSourceRow), pred(iDestRow));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.btnToggleViewClick }
|
|
procedure TfrmOptionsPluginsWCX.btnToggleViewClick(Sender: TObject);
|
|
begin
|
|
case gWCXConfigViewMode of
|
|
wcvmByPlugin: gWCXConfigViewMode := wcvmByExtension;
|
|
wcvmByExtension: gWCXConfigViewMode := wcvmByPlugin;
|
|
end;
|
|
ShowPluginsTable;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.btnAddPluginClick }
|
|
procedure TfrmOptionsPluginsWCX.btnAddPluginClick(Sender: TObject);
|
|
begin
|
|
dmComData.OpenDialog.Filter := Format('Archive plugins (%s)|%s', [WcxMask, WcxMask]);
|
|
if dmComData.OpenDialog.Execute then
|
|
ActualAddPlugin(dmComData.OpenDialog.FileName);
|
|
end;
|
|
|
|
{ v.ActualAddPlugin }
|
|
procedure TfrmOptionsPluginsWCX.ActualAddPlugin(sPluginFilename: string);
|
|
var
|
|
J, iPluginIndex, iFlags, iNbItemOnStart: integer;
|
|
sExt: string;
|
|
sExts: string;
|
|
sExtsTemp: string;
|
|
sPluginName: string;
|
|
sAlreadyAssignedExts: string;
|
|
WCXmodule: TWCXmodule;
|
|
begin
|
|
iNbItemOnStart := tmpWCXPlugins.Count;
|
|
|
|
if not CheckPlugin(sPluginFilename) then
|
|
Exit;
|
|
sPluginFilename := GetPluginFilenameToSave(sPluginFilename);
|
|
WCXmodule := gWCXPlugins.LoadModule(sPluginFilename);
|
|
|
|
if not Assigned(WCXmodule) then
|
|
begin
|
|
MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK);
|
|
Exit;
|
|
end;
|
|
|
|
iFlags := WCXmodule.GetPluginCapabilities;
|
|
|
|
sPluginName := sPluginFilename;
|
|
sExts := '';
|
|
if InputQuery(rsOptEnterExt, Format(rsOptAssocPluginWith, [sPluginFilename]), sExts) then
|
|
begin
|
|
sExtsTemp := sExts;
|
|
sExts := '';
|
|
sAlreadyAssignedExts := '';
|
|
sExt := Copy2SpaceDel(sExtsTemp);
|
|
repeat
|
|
iPluginIndex := tmpWCXPlugins.Find(sPluginName, sExt);
|
|
if iPluginIndex <> -1 then
|
|
begin
|
|
AddStrWithSep(sAlreadyAssignedExts, sExt);
|
|
end
|
|
else
|
|
begin
|
|
tmpWCXPlugins.AddObject(sExt + '=' + IntToStr(iFlags) + ',' + sPluginName, TObject(True));
|
|
AddStrWithSep(sExts, sExt);
|
|
end;
|
|
sExt := Copy2SpaceDel(sExtsTemp);
|
|
until sExt = '';
|
|
|
|
if sAlreadyAssignedExts <> '' then
|
|
MessageDlg(Format(rsOptPluginAlreadyAssigned, [sPluginFilename]) + LineEnding + sAlreadyAssignedExts, mtWarning, [mbOK], 0);
|
|
|
|
if iNbItemOnStart <> tmpWCXPlugins.Count then
|
|
begin
|
|
stgPlugins.RowCount := stgPlugins.RowCount + 1; // Add new row
|
|
J := pred(stgPlugins.RowCount);
|
|
stgPlugins.Cells[COLNO_ACTIVE, J] := '+'; // Enabled
|
|
stgPlugins.Cells[COLNO_NAME, J] := ExtractOnlyFileName(sPluginFilename);
|
|
stgPlugins.Cells[COLNO_EXT, J] := sExts;
|
|
stgPlugins.Cells[COLNO_FILENAME, J] := sPluginName;
|
|
stgPlugins.Row := J; //This will trig automatically the "OnSelection" event.
|
|
if gPluginInAutoTweak then
|
|
btnTweakPlugin.Click;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.btnEnablePluginClick }
|
|
procedure TfrmOptionsPluginsWCX.btnEnablePluginClick(Sender: TObject);
|
|
var
|
|
sExt, sExts, sFinalSigns: string;
|
|
iPluginIndex: integer;
|
|
bEnabled: boolean;
|
|
begin
|
|
if stgPlugins.Row < stgPlugins.FixedRows then
|
|
Exit;
|
|
|
|
case gWCXConfigViewMode of
|
|
wcvmByExtension:
|
|
begin
|
|
tmpWCXPlugins.Enabled[pred(stgPlugins.Row)] := not tmpWCXPlugins.Enabled[pred(stgPlugins.Row)];
|
|
stgPlugins.Cells[COLNO_ACTIVE, stgPlugins.Row] := IfThen(tmpWCXPlugins.Enabled[pred(stgPlugins.Row)], '+', '-');
|
|
end;
|
|
|
|
wcvmByPlugin:
|
|
begin
|
|
bEnabled := (stgPlugins.Cells[COLNO_ACTIVE, stgPlugins.Row][1] = '-');
|
|
sExts := stgPlugins.Cells[COLNO_EXT, stgPlugins.Row];
|
|
sExt := Copy2SpaceDel(sExts);
|
|
sFinalSigns := '';
|
|
repeat
|
|
iPluginIndex := tmpWCXPlugins.Find(stgPlugins.Cells[COLNO_FILENAME, stgPlugins.Row], sExt);
|
|
if iPluginIndex <> -1 then
|
|
tmpWCXPlugins.Enabled[iPluginIndex] := bEnabled;
|
|
sExt := Copy2SpaceDel(sExts);
|
|
sFinalSigns := sFinalSigns + IfThen(bEnabled, '+', '-');
|
|
until sExt = '';
|
|
stgPlugins.Cells[COLNO_ACTIVE, stgPlugins.Row] := sFinalSigns;
|
|
end;
|
|
end;
|
|
|
|
stgPluginsOnSelection(stgPlugins, 0, stgPlugins.Row);
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX }
|
|
procedure TfrmOptionsPluginsWCX.btnRemovePluginClick(Sender: TObject);
|
|
var
|
|
sExt, sExts: string;
|
|
iPluginIndex: integer;
|
|
begin
|
|
if stgPlugins.Row < stgPlugins.FixedRows then
|
|
Exit;
|
|
|
|
case gWCXConfigViewMode of
|
|
wcvmByPlugin:
|
|
begin
|
|
sExts := stgPlugins.Cells[COLNO_EXT, stgPlugins.Row];
|
|
sExt := Copy2SpaceDel(sExts);
|
|
repeat
|
|
iPluginIndex := tmpWCXPlugins.Find(stgPlugins.Cells[COLNO_FILENAME, stgPlugins.Row], sExt);
|
|
if iPluginIndex <> -1 then
|
|
tmpWCXPlugins.Delete(iPluginIndex);
|
|
sExt := Copy2SpaceDel(sExts);
|
|
until sExt = '';
|
|
end;
|
|
|
|
wcvmByExtension:
|
|
begin
|
|
tmpWCXPlugins.Delete(pred(stgPlugins.Row));
|
|
end;
|
|
end;
|
|
|
|
ShowPluginsTable;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.btnTweakPluginClick }
|
|
procedure TfrmOptionsPluginsWCX.btnTweakPluginClick(Sender: TObject);
|
|
var
|
|
iPluginIndex: integer;
|
|
begin
|
|
iPluginIndex := tmpWCXPlugins.Find(stgPlugins.Cells[COLNO_FILENAME, stgPlugins.Row], Copy2Space(stgPlugins.Cells[COLNO_EXT, stgPlugins.Row]));
|
|
|
|
if iPluginIndex < 0 then
|
|
Exit;
|
|
|
|
if ShowTweakPluginDlg(PluginType, iPluginIndex) then
|
|
ShowPluginsTable;
|
|
end;
|
|
|
|
{ TfrmOptionsPluginsWCX.btnConfigPluginClick }
|
|
procedure TfrmOptionsPluginsWCX.btnConfigPluginClick(Sender: TObject);
|
|
var
|
|
WCXmodule: TWCXmodule;
|
|
PluginFileName: string;
|
|
begin
|
|
if stgPlugins.Row < stgPlugins.FixedRows then
|
|
Exit; // no plugins
|
|
|
|
PluginFileName := stgPlugins.Cells[COLNO_FILENAME, stgPlugins.Row];
|
|
WCXmodule := gWCXPlugins.LoadModule(PluginFileName);
|
|
|
|
if Assigned(WCXmodule) then
|
|
begin
|
|
WCXmodule.VFSConfigure(stgPlugins.Handle);
|
|
end
|
|
else
|
|
begin
|
|
msgError(rsMsgErrEOpen + ': ' + PluginFileName);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|