]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/generic/calctrl.h
Block all events in wxSpinCtrl::SetValue etc.
[wxWidgets.git] / include / wx / generic / calctrl.h
index 78a9385d3b01c69d2f400302aaca0ab88b279a23..08acaca363c38fa348b9f0bb2a9872c53b1a41c5 100644 (file)
@@ -6,21 +6,18 @@
 // Created:     29.12.99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-    #pragma interface "calctrl.h"
-#endif
-
 #ifndef _WX_GENERIC_CALCTRL_H
 #define _WX_GENERIC_CALCTRL_H
 
 #include "wx/control.h"         // the base class
+#include "wx/dcclient.h"        // for wxPaintDC
 
-#include "wx/spinctrl.h"        // for wxSpinEvent
-
-class WXDLLEXPORT wxComboBox;
+class WXDLLIMPEXP_FWD_CORE wxComboBox;
+class WXDLLIMPEXP_FWD_CORE wxStaticText;
+class WXDLLIMPEXP_FWD_CORE wxSpinCtrl;
 
 #define wxCalendarNameStr _T("CalendarCtrl")
 
@@ -28,11 +25,8 @@ class WXDLLEXPORT wxComboBox;
 // wxCalendarCtrl: a control allowing the user to pick a date interactively
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxCalendarCtrl : public wxControl
+class WXDLLIMPEXP_ADV wxCalendarCtrl : public wxControl
 {
-friend class wxMonthComboBox;
-friend class wxYearSpinCtrl;
-
 public:
     // construction
     wxCalendarCtrl() { Init(); }
@@ -41,32 +35,53 @@ public:
                    const wxDateTime& date = wxDefaultDateTime,
                    const wxPoint& pos = wxDefaultPosition,
                    const wxSize& size = wxDefaultSize,
-                   long style = wxCAL_SHOW_HOLIDAYS,
-                   const wxString& name = wxCalendarNameStr)
-        : wxControl(parent, id, pos, size,
-                    style | wxWANTS_CHARS, wxDefaultValidator, name)
-    {
-        Init();
-
-        (void)Create(parent, id, date, pos, size, style, name);
-    }
+                   long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS,
+                   const wxString& name = wxCalendarNameStr);
 
     bool Create(wxWindow *parent,
                 wxWindowID id,
                 const wxDateTime& date = wxDefaultDateTime,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
-                long style = wxCAL_SHOW_HOLIDAYS,
+                long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS,
                 const wxString& name = wxCalendarNameStr);
 
     virtual ~wxCalendarCtrl();
 
+    virtual bool Destroy();
+
     // set/get the current date
     // ------------------------
 
-    void SetDate(const wxDateTime& date);
+    bool SetDate(const wxDateTime& date); // we need to be able to control if the event should be sent in SetDateAndNotify(...)
     const wxDateTime& GetDate() const { return m_date; }
 
+    // set/get the range in which selection can occur
+    // ---------------------------------------------
+
+    bool SetLowerDateLimit(const wxDateTime& date = wxDefaultDateTime);
+    const wxDateTime& GetLowerDateLimit() const { return m_lowdate; }
+    bool SetUpperDateLimit(const wxDateTime& date = wxDefaultDateTime);
+    const wxDateTime& GetUpperDateLimit() const { return m_highdate; }
+
+    bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime);
+
+    // calendar mode
+    // -------------
+
+    // some calendar styles can't be changed after the control creation by
+    // just using SetWindowStyle() and Refresh() and the functions below
+    // should be used instead for them
+
+    // corresponds to wxCAL_NO_YEAR_CHANGE bit
+    void EnableYearChange(bool enable = true);
+
+    // corresponds to wxCAL_NO_MONTH_CHANGE bit
+    void EnableMonthChange(bool enable = true);
+
+    // corresponds to wxCAL_SHOW_HOLIDAYS bit
+    void EnableHolidayDisplay(bool display = true);
+
     // customization
     // -------------
 
@@ -100,11 +115,6 @@ public:
     const wxColour& GetHolidayColourFg() const { return m_colHolidayFg; }
     const wxColour& GetHolidayColourBg() const { return m_colHolidayBg; }
 
-    // this function should be called instead of directly changing the
-    // wxCAL_SHOW_HOLIDAYS bit in the control style after the control creation
-    // (this won't work)
-    void EnableHolidayDisplay(bool display = TRUE);
-
     // an item without custom attributes is drawn with the default colours and
     // font and without border, setting custom attributes allows to modify this
     //
