mirror of
https://github.com/winscp/winscp.git
synced 2026-10-24 02:28:55 +03:00
On Synchronization Checklist window, local and remote directories can be opened in Windows Explorer and another instance of WinSCP, respectively
Source commit: c7b14c2c5673be35723aee7d00e88d2641330dd4
This commit is contained in:
@@ -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;
|
||||
|
||||
// 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
|
||||
StoredSessions->Save(false, true);
|
||||
|
||||
@@ -4769,6 +4766,13 @@ UnicodeString __fastcall TCustomScpExplorerForm::CreateHiddenDuplicateSession()
|
||||
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()
|
||||
{
|
||||
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(
|
||||
TSynchronizeMode Mode, int Params, const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
|
||||
const TCopyParamType * CopyParams)
|
||||
@@ -5835,7 +5861,7 @@ int __fastcall TCustomScpExplorerForm::DoFullSynchronizeDirectories(
|
||||
{
|
||||
if (!DoSynchronizeChecklistDialog(
|
||||
Checklist, Mode, Params, LocalDirectory, RemoteDirectory, CustomCommandMenu, DoFullSynchronize,
|
||||
DoSynchronizeChecklistCalculateSize, DoSynchronizeMove, &SynchronizeParams))
|
||||
DoSynchronizeChecklistCalculateSize, DoSynchronizeMove, DoSynchronizeBrowse, &SynchronizeParams))
|
||||
{
|
||||
Result = -1;
|
||||
}
|
||||
|
||||
@@ -660,6 +660,7 @@ protected:
|
||||
TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
|
||||
void __fastcall DoSynchronizeMove(
|
||||
TOperationSide Side, const UnicodeString & FileName, const UnicodeString & NewFileName, TRemoteFile * RemoteFile);
|
||||
void __fastcall DoSynchronizeBrowse(TOperationSide Side, const TSynchronizeChecklist::TItem * Item);
|
||||
void __fastcall FullSynchronize(
|
||||
TSynchronizeParams & Params, TProcessedSynchronizationChecklistItem OnProcessedItem,
|
||||
TUpdatedSynchronizationChecklistItems OnUpdatedSynchronizationChecklistItems);
|
||||
@@ -731,6 +732,7 @@ public:
|
||||
__fastcall TCustomScpExplorerForm(TComponent* Owner);
|
||||
void __fastcall SaveCurrentSession();
|
||||
UnicodeString __fastcall CreateHiddenDuplicateSession();
|
||||
UnicodeString __fastcall SaveHiddenDuplicateSession(TSessionData * SessionData);
|
||||
TSessionData * __fastcall CloneCurrentSessionData();
|
||||
bool __fastcall SaveWorkspace(bool EnableAutoSave);
|
||||
virtual void __fastcall CompareDirectories();
|
||||
|
||||
@@ -35,12 +35,12 @@ bool __fastcall DoSynchronizeChecklistDialog(TSynchronizeChecklist * Checklist,
|
||||
const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
|
||||
TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
|
||||
TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
|
||||
void * Token)
|
||||
TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token)
|
||||
{
|
||||
std::unique_ptr<TSynchronizeChecklistDialog> Dialog(
|
||||
new TSynchronizeChecklistDialog(
|
||||
Application, Mode, Params, LocalDirectory, RemoteDirectory, OnCustomCommandMenu, OnSynchronize,
|
||||
OnSynchronizeChecklistCalculateSize, OnSynchronizeMove, Token));
|
||||
OnSynchronizeChecklistCalculateSize, OnSynchronizeMove, OnSynchronizeBrowse, Token));
|
||||
return Dialog->Execute(Checklist);
|
||||
}
|
||||
//---------------------------------------------------------------------
|
||||
@@ -48,7 +48,8 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
|
||||
TComponent * AOwner, TSynchronizeMode Mode, int Params,
|
||||
const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
|
||||
TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
|
||||
TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove, void * Token)
|
||||
TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
|
||||
TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token)
|
||||
: TForm(AOwner)
|
||||
{
|
||||
FFormRestored = false;
|
||||
@@ -59,6 +60,7 @@ __fastcall TSynchronizeChecklistDialog::TSynchronizeChecklistDialog(
|
||||
FOnCustomCommandMenu = OnCustomCommandMenu;
|
||||
FOnSynchronizeChecklistCalculateSize = OnSynchronizeChecklistCalculateSize;
|
||||
FOnSynchronizeMove = OnSynchronizeMove;
|
||||
FOnSynchronizeBrowse = OnSynchronizeBrowse;
|
||||
DebugAssert(OnSynchronize != NULL);
|
||||
FOnSynchronize = OnSynchronize;
|
||||
FToken = Token;
|
||||
@@ -189,6 +191,8 @@ void __fastcall TSynchronizeChecklistDialog::UpdateControls()
|
||||
ReverseAction->Enabled = (ListView->SelCount > 0) && DebugAlwaysTrue(!FSynchronizing);
|
||||
MoveAction->Enabled = (GetMoveItems() != TSynchronizeMoveItems());
|
||||
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;
|
||||
}
|
||||
@@ -1309,3 +1313,19 @@ void __fastcall TSynchronizeChecklistDialog::UncheckDirectoryActionExecute(TObje
|
||||
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);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -2363,6 +2363,12 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
|
||||
object TMenuItem
|
||||
end
|
||||
end
|
||||
object BrowseLocalDirectory2: TMenuItem
|
||||
Action = BrowseLocalAction
|
||||
end
|
||||
object BrowseLocalDirectory1: TMenuItem
|
||||
Action = BrowseRemoteAction
|
||||
end
|
||||
object N2: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
@@ -2430,6 +2436,14 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
|
||||
Caption = 'Uncheck All Actions in This &Directory'
|
||||
OnExecute = UncheckDirectoryActionExecute
|
||||
end
|
||||
object BrowseLocalAction: TAction
|
||||
Caption = 'Browse &Local Directory'
|
||||
OnExecute = BrowseLocalActionExecute
|
||||
end
|
||||
object BrowseRemoteAction: TAction
|
||||
Caption = 'Browse &Remote Directory'
|
||||
OnExecute = BrowseRemoteActionExecute
|
||||
end
|
||||
end
|
||||
object ActionImages120: TPngImageList
|
||||
Height = 20
|
||||
|
||||
@@ -64,6 +64,10 @@ __published:
|
||||
TMenuItem *N3;
|
||||
TMenuItem *CheckAllFilesinThisDirectory1;
|
||||
TMenuItem *UncheckAllActionsinThisDirectory1;
|
||||
TAction *BrowseLocalAction;
|
||||
TAction *BrowseRemoteAction;
|
||||
TMenuItem *BrowseLocalDirectory1;
|
||||
TMenuItem *BrowseLocalDirectory2;
|
||||
void __fastcall HelpButtonClick(TObject * Sender);
|
||||
void __fastcall FormShow(TObject * Sender);
|
||||
void __fastcall StatusBarDrawPanel(TStatusBar *StatusBar,
|
||||
@@ -102,6 +106,8 @@ __published:
|
||||
void __fastcall MoveActionExecute(TObject *Sender);
|
||||
void __fastcall CheckDirectoryActionExecute(TObject *Sender);
|
||||
void __fastcall UncheckDirectoryActionExecute(TObject *Sender);
|
||||
void __fastcall BrowseLocalActionExecute(TObject *Sender);
|
||||
void __fastcall BrowseRemoteActionExecute(TObject *Sender);
|
||||
|
||||
public:
|
||||
__fastcall TSynchronizeChecklistDialog(
|
||||
@@ -109,7 +115,7 @@ public:
|
||||
const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
|
||||
TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
|
||||
TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
|
||||
void * Token);
|
||||
TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token);
|
||||
virtual __fastcall ~TSynchronizeChecklistDialog();
|
||||
|
||||
bool __fastcall Execute(TSynchronizeChecklist * Checklist);
|
||||
@@ -133,6 +139,7 @@ protected:
|
||||
TCustomCommandMenuEvent FOnCustomCommandMenu;
|
||||
TSynchronizeChecklistCalculateSize FOnSynchronizeChecklistCalculateSize;
|
||||
TSynchronizeMoveEvent FOnSynchronizeMove;
|
||||
TSynchronizeBrowseEvent FOnSynchronizeBrowse;
|
||||
typedef std::map<const TSynchronizeChecklist::TItem *, TSynchronizeChecklist::TAction> TActions;
|
||||
TActions FActions;
|
||||
TFullSynchronizeEvent FOnSynchronize;
|
||||
@@ -172,6 +179,7 @@ protected:
|
||||
TSynchronizeMoveItems __fastcall GetMoveItems();
|
||||
void __fastcall DeleteItem(TListItem * Item);
|
||||
void __fastcall CheckDirectory(bool Check);
|
||||
void __fastcall DoBrowse(TOperationSide Side);
|
||||
static int __fastcall CompareNumber(__int64 Value1, __int64 Value2);
|
||||
};
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -366,12 +366,13 @@ typedef void __fastcall (__closure *TSynchronizeChecklistCalculateSize)
|
||||
(TSynchronizeChecklist * Checklist, const TSynchronizeChecklist::TItemList & Items, void * Token);
|
||||
typedef void __fastcall (__closure *TSynchronizeMoveEvent)(
|
||||
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,
|
||||
TSynchronizeMode Mode, int Params,
|
||||
const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
|
||||
TCustomCommandMenuEvent OnCustomCommandMenu, TFullSynchronizeEvent OnSynchronize,
|
||||
TSynchronizeChecklistCalculateSize OnSynchronizeChecklistCalculateSize, TSynchronizeMoveEvent OnSynchronizeMove,
|
||||
void * Token);
|
||||
TSynchronizeBrowseEvent OnSynchronizeBrowse, void * Token);
|
||||
|
||||
// forms\Editor.cpp
|
||||
typedef void __fastcall (__closure *TFileClosedEvent)
|
||||
|
||||
Reference in New Issue
Block a user