Parcourir la source

Bug 582: Toolbar buttons can be hidden (reimplemented using explicit "Customize Toolbar" submenu)

https://winscp.net/tracker/582

Source commit: 16b82bd015262798e8b627b909334221e5f277c9
Martin Prikryl il y a 7 ans
Parent
commit
b6a612c614

+ 17 - 0
source/forms/CustomScpExplorer.cpp

@@ -9387,3 +9387,20 @@ void __fastcall TCustomScpExplorerForm::ChangeScale(int M, int D)
     GUIConfiguration->ChangeResourceModule(ResourceModule);
   }
 }
+//---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::DockContextPopup(TObject * Sender, TPoint & MousePos, bool & /*Handled*/)
+{
+  NonVisualDataModule->ControlContextPopup(Sender, MousePos);
+}
+//---------------------------------------------------------------------
+class TPublicControl : public TControl
+{
+friend class TCustomScpExplorerForm;
+};
+//---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::CopyPopup(TControl * DestControl, TControl * SourceControl)
+{
+  static_cast<TPublicControl *>(DestControl)->PopupMenu = static_cast<TPublicControl *>(SourceControl)->PopupMenu;
+  static_cast<TPublicControl *>(DestControl)->OnContextPopup = static_cast<TPublicControl *>(SourceControl)->OnContextPopup;
+}
+//---------------------------------------------------------------------------

+ 3 - 1
source/forms/CustomScpExplorer.h

@@ -186,6 +186,7 @@ __published:
   void __fastcall EditMenuItemPopup(TTBCustomItem *Sender, bool FromLink);
   void __fastcall DirViewBusy(TObject *Sender, int Busy, bool & Allow);
   void __fastcall SessionsPageControlContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled);
+  void __fastcall DockContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled);
 
 private:
   TTerminal * FTerminal;
@@ -341,6 +342,7 @@ protected:
   bool __fastcall RemoteTransferFiles(TStrings * FileList, bool NoConfirmation,
     bool Move, TTerminal * Session);
   virtual void __fastcall DoDirViewExecFile(TObject * Sender, TListItem * Item, bool & AllowExec);
+  virtual TControl * __fastcall GetComponent(Byte Component);
   bool __fastcall GetComponentVisible(Byte Component);
   virtual Boolean __fastcall GetHasDirView(TOperationSide Side);
   DYNAMIC void __fastcall KeyDown(Word & Key, Classes::TShiftState Shift);
@@ -590,6 +592,7 @@ protected:
   DYNAMIC void __fastcall ChangeScale(int M, int D);
   virtual void __fastcall UpdateImages();
   void __fastcall UpdatePixelsPerInchMainWindowCounter();
+  void __fastcall CopyPopup(TControl * DestControl, TControl * SourceControl);
 
 public:
   virtual __fastcall ~TCustomScpExplorerForm();
@@ -619,7 +622,6 @@ public:
   void __fastcall UnlockWindow();
   void __fastcall SuspendWindowLock();
   void __fastcall ResumeWindowLock();
-  virtual TControl * __fastcall GetComponent(Byte Component);
 
   void __fastcall NewSession(bool FromSite, const UnicodeString & SessionUrl = L"");
   void __fastcall DuplicateSession();

+ 64 - 29
source/forms/NonVisual.cpp

