diff options
Diffstat (limited to 'korganizer/koagenda.h')
-rw-r--r-- | korganizer/koagenda.h | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/korganizer/koagenda.h b/korganizer/koagenda.h new file mode 100644 index 000000000..cec1b74d8 --- /dev/null +++ b/korganizer/koagenda.h @@ -0,0 +1,378 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef KOAGENDA_H +#define KOAGENDA_H + +#include <qscrollview.h> +#include <qtimer.h> +#include <qguardedptr.h> +#include <libkcal/incidencebase.h> + + +class QPopupMenu; +class QTime; +class QLabel; +class KConfig; +class KOAgenda; +class KOAgendaItem; + +using namespace KOrg; +namespace KOrg { +class IncidenceChangerBase; +} + +using namespace KCal; +namespace KCal { +class Event; +class Todo; +class Calendar; +} + +class MarcusBains : public QFrame { + Q_OBJECT + public: + MarcusBains( KOAgenda *agenda = 0, const char *name = 0 ); + virtual ~MarcusBains(); + + public slots: + void updateLocation( bool recalculate = false ); + + private: + int todayColumn(); + QTimer *minutes; + QLabel *mTimeBox; + KOAgenda *agenda; + QTime oldTime; + int oldToday; +}; + + +class KOAgenda : public QScrollView +{ + Q_OBJECT + public: + KOAgenda ( int columns, int rows, int columnSize, QWidget *parent=0, + const char *name = 0, WFlags f = 0 ); + KOAgenda ( int columns, QWidget *parent = 0, + const char *name = 0, WFlags f = 0 ); + virtual ~KOAgenda(); + + Incidence *selectedIncidence() const; + QDate selectedIncidenceDate() const; + /** + * Returns the uid of the last incidence that was selected. This + * persists across reloads and clear, so that if the same uid + * reappears, it can be reselected. */ + const QString lastSelectedUid() const; + + virtual bool eventFilter ( QObject *, QEvent * ); + + QPoint contentsToGrid ( const QPoint &pos ) const; + QPoint gridToContents ( const QPoint &gpos ) const; + + int timeToY ( const QTime &time ); + QTime gyToTime ( int y ); + + QMemArray<int> minContentsY(); + QMemArray<int> maxContentsY(); + + int visibleContentsYMin(); + int visibleContentsYMax(); + + void setStartTime( const QTime &startHour ); + + KOAgendaItem *insertItem ( Incidence *incidence, const QDate &qd, int X, int YTop, + int YBottom ); + KOAgendaItem *insertAllDayItem ( Incidence *event, const QDate &qd, int XBegin, + int XEnd ); + void insertMultiItem ( Event *event, const QDate &qd, int XBegin, int XEnd, + int YTop, int YBottom ); + + /** remove an event and all its multi-items from the agenda. + * This function removes the items from the view, but doesn't delete them immediately. + * Instead, they are queued in mItemsToDelete and later deleted by + * the slot deleteItemsToDelete() (called by QTimer::singleShot ) */ + void removeIncidence( Incidence *incidence ); + + void changeColumns( int columns ); + + int columns() { return mColumns; } + int rows() { return mRows; } + + double gridSpacingX() const { return mGridSpacingX; } + double gridSpacingY() const { return mGridSpacingY; } + +// virtual QSizePolicy sizePolicy() const; + + void clear(); + + /** Calculates the minimum width */ + virtual int minimumWidth() const; + /** Update configuration from preference settings */ + void updateConfig(); + + void checkScrollBoundaries(); + + void setHolidayMask( QMemArray<bool> * ); + + void setDateList( const DateList &selectedDates ); + DateList dateList() const; + + void setTypeAheadReceiver( QObject * ); + QObject *typeAheadReceiver() const; + void finishTypeAhead(); + + void setCalendar( Calendar*cal ) { mCalendar = cal; } + void setIncidenceChanger( IncidenceChangerBase *changer ) { mChanger = changer; } + + public slots: + void scrollUp(); + void scrollDown(); + + void checkScrollBoundaries( int ); + + /** Deselect selected items. This function does not emit any signals. */ + void deselectItem(); + + void clearSelection(); + + /** + Select item. If the argument is 0, the currently selected item gets + deselected. This function emits the itemSelected(bool) signal to inform + about selection/deselection of events. + */ + void selectItem( KOAgendaItem * ); + /** + Select the item associated with a given uid. Linear search, use carefully. + */ + void selectItemByUID( const QString& uid ); + bool removeAgendaItem( KOAgendaItem *item ); + void showAgendaItem( KOAgendaItem *item ); + + signals: + void newEventSignal(); + void newTimeSpanSignal( const QPoint &, const QPoint & ); + void newStartSelectSignal(); + + void showIncidenceSignal( Incidence * ); + void editIncidenceSignal( Incidence * ); + void deleteIncidenceSignal( Incidence * ); + void showIncidencePopupSignal( Incidence *, const QDate &); + void showNewEventPopupSignal(); + + void itemModified( KOAgendaItem *item ); + void incidenceSelected( Incidence * ); + void startMultiModify( const QString & ); + void endMultiModify(); + + void lowerYChanged( int ); + void upperYChanged( int ); + + void startDragSignal(Incidence *); + void droppedToDo( Todo*todo, const QPoint &gpos, bool allDay ); + + void enableAgendaUpdate( bool enable ); + void zoomView( const int delta, const QPoint &pos, const Qt::Orientation ); + + void mousePosSignal(const QPoint &pos); + void enterAgenda(); + void leaveAgenda(); + + void gridSpacingYChanged( double ); + + private: + enum MouseActionType { NOP, MOVE, SELECT, + RESIZETOP, RESIZEBOTTOM, RESIZELEFT, RESIZERIGHT }; + + protected: + void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); + int columnWidth( int column ); + virtual void resizeEvent ( QResizeEvent * ); + + /** Handles mouse events. Called from eventFilter */ + virtual bool eventFilter_mouse ( QObject *, QMouseEvent * ); +#ifndef QT_NO_WHEELEVENT + /** Handles mousewheel events. Called from eventFilter */ + virtual bool eventFilter_wheel ( QObject *, QWheelEvent * ); +#endif + /** Handles key events. Called from eventFilter */ + virtual bool eventFilter_key ( QObject *, QKeyEvent * ); + + /** Handles drag and drop events. Called from eventFilter */ + virtual bool eventFilter_drag( QObject *, QDropEvent * ); + + /** returns RESIZELEFT if pos is near the lower edge of the action item, + RESIZERIGHT if pos is near the higher edge, and MOVE otherwise. + If --reverse is used, RESIZELEFT still means resizing the beginning of + the event, although that means moving to the right! + horizontal is the same as mAllDayAgenda. + */ + MouseActionType isInResizeArea( bool horizontal, const QPoint &pos, KOAgendaItem *item ); + /** Return whether the cell specified by the grid point belongs to the current select + */ + bool ptInSelection( QPoint gpos ) const; + + + /** Start selecting time span. */ + void startSelectAction( const QPoint &viewportPos ); + + /** Select time span. */ + void performSelectAction( const QPoint &viewportPos ); + + /** Emd selecting time span. */ + void endSelectAction( const QPoint &viewportPos ); + + /** Start moving/resizing agenda item */ + void startItemAction(const QPoint& viewportPos); + + /** Move/resize agenda item */ + void performItemAction(const QPoint& viewportPos); + + /** End moving/resizing agenda item */ + void endItemAction(); + + /** Set cursor, when no item action is in progress */ + void setNoActionCursor( KOAgendaItem *moveItem, const QPoint &viewportPos ); + /** Sets the cursor according to the given action type. If acting==true, + the corresponding action is running (i.e. the item is really moved). If + acting==false the cursor should just indicate that the corresponding action + is possible */ + void setActionCursor( int actionType, bool acting=false ); + + /** calculate the width of the column subcells of the given item */ + double calcSubCellWidth( KOAgendaItem *item ); + /** Move and resize the given item to the correct position */ + void placeAgendaItem( KOAgendaItem *item, double subCellWidth ); + /** Place agenda item in agenda and adjust other cells if necessary */ + void placeSubCells( KOAgendaItem *placeItem ); + /** Place the agenda item at the correct position (ignoring conflicting items) */ + void adjustItemPosition( KOAgendaItem *item ); + + /** Process the keyevent, including the ignored keyevents of eventwidgets. + * Implements pgup/pgdn and cursor key navigation in the view. + */ + void keyPressEvent( QKeyEvent * ); + + void calculateWorkingHours(); + + virtual void contentsMousePressEvent ( QMouseEvent * ); + + void emitNewEventForSelection(); + + protected slots: + /** delete the items that are queued for deletion */ + void deleteItemsToDelete(); + /** Resizes all the child elements after the size of the agenda + changed. This is needed because Qt seems to have a bug when + the resizeEvent of one of the widgets in a splitter takes a + lot of time / does a lot of resizes.... see bug 80114 */ + void resizeAllContents(); + + private: + void init(); + void marcus_bains(); + bool mAllDayMode; + + // We need the calendar for drag'n'drop and for paint the ResourceColor + Calendar *mCalendar; + + // Width and height of agenda cells. mDesiredGridSpacingY is the height + // set in the config. The actual height might be larger since otherwise + // more than 24 hours might be displayed. + double mGridSpacingX; + double mGridSpacingY; + double mDesiredGridSpacingY; + + // size of border, where mouse action will resize the KOAgendaItem + int mResizeBorderWidth; + + // size of border, where mouse mve will cause a scroll of the agenda + int mScrollBorderWidth; + int mScrollDelay; + int mScrollOffset; + + QTimer mScrollUpTimer; + QTimer mScrollDownTimer; + + // Number of Columns/Rows of agenda grid + int mColumns; + int mRows; + + // Cells to store Move and Resize coordiantes while performing the action + QPoint mStartCell; + QPoint mEndCell; + + // Working Hour coordiantes + bool mWorkingHoursEnable; + QMemArray<bool> *mHolidayMask; + int mWorkingHoursYTop; + int mWorkingHoursYBottom; + + // Selection + bool mHasSelection; + QPoint mSelectionStartPoint; + QPoint mSelectionStartCell; + QPoint mSelectionEndCell; + + // List of dates to be displayed + DateList mSelectedDates; + + // The KOAgendaItem, which has been right-clicked last + QGuardedPtr<KOAgendaItem> mClickedItem; + + // The KOAgendaItem, which is being moved/resized + QGuardedPtr<KOAgendaItem> mActionItem; + + // Currently selected item + QGuardedPtr<KOAgendaItem> mSelectedItem; + // Uid of the last selected item. Used for reselecting in situations + // where the selected item points to a no longer valid incidence, for + // example during resource reload. + QString mSelectedUid; + + // The Marcus Bains Line widget. + MarcusBains *mMarcusBains; + + MouseActionType mActionType; + + bool mItemMoved; + + // List of all Items contained in agenda + QPtrList<KOAgendaItem> mItems; + QPtrList<KOAgendaItem> mItemsToDelete; + + QPopupMenu *mItemPopup; // Right mouse button popup menu for KOAgendaItems + + int mOldLowerScrollValue; + int mOldUpperScrollValue; + + bool mTypeAhead; + QObject *mTypeAheadReceiver; + QPtrList<QEvent> mTypeAheadEvents; + + bool mReturnPressed; + KOrg::IncidenceChangerBase *mChanger; +}; + +#endif // KOAGENDA_H |