diff options
Diffstat (limited to 'kplato/kptcalendarpanel.h')
-rw-r--r-- | kplato/kptcalendarpanel.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/kplato/kptcalendarpanel.h b/kplato/kptcalendarpanel.h new file mode 100644 index 00000000..ce57e4af --- /dev/null +++ b/kplato/kptcalendarpanel.h @@ -0,0 +1,232 @@ +/* This file is part of the KDE project + Copyright (C) 1997 Tim D. Gilman ([email protected]) + (C) 1998-2001 Mirko Boehm ([email protected]) + (C) 2004 Dag Andersen <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +/* This is based on KDatePicker. */ + +#ifndef KPTCALENDARPANEL_H +#define KPTCALENDARPANEL_H + +#include "kptmap.h" + +#include <qdatetime.h> +#include <qframe.h> + +class QLineEdit; +class QToolButton; + +namespace KPlato +{ + +class DateValidator; +class DateTable; +class Calendar; + +/** + * Provides a widget for calendar input. + * + **/ +class CalendarPanel: public QFrame +{ + Q_OBJECT + Q_PROPERTY( QDate date READ date WRITE setDate) + Q_PROPERTY( bool closeButton READ hasCloseButton WRITE setCloseButton ) + +public: + /** The usual constructor. The given date will be displayed + * initially. + **/ + CalendarPanel(QWidget *parent=0, QDate=QDate::currentDate(), const char *name=0, WFlags f=0); + + /** + * Standard qt widget constructor. The initial date will be the + * current date. + */ + CalendarPanel( QWidget *parent, const char *name ); + + /** + * The destructor. + **/ + virtual ~CalendarPanel(); + + /** The size hint for date pickers. The size hint recommends the + * minimum size of the widget so that all elements may be placed + * without clipping. This sometimes looks ugly, so when using the + * size hint, try adding 28 to each of the reported numbers of + * pixels. + **/ + QSize sizeHint() const; + + QSize minimumSizeHint() const { return sizeHint(); } + /** + * Sets the date. + * + * @returns @p false and does not change anything + * if the date given is invalid. + **/ + bool setDate(const QDate&); + + /** + * Returns the selected date. + * @deprecated + **/ + const QDate& getDate() const; + + /** + * @returns the selected date. + */ + const QDate &date() const; + + /** + * Enables or disables the widget. + **/ + void setEnabled(bool); + + /** + * Sets the font size of the widgets elements. + **/ + void setFontSize(int); + /** + * Returns the font size of the widget elements. + */ + int fontSize() const + { return fontsize; } + + /** + * By calling this method with @p enable = true, CalendarPanel will show + * a little close-button in the upper button-row. Clicking the + * close-button will cause the CalendarPanel's topLevelWidget()'s close() + * method being called. This is mostly useful for toplevel datepickers + * without a window manager decoration. + * @see #hasCloseButton + */ + void setCloseButton( bool enable ); + + /** + * @returns true if a CalendarPanel shows a close-button. + * @see #setCloseButton + */ + bool hasCloseButton() const; + + void setCalendar(Calendar *cal); + + DateMap selectedDates(); + IntMap selectedWeekdays(); + WeekMap selectedWeeks(); + + DateMap markedDates(); + IntMap markedWeekdays(); + WeekMap markedWeeks(); + + void clear(); + + void markSelected(int state); + +protected: + /// to catch move keyEvents when QLineEdit has keyFocus + virtual bool eventFilter(QObject *o, QEvent *e ); + /// the resize event + virtual void resizeEvent(QResizeEvent*); + /// the year forward button + QToolButton *yearForward; + /// the year backward button + QToolButton *yearBackward; + /// the month forward button + QToolButton *monthForward; + /// the month backward button + QToolButton *monthBackward; + /// the button for selecting the month directly + QToolButton *selectMonth; + /// the button for selecting the year directly + QToolButton *selectYear; + /// the line edit to enter the date directly + QLineEdit *line; + /// the validator for the line edit: + DateValidator *val; + /// the date table + DateTable *table; + // the widest month string in pixels: + QSize maxMonthRect; + +protected slots: + void dateChangedSlot(QDate); + void tableClickedSlot(); + void monthForwardClicked(); + void monthBackwardClicked(); + void yearForwardClicked(); + void yearBackwardClicked(); + void selectWeekClicked(); + void selectMonthClicked(); + void selectYearClicked(); + void lineEnterPressed(); + + void slotWeekdaySelected(int day); + void slotWeekSelected(int week, int year); + void slotSelectionCleared(); + +signals: + /** This signal is emitted each time the selected date is changed. + * Usually, this does not mean that the date has been entered, + * since the date also changes, for example, when another month is + * selected. + * @see dateSelected + */ + void dateChanged(QDate); + /** This signal is emitted each time a day has been selected by + * clicking on the table (hitting a day in the current month). + */ + void dateSelected(QDate); + /** This signal is emitted when enter is pressed and a VALID date + * has been entered before into the line edit. Connect to both + * dateEntered() and dateSelected() to receive all events where the + * user really enters a date. + */ + void dateEntered(QDate); + /** This signal is emitted when the day has been selected by + * clicking on it in the table. + */ + void tableClicked(); + + void weekSelected(int week, int year); + void weekdaySelected(int day); + /** + * All selections have been cleared + */ + void selectionCleared(); + +private: + /// the font size for the widget + int fontsize; + + bool m_selectedDays[7]; + +protected: + virtual void virtual_hook( int id, void* data ); +private: + void init( const QDate &dt ); + class CalendarPanelPrivate; + CalendarPanelPrivate *d; + // calculate ISO 8601 week number + int weekOfYear(QDate); +}; + +} //KPlato namespace + +#endif // CALENDARPANEL_H |