summaryrefslogtreecommitdiff
path: root/widgetfactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'widgetfactory.cpp')
-rw-r--r--widgetfactory.cpp80
1 files changed, 78 insertions, 2 deletions
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index c7f5f8d..060544b 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -38,7 +38,9 @@ enum {
IDM_BACKGROUND_GREEN,
IDM_BACKGROUND_BLUE,
IDM_PANES,
- IDM_PANES__MAX = IDM_PANES + PANE__MAX
+ IDM_PANES__MAX = IDM_PANES + PANE__MAX,
+ IDM_MODALDIALOG_PANES,
+ IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX
};
BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL;
@@ -52,6 +54,8 @@ enum PanelBackgroundMode {
#define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1)
+static void wfModalDialogRun(HWND owner, int pane);
+
/* common stuff */
typedef struct {
DWORD bgmode;
@@ -740,6 +744,14 @@ addPaneToNotebook(HWND hwndNotebook, int paneId)
g_paneInitTable[paneId](panel);
}
+static void
+handleClose(void *closure, HWND window)
+{
+ (void)closure;
+
+ ALF_Toplevel_SetModalResult(window, 0);
+}
+
static LRESULT
handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, HWND control)
{
@@ -802,9 +814,67 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid,
addPaneToNotebook(nb, paneId);
}
+ if (sourceid >= IDM_MODALDIALOG_PANES && sourceid < IDM_MODALDIALOG_PANES__MAX) {
+ int paneId = sourceid - IDM_MODALDIALOG_PANES;
+ wfModalDialogRun(window, paneId);
+ }
+
return 0;
}
+static BOOL
+wfModalDialogInit(void *closure, HWND dialog)
+{
+ HWND panel = ALF_AddPanel(dialog, (WORD)-1, 1, 1);
+ int paneid = (int)(LONG_PTR)closure;
+ g_paneInitTable[paneid](panel);
+
+ ALF_SetText(dialog, g_paneLabels[paneid]);
+
+ ALF_LayoutSetColumnExpandNumerator(dialog, 1, 1);
+ ALF_LayoutSetRowExpandNumerator(dialog, 1, 1);
+ ALF_LayoutSetRowMinSize(dialog, 0, 525);
+ ALF_LayoutSetRowMinSize(dialog, 2, 525);
+ ALF_LayoutSetColumnMinSize(dialog, 0, 525);
+ ALF_LayoutSetColumnMinSize(dialog, 2, 525);
+
+ return TRUE;
+}
+
+static LRESULT
+wfModalDialogWindowProc(void *closure, HWND dialog, UINT msg, WPARAM wp, LPARAM lp)
+{
+ (void)closure;
+
+ if (msg == WM_CLOSE) {
+ ALF_Toplevel_SetModalResult(dialog, 0);
+ }
+
+ return ALF_Toplevel_DefWindowProc(dialog, msg, wp, lp);
+}
+
+static ALFToplevelVTable g_wfModalDialogVtbl;
+
+static void
+wfModalDialogPrepareVtbl(void)
+{
+ ZeroMemory(&g_wfModalDialogVtbl, sizeof(g_wfModalDialogVtbl));
+ g_wfModalDialogVtbl.message = wfModalDialogWindowProc;
+ g_wfModalDialogVtbl.initialize = wfModalDialogInit;
+}
+
+static void
+wfModalDialogRun(HWND owner, int pane)
+{
+ HWND dlg = ALF_CreateToplevelWindow(WS_EX_DLGMODALFRAME,
+ WS_POPUPWINDOW | WS_CAPTION | WS_THICKFRAME,
+ owner,
+ &g_wfModalDialogVtbl,
+ (void*)(LONG_PTR)pane);
+ ALF_Toplevel_ShowModal(dlg);
+ DestroyWindow(dlg);
+}
+
int CALLBACK
#ifdef UNICODE
wWinMain
@@ -827,14 +897,17 @@ WinMain
}
}
+ wfModalDialogPrepareVtbl();
+
ALFToplevelVTable vtbl;
ZeroMemory(&vtbl, sizeof(vtbl));
vtbl.command = handleCommand;
+ vtbl.close = handleClose;
ALF_Initialize();
- HWND win = ALF_CreateToplevelWindow(NULL, &vtbl, NULL);
+ HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, &vtbl, NULL);
if (!win) {
MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK);
return 1;
@@ -870,12 +943,14 @@ WinMain
HMENU mainmenu = CreateMenu();
HMENU filemenu = CreateMenu();
HMENU newtabmn = CreateMenu();
+ HMENU modwndmn = CreateMenu();
HMENU helpmenu = CreateMenu();
HMENU bgmenu = CreateMenu();
AppendMenu(filemenu, MF_STRING, ID_HELLO, TEXT("Hello"));
AppendMenu(filemenu, MF_SEPARATOR, 0, 0);
AppendMenu(filemenu, MF_POPUP, (UINT_PTR)newtabmn, TEXT("New Tab"));
+ AppendMenu(filemenu, MF_POPUP, (UINT_PTR)modwndmn, TEXT("Show Modal"));
AppendMenu(filemenu, MF_SEPARATOR, 0, 0);
AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4"));
@@ -892,6 +967,7 @@ WinMain
for (int i = 0; i < PANE__MAX; ++i) {
AppendMenu(newtabmn, MF_STRING, IDM_PANES + (UINT)i, g_paneLabels[i]);
+ AppendMenu(modwndmn, MF_STRING, IDM_MODALDIALOG_PANES + (UINT)i, g_paneLabels[i]);
}
SetMenu(win, mainmenu);