libui/windows/control.cpp

122 lines
3.3 KiB
C++

// 16 august 2015
#include "uipriv_windows.hpp"
void uiWindowsControlSyncEnableState(uiWindowsControl *c, int enabled)
{
(*(c->SyncEnableState))(c, enabled);
}
void uiWindowsControlSetParentHWND(uiWindowsControl *c, HWND parent)
{
(*(c->SetParentHWND))(c, parent);
}
void uiWindowsControlMinimumSize(uiWindowsControl *c, int *width, int *height)
{
(*(c->MinimumSize))(c, width, height);
}
void uiWindowsControlMinimumSizeChanged(uiWindowsControl *c)
{
(*(c->MinimumSizeChanged))(c);
}
// TODO get rid of this
void uiWindowsControlLayoutRect(uiWindowsControl *c, RECT *r)
{
(*(c->LayoutRect))(c, r);
}
void uiWindowsControlAssignControlIDZOrder(uiWindowsControl *c, LONG_PTR *controlID, HWND *insertAfter)
{
(*(c->AssignControlIDZOrder))(c, controlID, insertAfter);
}
void uiWindowsControlChildVisibilityChanged(uiWindowsControl *c)
{
(*(c->ChildVisibilityChanged))(c);
}
HWND uiWindowsEnsureCreateControlHWND(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, HINSTANCE hInstance, LPVOID lpParam, BOOL useStandardControlFont)
{
HWND hwnd;
// don't let using the arrow keys in a uiRadioButtons leave the radio buttons
if ((dwStyle & WS_TABSTOP) != 0)
dwStyle |= WS_GROUP;
hwnd = CreateWindowExW(dwExStyle,
lpClassName, lpWindowName,
dwStyle | WS_CHILD | WS_VISIBLE,
0, 0,
// use a nonzero initial size just in case some control breaks with a zero initial size
100, 100,
utilWindow, NULL, hInstance, lpParam);
if (hwnd == NULL) {
logLastError(L"error creating window");
// TODO return a decoy window
}
if (useStandardControlFont)
SendMessageW(hwnd, WM_SETFONT, (WPARAM) hMessageFont, (LPARAM) TRUE);
return hwnd;
}
// choose a value distinct from uiWindowSignature
#define uiWindowsControlSignature 0x4D53576E
uiWindowsControl *uiWindowsAllocControl(size_t n, uint32_t typesig, const char *typenamestr)
{
return uiWindowsControl(uiAllocControl(n, uiWindowsControlSignature, typesig, typenamestr));
}
BOOL uiWindowsShouldStopSyncEnableState(uiWindowsControl *c, BOOL enabled)
{
int ce;
ce = uiControlEnabled(uiControl(c));
// only stop if we're going from disabled back to enabled; don't stop under any other condition
// (if we stop when going from enabled to disabled then enabled children of a disabled control won't get disabled at the OS level)
if (!ce && enabled)
return TRUE;
return FALSE;
}
void uiWindowsControlAssignSoleControlIDZOrder(uiWindowsControl *c)
{
LONG_PTR controlID;
HWND insertAfter;
controlID = 100;
insertAfter = NULL;
uiWindowsControlAssignControlIDZOrder(c, &controlID, &insertAfter);
}
BOOL uiWindowsControlTooSmall(uiWindowsControl *c)
{
RECT r;
int width, height;
uiWindowsControlLayoutRect(c, &r);
uiWindowsControlMinimumSize(c, &width, &height);
if ((r.right - r.left) < width)
return TRUE;
if ((r.bottom - r.top) < height)
return TRUE;
return FALSE;
}
void uiWindowsControlContinueMinimumSizeChanged(uiWindowsControl *c)
{
uiControl *parent;
parent = uiControlParent(uiControl(c));
if (parent != NULL)
uiWindowsControlMinimumSizeChanged(uiWindowsControl(parent));
}
// TODO rename this nad the OS X this and hugging ones to NotifyChild
void uiWindowsControlNotifyVisibilityChanged(uiWindowsControl *c)
{
// TODO we really need to figure this out; the duplication is a mess
uiWindowsControlContinueMinimumSizeChanged(c);
}