@@ -114,6 +114,7 @@ __fastcall TNonVisualDataModule::TNonVisualDataModule(TComponent* Owner)
 {
   FListColumn = NULL;
   FSessionIdleTimerExecuting = false;
+  FCustomizedToolbar = NULL;
   FBusy = 0;
 
   QueueSpeedComboBoxItem(QueuePopupSpeedComboBoxItem);
@@ -338,6 +339,7 @@ void __fastcall TNonVisualDataModule::ExplorerActionsUpdate(
   UPDCOMP(CustomCommandsBand)
   UPD(ColorMenuAction, HasTerminal)
   UPD(GoToAddressAction, true)
+  UPD(CustomizeToolbarAction, IsToolbarCustomizable())
 
   // SORT
   UPDSORTA(Local)
@@ -649,6 +651,7 @@ void __fastcall TNonVisualDataModule::ExplorerActionsExecute(
     EXECOMP(CustomCommandsBand)
     EXE(ColorMenuAction, CreateSessionColorMenu(ColorMenuAction))
     EXE(GoToAddressAction, ScpExplorer->GoToAddress())
+    EXE(CustomizeToolbarAction, CreateToolbarButtonsList())
 
     #define COLVIEWPROPS ((TCustomDirViewColProperties*)(((TCustomDirView*)(((TListColumns*)(ListColumn->Collection))->Owner()))->ColProperties))
     // SORT
@@ -1811,43 +1814,75 @@ void __fastcall TNonVisualDataModule::ToolbarButtonItemClick(TObject * Sender)
   ButtonItem->Visible = !ButtonItem->Visible;
 }
 //---------------------------------------------------------------------------
-void __fastcall TNonVisualDataModule::ToolbarComponentPopup(TTBCustomItem * Sender, bool /*FromLink*/)
+bool __fastcall TNonVisualDataModule::IsCustomizableToolbarItem(TTBCustomItem * Item)
 {
-  Byte Component = 0;
-  #define EMIT_BAND_COMPONENT(COMP) if (Sender->Action == COMP ## Action) { Component = fc ## COMP; }
-  BAND_COMPONENTS
-  #undef EMIT_BAND_COMPONENT
-
-  if (DebugAlwaysTrue(Component != 0))
+  return
+    (dynamic_cast<TTBXItem *>(Item) != NULL) ||
+    (dynamic_cast<TTBXSubmenuItem *>(Item) != NULL);
+}
+//---------------------------------------------------------------------------
+bool __fastcall TNonVisualDataModule::IsToolbarCustomizable()
+{
+  bool Result = false;
+  if (FCustomizedToolbar != NULL)
   {
-    TTBCustomToolbar * Toolbar = dynamic_cast<TTBCustomToolbar *>(ScpExplorer->GetComponent(Component));
-    if (DebugAlwaysTrue(Toolbar != NULL))
+    for (int Index = 0; Index < FCustomizedToolbar->Items->Count; Index++)
     {
-      Sender->Clear();
-
-      for (int Index = 0; Index < Toolbar->Items->Count; Index++)
+      if (IsCustomizableToolbarItem(FCustomizedToolbar->Items->Items[Index]))
       {
-        TTBCustomItem * ButtonItem = Toolbar->Items->Items[Index];
+        Result = true;
+        break;
+      }
+    }
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TNonVisualDataModule::CreateToolbarButtonsList()
+{
+  if (FCustomizedToolbar != NULL)
+  {
+    TTBCustomItem * CustomizeItem = DebugNotNull(dynamic_cast<TTBCustomItem *>(CustomizeToolbarAction->ActionComponent));
+    CustomizeItem->Clear();
 
-        TTBCustomItem * Item;
-        if (dynamic_cast<TTBSeparatorItem *>(ButtonItem) != NULL)
-        {
-          Item = new TTBSeparatorItem(Sender);
-        }
-        else
-        {
-          Item = new TTBXItem(Sender);
-          Item->Caption = StripEllipsis(ButtonItem->Caption);
-          Item->ImageIndex = ButtonItem->ImageIndex;
-          Item->Tag = reinterpret_cast<int>(ButtonItem);
-          Item->OnClick = ToolbarButtonItemClick;
-          Item->Checked = ButtonItem->Visible;
-          Item->Enabled = Toolbar->Visible;
-        }
+    for (int Index = 0; Index < FCustomizedToolbar->Items->Count; Index++)
+    {
+      TTBCustomItem * ButtonItem = FCustomizedToolbar->Items->Items[Index];
 
-        Sender->Insert(Sender->Count, Item);
+      TTBCustomItem * Item = NULL;
+      if (dynamic_cast<TTBSeparatorItem *>(ButtonItem) != NULL)
+      {
+        Item = new TTBSeparatorItem(CustomizeItem);
+      }
+      else if (IsCustomizableToolbarItem(ButtonItem))
+      {
+        Item = new TTBXItem(CustomizeItem);
+        Item->Caption = StripEllipsis(ButtonItem->Caption);
+        Item->ImageIndex = ButtonItem->ImageIndex;
+        Item->Tag = reinterpret_cast<int>(ButtonItem);
+        Item->OnClick = ToolbarButtonItemClick;
+        Item->Checked = ButtonItem->Visible;
+      }
+
+      if (Item != NULL)
+      {
+        CustomizeItem->Insert(CustomizeItem->Count, Item);
       }
     }
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TNonVisualDataModule::ControlContextPopup(TObject * Sender, const TPoint & MousePos)
+{
+  TTBDock * Dock = dynamic_cast<TTBDock *>(Sender);
+  if (Dock != NULL)
+  {
+    // While we can identify toolbar for which context menu is popping up in OnExecute,
+    // we cannot in OnUpdate, so we have to remeber it here.
+    FCustomizedToolbar = dynamic_cast<TTBCustomToolbar *>(Dock->ControlAtPos(MousePos, true, true, false));
+  }
+  else
+  {
+    FCustomizedToolbar = NULL;
+  }
+}

+ 47 - 75
source/forms/NonVisual.dfm

@@ -45,6 +45,9 @@ object NonVisualDataModule: TNonVisualDataModule
     object Rename1: TTBXItem
       Action = CurrentRenameAction
     end
+    object TBXSubmenuItem8: TTBXSubmenuItem
+      Action = CustomizeToolbarAction
+    end
     object N45: TTBXSeparatorItem
     end
     object RemoteFilePopupCustomCommandsMenu: TTBXSubmenuItem
@@ -2224,6 +2227,13 @@ object NonVisualDataModule: TNonVisualDataModule
       Hint = 'Create file|Create new file and open it in editor'
       ImageIndex = 77
     end
+    object CustomizeToolbarAction: TAction
+      Tag = 15
+      Category = 'View'
+      Caption = '&Customize Toolbar'
+      HelpKeyword = 'ui_toolbars'
+      Hint = 'Show/hide toolbar buttons'
+    end
   end
   object ExplorerBarPopup: TTBXPopupMenu
     Images = GlyphsModule.ExplorerImages
@@ -2233,30 +2243,20 @@ object NonVisualDataModule: TNonVisualDataModule
     object Address2: TTBXItem
       Action = ExplorerAddressBandAction
     end
-    object StandardButtons1: TTBXSubmenuItem
+    object StandardButtons1: TTBXItem
       Action = ExplorerToolbarBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object SelectionButtons1: TTBXSubmenuItem
+    object SelectionButtons1: TTBXItem
       Action = ExplorerSelectionBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object SessionButtons2: TTBXSubmenuItem
+    object SessionButtons2: TTBXItem
       Action = ExplorerSessionBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object PreferencesButtons1: TTBXSubmenuItem
+    object PreferencesButtons1: TTBXItem
       Action = ExplorerPreferencesBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object SortButtons3: TTBXSubmenuItem
+    object SortButtons3: TTBXItem
       Action = ExplorerSortBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
     object TBXItem3: TTBXItem
       Action = ExplorerUpdatesBandAction
@@ -2273,6 +2273,9 @@ object NonVisualDataModule: TNonVisualDataModule
     object TBXItem48: TTBXItem
       Action = SelectiveToolbarTextAction
     end
+    object TBXSubmenuItem4: TTBXSubmenuItem
+      Action = CustomizeToolbarAction
+    end
     object N5: TTBXSeparatorItem
     end
     object SessionsTabsAction2: TTBXItem
@@ -2326,25 +2329,17 @@ object NonVisualDataModule: TNonVisualDataModule
     Options = [tboShowHint]
     Left = 424
     Top = 264
-    object CommandsButtons2: TTBXSubmenuItem
+    object CommandsButtons2: TTBXItem
       Action = CommanderCommandsBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object SessionButtons5: TTBXSubmenuItem
+    object SessionButtons5: TTBXItem
       Action = CommanderSessionBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object PreferencesButtons4: TTBXSubmenuItem
+    object PreferencesButtons4: TTBXItem
       Action = CommanderPreferencesBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object SortButtons2: TTBXSubmenuItem
+    object SortButtons2: TTBXItem
       Action = CommanderSortBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
     object TBXItem2: TTBXItem
       Action = CommanderUpdatesBandAction
@@ -2361,6 +2356,9 @@ object NonVisualDataModule: TNonVisualDataModule
     object TBXItem46: TTBXItem
       Action = SelectiveToolbarTextAction
     end
+    object TBXItem77: TTBXSubmenuItem
+      Action = CustomizeToolbarAction
+    end
     object N26: TTBXSeparatorItem
     end
     object SessionsTabsAction1: TTBXItem
@@ -2381,25 +2379,17 @@ object NonVisualDataModule: TNonVisualDataModule
       Caption = '&Local Panel'
       HelpKeyword = 'ui_file_panel'
       Hint = 'Change local panel layout'
-      object HistoryButtons3: TTBXSubmenuItem
+      object HistoryButtons3: TTBXItem
         Action = CommanderLocalHistoryBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object NavigationButtons3: TTBXSubmenuItem
+      object NavigationButtons3: TTBXItem
         Action = CommanderLocalNavigationBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object TBXItem40: TTBXSubmenuItem
+      object TBXItem40: TTBXItem
         Action = CommanderLocalFileBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object TBXItem43: TTBXSubmenuItem
+      object TBXItem43: TTBXItem
         Action = CommanderLocalSelectionBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
       object N23: TTBXSeparatorItem
       end
@@ -2416,25 +2406,17 @@ object NonVisualDataModule: TNonVisualDataModule
       Caption = '&Remote Panel'
       HelpKeyword = 'ui_file_panel'
       Hint = 'Change remote panel layout'
-      object HistoryButtons4: TTBXSubmenuItem
+      object HistoryButtons4: TTBXItem
         Action = CommanderRemoteHistoryBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object NavigationButtons4: TTBXSubmenuItem
+      object NavigationButtons4: TTBXItem
         Action = CommanderRemoteNavigationBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object TBXItem41: TTBXSubmenuItem
+      object TBXItem41: TTBXItem
         Action = CommanderRemoteFileBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
-      object TBXItem42: TTBXSubmenuItem
+      object TBXItem42: TTBXItem
         Action = CommanderRemoteSelectionBandAction
-        DropdownCombo = True
-        OnPopup = ToolbarComponentPopup
       end
       object N25: TTBXSeparatorItem
       end
@@ -2497,25 +2479,17 @@ object NonVisualDataModule: TNonVisualDataModule
     end
     object N51: TTBXSeparatorItem
     end
-    object HistoryButtons5: TTBXSubmenuItem
+    object HistoryButtons5: TTBXItem
       Action = CommanderRemoteHistoryBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object NavigationButtons5: TTBXSubmenuItem
+    object NavigationButtons5: TTBXItem
       Action = CommanderRemoteNavigationBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object TBXItem14: TTBXSubmenuItem
+    object TBXItem14: TTBXItem
       Action = CommanderRemoteFileBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object TBXItem45: TTBXSubmenuItem
+    object TBXItem45: TTBXItem
       Action = CommanderRemoteSelectionBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
     object TBXItem37: TTBXItem
       Action = LockToolbarsAction
@@ -2523,6 +2497,9 @@ object NonVisualDataModule: TNonVisualDataModule
     object TBXItem49: TTBXItem
       Action = SelectiveToolbarTextAction
     end
+    object TBXSubmenuItem9: TTBXSubmenuItem
+      Action = CustomizeToolbarAction
+    end
     object N28: TTBXSeparatorItem
     end
     object Tree5: TTBXItem
@@ -2556,25 +2533,17 @@ object NonVisualDataModule: TNonVisualDataModule
     end
     object N52: TTBXSeparatorItem
     end
-    object HistoryButtons6: TTBXSubmenuItem
+    object HistoryButtons6: TTBXItem
       Action = CommanderLocalHistoryBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object NavigationButtons6: TTBXSubmenuItem
+    object NavigationButtons6: TTBXItem
       Action = CommanderLocalNavigationBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object TBXItem39: TTBXSubmenuItem
+    object TBXItem39: TTBXItem
       Action = CommanderLocalFileBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
-    object TBXItem44: TTBXSubmenuItem
+    object TBXItem44: TTBXItem
       Action = CommanderLocalSelectionBandAction
-      DropdownCombo = True
-      OnPopup = ToolbarComponentPopup
     end
     object TBXItem38: TTBXItem
       Action = LockToolbarsAction
@@ -2582,6 +2551,9 @@ object NonVisualDataModule: TNonVisualDataModule
     object TBXItem47: TTBXItem
       Action = SelectiveToolbarTextAction
     end
+    object TBXSubmenuItem6: TTBXSubmenuItem
+      Action = CustomizeToolbarAction
+    end
     object N29: TTBXSeparatorItem
     end
     object Tree6: TTBXItem

+ 36 - 26
source/forms/NonVisual.h

@@ -235,25 +235,25 @@ __published:    // IDE-managed Components
   TAction *FileGenerateUrlAction2;
   TAction *TableOfContentsAction;
   TTBXPopupMenu *CommanderBarPopup;
-  TTBXSubmenuItem *SessionButtons5;
-  TTBXSubmenuItem *PreferencesButtons4;
-  TTBXSubmenuItem *SortButtons2;
-  TTBXSubmenuItem *CommandsButtons2;
+  TTBXItem *SessionButtons5;
+  TTBXItem *PreferencesButtons4;
+  TTBXItem *SortButtons2;
+  TTBXItem *CommandsButtons2;
   TTBXSeparatorItem *N26;
   TTBXItem *CommandLine2;
   TTBXItem *CommandsToolbar1;
   TTBXItem *StatusBar8;
   TTBXSeparatorItem *N27;
   TTBXSubmenuItem *LocalPanel1;
-  TTBXSubmenuItem *HistoryButtons3;
-  TTBXSubmenuItem *NavigationButtons3;
+  TTBXItem *HistoryButtons3;
+  TTBXItem *NavigationButtons3;
   TTBXSeparatorItem *N23;
   TTBXItem *Tree7;
   TTBXSeparatorItem *N77;
   TTBXItem *StatusBar6;
   TTBXSubmenuItem *RemotePanel2;
-  TTBXSubmenuItem *HistoryButtons4;
-  TTBXSubmenuItem *NavigationButtons4;
+  TTBXItem *HistoryButtons4;
+  TTBXItem *NavigationButtons4;
   TTBXSeparatorItem *N25;
   TTBXItem *Tree8;
   TTBXSeparatorItem *N78;
@@ -270,8 +270,8 @@ __published:    // IDE-managed Components
   TTBXItem *CopyPathtoClipboard1;
   TTBXItem *OpenDirectoryBookmark1;
   TTBXSeparatorItem *N51;
-  TTBXSubmenuItem *HistoryButtons5;
-  TTBXSubmenuItem *NavigationButtons5;
+  TTBXItem *HistoryButtons5;
+  TTBXItem *NavigationButtons5;
   TTBXSeparatorItem *N28;
   TTBXItem *Tree5;
   TTBXSeparatorItem *N75;
@@ -280,8 +280,8 @@ __published:    // IDE-managed Components
   TTBXItem *CopyPathtoClipboard2;
   TTBXItem *OpenDirectoryBookmark2;
   TTBXSeparatorItem *N52;
-  TTBXSubmenuItem *HistoryButtons6;
-  TTBXSubmenuItem *NavigationButtons6;
+  TTBXItem *HistoryButtons6;
+  TTBXItem *NavigationButtons6;
   TTBXSeparatorItem *N29;
   TTBXItem *Tree6;
   TTBXSeparatorItem *N76;
@@ -379,11 +379,11 @@ __published:    // IDE-managed Components
   TTBXItem *Customize3;
   TTBXPopupMenu *ExplorerBarPopup;
   TTBXItem *Address2;
-  TTBXSubmenuItem *StandardButtons1;
-  TTBXSubmenuItem *SelectionButtons1;
-  TTBXSubmenuItem *SessionButtons2;
-  TTBXSubmenuItem *PreferencesButtons1;
-  TTBXSubmenuItem *SortButtons3;
+  TTBXItem *StandardButtons1;
+  TTBXItem *SelectionButtons1;
+  TTBXItem *SessionButtons2;
+  TTBXItem *PreferencesButtons1;
+  TTBXItem *SortButtons3;
   TTBXSeparatorItem *N5;
   TTBXItem *StatusBar2;
   TTBXSeparatorItem *N72;
@@ -514,10 +514,10 @@ __published:    // IDE-managed Components
   TAction *RemoteAddEditLinkAction2;
   TAction *CommanderLocalFileBandAction;
   TAction *CommanderRemoteFileBandAction;
-  TTBXSubmenuItem *TBXItem14;
-  TTBXSubmenuItem *TBXItem39;
-  TTBXSubmenuItem *TBXItem40;
-  TTBXSubmenuItem *TBXItem41;
+  TTBXItem *TBXItem14;
+  TTBXItem *TBXItem39;
+  TTBXItem *TBXItem40;
+  TTBXItem *TBXItem41;
   TAction *RemoteCopyFocusedAction;
   TAction *RemoteMoveFocusedAction;
   TAction *LocalSelectAction;
@@ -528,10 +528,10 @@ __published:    // IDE-managed Components
   TAction *RemoteSelectAllAction;
   TAction *CommanderLocalSelectionBandAction;
   TAction *CommanderRemoteSelectionBandAction;
-  TTBXSubmenuItem *TBXItem42;
-  TTBXSubmenuItem *TBXItem43;
-  TTBXSubmenuItem *TBXItem44;
-  TTBXSubmenuItem *TBXItem45;
+  TTBXItem *TBXItem42;
+  TTBXItem *TBXItem43;
+  TTBXItem *TBXItem44;
+  TTBXItem *TBXItem45;
   TAction *SelectiveToolbarTextAction;
   TTBXItem *TBXItem46;
   TTBXItem *TBXItem47;
@@ -610,6 +610,12 @@ __published:    // IDE-managed Components
   TAction *ChangePasswordAction;
   TAction *RemoteNewFileAction;
   TAction *LocalNewFileAction;
+  TTBXSubmenuItem *TBXItem77;
+  TAction *CustomizeToolbarAction;
+  TTBXSubmenuItem *TBXSubmenuItem4;
+  TTBXSubmenuItem *TBXSubmenuItem6;
+  TTBXSubmenuItem *TBXSubmenuItem8;
+  TTBXSubmenuItem *TBXSubmenuItem9;
   void __fastcall ExplorerActionsUpdate(TBasicAction *Action, bool &Handled);
   void __fastcall ExplorerActionsExecute(TBasicAction *Action, bool &Handled);
   void __fastcall SessionIdleTimerTimer(TObject *Sender);
@@ -623,13 +629,13 @@ __published:    // IDE-managed Components
           const UnicodeString AText, int AIndex, int &ImageIndex);
   UnicodeString __fastcall CustomCommandCaption(const TCustomCommandType * Command, bool Toolbar);
   UnicodeString __fastcall CustomCommandHint(const TCustomCommandType * Command);
-  void __fastcall ToolbarComponentPopup(TTBCustomItem *Sender, bool FromLink);
 
 private:
   TListColumn * FListColumn;
   TCustomScpExplorerForm * FScpExplorer;
   bool FSessionIdleTimerExecuting;
   int FBusy;
+  TTBCustomToolbar * FCustomizedToolbar;
 
   void __fastcall SetScpExplorer(TCustomScpExplorerForm * value);
   bool __fastcall GetBusy();
@@ -637,6 +643,9 @@ private:
 protected:
   void __fastcall CreateSessionListMenu(TAction * Action);
   void __fastcall CreateSessionListMenuLevel(TTBCustomItem * Menu, int Index, int Level);
+  void __fastcall CreateToolbarButtonsList();
+  bool __fastcall IsCustomizableToolbarItem(TTBCustomItem * Item);
+  bool __fastcall IsToolbarCustomizable();
   UnicodeString __fastcall GetSessionFolderRoot(TSessionData * Data, int Level);
   void __fastcall CreateWorkspacesMenu(TAction * Action);
   void __fastcall WorkspaceItemClick(TObject * Sender);
@@ -689,6 +698,7 @@ public:
   void __fastcall ResetQueueOnceEmptyOperation();
   void __fastcall StartBusy();
   void __fastcall EndBusy();
+  void __fastcall ControlContextPopup(TObject * Sender, const TPoint & MousePos);
 
   __property TListColumn * ListColumn = { read = FListColumn, write = FListColumn };
   __property TCustomScpExplorerForm * ScpExplorer = { read = FScpExplorer, write = SetScpExplorer };

+ 13 - 13
source/forms/ScpCommander.cpp

@@ -86,23 +86,23 @@ __fastcall TScpCommanderForm::TScpCommanderForm(TComponent* Owner)
   RemoteForwardButton->LinkSubitems = HistoryMenu(osRemote, false)->Items;
 
   TopDock->PopupMenu = NonVisualDataModule->CommanderBarPopup;
-  StatusBar->PopupMenu = TopDock->PopupMenu;
-  QueueDock->PopupMenu = TopDock->PopupMenu;
-  QueueLabel->PopupMenu = TopDock->PopupMenu;
-  BottomDock->PopupMenu = TopDock->PopupMenu;
-  QueueSeparatorPanel->PopupMenu = TopDock->PopupMenu;
+  CopyPopup(StatusBar, TopDock);
+  CopyPopup(QueueDock, TopDock);
+  CopyPopup(QueueLabel, TopDock);
+  CopyPopup(BottomDock, TopDock);
+  CopyPopup(QueueSeparatorPanel, TopDock);
 
   LocalTopDock->PopupMenu = NonVisualDataModule->LocalPanelPopup;
-  LocalPathLabel->PopupMenu = LocalTopDock->PopupMenu;
-  LocalStatusBar->PopupMenu = LocalTopDock->PopupMenu;
-  LocalDriveView->PopupMenu = LocalTopDock->PopupMenu;
-  LocalBottomDock->PopupMenu = LocalTopDock->PopupMenu;
+  CopyPopup(LocalPathLabel, LocalTopDock);
+  CopyPopup(LocalStatusBar, LocalTopDock);
+  CopyPopup(LocalDriveView, LocalTopDock);
+  CopyPopup(LocalBottomDock, LocalTopDock);
 
   RemoteTopDock->PopupMenu = NonVisualDataModule->RemotePanelPopup;
-  RemotePathLabel->PopupMenu = RemoteTopDock->PopupMenu;
-  RemoteStatusBar->PopupMenu = RemoteTopDock->PopupMenu;
-  RemoteDriveView->PopupMenu = RemoteTopDock->PopupMenu;
-  RemoteBottomDock->PopupMenu = RemoteTopDock->PopupMenu;
+  CopyPopup(RemotePathLabel, RemoteTopDock);
+  CopyPopup(RemoteStatusBar, RemoteTopDock);
+  CopyPopup(RemoteDriveView, RemoteTopDock);
+  CopyPopup(RemoteBottomDock, RemoteTopDock);
 
   SetShortcuts();
   Splitter->ShowHint = True;

+ 4 - 0
source/forms/ScpCommander.dfm

@@ -29,6 +29,7 @@ inherited ScpCommanderForm: TScpCommanderForm
   inherited TopDock: TTBXDock
     Width = 898
     Height = 156
+    OnContextPopup = DockContextPopup
     object MenuToolbar: TTBXToolbar
       Left = 0
       Top = 0
@@ -1108,6 +1109,7 @@ inherited ScpCommanderForm: TScpCommanderForm
       Height = 79
       Color = clBtnFace
       FixAlign = True
+      OnContextPopup = DockContextPopup
       object RemoteHistoryToolbar: TTBXToolbar
         Left = 0
         Top = 27
@@ -1445,6 +1447,7 @@ inherited ScpCommanderForm: TScpCommanderForm
       Height = 79
       Color = clBtnFace
       FixAlign = True
+      OnContextPopup = DockContextPopup
       object LocalHistoryToolbar: TTBXToolbar
         Left = 0
         Top = 27
@@ -1654,6 +1657,7 @@ inherited ScpCommanderForm: TScpCommanderForm
     Height = 53
     FixAlign = True
     Position = dpBottom
+    OnContextPopup = DockContextPopup
     object Toolbar2Toolbar: TTBXToolbar
       Left = 0
       Top = 27

+ 7 - 7
source/forms/ScpExplorer.cpp

@@ -46,13 +46,13 @@ __fastcall TScpExplorerForm::TScpExplorerForm(TComponent* Owner)
   ForwardButton->LinkSubitems = HistoryMenu(osRemote, false)->Items;
 
   TopDock->PopupMenu = NonVisualDataModule->ExplorerBarPopup;
-  RemoteStatusBar->PopupMenu = TopDock->PopupMenu;
-  QueueDock->PopupMenu = TopDock->PopupMenu;
-  QueueLabel->PopupMenu = TopDock->PopupMenu;
-  RemoteDriveView->PopupMenu = TopDock->PopupMenu;
-  BottomDock->PopupMenu = TopDock->PopupMenu;
-  LeftDock->PopupMenu = TopDock->PopupMenu;
-  RightDock->PopupMenu = TopDock->PopupMenu;
+  CopyPopup(RemoteStatusBar, TopDock);
+  CopyPopup(QueueDock, TopDock);
+  CopyPopup(QueueLabel, TopDock);
+  CopyPopup(RemoteDriveView, TopDock);
+  CopyPopup(BottomDock, TopDock);
+  CopyPopup(LeftDock, TopDock);
+  CopyPopup(RightDock, TopDock);
   reinterpret_cast<TLabel*>(RemotePanelSplitter)->OnDblClick = RemotePanelSplitterDblClick;
 
   QueuePanel->Parent = RemotePanel;

+ 1 - 0
source/forms/ScpExplorer.dfm

@@ -17,6 +17,7 @@ inherited ScpExplorerForm: TScpExplorerForm
   inherited TopDock: TTBXDock
     Width = 632
     Height = 209
+    OnContextPopup = DockContextPopup
     object MenuToolbar: TTBXToolbar
       Left = 0
       Top = 0