1
0
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:
Martin Prikryl
2019-08-22 12:44:09 +00:00
parent d0520b1582
commit 084a35d7a7
6 changed files with 82 additions and 11 deletions

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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);
}
//---------------------------------------------------------------------------

View File

@@ -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

View File

@@ -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);
};
//----------------------------------------------------------------------------

View File

@@ -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)