From d5e956e2544f911f5605a245b66166ce8aa5c869 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Fri, 22 May 2015 10:36:24 -0400 Subject: [PATCH] Added a basic date/time picker. --- redo/test/page4.c | 6 ++++ redo/ui.idl | 6 ++++ redo/windows/GNUmakeinc.mk | 1 + redo/windows/combobox.c | 1 + redo/windows/datetimepicker.c | 68 +++++++++++++++++++++++++++++++++++ redo/windows/init.c | 1 + 6 files changed, 83 insertions(+) create mode 100644 redo/windows/datetimepicker.c diff --git a/redo/test/page4.c b/redo/test/page4.c index e882b15d..208af8f5 100644 --- a/redo/test/page4.c +++ b/redo/test/page4.c @@ -97,5 +97,11 @@ uiBox *makePage4(void) uiRadioButtonsAppend(rb, "Item 3"); uiBoxAppend(page4, uiControl(rb), 0); + uiBoxAppend(page4, uiControl(uiNewHorizontalSeparator()), 0); + + uiBoxAppend(page4, uiControl(uiNewDateTimePicker()), 0); + uiBoxAppend(page4, uiControl(uiNewDatePicker()), 0); + uiBoxAppend(page4, uiControl(uiNewTimePicker()), 0); + return page4; } diff --git a/redo/ui.idl b/redo/ui.idl index dfb07cbf..72d37dc9 100644 --- a/redo/ui.idl +++ b/redo/ui.idl @@ -181,6 +181,12 @@ interface RadioButtons from Control { }; func NewRadioButtons(void) *RadioButtons; +interface DateTimePicker from Control { +}; +func NewDateTimePicker(void) *DateTimePicker; +func NewDatePicker(void) *DateTimePicker; +func NewTimePicker(void) *DateTimePicker; + interface Menu { func AppendItem(name *const char) *MenuItem; func AppendCheckItem(name *const char) *MenuItem; diff --git a/redo/windows/GNUmakeinc.mk b/redo/windows/GNUmakeinc.mk index 269226f2..ba7fb5ed 100644 --- a/redo/windows/GNUmakeinc.mk +++ b/redo/windows/GNUmakeinc.mk @@ -7,6 +7,7 @@ osCFILES = \ windows/combobox.c \ windows/container.c \ windows/control.c \ + windows/datetimepicker.c \ windows/debug.c \ windows/entry.c \ windows/events.c \ diff --git a/redo/windows/combobox.c b/redo/windows/combobox.c index f438169d..f311dadb 100644 --- a/redo/windows/combobox.c +++ b/redo/windows/combobox.c @@ -48,6 +48,7 @@ static uiCombobox *finishNewCombobox(DWORD style) c = uiNew(struct combobox); uiTyped(c)->Type = uiTypeCombobox(); + // TODO client edge? p.dwExStyle = WS_EX_CLIENTEDGE; p.lpClassName = L"combobox"; p.lpWindowName = L""; diff --git a/redo/windows/datetimepicker.c b/redo/windows/datetimepicker.c new file mode 100644 index 00000000..785d82fd --- /dev/null +++ b/redo/windows/datetimepicker.c @@ -0,0 +1,68 @@ +// 22 may 2015 +#include "uipriv_windows.h" + +struct datetimepicker { + uiDateTimePicker d; + HWND hwnd; +}; + +static void onDestroy(void *data) +{ + struct datetimepicker *d = (struct datetimepicker *) data; + + uiFree(d); +} + +// TODO +// TODO use DTM_GETIDEALSIZE when making Vista-only +// from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing +#define entryWidth 107 /* this is actually the shorter progress bar width, but Microsoft only indicates as wide as necessary */ +#define entryHeight 14 + +static void datetimepickerPreferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height) +{ + *width = uiWindowsDlgUnitsToX(entryWidth, d->Sys->BaseX); + *height = uiWindowsDlgUnitsToY(entryHeight, d->Sys->BaseY); +} + +uiDateTimePicker *finishNewDateTimePicker(DWORD style) +{ + struct datetimepicker *d; + uiWindowsMakeControlParams p; + + d = uiNew(struct datetimepicker); + uiTyped(d)->Type = uiTypeDateTimePicker(); + + p.dwExStyle = 0; // TODO client edge? + p.lpClassName = DATETIMEPICK_CLASSW; + p.lpWindowName = L""; + p.dwStyle = style | WS_TABSTOP; + p.hInstance = hInstance; + p.lpParam = NULL; + p.useStandardControlFont = TRUE; + p.onDestroy = onDestroy; + p.onDestroyData = d; + uiWindowsMakeControl(uiControl(d), &p); + + d->hwnd = (HWND) uiControlHandle(uiControl(d)); + + uiControl(d)->PreferredSize = datetimepickerPreferredSize; + + return uiDateTimePicker(d); +} + +// TODO +uiDateTimePicker *uiNewDateTimePicker(void) +{ + return finishNewDateTimePicker(0); +} + +uiDateTimePicker *uiNewDatePicker(void) +{ + return finishNewDateTimePicker(DTS_SHORTDATECENTURYFORMAT); +} + +uiDateTimePicker *uiNewTimePicker(void) +{ + return finishNewDateTimePicker(DTS_TIMEFORMAT); +} diff --git a/redo/windows/init.c b/redo/windows/init.c index 94b31aad..9009d953 100644 --- a/redo/windows/init.c +++ b/redo/windows/init.c @@ -79,6 +79,7 @@ uiInitOptions options; ICC_LISTVIEW_CLASSES | /* table headers */ \ ICC_UPDOWN_CLASS | /* spinboxes */ \ ICC_BAR_CLASSES | /* trackbar */ \ + ICC_DATE_CLASSES | /* date/time picker */ \ 0) const char *uiInit(uiInitOptions *o)