Implement wxCalendarCtrl::SetDateRange() in the native GTK version.
While GTK+ doesn't support imposing ranges for dates selection natively, we can do it ourselves by preventing the user from selecting any date outside of the currently valid range. This allows to use ranges under all platforms and not only in wxCalendarCtrl itself but in wxDatePickerCtrl as well. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67987 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -28,27 +28,19 @@ extern "C" {
|
||||
static void gtk_day_selected_callback(GtkWidget *WXUNUSED(widget),
|
||||
wxGtkCalendarCtrl *cal)
|
||||
{
|
||||
wxDateTime date = cal->GetDate();
|
||||
if (cal->m_selectedDate == date)
|
||||
return;
|
||||
|
||||
cal->m_selectedDate = date;
|
||||
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
|
||||
// send deprecated event
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
|
||||
cal->GTKGenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
|
||||
}
|
||||
|
||||
static void gtk_day_selected_double_click_callback(GtkWidget *WXUNUSED(widget),
|
||||
wxGtkCalendarCtrl *cal)
|
||||
{
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED);
|
||||
cal->GTKGenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED);
|
||||
}
|
||||
|
||||
static void gtk_month_changed_callback(GtkWidget *WXUNUSED(widget),
|
||||
wxGtkCalendarCtrl *cal)
|
||||
{
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
|
||||
cal->GTKGenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
|
||||
}
|
||||
|
||||
// callbacks that send deprecated events
|
||||
@@ -56,13 +48,13 @@ static void gtk_month_changed_callback(GtkWidget *WXUNUSED(widget),
|
||||
static void gtk_prev_month_callback(GtkWidget *WXUNUSED(widget),
|
||||
wxGtkCalendarCtrl *cal)
|
||||
{
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
|
||||
cal->GTKGenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
|
||||
}
|
||||
|
||||
static void gtk_prev_year_callback(GtkWidget *WXUNUSED(widget),
|
||||
wxGtkCalendarCtrl *cal)
|
||||
{
|
||||
cal->GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
|
||||
cal->GTKGenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -127,6 +119,74 @@ bool wxGtkCalendarCtrl::Create(wxWindow *parent,
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxGtkCalendarCtrl::GTKGenerateEvent(wxEventType type)
|
||||
{
|
||||
// First check if the new date is in the specified range.
|
||||
wxDateTime dt = GetDate();
|
||||
if ( !IsInValidRange(dt) )
|
||||
{
|
||||
if ( m_validStart.IsValid() && dt < m_validStart )
|
||||
dt = m_validStart;
|
||||
else
|
||||
dt = m_validEnd;
|
||||
|
||||
SetDate(dt);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( type == wxEVT_CALENDAR_SEL_CHANGED )
|
||||
{
|
||||
// Don't generate this event if the new date is the same as the old
|
||||
// one.
|
||||
if ( m_selectedDate == dt )
|
||||
return;
|
||||
|
||||
m_selectedDate = dt;
|
||||
|
||||
GenerateEvent(type);
|
||||
|
||||
// Also send the deprecated event together with the new one.
|
||||
GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
|
||||
}
|
||||
else
|
||||
{
|
||||
GenerateEvent(type);
|
||||
}
|
||||
}
|
||||
|
||||
bool wxGtkCalendarCtrl::IsInValidRange(const wxDateTime& dt) const
|
||||
{
|
||||
return (!m_validStart.IsValid() || m_validStart <= dt) &&
|
||||
(!m_validEnd.IsValid() || dt <= m_validEnd);
|
||||
}
|
||||
|
||||
bool
|
||||
wxGtkCalendarCtrl::SetDateRange(const wxDateTime& lowerdate,
|
||||
const wxDateTime& upperdate)
|
||||
{
|
||||
if ( lowerdate.IsValid() && upperdate.IsValid() && lowerdate >= upperdate )
|
||||
return false;
|
||||
|
||||
m_validStart = lowerdate;
|
||||
m_validEnd = upperdate;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
wxGtkCalendarCtrl::GetDateRange(wxDateTime *lowerdate,
|
||||
wxDateTime *upperdate) const
|
||||
{
|
||||
if ( lowerdate )
|
||||
*lowerdate = m_validStart;
|
||||
if ( upperdate )
|
||||
*upperdate = m_validEnd;
|
||||
|
||||
return m_validStart.IsValid() || m_validEnd.IsValid();
|
||||
}
|
||||
|
||||
|
||||
bool wxGtkCalendarCtrl::EnableMonthChange(bool enable)
|
||||
{
|
||||
if ( !wxCalendarCtrlBase::EnableMonthChange(enable) )
|
||||
@@ -140,6 +200,9 @@ bool wxGtkCalendarCtrl::EnableMonthChange(bool enable)
|
||||
|
||||
bool wxGtkCalendarCtrl::SetDate(const wxDateTime& date)
|
||||
{
|
||||
if ( date.IsValid() && !IsInValidRange(date) )
|
||||
return false;
|
||||
|
||||
g_signal_handlers_block_by_func(m_widget,
|
||||
(gpointer) gtk_day_selected_callback, this);
|
||||
g_signal_handlers_block_by_func(m_widget,
|
||||
|
Reference in New Issue
Block a user