summaryrefslogtreecommitdiff
path: root/alf/alfpanel.cpp
blob: 74db788b4b613b8a96ebaadaf46dac773a2e02c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "alfpriv.h"

typedef struct {
    ALFAPP    app;
    ALFLayout layout;
} ALFPanelPriv;

static void
ALF_Panel_IntializePriv(ALFPanelPriv *priv, ALFAPP app)
{
    priv->app = app;
    ALF_Layout_Init(&priv->layout);
}

static void
ALF_Panel_ClearPriv(ALFPanelPriv *priv)
{
    ALF_Layout_Clear(&priv->layout);
}

static LRESULT WINAPI
ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
{
    if (msg == WM_NCCREATE) {
        ALFPanelPriv *p = (ALFPanelPriv*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ALFPanelPriv));

        ALFAPP app = (ALFAPP)(((CREATESTRUCT*)lparam)->lpCreateParams);
        ALF_Panel_IntializePriv(p, app);

        SetWindowLongPtr(window, 0, (LONG_PTR)p);
    }

    ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0);

    if (msg == WM_NCDESTROY) {
        ALF_Panel_ClearPriv(priv);
        HeapFree(GetProcessHeap(), 0, priv);
        SetWindowLongPtr(window, 0, 0);
    }

    if (ALF_ShouldMessageBubble(window, msg, wparam, lparam))
        return SendMessage(GetParent(window), msg, wparam, lparam);

    if (msg == WM_SIZE) {
        ALF_Layout_Apply(&priv->layout, window);
    }

    LRESULT ret = 0;
    if (ALF_Layout_HandleMessage(&priv->layout, window, msg, wparam, lparam, &ret))
        return ret;

    return DefWindowProc(window, msg, wparam, lparam);
}

void
ALF_RegisterPanelClass(ALFAPP app)
{
    WNDCLASS cls;
    ZeroMemory(&cls, sizeof(cls));

    TCHAR  classNameBuf[256];
    ALF_BuildRandomClassName(app, TEXT("ALFPanel."), classNameBuf);

    cls.hInstance = app->hInstance;
    cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
    if (LOBYTE(LOWORD(GetVersion())) >= 4) {
        cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    } else {
        // NT 3.x has white dialog backgrounds
        cls.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    }
    cls.lpszClassName = classNameBuf;
    cls.cbWndExtra = sizeof(void*);
    cls.lpfnWndProc = ALF__PanelWindowProc;

    ATOM classatom = RegisterClass(&cls);
    if (!classatom)
        MessageBox(NULL, TEXT("FATAL: Could not register Combo class"), NULL, MB_OK);

    app->panelClass = MAKEINTATOM(classatom);
}

HWND
ALF_AddPanel(HWND parent, WORD id, UINT x, UINT y)
{
    ALFAPP app = ALF_ApplicationFromWindow(parent);

    HWND hwndPanel = CreateWindowEx(WS_EX_CONTROLPARENT,
                                    app->panelClass,
                                    TEXT(""),
                                    WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
                                    0, 0, 0, 0,
                                    parent,
                                    (HMENU)(int)id,
                                    (HINSTANCE)GetWindowLongPtr(parent, GWLP_HINSTANCE),
                                    (void*)app);

    ALFWidgetLayoutParams p;
    ZeroMemory(&p, sizeof(p));
    p.hwnd = hwndPanel;
    p.x = x;
    p.y = y;
    p.width = 0;
    p.height = 0;
    p.flags = ALF_QUERYSIZE | ALF_SENDAPPLYFONTS;

    ALF_AddWidgetEx(parent, &p);

    return hwndPanel;
}