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.
209 lines
7.3 KiB
209 lines
7.3 KiB
/*
|
|
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 KOAGENDAITEM_H
|
|
#define KOAGENDAITEM_H
|
|
|
|
#include "cellitem.h"
|
|
|
|
#include <qdatetime.h>
|
|
|
|
class QToolTipGroup;
|
|
class QDragEnterEvent;
|
|
class QDropEvent;
|
|
|
|
namespace KCal {
|
|
class Incidence;
|
|
}
|
|
using namespace KCal;
|
|
class KOAgendaItem;
|
|
|
|
struct MultiItemInfo
|
|
{
|
|
int mStartCellXLeft, mStartCellXRight;
|
|
int mStartCellYTop, mStartCellYBottom;
|
|
KOAgendaItem *mFirstMultiItem;
|
|
KOAgendaItem *mPrevMultiItem;
|
|
KOAgendaItem *mNextMultiItem;
|
|
KOAgendaItem *mLastMultiItem;
|
|
};
|
|
|
|
/*
|
|
The KOAgendaItem has to make sure that it receives all mouse events, which are
|
|
to be used for dragging and resizing. That means it has to be installed as
|
|
eventfiler for its children, if it has children, and it has to pass mouse
|
|
events from the cildren to itself. See eventFilter().
|
|
|
|
|
|
Some comments on the movement of multi-day items:
|
|
Basically, the agenda items are arranged in two implicit double-linked lists.
|
|
The mMultiItemInfo works like before to describe the currently viewed
|
|
multi-item.
|
|
When moving, new events might need to be added to the beginning or the end of
|
|
the multi-item sequence, or events might need to be hidden. I cannot just
|
|
delete this items, since I have to restore/show them if the move is reset
|
|
(i.e. if a drag started). So internally, I keep another doubly-linked list
|
|
which is longer than the one defined by mMultiItemInfo, but includes the
|
|
multi-item sequence, too.
|
|
|
|
The mStartMoveInfo stores the first and last item of the multi-item sequence
|
|
when the move started. The prev and next members of mStartMoveInfo are used
|
|
for that longer sequence including all (shown and hidden) items.
|
|
*/
|
|
class KOAgendaItem : public QWidget, public KOrg::CellItem
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
KOAgendaItem(Incidence *incidence, const QDate &qd, QWidget *parent, const char *name=0,
|
|
WFlags f=0 );
|
|
|
|
int cellXLeft() const { return mCellXLeft; }
|
|
int cellXRight() const { return mCellXRight; }
|
|
int cellYTop() const { return mCellYTop; }
|
|
int cellYBottom() const { return mCellYBottom; }
|
|
int cellHeight() const;
|
|
int cellWidth() const;
|
|
|
|
void setCellXY(int X, int YTop, int YBottom);
|
|
void setCellY(int YTop, int YBottom);
|
|
void setCellX(int XLeft, int XRight);
|
|
void setCellXRight(int xright);
|
|
|
|
/** Start movement */
|
|
void startMove();
|
|
/** Reset to original values */
|
|
void resetMove();
|
|
/** End the movement (i.e. clean up) */
|
|
void endMove();
|
|
|
|
void moveRelative(int dx,int dy);
|
|
void expandTop(int dy);
|
|
void expandBottom(int dy);
|
|
void expandLeft(int dx);
|
|
void expandRight(int dx);
|
|
|
|
bool isMultiItem();
|
|
KOAgendaItem *prevMoveItem() const { return (mStartMoveInfo)?(mStartMoveInfo->mPrevMultiItem):0; }
|
|
KOAgendaItem *nextMoveItem() const { return (mStartMoveInfo)?(mStartMoveInfo->mNextMultiItem):0; }
|
|
MultiItemInfo *moveInfo() const { return mStartMoveInfo; }
|
|
void setMultiItem(KOAgendaItem *first,KOAgendaItem *prev,
|
|
KOAgendaItem *next, KOAgendaItem *last);
|
|
KOAgendaItem *prependMoveItem(KOAgendaItem*);
|
|
KOAgendaItem *appendMoveItem(KOAgendaItem*);
|
|
KOAgendaItem *removeMoveItem(KOAgendaItem*);
|
|
KOAgendaItem *firstMultiItem() const { return (mMultiItemInfo)?(mMultiItemInfo->mFirstMultiItem):0; }
|
|
KOAgendaItem *prevMultiItem() const { return (mMultiItemInfo)?(mMultiItemInfo->mPrevMultiItem):0; }
|
|
KOAgendaItem *nextMultiItem() const { return (mMultiItemInfo)?(mMultiItemInfo->mNextMultiItem):0; }
|
|
KOAgendaItem *lastMultiItem() const { return (mMultiItemInfo)?(mMultiItemInfo->mLastMultiItem):0; }
|
|
|
|
bool dissociateFromMultiItem();
|
|
|
|
bool setIncidence( Incidence * );
|
|
Incidence *incidence() const { return mIncidence; }
|
|
QDate itemDate() { return mDate; }
|
|
|
|
/** Update the date of this item's occurrence (not in the event) */
|
|
void setItemDate( const QDate &qd );
|
|
|
|
void setText ( const QString & text ) { mLabelText = text; }
|
|
QString text () { return mLabelText; }
|
|
|
|
static QToolTipGroup *toolTipGroup();
|
|
|
|
QPtrList<KOAgendaItem> conflictItems();
|
|
void setConflictItems(QPtrList<KOAgendaItem>);
|
|
void addConflictItem(KOAgendaItem *ci);
|
|
|
|
QString label() const;
|
|
|
|
bool overlaps( KOrg::CellItem * ) const;
|
|
|
|
void setResourceColor( const QColor& color ) { mResourceColor = color; }
|
|
QColor resourceColor() {return mResourceColor;}
|
|
signals:
|
|
void removeAgendaItem( KOAgendaItem* );
|
|
void showAgendaItem( KOAgendaItem* );
|
|
|
|
public slots:
|
|
void updateIcons();
|
|
void select(bool=true);
|
|
void addAttendee( const QString & );
|
|
|
|
protected:
|
|
void dragEnterEvent(QDragEnterEvent *e);
|
|
void dropEvent(QDropEvent *e);
|
|
void paintEvent(QPaintEvent *e);
|
|
void paintFrame(QPainter *p, const QColor &color);
|
|
void paintEventIcon(QPainter *p, int &x, int ft);
|
|
void paintTodoIcon(QPainter *p, int &x, int ft);
|
|
void paintAlarmIcon(QPainter *p, int &x, int ft);
|
|
|
|
// paint all visible icons
|
|
void paintIcons(QPainter *p, int &x, int ft);
|
|
|
|
/** private movement functions. startMove needs to be called of only one of
|
|
* the multitems. it will then loop through the whole series using
|
|
* startMovePrivate. Same for resetMove and endMove */
|
|
void startMovePrivate();
|
|
void resetMovePrivate();
|
|
void endMovePrivate();
|
|
|
|
|
|
private:
|
|
int mCellXLeft, mCellXRight;
|
|
int mCellYTop, mCellYBottom;
|
|
int mSubCell; // subcell number of this item
|
|
int mSubCells; // Total number of subcells in cell of this item
|
|
|
|
Incidence *mIncidence; // corresponding event or todo
|
|
QDate mDate; //date this events occurs (for recurrence)
|
|
QString mLabelText;
|
|
bool mIconAlarm, mIconRecur, mIconReadonly;
|
|
bool mIconReply, mIconGroup, mIconGroupTentative;
|
|
bool mIconOrganizer;
|
|
|
|
// Multi item pointers
|
|
MultiItemInfo* mMultiItemInfo;
|
|
protected:
|
|
// Variables to remember start position
|
|
MultiItemInfo* mStartMoveInfo;
|
|
//Color of the resource
|
|
QColor mResourceColor;
|
|
private:
|
|
static QToolTipGroup *mToolTipGroup;
|
|
|
|
bool mSelected;
|
|
QPtrList<KOAgendaItem> mConflictItems;
|
|
|
|
static QPixmap *alarmPxmp;
|
|
static QPixmap *recurPxmp;
|
|
static QPixmap *readonlyPxmp;
|
|
static QPixmap *replyPxmp;
|
|
static QPixmap *groupPxmp;
|
|
static QPixmap *groupPxmpTentative;
|
|
static QPixmap *organizerPxmp;
|
|
};
|
|
|
|
#endif
|