/* -*- 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. ** **********************************************************************/ #include "KDGanttView.h" #include "KDGanttViewSubwidgets.h" #include "KDGanttMinimizeSplitter.h" #include "KDGanttViewItem.h" #include "KDGanttXMLTools.h" #include "itemAttributeDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifndef KDGANTT_MASTER_CVS #include "KDGanttView.moc" #endif #if defined KDAB_EVAL #include "../evaldialog/evaldialog.h" #endif /*! \class KDGanttView KDGanttView.h This class represents a Gantt view with the Gantt chart, the header, an optional listview and an optional legend. In order to set up a Gantt view, create an object of this class, and populate it with a number of \a KDGanttViewItem objects. If you experience problems with the tqrepainting of the content of the Gantt View after scrolling, call \a setRepaintMode(). */ /*! Constructs an empty KDGanttView. \param parent the widget parent \param name the internal debugging name */ KDGanttView::KDGanttView( TQWidget* parent, const char* name ) : KDGanttMinimizeSplitter( Qt::Vertical, parent, name ), myCanvasView(0), myTimeHeaderScroll(0), mFixedHorizon( false ) { #if defined KDAB_EVAL EvalDialog::checkEvalLicense( "KD Gantt" ); #endif myCurrentItem = 0; setMinimizeDirection ( KDGanttMinimizeSplitter::Down ); mySplitter = new KDGanttMinimizeSplitter( this ); mySplitter->setMinimizeDirection ( KDGanttMinimizeSplitter::Left ); leftWidget = new TQVBox( mySplitter ); rightWidget = new TQVBox( mySplitter ); myLegend = new KDLegendWidget( leftWidget, this ); spacerLeft = new TQHBox( leftWidget ); myListView = new KDListView(leftWidget, this); myListView->setVScrollBarMode (TQScrollView::AlwaysOff ); connect( myListView, TQT_SIGNAL( selectionChanged( TQListViewItem* ) ), this, TQT_SLOT( slotSelectionChanged( TQListViewItem* ) ) ); connect( myListView, TQT_SIGNAL( mouseButtonClicked ( int, TQListViewItem * , const TQPoint &, int ) ), this, TQT_SLOT( slotmouseButtonClicked ( int , TQListViewItem * , const TQPoint &, int ) ) ); connect( myListView, TQT_SIGNAL( contextMenuRequested ( TQListViewItem * , const TQPoint &, int ) ), this, TQT_SLOT( slotcontextMenuRequested ( TQListViewItem * , const TQPoint & , int ) ) ); connect( myListView, TQT_SIGNAL(currentChanged( TQListViewItem * ) ), this, TQT_SLOT(slotCurrentChanged ( TQListViewItem * ) ) ); connect( myListView, TQT_SIGNAL(itemRenamed ( TQListViewItem * , int , const TQString & ) ), this, TQT_SLOT(slotItemRenamed ( TQListViewItem *, int , const TQString & ) ) ); connect( myListView, TQT_SIGNAL(mouseButtonPressed( int, TQListViewItem * , const TQPoint &, int ) ), this, TQT_SLOT(slotMouseButtonPressed ( int , TQListViewItem * , const TQPoint & , int ) ) ); //connect( myListView, TQT_SIGNAL( ), this, TQT_SLOT( ) ); myTimeTable = new KDTimeTableWidget (rightWidget,this); spacerRight = new TQWidget( rightWidget ); myTimeHeaderContainer = new TQHBox( rightWidget ); myTimeHeaderContainer->setFrameStyle( TQFrame::NoFrame ); myTimeHeaderContainer->setMargin( 0 ); myTimeHeaderScroll = new TQScrollView ( myTimeHeaderContainer ); myTimeHeaderScroll->setHScrollBarMode( TQScrollView::AlwaysOff ); myTimeHeaderScroll->setVScrollBarMode( TQScrollView::AlwaysOff ); timeHeaderSpacerWidget = new TQWidget( myTimeHeaderContainer ); /* myTimeHeaderScroll = new TQScrollView ( rightWidget ); myTimeHeaderScroll->setHScrollBarMode( TQScrollView::AlwaysOff ); myTimeHeaderScroll->setVScrollBarMode( TQScrollView::AlwaysOn ); */ //myTimeHeader = new KDTimeHeaderWidget (rightWidget,this); myTimeHeader = new KDTimeHeaderWidget (myTimeHeaderScroll->viewport(),this); myTimeHeaderScroll->addChild( myTimeHeader ); myTimeHeaderScroll->viewport()->setBackgroundColor( myTimeHeader->backgroundColor() ); timeHeaderSpacerWidget->setBackgroundColor( myTimeHeader->backgroundColor() ); myCanvasView = new KDGanttCanvasView (this,myTimeTable,rightWidget); myTimeHeaderScroll->setFrameStyle( TQFrame::NoFrame ); // myCanvasView->setFrameStyle( TQFrame::NoFrame ); myCanvasView->setMargin( 0 ); // myTimeHeaderScroll->setMargin( 0 );//myCanvasView->frameWidth() ); setFrameStyle(myListView->frameStyle()); setLineWidth( 2 ); myListView->setFrameStyle( TQFrame::NoFrame ); myListView->setMargin( 0 ); TQObject::connect(myListView, TQT_SIGNAL ( expanded ( TQListViewItem * ) ) , myTimeTable , TQT_SLOT( expandItem(TQListViewItem * ))) ; TQObject::connect(myListView, TQT_SIGNAL (collapsed ( TQListViewItem * ) ) , myTimeTable , TQT_SLOT(collapseItem(TQListViewItem * ))) ; timeHeaderSpacerWidget->setFixedWidth(myCanvasView->verticalScrollBar()->width() ); listViewIsVisible = true; chartIsEditable = true; editorIsEnabled = true; _displaySubitemsAsGroup = false; initDefaults(); _showHeader = false; myTextColor = Qt::black; myLegendItems = new TQPtrList; //TQObject::connect( this, TQT_SIGNAL (itemDoubleClicked( KDGanttViewItem* ) ) , this, TQT_SLOT( editItem( KDGanttViewItem* ))) ; myItemAttributeDialog = new itemAttributeDialog(); setRepaintMode( KDGanttView::Medium ); //setRepaintMode( KDGanttView::Always ); setShowLegendButton( true ); setHeaderVisible( false ); // now connecting the widgets connect(myCanvasView->horizontalScrollBar(), TQT_SIGNAL ( valueChanged ( int )) ,myTimeHeaderScroll->horizontalScrollBar(), TQT_SLOT( setValue ( int))) ; connect(myCanvasView, TQT_SIGNAL ( heightResized( int )) ,myTimeTable, TQT_SLOT( checkHeight ( int))) ; connect(myCanvasView, TQT_SIGNAL ( widthResized( int )) ,myTimeHeader, TQT_SLOT( checkWidth ( int))) ; TQObject::connect(myCanvasView->verticalScrollBar(), TQT_SIGNAL ( valueChanged ( int ) ) ,myListView->verticalScrollBar(), TQT_SLOT( setValue ( int ))) ; connect(myTimeHeader, TQT_SIGNAL ( sizeChanged( int ) ) ,this, TQT_SLOT(slotHeaderSizeChanged() )) ; connect(myTimeHeader, TQT_SIGNAL ( sizeChanged( int ) ) ,myTimeTable, TQT_SLOT(resetWidth( int ) )) ; connect(myListView, TQT_SIGNAL ( contentsMoving ( int, int ) ) ,myCanvasView, TQT_SLOT( moveMyContent( int, int ))) ; connect(myTimeTable, TQT_SIGNAL ( heightComputed ( int ) ) ,myCanvasView, TQT_SLOT( setMyContentsHeight( int ))) ; // the next three are for adding new ticks at left/right connect( myCanvasView->horizontalScrollBar(), TQT_SIGNAL (prevLine () ) ,this, TQT_SLOT(addTickLeft())); connect( myCanvasView->horizontalScrollBar(), TQT_SIGNAL (nextLine () ) ,this, TQT_SLOT(addTickRight())); connect( myCanvasView->horizontalScrollBar(), TQT_SIGNAL (valueChanged ( int ) ) ,this, TQT_SLOT( enableAdding( int ))); // now initing fCenterTimeLineAfterShow = false; fDragEnabled = false; fDropEnabled = false; closingBlocked = false; myTimeHeader->computeTicks(); centerTimelineAfterShow( TQDateTime::tqcurrentDateTime () ); setDisplayEmptyTasksAsLine( false ); TQValueList list; list.append(240); list.append(530); mySplitter->setSizes( list ); myTimeTable->setBlockUpdating();// block updating until this->show() is called } KDGanttView::~KDGanttView() { setUpdateEnabled(false); // delete cut item, if there is any myCanvasView->resetCutPaste( 0 ); myTimeTable->clearTaskLinks(); } /*! Enables or disables updating of the content of the Gantt view. To avoid flickering in the Gantt view while inserting large amounts of Gantt items, you should call bool upd = KDGanttView::getUpdateEnabled(); KDGanttView::settUpdateEnabled( false ); ... insert items here ... KDGanttView::settUpdateEnabled( upd ); With this code, you avoid unwanted side effects with other parts in your code, where you disable (and re-enable) the update. When calling setUpdateEnabled( true ), all the content is recomputed, resized, and updated. Before calling show() for the first time, updating is disabled. When calling show(), updating is automatically enabled. \param enable if true, the content of the Gantt view is updated after every insertion of a new item. \sa getUpdateEnabled() */ void KDGanttView::setUpdateEnabled( bool enable ) { myTimeTable->setBlockUpdating( !enable ); if ( enable ) { myTimeTable->updateMyContent(); myCanvasView->setMyContentsHeight( 0 ); } } /*! Returns whether updating is enabled or not. \return true, if updating is enabled \sa setUpdateEnabled() */ bool KDGanttView::getUpdateEnabled() const { return !myTimeTable->blockUpdating(); } /*! Sets the maximum width of the Gantt view part widget in pixels. The largest allowed width is 32767. \param w the maximum width */ void KDGanttView::setGanttMaximumWidth( int w ) { myTimeHeader->setMaximumWidth ( w ); } /*! Returns the maximum width of the Gantt view part widget in pixels. The default maximum width is 32767 pixels. \return the maximum width of the Gantt view part widget in pixels. */ int KDGanttView::ganttMaximumWidth() const { return myTimeHeader->maximumWidth(); } /*! Updates the content of the GanttView and shows it. Automatically sets setUpdateEnabled( true ). \sa setUpdateEnabled() */ void KDGanttView::show() { myTimeTable->setBlockUpdating( false ); if (myCanvasView->horizontalScrollBar()->value() > 0 ) myCanvasView->horizontalScrollBar()->setValue(myCanvasView->horizontalScrollBar()->value()-1 ); else myCanvasView->horizontalScrollBar()->setValue(1 ); myTimeTable->updateMyContent(); TQWidget::show(); myCanvasView->setMyContentsHeight( 0 ); if ( fCenterTimeLineAfterShow ) { fCenterTimeLineAfterShow = false; centerTimeline (dtCenterTimeLineAfterShow); } } /*! Closes the widget. The closing is rejected, if a tqrepainting is currently being done. \param alsoDelete if true, the widget is deleted \return true, if the widget was closed */ bool KDGanttView::close ( bool alsoDelete ) { //qDebug("close "); if ( closingBlocked ) return false; return TQWidget::close ( alsoDelete ); } /*! Returns a useful size for the view. Returned width: tqsizeHint().width() of the list view + width of TimeTable Returned height: height() of TimeHeader + height() of TimeTable + height() of Legend (if shown) */ TQSize KDGanttView::tqsizeHint() const { bool block = myTimeTable->blockUpdating(); myTimeTable->setBlockUpdating( false ); myTimeTable->updateMyContent(); /* The below causes recursive calls to various size updating methods, which * cause TQCanvas to hide and show items like mad, which is very slow. If * there is a legitimate gui updating issue here somewhere, it will need * to be solved differently. */ //tqApp->processEvents(); int hintHeight = myTimeHeader->height(); int legendHeight = 0; if ( showLegendButton() ) legendHeight = myLegend->height(); int listViewHeaderHeight = 0; if ( headerVisible() ) listViewHeaderHeight = myListView->header()->height(); if ( hintHeight < legendHeight+listViewHeaderHeight ) hintHeight = legendHeight + listViewHeaderHeight; hintHeight += myListView->horizontalScrollBar()->height(); if ( myLegend->isShown() ) hintHeight += myLegend->legendSizeHint().height() +10; hintHeight += myTimeTable->minimumHeight+myListView->frameWidth()*2+2; int hintWid = myListView->tqsizeHint().width(); //hintWid += myTimeHeader->mySizeHint+myCanvasView->verticalScrollBar()->width(); hintWid += myCanvasView->tqsizeHint().width(); // add 10 for the splitter-bars // qDebug("sizehint %d %d ",hintWid+10, hintHeight ); myTimeTable->setBlockUpdating( block ); return TQSize( hintWid+10, hintHeight ); } /*! Specifies whether the legend button should be visible. By default, it is visible. \param show true to show the legend button, false to hide it \sa showLegendButton() */ void KDGanttView::setShowLegendButton( bool show ) { _showLegendButton = show; if ( show ) myLegend->show(); else myLegend->hide(); slotHeaderSizeChanged(); } /*! Returns whether the legend button is visible. \return whether the legend button is visible \sa setShowLegendButton() */ bool KDGanttView::showLegendButton() const { return _showLegendButton; } /*! Specifies whether the listview header should be visible. By default, it is not visible. \param visible true to make the header visible, false to make it invisible */ void KDGanttView::setHeaderVisible( bool visible ) { if( visible ) myListView->header()->show(); else myListView->header()->hide(); _showHeader = visible; slotHeaderSizeChanged(); } /*! Returns whether the listview header is visible. \return whether the header is visible */ bool KDGanttView::headerVisible() const { return _showHeader; } /*! Returns the corresponding date and time of the coordinate X in the Gantt view. \param coordX the coordinate to search for \param global true if coordX is a global position, false otherwise \return the date and time at coordinate X in the Gantt view. */ TQDateTime KDGanttView::getDateTimeForCoordX(int coordX, bool global ) const { // default for myTimeHeader->getDateTimeForIndex() is local return myTimeHeader->getDateTimeForIndex(coordX, !global ); } /*! Implements a casted pass-through of the selectionChanged() signal. */ void KDGanttView::slotSelectionChanged( TQListViewItem* item ) { KDGanttViewItem* gItem = static_cast( item ); Q_ASSERT( gItem ); emit lvSelectionChanged( gItem ); } /* Implements a casted pass-through of the mouseButtonClicked() signal. Signals itemLeftClicked() , itemMidClicked() are emitted as well. */ void KDGanttView::slotmouseButtonClicked ( int button, TQListViewItem * item, const TQPoint & pos, int c ) { KDGanttViewItem* gItem = static_cast( item ); emit lvMouseButtonClicked ( button , gItem, pos, c ); if (gItem == 0 && myCurrentItem != 0 ) { myCurrentItem = 0; emit lvCurrentChanged( gItem ); } if (gItem != 0 && myCurrentItem == 0 ) { myCurrentItem = gItem; emit lvCurrentChanged( gItem ); } // removed - makes no sense! //emit mouseButtonClicked ( button , gItem, pos, c ); { switch ( button ) { case LeftButton: emit lvItemLeftClicked( gItem ); emit itemLeftClicked( gItem ); break; case MidButton: emit lvItemMidClicked( gItem ); emit itemMidClicked( gItem ); break; } } } /* Implements a casted pass-through of the contextMenuRequested() signal. The signal itemRightClicked() is emitted as well; the position is the global position. */ void KDGanttView::slotcontextMenuRequested ( TQListViewItem * item, const TQPoint & pos, int col ) { KDGanttViewItem* gItem = static_cast( item ); emit lvContextMenuRequested ( gItem, pos, col ); emit lvItemRightClicked( gItem ); emit itemRightClicked( gItem ); } void KDGanttView::emptySpaceDoubleClicked( TQMouseEvent * e ) { emit dateTimeDoubleClicked( getDateTimeForCoordX( e->x(), false ) ); } /* Implements a casted pass-through of the currentChanged() signal. */ void KDGanttView::slotCurrentChanged ( TQListViewItem * item ) { KDGanttViewItem* gItem = static_cast( item ); myCurrentItem = gItem; emit lvCurrentChanged( gItem ); } /* Implements a casted pass-through of the itemRenamed() signal. */ void KDGanttView::slotItemRenamed ( TQListViewItem * item , int col, const TQString & text ) { KDGanttViewItem* gItem = static_cast( item ); emit lvItemRenamed( gItem, col, text ); } /* Implements a casted pass-through of the mouseButtonPressed() signal. */ void KDGanttView::slotMouseButtonPressed ( int button, TQListViewItem * item, const TQPoint & pos, int c ) { KDGanttViewItem* gItem = static_cast( item ); emit lvMouseButtonPressed( button, gItem, pos, c ); } /*! Specifies whether the content should be tqrepainted after scrolling or not. \param mode If No, there is no tqrepainting after scrolling. This is the fastest mode. If Medium, there is extra tqrepainting after releasing the scrollbar. This provides fast scrolling with updated content after scrolling. Recommended, when tqrepaint problems occur. This is the default value after startup. If Always, there is an extra update after every move of the scrollbar. This entails slow scrolling with updated content at all time. */ void KDGanttView::setRepaintMode( RepaintMode mode ) { TQScrollBar *cvh, *cvv; cvh = myCanvasView->horizontalScrollBar(); cvv = myCanvasView->verticalScrollBar(); // first disconnect cvh->disconnect( this ); cvv->disconnect( this ); switch ( mode ) { case No: break; case Medium: connect( cvv, TQT_SIGNAL (sliderReleased () ) ,this, TQT_SLOT(forceRepaint())); connect( cvh, TQT_SIGNAL (sliderReleased () ) ,this, TQT_SLOT(forceRepaint())); connect( cvv, TQT_SIGNAL (nextLine () ) ,this, TQT_SLOT(forceRepaint())); connect( cvh, TQT_SIGNAL (nextLine () ) ,this, TQT_SLOT(forceRepaint())); connect( cvv, TQT_SIGNAL (prevLine () ) ,this, TQT_SLOT(forceRepaint())); connect( cvh, TQT_SIGNAL (prevLine () ) ,this, TQT_SLOT(forceRepaint())); break; case Always: connect( cvv, TQT_SIGNAL (valueChanged ( int ) ) ,this, TQT_SLOT(forceRepaint( int ))); connect( cvh, TQT_SIGNAL (valueChanged ( int ) ) ,this, TQT_SLOT(forceRepaint( int ))); connect( cvv, TQT_SIGNAL (sliderReleased () ) ,this, TQT_SLOT(forceRepaint())); connect( cvh, TQT_SIGNAL (sliderReleased () ) ,this, TQT_SLOT(forceRepaint())); break; } } void KDGanttView::forceRepaint( int ) { if ( myTimeTable->blockUpdating() ) return; // qDebug("forceRepaint( int ) "); myTimeTable->setAllChanged(); myTimeTable->update(); } void KDGanttView::slotHeaderSizeChanged() { int legendHeight = 0; if ( showLegendButton() ) legendHeight = 24; int listViewHeaderHeight = 0; if ( headerVisible() ) listViewHeaderHeight = myListView->header()->height(); int timeHeaderHeight = myTimeHeader->height()+myTimeHeaderScroll->frameWidth()*2;; int diffY = timeHeaderHeight-legendHeight-listViewHeaderHeight; if ( diffY < 0 ) { spacerLeft->setFixedHeight( 0 ); spacerRight->setFixedHeight(-diffY); } else { spacerRight->setFixedHeight( 0 ); spacerLeft->setFixedHeight( diffY ); } myLegend->setFixedHeight( legendHeight ); myTimeHeaderContainer->setFixedHeight( timeHeaderHeight ); } /*! Specifies whether the legend should be shown as a dock window or not. \param show if true, show legend as a dock window \sa showLegend(), legendIsDockwindow(), legendDockwindow() */void KDGanttView::setLegendIsDockwindow( bool show ) { bool isdock = myLegend->asDockwindow(); if ( show != isdock ) { myLegend->setAsDockwindow(show); // legend is cleared - reinit legend with list legendItem* li; for ( li = myLegendItems->first(); li; li = myLegendItems->next() ) { myLegend->addLegendItem(li->tqshape, li->color, li->text ); } } } /*! Returns whether the legend is shown as a dock window \return true if the legend is shown as a dock window \sa setShowLegend(), setLegendIsDockwindow(), legendDockwindow() */bool KDGanttView::legendIsDockwindow() const { return myLegend->asDockwindow(); } /*! Returns the pointer to the legend dock window. DO NOT DELETE THIS POINTER! If the legend is not a dock window, 0 is returned To set the legend as a dock window, call KDGanttView::setLegendIsDockwindow( true ); \return the pointer to the legend dock window 0 is returned, if the legend is no dock window DO NOT DELETE THIS POINTER! \sa setShowLegend(), setLegendIsDockwindow(),legendIsDockwindow() */ TQDockWindow* KDGanttView::legendDockwindow() const { return myLegend->dockwindow(); } /*! Specifies whether the legend should be shown or not. Besides setting this programmatically, the user can also show/hide the legend by using the button provided for this purpose. \param show force legend to be shown \sa showLegend() */ void KDGanttView::setShowLegend( bool show ) { myLegend->showMe(show); } /*! Returns whether the legend is currently shown. The visibility of the legend can be changed both by \a setShowLegend(), and interactively by the user. \return true if the legend is currently visible \sa setShowLegend() */ bool KDGanttView::showLegend() const { return myLegend->isShown(); } /*! Specifies whether the listview of the Gantt view should be shown or not. \param show pass true in order to show the listview and false in order to hide it. \sa showListView() */ void KDGanttView::setShowListView( bool show ) { if(listViewIsVisible == show) return; listViewIsVisible = show; if (listViewIsVisible) myListView->tqparentWidget()->show(); else myListView->tqparentWidget()->hide(); } /*! Returns whether the listview of the Gantt view is shown or not. \return true if the listview is shown \sa setShowListView() */ bool KDGanttView::showListView() const { return listViewIsVisible; } /*! Specifies whether it should be possible to edit the appearance of a Gantt item visually in a dialog by double-clicking the item. \param enable pass true in order to enable the visual editor and false in order to turn it off \sa editorEnabled() */ void KDGanttView::setEditorEnabled( bool enable ) { editorIsEnabled = enable; } /*! Returns whether it is possible to edit the appearance of a Gantt item visually in a dialog by double-clicking the item. \return true if visual editing is enabled, false otherwise \sa setEditorEnabled() */ bool KDGanttView::editorEnabled() const { return editorIsEnabled; } /*! Specifies whether the Gantt chart is user-editable. \param editable pass true in order to get a user-editable Gantt chart, pass false in order to get a read-only chart \sa editable() */ void KDGanttView::setEditable( bool editable ) { chartIsEditable = editable; } /*! Returns whether the Gantt chart is user-editable \return true if the Gantt chart is user-editable \sa setEditable() */ bool KDGanttView::editable() const { return chartIsEditable; } /*! Saves the state of the Gantt view in an IO device in XML format. The saved data can be reloaded with \a loadProject(). \param device a pointer to the IO device in which to store the Gantt view state. \return true if the data could be written, false if an error occurred \sa loadProject() */ bool KDGanttView::saveProject( TQIODevice* device ) { Q_ASSERT( device ); TQDomDocument doc = saveXML(); if( device->isOpen() ) device->close(); if( device->open( IO_WriteOnly ) ) { TQTextStream ts( device ); ts << doc.toString(); return true; } else return false; } /*! Loads a previously saved state of the Gantt view. All current settings and items are discarded before loading the data. \param device a pointer to the IO device from which to load the Gantt view state. \return true if the file could be read, false if an error occurred \sa saveProject() */ bool KDGanttView::loadProject( TQIODevice* device ) { Q_ASSERT( device ); if( device->isOpen() ) device->close(); if( device->open( IO_ReadOnly ) ) { TQDomDocument doc( "GanttView" ); TQString err; int errline, errcol; if ( !doc.setContent( device, &err, &errline, &errcol ) ) { qDebug("KDGantt::Error parsing XML data at line %d. Message is:", errline ); qDebug("%s ", err.latin1()); device->close(); return false; } device->close(); return loadXML( doc ); } else return false; } /*! Sends a Gantt view to a printer. The printer should already be set up for printing (by calling TQPrinter::setup()). If the printer is not set up, TQPrinter::setup() is called before printing You can specify, whether the ListView, TimeLine, or Legend will be printed. All combinations of these three widgets are allowed. \param printer a pointer to the printer to print on. If printer is 0, the method creates a temporary printer and discards it when it is done printing. \param printListView if true, the list view is printed \param printTimeLine if true, the time line is printed \param printLegend if true, the legend is printed \sa drawContents() */ void KDGanttView::print( TQPrinter* printer , bool printListView, bool printTimeLine, bool printLegend ) { bool deletePrinter = false; if (! printer ) { printer = new TQPrinter(); deletePrinter = true; if ( !printer->setup()) { delete printer; return; } } // now we have a printer to print on TQPainter p( printer ); // get the paper metrics TQPaintDeviceMetrics m = TQPaintDeviceMetrics ( printer ); float dx, dy; // get the size of the desired output for scaling. // here we want to print all: ListView, TimeLine, and Legend // for this purpose, we call drawContents() with a 0 pointer as painter TQSize size = drawContents( 0, printListView, printTimeLine, printLegend ); // at the top, we want to print current time/date TQString date = "Printing Time: " + TQDateTime::tqcurrentDateTime().toString(); int hei = p.boundingRect(0,0, 5, 5, Qt::AlignLeft, date ).height(); p.drawText( 0, 0, date ); // compute the scale dx = (float) m.width() / (float)size.width(); dy = (float)(m.height() - ( 2 * hei )) / (float)size.height(); float scale; // scale to fit the width or height of the paper if ( dx < dy ) scale = dx; else scale = dy; // set the scale p.scale( scale, scale ); // now printing with y offset: 2 hei p.translate( 0, 2*hei ); drawContents( &p, printListView, printTimeLine, printLegend ); // the drawContents() has the side effect, that the painter translation is // after drawContents() set to the bottom of the painted stuff // for instance a // p.drawText(0, 0, "printend"); // would be painted directly below the paintout of drawContents() p.end(); if ( deletePrinter ) delete printer; } /*! Paints a Gantt view on a TQPainter. You can specify, whether the list view, the time line, or the legend is painted. All combinations of these three widgets are allowed. Returns the size of the painted area. Paints the list view in the top-left corner, the time line to the right of the list view, and the legend below the list view. If called with \a p = 0, nothing is painted and only the size of the painted area is computed. This is useful for determining only the painted area and setting the scale of the painter, before calling this method with a painter. In order to get the output fitted to your paper and your printer, call first TQSize size = drawContents( 0, printListView, printTimeLine, printLegend ); //then compute the scale dx = paper.width() / size.width(); dy = paper.height() / size.height(); //then make float scale to fit the width or height of the paper if ( dx < dy ) scale = dx; else scale = dy; // then set the scale p.scale( scale, scale ); // and now call drawContents with painter p drawContents( &p, printListView, printTimeLine, printLegend ); For a detailed example, please see the commented source code in KDGanttView::print(...) \param p a pointer to the painter to paint on. If p is 0, nothing is painted and only the size of the painted area is computed \param drawListView if true, the list view is painted \param drawTimeLine if true, the time line is painted \param drawLegend if true, the legend is painted \return the size of the painted area \sa print() */ TQSize KDGanttView::drawContents( TQPainter* p, bool drawListView , bool drawTimeLine, bool drawLegend ) { TQSize size; int lvX, lvY, thX, thY, tlX, tlY, lwX, lwY, allX, allY; lvX = myListView->contentsWidth(); lvY = myCanvasView->canvas()->height() + 20; thX = myTimeHeader->width(); thY = myTimeHeader->height(); tlX = myCanvasView->canvas()->width(); tlY = lvY; lwX = myLegend->legendSize().width(); lwY = myLegend->legendSize().height(); allX = 0; allY = 0; if ( drawListView ) { allX += lvX; allY += tlY; } if ( drawTimeLine ) { allX += thX; allY += thY; } if ( drawLegend ) { allY += lwY; if ( allX < lwX ) allX = lwX ; } size = TQSize( allX, allY ); int temp = 0; if ( p ) { if ( drawListView ) { if ( drawTimeLine ) temp = thY; p->translate( 0, temp ); //HACK: Only draw list headers if we draw timeline, else // there is no room for it. This will most probably be changed // with qt4 anyway, so I think we can live with it atm. myListView->drawToPainter( p, drawTimeLine ); p->translate( lvX, -temp); } if ( drawTimeLine ) { p->translate( myCanvasView->frameWidth(), 0); myTimeHeader->tqrepaintMe( 0, myTimeHeader->width(), p ); p->translate( -myCanvasView->frameWidth(), thY); myCanvasView->drawToPainter( p ); if ( drawListView ) p->translate( -lvX, tlY); else p->translate( 0, tlY); } else { if ( drawListView ) p->translate( -lvX, 0 ); } if ( drawLegend ) { myLegend->drawToPainter( p ); p->translate( 0, lwY ); } } return size; } /*! Zooms into the Gantt chart. Values less than 1 mean zooming in, values greater than 1 mean zooming out. A zooming factor of exactly 1.0 means original size. \param factor the zoom factor \param absolute if true, factor is interpreted absolutely, if false, factor is interpreted relatively to the current zoom factor \sa zoomToFit() \sa zoomToSelection() \sa zoomFactor() */ void KDGanttView::setZoomFactor( double factor, bool absolute ) { myTimeHeader->zoom(factor,absolute); } /*! Returns the current zoom factor. \return the current zoom factor \sa zoomToFit(), zoomToSelection(), setZoomFactor() */ double KDGanttView::zoomFactor() const { return myTimeHeader->zoomFactor(); } /*! Zooms such that the Gantt chart is less than the available space of the widget. \sa setZoomFactor() \sa zoomFactor() \sa zoomToSelection() */ void KDGanttView::zoomToFit() { myTimeHeader->zoomToFit(); } /*! Zooms so that at least the selected time period is visible after the zoom. \param start the new font of the widget \param end the new font of the widget \sa setZoomFactor() \sa zoomFactor() \sa zoomToFit() */ void KDGanttView::zoomToSelection( const TQDateTime& start, const TQDateTime& end ) { myTimeHeader->zoomToSelection( start, end); } /*! Makes sure that the specified Gantt item is visible without scrolling. \sa center(), centerTimelineAfterShow() */ void KDGanttView::ensureVisible( KDGanttViewItem* item ) { myListView->ensureItemVisible (item); } /*! Makes sure that the specified TQDateTime is in the center of the visible Gantt chart (if possible). If you want to center the timeline when the KDGanttView is hidden, calling centerTimelineAfterShow() is the better alternative. \sa center(), centerTimelineAfterShow() */ void KDGanttView::centerTimeline( const TQDateTime& center ) { myTimeHeader->centerDateTime( center ); } /*! Makes sure that the specified TQDateTime is in the center of the visible Gantt chart (if possible). If the KDGanttView is currently hidden, this method resets the center once again after the next show() call. Use this method if you want to center the timeline when the KDGanttView is hidden. After calling KDGanttView::show(), there may be computations of the sizes of the widgets and subwidgets and of the automatically computed start datetime. This method ensures that the center of the timeline is to be properly reset after show(). \sa center(), centerTimeline() */ void KDGanttView::centerTimelineAfterShow( const TQDateTime& center ) { myTimeHeader->centerDateTime( center ); if ( ! isVisible() ) { dtCenterTimeLineAfterShow = center; fCenterTimeLineAfterShow = true; } } /*! Sets the timeline to the horizon start. */ void KDGanttView::setTimelineToStart() { myCanvasView->horizontalScrollBar()->setValue( 0 ); } /*! Sets the timeline to the horizon end. */ void KDGanttView::setTimelineToEnd() { myCanvasView->horizontalScrollBar()->setValue(myCanvasView->horizontalScrollBar()->maxValue()); } /*! Add \a num minor ticks of the current scale of the timeline to the start of the timeline. The timeline is not set automatically at the start. Call \a setTimelineToStart() to ensure that the timeline is at the start after calling this method. \param num the number of minor ticks which should be added \sa addTicksRight(),setTimelineToStart(), setTimelineToEnd() */ void KDGanttView::addTicksLeft( int num ) { myTimeHeader->addTickLeft( num ); } /*! Add \a num minor ticks of the current scale of the timeline to the end of the timeline. The timeline is not set automatically at the end. Call \a setTimelineToEnd() to ensure that the timeline is at the end after calling this method. \param num the number of minor ticks which should be added \sa addTicksLeft(),setTimelineToStart(), setTimelineToEnd() */ void KDGanttView::addTicksRight( int num ) { myTimeHeader->addTickRight( num ); } /*! Makes sure that the specified Gantt item is in the center of the visible Gantt chart (if possible). */ void KDGanttView::center( KDGanttViewItem* item ) { ensureVisible(item); int x = myListView->contentsWidth()/2; int y = myListView->itemPos (item ); myListView->center(x,y); } /*! Specifies whether task links should be shown. \param show true for showing task links, false for not showing them \sa showTaskLinks(), KDGanttViewTaskLink */ void KDGanttView::setShowTaskLinks( bool show ) { myTimeTable->setShowTaskLinks(show); } /*! Returns whether task links should be shown. \return true if task links are shown, false otherwise \sa setShowTaskLinks(), KDGanttViewTaskLink */ bool KDGanttView::showTaskLinks() const { return myTimeTable->showTaskLinks(); } /*! Sets the font in the left list view widget and in the right time header widget. The settings of the fonts in the time table widget are not effected. \param font the new font of the widget */ void KDGanttView::setFont(const TQFont& font) { myListView->setFont(font); myListView->tqrepaint(); myTimeHeader->setFont(font); myLegend->setFont( font ); TQWidget::setFont( font ); setScale(scale()); } /*! Specifies whether the configure popup menu should be shown on right click on the time header widget. This menu lets the user quickly change the zoom factor, the scale mode (minute, hour, day, week, month, auto) , the time format, the year format, the grid format, and printing. The default setting is not to show the popup menu. This functionality must be enabled explicitly by the application developer. You can disable each submenu of the popmenu. \param show true in order to show the popup menu, false in order not to. The default is true. \param showZoom show the zoom submenu, default: true \param showScale show the scale submenu, default: true \param showTime show the time format submenu, default: true \param showYear show the year format submenu, default: true \param showGrid show the grid submenu, default: true \param showPrint show the print submenu, default: false */ void KDGanttView::setShowHeaderPopupMenu( bool show, bool showZoom, bool showScale, bool showTime, bool showYear, bool showGrid, bool showPrint) { myTimeHeader->setShowPopupMenu( show,showZoom,showScale,showTime, showYear,showGrid,showPrint ); } /*! Returns whether the configure popup menu should be shown on right click on the time header widget. \return true if the popup menu should be shown */ bool KDGanttView::showHeaderPopupMenu() const { return myTimeHeader->showPopupMenu(); } //**************************************************** /*! Specifies whether the add item popup menu should be shown on right click on the time table widget. This menu lets the user quickly add new items to the Gantt view (as root, as child or after an item). It also offers cutting and pasting of items. The default setting is that the popup menu is not shown. It must be enabled by the program. \param show true in order to show popup menu, false in order not to */ void KDGanttView::setShowTimeTablePopupMenu( bool show ) { myCanvasView->setShowPopupMenu( show ); } /*! Returns whether the add item popup menu should be shown on right click on the time table widget. \return true if the popup menu should be shown */ bool KDGanttView::showTimeTablePopupMenu() const { return myCanvasView->showPopupMenu(); } /*! Sets the tqshapes for a certain type of Gantt item. Not all items use all three tqshapes (e.g., only summary items use the middle tqshape). This setting overrides any tqshape settings made on individual items. These settings will be taken as initial values of any newly created item of this certain type. See also the documentation of the KDGanttViewItem class. \param type the type of Gantt items for which to set the tqshapes \param start the tqshape to use for the beginning of the item \param middle the tqshape to use for the middle of the item \param end the tqshape to use for the end of the item \param overwriteExisting if true, overwrites existing tqshape settings in the individual items \sa tqshapes() */ void KDGanttView::setShapes( KDGanttViewItem::Type type, KDGanttViewItem::Shape start, KDGanttViewItem::Shape middle, KDGanttViewItem::Shape end, bool overwriteExisting ) { if ( overwriteExisting ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { if ( ((KDGanttViewItem*)it.current())->type() == type) ((KDGanttViewItem*)it.current())->setShapes(start,middle, end ); } } int index = getIndex( type ); myDefaultShape [index*3] = start; myDefaultShape [index*3+1] = middle; myDefaultShape [index*3+2] = end; undefinedShape[index] = false; } /*! Queries the tqshapes for a particular type of Gantt item. \param type the type of Gantt items for which to query the tqshapes \param start the start tqshape is returned in this parameter \param middle the middle tqshape is returned in this parameter \param end the end tqshape is returned in this parameter \return true if there was a general tqshape set for the specified type. If the return value is false, the values of the three tqshape parameters are undefined. \sa setShapes() */ bool KDGanttView::tqshapes( KDGanttViewItem::Type type, KDGanttViewItem::Shape& start, KDGanttViewItem::Shape& middle, KDGanttViewItem::Shape& end ) const { int index = getIndex( type ); start = myDefaultShape [index*3]; middle = myDefaultShape [index*3+1]; end = myDefaultShape [index*3+2]; return !undefinedShape[index]; } /*! Sets the colors for a certain type of Gantt item. Not all items use all three colors (e.g., only summary items use the middle color). This setting overrides any color settings made on individual items. These settings will be taken as initial values of any newly created item of this certain type. See also the description of the KDGanttViewItem class. \param type the type of Gantt items for which to set the colors \param start the color to use for the beginning of the item \param middle the color to use for the middle of the item \param end the color to use for the end of the item \param overwriteExisting if true, overwrites existing color settings on invididual items \sa colors(), setDefaultColors(), defaultColors() */ void KDGanttView::setColors( KDGanttViewItem::Type type, const TQColor& start, const TQColor& middle, const TQColor& end, bool overwriteExisting ) { if ( overwriteExisting ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { if ( ((KDGanttViewItem*)it.current())->type() == type) ((KDGanttViewItem*)it.current())->setColors(start,middle, end ); } } int index = getIndex( type ); myColor [index*3] = start; myColor [index*3+1] = middle; myColor [index*3+2] = end; undefinedColor[index] = false; } /*! Queries the colors for a particular type of Gantt item. \param type the type of Gantt items for which to query the colors \param start the start color is returned in this parameter \param middle the middle color is returned in this parameter \param end the end color is returned in this parameter \return true if there was a general color set for the specified type. If the return value is false, the values of the three color parameters are undefined. \sa setColors(), setDefaultColor(), defaultColor() */ bool KDGanttView::colors( KDGanttViewItem::Type type, TQColor& start, TQColor& middle, TQColor& end ) const { int index = getIndex( type ); start = myColor [index*3]; middle = myColor [index*3+1]; end = myColor [index*3+2]; return !undefinedColor[index]; } /*! Sets the highlight colors for a certain type of Gantt item. Not all items use all three highlight colors (e.g., only summary items use the middle highlight color). This setting overrides any highlight color settings made on individual items. These settings will be taken as initial values of any newly created item of this certain type. See also the description of the KDGanttViewItem class. \param type the type of Gantt items for which to set the highlight colors \param start the highlight color to use for the beginning of the item \param middle the highlight color to use for the middle of the item \param end the highlight color to use for the end of the item \param overwriteExisting if true, overwrites existing color settings in the individual items \sa highlightColors(), setDefaultHighlightColor(), defaultHighlightColor() */ void KDGanttView::setHighlightColors( KDGanttViewItem::Type type, const TQColor& start, const TQColor& middle, const TQColor& end, bool overwriteExisting ) { if ( overwriteExisting ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { if ( ((KDGanttViewItem*)it.current())->type() == type) ((KDGanttViewItem*)it.current())->setHighlightColors(start,middle, end ); } } int index = getIndex( type ); myColorHL [index*3] = start; myColorHL [index*3+1] = middle; myColorHL [index*3+2] = end; undefinedColorHL[index] = false; } /*! Queries the highlight colors for a particular type of Gantt item. \param type the type of Gantt items for which to query the highlight colors \param start the start highlight color is returned in this parameter \param middle the middle highlight color is returned in this parameter \param end the end highlight color is returned in this parameter \return true if there was a general highlight color set for the specified type. If the return value is false, the values of the three highlight color parameters are undefined. \sa setHighlightColors(), setDefaultHighlightColor(), defaultHighlightColor() */ bool KDGanttView::highlightColors( KDGanttViewItem::Type type, TQColor& start, TQColor& middle, TQColor& end ) const { int index = getIndex( type ); start = myColorHL [index*3]; middle = myColorHL [index*3+1]; end = myColorHL [index*3+2]; return !undefinedColorHL[index]; } /*! Sets the color used for texts in the Gantt chart. Overrides all individual settings of the Gantt items. \param color the text color to use \sa textColor() */ void KDGanttView::setTextColor( const TQColor& color ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { ((KDGanttViewItem*)it.current())->setTextColor(color); } myTextColor = color; } /*! Returns the color used for texts in the Gantt chart. \return the color used for texts in the Gantt chart. \sa setTextColor() */ TQColor KDGanttView::textColor() const { return myTextColor; } /*! Specifies the brush in which the 'showNoInformation' line of items should be drawn. \param brush the brush of the 'showNoInformation' lines \sa KDGanttViewItem::showNoInformation(), KDGanttViewItem::setShowNoInformation(), KDGanttView::noInformationBrush() */ void KDGanttView::setNoInformationBrush( const TQBrush& brush ) { myTimeTable->setNoInformationBrush( brush ); } /*! Returns the brush of the 'showNoInformation' lines \return the brush of the 'showNoInformation' lines \sa KDGanttViewItem::showNoInformation(), KDGanttViewItem::setShowNoInformation(), setNoInformationBrush() */ TQBrush KDGanttView::noInformationBrush() const { return myTimeTable->noInformationBrush(); } /*! Removes all items from the legend. \sa addLegendItem() */ void KDGanttView::clearLegend( ) { myLegend->clearLegend(); myLegendItems->setAutoDelete( true ); delete myLegendItems; myLegendItems = new TQPtrList; } /*! Adds an item to the legend. \param tqshape the tqshape to display \param tqshapeColor the color in which to display the tqshape \param text the text to display \sa clearLegend() */ void KDGanttView::addLegendItem( KDGanttViewItem::Shape tqshape, const TQColor& tqshapeColor, const TQString& text ) { myLegend->addLegendItem( tqshape,tqshapeColor,text ); legendItem* item = new legendItem; item->tqshape = tqshape; item->color = tqshapeColor; item->text = text; myLegendItems->append( item ); } /*! Sets the start of the horizon of the Gantt chart. If \a start is null, the horizon start is computed automatically. \param start the start of the horizon \sa horizonStart() */ void KDGanttView::setHorizonStart( const TQDateTime& start ) { myTimeHeader->setHorizonStart(start); } /*! Returns the start of the horizon of the Gantt chart. \return the start of the horizon of the Gantt chart \sa setHorizonStart() */ TQDateTime KDGanttView::horizonStart() const { return myTimeHeader->horizonStart(); } /*! Sets the end of the horizon of the Gantt chart. If \a end is null, the horizon end is computed automatically. \param end the end of the horizon \sa setHorizonEnd() */ void KDGanttView::setHorizonEnd( const TQDateTime& end ) { myTimeHeader->setHorizonEnd(end); } /*! Returns the end of the horizon of the Gantt chart. \return the end of the horizon of the Gantt chart \sa setHorizonEnd() */ TQDateTime KDGanttView::horizonEnd() const { return myTimeHeader->horizonEnd(); } /*! Configures the unit of the lower scale of the header. The higher unit is computed automatically. \param unit the unit of the lower scale of the header. \sa scale() */ void KDGanttView::setScale( Scale unit ) { myTimeHeader->setScale( unit ); } /*! Returns the unit of the lower scale of the header. \return the unit of the lower scale of the header. \sa setScale() */ KDGanttView::Scale KDGanttView::scale() const { return myTimeHeader->scale(); } /*! Sets the maximum allowed time scale of the lower scale of the header. \param unit the unit of the lower scale of the header. \sa scale() */ void KDGanttView::setMaximumScale( Scale unit ) { myTimeHeader->setMaximumScale( unit ); } /*! Returns the maximum allowed time scale of the lower scale of the header. \return the unit of the lower scale of the header. \sa setScale() */ KDGanttView::Scale KDGanttView::maximumScale() const { return myTimeHeader->maximumScale(); } /*! Sets the minimum allowed time scale of the lower scale of the header. \param unit the unit of the lower scale of the header. \sa scale() */ void KDGanttView::setMinimumScale( Scale unit ) { myTimeHeader->setMinimumScale( unit ); } /*! Returns the minimum allowed time scale of the lower scale of the header. \return the unit of the lower scale of the header. \sa setScale() */ KDGanttView::Scale KDGanttView::minimumScale() const { return myTimeHeader->minimumScale(); } /*! Sets the absolute number of minor ticks, if scaling is set to Auto. If the scale mode is set to Auto, then the actual scale and the minorScaleCount is automatically computed, such that there are count minor ticks \param count the number of minor ticks \sa autoScaleMinorTickCount(),setScale(),scale() */ void KDGanttView::setAutoScaleMinorTickCount( int count ) { myTimeHeader->setAutoScaleMinorTickCount( count ); } /*! Returns the absolut number of minor ticks, if scaling is set to Auto \return the absolut number of minor ticks \sa setAutoScaleMinorTickCount(),setScale(),scale() */ int KDGanttView::autoScaleMinorTickCount() const { return myTimeHeader->autoScaleMinorTickCount(); } /*! Sets the minimum width that a column needs to have. If the size of the Gantt chart and the scale would make it necessary to go below this limit otherwise, the chart will automatically be made less exact. \param width the minimum column width \sa minimumColumnWidth() */ void KDGanttView::setMinimumColumnWidth( int width ) { myTimeHeader->setMinimumColumnWidth( width ); } /*! Returns the minimum width a column needs to have. \return the column minimum width \sa setMinimumColumnWidth() */ int KDGanttView::minimumColumnWidth() const { return myTimeHeader->minimumColumnWidth(); } /*! Specifies the format in which to display years. If no years are shown, this method has no effect. \param format the year format \sa yearFormat(), setHourFormat(), hourFormat() */ void KDGanttView::setYearFormat( YearFormat format ) { myTimeHeader->setYearFormat(format ); } /*! Returns the format in which to display years. \return the year format \sa setYearFormat(), setHourFormat(), hourFormat() */ KDGanttView::YearFormat KDGanttView::yearFormat() const { return myTimeHeader->yearFormat(); } /*! Specifies the format in which to display hours. If no hours are shown, this method has no effect. \param format the hour format \sa hourFormat(), setYearFormat(), yearFormat() */ void KDGanttView::setHourFormat( HourFormat format ) { myTimeHeader->setHourFormat( format ); } /*! Returns the format in which to display hours. \return the hour format \sa setHourFormat(), setYearFormat(), yearFormat() */ KDGanttView::HourFormat KDGanttView::hourFormat() const { return myTimeHeader->hourFormat(); } /*! Hides/shows the grid for the major ticks of the time header in the gantt view. \param show true in order to show ticks, false in order to hide them. If show is true, setShowMinorTicks( false ) is performed automatically to hide the grid of the minor ticks. In order to show now grid, call setShowMinorTicks( false ) and setShowMajorTicks( false ). \sa showMajorTicks(), setShowMinorTicks(), showMinorTicks() */ void KDGanttView::setShowMajorTicks( bool show ) { myTimeHeader->setShowMajorTicks(show ); } /*! Returns whether the grid is shown on the major scale. \return true if ticks are shown on the major scale \sa setShowMajorTicks(), setShowMinorTicks(), showMinorTicks() */ bool KDGanttView::showMajorTicks() const { return myTimeHeader->showMajorTicks(); } /*! Hides/shows the grid for the minor ticks of the time header in the gantt view. \param show true in order to show ticks, false in order to hide them. If show is true, setShowMajorTicks( false ) is performed automatically to hide the grid of the major ticks. In order to show now grid, call setShowMinorTicks( false ) and setShowMajorTicks( false ). \sa showMinorTicks(), setShowMajorTicks(), showMajorTicks() */ void KDGanttView::setShowMinorTicks( bool show) { myTimeHeader->setShowMinorTicks( show ); } /*! Returns whether ticks are shown on the minor scale. \return true if ticks are shown on the minor scale \sa setShowMinorTicks(), setShowMajorTicks(), showMajorTicks() */ bool KDGanttView::showMinorTicks() const { return myTimeHeader->showMinorTicks(); } /*! Sets the background color for the column closest to \a column. It can be specified whether the color should be shown in all scales or only in specific scales. If you want to define the color only for the daily view, specify mini and maxi as Day. If there is no value specified for mini and maxi, the color for the column is shown on all scales. Note that it is possible that there are two values for a column in a scale. In this case, the shown color is unspecified. \param column the column to set the background color for \param color the background color \param mini show the colour only in scales greater than this \param maxi show the colour only in scales lesser than this \sa columnBackgroundColor(), setWeekendBackgroundColor(), weekendBackgroundColor() */ void KDGanttView::setColumnBackgroundColor( const TQDateTime& column, const TQColor& color , Scale mini, Scale maxi ) { myTimeHeader->setColumnBackgroundColor( column, color,mini,maxi ); } #if 0 /*! Sets the background color for a time interval given by \a start and \a end. \a start may be later than \a end. If there is already a background interval with the same \a start and \a end values defined, the values (i.e. const TQColor& color , Scale mini, Scale maxi) of this background interval are changed. Change the times of an already defined interval with \a changeBackgroundInterval(). Delete an already defined interval with \a deleteBackgroundInterval(). It can be defined, whether the color should be shown in all scales or only in specific scales. If you want to define the color only for the daily view, scecify mini and maxi as Day. If there is no value for mini/maxi specified, the color for the columns is shown in all scales. \param start start datetime of the time interval \param end end datetime of the time interval \param color the background color \param mini show the color only in scales greater than this \param maxi show the color only in scales lesser than this \sa changeBackgroundInterval(), deleteBackgroundInterval(), columnBackgroundColor(), setWeekendBackgroundColor(), weekendBackgroundColor() */ void KDGanttView::setIntervalBackgroundColor( const TQDateTime& start, const TQDateTime& end, const TQColor& color , Scale mini, Scale maxi ) { myTimeHeader->setIntervalBackgroundColor( start, end, color,mini,maxi ); } /*! Changes the times of an already defined background color interval. The new values \a startnew and \a endnew should not be datetime values of an already defined background color interval. If that is the case, nothing is changed and false is returned. \param oldstart the start date and time of the interval to change \param oldend the end date and time of the interval to change \param newstart the new start date and time \param newend the new end date and time \return true, if there is a backgroundcolor interval with values \a start and \a end found and the new values \a startnew and \a endnew are not datetime values of an already defined background color interval. Returns false otherwise. \sa changeBackgroundInterval(), deleteBackgroundInterval(), columnBackgroundColor(), setWeekendBackgroundColor(), weekendBackgroundColor() */ bool KDGanttView::changeBackgroundInterval( const TQDateTime& oldstart, const TQDateTime& oldend, const TQDateTime& newstart, const TQDateTime& newend ) { return myTimeHeader->changeBackgroundInterval( oldstart, oldend, newstart, newend ); } /*! Deletes an already defined background color interval. \param start start datetime of time interval \param end end datetime of time interval \return true, if there is a backgroundcolor interval with values \a start and \a end found (and hence deleted). \sa changeBackgroundInterval(), columnBackgroundColor() */ bool KDGanttView::deleteBackgroundInterval( const TQDateTime& start, const TQDateTime& end) { return myTimeHeader->deleteBackgroundInterval( start, end ); } #endif /*! Adds a filled rectangle for a time interval given by \a start and \a end, across all tasks. \a start may be later than \a end. \sa KDIntervalColorRectangle */ void KDGanttView::addIntervalBackgroundColor( KDIntervalColorRectangle* newItem ) { myTimeHeader->addIntervalBackgroundColor( newItem ); } /*! Removes all background color settings set with setColumnBackgroundColor() and setIntervalBackgroundColor(). Does not affect the settings of setWeekendBackgroundColor(). \sa setColumnBackgroundColor(), setWeekendBackgroundColor(), weekendBackgroundColor(), setIntervalBackgroundColor() */ void KDGanttView::clearBackgroundColor() { myTimeHeader->clearBackgroundColor(); } /*! Returns the background color for the column closest to \a column. \param column the column to query the background color for \return the background color of the specified color \sa setColumnBackgroundColor(), setWeekendBackgroundColor(), weekendBackgroundColor() */ TQColor KDGanttView::columnBackgroundColor( const TQDateTime& column ) const { return myTimeHeader->columnBackgroundColor( column ) ; } /*! Specifies the background color for weekend days. If no individual days are visible on the Gantt chart, this method has no visible effect. \param color the background color to use for weekend days. \sa weekendBackgroundColor(), setWeekendDays(), weekendDays() */ void KDGanttView::setWeekendBackgroundColor( const TQColor& color ) { myTimeHeader->setWeekendBackgroundColor( color ); } /*! Returns the background color for weekend days. \return the background color for weekend days \sa setWeekendBackgroundColor(), setWeekendDays(), weekendDays() */ TQColor KDGanttView::weekendBackgroundColor() const { return myTimeHeader->weekendBackgroundColor(); } /*! Specifies the background color for weekday days. If no individual days are visible on the Gantt chart, this method has no visible effect. The days are specified as an intervals of integer values where 1 means Monday and 7 means Sunday. \param color the background color to use for weekend days. \param weekday the day of the week (Monday = 1, Sunday = 7) \sa weekendBackgroundColor(), setWeekendDays(), weekendDays() */ void KDGanttView::setWeekdayBackgroundColor( const TQColor& color, int weekday ) { myTimeHeader->setWeekdayBackgroundColor( color, weekday ); } /*! Returns the background color for weekday days. \param weekday the day of the week (Monday = 1, Sunday = 7) \return the background color for weekend days \sa setWeekendBackgroundColor(), setWeekendDays(), weekendDays() */ TQColor KDGanttView::weekdayBackgroundColor(int weekday) const { return myTimeHeader->weekdayBackgroundColor( weekday); } /*! Defines which days are considered weekends. The days are specified as an interval of integer values where 1 means Monday and 7 means Sunday. In order to define a weekend from Sunday to Monday, specify (7,1). \param start the first day of the weekend \param end the last day of the weekend \sa weekendDays(), setWeekendBackgroundColor(), weekendBackgroundColor() */ void KDGanttView::setWeekendDays( int start, int end ) { myTimeHeader->setWeekendDays( start, end ); } /*! Returns which days are considered weekends. \param start in this parameter, the first day of the weekend is returned \param end in this parameter, the end day of the weekend is returned \sa setWeekendDays(), setWeekendBackgroundColor(), weekendBackgroundColor() */ void KDGanttView::weekendDays( int& start, int& end ) const { myTimeHeader->weekendDays( start, end ); } /*! \fn void KDGanttView::itemLeftClicked( KDGanttViewItem* ) This signal is emitted when the user clicks on an item with the left mouse button. */ /*! \fn void KDGanttView::itemMidClicked( KDGanttViewItem* ) This signal is emitted when the user clicks on an item with the middle mouse button. */ /*! \fn void KDGanttView::itemRightClicked( KDGanttViewItem* ) This signal is emitted when the user clicks on an item with the right mouse button. */ /*! \fn void KDGanttView::itemDoubleClicked( KDGanttViewItem* ) This signal is emitted when the user double-clicks an item. */ /*! \fn void KDGanttView::itemConfigured( KDGanttViewItem* ) This signal is emitted when the user has configured an item visually. */ /*! \fn void KDGanttView::taskLinkLeftClicked( KDGanttViewTaskLink* ) This signal is emitted when the user clicks on a task link with the left mouse button. */ /*! \fn void KDGanttView::taskLinkMidClicked( KDGanttViewTaskLink* ) This signal is emitted when the user clicks on a task link with the middle mouse button. */ /*! \fn void KDGanttView::taskLinkRightClicked( KDGanttViewTaskLink* ) This signal is emitted when the user clicks on a task link with the right mouse button. */ /*! \fn void KDGanttView::taskLinkDoubleClicked( KDGanttViewTaskLink* ) This signal is emitted when the user double-clicks a task link. */ /*! \enum KDGanttView::YearFormat This enum is used to specify the year format used in the header. */ /*! \enum KDGanttView::HourFormat This enum is used to specify the hour format used in the header. */ /*! \enum KDGanttView::Scale This enum is used to specify the units of the scales in the header. */ /*! Sets the number of ticks in the major scale. \param count the number of ticks in the major scale \sa majorScaleCount(), setMinorScaleCount(), minorScaleCount() */ void KDGanttView::setMajorScaleCount( int count ) { myTimeHeader->setMajorScaleCount(count ); } /*! Returns the number of ticks per unit in the major scale. \return the number of ticks in the major scale \sa setMajorScaleCount(), setMinorScaleCount(), minorScaleCount() */ int KDGanttView::majorScaleCount() const { return myTimeHeader->majorScaleCount(); } /*! Sets the number of ticks in the minor scale. \param count the number of ticks in the minor scale \sa minorScaleCount, setMajorScaleCount, majorScaleCount() */ void KDGanttView::setMinorScaleCount( int count ) { myTimeHeader->setMinorScaleCount(count ); } /*! Returns the number of ticks per unit in the minor scale. \return the number of ticks in the minor scale \sa setMinorScaleCount(), setMajorScaleCount(), majorScaleCount() */ int KDGanttView::minorScaleCount() const { return myTimeHeader->minorScaleCount(); } /*! Sets the default color for a particular type of Gantt item that is used for the item if no specific start, middle, or end colors are set. \param type the type of Gantt items for which to query the highlight colors \param color the default color to use \param overwriteExisting if true, existing settings for individual items are overwritten \sa defaultColor(), setColors(), colors() */ void KDGanttView::setDefaultColor( KDGanttViewItem::Type type, const TQColor& color, bool overwriteExisting ) { if ( overwriteExisting ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { if ( ((KDGanttViewItem*)it.current())->type() == type) ((KDGanttViewItem*)it.current())->setDefaultColor(color ); } } int index = getIndex( type ); myDefaultColor [index] = color; } /*! Returns the default color for a particular type of Gantt item that is used for the item if no specific start, middle, or end colors are set. \param type the type of Gantt items for which to query the highlight colors \return color the default color used \sa setDefaultColor(), setColors(), colors() */ TQColor KDGanttView::defaultColor( KDGanttViewItem::Type type ) const { int index = getIndex( type ); return myDefaultColor [index]; } /*! Sets the default highlighting color for a particular type of Gantt item that is used for the item if no specific start, middle, or end colors are set. \param type the type of Gantt items for which to query the highlight colors \param color the default highlighting color to use \param overwriteExisting if true, existing color settings in individual items are overwritten \sa defaultHighlightColor(), setHighlightColors(), highlightColors() */ void KDGanttView::setDefaultHighlightColor( KDGanttViewItem::Type type, const TQColor& color, bool overwriteExisting ) { if ( overwriteExisting ) { TQListViewItemIterator it(myListView); for ( ; it.current(); ++it ) { if ( ((KDGanttViewItem*)it.current())->type() == type) ((KDGanttViewItem*)it.current())->setDefaultHighlightColor(color ); } } int index = getIndex( type ); myDefaultColorHL [index] = color; } /*! Returns the default highlighting color for a particular type of Gantt item that is used for the item if no specific start, middle, or end colors are set. \param type the type of Gantt items for which to query the highlight colors \return color the default highlighting color used \sa setDefaultHighlightColor(), setHighlightColors(), highlightColors() */ TQColor KDGanttView::defaultHighlightColor( KDGanttViewItem::Type type ) const { int index = getIndex( type ); return myDefaultColorHL [index]; } /*! Returns the first item in the Gantt view. \return the first item in the Gantt view, 0 if there are no items */ KDGanttViewItem* KDGanttView::firstChild() const { return (KDGanttViewItem*)myListView->firstChild(); } /*! This method turns calendar mode on and off. In calendar mode, only those items can be opened which have subitems which have subitems. I.e., if an item tqcontains multiple calendars, it can be opened, but not a calendar item itself. If you want to use this GanttView as a calendar view, you have to call setDisplaySubitemsAsGroup( true ); to use the root items as calendar items. To create new calendar entries for these root items, create a new KDGanttViewTaskItem with this root item as a parent. If you want an item with subitems to behave like a calendar (which is possibly empty at startup), please call setIsCalendar( true ); for this item. \param mode if true, the calendar view mode is turned on if false, the calendar view mode is turned off \sa setDisplaySubitemsAsGroup(), displaySubitemsAsGroup(), calendarMode() */ void KDGanttView::setCalendarMode( bool mode ) { myListView->setCalendarMode( mode ); } /*! Returns true, if the Gantt view is in calendar mode. See setCalendarMode() for the meaning of calendar mode. \return returns true, if the Gantt view is in calendermode \sa setCalendarMode() */ bool KDGanttView::calendarMode() const { return myListView->calendarMode(); } /*! This method specifies whether hidden subitems should be displayed. It iterates over all KDGanttViewItems in this Gantt view and sets their displaySubitemsAsGroup() property. All newly created items will have this setting by default. \param show if true, the hidden subitems are displayed in all items of this Gantt view. \sa KDGanttViewItem::setDisplaySubitemsAsGroup(), KDGanttViewItem::displaySubitemsAsGroup() */ void KDGanttView::setDisplaySubitemsAsGroup( bool show ) { TQListViewItemIterator it( myListView ); for ( ; it.current(); ++it ) { KDGanttViewItem* currentItem = ( KDGanttViewItem* )it.current(); currentItem->setDisplaySubitemsAsGroup( show ); } _displaySubitemsAsGroup = show; } /*! Returns, whether new items are created with the displayHiddenSubitems property. \return true, if hidden subitems should be displayed on newly created items. \sa setDisplaySubitemsAsGroup(), KDGanttViewItem::setDisplaySubitemsAsGroup(), KDGanttViewItem::displaySubitemsAsGroup() */ bool KDGanttView::displaySubitemsAsGroup() const { return _displaySubitemsAsGroup; } /*! This method specifies whether tasks where the start time and the end time are the same are displayed as a line over the full height of the Gantt view. \param show if true, tasks with starttime == endtime are displayed as a line */ void KDGanttView::setDisplayEmptyTasksAsLine( bool show ) { _displayEmptyTasksAsLine = show; } /*! Returns, whether tasks where the start time and the end time are the same are displayed as a line over the full height of the Gantt view. \return true, if empty tasks are displayed as line. */ bool KDGanttView::displayEmptyTasksAsLine() const { return _displayEmptyTasksAsLine; } /*! Defines the horizontal background lines of the Gantt chart. Call setHorBackgroundLines() (equivalent to setHorBackgroundLines( 2, TQBrush( TQColor ( 240,240,240 )) ) ) to draw a light grey horizontal background line for every second Gantt item. Call setHorBackgroundLines(0) in order to not show horizontal background lines. You may specify the number of lines and the brush of the lines. \param count for count >= 2, every count line gets a backgroud specified by brush for count < 2, no background lines are drawn \param brush the brush of the lines */ void KDGanttView::setHorBackgroundLines( int count, TQBrush brush ) { myTimeTable->setHorBackgroundLines( count, brush ); } /*! Returns the definition of the horizontal background lines of the Gantt chart. \param brush the brush of the lines \return every nth line gets a background specified by brush if 0 is returned, no backgroud lines are drawn */ int KDGanttView::horBackgroundLines( TQBrush& brush ) { return myTimeTable->horBackgroundLines( brush ); } /*! Returns the last item in the Gantt view \return the last item in the Gantt view, 0 if there are no items */ KDGanttViewItem* KDGanttView::lastItem() const { return (KDGanttViewItem*)myListView->lastItem (); } /*! Returns the list of task links in the Gantt view. \return the list of task links in the Gantt view */ TQPtrList KDGanttView::taskLinks() const { return myTimeTable->taskLinks(); } /*! Returns the list of task link groups in the Gantt view. \return the list of task link groups in the Gantt view */ TQPtrList KDGanttView::taskLinkGroups() const { return myTaskLinkGroupList; } /** Reads the parameters of the view from an XML document. \param doc the XML document to read from \return true if the parameters could be read, false if a file format error occurred \sa saveXML */ bool KDGanttView::loadXML( const TQDomDocument& doc ) { TQDomElement docRoot = doc.documentElement(); // ChartParams element TQDomNode node = docRoot.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "ShowLegend" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowLegend( value ); } else if( tagName == "ShowLegendButton" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowLegendButton( value ); } else if( tagName == "LegendIsDockWindow" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setLegendIsDockwindow( value ); } else if( tagName == "ShowListView" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowListView( value ); } else if( tagName == "ShowHeader" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setHeaderVisible( value ); } else if( tagName == "ShowTaskLinks" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowTaskLinks( value ); } else if( tagName == "EditorEnabled" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setEditorEnabled( value ); } else if( tagName == "DisplayEmptyTasksAsLine" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setDisplayEmptyTasksAsLine( value ); } else if( tagName == "GlobalFont" ) { TQFont font; if( KDGanttXML::readFontNode( element, font ) ) setFont( font ); } else if( tagName == "HorizonStart" ) { TQDateTime value; if( KDGanttXML::readDateTimeNode( element, value ) ) setHorizonStart( value ); } else if( tagName == "HorizonEnd" ) { TQDateTime value; if( KDGanttXML::readDateTimeNode( element, value ) ) setHorizonEnd( value ); } else if( tagName == "Scale" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) setScale( stringToScale( value ) ); } else if( tagName == "MinimumScale" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) setMinimumScale( stringToScale( value ) ); } else if( tagName == "MaximumScale" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) setMaximumScale( stringToScale( value ) ); } else if( tagName == "YearFormat" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) setYearFormat( stringToYearFormat( value ) ); } else if( tagName == "HourFormat" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) setHourFormat( stringToHourFormat( value ) ); } else if( tagName == "ShowMinorTicks" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowMinorTicks( value ); } else if( tagName == "ShowMajorTicks" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowMajorTicks( value ); } else if( tagName == "DragEnabled" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setDragEnabled( value ); } else if( tagName == "DropEnabled" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setDropEnabled( value ); } else if( tagName == "CalendarMode" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setCalendarMode( value ); } else if( tagName == "Editable" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setEditable( value ); } else if( tagName == "TextColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setTextColor( value ); } else if( tagName == "MajorScaleCount" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) setMajorScaleCount( value ); } else if( tagName == "MinorScaleCount" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) setMinorScaleCount( value ); } else if( tagName == "AutoScaleMinorTickCount" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) setAutoScaleMinorTickCount( value ); } else if( tagName == "MinimumColumnWidth" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) setMinimumColumnWidth( value ); } else if( tagName == "GanttMaximumWidth" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) setGanttMaximumWidth( value ); } else if( tagName == "NoInformationBrush" ) { TQBrush value; if( KDGanttXML::readBrushNode( element, value ) ) setNoInformationBrush( value ); } else if( tagName == "GanttViewBackgroundColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setGvBackgroundColor( value ); } else if( tagName == "ListViewBackgroundColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setLvBackgroundColor( value ); } else if( tagName == "TimeHeaderBackgroundColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setTimeHeaderBackgroundColor( value ); } else if( tagName == "LegendHeaderBackgroundColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setLegendHeaderBackgroundColor( value ); } else if( tagName == "WeekendBackgroundColor" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setWeekendBackgroundColor( value ); } else if( tagName == "WeekdayBackgroundColor" ) { TQDomNode node = element.firstChild(); int day = 0; TQColor color; while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Day" ) { int value; if( KDGanttXML::readIntNode( element, value ) ) day = value; } else if( tagName == "Color" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) color = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } if( day && color.isValid() ) setWeekdayBackgroundColor( color, day ); } else if( tagName == "WeekendDays" ) { TQString startString = element.attribute( "Start" ); TQString endString = element.attribute( "End" ); bool startOk = false, endOk = false; int start = startString.toInt( &startOk ); int end = startString.toInt( &endOk ); if( startOk && endOk ) setWeekendDays( start, end ); } else if( tagName == "ZoomFactor" ) { double value; if( KDGanttXML::readDoubleNode( element, value ) ) setZoomFactor( value, true ); } else if( tagName == "ShowHeaderPopupMenu" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowHeaderPopupMenu( value ); } else if( tagName == "ShowTimeTablePopupMenu" ) { bool value; if( KDGanttXML::readBoolNode( element, value ) ) setShowTimeTablePopupMenu( value ); } else if( tagName == "Shapes" ) { TQDomNode node = element.firstChild(); bool undefinedShape = false; while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Event" ) { KDGanttViewItem::Shape startShape, middleShape, endShape; startShape = KDGanttViewItem::TriangleDown; middleShape = KDGanttViewItem::TriangleDown; endShape = KDGanttViewItem::TriangleDown; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) startShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "Middle" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) middleShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "End" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) endShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } if ( ! undefinedShape ) setShapes( KDGanttViewItem::Event, startShape, middleShape, endShape, false ); undefinedShape = false; } else if( tagName == "Task" ) { KDGanttViewItem::Shape startShape, middleShape, endShape; startShape = KDGanttViewItem::TriangleDown; middleShape = KDGanttViewItem::TriangleDown; endShape = KDGanttViewItem::TriangleDown; TQDomNode node = element.firstChild(); while( !node.isNull()) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) startShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "Middle" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) middleShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "End" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) endShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } if ( ! undefinedShape ) setShapes( KDGanttViewItem::Task, startShape, middleShape, endShape, false ); undefinedShape = false; } else if( tagName == "Summary" ) { KDGanttViewItem::Shape startShape, middleShape, endShape; startShape = KDGanttViewItem::TriangleDown; middleShape = KDGanttViewItem::TriangleDown; endShape = KDGanttViewItem::TriangleDown; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) startShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "Middle" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) middleShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else if( tagName == "End" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) endShape = KDGanttViewItem::stringToShape( value ); if ( value == "Undefined" ) undefinedShape = true; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } if ( ! undefinedShape ) setShapes( KDGanttViewItem::Summary, startShape, middleShape, endShape, false ); undefinedShape = false; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "Colors" ) { TQDomNode node = element.firstChild(); while( !node.isNull()) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Event" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setColors( KDGanttViewItem::Event, startColor, middleColor, endColor, false ); } else if( tagName == "Task" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setColors( KDGanttViewItem::Task, startColor, middleColor, endColor, false ); } else if( tagName == "Summary" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setColors( KDGanttViewItem::Summary, startColor, middleColor, endColor , false); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "DefaultColors" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "Event" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultColor( KDGanttViewItem::Event, value, false ); } else if( tagName == "Task" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultColor( KDGanttViewItem::Task, value, false ); } else if( tagName == "Summary" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultColor( KDGanttViewItem::Summary, value , false); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "HighlightColors" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Event" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setHighlightColors( KDGanttViewItem::Event, startColor, middleColor, endColor, false ); } else if( tagName == "Task" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setHighlightColors( KDGanttViewItem::Task, startColor, middleColor, endColor , false); } else if( tagName == "Summary" ) { TQColor startColor, middleColor, endColor; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an elemente TQString tagName = element.tagName(); if( tagName == "Start" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) startColor = value; } else if( tagName == "Middle" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) middleColor = value; } else if( tagName == "End" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) endColor = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setHighlightColors( KDGanttViewItem::Summary, startColor, middleColor, endColor, false ); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "DefaultHighlightColors" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "Event" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultHighlightColor( KDGanttViewItem::Event, value , false); } else if( tagName == "Task" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultHighlightColor( KDGanttViewItem::Task, value, false ); } else if( tagName == "Summary" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) setDefaultHighlightColor( KDGanttViewItem::Summary, value, false ); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "Items" ) { TQDomNode node = element.firstChild(); KDGanttViewItem* previous = 0; while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "Item" ) { KDGanttViewItem* newItem; if( previous ) newItem = KDGanttViewItem::createFromDomElement( this, previous, element ); else newItem = KDGanttViewItem::createFromDomElement( this, element ); previous = newItem; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "TaskLinks" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "TaskLink" ) KDGanttViewTaskLink::createFromDomElement( element ); else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "TaskLinkGroups" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "TaskLink" ) KDGanttViewTaskLinkGroup::createFromDomElement( element ); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } node = node.nextSibling(); } } else if( tagName == "ColumnBackgroundColors" ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "ColumnBackgroundColor" ) { TQDomNode node = element.firstChild(); TQDateTime dateTime; TQColor color; while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was // really an // element TQString tagName = element.tagName(); if( tagName == "DateTime" ) { TQDateTime value; if( KDGanttXML::readDateTimeNode( element, value ) ) dateTime = value; } else if( tagName == "Color" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) color = value; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } setColumnBackgroundColor( dateTime, color ); } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else if( tagName == "LegendItems" ) { clearLegend(); TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "LegendItem" ) { KDGanttViewItem::Shape tempLegendShape; tempLegendShape = KDGanttViewItem::TriangleDown; TQColor tempLegendColor; TQString tempLegendString; bool ok = true; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "Shape" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) tempLegendShape = KDGanttViewItem::stringToShape( value ); else ok = false; } else if( tagName == "Color" ) { TQColor value; if( KDGanttXML::readColorNode( element, value ) ) tempLegendColor = value; else ok = false; } else if( tagName == "Text" ) { TQString value; if( KDGanttXML::readStringNode( element, value ) ) tempLegendString = value; else ok = false; } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } if( ok ) { addLegendItem( tempLegendShape, tempLegendColor, tempLegendString ); qDebug( "Adding legend item %s", tempLegendString.latin1() ); } } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } } else { qDebug( "Unrecognized tag name: %s", tagName.latin1() ); Q_ASSERT( false ); } } node = node.nextSibling(); } // while return true; /* FIXME: Do real error-reporting. The ASSERT's should be "return false" stmnts */ } // method /** Saves the parameters of the view parameters to an XML document. \param withPI pass true to store processing instructions, false to leave them out \return the XML document that represents the parameters \sa loadXML */ TQDomDocument KDGanttView::saveXML( bool withPI ) const { // Create an inital DOM document TQString docstart = ""; TQDomDocument doc( "GanttView" ); doc.setContent( docstart ); if( withPI ) { TQDomProcessingInstruction pin = doc.createProcessingInstruction( "kdgantt", "version=\"1.0\" encoding=\"UTF-8\"" ) ; doc.appendChild ( pin ); } TQDomElement docRoot = doc.documentElement(); docRoot.setAttribute( "xmlns", "http://www.klaralvdalens-datakonsult.se/kdgantt" ); docRoot.setAttribute( "xmlns:xsi", "http://www.w3.org/2000/10/XMLSchema-instance" ); docRoot.setAttribute( "xsi:schemaLocation", "http://www.klaralvdalens-datakonsult.se/kdgantt" ); // the ShowLegend element KDGanttXML::createBoolNode( doc, docRoot, "ShowLegend", showLegend() ); // the ShowLegendButton element KDGanttXML::createBoolNode( doc, docRoot, "ShowLegendButton", showLegendButton() ); // the LegendIsDockWindow element KDGanttXML::createBoolNode( doc, docRoot, "LegendIsDockWindow", legendIsDockwindow() ); // the ShowListView element KDGanttXML::createBoolNode( doc, docRoot, "ShowListView", showListView() ); // the ShowHeader element KDGanttXML::createBoolNode( doc, docRoot, "ShowHeader", headerVisible() ); // the ShowTaskLinks element KDGanttXML::createBoolNode( doc, docRoot, "ShowTaskLinks", showTaskLinks() ); // the EditorEnabled element KDGanttXML::createBoolNode( doc, docRoot, "EditorEnabled", editorEnabled() ); // the global font element KDGanttXML::createFontNode( doc, docRoot, "GlobalFont", font() ); // the DisplayEmptyTasksAsLine element KDGanttXML::createBoolNode( doc, docRoot, "DisplayEmptyTasksAsLine", displayEmptyTasksAsLine() ); // the HorizonStart element KDGanttXML::createDateTimeNode( doc, docRoot, "HorizonStart", horizonStart() ); // the HorizonEnd element KDGanttXML::createDateTimeNode( doc, docRoot, "HorizonEnd", horizonEnd() ); // the Scale, MinimumScale, MaximumScale elements KDGanttXML::createStringNode( doc, docRoot, "Scale", scaleToString( scale() ) ); KDGanttXML::createStringNode( doc, docRoot, "MinimumScale", scaleToString( minimumScale() ) ); KDGanttXML::createStringNode( doc, docRoot, "MaximumScale", scaleToString( maximumScale() ) ); // the YearFormat element KDGanttXML::createStringNode( doc, docRoot, "YearFormat", yearFormatToString( yearFormat() ) ); // the HourFormat element KDGanttXML::createStringNode( doc, docRoot, "HourFormat", hourFormatToString( hourFormat() ) ); // the ShowMinorTicks element KDGanttXML::createBoolNode( doc, docRoot, "ShowMinorTicks", showMinorTicks() ); // the ShowMajorTicks element KDGanttXML::createBoolNode( doc, docRoot, "ShowMajorTicks", showMajorTicks() ); // the Editable element KDGanttXML::createBoolNode( doc, docRoot, "Editable", editable() ); // the TextColor element KDGanttXML::createColorNode( doc, docRoot, "TextColor", textColor() ); // the MajorScaleCount element KDGanttXML::createIntNode( doc, docRoot, "MajorScaleCount", majorScaleCount() ); // the MinorScaleCount element KDGanttXML::createIntNode( doc, docRoot, "MinorScaleCount", minorScaleCount() ); // the AutoScaleMinorTickCount element KDGanttXML::createIntNode( doc, docRoot, "AutoScaleMinorTickCount", autoScaleMinorTickCount() ); // the MinimumColumnWidth element KDGanttXML::createIntNode( doc, docRoot, "MinimumColumnWidth", minimumColumnWidth() ); // the GanttMaximumWidth element KDGanttXML::createIntNode( doc, docRoot, "GanttMaximumWidth", ganttMaximumWidth() ); // the NoInformationBrush element KDGanttXML::createBrushNode( doc, docRoot, "NoInformationBrush", noInformationBrush() ); // the GanttViewBackgroundColor element KDGanttXML::createColorNode( doc, docRoot, "GanttViewBackgroundColor", gvBackgroundColor() ); // the ListViewBackgroundColor element KDGanttXML::createColorNode( doc, docRoot, "ListViewBackgroundColor", lvBackgroundColor() ); // the TimeHeaderBackgroundColor element KDGanttXML::createColorNode( doc, docRoot, "TimeHeaderBackgroundColor", timeHeaderBackgroundColor() ); // the LegendHeaderBackgroundColor element KDGanttXML::createColorNode( doc, docRoot, "LegendHeaderBackgroundColor", legendHeaderBackgroundColor() ); // the WeekendBackgroundColor element KDGanttXML::createColorNode( doc, docRoot, "WeekendBackgroundColor", weekendBackgroundColor() ); // the WeekdayBackgroundColor elements for( int weekday = 1; weekday <= 7; weekday++ ) { TQColor color = weekdayBackgroundColor( weekday ); if( color.isValid() ) { TQDomElement weekendBackgroundColorElement = doc.createElement( "WeekdayBackgroundColor" ); docRoot.appendChild( weekendBackgroundColorElement ); KDGanttXML::createIntNode( doc, weekendBackgroundColorElement, "Day", weekday ); KDGanttXML::createColorNode( doc, weekendBackgroundColorElement, "Color", color ); } } // the WeekendDays element TQDomElement weekendDaysElement = doc.createElement( "WeekendDays" ); docRoot.appendChild( weekendDaysElement ); int weekendStart, weekendEnd; weekendDays( weekendStart, weekendEnd ); weekendDaysElement.setAttribute( "Start", weekendStart ); weekendDaysElement.setAttribute( "End", weekendStart ); // the ZoomFactor element KDGanttXML::createDoubleNode( doc, docRoot, "ZoomFactor", zoomFactor() ); // the ShowHeaderPopupMenu element KDGanttXML::createBoolNode( doc, docRoot, "ShowHeaderPopupMenu", showHeaderPopupMenu() ); // the ShowTimeTablePopupMenu element KDGanttXML::createBoolNode( doc, docRoot, "ShowTimeTablePopupMenu", showTimeTablePopupMenu() ); // the Shapes element TQDomElement tqshapesElement = doc.createElement( "Shapes" ); docRoot.appendChild( tqshapesElement ); TQDomElement tqshapesEventElement = doc.createElement( "Event" ); tqshapesElement.appendChild( tqshapesEventElement ); KDGanttViewItem::Shape start, middle, end; if( tqshapes( KDGanttViewItem::Event, start, middle, end ) ) { KDGanttXML::createStringNode( doc, tqshapesEventElement, "Start", KDGanttViewItem::tqshapeToString( start ) ); KDGanttXML::createStringNode( doc, tqshapesEventElement, "Middle", KDGanttViewItem::tqshapeToString( middle ) ); KDGanttXML::createStringNode( doc, tqshapesEventElement, "End", KDGanttViewItem::tqshapeToString( end ) ); } else { KDGanttXML::createStringNode( doc, tqshapesEventElement, "Start", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesEventElement, "Middle", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesEventElement, "End", "Undefined" ); } TQDomElement tqshapesTaskElement = doc.createElement( "Task" ); tqshapesElement.appendChild( tqshapesTaskElement ); if( tqshapes( KDGanttViewItem::Task, start, middle, end ) ) { KDGanttXML::createStringNode( doc, tqshapesTaskElement, "Start", KDGanttViewItem::tqshapeToString( start ) ); KDGanttXML::createStringNode( doc, tqshapesTaskElement, "Middle", KDGanttViewItem::tqshapeToString( middle ) ); KDGanttXML::createStringNode( doc, tqshapesTaskElement, "End", KDGanttViewItem::tqshapeToString( end ) ); } else { KDGanttXML::createStringNode( doc, tqshapesTaskElement, "Start", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesTaskElement, "Middle", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesTaskElement, "End", "Undefined" ); } TQDomElement tqshapesSummaryElement = doc.createElement( "Summary" ); tqshapesElement.appendChild( tqshapesSummaryElement ); if( tqshapes( KDGanttViewItem::Event, start, middle, end ) ) { KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "Start", KDGanttViewItem::tqshapeToString( start ) ); KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "Middle", KDGanttViewItem::tqshapeToString( middle ) ); KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "End", KDGanttViewItem::tqshapeToString( end ) ); } else { KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "Start", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "Middle", "Undefined" ); KDGanttXML::createStringNode( doc, tqshapesSummaryElement, "End", "Undefined" ); } // the Colors element TQDomElement colorsElement = doc.createElement( "Colors" ); docRoot.appendChild( colorsElement ); TQDomElement colorsEventElement = doc.createElement( "Event" ); colorsElement.appendChild( colorsEventElement ); TQColor startColor, middleColor, endColor; colors( KDGanttViewItem::Event, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, colorsEventElement, "Start", startColor ); KDGanttXML::createColorNode( doc, colorsEventElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, colorsEventElement, "End", endColor ); TQDomElement colorsTaskElement = doc.createElement( "Task" ); colorsElement.appendChild( colorsTaskElement ); colors( KDGanttViewItem::Task, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, colorsTaskElement, "Start", startColor ); KDGanttXML::createColorNode( doc, colorsTaskElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, colorsTaskElement, "End", endColor ); TQDomElement colorsSummaryElement = doc.createElement( "Summary" ); colorsElement.appendChild( colorsSummaryElement ); colors( KDGanttViewItem::Event, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, colorsSummaryElement, "Start", startColor ); KDGanttXML::createColorNode( doc, colorsSummaryElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, colorsSummaryElement, "End", endColor ); // the DefaultColor element TQDomElement defaultColorsElement = doc.createElement( "DefaultColors" ); docRoot.appendChild( defaultColorsElement ); KDGanttXML::createColorNode( doc, defaultColorsElement, "Event", defaultColor( KDGanttViewItem::Event ) ); KDGanttXML::createColorNode( doc, defaultColorsElement, "Task", defaultColor( KDGanttViewItem::Task ) ); KDGanttXML::createColorNode( doc, defaultColorsElement, "Summary", defaultColor( KDGanttViewItem::Summary ) ); // the HighlightColors element TQDomElement highlightColorsElement = doc.createElement( "HighlightColors" ); docRoot.appendChild( highlightColorsElement ); TQDomElement highlightColorsEventElement = doc.createElement( "Event" ); highlightColorsElement.appendChild( highlightColorsEventElement ); highlightColors( KDGanttViewItem::Event, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, highlightColorsEventElement, "Start", startColor ); KDGanttXML::createColorNode( doc, highlightColorsEventElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, highlightColorsEventElement, "End", endColor ); TQDomElement highlightColorsTaskElement = doc.createElement( "Task" ); highlightColorsElement.appendChild( highlightColorsTaskElement ); highlightColors( KDGanttViewItem::Task, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, highlightColorsTaskElement, "Start", startColor ); KDGanttXML::createColorNode( doc, highlightColorsTaskElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, highlightColorsTaskElement, "End", endColor ); TQDomElement highlightColorsSummaryElement = doc.createElement( "Summary" ); highlightColorsElement.appendChild( highlightColorsSummaryElement ); highlightColors( KDGanttViewItem::Event, startColor, middleColor, endColor ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Start", startColor ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "End", endColor ); /* if( highlightColors( KDGanttViewItem::Event, startColor, middleColor, endColor ) ) { KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Start", startColor ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Middle", middleColor ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "End", endColor ); } else { KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Start", TQColor() ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "Middle", TQColor() ); KDGanttXML::createColorNode( doc, highlightColorsSummaryElement, "End", TQColor() ); } */ // the DefaultHighlightColor element TQDomElement defaultHighlightColorsElement = doc.createElement( "DefaultHighlightColors" ); docRoot.appendChild( defaultHighlightColorsElement ); KDGanttXML::createColorNode( doc, defaultHighlightColorsElement, "Event", defaultHighlightColor( KDGanttViewItem::Event ) ); KDGanttXML::createColorNode( doc, defaultHighlightColorsElement, "Task", defaultHighlightColor( KDGanttViewItem::Task ) ); KDGanttXML::createColorNode( doc, defaultHighlightColorsElement, "Summary", defaultHighlightColor( KDGanttViewItem::Summary ) ); // the Items element TQDomElement itemsElement = doc.createElement( "Items" ); docRoot.appendChild( itemsElement ); KDGanttViewItem* currentItem = firstChild(); while( currentItem ) { currentItem->createNode( doc, itemsElement ); currentItem = currentItem->nextSibling(); } // the TaskLinks element TQDomElement taskLinksElement = doc.createElement( "TaskLinks" ); docRoot.appendChild( taskLinksElement ); TQPtrList taskLinkList = taskLinks(); KDGanttViewTaskLink* currentTL = 0; for( currentTL = taskLinkList.first(); currentTL; currentTL = taskLinkList.next() ) currentTL->createNode( doc, taskLinksElement ); // the TaskLinkGroups element TQDomElement taskLinkGroupsElement = doc.createElement( "TaskLinkGroups" ); docRoot.appendChild( taskLinkGroupsElement ); TQPtrList taskLinkGroupList = taskLinkGroups(); KDGanttViewTaskLinkGroup* currentTLG = 0; for( currentTLG = taskLinkGroupList.first(); currentTLG; currentTLG = taskLinkGroupList.next() ) currentTLG->createNode( doc, taskLinkGroupsElement ); // the ColumnBackgroundColors element TQDomElement columnBackgroundColorsElement = doc.createElement( "ColumnBackgroundColors" ); docRoot.appendChild( columnBackgroundColorsElement ); KDTimeHeaderWidget::ColumnColorList ccList = myTimeHeader->columnBackgroundColorList(); for( KDTimeHeaderWidget::ColumnColorList::iterator it = ccList.begin(); it != ccList.end(); ++it ) { TQDomElement columnBackgroundColorElement = doc.createElement( "ColumnBackgroundColor" ); columnBackgroundColorsElement.appendChild( columnBackgroundColorElement ); KDGanttXML::createDateTimeNode( doc, columnBackgroundColorElement, "DateTime", (*it).datetime ); KDGanttXML::createColorNode( doc, columnBackgroundColorElement, "Color", (*it).color ); } // the LegendItems element TQDomElement legendItemsElement = doc.createElement( "LegendItems" ); docRoot.appendChild( legendItemsElement ); legendItem* current; TQPtrListIterator lit( *myLegendItems ); while( ( current = lit.current() ) ) { ++lit; TQDomElement legendItemElement = doc.createElement( "LegendItem" ); legendItemsElement.appendChild( legendItemElement ); KDGanttXML::createStringNode( doc, legendItemElement, "Shape", KDGanttViewItem::tqshapeToString( current->tqshape ) ); KDGanttXML::createColorNode( doc, legendItemElement, "Color", current->color ); KDGanttXML::createStringNode( doc, legendItemElement, "Text", current->text ); } // the DragEnabled element KDGanttXML::createBoolNode( doc, docRoot, "DragEnabled", isDragEnabled() ); // the DropEnabled element KDGanttXML::createBoolNode( doc, docRoot, "DropEnabled", isDropEnabled() ); // the CalendarMode element KDGanttXML::createBoolNode( doc, docRoot, "CalendarMode", calendarMode() ); return doc; } TQString KDGanttView::scaleToString( Scale scale ) { switch( scale ) { case Minute: return "Minute"; case Hour: return "Hour"; case Day: return "Day"; case Week: return "Week"; case Month: return "Month"; case Auto: return "Auto"; } return ""; } KDGanttView::Scale KDGanttView::stringToScale( const TQString& string ) { if( string == "Minute" ) return Minute; else if( string == "Hour" ) return Hour; else if( string == "Day" ) return Day; else if( string == "Week" ) return Week; else if( string == "Month" ) return Month; else if( string == "Auto" ) return Auto; return Auto; } TQString KDGanttView::yearFormatToString( YearFormat format ) { switch( format ) { case FourDigit: return "FourDigit"; case TwoDigit: return "TwoDigit"; case TwoDigitApostrophe: return "TwoDigitApostrophe"; case NoDate: return "NoDate"; } return ""; } KDGanttView::YearFormat KDGanttView::stringToYearFormat( const TQString& string ) { if( string == "FourDigit" ) return FourDigit; else if( string == "TwoDigit" ) return TwoDigit; else if( string == "TwoDigitApostrophe" ) return TwoDigitApostrophe; else if( string == "NoDate" ) return NoDate; else return FourDigit; } TQString KDGanttView::hourFormatToString( HourFormat format ) { switch( format ) { case Hour_12: return "Hour_12"; case Hour_24: return "Hour_24"; case Hour_24_FourDigit: return "Hour_24_FourDigit"; } return ""; } KDGanttView::HourFormat KDGanttView::stringToHourFormat( const TQString& string ) { if( string == "Hour_12" ) return Hour_12; else if( string == "Hour_24" ) return Hour_24; else return Hour_24; } void KDGanttView::addTaskLinkGroup(KDGanttViewTaskLinkGroup* group) { if (myTaskLinkGroupList.isEmpty()) { myTaskLinkGroupList.append(group); return; } if (myTaskLinkGroupList.find(group) == -1) myTaskLinkGroupList.append(group); } void KDGanttView::removeTaskLinkGroup(KDGanttViewTaskLinkGroup* group) { myTaskLinkGroupList.remove(group); } /*! This slot is called when a new item has been added to the Gantt view. It will show the item attribute dialog in case the item is editable. \a item is a pointer to the item that has been created. */ void KDGanttView::editItem( KDGanttViewItem* item) { if ( ! item ) return; if ( editorEnabled() ) { if ( item->editable() ) { myItemAttributeDialog->reset( item ); myItemAttributeDialog->show(); } } } /*! This method returns the pixmap used for a certain tqshape, in the selected color and size. \param tqshape the tqshape to generate \param tqshapeColor the foreground color of the tqshape \param backgroundColor the background color of the tqshape \param itemSize the size of the tqshape \return the generated tqshape pixmap */ TQPixmap KDGanttView::getPixmap( KDGanttViewItem::Shape tqshape, const TQColor& tqshapeColor, const TQColor& backgroundColor, int itemSize) { // 10 is a good value as size int size = itemSize+2; int hei = ( itemSize/3 ) / 2; TQPixmap p = TQPixmap( size+4, size+4 ); p.fill( backgroundColor ); TQPainter paint (&p); TQBrush b = TQBrush ( Qt::SolidPattern ); b.setColor( tqshapeColor ); paint.setBrush( b ); TQPen pen( Qt::black, 1 ) ; paint.setPen( pen ); switch (tqshape) { case KDGanttViewItem::TriangleDown:{ TQPointArray arr = TQPointArray(3); arr.setPoint(0,-size/2,-hei); arr.setPoint(1,size/2,-hei); arr.setPoint(2,0,((size/2)-hei)); arr.translate( ( size/2 ) +2 , ( size/2 ) +2); paint.drawPolygon( arr ); break; } case KDGanttViewItem::TriangleUp :{ TQPointArray arr = TQPointArray(3); arr.setPoint(0,-size/2,hei); arr.setPoint(1,size/2,hei); arr.setPoint(2,0,(-size/2)+hei); arr.translate( ( size/2 ) +2 , ( size/2 ) +2); paint.drawPolygon( arr ); break; } case KDGanttViewItem::Diamond :{ TQPointArray arr = TQPointArray(4); arr.setPoint(0,0,-size/2); arr.setPoint(1,size/2,0); arr.setPoint(2,0,size/2); arr.setPoint(3,-size/2,0); arr.translate( ( size/2 ) +2 , ( size/2 ) +2); paint.drawPolygon( arr ); break; } case KDGanttViewItem::Square :{ TQPointArray arr = TQPointArray(4); arr.setPoint(0,-size/2,-size/2); arr.setPoint(1,size/2,-size/2); arr.setPoint(2,size/2,size/2); arr.setPoint(3,-size/2,size/2); arr.translate( ( size/2 ) +2 , ( size/2 ) +2); paint.drawPolygon( arr ); break; } case KDGanttViewItem::Circle :{ paint.drawEllipse( 2, 2, size, size); break; } } paint.end(); return p; } int KDGanttView::getIndex( KDGanttViewItem::Type type) const { int index = -1; switch (type) { case (KDGanttViewItem::Event): index = 0; break; case (KDGanttViewItem::Task): index = 1; break; case (KDGanttViewItem::Summary): index = 2; break; } return index; } void KDGanttView::initDefaults() { int i; // We have 3 item types. Set all undefined to true. for (i = 0;i<3;++i) { undefinedShape[i] = true; undefinedColor[i] = true; undefinedColorHL[i] = true; } // setting the default colors myDefaultColor [ getIndex( KDGanttViewItem::Event ) ] = Qt::blue; //event myDefaultColorHL [ getIndex( KDGanttViewItem::Event ) ] = Qt::red; myDefaultColor [ getIndex( KDGanttViewItem::Task ) ] = Qt::green;//task myDefaultColorHL [ getIndex( KDGanttViewItem::Task ) ] = Qt::red; myDefaultColor [ getIndex( KDGanttViewItem::Summary ) ] = Qt::cyan;//summary myDefaultColorHL [ getIndex( KDGanttViewItem::Summary ) ] = Qt::red; // setting the default tqshape types // currently, we take for each item for all three tqshapes (start, middle, end) the same default tqshape for (i = 0;i<3;++i) { myDefaultShape [3*getIndex( KDGanttViewItem::Event )+ i] = KDGanttViewItem::Diamond; //event myDefaultShape [3*getIndex( KDGanttViewItem::Task ) +i] = KDGanttViewItem::Square; //task myDefaultShape [3*getIndex( KDGanttViewItem::Summary ) +i] = KDGanttViewItem::TriangleDown; //summary } } /*! Calls to this method are passed through to the underlying \a TQListView. */ int KDGanttView::addColumn( const TQString& label, int width ) { return myListView->addColumn( label, width ); } /*! Calls to this method are passed through to the underlying \a TQListView. */ int KDGanttView::addColumn( const TQIconSet& iconset, const TQString& label, int width ) { return myListView->addColumn( iconset, label, width ); } /*! Calls to this method are passed through to the underlying \a TQListView. */ void KDGanttView::removeColumn( int index ) { myListView->removeColumn( index ); } /*! Calls to this method are passed through to the underlying \a TQListView. */ KDGanttViewItem* KDGanttView::selectedItem() const { return static_cast( myListView->selectedItem() ); } /*! Calls to this method are passed through to the underlying \a TQListView. */ void KDGanttView::setSelected( KDGanttViewItem* item, bool selected ) { myListView->setSelected( item, selected ); } /*! Returns the pointer to the Gantt item with the name \a name. If no item is found, the return value is 0. If there is more than one item with the same name in the Gantt view, the first item found will be returned. This may not necessarily be the first item in the listview. \param name the name of the Gantt item \return the pointer to the item with name \a name. O, if there is no item in the Gantt view with this name. */ KDGanttViewItem* KDGanttView::getItemByName( const TQString& name ) const { KDGanttViewItem* temp = firstChild(),* ret; while (temp != 0) { if ( (ret = temp->getChildByName( name ) ) ) return ret; temp = temp->nextSibling(); } return 0; } /*! Returns the pointer to the Gantt item at the position \a pos in the list view. The position \a pos is a global position. If no item is found, 0 is returned. \param pos the (global) position of the Gantt item \return the pointer to the item with position \a pos. O, if there is no item in the list view at this position. */ KDGanttViewItem* KDGanttView::getItemByListViewPos( const TQPoint& pos ) const { return static_cast( myListView->itemAt(myListView->mapFromGlobal(pos) )); } /*! Returns the pointer to the Gantt item at the position \a pos in the Gantt view. The position \a pos is a global position. If no items are found, or the item is disabled, 0 is returned. If there is more than one item with the same position in the Gantt view, the first item found will be returned. This is not necessarily the first item in the listview. \param pos the (global) position of the Gantt item \return the pointer to the item with position \a pos. O, if there is no item in the Gantt view at this position. */ KDGanttViewItem* KDGanttView::getItemByGanttViewPos( const TQPoint& pos ) const { KDGanttViewItem* item; TQPoint local = myCanvasView->mapFromGlobal(pos); TQCanvasItemList il = myTimeTable->collisions( myCanvasView->viewportToContents( local )); TQCanvasItemList::Iterator it; for ( it = il.begin(); it != il.end(); ++it ) { if ( myCanvasView->getType(*it) == Type_is_KDGanttViewItem) { item = myCanvasView->getItem(*it); if ( item->enabled() ) return item; } } return 0; } /*! Returns the pointer to the Gantt item at the position \a pos in the list view part of the Gantt view. The position \a pos is a global position if parameter \a global is true. If the vertical part (y coordinate) of \a pos (mapped to local coordinates) is less than 0 or larger than the height of the listview, 0 is returned. The horizontal part (x coordinate) of \a pos is ignored. \param pos the position of the Gantt item \param global if true, pos is assumed to be global \return the pointer to the item with position \a pos. O, if there is no item in the Gantt view at this position. */ KDGanttViewItem* KDGanttView::getItemAt( const TQPoint& pos, bool global ) const { /* buggy code - commented out TQPoint myPos; if ( global ) myPos = myListView->contentsToViewport( myListView->mapFromGlobal(pos) ); else myPos = myListView->contentsToViewport( pos ); return (KDGanttViewItem*) myListView->itemAt( myPos ); */ KDGanttViewItem* item; KDGanttViewItem* retItem = 0; int y; if ( global ) y = myCanvasView->mapFromGlobal(pos).y(); else y = pos.y(); item = firstChild(); while ( item != 0 ) { int yc = item->itemPos(); if ( yc <= y && y < yc + item->height()) { retItem = item; break; } item = item->itemBelow(); } return retItem; } void KDGanttView::addTickRight() { if ( !mFixedHorizon && _enableAdding && myCanvasView->horizontalScrollBar()->value() == myCanvasView->horizontalScrollBar()->maxValue()) { //myCanvasView->horizontalScrollBar()->blockSignals( true ); myTimeHeader->addTickRight(); //myCanvasView->horizontalScrollBar()->blockSignals( false ); myCanvasView->updateHorScrollBar(); setTimelineToEnd(); } } void KDGanttView::addTickLeft() { if ( !mFixedHorizon && _enableAdding && myCanvasView->horizontalScrollBar()->value() == 0 ) { myCanvasView->horizontalScrollBar()->blockSignals( true ); myTimeHeader->addTickLeft(); myCanvasView->horizontalScrollBar()->blockSignals( false ); setTimelineToStart(); } } void KDGanttView::enableAdding( int val ) { _enableAdding = ( val == 0 || val == myCanvasView->horizontalScrollBar()->maxValue()); } /*! Returns the number of items in the Gantt view. \return the number of items in the Gantt view. */ int KDGanttView::childCount() const { return myListView->childCount(); } /*! Removes all items from the Gantt view. */ void KDGanttView::clear() { bool block = myTimeTable->blockUpdating(); myTimeTable->setBlockUpdating( true ); myListView->clear(); myTimeTable->setBlockUpdating( false ); myTimeTable->updateMyContent(); myTimeTable->setBlockUpdating( block ); } /*! Passes on the signal from the list view. */ void KDGanttView::slot_lvDropped(TQDropEvent* e, KDGanttViewItem* droppedItem, KDGanttViewItem* itemBelowMouse ) { emit dropped( e, droppedItem, itemBelowMouse); } /*! Implements a pass-through to the list view. */ TQDragObject * KDGanttView::dragObject () { return myListView->dragObject (); } /*! Implements a pass-through to the list view. */ void KDGanttView::startDrag () { //myListView->pt_startDrag (); } /*! This method is overridden for internal purposes. */ void KDGanttView::setPaletteBackgroundColor( const TQColor& col) { TQWidget::setPaletteBackgroundColor( col ); timeHeaderSpacerWidget->setPaletteBackgroundColor( col ); } /*! Sets the background color of the Gantt view. \param c the background color of the Gantt view. \sa gvBackgroundColor() */ void KDGanttView::setGvBackgroundColor ( const TQColor & c ) { myTimeTable->setBackgroundColor( c ); } /*! Sets the background color of the time header. \param c the background color of the time header. \sa timeHeaderBackgroundColor() */ void KDGanttView::setTimeHeaderBackgroundColor ( const TQColor & c ) { myTimeHeader->setPaletteBackgroundColor( c ); //rightWidget->setPaletteBackgroundColor( c ); timeHeaderSpacerWidget->setPaletteBackgroundColor( c ); } /*! Sets the background color of the legend header. \param c the background color of the legend header \sa legendHeaderBackgroundColor() */ void KDGanttView::setLegendHeaderBackgroundColor ( const TQColor & c ) { myLegend->setPaletteBackgroundColor( c ); leftWidget->setPaletteBackgroundColor( c ); } /*! Sets the background color of the list view. \param c the background color of the list view \sa lvBackgroundColor() */ void KDGanttView::setLvBackgroundColor ( const TQColor & c ) { myListView->viewport()->setPaletteBackgroundColor( c ); } /*! Returns the background color of the list view. \return the background color of the list view \sa setLvBackgroundColor() */ TQColor KDGanttView::lvBackgroundColor ( )const { return myListView->viewport()->paletteBackgroundColor( ); } /*! Returns the background color of the Gantt view. \return the background color of the Gantt view \sa setGvBackgroundColor() */ TQColor KDGanttView::gvBackgroundColor () const { return myTimeTable->backgroundColor( ); } /*! Returns the background color of the time header. \return the background color of the time header \sa setTimeHeaderBackgroundColor() */ TQColor KDGanttView::timeHeaderBackgroundColor () const { return myTimeHeader->paletteBackgroundColor( ); } /*! Returns the background color of the legend header. \return the background color of the legend header \sa setLegendHeaderBackgroundColor() */ TQColor KDGanttView::legendHeaderBackgroundColor () const { return myLegend->paletteBackgroundColor( ); } /*! Adds a widget to the spacer widget above the list view part and below the ShowLegendButton. To assign all the space above the Listview to the spacer widget, hide the ShowLegendButton by calling setShowLegendButton( false ). The spacer widget is a TQHBox. You may add as many widgets as you want. They are ordered horizontally from left to right. To remove a widget from the spacer widget, call widget->reparent(newParent,...) or delete the widget. Since the spacer is a TQHBox, the tqlayout of the added widgets is managed by this TQHBox. \param w A pointer to the widget to be added. \sa setShowLegendButton( ) */ void KDGanttView::addUserdefinedLegendHeaderWidget( TQWidget * w ) { if ( w ) { w->reparent ( spacerLeft, 0, TQPoint(0,0) ); } } /*! Specifies whether drag operations are allowed in the Gantt view. Recurses over all items contained in the Gantt view and enables or disabled them for dragging. \param b true if dragging is enabled, false if dragging is disabled \sa isDragEnabled(), setDropEnabled(), isDropEnabled(), setDragDropEnabled() */ void KDGanttView::setDragEnabled( bool b ) { fDragEnabled = b; TQListViewItemIterator it( myListView ); for ( ; it.current(); ++it ) { (( KDGanttViewItem* )it.current())->setDragEnabled(b); } } /*! Specifies whether drop operations are allowed in the Gantt view. Recurses over all items contained in the Gantt view and enables or disabled them for dropping. \param b true if dragging is enabled, false if dragging is disabled \sa setDropEnabled(), setDragEnabled(), isDragEnabled(), setDragDropEnabled() */ void KDGanttView::setDropEnabled( bool b ) { fDropEnabled = b; //myListView->setAcceptDrops( b ); TQListViewItemIterator it( myListView ); for ( ; it.current(); ++it ) { (( KDGanttViewItem* )it.current())->setDropEnabled(b); } } /*! Combines setDragEnabled() and setDropEnabled() in one convenient method. \param b true if dragging and dropping are enabled, false if dragging and dropping are disabled \sa setDragEnabled(), setDropEnabled() */ void KDGanttView::setDragDropEnabled( bool b ) { setDropEnabled( b ); setDragEnabled( b ); } /*! Returns whether dragging is enabled for this Gantt view. \return true if dragging is enabled \sa setDragEnabled(), setDragDropEnabled() */ bool KDGanttView::isDragEnabled() const { return fDragEnabled; } /*! Returns whether dropping is enabled for this Gantt view. \return true if dropping is enabled \sa setDropEnabled(), setDragDropEnabled() */ bool KDGanttView::isDropEnabled() const { return fDropEnabled; } /*! \deprecated Use isDragEnabled() instead */ bool KDGanttView::dragEnabled() const { return isDragEnabled(); } /*! \deprecated Use isDropEnabled() instead */ bool KDGanttView::dropEnabled() const { return isDropEnabled(); } /*! This virtual method makes it possible to specify user-defined drop handling. The method is called directly before the internal drop handling is executed. Return false to execute internal drop handling. Return true to not execute internal drop handling. In order to specify user-defined drop handling, subclass KDGanttView and reimplement this method. \param e The QDropEvent Note: e->source() is a pointer to the KDGanttView from which the drag started. I.e., if e->source() == this, this drag is an internal drag. \param droppedItem 0, if this is a drag operation from another KDGanttView instance. If this drag is an internal drag (i.e., within the KDGanttView), this parameter points to the dropped item. \param itemBelowMouse a pointer to the item below the dragged item (i.e., below the mouse). If you accept, the dragged item may be inserted in the KDGanttView as a child of this item. The value is 0 if there is no item below the dragged item, and the dragged item will be inserted as a root item. \return false, when the internal drop handling should be executed true, when the internal drop handling should not be executed \sa lvDropEvent(), lvStartDrag() */ bool KDGanttView::lvDropEvent ( TQDropEvent* e, KDGanttViewItem* droppedItem, KDGanttViewItem* itemBelowMouse ) { Q_UNUSED( e ); Q_UNUSED( droppedItem ); Q_UNUSED( itemBelowMouse ); // Example code for user defined behaviour: // we want to accept the usual drags and the drags of files, which may be // a saved Gantt file. // Please uncomment the following lines for this behaviour // You have to uncomment lines in lvDragMoveEvent() and llvDragEnterEvent() as well // ************** begin example ************ /* if ( TQUriDrag::canDecode( e ) ) { TQStrList lst; TQUriDrag::decode( e, lst ); // we try the first file of icon-url-list TQString str = lst.at ( 0 ); // remove file: at beginning of string str = str.right( str.length() - 5 ); TQFileInfo info; info.setFile( str ) ; if ( info.isFile() ) { if (!TQMessageBox::information( this, "KDGantt Drag&Drop test", "Try to insert file: "+ str + " ?", "&Okay", "&Cancel",0,1 ) ) { TQFile file( str ); // store current updating status bool uen = myTimeTable->blockUpdating(); // block updating while insertion of items myTimeTable->setBlockUpdating(); loadProject( &file ) ; // restore updating status and execute an update via setUpdateEnabled( true ); if ( !uen ) setUpdateEnabled( true ); } } return true; } */ // *********** end example **************** return false; } /*! This virtual method specifies whether a drag enter event may be accepted or not. To accept a drag enter event, call e->accept( true ); To not accept a drag enter evente, call e->accept( false ); This method does nothing but accepting the drag enter event, in case decoding is possible. In order to define accepting drops for particular items yourself, subclass KDGanttView and reimplement this method. \param e The QDragMoveEvent Note: e->source() is a pointer to the KDGanttView, the drag started from. I.e., if e->source() == this, this drag is an internal drag. \sa lvDropEvent(), lvStartDrag(), lvDragMoveEvent() */ void KDGanttView::lvDragEnterEvent ( TQDragEnterEvent * e) { // the standard behaviour: // accept drag enter events, if KDGanttViewItemDrag can decode the event // e->accept(KDGanttViewItemDrag::canDecode(e) ); if ( KDGanttViewItemDrag::canDecode(e) ) { e->accept( true); return; } // example code for user defined behaviour: // we want to accecpt the usual drags and the drags of files, which may be // a saved Gantt file // Please uncomment the following lines for this behaviour // You have to uncomment lines in lvDragMoveEvent() and lvDropEvent () as well // if ( TQUriDrag::canDecode( e ) ) { // e->accept(true); // return; // } e->accept( false ); } /*! This virtual method specifies whether a drop event may be accepted or not. To accept a drop event, call e->accept( true ); To not accept a drop event, call e->accept( false ); This method does nothing but allowing to execute the internal drag move event handling. In order to specify user-defined drop acceptance for particular items, subclass KDGanttView and reimplement this method. \param e The QDragMoveEvent Note: e->source() is a pointer to the KDGanttView, the drag started from. I.e. if e->source() == this, this drag is an internal drag. draggedItem 0, if this is a drag operation from another KDGanttView instance. If this drag is an internal drag (i.e., within the KDGanttView), this parameter points to the dragged item. itemBelowMouse a pointer to the item below the dragged item (i.e., below the mouse). If you accept the drop, the dragged item will be inserted in the KDGanttView as a child of this item. The value is 0 if there is no item below the dragged item, and the dragged item will be inserted as a root item. \return false, when the internal drag move event handling should be executed true, when the internal drag move event handling should not be executed; usually you should return true, if you have called e->accept( true ) before. \sa lvDropEvent(), lvStartDrag() */ bool KDGanttView::lvDragMoveEvent ( TQDragMoveEvent* /*e*/, KDGanttViewItem* /* draggedItem*/, KDGanttViewItem* /*itemBelowMouse*/) { // Example code 1: // To generally block items to be inserted as root items, subclass KDGanttView // and reimplement this method with to following code uncommented: // if ( !itemBelowMouse ) { // e->accept( false ); // return true; //} //return false; // Example code 2: // To allow the drags of files, which may be // a saved Gantt file, subclass KDGanttView // and reimplement this method with to following code uncommented: // if ( TQUriDrag::canDecode( e ) ) { // e->accept(true); // return true; // } // normal behaviour - the internal drag move event handling should be executed return false; } /*! This virtual method creates a TQDragObject and starts a drag for a KDGanttViewItem. In order to prevent drags of particular items, subclass from KDGanttView and reimplement this method. \param item the KDGanttViewItem, which should be dragged \sa lvDropEvent(), lvDragMoveEvent() */ void KDGanttView::lvStartDrag (KDGanttViewItem* item) { TQDragObject* d = new KDGanttViewItemDrag(item, this, "itemdrag" ); // call d->drag() to start the dragging // d->drag() returns true, if a move was requested as a drag // if a copy (by pressing the -key) was performed, d->drag() returns false // In order to avoid starting drags for particular items, subclass KDGanttView // an reimplement this method. // insert here some code like // if ( item->parent() ) // return; // This particular code will make it impossible to drag other items but root items. if ( d->drag() ) { delete item; } } /*! Sets the width of the list view. Space will be taken from or given to the Gantt view. \param w the width of the list view \sa listViewWidth() */ void KDGanttView::setListViewWidth( int w ) { int sw = mySplitter->width(); TQValueList list; list.append(w); list.append(sw-w); mySplitter->setSizes( list ); } /*! Returns the width of the list view. \return the width of the list view \sa setListViewWidth() */ int KDGanttView::listViewWidth( ) { return leftWidget->width(); } /*! Sets the scrollbar mode of the listview. The default is always off. Possible values are always on, always off and auto. It only makes sense to set this to always off if setGvVScrollBarMode() is set to always on. \param m the scrollbar mode. \sa setGvVScrollBarMode( ) */ void KDGanttView::setLvVScrollBarMode( TQScrollView::ScrollBarMode m ) { myListView->setVScrollBarMode ( m ); } /*! Sets the scrollbar mode of the time table. The default is always on. Possible values are always on and always off. It only makes sense to set this to always off if setLvVScrollBarMode() is set to always on or auto. \param m The scrollbar mode. \sa setLvVScrollBarMode( ) */ void KDGanttView::setGvVScrollBarMode( TQScrollView::ScrollBarMode m ) { if ( m == TQScrollView::Auto ) qDebug("KDGanttView::setListViewVScrollBarMode: TQScrollView::Auto not supported. Nothing changed. "); else { myCanvasView->setVScrollBarMode ( m ); if ( m == TQScrollView::AlwaysOn ) timeHeaderSpacerWidget->setFixedWidth(myCanvasView->verticalScrollBar()->width() ); else timeHeaderSpacerWidget->setFixedWidth( 0 ); } } void KDGanttView::notifyEditdialog( KDGanttViewItem * item) { if (myItemAttributeDialog->getItem() == item ) { myItemAttributeDialog->reset( 0 ); } } /*! \fn void KDGanttView::setLinkItemsEnabled( bool on ); This enables/disables the linking ui of KDGanttViewItems in KDGanttView. A signal linkItems() is emitted when two items shall be linked and can be used to create the actual link. */ void KDGanttView::setLinkItemsEnabled(bool on) { myCanvasView->linkItemsEnabled = on; myCanvasView->autoScrollEnabled = true; } /*! \fn void KDGanttView::isLinkItemsEnabled(); Returns if the linking functionallity is enabled or disabled. */ bool KDGanttView::isLinkItemsEnabled() const { return myCanvasView->linkItemsEnabled; } /*! \fn void KDGanttView::timeIntervalSelected( const TQDateTime& start, const TQDateTime& end); This signal is emitted when the user selects a time interval with the mouse on the time header connect this signal to the slot void zoomToSelection( const TQDateTime& start, const TQDateTime& end) to obtain automatic zooming. */ /*! \fn void KDGanttView::timeIntervallSelected( const TQDateTime& start, const TQDateTime& end); \deprecated This signal is deprecated, do not use it in new code; use timeIntervalSelected() instead. timeIntervallSelected() will be removed in future versions. */ /*! \fn void KDGanttView::rescaling( Scale ) This signal is emitted if another scale is choosen than the specified one: i.e. if the horizon has a very wide range from start to end and as scale is choosen minute it may be that the size of the Gantt widget would become more than 32000 pixels. In this case the scale is automatically changed to Hour and rescaling( Hour ) is emitted. If the widget size would be still more than 32000 pixels, the scale is automatically changed to day and rescaling( Day ) is emitted. In the new scale, the minortickcount is increased such that the horizon will fit in the maximum size of 32000 pixels. */ /*! \fn void KDGanttView::gvCurrentChanged( KDGanttViewItem* item ) This signal is emitted whenever the user clicks on the Gantt view \a item parameter is 0, if no item was clicked */ /*! \fn void KDGanttView::gvItemLeftClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the Gantt view with the left mouse button. */ /*! \fn void KDGanttView::gvItemMidClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the Gantt view with the middle mouse button. */ /*! \fn void KDGanttView::gvItemRightClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the Gantt view with the right mouse button. */ /*! \fn void KDGanttView::gvMouseButtonClicked ( int button, KDGanttViewItem* item, const TQPoint & pos) This signal is emitted when the user clicks into the Gantt view with any mouse button. Notice that \a pos is the absolute mouse position. */ /*! \fn void KDGanttView::gvItemDoubleClicked( KDGanttViewItem* ) This signal is emitted whenever the user double-clicks into the Gantt view. */ /*! \fn void KDGanttView::gvContextMenuRequested ( KDGanttViewItem * item, const TQPoint & pos ) This signal is emitted when the user requests a context menu in the Gantt view. Notice that \a pos is the absolute mouse position. */ /*! \fn void KDGanttView::linkItems ( KDGanttViewItem* from, KDGanttViewItem* to, int linkType ) This signal is emitted when the user wants to link two items in the Gantt view. */ /*! \fn void KDGanttView::lvCurrentChanged( KDGanttViewItem* item ) This signal is emitted whenever the user clicks on the list view \a item parameter is 0, if no item was clicked */ /*! \fn void KDGanttView::lvItemLeftClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the list view with the left mouse button. */ /*! \fn void KDGanttView::lvItemMidClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the list view with the middle mouse button. */ /*! \fn void KDGanttView::lvItemRightClicked( KDGanttViewItem* ) This signal is emitted whenever the user clicks into the list view with the right mouse button. */ /*! \fn void KDGanttView::lvMouseButtonPressed ( int button, KDGanttViewItem* item, const TQPoint & pos, int col) This signal is emitted when the user presses any mouse button in the list view. Notice that \a pos is the absolute mouse position. */ /*! \fn void KDGanttView::lvMouseButtonClicked ( int button, KDGanttViewItem* item, const TQPoint & pos, int col) This signal is emitted when the user clicks into the list view with any mouse button . Notice that \a pos is the absolute mouse position. */ /*! \fn void KDGanttView::lvItemDoubleClicked( KDGanttViewItem* ) This signal is emitted whenever the user double-clicks into the list view. */ /*! \fn void KDGanttView::lvItemRenamed( KDGanttViewItem*, int col, const TQString& text ) This signal is emitted whenever the user changes the name of an item in the list view using in-place editing. \a text tqcontains the new text in the list view. */ /*! \fn void KDGanttView::lvContextMenuRequested( KDGanttViewItem * item, const TQPoint & pos, int col ) This signal is emitted when the user requests a context menu in the list view. Notice that \a pos is the absolute mouse position. */ /*! \fn void KDGanttView::lvSelectionChanged( KDGanttViewItem* ) This signal is emitted whenever the user changes the selection in the list view. */ /*! \fn void KDGanttView::dropped ( TQDropEvent * e, KDGanttViewItem* droppedItem, KDGanttViewItem* itemBelowMouse) This signal is emitted whenever a Gantt item is dropped onto the Gantt view. \a droppedItem is 0, if this is a drag operation from another KDGanttView instance. If this drag is an internal drag (i.e. within the KDGanttView), this parameter points to the dropped item. \a itemBelowMouse is a pointer to the item below the dragged item (i.e., below the mouse). The dragged item may be inserted in the KDGanttView as a child of this item. If The value is 0, if there is no item below the dragged item, and the dragged item will be inserted as a root item. In order to get user-defined behavior for drop events, reimplement KDGanttView::lvDropEvent() */ /*! \enum KDGanttView::RepaintMode Please see setRepaintMode() for a description of the values of this enumeration. */