ADD: Option to choose position of panel after a compare (patch by Denis Bisson)

This commit is contained in:
Alexander Koblov 2015-01-04 21:48:23 +00:00
commit e6c76c27e1
10 changed files with 240 additions and 61 deletions

View file

@ -295,7 +295,7 @@ end;"/>
<MinVersion Minor="3" Valid="True"/>
</Item11>
</RequiredPackages>
<Units Count="218">
<Units Count="219">
<Unit0>
<Filename Value="doublecmd.lpr"/>
<IsPartOfProject Value="True"/>
@ -1577,6 +1577,14 @@ end;"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uMimeType"/>
</Unit217>
<Unit218>
<Filename Value="frames\foptionstoolsdiffer.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmOptionsDiffer"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="fOptionsToolsDiffer"/>
</Unit218>
</Units>
</ProjectOptions>
<CompilerOptions>

View file

@ -150,14 +150,17 @@ end;
procedure TfrmOptions.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
I:integer;
NeedsUpdateWindowView:boolean=FALSE;
begin
CanClose:=TRUE;
I:=0;
while (I<FOptionsEditorList.Count) AND (CanClose) do
begin
if Assigned(FOptionsEditorList[I].Instance) then CanClose:=FOptionsEditorList[I].Instance.CanWeClose;
if Assigned(FOptionsEditorList[I].Instance) then CanClose:=FOptionsEditorList[I].Instance.CanWeClose(NeedsUpdateWindowView);
inc(I);
end;
if NeedsUpdateWindowView then frmMain.UpdateWindowView;
end;
procedure TfrmOptions.btnCancelClick(Sender: TObject);

View file

@ -178,7 +178,7 @@ type
class function GetIconIndex: Integer; override;
class function GetTitle: String; override;
destructor Destroy; override;
function CanWeClose: boolean; override;
function CanWeClose(var WillNeedUpdateWindowView:boolean): boolean; override;
procedure SubmitToAddOrConfigToHotDirDlg(paramActionDispatcher,paramPath,paramTarget,paramOptionalIndex: string);
end;
@ -288,7 +288,7 @@ begin
end;
{ TfrmOptionsDirectoryHotlist.CanWeClose }
function TfrmOptionsDirectoryHotlist.CanWeClose: boolean;
function TfrmOptionsDirectoryHotlist.CanWeClose(var WillNeedUpdateWindowView:boolean): boolean;
var
Answer:TMyMsgResult;
begin

View file

