diff options
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alfnotebook.cpp | 119 |
1 files changed, 101 insertions, 18 deletions
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index 143defa..501b072 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -19,6 +19,12 @@ typedef struct { DWORD flags; } ALFNotebookPriv; +typedef struct { + TCITEMHEADER header; + DWORD layoutFlags; + HWND panel; +} ALFNotebookPage; + static ALFNotebookPriv * ALF_Notebook_CreatePriv(void) { @@ -49,13 +55,13 @@ ALF_Notebook_InternalTabPanel(HWND notebook, HWND tabControl, int index) { (void)notebook; - TCITEM tci; - ZeroMemory(&tci, sizeof(tci)); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); - tci.mask = TCIF_PARAM; + p.header.mask = TCIF_PARAM; - if (TabCtrl_GetItem(tabControl, index, &tci)) { - return (HWND)tci.lParam; + if (TabCtrl_GetItem(tabControl, index, &p)) { + return p.panel; } else { return NULL; } @@ -101,8 +107,32 @@ ALF_Notebook_SetAllTabBackgrounds(HWND hwndNotebook, ALFNotebookPriv *priv) { int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); for (int i = 0; i < n; ++i) { - HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i); - ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, panel); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.layoutFlags & ALF_LAYOUT_INHERITBGCOLOR) { + ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, p.panel); + } + } + } +} + +static void +ALF_Notebook_PropagateFontToPages(HWND hwndNotebook, ALFNotebookPriv *priv, HFONT font, LPARAM lparam) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.layoutFlags & ALF_LAYOUT_INHERITFONT) { + SendMessage(p.panel, WM_SETFONT, (WPARAM)font, lparam); + } + } } } @@ -145,14 +175,15 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t ALF_Notebook_SetSingleTabBackground(notebook, priv, hwndPanel); - TCITEM tie; - ZeroMemory(&tie, sizeof(tie)); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); - tie.mask = TCIF_TEXT | TCIF_PARAM; - tie.pszText = (TCHAR*)title; - tie.lParam = (LPARAM)hwndPanel; + p.header.mask = TCIF_TEXT | TCIF_PARAM; + p.header.pszText = (TCHAR*)title; + p.layoutFlags = ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_INHERITFONT; + p.panel = hwndPanel; - TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &tie); + TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &p); ALF_Notebook_InternalHandleTabChange(notebook, priv->hwndTabCtrl); ALF_InvalidateLayout(notebook); @@ -222,6 +253,56 @@ ALF_Notebook_InternalPaint(HWND hwnd, ALFNotebookPriv *priv, HDC dc, RECT *f) FillRect(dc, f, GetSysColorBrush(COLOR_BTNFACE)); } +static DWORD +ALF_Notebook_GetWidgetFlags(HWND hwndNotebook, ALFNotebookPriv *priv, HWND widget) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.panel == widget) { + return p.layoutFlags; + } + } + } + + return 0; +} + +static BOOL +ALF_Notebook_SetWidgetFlags(HWND hwndNotebook, ALFNotebookPriv *priv, HWND widget, DWORD flags) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.panel == widget) { + if (p.layoutFlags == flags) + return TRUE; + + if ((flags & ALF_LAYOUT_INHERITFONT) && !(p.layoutFlags & ALF_LAYOUT_INHERITFONT)) { + SendMessage(p.panel, WM_SETFONT, (WPARAM)SendMessage(priv->hwndTabCtrl, WM_GETFONT, 0, 0), TRUE); + } + if ((flags & ALF_LAYOUT_INHERITBGCOLOR) && !(p.layoutFlags & ALF_LAYOUT_INHERITBGCOLOR)) { + ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, p.panel); + } + + p.layoutFlags = flags; + + return TabCtrl_SetItem(priv->hwndTabCtrl, i, &p); + } + } + } + + return FALSE; +} + static LRESULT CALLBACK ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -242,6 +323,8 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ALF_HINSTANCE, NULL); + TabCtrl_SetItemExtra(priv->hwndTabCtrl, sizeof(ALFNotebookPage) - sizeof(TCITEMHEADER)); + ALF_Compat_SetWindowSubclass(priv->hwndTabCtrl, ALF_Notebook_TabCtrlSubclassProc, 0, 0); SetWindowLongPtr(hwnd, 0, (LONG_PTR)priv); @@ -258,11 +341,7 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } else if (uMsg == WM_SETFONT) { SendMessage(priv->hwndTabCtrl, WM_SETFONT, wParam, lParam); - int n = ALF_Notebook_InternalTabCount(hwnd, priv->hwndTabCtrl); - for (int i = 0; i < n; ++i) { - HWND p = ALF_Notebook_InternalTabPanel(hwnd, priv->hwndTabCtrl, i); - SendMessage(p, WM_SETFONT, wParam, lParam); - } + ALF_Notebook_PropagateFontToPages(hwnd, priv, (HFONT)wParam, lParam); ALF_InvalidateLayout(hwnd); } else if (uMsg == WM_GETFONT) { @@ -375,6 +454,10 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if ((oldFlags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND) != (priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) { ALF_Notebook_SetAllTabBackgrounds(hwnd, priv); } + } else if (uMsg == ALF_WM_LYT_GETWDGTFLAGS) { + return (LRESULT)ALF_Notebook_GetWidgetFlags(hwnd, priv, (HWND)wParam); + } else if (uMsg == ALF_WM_LYT_SETWDGTFLAGS) { + return (LRESULT)ALF_Notebook_SetWidgetFlags(hwnd, priv, (HWND)wParam, (DWORD)lParam); } return DefWindowProc(hwnd, uMsg, wParam, lParam); |
