]> git.saurik.com Git - wxWidgets.git/commitdiff
react to the year being changed in the spin control text zone and not only with the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 26 Jun 2002 23:13:43 +0000 (23:13 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 26 Jun 2002 23:13:43 +0000 (23:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15968 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/calctrl.h
src/generic/calctrl.cpp

index 7b8f072fb996e9af12f9e531b1d2c50e4016c0ca..ddd08810aeef723b18a56af9ffdfd30273422052 100644 (file)
 
 #include "wx/control.h"         // the base class
 #include "wx/dcclient.h"        // for wxPaintDC
-#include "wx/spinctrl.h"        // for wxSpinEvent
 
 class WXDLLEXPORT wxComboBox;
 class WXDLLEXPORT wxStaticText;
+class WXDLLEXPORT wxSpinCtrl;
 
 #define wxCalendarNameStr _T("CalendarCtrl")
 
@@ -77,7 +77,7 @@ public:
     const wxDateTime& GetUpperDateLimit() const { return m_highdate; }
 
     bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime);
-    
+
     // calendar mode
     // -------------
 
@@ -177,7 +177,7 @@ private:
     void OnDClick(wxMouseEvent& event);
     void OnChar(wxKeyEvent& event);
     void OnMonthChange(wxCommandEvent& event);
-    void OnYearChange(wxSpinEvent& event);
+    void OnYearChange(wxCommandEvent& event);
 
     // override some base class virtuals
     virtual wxSize DoGetBestSize() const;
@@ -203,7 +203,7 @@ private:
 
     // is this date in the given range?
     bool IsDateInRange(const wxDateTime& date) const;
-    
+
     // range helpers
     bool ChangeYear(wxDateTime* target) const;
     bool ChangeMonth(wxDateTime* target) const;
@@ -252,10 +252,10 @@ private:
     wxControl *GetYearControl() const;
 
     // OnPaint helper-methods
-    
+
     // Highlight the [fromdate : todate] range using pen and brush
     void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, wxPen* pen, wxBrush* brush);
-    
+
     // Get the "coordinates" for the date relative to the month currently displayed.
     // using (day, week): upper left coord is (1, 1), lower right coord is (7, 6)
     // if the date isn't visible (-1, -1) is put in (day, week) and false is returned
@@ -292,11 +292,15 @@ private:
             m_rowOffset;
 
     wxRect m_leftArrowRect,
-            m_rightArrowRect;
+           m_rightArrowRect;
 
     // the week day names
     wxString m_weekdays[7];
 
+    // TRUE if SetDate() is being called as the result of changing the year in
+    // the year control
+    bool m_userChangedYear;
+
     DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
     DECLARE_EVENT_TABLE()
 };
index dd81cba7fee7c65a8b9732f805bea0a5a198d2c4..0352b4c2f52daf11fb603beb2d70344a0e24679d 100644 (file)
@@ -38,6 +38,8 @@
 
 #if wxUSE_CALENDARCTRL
 
+#include "wx/spinctrl.h"
+
 #include "wx/calctrl.h"
 
 #define DEBUG_PAINT 0
@@ -64,6 +66,7 @@ class wxYearSpinCtrl : public wxSpinCtrl
 public:
     wxYearSpinCtrl(wxCalendarCtrl *cal);
 
+    void OnYearTextChange(wxCommandEvent& event) { m_cal->OnYearChange(event); }
     void OnYearChange(wxSpinEvent& event) { m_cal->OnYearChange(event); }
 
 private:
@@ -90,6 +93,7 @@ BEGIN_EVENT_TABLE(wxMonthComboBox, wxComboBox)
 END_EVENT_TABLE()
 
 BEGIN_EVENT_TABLE(wxYearSpinCtrl, wxSpinCtrl)
+    EVT_TEXT(-1, wxYearSpinCtrl::OnYearTextChange)
     EVT_SPINCTRL(-1, wxYearSpinCtrl::OnYearChange)
 END_EVENT_TABLE()
 
@@ -155,6 +159,8 @@ void wxCalendarCtrl::Init()
     m_comboMonth = NULL;
     m_spinYear = NULL;
 
+    m_userChangedYear = FALSE;
+
     m_widthCol =
     m_heightRow = 0;
 
