1: /*
     2:  ============================================================================
     3:  xoblite™ -> an advanced "extended shell" for Microsoft® Windows® 11
     4:  Copyright © 2002-2026 Karl Henrik Henriksson [qwilk/@xoblite]
     5:  Copyright © 2001-2004 The Blackbox for Windows Development Team
     6:  http://xoblite.net/ + https://github.com/xoblite/
     7:  ============================================================================
     8: 
     9:   Blackbox for Windows is free software, released under the
    10:   GNU General Public License (GPL version 2 or later), with an extension
    11:   that allows linking of proprietary modules under a controlled interface.
    12:   What this means is that plugins etc. are allowed to be released
    13:   under any license the author wishes. Please note, however, that the
    14:   original Blackbox gradient math code used in Blackbox for Windows
    15:   is available under the BSD license.
    16: 
    17:   http://www.fsf.org/licenses/gpl.html
    18:   http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
    19:   http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
    20: 
    21:   This program is distributed in the hope that it will be useful,
    22:   but WITHOUT ANY WARRANTY; without even the implied warranty of
    23:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    24:   GNU General Public License for more details.
    25: 
    26:   For additional license information, please read the included license.html.
    27: 
    28:  ============================================================================
    29: */
    30: 
    31: #include "..\API\BBApi.h" 
    32: #include "..\Menu\MenuCommon.h" 
    33: #include "DockMenu.h" 
    34: #include "..\Plugins\PluginsMenu.h" 
    35: #include "..\Menu\MenuItem.h" 
    36: #include "..\Menu\FolderItem.h" 
    37: #include "..\Settings\ConfigMenu.h" 
    38: #include "Dock.h" 
    39: #include "..\Settings\Settings.h" 
    40: #include "..\Plugins\PluginManager.h" 
    41: 
    42: extern MenuCommon *pMenuCommon;
    43: extern Dock *pDock;
    44: extern Settings *pSettings;
    45: extern PluginManager *pPluginManager;
    46: 
    47: char dockBroam[] = "@xoblite Dock";
    48: char dockPlacementBroam[] = "@xoblite Dock Placement";
    49: char dockOrientationBroam[] = "@xoblite Dock Orientation";
    50: 
    51: #define GROUP_DOCK_PLACEMENT 1 
    52: #define GROUP_DOCK_ORIENTATION 2 
    53: 
    54: //===========================================================================
    55: 
    56: DockMenu::DockMenu(char* pszTitle) : FolderItem(NULL, pszTitle, NULL)
    57: {
    58: }
    59: 
    60: DockMenu::~DockMenu()
    61: {
    62:     m_pParent->RemoveChild(m_pSubMenu);
    63:     if (m_pSubMenu) delete m_pSubMenu;
    64:     m_pSubMenu = NULL;
    65: }
    66: 
    67: //===========================================================================
    68: 
    69: bool DockMenu::Active(bool bActivate)
    70: {
    71:     if (bActivate && !m_bActive) UpdateFolder();
    72:     return FolderItem::Active(bActivate);
    73: }
    74: 
    75: void DockMenu::Attached(Menu* pMenu)
    76: {
    77:     m_pParent = pMenu;
    78:     m_pSubMenu = new Menu(pMenuCommon->hInst);
    79:     m_pParent->AddChild(m_pSubMenu);
    80:     m_pSubMenu->SetParent(m_pParent);
    81: }
    82: 
    83: //===========================================================================
    84: 
    85: void DockMenu::UpdateFolder()
    86: {
    87:     m_pSubMenu->DeleteMenuItems();
    88:     pMenuCommon->AddHeaderItem(m_pSubMenu, m_pszTitleANSI);
    89: 
    90:     MenuItem* groupItem;
    91:     char command[50];
    92: 
    93:     //====================
    94: 
    95:     Menu* placementSubMenu = MakeMenu("Placement");
    96: 
    97:     if (pSettings->DockPlacement.placement == PLACEMENT_MANUAL)
    98:     {
    99:         char itemTitle[128];
   100:         sprintf_s(itemTitle, sizeof(itemTitle), "<%s>", pSettings->DockPlacement.rcString);
   101:         groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_EDITSTRING, dockPlacementBroam, pSettings->DockPlacement.rcString, itemTitle, true);
   102:     }
   103:     else groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_EDITSTRING, dockPlacementBroam, "Manual xC y50", "<Manual xC y50>", false);
   104:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   105: //  pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   106: //  groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "OppositeToolbar", "Opposite Toolbar", (pSettings->DockPlacement.placement == PLACEMENT_OPPOSITE_TOOLBAR));
   107: //  groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   108:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   109:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "TopLeft", "Top Left", (pSettings->DockPlacement.placement == PLACEMENT_TOP_LEFT));
   110:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   111:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "CenterLeft", "Center Left", (pSettings->DockPlacement.placement == PLACEMENT_CENTER_LEFT));
   112:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   113:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "BottomLeft", "Bottom Left", (pSettings->DockPlacement.placement == PLACEMENT_BOTTOM_LEFT));
   114:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   115:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   116:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "TopCenter", "Top Center", (pSettings->DockPlacement.placement == PLACEMENT_TOP_CENTER));
   117:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   118:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "BottomCenter", "Bottom Center", (pSettings->DockPlacement.placement == PLACEMENT_BOTTOM_CENTER));
   119:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   120:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   121:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "TopRight", "Top Right", (pSettings->DockPlacement.placement == PLACEMENT_TOP_RIGHT));
   122:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   123:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "CenterRight", "Center Right", (pSettings->DockPlacement.placement == PLACEMENT_CENTER_RIGHT));
   124:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   125:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, dockPlacementBroam, "BottomRight", "Bottom Right", (pSettings->DockPlacement.placement == PLACEMENT_BOTTOM_RIGHT));
   126:     groupItem->AddToSelectionGroup(GROUP_DOCK_PLACEMENT);
   127: 
   128:     MakeSubmenu(m_pSubMenu, placementSubMenu, "Placement");
   129: 
   130:     //====================
   131: 
   132:     Menu* orientationSubMenu = MakeMenu("Orientation");
   133: 
   134:     groupItem = pMenuCommon->CreateMenuItem(orientationSubMenu, MENUITEM_COMMAND, dockOrientationBroam, "Horizontal", "Horizontal", !pSettings->dockVertical);
   135:     groupItem->AddToSelectionGroup(GROUP_DOCK_ORIENTATION);
   136:     groupItem = pMenuCommon->CreateMenuItem(orientationSubMenu, MENUITEM_COMMAND, dockOrientationBroam, "Vertical", "Vertical", pSettings->dockVertical);
   137:     groupItem->AddToSelectionGroup(GROUP_DOCK_ORIENTATION);
   138: 
   139:     MakeSubmenu(m_pSubMenu, orientationSubMenu, "Orientation");
   140: 
   141:     //====================
   142: 
   143:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   144: 
   145:     sprintf_s(command, sizeofArray(command), "\"@xoblite Dock Transparency\" %d 1 255", pSettings->dockTransparencyAlpha);
   146:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITINT, command, NULL, "Transparency:", false);
   147: 
   148:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, dockBroam, "TogglePuzzlePositioning", "Puzzle positioning", pSettings->dockPuzzlePositioning);
   149:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, dockBroam, "ToggleAlwaysOnTop", "Always on top", pSettings->dockOnTop);
   150:     if (pSettings->DockPlacement.placement == PLACEMENT_MANUAL) // Manual positioning?
   151:     {
   152:         pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, dockBroam, "ToggleSnapToEdges", "Snap to screen edges", pSettings->dockSnapToEdges);
   153:     }
   154: 
   155:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   156: 
   157:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, dockBroam, "Toggle", "Hide Dock", pSettings->dockHidden);
   158: 
   159:     //====================
   160: 
   161:     int numberOfDockedPlugins = (int)pDock->DockPlugins.size();
   162:     char gripText[255];
   163:     sprintf_s(gripText, sizeofArray(gripText), "(%d plugin", numberOfDockedPlugins);
   164:     if (numberOfDockedPlugins != 1) strcat_s(gripText, sizeofArray(gripText), "s");
   165:     strcat_s(gripText, sizeofArray(gripText), " docked)");
   166:     pMenuCommon->AddFooterItem(m_pSubMenu, gripText);
   167: 
   168:     m_pSubMenu->Invalidate();
   169:     m_pSubMenu->Validate();
   170: }
   171: 
   172: //===========================================================================
   173: