git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			304 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        generic/calctrlg.h
 | 
						|
// Purpose:     generic implementation of date-picker control
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Modified by:
 | 
						|
// Created:     29.12.99
 | 
						|
// RCS-ID:      $Id$
 | 
						|
// Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_GENERIC_CALCTRLG_H
 | 
						|
#define _WX_GENERIC_CALCTRLG_H
 | 
						|
 | 
						|
#include "wx/control.h"         // the base class
 | 
						|
#include "wx/dcclient.h"        // for wxPaintDC
 | 
						|
 | 
						|
class WXDLLIMPEXP_FWD_CORE wxComboBox;
 | 
						|
class WXDLLIMPEXP_FWD_CORE wxStaticText;
 | 
						|
class WXDLLIMPEXP_FWD_CORE wxSpinCtrl;
 | 
						|
class WXDLLIMPEXP_FWD_CORE wxSpinEvent;
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxGenericCalendarCtrl
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxGenericCalendarCtrl : public wxCalendarCtrlBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    // construction
 | 
						|
    wxGenericCalendarCtrl() { Init(); }
 | 
						|
    wxGenericCalendarCtrl(wxWindow *parent,
 | 
						|
                          wxWindowID id,
 | 
						|
                          const wxDateTime& date = wxDefaultDateTime,
 | 
						|
                          const wxPoint& pos = wxDefaultPosition,
 | 
						|
                          const wxSize& size = wxDefaultSize,
 | 
						|
                          long style = wxCAL_SHOW_HOLIDAYS,
 | 
						|
                          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,
 | 
						|
                const wxString& name = wxCalendarNameStr);
 | 
						|
 | 
						|
    virtual ~wxGenericCalendarCtrl();
 | 
						|
 | 
						|
    virtual bool Destroy();
 | 
						|
 | 
						|
    // set/get the current date
 | 
						|
    // ------------------------
 | 
						|
 | 
						|
    virtual bool SetDate(const wxDateTime& date);
 | 
						|
    virtual wxDateTime GetDate() const { return m_date; }
 | 
						|
 | 
						|
 | 
						|
    // set/get the range in which selection can occur
 | 
						|
    // ---------------------------------------------
 | 
						|
 | 
						|
    virtual bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime,
 | 
						|
                              const wxDateTime& upperdate = wxDefaultDateTime);
 | 
						|
 | 
						|
    virtual bool GetDateRange(wxDateTime *lowerdate, wxDateTime *upperdate) const;
 | 
						|
 | 
						|
    // these functions are for generic version only, don't use them but use the
 | 
						|
    // Set/GetDateRange() above instead
 | 
						|
    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; }
 | 
						|
 | 
						|
 | 
						|
    // 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_MONTH_CHANGE bit
 | 
						|
    virtual bool EnableMonthChange(bool enable = true);
 | 
						|
 | 
						|
    // corresponds to wxCAL_NO_YEAR_CHANGE bit, deprecated, generic only
 | 
						|
    void EnableYearChange(bool enable = true);
 | 
						|
 | 
						|
 | 
						|
    // customization
 | 
						|
    // -------------
 | 
						|
 | 
						|
    virtual void Mark(size_t day, bool mark);
 | 
						|
 | 
						|
    // all other functions in this section are for generic version only
 | 
						|
 | 
						|
    // header colours are used for painting the weekdays at the top
 | 
						|
    virtual void SetHeaderColours(const wxColour& colFg, const wxColour& colBg)
 | 
						|
    {
 | 
						|
        m_colHeaderFg = colFg;
 | 
						|
        m_colHeaderBg = colBg;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual const wxColour& GetHeaderColourFg() const { return m_colHeaderFg; }
 | 
						|
    virtual const wxColour& GetHeaderColourBg() const { return m_colHeaderBg; }
 | 
						|
 | 
						|
    // highlight colour is used for the currently selected date
 | 
						|
    virtual void SetHighlightColours(const wxColour& colFg, const wxColour& colBg)
 | 
						|
    {
 | 
						|
        m_colHighlightFg = colFg;
 | 
						|
        m_colHighlightBg = colBg;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual const wxColour& GetHighlightColourFg() const { return m_colHighlightFg; }
 | 
						|
    virtual const wxColour& GetHighlightColourBg() const { return m_colHighlightBg; }
 | 
						|
 | 
						|
    // holiday colour is used for the holidays (if style & wxCAL_SHOW_HOLIDAYS)
 | 
						|
    virtual void SetHolidayColours(const wxColour& colFg, const wxColour& colBg)
 | 
						|
    {
 | 
						|
        m_colHolidayFg = colFg;
 | 
						|
        m_colHolidayBg = colBg;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual const wxColour& GetHolidayColourFg() const { return m_colHolidayFg; }
 | 
						|
    virtual const wxColour& GetHolidayColourBg() const { return m_colHolidayBg; }
 | 
						|
 | 
						|
    virtual wxCalendarDateAttr *GetAttr(size_t day) const
 | 
						|
    {
 | 
						|
        wxCHECK_MSG( day > 0 && day < 32, NULL, _T("invalid day") );
 | 
						|
 | 
						|
        return m_attrs[day - 1];
 | 
						|
    }
 | 
						|
 | 
						|
    virtual void SetAttr(size_t day, wxCalendarDateAttr *attr)
 | 
						|
    {
 | 
						|
        wxCHECK_RET( day > 0 && day < 32, _T("invalid day") );
 | 
						|
 | 
						|
        delete m_attrs[day - 1];
 | 
						|
        m_attrs[day - 1] = attr;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual void ResetAttr(size_t day) { SetAttr(day, NULL); }
 | 
						|
 | 
						|
    virtual void SetHoliday(size_t day);
 | 
						|
 | 
						|
    virtual wxCalendarHitTestResult HitTest(const wxPoint& pos,
 | 
						|
                                            wxDateTime *date = NULL,
 | 
						|
                                            wxDateTime::WeekDay *wd = NULL);
 | 
						|
 | 
						|
    // implementation only from now on
 | 
						|
    // -------------------------------
 | 
						|
 | 
						|
    // forward these functions to all subcontrols
 | 
						|
    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 DoMoveWindow(int x, int y, int width, int height);
 | 
						|
    virtual void DoGetSize(int *width, int *height) const;
 | 
						|
 | 
						|
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 HandleYearChange(wxCommandEvent& event);
 | 
						|
    void OnYearChange(wxSpinEvent& event);
 | 
						|
    void OnYearTextChange(wxCommandEvent& event);
 | 
						|
 | 
						|
    // (re)calc m_widthCol and m_heightRow
 | 
						|
    void RecalcGeometry();
 | 
						|
 | 
						|
    // set the date and send the notification
 | 
						|
    void SetDateAndNotify(const wxDateTime& date);
 | 
						|
 | 
						|
    // get the week (row, in range 1..6) for the given date
 | 
						|
    size_t GetWeek(const wxDateTime& date) const;
 | 
						|
 | 
						|
    // get the date from which we start drawing days
 | 
						|
    wxDateTime GetStartDate() const;
 | 
						|
 | 
						|
    // 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);
 | 
						|
 | 
						|
    // change the date inside the same month/year
 | 
						|
    void ChangeDay(const wxDateTime& date);
 | 
						|
 | 
						|
    // deprecated
 | 
						|
    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:
 | 
						|
    virtual void ResetHolidayAttrs();
 | 
						|
    virtual void RefreshHolidays() { Refresh(); }
 | 
						|
 | 
						|
    // 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_colBackground,
 | 
						|
             m_colSurrounding;
 | 
						|
 | 
						|
    // 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_rowOffset,
 | 
						|
            m_calendarWeekWidth;
 | 
						|
 | 
						|
    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(wxGenericCalendarCtrl)
 | 
						|
    DECLARE_EVENT_TABLE()
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGenericCalendarCtrl);
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_GENERIC_CALCTRLG_H
 |