doublecmd/src/frames/foptionsarchivers.pas
Denis Bisson 21e0a429dd ADD: Improvement in user interface regarding the configuration of archivers.
ADD: When attempting to quit configuration of archivers with unsaved modification, we're now prompt to save or not.
ADD: When disabling an archiver configuration, the whole setting turn gray.
ADD: We may now start a new archiver configuration by copying an existing one.
ADD: We may now import/export configuration or archivers.
ADD: We may now sort the archivers in the configuration.
ADD: Function enable/disable all the archivers at once.
ADD: New internal command "cm_ConfigArchivers".
ADD: When importing/export toolbar to TC, there is now an translation between "cm_ConfigArchivers" and "cm_PackerConfig".
ADD: Little variable reminder helper in popup menu for commands and parameters.
UPD: Language file regenerated. Minimal impact with above modification since existing translation have been re-used, with no additional "Fuzzy".
UPD: French language translation back 100% done.
2018-06-14 01:09:23 +00:00

830 lines
30 KiB
ObjectPascal

{
Double Commander
-------------------------------------------------------------------------
Archivers options page
Copyright (C) 2006-2018 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
}
unit fOptionsArchivers;
{$mode objfpc}{$H+}
interface
uses
//Lazarus, Free-Pascal, etc.
Classes, SysUtils, StdCtrls, ExtCtrls, ComCtrls, EditBtn, Buttons, Menus,
Dialogs,
//DC
uMultiArc, fOptionsFrame, Controls;
type
{ TfrmOptionsArchivers }
TfrmOptionsArchivers = class(TOptionsEditor)
pnlArchiverListbox: TPanel;
lblArchiverListBox: TLabel;
lbxArchiver: TListBox;
splArchiver: TSplitter;
pnlArchiverCommands: TPanel;
pnlArchiverButtons: TPanel;
chkArchiverEnabled: TCheckBox;
btnArchiverApply: TBitBtn;
btnArchiverAdd: TBitBtn;
btnArchiverCopy: TBitBtn;
btnArchiverRename: TBitBtn;
btnArchiverDelete: TBitBtn;
btnArchiverOther: TBitBtn;
pcArchiverCommands: TPageControl;
tbArchiverGeneral: TTabSheet;
lblArchiverDescription: TLabel;
edtArchiverDescription: TEdit;
lblArchiverArchiver: TLabel;
fneArchiverArchiver: TFileNameEdit;
btnArchiverRelativer: TSpeedButton;
lblArchiverExtension: TLabel;
edtArchiverExtension: TEdit;
lblArchiverList: TLabel;
edtArchiverList: TEdit;
btnArchiverListHelper: TSpeedButton;
lblArchiverListStart: TLabel;
edtArchiverListStart: TEdit;
lblArchiverListEnd: TLabel;
edtArchiverListEnd: TEdit;
lblArchiverListFormat: TLabel;
memArchiverListFormat: TMemo;
lblArchiverExtract: TLabel;
edtArchiverExtract: TEdit;
btnArchiverExtractHelper: TSpeedButton;
lblArchiverAdd: TLabel;
edtArchiverAdd: TEdit;
btnArchiverAddHelper: TSpeedButton;
tbArchiverAdditional: TTabSheet;
lblArchiverDelete: TLabel;
edtArchiverDelete: TEdit;
btnArchiverDeleteHelper: TSpeedButton;
lblArchiverTest: TLabel;
edtArchiverTest: TEdit;
btnArchiverTestHelper: TSpeedButton;
lblArchiverExtractWithoutPath: TLabel;
edtArchiverExtractWithoutPath: TEdit;
btnArchiverExtractWithoutPathHelper: TSpeedButton;
lblArchiverSelfExtract: TLabel;
edtArchiverSelfExtract: TEdit;
btnArchiverSelfExtractHelper: TSpeedButton;
lblArchiverPasswordQuery: TLabel;
edtArchiverPasswordQuery: TEdit;
gbArchiverIds: TGroupBox;
lblArchiverIds: TLabel;
edtArchiverId: TEdit;
lblArchiverIdPosition: TLabel;
edtArchiverIdPosition: TEdit;
lblArchiverIdSeekRange: TLabel;
edtArchiverIdSeekRange: TEdit;
gbArchiverFormatParsingMode: TGroupBox;
ckbArchiverUnixPath: TCheckBox;
ckbArchiverWindowsPath: TCheckBox;
ckbArchiverUnixFileAttributes: TCheckBox;
ckbArchiverWindowsFileAttributes: TCheckBox;
gbArchiverOptions: TGroupBox;
chkArchiverMultiArcOutput: TCheckBox;
chkArchiverMultiArcDebug: TCheckBox;
pmArchiverOther: TPopupMenu;
miArchiverAutoConfigure: TMenuItem;
miArchiverDiscardModification: TMenuItem;
miSeparator1: TMenuItem;
miArchiverSortArchivers: TMenuItem;
miArchiverDisableAll: TMenuItem;
miArchiverEnableAll: TMenuItem;
miSeparator2: TMenuItem;
miArchiverExport: TMenuItem;
miArchiverImport: TMenuItem;
pmArchiverPathHelper: TPopupMenu;
pmArchiverParamHelper: TPopupMenu;
SaveArchiverDialog: TSaveDialog;
OpenArchiverDialog: TOpenDialog;
procedure lbxArchiverSelectionChange(Sender: TObject; {%H-}User: boolean);
procedure lbxArchiverDragOver(Sender, {%H-}Source: TObject; {%H-}X, {%H-}Y: integer; {%H-}State: TDragState; var Accept: boolean);
procedure lbxArchiverDragDrop(Sender, {%H-}Source: TObject; {%H-}X, Y: integer);
procedure edtAnyChange(Sender: TObject);
procedure ckbArchiverUnixPathChange(Sender: TObject);
procedure ckbArchiverWindowsPathChange(Sender: TObject);
procedure ckbArchiverUnixFileAttributesChange(Sender: TObject);
procedure ckbArchiverWindowsFileAttributesChange(Sender: TObject);
procedure chkArchiverEnabledChange(Sender: TObject);
procedure SetConfigurationState(bConfigurationSaved: boolean);
procedure SetControlsState(bWantedState: boolean);
procedure SetActiveButtonsBasedOnArchiversQuantity;
procedure ActualSaveCurrentMultiArcItem;
procedure btnArchiverApplyClick(Sender: TObject);
procedure btnArchiverAddClick(Sender: TObject);
procedure btnArchiverCopyClick(Sender: TObject);
procedure btnArchiverRenameClick(Sender: TObject);
procedure btnArchiverDeleteClick(Sender: TObject);
procedure btnArchiverOtherClick(Sender: TObject);
procedure miArchiverAutoConfigureClick(Sender: TObject);
procedure miArchiverDiscardModificationClick(Sender: TObject);
procedure miArchiverSortArchiversClick(Sender: TObject);
procedure miAdjustEnableAllClick(Sender: TObject);
procedure miArchiverExportClick(Sender: TObject);
procedure miArchiverImportClick(Sender: TObject);
procedure miHelperClick(Sender: TObject);
procedure btnHelperClick(Sender: TObject);
procedure btnArchiverRelativerClick(Sender: TObject);
procedure PopulateParamHelperMenu;
private
MultiArcListTemp: TMultiArcList;
bCurrentlyFilling: boolean;
bCurrentlyLoadingSettings: boolean;
edtHelperRequested: TEdit; //Used as a kind of pointer of TEdit when it's time to use the % helper.
procedure FillListBoxWithArchiverList;
protected
procedure Load; override;
procedure Done; override;
function Save: TOptionsEditorSaveFlags; override;
public
class function GetIconIndex: integer; override;
class function GetTitle: string; override;
function IsSignatureComputedFromAllWindowComponents: boolean; override;
function ExtraOptionsSignature(CurrentSignature: dword): dword; override;
end;
implementation
{$R *.lfm}
uses
//Lazarus, Free-Pascal, etc.
//DC
uGlobs, uLng, uSpecialDir, uGlobsPaths, uShowMsg;
const
CONFIG_NOTSAVED = False;
CONFIG_SAVED = True;
var
iLastDisplayedIndex: integer = -1;
{ TfrmOptionsArchivers }
{ TfrmOptionsArchivers.Load }
procedure TfrmOptionsArchivers.Load;
begin
bCurrentlyLoadingSettings := True;
bCurrentlyFilling := True;
if MultiArcListTemp <> nil then MultiArcListTemp.Free;
MultiArcListTemp := gMultiArcList.Clone;
FillListBoxWithArchiverList;
gSpecialDirList.PopulateMenuWithSpecialDir(pmArchiverPathHelper, mp_PATHHELPER, nil);
PopulateParamHelperMenu;
pcArchiverCommands.ActivePage := tbArchiverGeneral;
end;
{ TfrmOptionsArchivers.Done }
procedure TfrmOptionsArchivers.Done;
begin
if lbxArchiver.ItemIndex <> -1 then
if lbxArchiver.ItemIndex < MultiArcListTemp.Count then
iLastDisplayedIndex := lbxArchiver.ItemIndex;
end;
{ TfrmOptionsArchivers.Save }
function TfrmOptionsArchivers.Save: TOptionsEditorSaveFlags;
begin
Result := [];
if not lbxArchiver.Enabled then
ActualSaveCurrentMultiArcItem;
MultiArcListTemp.SaveToFile(gpCfgDir + sMULTIARC_FILENAME);
gMultiArcList.Free;
gMultiArcList := MultiArcListTemp.Clone;
LastLoadedOptionSignature := ComputeCompleteOptionsSignature;
end;
{ TfrmOptionsArchivers.GetIconIndex }
class function TfrmOptionsArchivers.GetIconIndex: integer;
begin
Result := 18;
end;
{ TfrmOptionsArchivers.GetTitle }
class function TfrmOptionsArchivers.GetTitle: string;
begin
Result := rsOptionsEditorArchivers;
end;
{ TfrmOptionsArchivers.IsSignatureComputedFromAllWindowComponents }
function TfrmOptionsArchivers.IsSignatureComputedFromAllWindowComponents: boolean;
begin
Result := False;
end;
{ TfrmOptionsArchivers.ExtraOptionsSignature }
function TfrmOptionsArchivers.ExtraOptionsSignature(CurrentSignature: dword): dword;
begin
if not lbxArchiver.Enabled then //If currently our Listbox is disabled, it's because we did at least one modification...
Result := (LastLoadedOptionSignature xor $01) //...so let's make sure the reported signature for the whole thing is affected.
else
Result := MultiArcListTemp.ComputeSignature(CurrentSignature);
end;
{ TfrmOptionsArchivers.FillListBoxWithArchiverList }
procedure TfrmOptionsArchivers.FillListBoxWithArchiverList;
var
I, iRememberIndex: integer;
begin
bCurrentlyFilling := True;
iRememberIndex := lbxArchiver.ItemIndex;
lbxArchiver.Clear;
for I := 0 to MultiArcListTemp.Count - 1 do lbxArchiver.Items.AddObject(MultiArcListTemp.Names[I], MultiArcListTemp[I]);
pcArchiverCommands.Enabled := (lbxArchiver.Items.Count <> 0);
chkArchiverEnabled.Enabled := (lbxArchiver.Items.Count <> 0);
if lbxArchiver.Items.Count > 0 then
begin
if (iRememberIndex <> -1) and (iRememberIndex < lbxArchiver.Items.Count) then
lbxArchiver.ItemIndex := iRememberIndex
else
if (iLastDisplayedIndex <> -1) and (iLastDisplayedIndex < lbxArchiver.Items.Count) then
lbxArchiver.ItemIndex := iLastDisplayedIndex
else
lbxArchiver.ItemIndex := 0;
end;
SetActiveButtonsBasedOnArchiversQuantity;
btnArchiverApply.Enabled := False;
bCurrentlyFilling := False;
lbxArchiverSelectionChange(lbxArchiver, False);
end;
{ TfrmOptionsArchivers.lbxArchiverSelectionChange }
procedure TfrmOptionsArchivers.lbxArchiverSelectionChange(Sender: TObject; User: boolean);
begin
if not bCurrentlyFilling then
begin
bCurrentlyLoadingSettings := True;
if lbxArchiver.ItemIndex < 0 then
begin
edtArchiverDescription.Text := EmptyStr;
fneArchiverArchiver.FileName := EmptyStr;
edtArchiverExtension.Text := EmptyStr;
edtArchiverList.Text := EmptyStr;
edtArchiverListStart.Text := EmptyStr;
edtArchiverListEnd.Text := EmptyStr;
memArchiverListFormat.Lines.Clear;
edtArchiverExtract.Text := EmptyStr;
edtArchiverAdd.Text := EmptyStr;
edtArchiverDelete.Text := EmptyStr;
edtArchiverTest.Text := EmptyStr;
edtArchiverExtractWithoutPath.Text := EmptyStr;
edtArchiverSelfExtract.Text := EmptyStr;
edtArchiverPasswordQuery.Text := EmptyStr;
edtArchiverId.Text := EmptyStr;
edtArchiverIdPosition.Text := EmptyStr;
edtArchiverIdSeekRange.Text := EmptyStr;
ckbArchiverUnixPath.Checked := False;
ckbArchiverWindowsPath.Checked := False;
ckbArchiverUnixFileAttributes.Checked := False;
ckbArchiverWindowsFileAttributes.Checked := False;
chkArchiverMultiArcOutput.Checked := False;
chkArchiverMultiArcDebug.Checked := False;
chkArchiverEnabled.Checked := False;
pcArchiverCommands.Enabled := (lbxArchiver.Items.Count <> 0);
chkArchiverEnabled.Enabled := (lbxArchiver.Items.Count <> 0);
end
else
begin
with TMultiArcItem(lbxArchiver.Items.Objects[lbxArchiver.ItemIndex]) do
begin
edtArchiverDescription.Text := FDescription;
fneArchiverArchiver.FileName := FArchiver;
edtArchiverExtension.Text := FExtension;
edtArchiverList.Text := FList;
edtArchiverListStart.Text := FStart;
edtArchiverListEnd.Text := FEnd;
memArchiverListFormat.Lines.Assign(FFormat);
edtArchiverExtract.Text := FExtract;
edtArchiverAdd.Text := FAdd;
edtArchiverDelete.Text := FDelete;
edtArchiverTest.Text := FTest;
edtArchiverExtractWithoutPath.Text := FExtractWithoutPath;
edtArchiverSelfExtract.Text := FAddSelfExtract;
edtArchiverPasswordQuery.Text := FPasswordQuery;
edtArchiverId.Text := FID;
edtArchiverIdPosition.Text := FIDPos;
edtArchiverIdSeekRange.Text := FIDSeekRange;
ckbArchiverUnixPath.Checked := (FFormMode and $01 <> $00);
ckbArchiverWindowsPath.Checked := (FFormMode and $02 <> $00);
ckbArchiverUnixFileAttributes.Checked := (FFormMode and $04 <> $00);
ckbArchiverWindowsFileAttributes.Checked := (FFormMode and $08 <> $00);
chkArchiverMultiArcOutput.Checked := FOutput;
chkArchiverMultiArcDebug.Checked := FDebug;
chkArchiverEnabled.Checked := FEnabled;
end;
end;
SetControlsState(chkArchiverEnabled.Checked);
SetConfigurationState(CONFIG_SAVED);
bCurrentlyLoadingSettings := False;
end;
end;
{ TfrmOptionsArchivers.lbxArchiverDragOver }
procedure TfrmOptionsArchivers.lbxArchiverDragOver(Sender, Source: TObject; X, Y: integer; State: TDragState; var Accept: boolean);
begin
Accept := True;
end;
{ TfrmOptionsArchivers.lbxArchiverDragDrop }
procedure TfrmOptionsArchivers.lbxArchiverDragDrop(Sender, Source: TObject; X, Y: integer);
var
SrcIndex, DestIndex: integer;
begin
SrcIndex := lbxArchiver.ItemIndex;
if SrcIndex = -1 then
Exit;
DestIndex := lbxArchiver.GetIndexAtY(Y);
if (DestIndex < 0) or (DestIndex >= lbxArchiver.Count) then
DestIndex := lbxArchiver.Count - 1;
lbxArchiver.Items.Move(SrcIndex, DestIndex);
MultiArcListTemp.FList.Move(SrcIndex, DestIndex);
lbxArchiver.ItemIndex := DestIndex;
lbxArchiverSelectionChange(lbxArchiver, False);
end;
{ TfrmOptionsArchivers.edtAnyChange }
procedure TfrmOptionsArchivers.edtAnyChange(Sender: TObject);
begin
if not bCurrentlyLoadingSettings then
if lbxArchiver.Enabled then
SetConfigurationState(CONFIG_NOTSAVED);
end;
{ TfrmOptionsArchivers.ckbArchiverUnixPathChange }
procedure TfrmOptionsArchivers.ckbArchiverUnixPathChange(Sender: TObject);
begin
if TCheckBox(Sender).Checked then
if ckbArchiverWindowsPath.Checked then
ckbArchiverWindowsPath.Checked:=False;
edtAnyChange(Sender);
end;
{ TfrmOptionsArchivers.ckbArchiverWindowsPathChange }
procedure TfrmOptionsArchivers.ckbArchiverWindowsPathChange(Sender: TObject);
begin
if TCheckbox(Sender).Checked then
if ckbArchiverUnixPath.Checked then
ckbArchiverUnixPath.Checked:=False;
edtAnyChange(Sender);
end;
{ TfrmOptionsArchivers.ckbArchiverUnixFileAttributesChange }
procedure TfrmOptionsArchivers.ckbArchiverUnixFileAttributesChange(Sender: TObject);
begin
if TCheckBox(Sender).Checked then
if ckbArchiverWindowsFileAttributes.Checked then
ckbArchiverWindowsFileAttributes.Checked := False;
edtAnyChange(Sender);
end;
{ TfrmOptionsArchivers.ckbArchiverWindowsFileAttributesChange }
procedure TfrmOptionsArchivers.ckbArchiverWindowsFileAttributesChange(Sender: TObject);
begin
if TCheckBox(Sender).Checked then
if ckbArchiverUnixFileAttributes.Checked then
ckbArchiverUnixFileAttributes.Checked := False;
edtAnyChange(Sender);
end;
{ TfrmOptionsArchivers.chkArchiverEnabledChange }
procedure TfrmOptionsArchivers.chkArchiverEnabledChange(Sender: TObject);
begin
if not bCurrentlyLoadingSettings then
begin
SetControlsState(chkArchiverEnabled.Checked);
edtAnyChange(Sender);
end;
end;
{ TfrmOptionsArchivers.SetConfigurationState }
procedure TfrmOptionsArchivers.SetConfigurationState(bConfigurationSaved: boolean);
begin
if lbxArchiver.Enabled <> bConfigurationSaved then
begin
lbxArchiver.Enabled := bConfigurationSaved;
btnArchiverApply.Enabled := not bConfigurationSaved;
btnArchiverAdd.Enabled := bConfigurationSaved;
btnArchiverCopy.Enabled := bConfigurationSaved;
btnArchiverRename.Enabled := bConfigurationSaved;
miArchiverImport.Enabled := bConfigurationSaved;
miArchiverSortArchivers.Enabled := bConfigurationSaved;
miArchiverExport.Enabled := bConfigurationSaved;
miArchiverDiscardModification.Enabled := not bConfigurationSaved;
miArchiverDisableAll.Enabled := bConfigurationSaved;
miArchiverEnableAll.Enabled := bConfigurationSaved;
if bConfigurationSaved = CONFIG_SAVED then
lbxArchiver.Hint := ''
else
lbxArchiver.Hint := rsOptArchiveConfigureSaveToChange;
end;
end;
{ TfrmOptionsArchivers.SetControlsState }
procedure TfrmOptionsArchivers.SetControlsState(bWantedState: boolean);
var
iComponentIndex: integer;
begin
if lbxArchiver.ItemIndex < 0 then Exit;
TMultiArcItem(lbxArchiver.Items.Objects[lbxArchiver.ItemIndex]).FEnabled := bWantedState;
if bWantedState <> edtArchiverDescription.Enabled then //Let's use "edtDescription" as a reference.
for iComponentIndex := 0 to pred(ComponentCount) do
if Components[iComponentIndex].Owner <> nil then
if Components[iComponentIndex].InheritsFrom(TControl) then
if (TControl(Components[iComponentIndex]).Parent = tbArchiverGeneral) or (TControl(Components[iComponentIndex]).Parent = tbArchiverAdditional) then
if Components[iComponentIndex].Name <> chkArchiverEnabled.Name then
TControl(Components[iComponentIndex]).Enabled := bWantedState;
end;
{ TfrmOptionsArchivers.SetActiveButtonsBasedOnArchiversQuantity }
procedure TfrmOptionsArchivers.SetActiveButtonsBasedOnArchiversQuantity;
begin
btnArchiverCopy.Enabled := ((lbxArchiver.Items.Count > 0) and (lbxArchiver.Enabled));
btnArchiverRename.Enabled := btnArchiverCopy.Enabled;
btnArchiverDelete.Enabled := btnArchiverCopy.Enabled;
miArchiverAutoConfigure.Enabled := btnArchiverCopy.Enabled;
miArchiverSortArchivers.Enabled := ((lbxArchiver.Items.Count > 1) and (lbxArchiver.Enabled));
miArchiverExport.Enabled := btnArchiverCopy.Enabled;
end;
{ TfrmOptionsArchivers.ActualSaveCurrentMultiArcItem }
procedure TfrmOptionsArchivers.ActualSaveCurrentMultiArcItem;
begin
if lbxArchiver.ItemIndex < 0 then
Exit;
with TMultiArcItem(lbxArchiver.Items.Objects[lbxArchiver.ItemIndex]) do
begin
FDescription := edtArchiverDescription.Text;
FArchiver := fneArchiverArchiver.FileName;
FExtension := edtArchiverExtension.Text;
FList := edtArchiverList.Text;
FStart := edtArchiverListStart.Text;
FEnd := edtArchiverListEnd.Text;
FFormat.Assign(memArchiverListFormat.Lines);
FExtract := edtArchiverExtract.Text;
FAdd := edtArchiverAdd.Text;
FDelete := edtArchiverDelete.Text;
FTest := edtArchiverTest.Text;
FExtractWithoutPath := edtArchiverExtractWithoutPath.Text;
FAddSelfExtract := edtArchiverSelfExtract.Text;
FPasswordQuery := edtArchiverPasswordQuery.Text;
FID := edtArchiverId.Text;
FIDPos := edtArchiverIdPosition.Text;
FIDSeekRange := edtArchiverIdSeekRange.Text;
FFormMode := 0;
if ckbArchiverUnixPath.Checked then FFormMode := FFormMode or $01;
if ckbArchiverWindowsPath.Checked then FFormMode := FFormMode or $02;
if ckbArchiverUnixFileAttributes.Checked then FFormMode := FFormMode or $04;
if ckbArchiverWindowsFileAttributes.Checked then FFormMode := FFormMode or $08;
FOutput := chkArchiverMultiArcOutput.Checked;
FDebug := chkArchiverMultiArcDebug.Checked;
SetConfigurationState(CONFIG_SAVED);
end;
end;
{ TfrmOptionsArchivers.btnArchiverApplyClick }
procedure TfrmOptionsArchivers.btnArchiverApplyClick(Sender: TObject);
begin
Save;
if lbxArchiver.CanFocus then
lbxArchiver.SetFocus;
end;
{ TfrmOptionsArchivers.btnArchiverAddClick }
procedure TfrmOptionsArchivers.btnArchiverAddClick(Sender: TObject);
var
sName: string;
MultiArcItem: TMultiArcItem;
begin
if InputQuery(Caption, rsOptArchiveTypeName, sName) then
begin
MultiArcItem := TMultiArcItem.Create;
lbxArchiver.Items.AddObject(sName, MultiArcItem);
MultiArcListTemp.Add(sName, MultiArcItem);
lbxArchiver.ItemIndex := lbxArchiver.Items.Count - 1;
lbxArchiverSelectionChange(lbxArchiver, False);
pcArchiverCommands.Enabled := (lbxArchiver.Items.Count <> 0);
chkArchiverEnabled.Enabled := (lbxArchiver.Items.Count <> 0);
SetActiveButtonsBasedOnArchiversQuantity;
end;
end;
{ TfrmOptionsArchivers.btnArchiverCopyClick }
procedure TfrmOptionsArchivers.btnArchiverCopyClick(Sender: TObject);
var
ANewMultiArcItem: TMultiArcItem;
sCurrentSelectedName, sNewName: string;
iIndexCopy, iPosOpenPar, iNewInsertedPosition: integer;
begin
if lbxArchiver.ItemIndex < 0 then Exit;
sCurrentSelectedName := lbxArchiver.Items.Strings[lbxArchiver.ItemIndex];
if LastDelimiter(')', sCurrentSelectedName) = length(sCurrentSelectedName) then
begin
iPosOpenPar := LastDelimiter('(', sCurrentSelectedName);
if (iPosOpenPar > 0) and (iPosOpenPar > (length(sCurrentSelectedName) - 4)) then
sCurrentSelectedName := LeftStr(sCurrentSelectedName, pred(pred(iPosOpenPar)));
end;
iIndexCopy := 2;
while lbxArchiver.Items.IndexOf(Format('%s (%d)', [sCurrentSelectedName, iIndexCopy])) <> -1 do
Inc(iIndexCopy);
sNewName := Format('%s (%d)', [sCurrentSelectedName, iIndexCopy]);
ANewMultiArcItem := TMultiArcItem(lbxArchiver.Items.Objects[lbxArchiver.ItemIndex]).Clone;
//Let's place our copy right after the original one.
iNewInsertedPosition := succ(lbxArchiver.ItemIndex);
if iNewInsertedPosition < MultiArcListTemp.Count then
begin
lbxArchiver.Items.InsertObject(iNewInsertedPosition, sNewName, ANewMultiArcItem);
MultiArcListTemp.Insert(iNewInsertedPosition, sNewName, aNewMultiArcItem);
end
else
begin
lbxArchiver.Items.AddObject(sNewName, ANewMultiArcItem);
MultiArcListTemp.Add(sNewName, aNewMultiArcItem);
end;
lbxArchiver.ItemIndex := iNewInsertedPosition;
SetActiveButtonsBasedOnArchiversQuantity;
end;
{ TfrmOptionsArchivers.btnArchiverRenameClick }
procedure TfrmOptionsArchivers.btnArchiverRenameClick(Sender: TObject);
var
sNewName: string;
begin
if lbxArchiver.ItemIndex < 0 then
Exit;
sNewName := lbxArchiver.Items[lbxArchiver.ItemIndex];
if InputQuery(Caption, rsOptArchiveTypeName, sNewName) then
begin
lbxArchiver.Items[lbxArchiver.ItemIndex] := sNewName;
MultiArcListTemp.Names[lbxArchiver.ItemIndex] := sNewName;
end;
end;
{ TfrmOptionsArchivers.btnArchiverDeleteClick }
procedure TfrmOptionsArchivers.btnArchiverDeleteClick(Sender: TObject);
var
iIndexDelete: integer;
begin
if lbxArchiver.ItemIndex < 0 then
Exit;
if MsgBox(Format(rsOptArchiverConfirmDelete, [lbxArchiver.Items.Strings[lbxArchiver.ItemIndex]]), [msmbYes, msmbCancel], msmbCancel, msmbCancel) = mmrYes then
begin
iIndexDelete := lbxArchiver.ItemIndex;
lbxArchiver.Items.Delete(iIndexDelete);
MultiArcListTemp.Delete(iIndexDelete);
if iIndexDelete >= MultiArcListTemp.Count then
lbxArchiver.ItemIndex := lbxArchiver.Items.Count - 1
else
lbxArchiver.ItemIndex := iIndexDelete;
pcArchiverCommands.Enabled := (lbxArchiver.Items.Count <> 0);
chkArchiverEnabled.Enabled := (lbxArchiver.Items.Count <> 0);
lbxArchiverSelectionChange(lbxArchiver, False);
if lbxArchiver.CanFocus then
lbxArchiver.SetFocus;
end;
SetActiveButtonsBasedOnArchiversQuantity;
end;
{ TfrmOptionsArchivers.btnArchiverOtherClick }
procedure TfrmOptionsArchivers.btnArchiverOtherClick(Sender: TObject);
var
pWantedPos:TPoint;
begin
pWantedPos := btnArchiverOther.ClientToScreen(Point(btnArchiverOther.Width div 2,btnArchiverOther.Height-5)); // Position this way instead of using mouse cursor since it will work for keyboard user.
pmArchiverOther.PopUp(pWantedPos.X, pWantedPos.Y);
end;
{ TfrmOptionsArchivers.miArchiverAutoConfigureClick }
procedure TfrmOptionsArchivers.miArchiverAutoConfigureClick(Sender: TObject);
begin
MultiArcListTemp.AutoConfigure;
lbxArchiverSelectionChange(lbxArchiver, False);
end;
{ TfrmOptionsArchivers.miArchiverDiscardModificationClick }
procedure TfrmOptionsArchivers.miArchiverDiscardModificationClick(Sender: TObject);
begin
if MultiArcListTemp <> nil then
MultiArcListTemp.Free;
MultiArcListTemp := gMultiArcList.Clone;
lbxArchiverSelectionChange(lbxArchiver, False);
end;
{ TfrmOptionsArchivers.miArchiverSortArchiversClick }
procedure TfrmOptionsArchivers.miArchiverSortArchiversClick(Sender: TObject);
begin
if MultiArcListTemp.Count > 0 then
begin
MultiArcListTemp.FList.Sort;
FillListBoxWithArchiverList;
lbxArchiver.ItemIndex := 0;
lbxArchiverSelectionChange(lbxArchiver, False);
end;
end;
{ TfrmOptionsArchivers.miAdjustEnableAllClick }
procedure TfrmOptionsArchivers.miAdjustEnableAllClick(Sender: TObject);
var
iIndex: integer;
begin
for iIndex := 0 to pred(MultiArcListTemp.Count) do
MultiArcListTemp.Items[iIndex].FEnabled := (TComponent(Sender).Tag = 1);
lbxArchiverSelectionChange(lbxArchiver, False);
end;
{ TfrmOptionsArchivers.miArchiverExportClick }
procedure TfrmOptionsArchivers.miArchiverExportClick(Sender: TObject);
var
slValueList, slOutputIndexSelected: TStringList;
ExportedMultiArcList: TMultiArcList;
iIndex, iExportedIndex: integer;
begin
if MultiArcListTemp.Count > 0 then
begin
slValueList := TStringList.Create;
slOutputIndexSelected := TStringList.Create;
try
for iIndex := 0 to pred(MultiArcListTemp.Count) do
slValueList.Add(MultiArcListTemp.FList.Strings[iIndex]);
if ShowInputMultiSelectListBox(rsOptArchiverExportCaption, rsOptArchiverExportPrompt, slValueList, slOutputIndexSelected) then
begin
ExportedMultiArcList := TMultiArcList.Create;
try
for iIndex := 0 to pred(slOutputIndexSelected.Count) do
begin
iExportedIndex := StrToIntDef(slOutputIndexSelected.Strings[iIndex], -1);
if iExportedIndex <> -1 then
ExportedMultiArcList.Add(MultiArcListTemp.FList.Strings[iExportedIndex], MultiArcListTemp.Items[iExportedIndex].Clone);
end;
if ExportedMultiArcList.Count > 0 then
begin
SaveArchiverDialog.DefaultExt := '*.ini';
SaveArchiverDialog.FilterIndex := 1;
SaveArchiverDialog.Title := rsOptArchiverWhereToSave;
SaveArchiverDialog.FileName := rsOptArchiverDefaultExportFilename;
if SaveArchiverDialog.Execute then
begin
ExportedMultiArcList.SaveToFile(SaveArchiverDialog.FileName);
msgOK(Format(rsOptArchiverExportDone, [ExportedMultiArcList.Count, SaveArchiverDialog.FileName]));
end;
end;
finally
ExportedMultiArcList.Free;
end;
end;
finally
slOutputIndexSelected.Free;
slValueList.Free;
end;
end;
end;
{ TfrmOptionsArchivers.miArchiverImportClick }
procedure TfrmOptionsArchivers.miArchiverImportClick(Sender: TObject);
var
ImportedMultiArcList: TMultiArcList;
slValueList, slOutputIndexSelected: TStringList;
iIndex, iImportedIndex, iNbImported: integer;
begin
OpenArchiverDialog.DefaultExt := '*.ini';
OpenArchiverDialog.FilterIndex := 1;
OpenArchiverDialog.Title := rsOptArchiverImportFile;
if OpenArchiverDialog.Execute then
begin
ImportedMultiArcList := TMultiArcList.Create;
try
ImportedMultiArcList.LoadFromFile(OpenArchiverDialog.FileName);
if ImportedMultiArcList.Count > 0 then
begin
slValueList := TStringList.Create;
slOutputIndexSelected := TStringList.Create;
try
for iIndex := 0 to pred(ImportedMultiArcList.Count) do
slValueList.Add(ImportedMultiArcList.FList.Strings[iIndex]);
if ShowInputMultiSelectListBox(rsOptArchiverImportCaption, rsOptArchiverImportPrompt, slValueList, slOutputIndexSelected) then
begin
iNbImported := 0;
for iIndex := 0 to pred(slOutputIndexSelected.Count) do
begin
iImportedIndex := StrToIntDef(slOutputIndexSelected.Strings[iIndex], -1);
if iImportedIndex <> -1 then
begin
MultiArcListTemp.Add(ImportedMultiArcList.FList.Strings[iImportedIndex], ImportedMultiArcList.Items[iImportedIndex].Clone);
lbxArchiver.Items.AddObject(MultiArcListTemp.FList.Strings[pred(MultiArcListTemp.Count)], MultiArcListTemp.Items[pred(MultiArcListTemp.Count)]);
MultiArcListTemp.Items[pred(MultiArcListTemp.Count)].FEnabled := True; //;
Inc(iNbImported);
end;
end;
lbxArchiver.ItemIndex := lbxArchiver.Items.Count - 1;
if iNbImported > 0 then
begin
SetActiveButtonsBasedOnArchiversQuantity;
msgOK(Format(rsOptArchiverImportDone, [iNbImported, OpenArchiverDialog.FileName]));
end;
end;
finally
slOutputIndexSelected.Free;
slValueList.Free;
end;
end;
finally
ImportedMultiArcList.Free;
end;
end;
end;
{ TfrmOptionsArchivers.miHelperClick }
procedure TfrmOptionsArchivers.miHelperClick(Sender: TObject);
begin
if edtHelperRequested <> nil then
edtHelperRequested.SelText := Trim(LeftStr(TMenuItem(Sender).Caption, pred(pos('-', TMenuItem(Sender).Caption))));
end;
{ TfrmOptionsArchivers.btnHelperClick }
procedure TfrmOptionsArchivers.btnHelperClick(Sender: TObject);
begin
edtHelperRequested := TEdit(TSpeedButton(Sender).AnchorSideTop.Control);
pmArchiverParamHelper.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
{ TfrmOptionsArchivers.btnArchiverRelativerClick }
procedure TfrmOptionsArchivers.btnArchiverRelativerClick(Sender: TObject);
begin
fneArchiverArchiver.SetFocus;
gSpecialDirList.SetSpecialDirRecipientAndItsType(fneArchiverArchiver, pfFILE);
pmArchiverPathHelper.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
{ TfrmOptionsArchivers.PopulateParamHelperMenu }
procedure TfrmOptionsArchivers.PopulateParamHelperMenu;
procedure AddThisItem(sParameter, sDescription: string);
var
AMenuItem: TMenuItem;
begin
AMenuItem := TMenuItem.Create(pmArchiverParamHelper);
if sDescription <> '' then
begin
AMenuItem.Caption := Format('%s - %s', [sParameter, sDescription]);
AMenuItem.OnClick := @miHelperClick;
end
else
AMenuItem.Caption := sParameter;
pmArchiverParamHelper.Items.Add(AMenuItem);
end;
begin
pmArchiverParamHelper.Items.Clear;
AddThisItem('%P', rsOptArchiverProgramL);
AddThisItem('%p', rsOptArchiverProgramS);
AddThisItem('%A', rsOptArchiverArchiveL);
AddThisItem('%a', rsOptArchiverArchiveS);
AddThisItem('%L', rsOptArchiverFileListL);
AddThisItem('%l', rsOptArchiverFileListS);
AddThisItem('%F', rsOptArchiverSingleFProcess);
AddThisItem('%E', rsOptArchiverErrorLevel);
AddThisItem('%O', rsOptArchiverChangeEncoding);
AddThisItem('%R', rsOptArchiverTargetSubDir);
AddThisItem('%S', rsOptArchiverAdditonalCmd);
AddThisItem('{}', rsOptArchiverAddOnlyNotEmpty);
AddThisItem('-', '');
AddThisItem('Q', rsOptArchiverQuoteWithSpace);
AddThisItem('q', rsOptArchiverQuoteAll);
AddThisItem('W', rsOptArchiverJustName);
AddThisItem('P', rsOptArchiverJustPath);
AddThisItem('A', rsOptArchiverUseAnsi);
AddThisItem('U', rsOptArchiverUseUTF8);
end;
end.