@ -1,3 +1,25 @@
{
Double Commander
-------------------------------------------------------------------------
Options frame page
Copyright (C) 2006-2014 Koblov Alexander (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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit fOptionsFrame;
{$mode objfpc}{$H+}
@ -50,7 +72,7 @@ type
procedure Init(AParent: TWinControl;
AOptionsDialog: IOptionsDialog;
Flags: TOptionsEditorInitFlags);
function CanWeClose:boolean; virtual;
function CanWeClose(var WillNeedUpdateWindowView:boolean):boolean; virtual;
end;
{ TOptionsEditorRec }
@ -115,6 +137,7 @@ uses
fOptionsTerminal,
fOptionsToolbar,
fOptionsTools,
fOptionsToolsDiffer,
fOptionsEditorColors,
fOptionsToolTips,
fOptionsDirectoryHotlist;
@ -165,7 +188,7 @@ begin
// Empty.
end;
function TOptionsEditor.CanWeClose:boolean;
function TOptionsEditor.CanWeClose(var WillNeedUpdateWindowView:boolean): boolean;
begin
result:=TRUE;
end;

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
Tools options page
Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru)
Copyright (C) 2006-2014 Koblov Alexander (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
@ -64,17 +64,6 @@ type
class function GetTitle: String; override;
end;
{ TfrmOptionsDiffer }
TfrmOptionsDiffer = class(TfrmOptionsToolBase)
protected
procedure Init; override;
public
constructor Create(TheOwner: TComponent); override;
class function GetIconIndex: Integer; override;
class function GetTitle: String; override;
end;
{ TfrmOptionsEditor }
TfrmOptionsEditor = class(TfrmOptionsToolBase)
@ -216,29 +205,5 @@ begin
Result := rsToolEditor;
end;
{ TfrmOptionsDiffer }
procedure TfrmOptionsDiffer.Init;
begin
ExternalTool := etDiffer;
inherited Init;
end;
constructor TfrmOptionsDiffer.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Name := 'frmOptionsDiffer';
end;
class function TfrmOptionsDiffer.GetIconIndex: Integer;
begin
Result := 25;
end;
class function TfrmOptionsDiffer.GetTitle: String;
begin
Result := rsToolDiffer;
end;
end.

View file

@ -0,0 +1,66 @@
inherited frmOptionsDiffer: TfrmOptionsDiffer
Height = 478
Width = 586
ClientHeight = 478
ClientWidth = 586
DesignLeft = 377
DesignTop = 160
inherited edtToolsParameters: TEdit
Top = 113
end
inherited fneToolsPath: TFileNameEdit
Top = 61
end
inherited lblToolsPath: TLabel
Height = 15
Width = 144
end
inherited lblToolsParameters: TLabel
Height = 15
Top = 94
Width = 117
end
inherited cbToolsKeepTerminalOpen: TCheckBox
Top = 169
end
inherited cbToolsRunInTerminal: TCheckBox
Top = 148
end
inherited btnRelativeToolPath: TSpeedButton
Top = 61
end
object rgResultingFramePositionAfterCompare: TRadioGroup[8]
AnchorSideLeft.Control = edtToolsParameters
AnchorSideTop.Control = cbToolsKeepTerminalOpen
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtToolsParameters
AnchorSideRight.Side = asrBottom
Left = 8
Height = 65
Top = 200
Width = 571
Anchors = [akTop, akLeft, akRight]
AutoFill = True
BorderSpacing.Top = 12
Caption = 'Position of frame panel after the comparison:'
ChildSizing.LeftRightSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
ClientHeight = 47
ClientWidth = 567
ItemIndex = 0
Items.Strings = (
'Active frame panel on left, inactive on right (legacy)'
'Left frame panel on left, right on right'
)
TabOrder = 5
end
inherited pmPathHelper: TPopupMenu[9]
left = 464
top = 8
end
end

View file

@ -0,0 +1 @@
TFRMOPTIONSDIFFER.RGRESULTINGFRAMEPOSITIONAFTERCOMPARE.CAPTION=Position of frame panel after the comparison:

View file

@ -0,0 +1,86 @@
{
Double Commander
-------------------------------------------------------------------------
Tools options page for the differ tool
Copyright (C) 2006-2014 Koblov Alexander (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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit fOptionsToolsDiffer;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, StdCtrls, Spin, ExtCtrls, ColorBox, Dialogs, EditBtn,
Buttons, Menus, Types, fOptionsFrame, fOptionsToolBase;
type
{ TfrmOptionsDiffer }
TfrmOptionsDiffer = class(TfrmOptionsToolBase)
rgResultingFramePositionAfterCompare: TRadioGroup;
protected
procedure Init; override;
procedure Load; override;
function Save: TOptionsEditorSaveFlags; override;
public
class function GetIconIndex: Integer; override;
class function GetTitle: String; override;
end;
implementation
{$R *.lfm}
uses
uDCUtils, uGlobs, uLng;
{ TfrmOptionsDiffer }
procedure TfrmOptionsDiffer.Init;
begin
ExternalTool := etDiffer;
inherited Init;
end;
procedure TfrmOptionsDiffer.Load;
begin
inherited;
rgResultingFramePositionAfterCompare.ItemIndex := Integer(gResultingFramePositionAfterCompare);
end;
function TfrmOptionsDiffer.Save: TOptionsEditorSaveFlags;
begin
Result := inherited;
gResultingFramePositionAfterCompare := TResultingFramePositionAfterCompare(rgResultingFramePositionAfterCompare.ItemIndex);
end;
class function TfrmOptionsDiffer.GetIconIndex: Integer;
begin
Result := 25;
end;
class function TfrmOptionsDiffer.GetTitle: String;
begin
Result := rsToolDiffer;
end;
end.

View file

@ -75,6 +75,7 @@ type
KeepTerminalOpen: Boolean;
end;
TExternalToolsOptions = array[TExternalTool] of TExternalToolOptions;
TResultingFramePositionAfterCompare = (rfpacActiveOnLeft, rfpacLeftOnLeft);
TDCFont = (dcfMain, dcfViewer, dcfEditor, dcfLog, dcfViewerBook);
TDCFontOptions = record
@ -220,6 +221,7 @@ var
{ Tools page }
gExternalTools: TExternalToolsOptions;
gResultingFramePositionAfterCompare:TResultingFramePositionAfterCompare;
gLuaLib:String;
gExts:TExts;
gColorExt:TColorExt;
@ -526,30 +528,30 @@ begin
Result := True;
end;
function LoadGlobalConfig(var ErrorMessage: String): Boolean;
function LoadGlobalConfig(var {%H-}ErrorMessage: String): Boolean;
begin
Result := gConfig.Load;
end;
function LoadExtsConfig(var ErrorMessage: String): Boolean;
function LoadExtsConfig(var {%H-}ErrorMessage: String): Boolean;
begin
gExts.LoadFromFile(gpCfgDir + 'doublecmd.ext');
Result := True;
end;
function LoadHotManConfig(var ErrorMessage: String): Boolean;
function LoadHotManConfig(var {%H-}ErrorMessage: String): Boolean;
begin
HotMan.Load(gpCfgDir + gNameSCFile);
Result := True;
end;
function LoadMultiArcConfig(var ErrorMessage: String): Boolean;
function LoadMultiArcConfig(var {%H-}ErrorMessage: String): Boolean;
begin
gMultiArcList.LoadFromFile(gpCfgDir + 'multiarc.ini');
Result := True;
end;
function LoadHistoryConfig(var ErrorMessage: String): Boolean;
function LoadHistoryConfig(var {%H-}ErrorMessage: String): Boolean;
var
Root: TXmlNode;
History: TXmlConfig;
@ -1040,6 +1042,9 @@ begin
SetDefaultExternalTool(gExternalTools[etEditor]);
SetDefaultExternalTool(gExternalTools[etDiffer]);
{ Differ related}
gResultingFramePositionAfterCompare := rfpacActiveOnLeft;
{ Fonts page }
gFonts[dcfMain].Name := 'default';
gFonts[dcfMain].Size := 10;
@ -1746,8 +1751,6 @@ var
end;
procedure SaveIniConfig;
var
I: LongInt;
begin
{ Layout page }
@ -2011,6 +2014,11 @@ begin
GetExtTool(gConfig.FindNode(Root, 'Tools/Editor'), gExternalTools[etEditor]);
GetExtTool(gConfig.FindNode(Root, 'Tools/Differ'), gExternalTools[etDiffer]);
{ Differ related}
Node := Root.FindNode('Tools');
SubNode := FindNode(Node, 'Differ', TRUE);
gResultingFramePositionAfterCompare := TResultingFramePositionAfterCompare(GetValue(SubNode, 'FramePosAfterComp', Integer(gResultingFramePositionAfterCompare)));
{ Fonts page }
GetDCFont(gConfig.FindNode(Root, 'Fonts/Main'), gFonts[dcfMain]);
GetDCFont(gConfig.FindNode(Root, 'Fonts/Editor'), gFonts[dcfEditor]);
@ -2325,7 +2333,7 @@ begin
gNameSCFile:= GetValue(Root, 'NameShortcutFile', gNameSCFile);
gLastUsedPacker:= GetValue(Root, 'LastUsedPacker', gLastUsedPacker);
gUseShellForFileOperations:= GetValue(Root, 'UseShellForFileOperations', gUseShellForFileOperations);
end;
end;
{ Search template list }
gSearchTemplateList.LoadFromXml(gConfig, Root);
@ -2365,7 +2373,6 @@ procedure SaveXmlConfig;
gConfig.SetFont(Node, '', FontOptions.Name, FontOptions.Size, Integer(FontOptions.Style));
end;
var
I: Integer;
Root, Node, SubNode: TXmlNode;
KeyTypingModifier: TKeyTypingModifier;
begin
@ -2418,6 +2425,11 @@ begin
SetExtTool(gConfig.FindNode(Root, 'Tools/Editor', True), gExternalTools[etEditor]);
SetExtTool(gConfig.FindNode(Root, 'Tools/Differ', True), gExternalTools[etDiffer]);
{ Differ related}
Node := Root.FindNode('Tools');
SubNode := FindNode(Node, 'Differ', TRUE);
SetValue(SubNode, 'FramePosAfterComp', Integer(gResultingFramePositionAfterCompare));
{ Fonts page }
SetDCFont(gConfig.FindNode(Root, 'Fonts/Main', True), gFonts[dcfMain]);
SetDCFont(gConfig.FindNode(Root, 'Fonts/Editor', True), gFonts[dcfEditor]);
@ -2636,7 +2648,7 @@ begin
SetValue(Root, 'NameShortcutFile', gNameSCFile);
SetValue(Root, 'LastUsedPacker', gLastUsedPacker);
SetValue(Root, 'UseShellForFileOperations', gUseShellForFileOperations);
end;
end;
{ Search template list }
gSearchTemplateList.SaveToXml(gConfig, Root);

View file

@ -2023,9 +2023,24 @@ var
ActiveSelectedFiles: TFiles = nil;
NotActiveSelectedFiles: TFiles = nil;
Param: String;
FrameThatWillBeOnLeftAfterCompare, FrameThatWillBeOnRightAfterCompare: TFileView;
begin
with frmMain do
begin
case gResultingFramePositionAfterCompare of
rfpacActiveOnLeft:
begin;
FrameThatWillBeOnLeftAfterCompare:=ActiveFrame;
FrameThatWillBeOnRightAfterCompare:=NotActiveFrame;
end;
rfpacLeftOnLeft:
begin
FrameThatWillBeOnLeftAfterCompare:=FrameLeft;
FrameThatWillBeOnRightAfterCompare:=FrameRight;
end;
end;
// For now work only for filesystem.
// Later use temporary file system for other file sources.
@ -2042,37 +2057,37 @@ begin
else
begin
// For now work only for filesystem.
if not (ActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then
if not (FrameThatWillBeOnLeftAfterCompare.FileSource.IsClass(TFileSystemFileSource)) then
begin
msgWarning(rsMsgNotImplemented);
Exit;
end;
try
ActiveSelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles;
ActiveSelectedFiles := FrameThatWillBeOnLeftAfterCompare.CloneSelectedOrActiveFiles;
if ActiveSelectedFiles.Count = 1 then
begin
// If no files selected in the opposite panel and panels have
// different path then try to get file with the same name.
if (not NotActiveFrame.HasSelectedFiles) and (not mbCompareFileNames(NotActiveFrame.CurrentPath, ActiveFrame.CurrentPath)) then
if (not FrameThatWillBeOnRightAfterCompare.HasSelectedFiles) and (not mbCompareFileNames(FrameThatWillBeOnRightAfterCompare.CurrentPath, FrameThatWillBeOnLeftAfterCompare.CurrentPath)) then
begin
for i := 0 to NotActiveFrame.DisplayFiles.Count - 1 do
if NotActiveFrame.DisplayFiles[i].FSFile.Name = ActiveSelectedFiles[0].Name then
for i := 0 to FrameThatWillBeOnRightAfterCompare.DisplayFiles.Count - 1 do
if FrameThatWillBeOnRightAfterCompare.DisplayFiles[i].FSFile.Name = ActiveSelectedFiles[0].Name then
begin
NotActiveSelectedFiles := TFiles.Create(NotActiveFrame.CurrentPath);
NotActiveSelectedFiles.Add(NotActiveFrame.DisplayFiles[i].FSFile.Clone);
NotActiveSelectedFiles := TFiles.Create(FrameThatWillBeOnRightAfterCompare.CurrentPath);
NotActiveSelectedFiles.Add(FrameThatWillBeOnRightAfterCompare.DisplayFiles[i].FSFile.Clone);
Break;
end;
end;
if not Assigned(NotActiveSelectedFiles) then
NotActiveSelectedFiles := NotActiveFrame.CloneSelectedOrActiveFiles;
NotActiveSelectedFiles := FrameThatWillBeOnRightAfterCompare.CloneSelectedOrActiveFiles;
if NotActiveSelectedFiles.Count = 1 then
begin
// For now work only for filesystem.
if not (NotActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then
if not (FrameThatWillBeOnRightAfterCompare.FileSource.IsClass(TFileSystemFileSource)) then
begin
msgWarning(rsMsgNotImplemented);
Exit;