Pārlūkot izejas kodu

Bug 327: Synchronization can be started in a new window

https://winscp.net/tracker/327

Source commit: bf1d105fdfc05440e5e3397c282eea8c6a394888
Martin Prikryl 7 gadi atpakaļ
vecāks
revīzija
b96ac34d28

+ 35 - 14
source/forms/CustomScpExplorer.cpp

@@ -5420,17 +5420,8 @@ void __fastcall TCustomScpExplorerForm::GetSynchronizeOptions(
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::SynchronizeInNewWindow(
-  const TSynchronizeParamType & Params, const TCopyParamType * CopyParams)
+UnicodeString __fastcall TCustomScpExplorerForm::SerializeCopyParamForCommandLine(const TCopyParamType * CopyParams)
 {
-  UnicodeString SessionName = CreateHiddenDuplicateSession();
-
-  UnicodeString AdditionalParams =
-    FORMAT(L"%s \"%s\" \"%s\" %d %d %s", (
-      TProgramParams::FormatSwitch(KEEP_UP_TO_DATE_SWITCH),
-      Params.LocalDirectory, Params.RemoteDirectory, Params.Params, Params.Options,
-      TProgramParams::FormatSwitch(DEFAULTS_SWITCH)));
-
   TCopyParamType Defaults;
   std::unique_ptr<THierarchicalStorage> ConfigStorage(Configuration->CreateConfigStorage());
   ConfigStorage->AccessMode = smRead;
@@ -5444,11 +5435,26 @@ void __fastcall TCustomScpExplorerForm::SynchronizeInNewWindow(
   std::unique_ptr<TOptionsStorage> OptionsStorage(new TOptionsStorage(Options.get(), true));
   CopyParams->Save(OptionsStorage.get(), &Defaults);
 
+  UnicodeString Result;
   if (Options->Count > 0)
   {
-    AdditionalParams +=
+    Result =
       FORMAT(L" %s%s", (TProgramParams::FormatSwitch(RAWTRANSFERSETTINGS_SWITCH), StringsToParams(Options.get())));
   }
+  return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::SynchronizeInNewWindow(
+  const TSynchronizeParamType & Params, const TCopyParamType * CopyParams)
+{
+  UnicodeString SessionName = CreateHiddenDuplicateSession();
+
+  UnicodeString AdditionalParams =
+    FORMAT(L"%s \"%s\" \"%s\" %d %d %s%s", (
+      TProgramParams::FormatSwitch(KEEP_UP_TO_DATE_SWITCH),
+      Params.LocalDirectory, Params.RemoteDirectory, Params.Params, Params.Options,
+      TProgramParams::FormatSwitch(DEFAULTS_SWITCH),
+      SerializeCopyParamForCommandLine(CopyParams)));
 
   ExecuteNewInstance(SessionName, AdditionalParams);
 }
@@ -5619,12 +5625,27 @@ void __fastcall TCustomScpExplorerForm::DoSynchronizeMove(
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::FullSynchronizeInNewWindow(
+  TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
+   const TCopyParamType * CopyParams)
+{
+  UnicodeString SessionName = CreateHiddenDuplicateSession();
+
+  UnicodeString AdditionalParams =
+    FORMAT(L"%s \"%s\" \"%s\" %d %d %s%s", (
+      TProgramParams::FormatSwitch(SYNCHRONIZE_SWITCH),
+      LocalDirectory, RemoteDirectory, Mode, Params,
+      TProgramParams::FormatSwitch(DEFAULTS_SWITCH),
+      SerializeCopyParamForCommandLine(CopyParams)));
+
+  ExecuteNewInstance(SessionName, AdditionalParams);
+}
+//---------------------------------------------------------------------------
 int __fastcall TCustomScpExplorerForm::DoFullSynchronizeDirectories(
   UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory,
-  TSynchronizeMode & Mode, bool & SaveMode, bool UseDefaults)
+  TSynchronizeMode & Mode, int Params, bool & SaveMode, bool UseDefaults)
 {
   int Result;
-  int Params = GUIConfiguration->SynchronizeParams;
 
   bool SaveSettings = false;
   int Options =
@@ -5635,7 +5656,7 @@ int __fastcall TCustomScpExplorerForm::DoFullSynchronizeDirectories(
   bool Continue =
     UseDefaults ||
     DoFullSynchronizeDialog(Mode, Params, LocalDirectory, RemoteDirectory,
-      &CopyParam, SaveSettings, SaveMode, Options, CopyParamAttrs);
+      &CopyParam, SaveSettings, SaveMode, Options, CopyParamAttrs, FullSynchronizeInNewWindow);
   if (Continue)
   {
     Configuration->Usage->Inc(L"Synchronizations");

+ 5 - 1
source/forms/CustomScpExplorer.h

@@ -429,7 +429,11 @@ protected:
     TSynchronizeOptions * Options);
   void __fastcall SynchronizeSessionLog(const UnicodeString & Message);
   void __fastcall GetSynchronizeOptions(int Params, TSynchronizeOptions & Options);
+  UnicodeString __fastcall SerializeCopyParamForCommandLine(const TCopyParamType * CopyParams);
   void __fastcall SynchronizeInNewWindow(const TSynchronizeParamType & Params, const TCopyParamType * CopyParams);
+  void __fastcall FullSynchronizeInNewWindow(
+    TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
+     const TCopyParamType * CopyParams);
   bool __fastcall SynchronizeAllowSelectedOnly();
   virtual void __fastcall BatchStart(void *& Storage);
   virtual void __fastcall BatchEnd(void * Storage);
@@ -728,7 +732,7 @@ public:
   bool __fastcall DoSynchronizeDirectories(UnicodeString & LocalDirectory,
     UnicodeString & RemoteDirectory, bool UseDefaults);
   int __fastcall DoFullSynchronizeDirectories(UnicodeString & LocalDirectory,
-    UnicodeString & RemoteDirectory, TSynchronizeMode & Mode, bool & SaveMode,
+    UnicodeString & RemoteDirectory, TSynchronizeMode & Mode, int Params, bool & SaveMode,
     bool UseDefaults);
   void __fastcall StandaloneEdit(const UnicodeString & FileName);
   bool __fastcall CanPasteFromClipBoard();

+ 74 - 28
source/forms/FullSynchronize.cpp

@@ -16,6 +16,7 @@
 #include <GUITools.h>
 #include <Terminal.h>
 #include <CustomWinConfiguration.h>
+#include <Tools.h>
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma link "HistoryComboBox"
@@ -26,21 +27,20 @@
 bool __fastcall DoFullSynchronizeDialog(TSynchronizeMode & Mode, int & Params,
   UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory,
   TCopyParamType * CopyParams, bool & SaveSettings, bool & SaveMode, int Options,
-  const TUsableCopyParamAttrs & CopyParamAttrs)
+  const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow)
 {
   bool Result;
   TFullSynchronizeDialog * Dialog = SafeFormCreate<TFullSynchronizeDialog>();
   try
   {
+    Dialog->Init(Options, CopyParamAttrs, OnFullSynchronizeInNewWindow);
     Dialog->Mode = Mode;
-    Dialog->Options = Options;
     Dialog->Params = Params;
     Dialog->LocalDirectory = LocalDirectory;
     Dialog->RemoteDirectory = RemoteDirectory;
     Dialog->CopyParams = *CopyParams;
     Dialog->SaveSettings = SaveSettings;
     Dialog->SaveMode = SaveMode;
-    Dialog->CopyParamAttrs = CopyParamAttrs;
     Result = Dialog->Execute();
     if (Result)
     {
@@ -67,6 +67,7 @@ __fastcall TFullSynchronizeDialog::TFullSynchronizeDialog(TComponent* Owner)
   FParams = 0;
   FSaveMode = false;
   FOptions = 0;
+  FOnFullSynchronizeInNewWindow = NULL;
   FPresetsMenu = new TPopupMenu(this);
   FSynchronizeBySizeCaption = SynchronizeBySizeCheck->Caption;
   HotTrackLabel(CopyParamLabel);
@@ -79,9 +80,24 @@ __fastcall TFullSynchronizeDialog::~TFullSynchronizeDialog()
   delete FPresetsMenu;
 }
 //---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::Init(
+  int Options, const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow)
+{
+  FOptions = Options;
+  if (FLAGSET(Options, fsoDisableTimestamp) &&
+      SynchronizeTimestampsButton->Checked)
+  {
+    SynchronizeFilesButton->Checked = true;
+  }
+  FCopyParamAttrs = CopyParamAttrs;
+  FOnFullSynchronizeInNewWindow = OnFullSynchronizeInNewWindow;
+  DebugAssert(FOnFullSynchronizeInNewWindow != NULL);
+  UpdateControls();
+}
+//---------------------------------------------------------------------------
 void __fastcall TFullSynchronizeDialog::UpdateControls()
 {
-  EnableControl(SynchronizeTimestampsButton, FLAGCLEAR(Options, fsoDisableTimestamp));
+  EnableControl(SynchronizeTimestampsButton, FLAGCLEAR(FOptions, fsoDisableTimestamp));
   if (SynchronizeTimestampsButton->Checked)
   {
     SynchronizeExistingOnlyCheck->Checked = true;
@@ -116,8 +132,10 @@ void __fastcall TFullSynchronizeDialog::UpdateControls()
     LoadStr(SYNCHRONIZE_SAME_SIZE) : UnicodeString(FSynchronizeBySizeCaption);
 
   TransferSettingsButton->Style =
-    FLAGCLEAR(Options, fsoDoNotUsePresets) ?
+    FLAGCLEAR(FOptions, fsoDoNotUsePresets) ?
       TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
+
+  OkButton->Style = AllowStartInNewWindow() ? TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
 }
 //---------------------------------------------------------------------------
 int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
@@ -132,18 +150,18 @@ int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
     switch (Mode)
     {
       case smRemote:
-        Result = CopyParamAttrs.Upload;
+        Result = FCopyParamAttrs.Upload;
         break;
 
       case smLocal:
-        Result = CopyParamAttrs.Download;
+        Result = FCopyParamAttrs.Download;
         break;
 
       default:
         DebugFail();
         //fallthru
       case smBoth:
-        Result = CopyParamAttrs.General;
+        Result = FCopyParamAttrs.General;
         break;
     }
   }
@@ -167,14 +185,19 @@ bool __fastcall TFullSynchronizeDialog::Execute()
   bool Result = (ShowModal() == DefaultResult(this));
   if (Result)
   {
-    LocalDirectoryEdit->SaveToHistory();
-    CustomWinConfiguration->History[L"LocalDirectory"] = LocalDirectoryEdit->Items;
-    RemoteDirectoryEdit->SaveToHistory();
-    CustomWinConfiguration->History[L"RemoteDirectory"] = RemoteDirectoryEdit->Items;
+    Submitted();
   }
   return Result;
 }
 //---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::Submitted()
+{
+  LocalDirectoryEdit->SaveToHistory();
+  CustomWinConfiguration->History[L"LocalDirectory"] = LocalDirectoryEdit->Items;
+  RemoteDirectoryEdit->SaveToHistory();
+  CustomWinConfiguration->History[L"RemoteDirectory"] = RemoteDirectoryEdit->Items;
+}
+//---------------------------------------------------------------------------
 void __fastcall TFullSynchronizeDialog::SetRemoteDirectory(const UnicodeString value)
 {
   RemoteDirectoryEdit->Text = value;
@@ -243,7 +266,7 @@ void __fastcall TFullSynchronizeDialog::SetParams(int value)
   SynchronizeExistingOnlyCheck->Checked = FLAGSET(value, TTerminal::spExistingOnly);
   SynchronizePreviewChangesCheck->Checked = FLAGSET(value, TTerminal::spPreviewChanges);
   SynchronizeSelectedOnlyCheck->Checked = FLAGSET(value, TTerminal::spSelectedOnly);
-  if (FLAGSET(value, TTerminal::spTimestamp) && FLAGCLEAR(Options, fsoDisableTimestamp))
+  if (FLAGSET(value, TTerminal::spTimestamp) && FLAGCLEAR(FOptions, fsoDisableTimestamp))
   {
     SynchronizeTimestampsButton->Checked = true;
   }
@@ -267,7 +290,7 @@ int __fastcall TFullSynchronizeDialog::GetParams()
     FLAGMASK(SynchronizeExistingOnlyCheck->Checked, TTerminal::spExistingOnly) |
     FLAGMASK(SynchronizePreviewChangesCheck->Checked, TTerminal::spPreviewChanges) |
     FLAGMASK(SynchronizeSelectedOnlyCheck->Checked, TTerminal::spSelectedOnly) |
-    FLAGMASK(SynchronizeTimestampsButton->Checked && FLAGCLEAR(Options, fsoDisableTimestamp),
+    FLAGMASK(SynchronizeTimestampsButton->Checked && FLAGCLEAR(FOptions, fsoDisableTimestamp),
       TTerminal::spTimestamp) |
     FLAGMASK(MirrorFilesButton->Checked, TTerminal::spMirror) |
     FLAGMASK(!SynchronizeByTimeCheck->Checked, TTerminal::spNotByTime) |
@@ -294,20 +317,6 @@ bool __fastcall TFullSynchronizeDialog::GetSaveSettings()
   return SaveSettingsCheck->Checked;
 }
 //---------------------------------------------------------------------------
-void __fastcall TFullSynchronizeDialog::SetOptions(int value)
-{
-  if (Options != value)
-  {
-    FOptions = value;
-    if (FLAGSET(Options, fsoDisableTimestamp) &&
-        SynchronizeTimestampsButton->Checked)
-    {
-      SynchronizeFilesButton->Checked = true;
-    }
-    UpdateControls();
-  }
-}
-//---------------------------------------------------------------------------
 void __fastcall TFullSynchronizeDialog::CopyParamListPopup(TRect R, int AdditionalOptions)
 {
   // We pass in FCopyParams, although it may not be the exact copy param
@@ -426,3 +435,40 @@ void __fastcall TFullSynchronizeDialog::TransferSettingsButtonDropDownClick(TObj
   CopyParamListPopup(CalculatePopupRect(TransferSettingsButton), cplCustomizeDefault);
 }
 //---------------------------------------------------------------------------
+bool __fastcall TFullSynchronizeDialog::AllowStartInNewWindow()
+{
+  return !IsMainFormLike(this);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::Start1Click(TObject *)
+{
+  OkButton->Click();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::OkButtonDropDownClick(TObject *)
+{
+  MenuPopup(OkMenu, OkButton);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::OkButtonClick(TObject *)
+{
+  if (AllowStartInNewWindow() && OpenInNewWindow())
+  {
+    StartInNewWindow();
+    ModalResult = mrCancel;
+    Abort();
+  }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::StartInNewWindow()
+{
+  Submitted();
+  FOnFullSynchronizeInNewWindow(Mode, Params, LocalDirectory, RemoteDirectory, &CopyParams);
+  Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFullSynchronizeDialog::StartInNewWindow1Click(TObject *)
+{
+  StartInNewWindow();
+}
+//---------------------------------------------------------------------------

+ 18 - 2
source/forms/FullSynchronize.dfm

@@ -89,15 +89,17 @@ object FullSynchronizeDialog: TFullSynchronizeDialog
     end
   end
   object OkButton: TButton
-    Left = 233
+    Left = 220
     Top = 396
-    Width = 75
+    Width = 88
     Height = 25
     Anchors = [akRight, akBottom]
     Caption = 'OK'
     Default = True
     ModalResult = 1
     TabOrder = 8
+    OnClick = OkButtonClick
+    OnDropDownClick = OkButtonDropDownClick
   end
   object CancelButton: TButton
     Left = 315
@@ -184,6 +186,7 @@ object FullSynchronizeDialog: TFullSynchronizeDialog
       Width = 138
       Height = 17
       Caption = '&Both'
+      Checked = True
       TabOrder = 0
       OnClick = ControlChange
     end
@@ -318,4 +321,17 @@ object FullSynchronizeDialog: TFullSynchronizeDialog
       OnClick = ControlChange
     end
   end
+  object OkMenu: TPopupMenu
+    Left = 416
+    Top = 336
+    object Start1: TMenuItem
+      Caption = '&Start'
+      Default = True
+      OnClick = Start1Click
+    end
+    object StartInNewWindow1: TMenuItem
+      Caption = 'Start in &New Window'
+      OnClick = StartInNewWindow1Click
+    end
+  end
 end

+ 15 - 3
source/forms/FullSynchronize.h

@@ -12,6 +12,7 @@
 #include <CopyParam.h>
 #include <Vcl.ExtCtrls.hpp>
 #include <Vcl.Imaging.pngimage.hpp>
+#include <Vcl.Menus.hpp>
 //---------------------------------------------------------------------------
 class TFullSynchronizeDialog : public TForm
 {
@@ -46,6 +47,9 @@ __published:
   TRadioButton *MirrorFilesButton;
   TRadioButton *SynchronizeTimestampsButton;
   TImage *Image;
+  TPopupMenu *OkMenu;
+  TMenuItem *Start1;
+  TMenuItem *StartInNewWindow1;
   void __fastcall ControlChange(TObject *Sender);
   void __fastcall LocalDirectoryBrowseButtonClick(TObject *Sender);
   void __fastcall TransferSettingsButtonClick(TObject *Sender);
@@ -56,6 +60,10 @@ __published:
   void __fastcall CopyParamGroupClick(TObject *Sender);
   void __fastcall HelpButtonClick(TObject *Sender);
   void __fastcall TransferSettingsButtonDropDownClick(TObject *Sender);
+  void __fastcall Start1Click(TObject *Sender);
+  void __fastcall OkButtonDropDownClick(TObject *Sender);
+  void __fastcall OkButtonClick(TObject *Sender);
+  void __fastcall StartInNewWindow1Click(TObject *Sender);
 
 private:
   int FParams;
@@ -67,6 +75,7 @@ private:
   TPopupMenu * FPresetsMenu;
   UnicodeString FPreset;
   UnicodeString FSynchronizeBySizeCaption;
+  TFullSynchronizeInNewWindow FOnFullSynchronizeInNewWindow;
   void __fastcall SetRemoteDirectory(const UnicodeString value);
   UnicodeString __fastcall GetRemoteDirectory();
   void __fastcall SetLocalDirectory(const UnicodeString value);
@@ -77,17 +86,22 @@ private:
   int __fastcall GetParams();
   void __fastcall SetSaveSettings(bool value);
   bool __fastcall GetSaveSettings();
-  void __fastcall SetOptions(int value);
   void __fastcall SetCopyParams(const TCopyParamType & value);
   TCopyParamType __fastcall GetCopyParams();
   void __fastcall CopyParamClick(TObject * Sender);
   int __fastcall ActualCopyParamAttrs();
   void __fastcall CopyParamListPopup(TRect R, int AdditionalOptions);
+  bool __fastcall AllowStartInNewWindow();
+  void __fastcall Submitted();
+  void __fastcall StartInNewWindow();
 
 public:
   __fastcall TFullSynchronizeDialog(TComponent* Owner);
   virtual __fastcall ~TFullSynchronizeDialog();
 
+  void __fastcall Init(
+    int Options, const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow);
+
   bool __fastcall Execute();
 
   __property UnicodeString RemoteDirectory = { read = GetRemoteDirectory, write = SetRemoteDirectory };
@@ -96,8 +110,6 @@ public:
   __property TSynchronizeMode Mode = { read = GetMode, write = SetMode };
   __property bool SaveSettings = { read = GetSaveSettings, write = SetSaveSettings };
   __property bool SaveMode = { read = FSaveMode, write = FSaveMode };
-  __property int Options = { read = FOptions, write = SetOptions };
-  __property TUsableCopyParamAttrs CopyParamAttrs = { read = FCopyParamAttrs, write = FCopyParamAttrs };
   __property TCopyParamType CopyParams = { read = GetCopyParams, write = SetCopyParams };
 
 protected:

+ 2 - 1
source/forms/ScpCommander.cpp

@@ -944,7 +944,8 @@ void __fastcall TScpCommanderForm::FullSynchronizeDirectories()
   TSynchronizeMode Mode =
     (SaveMode ? (TSynchronizeMode)GUIConfiguration->SynchronizeModeAuto :
       ((FCurrentSide == osLocal) ? smRemote : smLocal));
-  if (DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, SaveMode, false) >= 0)
+  int Params = GUIConfiguration->SynchronizeParams;
+  if (DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, Params, SaveMode, false) >= 0)
   {
     if (SaveMode)
     {

+ 2 - 1
source/forms/ScpExplorer.cpp

@@ -240,7 +240,8 @@ void __fastcall TScpExplorerForm::FullSynchronizeDirectories()
   UnicodeString RemoteDirectory = RemoteDirView->PathName;
   bool SaveMode = true;
   TSynchronizeMode Mode = (TSynchronizeMode)GUIConfiguration->SynchronizeMode;
-  if (DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, SaveMode, false) >= 0)
+  int Params = GUIConfiguration->SynchronizeParams;
+  if (DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, Params, SaveMode, false) >= 0)
   {
     WinConfiguration->ScpExplorer.LastLocalTargetDirectory = LocalDirectory;
     if (SaveMode)

+ 2 - 2
source/windows/ConsoleRunner.cpp

@@ -2190,7 +2190,7 @@ void __fastcall Usage(TConsole * Console)
     PrintUsageSyntax(Console, FORMAT(L"[mysession] /%s=<name>", (LowerCase(SESSIONNAME_SWICH))));
     PrintUsageSyntax(Console, L"[mysession] /newinstance");
     PrintUsageSyntax(Console, L"[mysession] /edit <path>");
-    PrintUsageSyntax(Console, FORMAT(L"[mysession] /synchronize [local_dir] [remote_dir] [/%s]", (LowerCase(DEFAULTS_SWITCH))));
+    PrintUsageSyntax(Console, FORMAT(L"[mysession] /%s [local_dir] [remote_dir] [/%s]", (LowerCase(SYNCHRONIZE_SWITCH), LowerCase(DEFAULTS_SWITCH))));
     PrintUsageSyntax(Console, FORMAT(L"[mysession] /%s [local_dir] [remote_dir] [/%s]", (LowerCase(KEEP_UP_TO_DATE_SWITCH), LowerCase(DEFAULTS_SWITCH))));
     PrintUsageSyntax(Console, FORMAT(L"[mysession] /%s [path]", (LowerCase(REFRESH_SWITCH))));
     PrintUsageSyntax(Console, L"[mysession] [/privatekey=<file>] [/hostkey=<fingerprint>]");
@@ -2228,7 +2228,7 @@ void __fastcall Usage(TConsole * Console)
     RegisterSwitch(SwitchesUsage, TProgramParams::FormatSwitch(SESSIONNAME_SWICH) + L"=", USAGE_SESSIONNAME);
     RegisterSwitch(SwitchesUsage, L"/newinstance", USAGE_NEWINSTANCE);
     RegisterSwitch(SwitchesUsage, L"/edit", USAGE_EDIT);
-    RegisterSwitch(SwitchesUsage, L"/synchronize", USAGE_SYNCHRONIZE);
+    RegisterSwitch(SwitchesUsage, TProgramParams::FormatSwitch(SYNCHRONIZE_SWITCH), USAGE_SYNCHRONIZE);
     RegisterSwitch(SwitchesUsage, TProgramParams::FormatSwitch(KEEP_UP_TO_DATE_SWITCH), USAGE_KEEPUPTODATE);
     RegisterSwitch(SwitchesUsage, TProgramParams::FormatSwitch(REFRESH_SWITCH), USAGE_REFRESH);
     RegisterSwitch(SwitchesUsage, TProgramParams::FormatSwitch(DEFAULTS_SWITCH), USAGE_DEFAULTS);

+ 6 - 1
source/windows/WinInterface.h

@@ -26,6 +26,7 @@ const int mpAllowContinueOnError = 0x02;
 
 #define UPLOAD_IF_ANY_SWITCH L"UploadIfAny"
 #define UPLOAD_SWITCH L"Upload"
+#define SYNCHRONIZE_SWITCH L"Synchronize"
 #define KEEP_UP_TO_DATE_SWITCH L"KeepUpToDate"
 #define JUMPLIST_SWITCH L"JumpList"
 #define DESKTOP_SWITCH L"Desktop"
@@ -343,10 +344,14 @@ enum TSynchronizeMode { smRemote, smLocal, smBoth };
 const fsoDisableTimestamp = 0x01;
 const fsoDoNotUsePresets =  0x02;
 const fsoAllowSelectedOnly = 0x04;
+typedef void __fastcall (__closure *TFullSynchronizeInNewWindow)
+  (TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
+   const TCopyParamType * CopyParams);
 bool __fastcall DoFullSynchronizeDialog(TSynchronizeMode & Mode, int & Params,
   UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory,
   TCopyParamType * CopyParams, bool & SaveSettings, bool & SaveMode,
-  int Options, const TUsableCopyParamAttrs & CopyParamAttrs);
+  int Options, const TUsableCopyParamAttrs & CopyParamAttrs,
+  TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow);
 
 // forms\SynchronizeChecklist.cpp
 class TSynchronizeChecklist;

+ 11 - 2
source/windows/WinMain.cpp

@@ -223,8 +223,17 @@ void __fastcall FullSynchronize(TTerminal * Terminal, TCustomScpExplorerForm * S
   bool SaveMode = true;
   // bit ugly
   TSynchronizeMode Mode = (TSynchronizeMode)GUIConfiguration->SynchronizeMode;
+  int Params = GUIConfiguration->SynchronizeParams;
+
+  // Undocumented syntax for "Start in New Window"
+  if (CommandParams->Count >= 4)
+  {
+    Mode = (TSynchronizeMode)StrToIntDef(CommandParams->Strings[2], Mode);
+    Params = StrToIntDef(CommandParams->Strings[3], Params);
+  }
+
   int Result =
-    ScpExplorer->DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, SaveMode, UseDefaults);
+    ScpExplorer->DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode, Params, SaveMode, UseDefaults);
   if ((Result >= 0) && SaveMode)
   {
     GUIConfiguration->SynchronizeMode = Mode;
@@ -974,7 +983,7 @@ int __fastcall Execute()
             ParamCommand = pcUpload;
           }
         }
-        else if (Params->FindSwitch(L"Synchronize", CommandParams, 2))
+        else if (Params->FindSwitch(SYNCHRONIZE_SWITCH, CommandParams, 4))
         {
           ParamCommand = pcFullSynchronize;
         }