You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/libkdeedu/extdate/extdatetbl.h

433 lines
11 KiB

/* -*- C++ -*-
This file is part of the KDE libraries
Copyright (C) 1997 Tim D. Gilman (tdgilman@best.org)
(C) 1998-2001 Mirko Boehm (mirko@kde.org)
(C) 2004 Jason Harris (jharris@30doradus.org)
These classes has been derived from those in kdatetbl.[h|cpp].
The only differences are adaptations to use ExtDate instead of TQDate,
to allow for more remote dates. These changes by Jason Harris.
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.
*/
#ifndef EXTDATETBL_H
#define EXTDATETBL_H
#include <tqvalidator.h>
#include <tqgridview.h>
#include <klineedit.h>
#include "extcalendarsystemgregorian.h"
class KPopupMenu;
/** Week selection widget.
* @internal
* @version $Id$
* @author Stephan Binner
*/
class ExtDateInternalWeekSelector : public KLineEdit
{
Q_OBJECT
TQ_OBJECT
protected:
TQIntValidator *val;
int result;
public slots:
void weekEnteredSlot();
void setMaxWeek(int max);
signals:
void closeMe(int);
public:
ExtDateInternalWeekSelector( TQWidget* parent=0, const char* name=0);
int getWeek();
void setWeek(int week);
private:
class ExtDateInternalWeekPrivate;
ExtDateInternalWeekPrivate *d;
};
/**
* A table containing month names. It is used to pick a month directly.
* @internal
* @version $Id$
* @author Tim Gilman, Mirko Boehm
*/
class ExtDateInternalMonthPicker : public TQGridView
{
Q_OBJECT
TQ_OBJECT
protected:
/**
* Store the month that has been clicked [1..12].
*/
int result;
/**
* the cell under mouse cursor when LBM is pressed
*/
short int activeCol;
short int activeRow;
/**
* Contains the largest rectangle needed by the month names.
*/
TQRect max;
signals:
/**
* This is send from the mouse click event handler.
*/
void closeMe(int);
public:
/**
* The constructor.
*/
ExtDateInternalMonthPicker(const ExtDate& date, TQWidget* parent, const char* name=0);
/**
* The destructor.
*/
~ExtDateInternalMonthPicker();
/**
* The size hint.
*/
TQSize tqsizeHint() const;
/**
* Return the result. 0 means no selection (reject()), 1..12 are the
* months.
*/
int getResult() const;
protected:
/**
* Set up the painter.
*/
void setupPainter(TQPainter *p);
/**
* The resize event.
*/
virtual void viewportResizeEvent(TQResizeEvent*);
/**
* Paint a cell. This simply draws the month names in it.
*/
virtual void paintCell(TQPainter* painter, int row, int col);
/**
* Catch mouse click and move events to paint a rectangle around the item.
*/
virtual void contentsMousePressEvent(TQMouseEvent *e);
virtual void contentsMouseMoveEvent(TQMouseEvent *e);
/**
* Emit monthSelected(int) when a cell has been released.
*/
virtual void contentsMouseReleaseEvent(TQMouseEvent *e);
private:
class ExtDateInternalMonthPrivate;
ExtDateInternalMonthPrivate *d;
};
/** Year selection widget.
* @internal
* @version $Id$
* @author Tim Gilman, Mirko Boehm
*/
class ExtDateInternalYearSelector : public TQLineEdit
{
Q_OBJECT
TQ_OBJECT
protected:
TQIntValidator *val;
int result;
public slots:
void yearEnteredSlot();
signals:
void closeMe(int);
public:
ExtDateInternalYearSelector( TQWidget* parent=0, const char* name=0);
~ExtDateInternalYearSelector();
int getYear();
void setYear(int year);
private:
class ExtDateInternalYearPrivate {
public:
ExtDateInternalYearPrivate() {
calendar = new ExtCalendarSystemGregorian();
}
~ExtDateInternalYearPrivate() {
delete calendar;
}
ExtCalendarSystem *calendar;
};
ExtDateInternalYearPrivate *d;
};
/**
* Frame with popup menu behavior.
* @author Tim Gilman, Mirko Boehm
* @version $Id$
*/
class KPopupFrame : public TQFrame
{
Q_OBJECT
TQ_OBJECT
protected:
/**
* The result. It is returned from exec() when the popup window closes.
*/
int result;
/**
* Catch key press events.
*/
virtual void keyPressEvent(TQKeyEvent* e);
/**
* The only subwidget that uses the whole dialog window.
*/
TQWidget *main;
public slots:
/**
* Close the popup window. This is called from the main widget, usually.
* @p r is the result returned from exec().
*/
void close(int r);
public:
/**
* The contructor. Creates a dialog without buttons.
*/
KPopupFrame(TQWidget* parent=0, const char* name=0);
/**
* Set the main widget. You cannot set the main widget from the constructor,
* since it must be a child of the frame itselfes.
* Be careful: the size is set to the main widgets size. It is up to you to
* set the main widgets correct size before setting it as the main
* widget.
*/
void setMainWidget(TQWidget* m);
/**
* The resize event. Simply resizes the main widget to the whole
* widgets client size.
*/
virtual void resizeEvent(TQResizeEvent*);
/**
* Open the popup window at position pos.
*/
void popup(const TQPoint &pos);
/**
* Execute the popup window.
*/
int exec(TQPoint p);
/**
* Dito.
*/
int exec(int x, int y);
private:
virtual bool close(bool alsoDelete) { return TQFrame::close(alsoDelete); }
protected:
virtual void virtual_hook( int id, void* data );
private:
class KPopupFramePrivate;
KPopupFramePrivate *d;
};
/**
* Validates user-entered dates.
*/
class ExtDateValidator : public TQValidator
{
public:
ExtDateValidator(TQWidget* parent=0, const char* name=0);
virtual State validate(TQString&, int&) const;
virtual void fixup ( TQString & input ) const;
State date(const TQString&, ExtDate&) const;
};
/**
* Date selection table.
* This is a support class for the ExtDatePicker class. It just
* draws the calender table without titles, but could theoretically
* be used as a standalone.
*
* When a date is selected by the user, it emits a signal:
* dateSelected(ExtDate)
*
* @internal
* @version $Id$
* @author Tim Gilman, Mirko Boehm
*/
class ExtDateTable : public TQGridView
{
Q_OBJECT
TQ_OBJECT
//TQ_PROPERTY( ExtDate date READ getDate WRITE setDate )
TQ_PROPERTY( bool popupMenu READ popupMenuEnabled WRITE setPopupMenuEnabled )
public:
/**
* The constructor.
*/
ExtDateTable(TQWidget *parent=0,
ExtDate date=ExtDate::tqcurrentDate(),
const char* name=0, WFlags f=0);
/**
* The destructor.
*/
~ExtDateTable();
/**
* Returns a recommended size for the widget.
* To save some time, the size of the largest used cell content is
* calculated in each paintCell() call, since all calculations have
* to be done there anyway. The size is stored in maxCell. The
* tqsizeHint() simply returns a multiple of maxCell.
*/
virtual TQSize tqsizeHint() const;
/**
* Set the font size of the date table.
*/
void setFontSize(int size);
/**
* Select and display this date.
*/
bool setDate(const ExtDate&);
// ### 4.0 rename to date()
const ExtDate& getDate() const;
/**
* Enables a popup menu when right clicking on a date.
*
* When it's enabled, this object emits a aboutToShowContextMenu signal
* where you can fill in the menu items.
*
* @since 3.2
*/
void setPopupMenuEnabled( bool enable );
/**
* Returns if the popup menu is enabled or not
*/
bool popupMenuEnabled() const;
enum BackgroundMode { NoBgMode=0, RectangleMode, CircleMode };
/**
* Makes a given date be painted with a given foregroundColor, and background
* (a rectangle, or a circle/ellipse) in a given color.
*
* @since 3.2
*/
void setCustomDatePainting( const ExtDate &date, const TQColor &fgColor, BackgroundMode bgMode=NoBgMode, const TQColor &bgColor=TQColor());
/**
* Unsets the custom painting of a date so that the date is painted as usual.
*
* @since 3.2
*/
void unsetCustomDatePainting( const ExtDate &date );
protected:
/**
* calculate the position of the cell in the matrix for the given date. The result is the 0-based index.
*/
int posFromDate( const ExtDate &date ); // KDE4: make this virtual, so subclasses can reimplement this and use a different default for the start of the matrix
/**
* calculate the date that is displayed at a given cell in the matrix. pos is the
* 0-based index in the matrix. Inverse function to posForDate().
*/
ExtDate dateFromPos( int pos ); // KDE4: make this virtual
/**
* Paint a cell.
*/
virtual void paintCell(TQPainter*, int, int);
/**
* Handle the resize events.
*/
virtual void viewportResizeEvent(TQResizeEvent *);
/**
* React on mouse clicks that select a date.
*/
virtual void contentsMousePressEvent(TQMouseEvent *);
virtual void wheelEvent( TQWheelEvent * e );
virtual void keyPressEvent( TQKeyEvent *e );
virtual void focusInEvent( TQFocusEvent *e );
virtual void focusOutEvent( TQFocusEvent *e );
// ### KDE 4.0 make the following private and mark as members
/**
* The font size of the displayed text.
*/
int fontsize;
/**
* The currently selected date.
*/
ExtDate date;
/**
* The day of the first day in the month [1..7].
*/
int firstday;
/**
* The number of days in the current month.
*/
int numdays;
/**
* The number of days in the previous month.
*/
int numDaysPrevMonth;
/**
* unused
* ### remove in KDE 4.0
*/
bool unused_hasSelection;
/**
* Save the size of the largest used cell content.
*/
TQRect maxCell;
signals:
/**
* The selected date changed.
*/
void dateChanged(const ExtDate&);
/**
* This function behaves essentially like the one above.
* The selected date changed.
* @param cur The current date
* @param old The date before the date was changed
*/
void dateChanged(const ExtDate& cur, const ExtDate& old);
/**
* A date has been selected by clicking on the table.
*/
void tableClicked();
/**
* A popup menu for a given date is about to be shown (as when the user
* right clicks on that date and the popup menu is enabled). Connect
* the slot where you fill the menu to this signal.
*
* @since 3.2
*/
void aboutToShowContextMenu( KPopupMenu * menu, const ExtDate &date);
protected:
virtual void virtual_hook( int id, void* data );
private:
class ExtDateTablePrivate;
ExtDateTablePrivate *d;
};
#endif // EXTDATETBL_H