summaryrefslogtreecommitdiff
path: root/UMain.pas
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2010-03-27 21:12:10 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2010-03-27 21:12:10 +0100
commit6fdb16ee503199c431e875e96f42dd89cfb13c92 (patch)
tree51d0ece1ac37c44db8aada18e417e8b6e5974e08 /UMain.pas
parent6cfb7975c083098e2e2ec4746fca21dc16c0dc02 (diff)
downloadtuxcmd-6fdb16ee503199c431e875e96f42dd89cfb13c92.tar.xz
File and directory diff commandsv0.6.78
TODO: add GUI to configure diff commands TODO: extract only particular subtree when comparing directories from VFS engines
Diffstat (limited to 'UMain.pas')
-rw-r--r--UMain.pas112
1 files changed, 112 insertions, 0 deletions
diff --git a/UMain.pas b/UMain.pas
index da3753b..065cc08 100644
--- a/UMain.pas
+++ b/UMain.pas
@@ -90,6 +90,7 @@ type
LeftPasswordButton, RightPasswordButton: TGTKImageButton;
PathBoxPopupMenu: TGTKMenuItem;
miPathBoxRefresh, miPathBoxCopyPath: TGTKMenuItem;
+ miDiff, miSynchronizeDirs: TGTKMenuItem;
procedure FormCreate(Sender: TObject); override;
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
@@ -183,6 +184,8 @@ type
procedure miCopyNamesClick(Sender: TObject);
procedure RightMouseSelectPopupTimerTimer(Sender: TObject);
procedure miQuickConnectClick(Sender: TObject);
+ procedure miDiffClick(Sender: TObject);
+ procedure miSynchronizeDirsClick(Sender: TObject);
private
LeftLastFocused, Editing, QuickFind, RedrawLeftInactive, RedrawRightInactive, StartUp, LeftTabPopup: boolean;
LastWidth, RunningEscSensitive: integer;
@@ -748,6 +751,15 @@ begin
miCreateChecksums.OnClick := miCreateChecksumsClick;
mnuFile.Add(miCreateChecksums);
mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator));
+ miDiff := TGTKMenuItem.Create(Self);
+ miDiff.Caption := '_Diff';
+ miDiff.OnClick := miDiffClick;
+ mnuFile.Add(miDiff);
+ miSynchronizeDirs := TGTKMenuItem.Create(Self);
+ miSynchronizeDirs.Caption := 'S_ynchronize directories';
+ miSynchronizeDirs.OnClick := miSynchronizeDirsClick;
+ mnuFile.Add(miSynchronizeDirs);
+ mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator));
miExit := TGTKMenuItem.CreateTyped(Self, itImageText);
miExit.Caption := LANGmiExit_Caption;
miExit.StockIcon := 'gtk-quit';
@@ -6504,5 +6516,105 @@ begin
end;
+(********************************************************************************************************************************)
+procedure TFMain.miDiffClick(Sender: TObject);
+var LeftPanel: boolean;
+ SourceListView, TargetListView: TGTKListView;
+ SourceEngine, TargetEngine: TPanelEngine;
+ SourceFile, TargetFile: string;
+ Error: integer;
+begin
+ if LeftListView.Focused then LeftPanel := True else
+ if RightListView.Focused then LeftPanel := False else
+ LeftPanel := LeftLastFocused;
+ if LeftPanel then begin
+ SourceListView := LeftListView;
+ TargetListView := RightListView;
+ SourceEngine := LeftPanelEngine;
+ TargetEngine := RightPanelEngine;
+ end else begin
+ SourceListView := RightListView;
+ TargetListView := LeftListView;
+ SourceEngine := RightPanelEngine;
+ TargetEngine := LeftPanelEngine;
+ end;
+
+ if (not Assigned(SourceListView.Selected)) or (not Assigned(SourceListView.Selected.Data)) or PDataItem(SourceListView.Selected.Data)^.IsDir or
+ PDataItem(SourceListView.Selected.Data)^.UpDir then
+ begin
+ Application.MessageBox(LANGYouMustSelectAValidFile, [mbOK], mbError, mbNone, mbOK);
+ Exit;
+ end;
+
+ SourceFile := IncludeTrailingPathDelimiter(SourceEngine.Path) + PDataItem(SourceListView.Selected.Data)^.FName;
+ TargetFile := '';
+ if Assigned(TargetListView.Selected) and Assigned(TargetListView.Selected.Data) and
+ (not PDataItem(TargetListView.Selected.Data)^.IsDir) and (not PDataItem(TargetListView.Selected.Data)^.UpDir)
+ then TargetFile := IncludeTrailingPathDelimiter(TargetEngine.Path) + PDataItem(TargetListView.Selected.Data)^.FName;
+
+ if SourceEngine is TVFSEngine then
+ if not HandleRunFromArchive(SourceFile, SourceEngine, '', '', True) then Exit;
+
+ if (Length(TargetFile) > 0) and (TargetEngine is TVFSEngine) then
+ if not HandleRunFromArchive(TargetFile, TargetEngine, '', '', True) then Exit;
+
+ if not ExecuteProgram(Format('%s %s %s', [ConfDiffCommand, QuoteStr(SourceFile), QuoteStr(TargetFile)]), SourceEngine.Path, ConfDiffTerminalBehaviour = 0, ConfDiffTerminalBehaviour = 1, Error) then
+ Application.MessageBox(Format(LANGCannotExecuteSPleaseCheckTheConfiguration, [ConfDiffCommand]), [mbOK], mbError, mbNone, mbOK);
+end;
+
+procedure TFMain.miSynchronizeDirsClick(Sender: TObject);
+var LeftPanel: boolean;
+ SourceListView, TargetListView: TGTKListView;
+ SourceEngine, TargetEngine: TPanelEngine;
+ SourceDir, TargetDir: string;
+ Error: integer;
+begin
+ if LeftListView.Focused then LeftPanel := True else
+ if RightListView.Focused then LeftPanel := False else
+ LeftPanel := LeftLastFocused;
+ if LeftPanel then begin
+ SourceListView := LeftListView;
+ TargetListView := RightListView;
+ SourceEngine := LeftPanelEngine;
+ TargetEngine := RightPanelEngine;
+ end else begin
+ SourceListView := RightListView;
+ TargetListView := LeftListView;
+ SourceEngine := RightPanelEngine;
+ TargetEngine := LeftPanelEngine;
+ end;
+
+ if (not Assigned(SourceListView.Selected)) or (not Assigned(SourceListView.Selected.Data)) or
+ ((not PDataItem(SourceListView.Selected.Data)^.IsDir) and (not PDataItem(SourceListView.Selected.Data)^.UpDir)) then
+ begin
+ Application.MessageBox('You must select directory!', [mbOK], mbError, mbNone, mbOK);
+ Exit;
+ end;
+
+ if PDataItem(SourceListView.Selected.Data)^.UpDir
+ then SourceDir := IncludeTrailingPathDelimiter(SourceEngine.Path)
+ else SourceDir := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(SourceEngine.Path) + PDataItem(SourceListView.Selected.Data)^.FName);
+
+ TargetDir := '';
+ if Assigned(TargetListView.Selected) and Assigned(TargetListView.Selected.Data) and
+ (PDataItem(TargetListView.Selected.Data)^.IsDir or PDataItem(TargetListView.Selected.Data)^.UpDir) then
+ begin
+ if PDataItem(TargetListView.Selected.Data)^.UpDir
+ then TargetDir := IncludeTrailingPathDelimiter(TargetEngine.Path)
+ else TargetDir := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(TargetEngine.Path) + PDataItem(TargetListView.Selected.Data)^.FName);
+ end;
+
+ //* TODO: extract only particular subtree, also use ExtractFromArchive directly instead
+ if SourceEngine is TVFSEngine then
+ if not HandleRunFromArchive(SourceDir, SourceEngine, '', '', True) then Exit;
+
+ if (Length(TargetDir) > 0) and (TargetEngine is TVFSEngine) then
+ if not HandleRunFromArchive(TargetDir, TargetEngine, '', '', True) then Exit;
+
+ if not ExecuteProgram(Format('%s %s %s', [ConfDiffDirCommand, QuoteStr(SourceDir), QuoteStr(TargetDir)]), SourceEngine.Path, ConfDiffDirTerminalBehaviour = 0, ConfDiffDirTerminalBehaviour = 1, Error) then
+ Application.MessageBox(Format(LANGCannotExecuteSPleaseCheckTheConfiguration, [ConfDiffDirCommand]), [mbOK], mbError, mbNone, mbOK);
+end;
+
+
end.