diff options
Diffstat (limited to 'kdgantt/KDGanttViewSubwidgets.h')
-rw-r--r-- | kdgantt/KDGanttViewSubwidgets.h | 646 |
1 files changed, 646 insertions, 0 deletions
diff --git a/kdgantt/KDGanttViewSubwidgets.h b/kdgantt/KDGanttViewSubwidgets.h new file mode 100644 index 000000000..b8d9d57a7 --- /dev/null +++ b/kdgantt/KDGanttViewSubwidgets.h @@ -0,0 +1,646 @@ +/* -*- Mode: C++ -*- + $Id$ + KDGantt - a multi-platform charting engine +*/ + +/**************************************************************************** + ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved. + ** + ** This file is part of the KDGantt library. + ** + ** This file may be distributed and/or modified under the terms of the + ** GNU General Public License version 2 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. + ** + ** Licensees holding valid commercial KDGantt licenses may use this file in + ** accordance with the KDGantt Commercial License Agreement provided with + ** the Software. + ** + ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ** + ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for + ** information about KDGantt Commercial License Agreements. + ** + ** Contact info@klaralvdalens-datakonsult.se if any conditions of this + ** licensing are not clear to you. + ** + ** 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 KDGANTTVIEWSUBWIDGETS_H +#define KDGANTTVIEWSUBWIDGETS_H + + +#include <qwidget.h> +#include <qlistview.h> +#include <qsplitter.h> +#include <qevent.h> +#include <qvaluelist.h> +#include <qcanvas.h> +#include <qwhatsthis.h> +#include <qpopupmenu.h> +#include <qtooltip.h> +#include <qtimer.h> +#include <qgroupbox.h> +#include <qvgroupbox.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qbrush.h> +#include <qvbox.h> +#include <qdockwindow.h> +#include <qtimer.h> + +#include "KDGanttView.h" +#include "KDGanttViewTaskLink.h" +#include "KDGanttViewTaskLinkGroup.h" +#include "KDGanttViewSummaryItem.h" +#include "KDGanttSemiSizingControl.h" +#include "KDGanttViewItemDrag.h" + +#define Type_is_KDGanttGridItem 1 +#define Type_is_KDGanttViewItem 2 +#define Type_is_KDGanttTaskLink 3 + +class KDIntervalColorRectangle; +class KDCanvasWhatsThis; +class KDToolTip; +class KDCanvasRectangle; +class KDTimeHeaderToolTip; + +class KDTimeHeaderWidget : public QWidget +{ + Q_OBJECT + +public: + typedef KDGanttView::Scale Scale; + typedef KDGanttView::YearFormat YearFormat; + typedef KDGanttView::HourFormat HourFormat; + struct DateTimeColor { + QDateTime datetime; + QDateTime end; + QColor color; + Scale minScaleView; + Scale maxScaleView; + //KDCanvasLine* canvasLine; + KDCanvasRectangle* canvasRect; + }; + typedef QValueList<DateTimeColor> ColumnColorList; + typedef QValueList<KDIntervalColorRectangle *> IntervalColorList; + /* + enum Scale { Minute, Hour, Day, Week, Month, Auto }; + enum YearFormat { FourDigit, TwoDigit, TwoDigitApostrophe }; + enum HourFormat { Hour_24, Hour_12 }; + */ + + KDTimeHeaderWidget (QWidget* parent,KDGanttView* gant); + ~KDTimeHeaderWidget(); + + QString getToolTipText(QPoint p); + void zoomToFit(); + void zoom(double, bool absolute = true); + void zoomToSelection( QDateTime startTime, QDateTime endTime); + double zoomFactor(); + void setAutoScaleMinorTickCount( int count ); + int autoScaleMinorTickCount(); + void setHorizonStart( const QDateTime& start ); + QDateTime horizonStart() const; + void setHorizonEnd( const QDateTime& start ); + QDateTime horizonEnd() const; + + void setMaximumScale( Scale ); + KDTimeHeaderWidget::Scale maximumScale() const; + void setMinimumScale( Scale ); + KDTimeHeaderWidget::Scale minimumScale() const; + KDTimeHeaderWidget::Scale scale() const; + void setMajorScaleCount( int count ); + int majorScaleCount() const; + void setMinorScaleCount( int count ); + int minorScaleCount() const; + void setMinimumColumnWidth( int width ); + int minimumColumnWidth() const; + void setYearFormat( YearFormat format ); + KDTimeHeaderWidget::YearFormat yearFormat() const; + void setHourFormat( HourFormat format ); + KDTimeHeaderWidget::HourFormat hourFormat() const; + void setShowMajorTicks( bool ); + bool showMajorTicks() const; + void setShowMinorTicks( bool ); + void setScale( Scale unit); + bool showMinorTicks() const; + void setColumnBackgroundColor( const QDateTime& column, + const QColor& color, + Scale mini = KDGanttView::Minute , + Scale maxi = KDGanttView::Month); +#if 0 + // This API has been replaced with KDIntervalColorRectangle and addIntervalBackgroundColor + void setIntervalBackgroundColor( const QDateTime& start, + const QDateTime& end, + const QColor& color, + Scale mini = KDGanttView::Minute , + Scale maxi = KDGanttView::Month); + bool changeBackgroundInterval( const QDateTime& oldstart, + const QDateTime& oldend, + const QDateTime& newstart, + const QDateTime& newend ); + bool deleteBackgroundInterval( const QDateTime& start, + const QDateTime& end ); +#endif + void addIntervalBackgroundColor( KDIntervalColorRectangle* newItem ); + void clearBackgroundColor(); + QColor columnBackgroundColor( const QDateTime& column ) const; + void setWeekendBackgroundColor( const QColor& color ); + QColor weekendBackgroundColor() const; + void setWeekdayBackgroundColor( const QColor& color, int weekday ); + QColor weekdayBackgroundColor(int weekday) const; + void setWeekendDays( int start, int end ); + void weekendDays( int& start, int& end ) const; + void computeTicks(bool doNotComputeRealScale = false); + void paintEvent(QPaintEvent *); + int getCoordX(QDate); + int getCoordX(QDateTime); + QDateTime getDateTimeForIndex(int coordX, bool local = true ); + void setShowPopupMenu( bool show, bool showZoom, bool showScale,bool showTime, + bool showYear,bool showGrid, bool showPrint); + bool registerStartTime(); + bool registerEndTime(); + bool showPopupMenu() const; + ColumnColorList columnBackgroundColorList() const { + return ccList; + } + QColor weekdayColor[8]; + void repaintMe(int left, int wid, QPainter *p = 0); + + void centerDateTime( const QDateTime& center ); + +public slots: + void setSettings(int); + void checkWidth( int ); + void addTickRight( int num = 1 ); + void addTickLeft( int num = 1 ); + void preparePopupMenu(); +signals: + void sizeChanged( int ); + +private: + friend class KDTimeTableWidget; + friend class KDGanttViewItem; + friend class KDGanttView; + friend class KDGanttCanvasView; // calls computeIntervals + virtual void mousePressEvent ( QMouseEvent * e ); + virtual void mouseReleaseEvent ( QMouseEvent * e ); + virtual void mouseDoubleClickEvent ( QMouseEvent * e ); + virtual void mouseMoveEvent ( QMouseEvent * e ); + double secsFromTo( QDateTime begin, QDateTime end ); + void updateTimeTable(); + void computeIntervals( int height ); + bool getColumnColor(QColor& col,int coordLow, int coordHigh); + void moveTimeLineTo(int x); + //void mousePressEvent ( QMouseEvent * ) ; + void resizeEvent ( QResizeEvent * ) ; + QValueList<int> majorTicks; + QValueList<QString> minorText; + QValueList<QString> majorText; + QDateTime myHorizonStart, myHorizonEnd, myRealEnd,myRealStart; + QDateTime myCenterDateTime; + void saveCenterDateTime(); + Scale myScale,myRealScale,myMaxScale,myMinScale; + YearFormat myYearFormat; + HourFormat myHourFormat; + int myMinimumColumWidth; + bool flagShowMajorTicks, flagShowMinorTicks, flagShowPopupMenu; + bool flagShowZoom, flagShowScale ,flagShowTime ,flagShowYear; + bool flagShowGrid ,flagShowPrint; + bool flagStartTimeSet,flagEndTimeSet; + QColor myWeekendBackgroundColor; + int myWeekendDaysStart, myWeekendDaysEnd; + ColumnColorList ccList; + IntervalColorList icList; + int myMinorScaleCount,myMajorScaleCount; + int myRealMinorScaleCount,myRealMajorScaleCount; + bool flagDoNotRecomputeAfterChange,flagDoNotRepaintAfterChange; + QString getYear(QDate); + QString getHour(QTime); + QDateTime getEvenTimeDate(QDateTime ,Scale); + void computeRealScale(QDateTime start); + int myGridMinorWidth; + int myMajorGridHeight; + QPopupMenu * myPopupMenu, *scalePopupMenu, *timePopupMenu; + QPopupMenu * yearPopupMenu, *gridPopupMenu; + KDGanttView* myGanttView; + double myZoomFactor; + int myAutoScaleMinorTickcount; + bool flagZoomToFit; + int mySizeHint; + int myMinimumWidth; + int getTickTime(); + KDTimeHeaderToolTip* myToolTip; + bool mouseDown; + int beginMouseDown; + int endMouseDown; + bool autoComputeTimeLine; + QPixmap paintPix; +}; + +/* KDTimeTableWidget */ +class KDListView ; + +class KDTimeTableWidget : public QCanvas +{ + Q_OBJECT + +public: + KDTimeTableWidget (QWidget* parent,KDGanttView* my); + + void setBlockUpdating( bool block = true ); + bool blockUpdating(); + void inc_blockUpdating(); + void dec_blockUpdating(); + void setShowTaskLinks( bool show ); + bool showTaskLinks(); + QPtrList<KDGanttViewTaskLink>taskLinks(); + void clearTaskLinks(); + void updateMyContent(); + void removeItemFromTasklinks( KDGanttViewItem * ); + void setHorBackgroundLines( int count, QBrush brush ); + int horBackgroundLines( QBrush& brush ); + + void setNoInformationBrush( const QBrush& brush ); + QBrush noInformationBrush() const; + + int getCoordX( QDateTime dt ); + +signals: + void heightComputed( int ); + +public slots: + void expandItem(QListViewItem * ); + void collapseItem(QListViewItem * ); + void highlightItem(QListViewItem * ); + void resetWidth( int ); + void checkHeight( int ); +private: + friend class KDGanttViewTaskLink; + friend class KDTimeHeaderWidget; + friend class KDGanttView; + friend class KDGanttViewTaskItem; + KDGanttView* myGanttView; + + bool taskLinksVisible; + + QPtrList<KDGanttViewTaskLink> myTaskLinkList; + + QPtrList<KDCanvasLine> verGridList; + QPtrList<KDCanvasLine> horGridList; + QPtrList<KDCanvasRectangle> horDenseList; + QPtrList<KDCanvasRectangle> showNoInfoList; + int denseLineCount; + QBrush denseLineBrush, noInfoLineBrush; + QPtrList<KDCanvasRectangle> columnColorList; + + int computeHeight(); + void computeVerticalGrid(); + void computeHorizontalGrid(); + void computeDenseLines(); + void computeShowNoInformation(); + void computeTaskLinks(); + void computeMinorGrid(); + void computeMajorGrid(); + + void showMajorGrid(); + void showMinorGrid(); + void hideGrid(); + + QPen gridPen; + int maximumComputedGridHeight; + int minimumHeight; + int int_blockUpdating; + bool flag_blockUpdating; + int pendingHeight; + int pendingWidth; + +}; + +class KDLegendWidget : public KDGanttSemiSizingControl +{ + Q_OBJECT + +public: + KDLegendWidget ( QWidget* parent, KDGanttMinimizeSplitter* legendParent ); + void showMe(bool); + bool isShown(); + void addLegendItem( KDGanttViewItem::Shape shape, const QColor& shapeColor, const QString& text ); + void clearLegend(); + void setFont( QFont ); + void drawToPainter( QPainter *p ); + void setAsDockwindow( bool dockwin ); + bool asDockwindow(); + QDockWindow* dockwindow(); + QSize legendSize(); + QSize legendSizeHint(); + private: + QGroupBox * myLegend; + QLabel* myLabel; + QScrollView * scroll; + QDockWindow* dock; + KDGanttMinimizeSplitter* myLegendParent; +}; + +class KDGanttView; +class KDListView : public QListView +{ + Q_OBJECT + +public: + KDListView (QWidget* parent,KDGanttView* gv ); + KDGanttView* myGanttView; + void drawToPainter( QPainter *p, bool drawHeader=false ); + void setCalendarMode( bool mode ); + bool calendarMode() { return _calendarMode; }; + QString getWhatsThisText(QPoint p); + void setOpen ( QListViewItem * item, bool open ); + void dragEnterEvent ( QDragEnterEvent * ); + void dragMoveEvent ( QDragMoveEvent * ); + void dragLeaveEvent ( QDragLeaveEvent * ); + void dropEvent ( QDropEvent * ); + QDragObject * dragObject (); + void startDrag (); + void paintemptyarea ( QPainter * p, const QRect & rect ){ QListView::paintEmptyArea( p, rect );}; + +public: + class DrawableItem { + public: + DrawableItem(int level, int ypos, QListViewItem *item ) { y = ypos; l = level; i = item; }; + int y; + int l; + QListViewItem * i; + }; +protected: + void drawAllContents(QPainter * p, int cx, int cy, int cw, int ch); + int buildDrawables(QPtrList<KDListView::DrawableItem> &lst, int level, int ypos, QListViewItem *item, int ymin, int ymax) const; + +private slots: + void dragItem( QListViewItem * ); + private: + void resizeEvent ( QResizeEvent * ) ; + void contentsMouseDoubleClickEvent ( QMouseEvent * e ); + bool _calendarMode; + + + +}; + + +class KDCanvasText : public QCanvasText +{ +public: + KDCanvasText( KDTimeTableWidget* canvas, void* parentItem, int type ); + int myParentType; + void* myParentItem; +}; + + +class KDCanvasLine : public QCanvasLine +{ +public: + KDCanvasLine( KDTimeTableWidget* canvas, void* parentItem, int type ); + int myParentType; + void* myParentItem; +}; + + +class KDCanvasPolygonItem: public QCanvasPolygonalItem +{ +public: + KDCanvasPolygonItem( KDTimeTableWidget* canvas, void* parentItem, + int type ); + int myParentType; + void* myParentItem; +}; + + +class KDCanvasPolygon: public QCanvasPolygon +{ +public: + KDCanvasPolygon( KDTimeTableWidget* canvas, void* parentItem, int type ); + int myParentType; + void* myParentItem; +}; + + +class KDCanvasEllipse: public QCanvasEllipse +{ +public: + KDCanvasEllipse( KDTimeTableWidget* canvas, void* parentItem, int type ); + int myParentType; + void* myParentItem; +}; + + +class KDCanvasRectangle: public QCanvasRectangle +{ +public: + KDCanvasRectangle( KDTimeTableWidget* canvas, void* parentItem, int type ); + int myParentType; + void* myParentItem; +}; + + +// Interval-color-rectangle, such as the one used in the freebusy view for the current event +class KDIntervalColorRectangle: public KDCanvasRectangle +{ +public: + KDIntervalColorRectangle( KDGanttView* view ); + + void setDateTimes( const QDateTime& start, + const QDateTime& end ); + QDateTime start() const { return mStart; } + QDateTime end() const { return mEnd; } + + void setColor( const QColor& color ); + + enum HitTest { Start, Middle, End }; + HitTest hitTest( KDTimeHeaderWidget* timeHeader, const QPoint& pos ) const; + + void layout( KDTimeHeaderWidget* timeHeader, int height ); + + static const int RTTI = 0x0c58; + /*reimp*/ int rtti() const { return RTTI; } + +private: + QColor mColor; + QDateTime mStart; + QDateTime mEnd; +}; + +class KDCanvasToolTip; + +class KDGanttCanvasView : public QCanvasView +{ + Q_OBJECT + +public: + KDGanttCanvasView(KDGanttView* sender, QCanvas* canvas = 0, QWidget* parent = 0, const char* name = 0 ); + ~KDGanttCanvasView(); + QString getToolTipText(QPoint p); + QString getWhatsThisText(QPoint p); + void drawToPainter ( QPainter * p ); + void resetCutPaste( KDGanttViewItem* ); + void setShowPopupMenu( bool show ); + bool showPopupMenu(); + void cutItem ( KDGanttViewItem* ); + void insertItemAsRoot( KDGanttViewItem* ); + void insertItemAsChild( KDGanttViewItem* , KDGanttViewItem* ); + void insertItemAfter( KDGanttViewItem* , KDGanttViewItem* ); +protected: + friend class KDGanttView; + friend class KDListView; + virtual void contentsMousePressEvent ( QMouseEvent * ) ; + virtual void contentsMouseReleaseEvent ( QMouseEvent * ); + virtual void contentsMouseDoubleClickEvent ( QMouseEvent * ); + virtual void contentsMouseMoveEvent ( QMouseEvent * ) ; + virtual void viewportPaintEvent ( QPaintEvent * pe ); + void resizeEvent ( QResizeEvent * ) ; + void set_MouseTracking(bool on); + int getType(QCanvasItem*); + KDGanttViewItem* getItem(QCanvasItem*); + KDGanttViewTaskLink* getLink(QCanvasItem*); + int getItemArea(KDGanttViewItem *item, int x); + int getLinkType(int from, int to); + + KDGanttView* mySignalSender; + KDGanttViewItem* currentItem, *lastClickedItem, *cuttedItem; + QCanvasRectangle* movingItem; + KDGanttViewTaskItem* movingGVItem; + QPoint movingStart; + QDateTime movingStartDate; + enum MovingOperation { Moving, ResizingLeft, ResizingRight }; + MovingOperation movingOperation; + KDGanttViewTaskLink* currentLink; + KDCanvasWhatsThis* myWhatsThis; + QPopupMenu* onItem; + bool _showItemAddPopupMenu; + int myMyContentsHeight; + KDGanttViewItem *fromItem; + bool linkItemsEnabled; + QCanvasLine *linkLine; + int fromArea; + bool autoScrollEnabled; + bool mouseDown; + +signals: + void heightResized( int ); + void widthResized( int ); + +public slots: + void set_Mouse_Tracking(bool on); + void moveMyContent( int, int ); + void setMyContentsHeight( int ); + void updateHorScrollBar(); +private slots: + void cutItem(); + void pasteItem( int ); + void newRootItem( int ); + void newChildItem( int ); + void slotScrollTimer(); + void myUpdateScrollBars(); + +private: + MovingOperation gvItemHitTest( KDGanttViewItem *item, KDTimeHeaderWidget* timeHeader, const QPoint &pos ); +private: + KDCanvasToolTip* myToolTip; + QTimer *myScrollTimer; + QPoint mousePos; + QTimer scrollBarTimer; +}; + +class KDTimeHeaderToolTip :public QToolTip +{ + +public: + KDTimeHeaderToolTip( QWidget *wid, KDTimeHeaderWidget* header ) : QToolTip( wid ), _wid(wid),_header (header) { + +}; + +protected: + virtual void maybeTip( const QPoint& p) + { + static bool ishidden = true; + if (QToolTip::isGloballyEnabled () ) { + if (ishidden) { + tip( QRect( p.x(),p.y(),5,5), _header->getToolTipText(p)); + } + else + hide(); + ishidden = !ishidden; + } + } +private: + QWidget* _wid; + KDTimeHeaderWidget * _header; +}; + +class KDCanvasToolTip :public QToolTip +{ + +public: + KDCanvasToolTip( QWidget *wid, KDGanttCanvasView* canview ) : QToolTip( wid ), _wid(wid),_canview (canview) { + +}; + +protected: + virtual void maybeTip( const QPoint& p) + { + static bool ishidden = true; + if (QToolTip::isGloballyEnabled () ) { + if (ishidden) { + tip( QRect( p.x()-2,p.y()-2,5,5), _canview->getToolTipText(p)); + } + else + hide(); + ishidden = !ishidden; + } + } +private: + QWidget* _wid; + KDGanttCanvasView * _canview; +}; + +class KDCanvasWhatsThis :public QWhatsThis +{ +public: + KDCanvasWhatsThis( QWidget *wid, KDGanttCanvasView* canview ) : QWhatsThis( wid ), _wid(wid),_canview (canview) { }; + +protected: + virtual QString text( const QPoint& p) + { + return _canview->getWhatsThisText(p) ; + } +private: + QWidget* _wid; + KDGanttCanvasView * _canview; +}; + +class KDListViewWhatsThis :public QWhatsThis +{ +public: + KDListViewWhatsThis( QWidget *wid, KDListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; + +protected: + virtual QString text( const QPoint& p) + { + return _view->getWhatsThisText(p) ; + } +private: + QWidget* _wid; + KDListView * _view; +}; + + + +#endif |