diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2010-03-27 21:12:10 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2010-03-27 21:12:10 +0100 |
| commit | 6fdb16ee503199c431e875e96f42dd89cfb13c92 (patch) | |
| tree | 51d0ece1ac37c44db8aada18e417e8b6e5974e08 /UMain.pas | |
| parent | 6cfb7975c083098e2e2ec4746fca21dc16c0dc02 (diff) | |
| download | tuxcmd-0.6.78.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.pas | 112 |
1 files changed, 112 insertions, 0 deletions
@@ -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. |
