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 "ToolbarMenu.h" 
    34: #include "..\Menu\MenuItem.h" 
    35: #include "..\Menu\FolderItem.h" 
    36: #include "TaskbarMenu.h" 
    37: #include "..\Dock\Dock.h" 
    38: #include "..\Settings\Settings.h" 
    39: 
    40: extern MenuCommon *pMenuCommon;
    41: extern Settings *pSettings;
    42: 
    43: char toolbarBroam[] = "@xoblite Toolbar";
    44: char toolbarPlacementBroam[] = "@xoblite Toolbar Placement";
    45: char toolbarOrientationBroam[] = "@xoblite Toolbar Orientation";
    46: 
    47: #define GROUP_TOOLBAR_PLACEMENT 1 
    48: #define GROUP_TOOLBAR_ORIENTATION 2 
    49: 
    50: //===========================================================================
    51: 
    52: ToolbarMenu::ToolbarMenu(char* pszTitle) : FolderItem(NULL, pszTitle, NULL)
    53: {
    54: }
    55: 
    56: ToolbarMenu::~ToolbarMenu()
    57: {
    58:     m_pParent->RemoveChild(m_pSubMenu);
    59:     if (m_pSubMenu) delete m_pSubMenu;
    60:     m_pSubMenu = NULL;
    61: }
    62: 
    63: //===========================================================================
    64: 
    65: bool ToolbarMenu::Active(bool bActivate)
    66: {
    67:     if (bActivate && !m_bActive) UpdateFolder();
    68:     return FolderItem::Active(bActivate);
    69: }
    70: 
    71: void ToolbarMenu::Attached(Menu* pMenu)
    72: {
    73:     m_pParent = pMenu;
    74:     m_pSubMenu = new Menu(pMenuCommon->hInst);
    75:     m_pParent->AddChild(m_pSubMenu);
    76:     m_pSubMenu->SetParent(m_pParent);
    77: }
    78: 
    79: //===========================================================================
    80: 
    81: void ToolbarMenu::UpdateFolder()
    82: {
    83:     m_pSubMenu->DeleteMenuItems();
    84:     pMenuCommon->AddHeaderItem(m_pSubMenu, m_pszTitleANSI);
    85: 
    86:     MenuItem* groupItem;
    87:     char command[128];
    88:     char temp[MAX_LINE_LENGTH];
    89: 
    90:     //====================
    91: 
    92:     Menu* placementSubMenu = MakeMenu("Placement");
    93: 
    94:     if (pSettings->ToolbarPlacement.placement == PLACEMENT_MANUAL)
    95:     {
    96:         char itemTitle[128];
    97:         sprintf_s(itemTitle, sizeof(itemTitle), "<%s>", pSettings->ToolbarPlacement.rcString);
    98:         groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_EDITSTRING, toolbarPlacementBroam, pSettings->ToolbarPlacement.rcString, itemTitle, true);
    99:     }
   100:     else groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_EDITSTRING, toolbarPlacementBroam, "Manual xC y-50", "<Manual xC y-50>", false);
   101:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   102:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   103:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "TopLeft", "Top Left", (pSettings->ToolbarPlacement.placement == PLACEMENT_TOP_LEFT));
   104:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   105:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "CenterLeft", "Center Left", (pSettings->ToolbarPlacement.placement == PLACEMENT_CENTER_LEFT));
   106:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   107:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "BottomLeft", "Bottom Left", (pSettings->ToolbarPlacement.placement == PLACEMENT_BOTTOM_LEFT));
   108:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   109:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   110:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "TopCenter", "Top Center", (pSettings->ToolbarPlacement.placement == PLACEMENT_TOP_CENTER));
   111:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   112:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "BottomCenter", "Bottom Center", (pSettings->ToolbarPlacement.placement == PLACEMENT_BOTTOM_CENTER));
   113:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   114:     pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   115:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "TopRight", "Top Right", (pSettings->ToolbarPlacement.placement == PLACEMENT_TOP_RIGHT));
   116:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   117:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "CenterRight", "Center Right", (pSettings->ToolbarPlacement.placement == PLACEMENT_CENTER_RIGHT));
   118:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   119:     groupItem = pMenuCommon->CreateMenuItem(placementSubMenu, MENUITEM_COMMAND, toolbarPlacementBroam, "BottomRight", "Bottom Right", (pSettings->ToolbarPlacement.placement == PLACEMENT_BOTTOM_RIGHT));
   120:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_PLACEMENT);
   121: 
   122:     MakeSubmenu(m_pSubMenu, placementSubMenu, "Placement");
   123: 
   124:     //====================
   125: 
   126:     Menu* orientationSubMenu = MakeMenu("Orientation");
   127: 
   128:     groupItem = pMenuCommon->CreateMenuItem(orientationSubMenu, MENUITEM_COMMAND, toolbarOrientationBroam, "Horizontal", "Horizontal", !pSettings->toolbarVertical);
   129:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_ORIENTATION);
   130:     groupItem = pMenuCommon->CreateMenuItem(orientationSubMenu, MENUITEM_COMMAND, toolbarOrientationBroam, "Vertical", "Vertical", pSettings->toolbarVertical);
   131:     groupItem->AddToSelectionGroup(GROUP_TOOLBAR_ORIENTATION);
   132: 
   133:     MakeSubmenu(m_pSubMenu, orientationSubMenu, "Orientation");
   134: 
   135:     //====================
   136: 
   137:     Menu* transparencySubMenu = MakeMenu("Transparency");
   138: 
   139:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency\" %d 1 255", pSettings->toolbarTransparencyAlpha);
   140:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "Toolbar:", false);
   141:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency Label\" %d 1 255", pSettings->toolbarLabelTransparencyAlpha);
   142:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "Label:", false);
   143:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency WindowLabel\" %d 1 255", pSettings->toolbarWindowLabelTransparencyAlpha);
   144:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "WindowLabel:", false);
   145:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency Clock\" %d 1 255", pSettings->toolbarClockTransparencyAlpha);
   146:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "Clock:", false);
   147:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency Button\" %d 1 255", pSettings->toolbarButtonTransparencyAlpha);
   148:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "Button:", false);
   149:     sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Transparency ActiveTask\" %d 1 255", pSettings->taskbarActiveTransparencyAlpha);
   150:     pMenuCommon->CreateMenuItem(transparencySubMenu, MENUITEM_EDITINT, command, NULL, "Active Task:", false);
   151: 
   152:     MakeSubmenu(m_pSubMenu, transparencySubMenu, "Transparency");
   153: 
   154:     //====================
   155: 
   156:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   157: 
   158:     TaskbarMenu *taskbarSubMenu = new TaskbarMenu("Taskbar"); // Taskbar submenu -> Toolbar/TaskbarMenu.cpp/h
   159:     taskbarSubMenu->SetHeight(pMenuCommon->m_nSubmenuHeight);
   160:     m_pSubMenu->AddMenuItem(taskbarSubMenu);
   161: 
   162:     //====================
   163: 
   164:     Menu* hideOtherSubMenu = MakeMenu("Other elements");
   165: 
   166:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_BOOLEAN, "@xoblite Toolbar Toggle Label", NULL, "Hide workspace label", pSettings->toolbarLabelHidden);
   167:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_BOOLEAN, "@xoblite Toolbar Toggle DownUp Buttons", NULL, "Hide down/up buttons", pSettings->toolbarDownUpButtonsHidden);
   168:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_BOOLEAN, "@xoblite Toolbar Toggle LeftRight Buttons", NULL, "Hide left/right buttons", pSettings->toolbarLeftRightButtonsHidden);
   169:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_BOOLEAN, "@xoblite Toolbar Toggle Clock", NULL, "Hide clock", pSettings->toolbarClockHidden);
   170:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   171:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_BOOLEAN, "@xoblite Toolbar Toggle Asymmetry", NULL, "Allow asymmetry", pSettings->toolbarAllowAsymmetry);
   172:     pMenuCommon->CreateMenuItem(hideOtherSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   173: 
   174:     Menu* buttonOverridesSubMenu = MakeMenu("Button overrides");
   175:     sprintf_s(temp, sizeofArray(temp), "Down: <%s>", pSettings->toolbarDownButtonOverride);
   176:     pMenuCommon->CreateMenuItem(buttonOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Button Down", pSettings->toolbarDownButtonOverride, temp, false);
   177:     sprintf_s(temp, sizeofArray(temp), "Up: <%s>", pSettings->toolbarUpButtonOverride);
   178:     pMenuCommon->CreateMenuItem(buttonOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Button Up", pSettings->toolbarUpButtonOverride, temp, false);
   179:     sprintf_s(temp, sizeofArray(temp), "Left: <%s>", pSettings->toolbarLeftButtonOverride);
   180:     pMenuCommon->CreateMenuItem(buttonOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Button Left", pSettings->toolbarLeftButtonOverride, temp, false);
   181:     sprintf_s(temp, sizeofArray(temp), "Right: <%s>", pSettings->toolbarRightButtonOverride);
   182:     pMenuCommon->CreateMenuItem(buttonOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Button Right", pSettings->toolbarRightButtonOverride, temp, false);
   183:     MakeSubmenu(hideOtherSubMenu, buttonOverridesSubMenu, "Button overrides");
   184: 
   185:     MakeSubmenu(m_pSubMenu, hideOtherSubMenu, "Other elements");
   186: 
   187:     //====================
   188: 
   189:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   190: 
   191:     if (pSettings->toolbarVertical) // Vertical toolbar width in number of pixels (nb. %-width is not applicable while in vertical orientation)
   192:     {
   193:         if (pSettings->toolbarVerticalWidth <= 100)
   194:         {
   195:             // Vertical toolbar width in percentage of the screen width (minimum 5%, maximum 25%).
   196:             // This is the default view used by the item and by far the most commonly used, as finer dimensioning (see below) is rarely needed.
   197:             sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Width\" %d 5 25", pSettings->toolbarVerticalWidth);
   198:             pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITINT, command, NULL, "Width (%):", false);
   199:         }
   200:         else
   201:         {
   202:             int screenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
   203:             sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Width\" %d %u %u", pSettings->toolbarVerticalWidth, ((screenWidth * 5) / 100), ((screenWidth * 25) / 100));
   204:             pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITINT, command, NULL, "Width (px):", false);
   205:         }
   206:     }
   207:     else // if (!pSettings->toolbarVertical)
   208:     {
   209:         if (pSettings->toolbarHorizontalWidth <= 100)
   210:         {
   211:             // Horizontal toolbar width in percentage of the screen width (minimum 30%).
   212:             // This is the default view used by the item and by far the most commonly used, as finer dimensioning (see below) is rarely needed.
   213:             sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Width\" %d 30 100", pSettings->toolbarHorizontalWidth);
   214:             pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITINT, command, NULL, "Width (%):", false);
   215:         }
   216:         else
   217:         {
   218:             // Horizontal toolbar width in number of pixels (again, minimum 30% of screen width) for very fine dimensioning.
   219:             // Only visible after having first manually edited the value in xoblite.rc to be a value >100 (i.e. beyond the range of the %-width above).
   220:             int screenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
   221:             sprintf_s(command, sizeofArray(command), "\"@xoblite Toolbar Width\" %d %u %u", pSettings->toolbarHorizontalWidth, ((screenWidth*30) / 100), screenWidth);
   222:             pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITINT, command, NULL, "Width (px):", false);
   223:         }
   224:     }
   225: 
   226:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, toolbarBroam, "ToggleRoundedCorners", "Rounded corners", pSettings->toolbarRoundedCorners);
   227: 
   228: //  sprintf_s(temp, sizeofArray(temp), "Clock format: <%s>", pSettings->toolbarClockFormat);
   229: //  pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_EDITSTRING, "@xoblite SetClockFormat", pSettings->toolbarClockFormat, temp, false);
   230: 
   231:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, toolbarBroam, "ToggleAlwaysOnTop", "Always on top", pSettings->toolbarOnTop);
   232:     if (pSettings->ToolbarPlacement.placement == PLACEMENT_MANUAL) // Manual positioning?
   233:     {
   234:         pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, toolbarBroam, "ToggleSnapToEdges", "Snap to screen edges", pSettings->toolbarSnapToEdges);
   235:     }
   236: 
   237: //  pMenuCommon->CreateMenuItem(this, MENUITEM_COMMAND, toolbarBroam, "EditWorkspaceName", "Edit current workspace name", false);
   238: 
   239:     //====================
   240: 
   241:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   242: 
   243:     Menu* toolbarClickOverridesSubMenu = MakeMenu("Mouse click overrides");
   244: 
   245:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_NOP, NULL, NULL, "Label", false);
   246:     sprintf_s(temp, sizeofArray(temp), "DL: <%s>", pSettings->toolbarLabelDLClickOverride);
   247:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Label Click DL", pSettings->toolbarLabelDLClickOverride, temp, false);
   248:     sprintf_s(temp, sizeofArray(temp), "R: <%s>", pSettings->toolbarLabelRClickOverride);
   249:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Label Click R", pSettings->toolbarLabelRClickOverride, temp, false);
   250:     sprintf_s(temp, sizeofArray(temp), "M: <%s>", pSettings->toolbarLabelMClickOverride);
   251:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Label Click M", pSettings->toolbarLabelMClickOverride, temp, false);
   252:     sprintf_s(temp, sizeofArray(temp), "X1: <%s>", pSettings->toolbarLabelX1ClickOverride);
   253:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Label Click X1", pSettings->toolbarLabelX1ClickOverride, temp, false);
   254:     sprintf_s(temp, sizeofArray(temp), "X2: <%s>", pSettings->toolbarLabelX2ClickOverride);
   255:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Label Click X2", pSettings->toolbarLabelX2ClickOverride, temp, false);
   256: 
   257:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   258: 
   259:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_NOP, NULL, NULL, "Clock", false);
   260:     sprintf_s(temp, sizeofArray(temp), "DL: <%s>", pSettings->toolbarClockDLClickOverride);
   261:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Clock Click DL", pSettings->toolbarClockDLClickOverride, temp, false);
   262:     sprintf_s(temp, sizeofArray(temp), "R: <%s>", pSettings->toolbarClockRClickOverride);
   263:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Clock Click R", pSettings->toolbarClockRClickOverride, temp, false);
   264:     sprintf_s(temp, sizeofArray(temp), "M: <%s>", pSettings->toolbarClockMClickOverride);
   265:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Clock Click M", pSettings->toolbarClockMClickOverride, temp, false);
   266:     sprintf_s(temp, sizeofArray(temp), "X1: <%s>", pSettings->toolbarClockX1ClickOverride);
   267:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Clock Click X1", pSettings->toolbarClockX1ClickOverride, temp, false);
   268:     sprintf_s(temp, sizeofArray(temp), "X2: <%s>", pSettings->toolbarClockX2ClickOverride);
   269:     pMenuCommon->CreateMenuItem(toolbarClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Toolbar Clock Click X2", pSettings->toolbarClockX2ClickOverride, temp, false);
   270: 
   271:     MakeSubmenu(m_pSubMenu, toolbarClickOverridesSubMenu, "Mouse click overrides");
   272: 
   273:     //====================
   274: 
   275:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   276: 
   277:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, toolbarBroam, "Toggle", "Hide Toolbar", pSettings->toolbarHidden);
   278: 
   279:     //====================
   280: 
   281:     pMenuCommon->AddFooterItem(m_pSubMenu, "");
   282: 
   283:     m_pSubMenu->Invalidate();
   284:     m_pSubMenu->Validate();
   285: }
   286: 
   287: //===========================================================================
   288: