void SetDate(const wxDateTime& dt) { m_calendar->SetDate(dt); }
private:
+ wxCalendarCtrlBase *DoCreateCalendar(const wxDateTime& dt, long style);
+
void RecreateCalendar(long style);
wxCalendarCtrlBase *m_calendar;
event.Enable(m_panel->IsUsingGeneric());
}
+ void OnCalRClick(wxMouseEvent& event);
+
private:
MyPanel *m_panel;
wxTextCtrl *m_logWindow;
sizer->Layout();
}
+void MyFrame::OnCalRClick(wxMouseEvent& event)
+{
+ wxDateTime dt;
+ wxDateTime::WeekDay wd;
+
+ const wxPoint pt = event.GetPosition();
+ wxString msg = wxString::Format("Point (%d, %d) is ", pt.x, pt.y);
+
+ switch ( m_panel->GetCal()->HitTest(pt, &dt, &wd) )
+ {
+ default:
+ wxFAIL_MSG( "unexpected" );
+ // fall through
+
+ case wxCAL_HITTEST_NOWHERE:
+ msg += "nowhere";
+ break;
+
+ case wxCAL_HITTEST_HEADER:
+ msg += wxString::Format("over %s", wxDateTime::GetWeekDayName(wd));
+ break;
+
+ case wxCAL_HITTEST_DAY:
+ msg += wxString::Format("over %s", dt.FormatISODate());
+ break;
+
+ case wxCAL_HITTEST_INCMONTH:
+ msg += "over next month button";
+ break;
+
+ case wxCAL_HITTEST_DECMONTH:
+ msg += "over previous month button";
+ break;
+
+ case wxCAL_HITTEST_SURROUNDING_WEEK:
+ msg += "over a day from another month";
+ break;
+ }
+
+ wxLogMessage("%s", msg);
+}
+
#if wxUSE_DATEPICKCTRL
void MyFrame::OnUpdateUIStartWithNone(wxUpdateUIEvent& event)
date.Printf(wxT("Selected date: %s"),
wxDateTime::Today().FormatISODate().c_str());
m_date = new wxStaticText(this, wxID_ANY, date);
- m_calendar = new wxCalendarCtrl(this, Calendar_CalCtrl,
- wxDefaultDateTime,
- wxDefaultPosition,
- wxDefaultSize,
- wxCAL_MONDAY_FIRST |
- wxCAL_SHOW_HOLIDAYS |
- wxRAISED_BORDER);
+ m_calendar = DoCreateCalendar(wxDefaultDateTime,
+ wxCAL_MONDAY_FIRST | wxCAL_SHOW_HOLIDAYS);
// adjust to vertical/horizontal display, check mostly dedicated to WinCE
bool horizontal = ( wxSystemSettings::GetMetric(wxSYS_SCREEN_X) > wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) );
wxDateTime::GetWeekDayName(event.GetWeekDay()).c_str());
}
-void MyPanel::RecreateCalendar(long style)
+wxCalendarCtrlBase *MyPanel::DoCreateCalendar(const wxDateTime& dt, long style)
{
wxCalendarCtrlBase *calendar;
#ifdef wxHAS_NATIVE_CALENDARCTRL
if ( m_usingGeneric )
calendar = new wxGenericCalendarCtrl(this, Calendar_CalCtrl,
- m_calendar->GetDate(),
+ dt,
wxDefaultPosition,
wxDefaultSize,
style);
else
#endif // wxHAS_NATIVE_CALENDARCTRL
calendar = new wxCalendarCtrl(this, Calendar_CalCtrl,
- m_calendar->GetDate(),
+ dt,
wxDefaultPosition,
wxDefaultSize,
style);
+ calendar->Connect(wxEVT_RIGHT_DOWN,
+ wxMouseEventHandler(MyFrame::OnCalRClick),
+ NULL,
+ wxGetTopLevelParent(this));
+
+ return calendar;
+}
+
+void MyPanel::RecreateCalendar(long style)
+{
+ wxCalendarCtrlBase *calendar = DoCreateCalendar(m_calendar->GetDate(), style);
+
m_sizer->Replace(m_calendar, calendar);
delete m_calendar;
m_calendar = calendar;
return best;
}
+wxCalendarHitTestResult
+wxCalendarCtrl::HitTest(const wxPoint& pos,
+ wxDateTime *date,
+ wxDateTime::WeekDay *wd)
+{
+ WinStruct<MCHITTESTINFO> hti;
+ hti.pt.x = pos.x;
+ hti.pt.y = pos.y;
+ switch ( MonthCal_HitTest(GetHwnd(), &hti) )
+ {
+ default:
+ case MCHT_CALENDARWEEKNUM:
+ wxFAIL_MSG( "unexpected" );
+ // fall through
+
+ case MCHT_NOWHERE:
+ case MCHT_CALENDARBK:
+ case MCHT_TITLEBK:
+ case MCHT_TITLEMONTH:
+ case MCHT_TITLEYEAR:
+ return wxCAL_HITTEST_NOWHERE;
+
+ case MCHT_CALENDARDATE:
+ if ( date )
+ wxMSWDateControls::FromSystemTime(date, hti.st);
+ return wxCAL_HITTEST_DAY;
+
+ case MCHT_CALENDARDAY:
+ if ( wd )
+ {
+ *wd = wx_static_cast(wxDateTime::WeekDay, hti.st.wDayOfWeek);
+ }
+ return wxCAL_HITTEST_HEADER;
+
+ case MCHT_TITLEBTNNEXT:
+ return wxCAL_HITTEST_INCMONTH;
+
+ case MCHT_TITLEBTNPREV:
+ return wxCAL_HITTEST_DECMONTH;
+
+ case MCHT_CALENDARDATENEXT:
+ case MCHT_CALENDARDATEPREV:
+ return wxCAL_HITTEST_SURROUNDING_WEEK;
+ }
+}
+
// ----------------------------------------------------------------------------
// wxCalendarCtrl operations
// ----------------------------------------------------------------------------