@@ -258,12 +264,19 @@ wxCalendarCtrl::~wxCalendarCtrl()
 
 bool wxCalendarCtrl::Destroy()
 {
-    if( m_staticYear ) m_staticYear->Destroy();
-    if( m_spinYear ) m_spinYear->Destroy();
-    if( m_comboMonth ) m_comboMonth->Destroy();
-    if( m_staticMonth ) m_staticMonth->Destroy();
-
-    m_staticYear = 0; m_spinYear = 0; m_comboMonth = 0; m_staticMonth = 0;
+    if ( m_staticYear )
+        m_staticYear->Destroy();
+    if ( m_spinYear )
+        m_spinYear->Destroy();
+    if ( m_comboMonth )
+        m_comboMonth->Destroy();
+    if ( m_staticMonth )
+        m_staticMonth->Destroy();
+
+    m_staticYear = NULL;
+    m_spinYear = NULL;
+    m_comboMonth = NULL;
+    m_staticMonth = NULL;
 
     return wxControl::Destroy();
 }
@@ -391,7 +404,7 @@ void wxCalendarCtrl::EnableMonthChange(bool enable)
 
 bool wxCalendarCtrl::SetDate(const wxDateTime& date)
 {
-    bool retval = FALSE;
+    bool retval = TRUE;
 
     bool sameMonth = m_date.GetMonth() == date.GetMonth(),
          sameYear = m_date.GetYear() == date.GetYear();
@@ -401,37 +414,40 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
         if ( sameMonth && sameYear )
         {
             // just change the day
-            retval = TRUE;
             ChangeDay(date);
         }
         else
         {
-            if ( !AllowMonthChange() || (!AllowYearChange() && !sameYear) )
+            if ( AllowMonthChange() && (AllowYearChange() || sameYear) )
             {
-                // forbidden
-                return retval;
-            }
-
-            // change everything
-            retval = TRUE;
-            m_date = date;
-
-            if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
-            {
-                // update the controls
-                m_comboMonth->SetSelection(m_date.GetMonth());
+                // change everything
+                m_date = date;
 
-                if ( AllowYearChange() )
+                if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
                 {
-                    m_spinYear->SetValue(m_date.Format(_T("%Y")));
+                    // update the controls
+                    m_comboMonth->SetSelection(m_date.GetMonth());
+
+                    if ( AllowYearChange() )
+                    {
+                        if ( !m_userChangedYear )
+                            m_spinYear->SetValue(m_date.Format(_T("%Y")));
+                        else // don't overwrite what the user typed in
+                            m_userChangedYear = FALSE;
+                    }
                 }
-            }
 
-            // as the month changed, holidays did too
-            SetHolidayAttrs();
+                // as the month changed, holidays did too
+                SetHolidayAttrs();
 
-            // update the calendar
-            Refresh();
+                // update the calendar
+                Refresh();
+            }
+            else
+            {
+                // forbidden
+                retval = FALSE;
+            }
         }
     }
 
@@ -1498,11 +1514,21 @@ void wxCalendarCtrl::OnMonthChange(wxCommandEvent& event)
     SetDateAndNotify(target);
 }
 
-void wxCalendarCtrl::OnYearChange(wxSpinEvent& event)
+void wxCalendarCtrl::OnYearChange(wxCommandEvent& event)
 {
+    int year = (int)event.GetInt();
+    if ( year == INT_MIN )
+    {
+        // invalid year in the spin control, ignore it
+        return;
+    }
+
+    // set the flag for SetDate(): otherwise it would overwrite the year
+    // typed in by the user
+    m_userChangedYear = TRUE;
+
     wxDateTime::Tm tm = m_date.GetTm();
 
-    int year = (int)event.GetInt();
     if ( tm.mday > wxDateTime::GetNumberOfDays(tm.mon, year) )
     {
         tm.mday = wxDateTime::GetNumberOfDays(tm.mon, year);
@@ -1520,7 +1546,6 @@ void wxCalendarCtrl::OnYearChange(wxSpinEvent& event)
         // inside the same year but a strange number of months forward/back..
         m_spinYear->SetValue(target.GetYear());
     }
-
 }
 
 // ----------------------------------------------------------------------------