mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: When closing any "Find files" dialog window, if at least one search has been done, that window will remain in memory. If no search has been done, it will be cleared from memory. ADD: New internal command "cm_ViewSearches" to show a list of "Find files" dialog window and select one of them to activate it. This way, it possible to do a second search without losing the first one and to be able to reactive it. ADD: New internal command "cm_DeleteSearches" to delete all the "Find files" dialog windows we may have in memory. If you want to delete just one, activate it via the "cm_ViewSearches" internal command and then clear it from memory from there. ADD: New internal command "cm_ConfigSearches" to jump directly to the configuration of options related with searches. ADD: New 32x32 icons for the new internal commands "cm_AddNewSearch", "cm_ViewSearches", "cm_DeleteSearches" and "cm_ConfigSearches". For the 16x16, the last three mentionned were added since for the "cm_AddNewSearch" it was already there, added by mistake too early but now it's used. ADD: There is now a dedicated page for the option of the search instead of being inside the "File operations" page. UPD: On new installation, in the "Find files" dialog window, the "ENTER" key is not a shortcut anymore to launch a search. Too many persons get used that pressing enter in the result page was making us to jump to the file location. Code were already in place to have pertinent action on default button so pressing "ENTER" do the pertinent expected job. ADD: Possibility to have a menu bar in the "Find files" dialog window. This is mainly to help the user at first to see all the possibility. There is an option to hide it and probably experienced user after a while will hide it to gain some 20 extra pixels vertically. ADD: Reserve, if not already used, the keyboard shortcut "Ctrl+Shift+F7" for the new internal command "cm_AddNewSearch". UPD: Inside the "Find files" unit, re-arrange the code so the buttons will use TAction to do something instead of the opposite where the TAction were pressing button. UPD: Language files have been updated.
407 lines
12 KiB
ObjectPascal
407 lines
12 KiB
ObjectPascal
{
|
|
Double Commander
|
|
-------------------------------------------------------------------------
|
|
Options frame page
|
|
|
|
Copyright (C) 2006-2016 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 fOptionsFrame;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Forms, Controls, fgl;
|
|
|
|
type
|
|
TOptionsEditorInitFlag = (oeifLoad);
|
|
TOptionsEditorInitFlags = set of TOptionsEditorInitFlag;
|
|
TOptionsEditorSaveFlag = (oesfNeedsRestart);
|
|
TOptionsEditorSaveFlags = set of TOptionsEditorSaveFlag;
|
|
|
|
TOptionsEditor = class;
|
|
TOptionsEditorClass = class of TOptionsEditor;
|
|
TOptionsEditorClassList = class;
|
|
|
|
{ IOptionsDialog }
|
|
|
|
{$interfaces corba}
|
|
IOptionsDialog = interface
|
|
['{E62AAF5E-74ED-49AB-93F2-DBE210BF6723}']
|
|
procedure LoadSettings;
|
|
function GetEditor(EditorClass: TOptionsEditorClass): TOptionsEditor;
|
|
end;
|
|
{$interfaces default}
|
|
|
|
{ TOptionsEditor }
|
|
|
|
// Regarding warning to user when attempting to exit configuration window or "option editor" without having saved a modified setting:
|
|
// 1o) Immediately after having load the options in "LoadSettings", we will compute a signature,
|
|
// which is a CRC32 of the related settings and memorize it.
|
|
// 2o) When will attempt to close options, we'll recalculate again this signature, if it is different,
|
|
// we know user has change something and will prompt user to validate if he wants to save, discard or cancel quit.
|
|
// 3o) For many option editors, signature may be computed simply by validating actual controls of the window like
|
|
// checkboxes state, edit box, etc.
|
|
// 4o) For others, we need to run specific computation like signature of list like hot directories list, favorites tabs list, etc.
|
|
// 5o) For some computing the signature with controls should not be done.
|
|
// 6o) Here is a list of function and procedure around that:
|
|
// 7o) "IsSignatureComputedFromAllWindowComponents": Function that may be overloaded by specific option editor to indicate
|
|
// if we may compute signature of controls of the editor or not.
|
|
// By default, it is the case.
|
|
// 8o) "ExtraOptionsSignature": Function that may overloaded by specifica option editor when signature must include extra element not present in controls of the editor like a list of structures, etc.
|
|
// By default, nothing more is required.
|
|
// 9o) "ComputeCompleteOptionsSignature": Will first compute signature based on controls >IF< "IsSignatureComputedFromAllWindowComponents" is not invalidated by specific option editor
|
|
// Then will make progress that signature >IF< "ExtraOptionsSignature" has been overload by specific option editor.
|
|
|
|
TOptionsEditor = class(TFrame)
|
|
private
|
|
FOptionsDialog: IOptionsDialog;
|
|
FLastLoadedOptionSignature: dword;
|
|
protected
|
|
procedure Init; virtual;
|
|
procedure Done; virtual;
|
|
procedure Load; virtual;
|
|
function Save: TOptionsEditorSaveFlags; virtual;
|
|
property OptionsDialog: IOptionsDialog read FOptionsDialog;
|
|
public
|
|
property LastLoadedOptionSignature:dword read FLastLoadedOptionSignature write FLastLoadedOptionSignature; // Let it public so Options Forms will be able to know what was initial signature.
|
|
destructor Destroy; override;
|
|
|
|
class function GetIconIndex: Integer; virtual; abstract;
|
|
class function GetTitle: String; virtual; abstract;
|
|
class function IsEmpty: Boolean; virtual;
|
|
function IsSignatureComputedFromAllWindowComponents: Boolean; virtual;
|
|
function ComputeCompleteOptionsSignature: dword;
|
|
function ExtraOptionsSignature(CurrentSignature:dword):dword; virtual;
|
|
function CanWeClose(var SaveFlags:TOptionsEditorSaveFlags; bForceClose:boolean=false):boolean; virtual;
|
|
|
|
procedure LoadSettings;
|
|
function SaveSettings: TOptionsEditorSaveFlags;
|
|
procedure Init(AParent: TWinControl;
|
|
AOptionsDialog: IOptionsDialog;
|
|
Flags: TOptionsEditorInitFlags);
|
|
end;
|
|
|
|
{ TOptionsEditorRec }
|
|
|
|
TOptionsEditorRec = class
|
|
private
|
|
FChildren: TOptionsEditorClassList;
|
|
FEditorClass: TOptionsEditorClass;
|
|
function GetChildren: TOptionsEditorClassList;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
function Add(Editor: TOptionsEditorClass): TOptionsEditorRec;
|
|
function HasChildren: Boolean;
|
|
property Children: TOptionsEditorClassList read GetChildren;
|
|
property EditorClass: TOptionsEditorClass read FEditorClass write FEditorClass;
|
|
end;
|
|
|
|
{ TBaseOptionsEditorClassList }
|
|
|
|
TBaseOptionsEditorClassList = specialize TFPGObjectList<TOptionsEditorRec>;
|
|
|
|
{ TOptionsEditorClassList }
|
|
|
|
TOptionsEditorClassList = class(TBaseOptionsEditorClassList)
|
|
public
|
|
function Add(Editor: TOptionsEditorClass): TOptionsEditorRec; overload;
|
|
end;
|
|
|
|
var
|
|
OptionsEditorClassList: TOptionsEditorClassList = nil;
|
|
|
|
implementation
|
|
|
|
uses
|
|
uLng,
|
|
uComponentsSignature,
|
|
uShowMsg,
|
|
fOptions,
|
|
fOptionsArchivers,
|
|
fOptionsAutoRefresh,
|
|
fOptionsBehavior,
|
|
fOptionsBriefView,
|
|
fOptionsColumnsView,
|
|
fOptionsConfiguration,
|
|
fOptionsCustomColumns,
|
|
fOptionsDragDrop,
|
|
fOptionsDrivesListButton,
|
|
fOptionsTreeViewMenu,
|
|
fOptionsTreeViewMenuColor,
|
|
fOptionsFileOperations,
|
|
fOptionsFileSearch,
|
|
fOptionsFilePanelsColors,
|
|
fOptionsFileTypesColors,
|
|
fOptionsFilesViews,
|
|
fOptionsFonts,
|
|
fOptionsGroups,
|
|
fOptionsHotkeys,
|
|
fOptionsIcons,
|
|
fOptionsIgnoreList,
|
|
fOptionsKeyboard,
|
|
fOptionsLanguage,
|
|
fOptionsLayout,
|
|
fOptionsLog,
|
|
fOptionsMisc,
|
|
fOptionsMouse,
|
|
fOptionsPlugins,
|
|
fOptionsQuickSearchFilter,
|
|
fOptionsTabs,
|
|
fOptionsFavoriteTabs,
|
|
fOptionsTabsExtra,
|
|
fOptionsTerminal,
|
|
fOptionsToolbar,
|
|
fOptionsTools,
|
|
fOptionsToolsEditor,
|
|
fOptionsToolsDiffer,
|
|
fOptionsEditorColors,
|
|
fOptionsToolTips,
|
|
fOptionsFileAssoc,
|
|
fOptionsFileAssocExtra,
|
|
fOptionsDirectoryHotlist;
|
|
|
|
{ TOptionsEditorRec }
|
|
|
|
function TOptionsEditorRec.GetChildren: TOptionsEditorClassList;
|
|
begin
|
|
if not Assigned(FChildren) then
|
|
FChildren := TOptionsEditorClassList.Create;
|
|
Result := FChildren;
|
|
end;
|
|
|
|
constructor TOptionsEditorRec.Create;
|
|
begin
|
|
FChildren := nil;
|
|
end;
|
|
|
|
destructor TOptionsEditorRec.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
FreeAndNil(FChildren);
|
|
end;
|
|
|
|
function TOptionsEditorRec.Add(Editor: TOptionsEditorClass): TOptionsEditorRec;
|
|
begin
|
|
Result := Children.Add(Editor);
|
|
end;
|
|
|
|
function TOptionsEditorRec.HasChildren: Boolean;
|
|
begin
|
|
Result := Assigned(FChildren) and (FChildren.Count > 0);
|
|
end;
|
|
|
|
{ TOptionsEditorClassList }
|
|
|
|
function TOptionsEditorClassList.Add(Editor: TOptionsEditorClass): TOptionsEditorRec;
|
|
begin
|
|
Result := TOptionsEditorRec.Create;
|
|
Add(Result);
|
|
Result.EditorClass:= Editor;
|
|
end;
|
|
|
|
{ TOptionsEditor }
|
|
|
|
procedure TOptionsEditor.Init;
|
|
begin
|
|
// Empty.
|
|
end;
|
|
|
|
{ TOptionsEditor.ExtraOptionsSignature }
|
|
function TOptionsEditor.ExtraOptionsSignature(CurrentSignature:dword):dword;
|
|
begin
|
|
result := CurrentSignature;
|
|
end;
|
|
|
|
{ TOptionsEditor.ComputeCompleteOptionsSignature }
|
|
function TOptionsEditor.ComputeCompleteOptionsSignature:dword;
|
|
begin
|
|
result := $000000;
|
|
|
|
if IsSignatureComputedFromAllWindowComponents then
|
|
result := ComputeSignatureBasedOnComponent(Self, result);
|
|
|
|
result := ExtraOptionsSignature(result);
|
|
end;
|
|
|
|
{ TOptionsEditor.CanWeClose }
|
|
function TOptionsEditor.CanWeClose(var SaveFlags:TOptionsEditorSaveFlags; bForceClose:boolean=false):boolean;
|
|
var
|
|
Answer: TMyMsgResult;
|
|
begin
|
|
SaveFlags:=[];
|
|
|
|
if bForceClose then
|
|
result:=True
|
|
else
|
|
result := (FLastLoadedOptionSignature = ComputeCompleteOptionsSignature);
|
|
|
|
if (not result) OR bForceClose then
|
|
begin
|
|
if bForceClose then
|
|
begin
|
|
Answer:=mmrYes;
|
|
end
|
|
else
|
|
begin
|
|
ShowOptions(Self.ClassName);
|
|
Answer := MsgBox(Format(rsOptionsEditorOptionsChanged, [GetTitle]), [msmbYes, msmbNo, msmbCancel], msmbCancel, msmbCancel);
|
|
end;
|
|
|
|
case Answer of
|
|
mmrYes:
|
|
begin
|
|
SaveFlags := SaveSettings;
|
|
result := True;
|
|
end;
|
|
|
|
mmrNo: result := True;
|
|
else
|
|
result := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TOptionsEditor.Done;
|
|
begin
|
|
// Empty.
|
|
end;
|
|
|
|
destructor TOptionsEditor.Destroy;
|
|
begin
|
|
Done;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
class function TOptionsEditor.IsEmpty: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
{ TOptionsEditor.IsSignatureComputedFromAllWindowComponents }
|
|
function TOptionsEditor.IsSignatureComputedFromAllWindowComponents: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TOptionsEditor.LoadSettings;
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
Load;
|
|
FLastLoadedOptionSignature := ComputeCompleteOptionsSignature;
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
|
|
function TOptionsEditor.SaveSettings: TOptionsEditorSaveFlags;
|
|
begin
|
|
Result := Save;
|
|
FLastLoadedOptionSignature := ComputeCompleteOptionsSignature;
|
|
end;
|
|
|
|
procedure TOptionsEditor.Load;
|
|
begin
|
|
// Empty.
|
|
end;
|
|
|
|
function TOptionsEditor.Save: TOptionsEditorSaveFlags;
|
|
begin
|
|
Result := [];
|
|
end;
|
|
|
|
procedure TOptionsEditor.Init(AParent: TWinControl;
|
|
AOptionsDialog: IOptionsDialog;
|
|
Flags: TOptionsEditorInitFlags);
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
Parent := AParent;
|
|
FOptionsDialog := AOptionsDialog;
|
|
Init;
|
|
if oeifLoad in Flags then
|
|
LoadSettings;
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
|
|
procedure MakeEditorsClassList;
|
|
var
|
|
Main: TOptionsEditorClassList absolute OptionsEditorClassList;
|
|
Colors, ColumnsView, FilesViews, Keyboard, Layout, Mouse, Tools, Editor,
|
|
FileAssoc, FileOperation, FolderTabs: TOptionsEditorRec;
|
|
begin
|
|
Main.Add(TfrmOptionsLanguage);
|
|
Main.Add(TfrmOptionsBehavior);
|
|
Tools := Main.Add(TOptionsToolsGroup);
|
|
Tools.Add(TfrmOptionsViewer);
|
|
Editor:= Tools.Add(TfrmOptionsEditor);
|
|
Editor.Add(TfrmOptionsEditorColors);
|
|
Tools.Add(TfrmOptionsDiffer);
|
|
Tools.Add(TfrmOptionsTerminal);
|
|
Main.Add(TfrmOptionsFonts);
|
|
Colors := Main.Add(TOptionsColorsGroup);
|
|
Colors.Add(TfrmOptionsFilePanelsColors);
|
|
Colors.Add(TfrmOptionsFileTypesColors);
|
|
Keyboard := Main.Add(TfrmOptionsKeyboard);
|
|
Keyboard.Add(TfrmOptionsHotkeys);
|
|
Mouse := Main.Add(TfrmOptionsMouse);
|
|
Mouse.Add(TfrmOptionsDragDrop);
|
|
FilesViews := Main.Add(TfrmOptionsFilesViews);
|
|
FilesViews.Add(TfrmOptionsBriefView);
|
|
ColumnsView := FilesViews.Add(TfrmOptionsColumnsView);
|
|
ColumnsView.Add(TfrmOptionsCustomColumns);
|
|
Main.Add(TfrmOptionsPlugins);
|
|
Layout := Main.Add(TfrmOptionsLayout);
|
|
Layout.Add(TfrmOptionsDrivesListButton);
|
|
Layout.Add(TfrmOptionsTreeViewMenu);
|
|
Layout.Add(TfrmOptionsTreeViewMenuColor);
|
|
Main.Add(TfrmOptionsToolbar);
|
|
FileOperation := Main.Add(TfrmOptionsFileOperations);
|
|
FileOperation.Add(TfrmOptionsFileSearch);
|
|
FolderTabs := Main.Add(TfrmOptionsTabs);
|
|
FolderTabs.Add(TfrmOptionsFavoriteTabs);
|
|
FolderTabs.Add(TfrmOptionsTabsExtra);
|
|
Main.Add(TfrmOptionsLog);
|
|
Main.Add(TfrmOptionsConfiguration);
|
|
Main.Add(TfrmOptionsQuickSearchFilter);
|
|
Main.Add(TfrmOptionsMisc);
|
|
Main.Add(TfrmOptionsAutoRefresh);
|
|
Main.Add(TfrmOptionsIcons);
|
|
Main.Add(TfrmOptionsIgnoreList);
|
|
Main.Add(TfrmOptionsArchivers);
|
|
Main.Add(TfrmOptionsToolTips);
|
|
FileAssoc := Main.Add(TfrmOptionsFileAssoc);
|
|
FileAssoc.Add(TfrmOptionsFileAssocExtra);
|
|
Main.Add(TfrmOptionsDirectoryHotlist);
|
|
end;
|
|
|
|
initialization
|
|
OptionsEditorClassList:= TOptionsEditorClassList.Create;
|
|
MakeEditorsClassList;
|
|
|
|
finalization
|
|
if Assigned(OptionsEditorClassList) then
|
|
FreeAndNil(OptionsEditorClassList);
|
|
|
|
end.
|
|
|