@@ -142,28 +152,42 @@ public:
     // -------------------------------
 
     // forward these functions to all subcontrols
-    virtual bool Enable(bool enable = TRUE);
-    virtual bool Show(bool show = TRUE);
+    virtual bool Enable(bool enable = true);
+    virtual bool Show(bool show = true);
+
+    virtual void SetWindowStyleFlag(long style);
+
+    virtual wxVisualAttributes GetDefaultAttributes() const
+        { return GetClassDefaultAttributes(GetWindowVariant()); }
+
+    static wxVisualAttributes
+    GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
+
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
+
+protected:
+    // override some base class virtuals
+    virtual wxSize DoGetBestSize() const;
+    virtual void DoGetPosition(int *x, int *y) const;
+    virtual void DoGetSize(int *width, int *height) const;
+    virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags);
+    virtual void DoMoveWindow(int x, int y, int width, int height);
 
 private:
     // common part of all ctors
     void Init();
 
+    // startup colours and reinitialization after colour changes in system
+    void InitColours();
+
     // event handlers
     void OnPaint(wxPaintEvent& event);
     void OnClick(wxMouseEvent& event);
     void OnDClick(wxMouseEvent& event);
     void OnChar(wxKeyEvent& event);
     void OnMonthChange(wxCommandEvent& event);
-    void OnYearChange(wxSpinEvent& event);
-    void OnCalMonthChange(wxCalendarEvent& event);
-
-    // override some base class virtuals
-    virtual wxSize DoGetBestSize() const;
-    virtual void DoGetPosition(int *x, int *y) const;
-    virtual void DoGetSize(int *width, int *height) const;
-    virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags);
-    virtual void DoMoveWindow(int x, int y, int width, int height);
+    void OnYearChange(wxCommandEvent& event);
+    void OnYearTextChange(wxCommandEvent& event);
 
     // (re)calc m_widthCol and m_heightRow
     void RecalcGeometry();
@@ -180,6 +204,13 @@ private:
     // is this date shown?
     bool IsDateShown(const wxDateTime& date) const;
 
+    // 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;
+
     // redraw the given date
     void RefreshDate(const wxDateTime& date);
 
@@ -205,33 +236,89 @@ private:
         GenerateEvent(type2);
     }
 
+    // do we allow changing the month/year?
+    bool AllowMonthChange() const
+    {
+        return (GetWindowStyle() & wxCAL_NO_MONTH_CHANGE)
+                != wxCAL_NO_MONTH_CHANGE;
+    }
+    bool AllowYearChange() const
+    {
+        return !(GetWindowStyle() & wxCAL_NO_YEAR_CHANGE);
+    }
+
+    // show the correct controls
+    void ShowCurrentControls();
+
+    // create the month combo and year spin controls
+    void CreateMonthComboBox();
+    void CreateYearSpinCtrl();
+
+public:
+    // get the currently shown control for month/year
+    wxControl *GetMonthControl() const;
+    wxControl *GetYearControl() const;
+
+private:
+    // OnPaint helper-methods
+
+    // Highlight the [fromdate : todate] range using pen and brush
+    void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, const wxPen* pen, const 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
+    bool GetDateCoord(const wxDateTime& date, int *day, int *week) const;
+
+    // Set the flag for SetDate(): otherwise it would overwrite the year
+    // typed in by the user
+    void SetUserChangedYear() { m_userChangedYear = true; }
+
     // the subcontrols
+    wxStaticText *m_staticMonth;
     wxComboBox *m_comboMonth;
+
+    wxStaticText *m_staticYear;
     wxSpinCtrl *m_spinYear;
 
     // the current selection
     wxDateTime m_date;
 
+    // the date-range
+    wxDateTime m_lowdate;
+    wxDateTime m_highdate;
+
     // default attributes
     wxColour m_colHighlightFg,
              m_colHighlightBg,
              m_colHolidayFg,
              m_colHolidayBg,
              m_colHeaderFg,
-             m_colHeaderBg;
+             m_colHeaderBg,
+             m_colBackground,
+             m_colSorrounding;
 
     // the attributes for each of the month days
     wxCalendarDateAttr *m_attrs[31];
 
     // the width and height of one column/row in the calendar
     wxCoord m_widthCol,
-            m_heightRow;
+            m_heightRow,
+            m_rowOffset;
+
+    wxRect m_leftArrowRect,
+           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()
+    DECLARE_NO_COPY_CLASS(wxCalendarCtrl)
 };
 
 #endif // _WX_GENERIC_CALCTRL_H