#include "datepicker.h" #include "externalview_hwnd.h" #include "vstgui/lib/platform/win32/win32factory.h" #include //------------------------------------------------------------------------ namespace VSTGUI { namespace ExternalView { //------------------------------------------------------------------------ struct DatePicker::Impl : ExternalHWNDBase { using Base::Base; ~Impl () noexcept { if (font) DeleteObject (font); } ChangeCallback changeCallback; HFONT font {nullptr}; }; //------------------------------------------------------------------------ DatePicker::DatePicker () { auto hInstance = getPlatformFactory ().asWin32Factory ()->getInstance (); impl = std::make_unique (hInstance); impl->child = CreateWindowExW (0, DATETIMEPICK_CLASS, TEXT ("DateTime"), WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_SHORTDATEFORMAT, 0, 0, 80, 20, impl->container.getHWND (), NULL, hInstance, NULL); impl->container.setWindowProc ([this] (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NOTIFY: { LPNMHDR hdr = reinterpret_cast (lParam); switch (hdr->code) { case DTN_DATETIMECHANGE: { LPNMDATETIMECHANGE lpChange = reinterpret_cast (lParam); if (impl->changeCallback) { Date date; date.day = lpChange->st.wDay; date.month = lpChange->st.wMonth; date.year = lpChange->st.wYear; impl->changeCallback (date); } break; } } break; } } return DefWindowProc (hwnd, message, wParam, lParam); }); } //------------------------------------------------------------------------ DatePicker::~DatePicker () noexcept {} //------------------------------------------------------------------------ void DatePicker::setDate (Date date) { SYSTEMTIME st = {}; st.wDay = date.day; st.wMonth = date.month; st.wYear = date.year; DateTime_SetSystemtime (impl->child, GDT_VALID, &st); } //------------------------------------------------------------------------ void DatePicker::setChangeCallback (const ChangeCallback& callback) { impl->changeCallback = callback; } //------------------------------------------------------------------------ bool DatePicker::platformViewTypeSupported (PlatformViewType type) { return impl->platformViewTypeSupported (type); } //------------------------------------------------------------------------ bool DatePicker::attach (void* parent, PlatformViewType parentViewType) { return impl->attach (parent, parentViewType); } //------------------------------------------------------------------------ bool DatePicker::remove () { return impl->remove (); } //------------------------------------------------------------------------ void DatePicker::setViewSize (IntRect frame, IntRect visible) { impl->setViewSize (frame, visible); } //------------------------------------------------------------------------ void DatePicker::setContentScaleFactor (double scaleFactor) { if (impl->font) DeleteObject (impl->font); auto logFont = NonClientMetrics::get ().lfCaptionFont; logFont.lfHeight = static_cast (std::round (logFont.lfHeight * scaleFactor)); impl->font = CreateFontIndirect (&logFont); if (impl->font) SendMessage (impl->child, WM_SETFONT, (WPARAM)impl->font, 0); } //------------------------------------------------------------------------ void DatePicker::setMouseEnabled (bool state) { impl->setMouseEnabled (state); } //------------------------------------------------------------------------ void DatePicker::takeFocus () { impl->takeFocus (); } //------------------------------------------------------------------------ void DatePicker::looseFocus () { impl->looseFocus (); } void DatePicker::setTookFocusCallback (const TookFocusCallback& callback) { impl->setTookFocusCallback (callback); } //------------------------------------------------------------------------ } // ExternalView } // VSTGUI