Pārlūkot izejas kodu

Bug 1758: Copy (to clipboard) command in file context menu

https://winscp.net/tracker/1758

Source commit: 2c3c49532235a347dfb97670fb763cfc3ba0ddfa
Martin Prikryl 6 gadi atpakaļ
vecāks
revīzija
0e79b992bf

+ 2 - 2
source/forms/CustomScpExplorer.cpp

@@ -10257,7 +10257,7 @@ void __fastcall TCustomScpExplorerForm::SessionsPageControlCloseButtonClick(TPag
   CloseSessionTab(Index);
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::CopyFilesToClipboard(TOperationSide Side)
+void __fastcall TCustomScpExplorerForm::CopyFilesToClipboard(TOperationSide Side, bool OnFocused)
 {
   if (DebugAlwaysTrue(!IsSideLocalBrowser(Side)))
   {
@@ -10284,7 +10284,7 @@ void __fastcall TCustomScpExplorerForm::CopyFilesToClipboard(TOperationSide Side
     FClipboardTerminal = FTerminal;
 
     // Need full paths, as cwd can be different once files are pasted
-    FClipboardFileList.reset(TRemoteFileList::CloneStrings(RemoteDirView->CreateFileList(false, true)));
+    FClipboardFileList.reset(TRemoteFileList::CloneStrings(RemoteDirView->CreateFileList(OnFocused, true)));
     for (int Index = 0; Index < FClipboardFileList->Count; Index++)
     {
       FClipboardFileList->Strings[Index] = UnixExcludeTrailingBackslash(FClipboardFileList->Strings[Index]);

+ 1 - 1
source/forms/CustomScpExplorer.h

@@ -778,7 +778,7 @@ public:
   void __fastcall StandaloneEdit(const UnicodeString & FileName);
   bool __fastcall CanPasteFromClipBoard();
   virtual void __fastcall PasteFromClipBoard();
-  virtual void __fastcall CopyFilesToClipboard(TOperationSide Side);
+  virtual void __fastcall CopyFilesToClipboard(TOperationSide Side, bool OnFocused);
   void __fastcall ToggleQueueVisibility();
   virtual UnicodeString __fastcall PathForCaption();
   void __fastcall FileListFromClipboard();

+ 3 - 1
source/forms/NonVisual.cpp

@@ -158,6 +158,7 @@ void __fastcall TNonVisualDataModule::ExplorerActionsUpdate(
     !WinConfiguration->DisableOpenEdit)
   UPD(CurrentEditInternalFocusedAction, EnabledFocusedFileOperation &&
     !WinConfiguration->DisableOpenEdit)
+  UPD(CurrentCopyToClipboardFocusedAction, EnabledFocusedOperation)
   // file operation
   UPD(CurrentRenameAction, EnabledFocusedOperation &&
     ((ScpExplorer->HasDirView[osLocal] && DirView(osLocal) == DirView(osCurrent)) ||
@@ -509,6 +510,7 @@ void __fastcall TNonVisualDataModule::ExplorerActionsExecute(
     EXE(CurrentSystemMenuFocusedAction, ScpExplorer->DisplaySystemContextMenu())
     EXE(CurrentEditWithFocusedAction, ScpExplorer->ExecuteCurrentFileWith(true))
     EXE(CurrentEditInternalFocusedAction, ScpExplorer->ExecuteFile(osCurrent, efInternalEditor, NULL, true, true))
+    EXE(CurrentCopyToClipboardFocusedAction, ScpExplorer->CopyFilesToClipboard(osCurrent, true))
     // operation
     EXE(CurrentEditAction, ScpExplorer->ExecuteFile(osCurrent, efDefaultEditor, NULL, true, false))
     EXE(CurrentEditInternalAction, ScpExplorer->ExecuteFile(osCurrent, efInternalEditor, NULL, true, false))
@@ -521,7 +523,7 @@ void __fastcall TNonVisualDataModule::ExplorerActionsExecute(
     EXE(CurrentDeleteAction, ScpExplorer->ExecuteFileOperationCommand(foDelete, osCurrent, false))
     EXE(CurrentDeleteAlternativeAction, ScpExplorer->ExecuteFileOperationCommand(foDelete, osCurrent, false, false, (void*)true))
     EXE(CurrentPropertiesAction, ScpExplorer->ExecuteFileOperationCommand(foSetProperties, osCurrent, false))
-    EXE(CurrentCopyToClipboardAction, ScpExplorer->CopyFilesToClipboard(osCurrent))
+    EXE(CurrentCopyToClipboardAction, ScpExplorer->CopyFilesToClipboard(osCurrent, false))
     EXE(FileListToCommandLineAction, ScpExplorer->PanelExport(osCurrent, peFileList, pedCommandLine))
     EXE(FileListToClipboardAction, ScpExplorer->PanelExport(osCurrent, peFileList, pedClipboard))
     EXE(FullFileListToClipboardAction, ScpExplorer->PanelExport(osCurrent, peFullFileList, pedClipboard))

+ 18 - 0
source/forms/NonVisual.dfm

@@ -45,6 +45,11 @@ object NonVisualDataModule: TNonVisualDataModule
     object Rename1: TTBXItem
       Action = CurrentRenameAction
     end
+    object TBXSeparatorItem12: TTBXSeparatorItem
+    end
+    object TBXItem82: TTBXItem
+      Action = CurrentCopyToClipboardFocusedAction
+    end
     object N45: TTBXSeparatorItem
     end
     object RemoteFilePopupCustomCommandsMenu: TTBXSubmenuItem
@@ -2274,6 +2279,14 @@ object NonVisualDataModule: TNonVisualDataModule
       HelpKeyword = 'ui_pref_file_colors'
       Hint = 'Configure file color rules'
     end
+    object CurrentCopyToClipboardFocusedAction: TAction
+      Tag = 12
+      Category = 'Focused Operation'
+      Caption = '&Copy'
+      Hint = 'Copy|Copy the selected files to clipboard'
+      ImageIndex = 111
+      ShortCut = 16451
+    end
   end
   object ExplorerBarPopup: TTBXPopupMenu
     Images = GlyphsModule.ExplorerImages
@@ -3107,6 +3120,11 @@ object NonVisualDataModule: TNonVisualDataModule
     object TBXItem58: TTBXItem
       Action = CurrentRenameAction
     end
+    object TBXSeparatorItem11: TTBXSeparatorItem
+    end
+    object TBXItem81: TTBXItem
+      Action = CurrentCopyToClipboardFocusedAction
+    end
     object TBXSeparatorItem3: TTBXSeparatorItem
     end
     object LocalFilePopupCustomCommandsMenu: TTBXSubmenuItem

+ 5 - 0
source/forms/NonVisual.h

@@ -624,6 +624,11 @@ __published:    // IDE-managed Components
   TTBXItem *TBXItem79;
   TAction *ReconnectSessionAction;
   TTBXItem *TBXItem80;
+  TAction *CurrentCopyToClipboardFocusedAction;
+  TTBXSeparatorItem *TBXSeparatorItem11;
+  TTBXItem *TBXItem81;
+  TTBXSeparatorItem *TBXSeparatorItem12;
+  TTBXItem *TBXItem82;
   void __fastcall ExplorerActionsUpdate(TBasicAction *Action, bool &Handled);
   void __fastcall ExplorerActionsExecute(TBasicAction *Action, bool &Handled);
   void __fastcall SessionIdleTimerTimer(TObject *Sender);

+ 3 - 3
source/forms/ScpCommander.cpp

@@ -2249,16 +2249,16 @@ void __fastcall TScpCommanderForm::RemoteOpenDirButtonPopup(TTBCustomItem * /*Se
   CreateOpenDirMenu(RemoteOpenDirButton, osRemote);
 }
 //---------------------------------------------------------------------------
-void __fastcall TScpCommanderForm::CopyFilesToClipboard(TOperationSide Side)
+void __fastcall TScpCommanderForm::CopyFilesToClipboard(TOperationSide Side, bool OnFocused)
 {
   if (IsSideLocalBrowser(Side))
   {
     TInstantOperationVisualizer Visualizer;
-    dynamic_cast<TDirView *>(DirView(Side))->CopyToClipBoard();
+    dynamic_cast<TDirView *>(DirView(Side))->CopyToClipBoard(OnFocused);
   }
   else
   {
-    TCustomScpExplorerForm::CopyFilesToClipboard(Side);
+    TCustomScpExplorerForm::CopyFilesToClipboard(Side, OnFocused);
   }
 }
 //---------------------------------------------------------------------------

+ 1 - 1
source/forms/ScpCommander.h

@@ -620,7 +620,7 @@ public:
   virtual void __fastcall HistoryGo(TOperationSide Side, int Index);
   virtual void __fastcall DisplaySystemContextMenu();
   virtual void __fastcall GoToAddress();
-  virtual void __fastcall CopyFilesToClipboard(TOperationSide Side);
+  virtual void __fastcall CopyFilesToClipboard(TOperationSide Side, bool OnFocused);
   virtual void __fastcall PasteFromClipBoard();
 
   __property double LeftPanelWidth = { read = GetLeftPanelWidth, write = SetLeftPanelWidth };

+ 9 - 2
source/packages/filemng/CustomDirView.pas

@@ -250,6 +250,7 @@ type
     procedure ColClick(Column: TListColumn); override;
     procedure CreateWnd; override;
     procedure DestroyWnd; override;
+    function OperateOnFocusedFile(Focused: Boolean; OnlyFocused: Boolean = False): Boolean;
     function CustomCreateFileList(Focused, OnlyFocused: Boolean;
       FullPath: Boolean; FileList: TStrings = nil; ItemObject: Boolean = False): TStrings;
     function CustomDrawItem(Item: TListItem; State: TCustomDrawState;
@@ -2202,6 +2203,13 @@ begin
   Result := nil;
 end;
 
+function TCustomDirView.OperateOnFocusedFile(Focused, OnlyFocused: Boolean): Boolean;
+begin
+  Result :=
+    Assigned(ItemFocused) and
+    ((Focused and (not ItemFocused.Selected)) or (SelCount = 0) or OnlyFocused);
+end;
+
 function TCustomDirView.CustomCreateFileList(Focused, OnlyFocused: Boolean;
   FullPath: Boolean; FileList: TStrings; ItemObject: Boolean): TStrings;
 
@@ -2224,8 +2232,7 @@ begin
     else Result := TStringList.Create;
 
   try
-    if Assigned(ItemFocused) and
-       ((Focused and (not ItemFocused.Selected)) or (SelCount = 0) or OnlyFocused) then
+    if OperateOnFocusedFile(Focused, OnlyFocused) then
     begin
       AddItem(ItemFocused)
     end

+ 27 - 30
source/packages/filemng/DirView.pas

@@ -236,6 +236,7 @@ type
     procedure CMRecreateWnd(var Message: TMessage); message CM_RECREATEWND;
     procedure Load(DoFocusSomething: Boolean); override;
     function GetFileInfo(pszPath: LPCWSTR; dwFileAttributes: DWORD; var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD_PTR;
+    function DoCopyToClipboard(Focused: Boolean; Cut: Boolean; Operation: TClipBoardOperation): Boolean;
 
     function HiddenCount: Integer; override;
     function FilteredCount: Integer; override;
@@ -255,8 +256,8 @@ type
     function UndoCopyMove: Boolean; dynamic;
     {Clipboard fileoperation methods (requires drag&drop enabled):}
     procedure EmptyClipboard; dynamic;
-    function CopyToClipBoard: Boolean; dynamic;
-    function CutToClipBoard: Boolean; dynamic;
+    function CopyToClipBoard(Focused: Boolean): Boolean; dynamic;
+    function CutToClipBoard(Focused: Boolean): Boolean; dynamic;
     function PasteFromClipBoard(TargetPath: string = ''): Boolean; override;
     function DuplicateSelectedFiles: Boolean; dynamic;
     procedure DisplayPropertiesMenu; override;
@@ -3328,7 +3329,7 @@ begin
   end;
 end; {EmptyClipBoard}
 
-function TDirView.CopyToClipBoard : Boolean;
+function TDirView.DoCopyToClipboard(Focused: Boolean; Cut: Boolean; Operation: TClipBoardOperation): Boolean;
 var
   Item: TListItem;
   SaveCursor: TCursor;
@@ -3339,44 +3340,40 @@ begin
     Result := False;
     EmptyClipBoard;
     DragDropFilesEx.FileList.Clear;
-    if SelCount > 0 then
+    if OperateOnFocusedFile(Focused) or (SelCount > 0) then
     begin
-      Item := GetNextItem(nil, sdAll, [isSelected]);
-      while Assigned(Item) do
+      if OperateOnFocusedFile(Focused) then
       begin
-        DragDropFilesEx.FileList.AddItem(nil, ItemFullFileName(Item));
-        Item := GetNextItem(Item, sdAll, [isSelected]);
+        DragDropFilesEx.FileList.AddItem(nil, ItemFullFileName(ItemFocused));
+      end
+        else
+      begin
+        Item := GetNextItem(nil, sdAll, [isSelected]);
+        while Assigned(Item) do
+        begin
+          DragDropFilesEx.FileList.AddItem(nil, ItemFullFileName(Item));
+          Item.Cut := Cut;
+          Item := GetNextItem(Item, sdAll, [isSelected]);
+        end;
       end;
 
       Result := DragDropFilesEx.CopyToClipBoard;
-      LastClipBoardOperation := cboCopy;
+      LastClipBoardOperation := Operation;
     end;
   finally
     Screen.Cursor := SaveCursor;
   end;
-end; {CopyToClipBoard}
+end; {DoCopyToClipBoard}
 
-function TDirView.CutToClipBoard : Boolean;
-var
-  Item: TListItem;
+function TDirView.CopyToClipBoard(Focused: Boolean): Boolean;
 begin
-  Result := False;
-  EmptyClipBoard;
-  DragDropFilesEx.FileList.Clear;
-  if SelCount > 0 then
-  begin
-    Item := GetNextItem(nil, sdAll, [isSelected]);
-    while Assigned(Item) do
-    begin
-      DragDropFilesEx.FileList.AddItem(nil, ItemFullFileName(Item));
-      Item.Cut := True;
-      Item := GetNextItem(Item, sdAll, [isSelected]);
-    end;
+  Result := DoCopyToClipboard(Focused, False, cboCopy);
+end;
 
-    Result := DragDropFilesEx.CopyToClipBoard;
-    LastClipBoardOperation := cboCut;
-  end;
-end; {CutToClipBoard}
+function TDirView.CutToClipBoard(Focused: Boolean): Boolean;
+begin
+  Result := DoCopyToClipboard(Focused, True, cboCut);
+end;
 
 function TDirView.PasteFromClipBoard(TargetPath: string): Boolean;
 begin
@@ -3421,7 +3418,7 @@ begin
   Result := False;
   if SelCount > 0 then
   begin
-    Result := CopyToClipBoard;
+    Result := CopyToClipBoard(False);
     if Result then
       try
         SelectNewFiles := True;