/* This file is part of KOrganizer. Copyright (c) 2000,2001,2003 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 KOAGENDAVIEW_H #define KOAGENDAVIEW_H #include <tqscrollview.h> #include <tqlabel.h> #include <libkcal/calendar.h> #include "calprinter.h" #include "calendarview.h" #include "agendaview.h" class TQHBox; class TQPushButton; class TQBoxLayout; class KOAgenda; class KOAgendaItem; class TimeLabels; class KConfig; namespace KOrg { class IncidenceChangerBase; } class EventIndicator : public QFrame { Q_OBJECT public: enum Location { Top, Bottom }; EventIndicator( Location loc = Top, TQWidget *parent = 0, const char *name = 0 ); virtual ~EventIndicator(); void changeColumns( int columns ); void enableColumn( int column, bool enable ); protected: void drawContents( TQPainter * ); private: int mColumns; Location mLocation; TQPixmap mPixmap; TQMemArray<bool> mEnabled; }; class KOAlternateLabel : public QLabel { Q_OBJECT public: KOAlternateLabel( const TQString &shortlabel, const TQString &longlabel, const TQString &extensivelabel = TQString::null, TQWidget *parent = 0, const char *name = 0 ); ~KOAlternateLabel(); virtual TQSize tqminimumSizeHint() const; enum TextType { Short = 0, Long = 1, Extensive = 2 }; TextType largestFittingTextType() const; void setFixedType( TextType type ); public slots: void useShortText(); void useLongText(); void useExtensiveText(); void useDefaultText(); protected: virtual void resizeEvent( TQResizeEvent * ); virtual void squeezeTextToLabel(); bool mTextTypeFixed; TQString mShortText, mLongText, mExtensiveText; }; /** KOAgendaView is the agenda-like view used to display events in a single one or multi-day view. */ class KOAgendaView : public KOrg::AgendaView, public KCal::Calendar::Observer { Q_OBJECT public: KOAgendaView( Calendar *cal, CalendarView *calendarView, TQWidget *parent = 0, const char *name = 0, bool isSideBySide = false ); virtual ~KOAgendaView(); /** Returns maximum number of days supported by the koagendaview */ virtual int maxDatesHint(); /** Returns number of currently shown dates. */ virtual int tqcurrentDateCount(); /** returns the currently selected events */ virtual Incidence::List selectedIncidences(); /** returns the currently selected events */ virtual DateList selectedIncidenceDates(); /** return the default start/end date/time for new events */ virtual bool eventDurationHint(TQDateTime &startDt, TQDateTime &endDt, bool &allDay); /** Remove all events from view */ void clearView(); KOrg::CalPrinterBase::PrintType printType(); /** start-datetime of selection */ TQDateTime selectionStart() { return mTimeSpanBegin; } /** end-datetime of selection */ TQDateTime selectionEnd() { return mTimeSpanEnd; } /** returns true if selection is for whole day */ bool selectedIsAllDay() { return mTimeSpanInAllDay; } /** make selected start/end invalid */ void deleteSelectedDateTime(); /** returns if only a single cell is selected, or a range of cells */ bool selectedIsSingleCell(); void setTypeAheadReceiver( TQObject * ); KOAgenda* agenda() const { return mAgenda; } TQSplitter* splitter() const { return mSplitterAgenda; } TQFrame *dayLabels() const { return mDayLabels; } /* reimplmented from KCal::Calendar::Observer */ void calendarIncidenceAdded( Incidence *incidence ); void calendarIncidenceChanged( Incidence *incidence ); void calendarIncidenceDeleted( Incidence *incidence ); public slots: virtual void updateView(); virtual void updateConfig(); virtual void showDates( const TQDate &start, const TQDate &end ); virtual void showIncidences( const Incidence::List &incidenceList, const TQDate &date ); void insertIncidence( Incidence *incidence, const TQDate &curDate ); void changeIncidenceDisplayAdded( Incidence *incidence ); void changeIncidenceDisplay( Incidence *incidence, int mode ); void clearSelection(); void startDrag( Incidence * ); void readSettings(); void readSettings( KConfig * ); void writeSettings( KConfig * ); void setContentsPos( int y ); void setExpandedButton( bool expanded ); void finishTypeAhead(); /** reschedule the todo to the given x- and y- coordinates. Third parameter determines all-day (no time specified) */ void slotTodoDropped( Todo *, const TQPoint &, bool ); void enableAgendaUpdate( bool enable ); void setIncidenceChanger( KOrg::IncidenceChangerBase *changer ); void zoomInHorizontally( const TQDate& date=TQDate() ); void zoomOutHorizontally( const TQDate& date=TQDate() ); void zoomInVertically( ); void zoomOutVertically( ); void zoomView( const int delta, const TQPoint &pos, const Qt::Orientation orient=Qt::Horizontal ); void clearTimeSpanSelection(); void resourcesChanged(); signals: void toggleExpand(); void zoomViewHorizontally(const TQDate &, int count ); void timeSpanSelectionChanged(); protected: /** Fill agenda beginning with date startDate */ void fillAgenda( const TQDate &startDate ); /** Fill agenda using the current set value for the start date */ void fillAgenda(); void connectAgenda( KOAgenda*agenda, TQPopupMenu*popup, KOAgenda* otherAgenda ); /** Create labels for the selected dates. */ void createDayLabels( bool force ); /** Set the tqmasks on the agenda widgets indicating, which days are holidays. */ void setHolidayMasks(); void removeIncidence( Incidence * ); /** Updates the event indicators after a certain incidence was modified or removed. */ void updateEventIndicators(); void updateTimeBarWidth(); virtual void resizeEvent( TQResizeEvent *resizeEvent ); protected slots: /** Update event belonging to agenda item */ void updateEventDates( KOAgendaItem *item ); /** update just the display of the given incidence, called by a single-shot timer */ void doUpdateItem(); void updateEventIndicatorTop( int newY ); void updateEventIndicatorBottom( int newY ); /** Updates data for selected timespan */ void newTimeSpanSelected( const TQPoint &start, const TQPoint &end ); /** Updates data for selected timespan for all day event*/ void newTimeSpanSelectedAllDay( const TQPoint &start, const TQPoint &end ); void updateDayLabelSizes(); private: bool filterByResource( Incidence *incidence ); void displayIncidence( Incidence *incidence ); private: // view widgets TQFrame *mDayLabels; TQHBox *mDayLabelsFrame; TQBoxLayout *mLayoutDayLabels; TQPtrList<KOAlternateLabel> mDateDayLabels; TQFrame *mAllDayFrame; KOAgenda *mAllDayAgenda; KOAgenda *mAgenda; TimeLabels *mTimeLabels; TQWidget *mDummyAllDayLeft; TQSplitter *mSplitterAgenda; TQPushButton *mExpandButton; DateList mSelectedDates; // List of dates to be displayed DateList mSaveSelectedDates; // Save the list of dates between updateViews int mViewType; KOEventPopupMenu *mAgendaPopup; KOEventPopupMenu *mAllDayAgendaPopup; EventIndicator *mEventIndicatorTop; EventIndicator *mEventIndicatorBottom; TQMemArray<int> mMinY; TQMemArray<int> mMaxY; TQMemArray<bool> mHolidayMask; TQPixmap mExpandedPixmap; TQPixmap mNotExpandedPixmap; TQDateTime mTimeSpanBegin; TQDateTime mTimeSpanEnd; bool mTimeSpanInAllDay; bool mAllowAgendaUpdate; Incidence *mUpdateItem; bool mIsSideBySide; bool mPendingChanges; // the current date is inserted into mSelectedDates in the constructor // however whe should only show events when setDates is called, otherwise // we see day view with current date for a few milisecs, then we see something else // because someone called setDates with the real dates that should be displayed. // Other solution would be not initializing mSelectedDates in the ctor, but that requires // lots of changes in koagenda.cpp and koagendaview.cpp bool mAreDatesInitialized; }; #endif