소스 검색

On Synchronization Checklist window, local and remote directories can be opened in Windows Explorer and another instance of WinSCP, respectively

Source commit: c7b14c2c5673be35723aee7d00e88d2641330dd4
Martin Prikryl 6 년 전
부모
커밋
084a35d7a7

+ 32 - 6
source/forms/CustomScpExplorer.cpp

@@ -4755,13 +4755,10 @@ void __fastcall TCustomScpExplorerForm::NewSession(bool FromSite, const UnicodeS
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall TCustomScpExplorerForm::CreateHiddenDuplicateSession()
+UnicodeString __fastcall TCustomScpExplorerForm::SaveHiddenDuplicateSession(TSessionData * SessionData)
 {
 {
   UnicodeString SessionName = StoredSessions->HiddenPrefix + Terminal->SessionData->SessionName;
   UnicodeString SessionName = StoredSessions->HiddenPrefix + Terminal->SessionData->SessionName;
-
-  // current working directories become defaults here, what is not right
-  std::unique_ptr<TSessionData> SessionData(CloneCurrentSessionData());
-  StoredSessions->NewSession(SessionName, SessionData.get());
+  StoredSessions->NewSession(SessionName, SessionData);
   // modified only, explicit
   // modified only, explicit
   StoredSessions->Save(false, true);
   StoredSessions->Save(false, true);
 
 
@@ -4769,6 +4766,13 @@ UnicodeString __fastcall TCustomScpExplorerForm::CreateHiddenDuplicateSession()
   return EncodeUrlString(SessionName);
   return EncodeUrlString(SessionName);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
+UnicodeString __fastcall TCustomScpExplorerForm::CreateHiddenDuplicateSession()
+{
+  // current working directories become defaults here, what is not right
+  std::unique_ptr<TSessionData> SessionData(CloneCurrentSessionData());
+  return SaveHiddenDuplicateSession(SessionData.get());
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::DuplicateSession()
 void __fastcall TCustomScpExplorerForm::DuplicateSession()
 {
 {
   if (OpenInNewWindow())
   if (OpenInNewWindow())
@@ -5726,6 +5730,28 @@ void __fastcall TCustomScpExplorerForm::DoSynchronizeMove(
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::DoSynchronizeBrowse(TOperationSide Side, const TSynchronizeChecklist::TItem * Item)
+{
+  UnicodeString LocalPath = ExcludeTrailingBackslash(Item->Local.Directory);
+  if (Side == osLocal)
+  {
+    OpenFolderInExplorer(LocalPath);
+  }
+  else if (DebugAlwaysTrue(Side == osRemote))
+  {
+    // Similar to CreateHiddenDuplicateSession, except that it modifies the initial directories
+    std::unique_ptr<TSessionData> SessionData(CloneCurrentSessionData());
+    SessionData->RemoteDirectory = UnixExcludeTrailingBackslash(Item->Remote.Directory);
+    if (!LocalPath.IsEmpty())
+    {
+      SessionData->LocalDirectory = LocalPath;
+    }
+
+    UnicodeString SessionName = SaveHiddenDuplicateSession(SessionData.get());
+    ExecuteNewInstance(SessionName);
+  }
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::FullSynchronizeInNewWindow(
 void __fastcall TCustomScpExplorerForm::FullSynchronizeInNewWindow(
   TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
   TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
    const TCopyParamType * CopyParams)
    const TCopyParamType * CopyParams)
@@ -5835,7 +5861,7 @@ int __fastcall TCustomScpExplorerForm::DoFullSynchronizeDirectories(
         {
         {
           if (!DoSynchronizeChecklistDialog(
           if (!DoSynchronizeChecklistDialog(
                 Checklist, Mode, Params, LocalDirectory, RemoteDirectory, CustomCommandMenu, DoFullSynchronize,
                 Checklist, Mode, Params, LocalDirectory, RemoteDirectory, CustomCommandMenu, DoFullSynchronize,
-                DoSynchronizeChecklistCalculateSize, DoSynchronizeMove, &SynchronizeParams))
+                DoSynchronizeChecklistCalculateSize, DoSynchronizeMove, DoSynchronizeBrowse, &SynchronizeParams))
           {
           {
             Result = -1;
             Result = -1;
           }
           }

+ 2 - 0
source/forms/CustomScpExplorer.h

@@ -660,6 +660,7 @@ protected:
     TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
     TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
   void __fastcall DoSynchronizeMove(
   void __fastcall DoSynchronizeMove(
     TOperationSide Side, const UnicodeString & FileName, const UnicodeString & NewFileName, TRemoteFile * RemoteFile);
     TOperationSide Side, const UnicodeString & FileName, const UnicodeString & NewFileName, TRemoteFile * RemoteFile);
+  void __fastcall DoSynchronizeBrowse(TOperationSide Side, const TSynchronizeChecklist::TItem * Item);
   void __fastcall FullSynchronize(
   void __fastcall FullSynchronize(
     TSynchronizeParams & Params, TProcessedSynchronizationChecklistItem OnProcessedItem,
     TSynchronizeParams & Params, TProcessedSynchronizationChecklistItem OnProcessedItem,
     TUpdatedSynchronizationChecklistItems OnUpdatedSynchronizationChecklistItems);
     TUpdatedSynchronizationChecklistItems OnUpdatedSynchronizationChecklistItems);
@@ -731,6 +732,7 @@ public:
   __fastcall TCustomScpExplorerForm(TComponent* Owner);
   __fastcall TCustomScpExplorerForm(TComponent* Owner);
   void __fastcall SaveCurrentSession();
   void __fastcall SaveCurrentSession();
   UnicodeString __fastcall CreateHiddenDuplicateSession();
   UnicodeString __fastcall CreateHiddenDuplicateSession();
+  UnicodeString __fastcall SaveHiddenDuplicateSession(TSessionData * SessionData);
   TSessionData * __fastcall CloneCurrentSessionData();
   TSessionData * __fastcall CloneCurrentSessionData();
   bool __fastcall SaveWorkspace(bool EnableAutoSave);
   bool __fastcall SaveWorkspace(bool EnableAutoSave);
   virtual void __fastcall CompareDirectories();
   virtual void __fastcall CompareDirectories();

+ 23 - 3
source/forms/SynchronizeChecklist.cpp

@@ -35,12 +35,12 @@ bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
   const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
   const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
   TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
   TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
-  void * Token)
+  TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token)
 {
 {
   std::unique_ptr<TSynchronizeChecklistDialog> Dialog(
   std::unique_ptr<TSynchronizeChecklistDialog> Dialog(
     new TSynchronizeChecklistDialog(
     new TSynchronizeChecklistDialog(
       Application, Mode, Params, LocalDirectory, RemoteDirectory, OnCustomCommandMenu, OnSynchronize,
       Application, Mode, Params, LocalDirectory, RemoteDirectory, OnCustomCommandMenu, OnSynchronize,
-      OnSynchronizeChecklistCalculateSize, OnSynchronizeMove, Token));
+      OnSynchronizeChecklistCalculateSize, OnSynchronizeMove, OnSynchronizeBrowse, Token));
   return Dialog->Execute(Checklist);
   return Dialog->Execute(Checklist);
 }
 }
 //---------------------------------------------------------------------
 //---------------------------------------------------------------------
@@ -48,7 +48,8 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
   TComponent * AOwner, TSynchronizeMode Mode, int Params,
   TComponent * AOwner, TSynchronizeMode Mode, int Params,
   const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
   const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
-  TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove, void * Token)
+  TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
+  TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token)
   : TForm(AOwner)
   : TForm(AOwner)
 {
 {
   FFormRestored = false;
   FFormRestored = false;
@@ -59,6 +60,7 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
   FOnCustomCommandMenu = OnCustomCommandMenu;
   FOnCustomCommandMenu = OnCustomCommandMenu;
   FOnSynchronizeChecklistCalculateSize = OnSynchronizeChecklistCalculateSize;
   FOnSynchronizeChecklistCalculateSize = OnSynchronizeChecklistCalculateSize;
   FOnSynchronizeMove = OnSynchronizeMove;
   FOnSynchronizeMove = OnSynchronizeMove;
+  FOnSynchronizeBrowse = OnSynchronizeBrowse;
   DebugAssert(OnSynchronize != NULL);
   DebugAssert(OnSynchronize != NULL);
   FOnSynchronize = OnSynchronize;
   FOnSynchronize = OnSynchronize;
   FToken = Token;
   FToken = Token;
@@ -189,6 +191,8 @@ void __fastcall TSynchronizeChecklistDialog::UpdateControls()
   ReverseAction->Enabled = (ListView->SelCount > 0) && DebugAlwaysTrue(!FSynchronizing);
   ReverseAction->Enabled = (ListView->SelCount > 0) && DebugAlwaysTrue(!FSynchronizing);
   MoveAction->Enabled = (GetMoveItems() != TSynchronizeMoveItems());
   MoveAction->Enabled = (GetMoveItems() != TSynchronizeMoveItems());
   CalculateSizeAction->Enabled = (ListView->SelCount > 0) && AnyDirectory && DebugAlwaysTrue(!FSynchronizing);
   CalculateSizeAction->Enabled = (ListView->SelCount > 0) && AnyDirectory && DebugAlwaysTrue(!FSynchronizing);
+  BrowseLocalAction->Enabled = (ListView->SelCount == 1) && (GetChecklistItem(ListView->Selected)->Action != TSynchronizeChecklist::saDeleteRemote);
+  BrowseRemoteAction->Enabled = (ListView->SelCount == 1) && (GetChecklistItem(ListView->Selected)->Action != TSynchronizeChecklist::saDeleteLocal);
 
 
   SelectAllAction->Enabled = (ListView->SelCount < ListView->Items->Count) && !FSynchronizing;
   SelectAllAction->Enabled = (ListView->SelCount < ListView->Items->Count) && !FSynchronizing;
 }
 }
@@ -1309,3 +1313,19 @@ void __fastcall TSynchronizeChecklistDialog::UncheckDirectoryActionExecute(TObje
   CheckDirectory(false);
   CheckDirectory(false);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::DoBrowse(TOperationSide Side)
+{
+  const TSynchronizeChecklist::TItem * ChecklistItem = GetChecklistItem(ListView->Selected);
+  FOnSynchronizeBrowse(Side, ChecklistItem);
+}
+//---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::BrowseLocalActionExecute(TObject *)
+{
+  DoBrowse(osLocal);
+}
+//---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::BrowseRemoteActionExecute(TObject *)
+{
+  DoBrowse(osRemote);
+}
+//---------------------------------------------------------------------------

+ 14 - 0
source/forms/SynchronizeChecklist.dfm

@@ -2363,6 +2363,12 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       object TMenuItem
       object TMenuItem
       end
       end
     end
     end
+    object BrowseLocalDirectory2: TMenuItem
+      Action = BrowseLocalAction
+    end
+    object BrowseLocalDirectory1: TMenuItem
+      Action = BrowseRemoteAction
+    end
     object N2: TMenuItem
     object N2: TMenuItem
       Caption = '-'
       Caption = '-'
     end
     end
@@ -2430,6 +2436,14 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       Caption = 'Uncheck All Actions in This &Directory'
       Caption = 'Uncheck All Actions in This &Directory'
       OnExecute = UncheckDirectoryActionExecute
       OnExecute = UncheckDirectoryActionExecute
     end
     end
+    object BrowseLocalAction: TAction
+      Caption = 'Browse &Local Directory'
+      OnExecute = BrowseLocalActionExecute
+    end
+    object BrowseRemoteAction: TAction
+      Caption = 'Browse &Remote Directory'
+      OnExecute = BrowseRemoteActionExecute
+    end
   end
   end
   object ActionImages120: TPngImageList
   object ActionImages120: TPngImageList
     Height = 20
     Height = 20

+ 9 - 1
source/forms/SynchronizeChecklist.h

@@ -64,6 +64,10 @@ __published:
   TMenuItem *N3;
   TMenuItem *N3;
   TMenuItem *CheckAllFilesinThisDirectory1;
   TMenuItem *CheckAllFilesinThisDirectory1;
   TMenuItem *UncheckAllActionsinThisDirectory1;
   TMenuItem *UncheckAllActionsinThisDirectory1;
+  TAction *BrowseLocalAction;
+  TAction *BrowseRemoteAction;
+  TMenuItem *BrowseLocalDirectory1;
+  TMenuItem *BrowseLocalDirectory2;
   void __fastcall HelpButtonClick(TObject * Sender);
   void __fastcall HelpButtonClick(TObject * Sender);
   void __fastcall FormShow(TObject * Sender);
   void __fastcall FormShow(TObject * Sender);
   void __fastcall StatusBarDrawPanel(TStatusBar *StatusBar,
   void __fastcall StatusBarDrawPanel(TStatusBar *StatusBar,
@@ -102,6 +106,8 @@ __published:
   void __fastcall MoveActionExecute(TObject *Sender);
   void __fastcall MoveActionExecute(TObject *Sender);
   void __fastcall CheckDirectoryActionExecute(TObject *Sender);
   void __fastcall CheckDirectoryActionExecute(TObject *Sender);
   void __fastcall UncheckDirectoryActionExecute(TObject *Sender);
   void __fastcall UncheckDirectoryActionExecute(TObject *Sender);
+  void __fastcall BrowseLocalActionExecute(TObject *Sender);
+  void __fastcall BrowseRemoteActionExecute(TObject *Sender);
 
 
 public:
 public:
   __fastcall TSynchronizeChecklistDialog(
   __fastcall TSynchronizeChecklistDialog(
@@ -109,7 +115,7 @@ public:
     const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
     const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
     TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
     TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
     TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
     TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
-    void * Token);
+    TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token);
   virtual __fastcall ~TSynchronizeChecklistDialog();
   virtual __fastcall ~TSynchronizeChecklistDialog();
 
 
   bool __fastcall Execute(TSynchronizeChecklist * Checklist);
   bool __fastcall Execute(TSynchronizeChecklist * Checklist);
@@ -133,6 +139,7 @@ protected:
   TCustomCommandMenuEvent FOnCustomCommandMenu;
   TCustomCommandMenuEvent FOnCustomCommandMenu;
   TSynchronizeChecklistCalculateSize FOnSynchronizeChecklistCalculateSize;
   TSynchronizeChecklistCalculateSize FOnSynchronizeChecklistCalculateSize;
   TSynchronizeMoveEvent FOnSynchronizeMove;
   TSynchronizeMoveEvent FOnSynchronizeMove;
+  TSynchronizeBrowseEvent FOnSynchronizeBrowse;
   typedef std::map<const TSynchronizeChecklist::TItem *, TSynchronizeChecklist::TAction> TActions;
   typedef std::map<const TSynchronizeChecklist::TItem *, TSynchronizeChecklist::TAction> TActions;
   TActions FActions;
   TActions FActions;
   TFullSynchronizeEvent FOnSynchronize;
   TFullSynchronizeEvent FOnSynchronize;
@@ -172,6 +179,7 @@ protected:
   TSynchronizeMoveItems __fastcall GetMoveItems();
   TSynchronizeMoveItems __fastcall GetMoveItems();
   void __fastcall DeleteItem(TListItem * Item);
   void __fastcall DeleteItem(TListItem * Item);
   void __fastcall CheckDirectory(bool Check);
   void __fastcall CheckDirectory(bool Check);
+  void __fastcall DoBrowse(TOperationSide Side);
   static int __fastcall CompareNumber(__int64 Value1, __int64 Value2);
   static int __fastcall CompareNumber(__int64 Value1, __int64 Value2);
 };
 };
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------

+ 2 - 1
source/windows/WinInterface.h

@@ -366,12 +366,13 @@ typedef void __fastcall (__closure *TSynchronizeChecklistCalculateSize)
   (TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
   (TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
 typedef void __fastcall (__closure *TSynchronizeMoveEvent)(
 typedef void __fastcall (__closure *TSynchronizeMoveEvent)(
   TOperationSide Side, const UnicodeString & FileName, const UnicodeString & NewFileName, TRemoteFile * RemoteFile);
   TOperationSide Side, const UnicodeString & FileName, const UnicodeString & NewFileName, TRemoteFile * RemoteFile);
+typedef void __fastcall (__closure *TSynchronizeBrowseEvent)(TOperationSide Side, const TSynchronizeChecklist::TItem * Item);
 bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
 bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
   TSynchronizeMode Mode, int Params,
   TSynchronizeMode Mode, int Params,
   const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
   const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
   TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
   TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
   TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
-  void * Token);
+  TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token);
 
 
 // forms\Editor.cpp
 // forms\Editor.cpp
 typedef void __fastcall (__closure *TFileClosedEvent)
 typedef void __fastcall (__closure *TFileClosedEvent)