aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/toolbarButton.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/toolbarButton.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/toolbarButton.cpp')
-rw-r--r--Src/omBrowser/toolbarButton.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/Src/omBrowser/toolbarButton.cpp b/Src/omBrowser/toolbarButton.cpp
new file mode 100644
index 00000000..fc2a9e46
--- /dev/null
+++ b/Src/omBrowser/toolbarButton.cpp
@@ -0,0 +1,300 @@
+#include "main.h"
+#include "./toolbarButton.h"
+#include "./toolbar.h"
+#include "./graphics.h"
+#include "./resource.h"
+#include "../Plugins/General/gen_ml/ml_ipc_0313.h"
+#include <strsafe.h>
+
+#define CMDLINK_SPACECX_UNITS 2
+
+ToolbarButton::ToolbarButton(LPCSTR pszName, INT nCommand, UINT nStyle, INT nIcon, LPCWSTR pszText, LPCWSTR pszDescription) :
+ ToolbarItem(pszName, nStyle, nIcon, pszText, pszDescription),
+ commandId(nCommand), offsetX(0), offsetY(0), rgbText(0), rgbHilite(0)
+{
+}
+
+ToolbarItem* CALLBACK ToolbarButton::CreateInstance(ToolbarItem::Template *item)
+{
+ if (NULL == item)
+ return NULL;
+
+ return new ToolbarButton( (NULL != item->name) ? item->name : TOOLCLS_BUTTON,
+ item->commandId,
+ item->style,
+ item->iconId,
+ item->text,
+ item->description);
+}
+
+static LPCTSTR ToolbarButton_GetResourceString(LPCTSTR pszResource, LPTSTR pszBuffer, INT cchBufferMax)
+{
+ if (IS_INTRESOURCE(pszResource))
+ {
+ Plugin_LoadString((INT)(INT_PTR)pszResource, pszBuffer, cchBufferMax);
+ return pszBuffer;
+ }
+ return pszResource;
+}
+
+static BOOL ToolbarButton_GetTextSise(HWND hToolbar, LPCWSTR pszText, INT cchText, SIZE *textSize, TEXTMETRIC *ptm)
+{
+ if (NULL == textSize)
+ return FALSE;
+
+ if (cchText < 0)
+ cchText = lstrlenW(pszText);
+
+ HDC hdc = GetDCEx(hToolbar, NULL, DCX_CACHE | DCX_NORESETATTRS);
+ if (NULL == hdc) return FALSE;
+
+ BOOL result = FALSE;
+ HFONT font = (HFONT)SendMessage(hToolbar, WM_GETFONT, 0, 0L);
+ HFONT originalFont = (HFONT)SelectObject(hdc, font);
+
+ if (NULL != ptm && !GetTextMetrics(hdc, ptm))
+ ZeroMemory(ptm, sizeof(TEXTMETRIC));
+
+ if (0 != cchText)
+ {
+ if (GetTextExtentPoint32(hdc, pszText, cchText, textSize))
+ result = TRUE;
+ }
+ else
+ ZeroMemory(textSize, sizeof(SIZE));
+
+ SelectObject(hdc, originalFont);
+ ReleaseDC(hToolbar, hdc);
+ return result;
+}
+
+BOOL ToolbarButton::AdjustRect(HWND hToolbar, RECT *proposedRect)
+{
+ if (0 != (ToolbarButton::styleCommandLink & style))
+ {
+ SIZE linkSize = {0};
+ LPCTSTR pszText;
+ WCHAR szBuffer[128] = {0};
+ TOOLBARTEXTMETRIC ttm = {0};
+
+ pszText = ToolbarButton_GetResourceString(text, szBuffer, ARRAYSIZE(szBuffer));
+ if (!ToolbarButton_GetTextSise(hToolbar, pszText, -1, &linkSize, NULL))
+ ZeroMemory(&linkSize, sizeof(SIZE));
+
+ if (!Toolbar_GetTextMetrics(hToolbar, &ttm))
+ ZeroMemory(&ttm, sizeof(TOOLBARTEXTMETRIC));
+
+ offsetX = MulDiv(CMDLINK_SPACECX_UNITS, ttm.aveCharWidth, 4);
+ offsetY = ttm.baseY;
+ proposedRect->right = proposedRect->left + linkSize.cx + 2 * offsetX + ttm.overhang;
+
+ proposedRect->top = ttm.origY;
+ proposedRect->bottom = proposedRect->top + ttm.height;
+ return TRUE;
+ }
+
+ SIZE iconSize;
+ if (!Toolbar_GetIconSize(hToolbar, iconId, &iconSize))
+ ZeroMemory(&iconSize, sizeof(SIZE));
+
+ proposedRect->right = proposedRect->left + iconSize.cx;
+ INT offsetY = (proposedRect->bottom - proposedRect->top) - iconSize.cy;
+ if (0 != offsetY)
+ {
+ proposedRect->top += offsetY/2;
+ if (0 != (offsetY%2)) proposedRect->top++;
+ }
+ proposedRect->bottom = proposedRect->top + iconSize.cy;
+ return TRUE;
+}
+
+void ToolbarButton::UpdateSkin(HWND hToolbar)
+{
+ rgbText = Toolbar_GetTextColor(hToolbar);
+ rgbHilite = Toolbar_GetHiliteColor(hToolbar);
+}
+
+BOOL ToolbarButton::Paint(HWND hToolbar, HDC hdc, const RECT *paintRect, UINT state)
+{
+ if (statePressed == ((statePressed | stateHighlighted) & state))
+ state &= ~statePressed;
+
+ if (0 != (ToolbarButton::styleCommandLink & style))
+ {
+ LPCTSTR pszText;
+ WCHAR szBuffer[256] = {0};
+ pszText = ToolbarButton_GetResourceString(text, szBuffer, ARRAYSIZE(szBuffer));
+ INT cchText = lstrlen(pszText);
+ if (0 == cchText)
+ return FALSE;
+
+
+ COLORREF originalFg = GetTextColor(hdc);
+ COLORREF rgbFg = (0 == (stateHighlighted & style)) ? rgbText : rgbHilite;
+
+ SetTextColor(hdc, rgbFg);
+ INT originalMode = SetBkMode(hdc, TRANSPARENT);
+ UINT originalAlign = SetTextAlign(hdc, TA_LEFT | TA_BASELINE);
+
+ ExtTextOut(hdc, rect.left + offsetX, rect.top + offsetY, ETO_CLIPPED | ETO_OPAQUE, &rect, pszText, cchText, NULL);
+
+ if (TRANSPARENT != originalMode) SetBkMode(hdc, originalMode);
+ if ((TA_LEFT | TA_BASELINE) != originalAlign) SetTextAlign(hdc, originalAlign);
+
+ if (0 != (stateHighlighted & style))
+ {
+ COLORREF originalBk = SetBkColor(hdc, rgbFg);
+
+ RECT partRect;
+ ::SetRect(&partRect, rect.left + offsetX, rect.top + offsetY + 1, rect.right - offsetX, rect.top + offsetY + 2);
+ ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &partRect, NULL, 0, NULL);
+
+ SetBkColor(hdc, originalBk);
+ }
+
+ if (rgbFg != originalFg)
+ SetTextColor(hdc, originalFg);
+
+ return TRUE;
+ }
+
+ TOOLBARDRAWICONPARAM param;
+ param.hdcDst = hdc;
+ param.iconIndex = iconId;
+ param.x = rect.left;
+ param.y = rect.top;
+ param.cx = rect.right - rect.left;
+ param.cy = rect.bottom - rect.top;
+ param.itemState = state;
+ if (Toolbar_DrawIcon(hToolbar, &param))
+ {
+ if (stateFocused == ((stateFocused | stateNoFocusRect) & state))
+ {
+ RECT focusRect;
+ CopyRect(&focusRect, &rect);
+ focusRect.left += 1;
+ focusRect.top += 2;
+ focusRect.bottom -= 1;
+ COLORREF origBk = SetBkColor(hdc, 0x00000000);
+ COLORREF origFg = SetTextColor(hdc, 0x00FFFFFF);
+ DrawFocusRect(hdc, &focusRect);
+ if (origBk != 0x00000000) SetBkColor(hdc, origBk);
+ if (origFg != 0x00FFFFFF) SetTextColor(hdc, origFg);
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+INT ToolbarButton::GetTip(LPTSTR pszBuffer, INT cchBufferMax)
+{
+ if (IS_INTRESOURCE(description))
+ {
+ if (NULL == pszBuffer || cchBufferMax < 1)
+ return 0;
+ Plugin_LoadString((INT)(INT_PTR)description, pszBuffer, cchBufferMax);
+ return lstrlen(pszBuffer);
+ }
+
+ size_t remaining;
+ HRESULT hr = StringCchCopyEx(pszBuffer, cchBufferMax, description, NULL, &remaining, STRSAFE_IGNORE_NULLS);
+ return SUCCEEDED(hr) ? (cchBufferMax - (INT)remaining) : 0;
+
+}
+
+BOOL ToolbarButton::PtInItem(POINT pt)
+{
+ return (pt.x >= (rect.left + offsetX) && pt.x < (rect.right - offsetX) && rect.bottom != rect.top);
+}
+INT ToolbarButton::GetCommandId()
+{
+ return commandId;
+}
+void ToolbarButton::MouseMove(HWND hToolbar, UINT mouseFlags, POINT pt)
+{
+ UINT styleNew = (PtInItem(pt)) ? stateHighlighted : 0;
+ SetStyle(hToolbar, styleNew, stateHighlighted);
+
+}
+
+void ToolbarButton::MouseLeave(HWND hToolbar)
+{
+ if (0 != (stateHighlighted & style))
+ {
+ SetStyle(hToolbar, 0, stateHighlighted);
+ }
+}
+
+void ToolbarButton::LButtonDown(HWND hToolbar, UINT mouseFlags, POINT pt)
+{
+ SetStyle(hToolbar, statePressed, statePressed);
+}
+void ToolbarButton::LButtonUp(HWND hToolbar, UINT mouseFlags, POINT pt)
+{
+ SetStyle(hToolbar, 0, statePressed);
+}
+void ToolbarButton::Click(HWND hToolbar, UINT mouseFlags, POINT pt)
+{
+ if (0 != commandId)
+ {
+ Toolbar_SendCommand(hToolbar, commandId);
+ }
+}
+
+BOOL ToolbarButton::FillMenuInfo(HWND hToolbar, MENUITEMINFO *pmii, LPWSTR pszBuffer, INT cchBufferMax)
+{
+ pmii->fMask = MIIM_STRING | MIIM_ID | MIIM_STATE;
+ pmii->wID = commandId;
+ pmii->fState = MFS_UNHILITE;
+ pmii->fState |= ((0 == (stateDisabled & style)) ? MFS_ENABLED : MFS_DISABLED);
+ pmii->dwTypeData = pszBuffer;
+
+ if (IS_INTRESOURCE(text))
+ {
+ Plugin_LoadString((INT)(INT_PTR)text, pszBuffer, cchBufferMax);
+ }
+ else
+ {
+ if (FAILED(StringCchCopyEx(pszBuffer, cchBufferMax, text, NULL, NULL, STRSAFE_IGNORE_NULLS)))
+ pszBuffer[0] = L'\0';
+ }
+ return TRUE;
+}
+
+
+
+
+BOOL ToolbarButton::KeyDown(HWND hToolbar, INT vKey, UINT flags)
+{
+ switch(vKey)
+ {
+ case VK_SPACE:
+ case VK_RETURN:
+ SetStyle(hToolbar, statePressed | stateHighlighted, statePressed | stateHighlighted);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL ToolbarButton::KeyUp(HWND hToolbar, INT vKey, UINT flags)
+{
+ switch(vKey)
+ {
+ case VK_SPACE:
+ case VK_RETURN:
+ if (0 != (statePressed & style))
+ {
+ SetStyle(hToolbar, 0, (statePressed | stateHighlighted));
+ if (0 != commandId)
+ Toolbar_SendCommand(hToolbar, commandId);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void ToolbarButton::SetFocus(HWND hToolbar, ToolbarItem *focusItem, BOOL fSet)
+{
+ InvalidateRect(hToolbar, &rect, FALSE);
+}