// show Sunday as the first day of the week (default)
wxCAL_SUNDAY_FIRST = 0x0000,
- // show Monder as the first day of the week
+ // show Monday as the first day of the week
wxCAL_MONDAY_FIRST = 0x0001,
// highlight holidays
wxCAL_HITTEST_DAY, // on a day in the calendar
wxCAL_HITTEST_INCMONTH,
wxCAL_HITTEST_DECMONTH,
- wxCAL_HITTEST_SURROUNDING_WEEK
+ wxCAL_HITTEST_SURROUNDING_WEEK,
+ wxCAL_HITTEST_WEEK
};
// border types for a date
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_PAGE_CHANGED, wxCalendarEvent )
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DOUBLECLICKED, wxCalendarEvent )
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEKDAY_CLICKED, wxCalendarEvent )
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEK_CLICKED, wxCalendarEvent )
// deprecated events
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DAY_CHANGED, wxCalendarEvent )
#define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn)
#define EVT_CALENDAR_PAGE_CHANGED(id, fn) wx__DECLARE_CALEVT(PAGE_CHANGED, id, fn)
#define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn)
+#define EVT_CALENDAR_WEEK_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEK_CLICKED, id, fn)
// deprecated events
#define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn)
void OnCalendar(wxCalendarEvent& event);
void OnCalendarWeekDayClick(wxCalendarEvent& event);
+ void OnCalendarWeekClick(wxCalendarEvent& event);
void OnCalendarChange(wxCalendarEvent& event);
void OnCalMonthChange(wxCalendarEvent& event);
EVT_CALENDAR_PAGE_CHANGED(Calendar_CalCtrl, MyPanel::OnCalMonthChange)
EVT_CALENDAR_SEL_CHANGED(Calendar_CalCtrl, MyPanel::OnCalendarChange)
EVT_CALENDAR_WEEKDAY_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekDayClick)
+ EVT_CALENDAR_WEEK_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekClick)
END_EVENT_TABLE()
#if wxUSE_DATEPICKCTRL
#ifndef __WXWINCE__
,wxPoint(50, 50), wxSize(450, 340)
#endif
- );
+ );
frame->Show(true);
wxDateTime::GetWeekDayName(event.GetWeekDay()).c_str());
}
+void MyPanel::OnCalendarWeekClick(wxCalendarEvent& event)
+{
+ wxLogMessage(wxT("Clicked on week %d"), event.GetDate().GetWeekOfYear());
+}
+
wxCalendarCtrlBase *MyPanel::DoCreateCalendar(const wxDateTime& dt, long style)
{
wxCalendarCtrlBase *calendar;
else
style &= ~flag;
- if ( flag == wxCAL_SEQUENTIAL_MONTH_SELECTION
+ if ( flag == wxCAL_SEQUENTIAL_MONTH_SELECTION
|| flag == wxCAL_SHOW_WEEK_NUMBERS)
{
// changing this style requires recreating the control
wxFLAGS_MEMBER(wxCAL_NO_MONTH_CHANGE)
wxFLAGS_MEMBER(wxCAL_SEQUENTIAL_MONTH_SELECTION)
wxFLAGS_MEMBER(wxCAL_SHOW_SURROUNDING_WEEKS)
+ wxFLAGS_MEMBER(wxCAL_SHOW_WEEK_NUMBERS)
wxEND_FLAGS( wxCalendarCtrlStyle )
IMPLEMENT_DYNAMIC_CLASS_XTI(wxGenericCalendarCtrl, wxControl,"wx/calctrl.h")
wxBEGIN_PROPERTIES_TABLE(wxGenericCalendarCtrl)
- wxEVENT_RANGE_PROPERTY( Updated , wxEVT_CALENDAR_SEL_CHANGED , wxEVT_CALENDAR_WEEKDAY_CLICKED , wxCalendarEvent )
+ wxEVENT_RANGE_PROPERTY( Updated , wxEVT_CALENDAR_SEL_CHANGED , wxEVT_CALENDAR_WEEK_CLICKED , wxCalendarEvent )
wxHIDE_PROPERTY( Children )
wxPROPERTY( Date,wxDateTime, SetDate , GetDate, , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
wxPROPERTY_FLAGS( WindowStyle , wxCalendarCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
m_userChangedYear = false;
m_widthCol =
- m_heightRow = 0;
+ m_heightRow =
+ m_calendarWeekWidth = 0;
wxDateTime::WeekDay wd;
for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) )
// this is a composite control and it must arrange its parts each time its
// size or position changes: the combobox and spinctrl are along the top of
-// the available area and the calendar takes up therest of the space
+// the available area and the calendar takes up the rest of the space
// the static controls are supposed to be always smaller than combo/spin so we
// always use the latter for size calculations and position the static to take
// calc the size of the calendar
const_cast<wxGenericCalendarCtrl *>(this)->RecalcGeometry();
- wxCoord width = 7*m_widthCol,
- height = 7*m_heightRow + m_rowOffset;
+ wxCoord width = 7*m_widthCol + m_calendarWeekWidth,
+ height = 7*m_heightRow + m_rowOffset + VERT_MARGIN;
if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) )
{
}
CacheBestSize(best);
-
+
return best;
}
{
#ifdef __WXMAC__
wxControl::DoGetSize( width, height );
-
+
if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) && m_staticMonth && height )
{
wxSize sizeCombo = m_comboMonth->GetEffectiveMinSize();
}
}
+ m_calendarWeekWidth = HasFlag( wxCAL_SHOW_WEEK_NUMBERS )
+ ? dc.GetTextExtent( wxString::Format( wxT( "%d" ), 42 )).GetWidth() + 4 : 0;
+
// leave some margins
m_widthCol += 2;
m_heightRow += 2;
#endif
wxCoord y = 0;
- wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
+ wxCoord x0 = m_calendarWeekWidth;
if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) )
{
//dc.SetFont(*wxNORMAL_FONT);
y += m_heightRow;
+
+ // draw column with calendar week nr
+ if ( HasFlag( wxCAL_SHOW_WEEK_NUMBERS ) && IsExposed( 0, y, m_calendarWeekWidth, m_heightRow * 6 ))
+ {
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ dc.SetBrush(wxBrush(m_colHeaderBg, wxSOLID));
+ dc.SetPen(wxPen(m_colHeaderBg, 1, wxSOLID));
+ dc.DrawRectangle( 0, y, m_calendarWeekWidth, m_heightRow * 6 );
+ wxDateTime date = GetStartDate();
+ for ( size_t i = 0; i < 6; ++i )
+ {
+ const int weekNr = date.GetWeekOfYear();
+ wxString text = wxString::Format( wxT( "%d" ), weekNr );
+ dc.DrawText( text, m_calendarWeekWidth - dc.GetTextExtent( text ).GetWidth() - 2, y + m_heightRow * i );
+ date += wxDateSpan::Week();
+ }
+ }
+
wxDateTime date = GetStartDate();
#if DEBUG_PAINT
wxRect rect;
// always refresh the whole row at once because our OnPaint() will draw
- // the whole row anyhow - and this allows the small optimisation in
+ // the whole row anyhow - and this allows the small optimization in
// OnClick() below to work
- rect.x = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
+ rect.x = m_calendarWeekWidth;
rect.y = (m_heightRow * GetWeek(date)) + m_rowOffset;
{
int numpoints;
wxPoint corners[8]; // potentially 8 corners in polygon
- wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
+ wxCoord x0 = m_calendarWeekWidth;
if ( fw == tw )
{
// GenerateAllChangeEvents() here, we know which event to send
GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
}
- break;
+ break;
+
+ case wxCAL_HITTEST_WEEK:
+ {
+ wxCalendarEvent send( this, date, wxEVT_CALENDAR_WEEK_CLICKED );
+ HandleWindowEvent( send );
+ }
+ break;
case wxCAL_HITTEST_HEADER:
{
RecalcGeometry();
// the position where the calendar really begins
- wxCoord x0 = wxMax((GetSize().x - m_widthCol*7)/2, 0);
+ wxCoord x0 = m_calendarWeekWidth;
if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) )
{
return wxCAL_HITTEST_INCMONTH;
}
-
}
+ if ( pos.x - x0 < 0 )
+ if ( pos.x >= 0 && pos.y > m_rowOffset + m_heightRow && pos.y <= m_rowOffset + m_heightRow * 7 )
+ {
+ if ( date )
+ {
+ *date = GetStartDate();
+ *date += wxDateSpan::Week() * (( pos.y - m_rowOffset ) / m_heightRow - 1 );
+ }
+ if ( wd )
+ *wd = ( GetWindowStyle() & wxCAL_MONDAY_FIRST ) ? wxDateTime::Mon : wxDateTime::Sun;
+ return wxCAL_HITTEST_WEEK;
+ }
+ else // early exit -> the rest of the function checks for clicks on days
+ return wxCAL_HITTEST_NOWHERE;
+
// header: week days
int wday = (pos.x - x0) / m_widthCol;
- if ( pos.y < (m_heightRow + m_rowOffset) )
+ if ( wday > 6 )
+ return wxCAL_HITTEST_NOWHERE;
+ if ( pos.y < (m_heightRow + m_rowOffset))
{
if ( pos.y > m_rowOffset )
{