1///////////////////////////////////////////////////////////////////////////// 2// Name: src/osx/cocoa/datetimectrl.mm 3// Purpose: Implementation of wxDateTimePickerCtrl for Cocoa. 4// Author: Vadim Zeitlin 5// Created: 2011-12-18 6// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> 7// Licence: wxWindows licence 8///////////////////////////////////////////////////////////////////////////// 9 10// ============================================================================ 11// declarations 12// ============================================================================ 13 14// ---------------------------------------------------------------------------- 15// headers 16// ---------------------------------------------------------------------------- 17 18// For compilers that support precompilation, includes "wx.h". 19#include "wx/wxprec.h" 20 21#ifdef __BORLANDC__ 22 #pragma hdrstop 23#endif 24 25#if wxUSE_DATEPICKCTRL 26 27#include "wx/datetimectrl.h" 28#include "wx/datectrl.h" 29 30#include "wx/osx/core/private/datetimectrl.h" 31#include "wx/osx/cocoa/private/date.h" 32 33using namespace wxOSXImpl; 34 35// ============================================================================ 36// implementation 37// ============================================================================ 38 39// ---------------------------------------------------------------------------- 40// Cocoa wrappers 41// ---------------------------------------------------------------------------- 42 43@interface wxNSDatePicker : NSDatePicker 44{ 45} 46 47@end 48 49@implementation wxNSDatePicker 50 51+ (void)initialize 52{ 53 static BOOL initialized = NO; 54 if (!initialized) 55 { 56 initialized = YES; 57 wxOSXCocoaClassAddWXMethods( self ); 58 } 59} 60 61@end 62 63// ---------------------------------------------------------------------------- 64// Peer-specific subclass 65// ---------------------------------------------------------------------------- 66 67namespace 68{ 69 70class wxDateTimeWidgetCocoaImpl : public wxDateTimeWidgetImpl 71{ 72public: 73 wxDateTimeWidgetCocoaImpl(wxDateTimePickerCtrl* peer, wxNSDatePicker* w) 74 : wxDateTimeWidgetImpl(peer, w) 75 { 76 } 77 78 virtual void SetDateTime(const wxDateTime& dt) 79 { 80 wxDateTime dtFrom, dtTo; 81 82 if ( GetDateRange(&dtFrom,&dtTo) == false || 83 ( (!dtFrom.IsValid() || dtFrom <= dt) && 84 (!dtTo.IsValid() || dt <= dtTo ) ) ) 85 [View() setDateValue: NSDateFromWX(dt)]; 86 } 87 88 virtual wxDateTime GetDateTime() const 89 { 90 return NSDateToWX([View() dateValue]); 91 } 92 93 virtual void SetDateRange(const wxDateTime& dt1, const wxDateTime& dt2) 94 { 95 // Note that passing nil is ok here so we don't need to test for the 96 // dates validity. 97 [View() setMinDate: NSDateFromWX(dt1)]; 98 [View() setMaxDate: NSDateFromWX(dt2)]; 99 } 100 101 virtual bool GetDateRange(wxDateTime* dt1, wxDateTime* dt2) 102 { 103 bool hasLimits = false; 104 if ( dt1 ) 105 { 106 *dt1 = NSDateToWX([View() minDate]); 107 hasLimits = true; 108 } 109 110 if ( dt2 ) 111 { 112 *dt2 = NSDateToWX([View() maxDate]); 113 hasLimits = true; 114 } 115 116 return hasLimits; 117 } 118 119 virtual void controlAction(WXWidget WXUNUSED(slf), 120 void* WXUNUSED(cmd), 121 void* WXUNUSED(sender)) 122 { 123 wxWindow* const wxpeer = GetWXPeer(); 124 if ( wxpeer ) 125 { 126 static_cast<wxDateTimePickerCtrl*>(wxpeer)-> 127 OSXGenerateEvent(GetDateTime()); 128 } 129 } 130 131 virtual void Enable(bool enable = true) 132 { 133 wxNSDatePicker* const nsdatePicker = View(); 134 135 [nsdatePicker setEnabled: enable]; 136 137 if ( enable ) 138 { 139 wxWindow* const wxpeer = GetWXPeer(); 140 if ( wxpeer ) 141 [nsdatePicker setTextColor: wxpeer->GetForegroundColour().OSXGetNSColor()]; 142 else 143 [nsdatePicker setTextColor: [NSColor controlTextColor]]; 144 } 145 else 146 { 147 [nsdatePicker setTextColor: [NSColor disabledControlTextColor]]; 148 } 149 } 150 151private: 152 wxNSDatePicker* View() const 153 { 154 return static_cast<wxNSDatePicker *>(m_osxView); 155 } 156}; 157 158} // anonymous namespace 159 160// ---------------------------------------------------------------------------- 161// CreateDateTimePicker() implementation 162// ---------------------------------------------------------------------------- 163 164/* static */ 165wxDateTimeWidgetImpl* 166wxDateTimeWidgetImpl::CreateDateTimePicker(wxDateTimePickerCtrl* wxpeer, 167 const wxDateTime& dt, 168 const wxPoint& pos, 169 const wxSize& size, 170 long style, 171 wxDateTimeWidgetKind kind) 172{ 173 NSRect r = wxOSXGetFrameForControl(wxpeer, pos, size); 174 wxNSDatePicker* v = [[wxNSDatePicker alloc] initWithFrame:r]; 175 176 NSDatePickerElementFlags elements = 0; 177 switch ( kind ) 178 { 179 case wxDateTimeWidget_YearMonthDay: 180 elements = NSYearMonthDayDatePickerElementFlag; 181 break; 182 183 case wxDateTimeWidget_HourMinuteSecond: 184 elements = NSHourMinuteSecondDatePickerElementFlag; 185 break; 186 } 187 188 wxASSERT_MSG( elements, "Unknown date time widget kind" ); 189 [v setDatePickerElements: elements]; 190 191 [v setDatePickerStyle: NSTextFieldAndStepperDatePickerStyle]; 192 193 // Avoid a disabled looking transparent background for the text cells. 194 [v setDrawsBackground: YES]; 195 196 if ( dt.IsValid() ) 197 { 198 [v setDateValue: NSDateFromWX(dt)]; 199 } 200 201 wxDateTimeWidgetImpl* c = new wxDateTimeWidgetCocoaImpl(wxpeer, v); 202#if !wxOSX_USE_NATIVE_FLIPPED 203 c->SetFlipped(false); 204#endif 205 return c; 206} 207 208#endif // wxUSE_DATEPICKCTRL 209