summaryrefslogtreecommitdiff
path: root/alf/alfnotebook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alfnotebook.cpp')
-rw-r--r--alf/alfnotebook.cpp119
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);