summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alf/alf.cpp11
-rw-r--r--alf/alf.h3
-rw-r--r--alf/alfcombobox.cpp4
-rw-r--r--alf/alfnotebook.cpp26
4 files changed, 36 insertions, 8 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp
index 7c0fa2a..0ab1901 100644
--- a/alf/alf.cpp
+++ b/alf/alf.cpp
@@ -442,7 +442,7 @@ ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|| msg == WM_MEASUREITEM || msg == WM_DRAWITEM
|| msg == WM_CTLCOLORBTN || msg == WM_CTLCOLOREDIT
|| msg == WM_CTLCOLORLISTBOX || msg == WM_CTLCOLORSCROLLBAR
- || msg == WM_CTLCOLORSTATIC;
+ || msg == WM_CTLCOLORSTATIC || msg == ALF_WM_SETFOCUS;
}
void
@@ -503,3 +503,12 @@ ALF_SetTextColor(HWND win, ALFColor color)
{
SendMessage(win, ALF_WM_SETTEXTCOLOR, 0, (LPARAM)color);
}
+
+void
+ALF_SetFocus(HWND target)
+{
+ if (GetWindowStyle(target) & WS_CHILD)
+ PostMessage(GetParent(target), ALF_WM_SETFOCUS, 0, (LPARAM)target);
+ else
+ PostMessage(target, ALF_WM_SETFOCUS, 0, (LPARAM)target);
+}
diff --git a/alf/alf.h b/alf/alf.h
index db42113..f77167d 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -266,6 +266,9 @@ int
ALF_GetModalResult(HWND win);
void
+ALF_SetFocus(HWND target);
+
+void
ALF_SetText(HWND hwnd, const TCHAR *text);
void
diff --git a/alf/alfcombobox.cpp b/alf/alfcombobox.cpp
index eebb269..a227a8d 100644
--- a/alf/alfcombobox.cpp
+++ b/alf/alfcombobox.cpp
@@ -285,6 +285,10 @@ ALF__ComboWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
}
+ if (ALF_ShouldMessageBubble(hwnd, uMsg, wParam, lParam)) {
+ return SendMessage(GetParent(hwnd), uMsg, wParam, lParam);
+ }
+
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp
index b54829a..314ee85 100644
--- a/alf/alfnotebook.cpp
+++ b/alf/alfnotebook.cpp
@@ -18,6 +18,7 @@ typedef struct {
ALFColor tabPaneBgColor;
DWORD flags;
int dpi;
+ int prevSelectedIndex;
} ALFNotebookPriv;
typedef struct {
@@ -32,6 +33,7 @@ ALF_Notebook_CreatePriv(void)
ALFNotebookPriv *priv = ALF_New(ALFNotebookPriv, 1);
priv->tabPaneBgColor = ALF_COLOR_SYS(COLOR_BTNFACE);
+ priv->prevSelectedIndex = -1;
return priv;
}
@@ -78,18 +80,28 @@ ALF_Notebook_InternalSelectedIndex(HWND notebook, HWND tabControl)
static void
-ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, HWND hwndTabCtrl)
+ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, ALFNotebookPriv *priv)
{
- int selectedIndex = ALF_Notebook_InternalSelectedIndex(hwndNotebook, hwndTabCtrl);
- int n = ALF_Notebook_InternalTabCount(hwndNotebook, hwndTabCtrl);
+ int selectedIndex = ALF_Notebook_InternalSelectedIndex(hwndNotebook, priv->hwndTabCtrl);
+ int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl);
for (int i = 0; i < n; ++i) {
if (i == selectedIndex) {
- SetWindowPos(ALF_Notebook_InternalTabPanel(hwndNotebook, hwndTabCtrl, i), HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
+ SetWindowPos(ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i), HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
} else {
- ShowWindow(ALF_Notebook_InternalTabPanel(hwndNotebook, hwndTabCtrl, i), SW_HIDE);
+ ShowWindow(ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i), SW_HIDE);
}
}
+
+ if (selectedIndex != priv->prevSelectedIndex) {
+ HWND currentFocus = GetFocus();
+ if (currentFocus != priv->hwndTabCtrl && IsChild(hwndNotebook, currentFocus)) {
+ HWND focusControl = GetNextDlgTabItem(hwndNotebook, priv->hwndTabCtrl, FALSE);
+ ALF_SetFocus(focusControl);
+ }
+ }
+
+ priv->prevSelectedIndex = selectedIndex;
}
static void
@@ -257,7 +269,7 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t
p.panel = hwndPanel;
TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &p);
- ALF_Notebook_InternalHandleTabChange(notebook, priv->hwndTabCtrl);
+ ALF_Notebook_InternalHandleTabChange(notebook, priv);
ALF_InvalidateLayout(notebook);
@@ -380,7 +392,7 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (uMsg == WM_NOTIFY) {
NMHDR *pnmh = (NMHDR*)lParam;
if (pnmh->hwndFrom == priv->hwndTabCtrl && pnmh->code == TCN_SELCHANGE) {
- ALF_Notebook_InternalHandleTabChange(hwnd, priv->hwndTabCtrl);
+ ALF_Notebook_InternalHandleTabChange(hwnd, priv);
return TRUE;
}