kdgantt

KDGanttViewItem.cpp

00001 /* -*- Mode: C++ -*-
00002    $Id$
00003    KDGantt - a multi-platform charting engine
00004 */
00005 
00006 /****************************************************************************
00007  ** Copyright (C)  2002-2004 Klarälvdalens Datakonsult AB.  All rights reserved.
00008  **
00009  ** This file is part of the KDGantt library.
00010  **
00011  ** This file may be distributed and/or modified under the terms of the
00012  ** GNU General Public License version 2 as published by the Free Software
00013  ** Foundation and appearing in the file LICENSE.GPL included in the
00014  ** packaging of this file.
00015  **
00016  ** Licensees holding valid commercial KDGantt licenses may use this file in
00017  ** accordance with the KDGantt Commercial License Agreement provided with
00018  ** the Software.
00019  **
00020  ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00021  ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00022  **
00023  ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for
00024  **   information about KDGantt Commercial License Agreements.
00025  **
00026  ** Contact info@klaralvdalens-datakonsult.se if any conditions of this
00027  ** licensing are not clear to you.
00028  **
00029  ** As a special exception, permission is given to link this program
00030  ** with any edition of Qt, and distribute the resulting executable,
00031  ** without including the source code for Qt in the source distribution.
00032  **
00033  **********************************************************************/
00034 
00035 
00036 #include "KDGanttViewSubwidgets.h"
00037 #include "KDGanttViewTaskItem.h"
00038 #include "KDGanttViewSummaryItem.h"
00039 #include "KDGanttViewEventItem.h"
00040 #include "itemAttributeDialog.h"
00041 
00042 #include "qpainter.h"
00043 
00044 #include "KDGanttXMLTools.h"
00045 
00046 
00160 QDict<KDGanttViewItem> KDGanttViewItem::sItemDict;
00161 
00171 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttView* view,
00172                                   const QString& lvtext,
00173                                   const QString& name ) :
00174     QListViewItem(view->myListView,lvtext)
00175 {
00176     initColorAndShapes(type);
00177     generateAndInsertName( name );
00178 }
00179 
00180 
00191 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttViewItem* parentItem,
00192                                   const QString& lvtext,
00193                                   const QString& name ) :
00194     QListViewItem(parentItem,lvtext)
00195 {
00196     initColorAndShapes(type);
00197     generateAndInsertName( name );
00198 }
00199 
00200 
00212 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttView* view,
00213                                   KDGanttViewItem* after,
00214                                   const QString& lvtext,
00215                                   const QString& name ) :
00216     QListViewItem(view->myListView,after, lvtext)
00217 {
00218     initColorAndShapes(type);
00219     generateAndInsertName( name );
00220 }
00221 
00222 
00234 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttViewItem* parentItem,
00235                                   KDGanttViewItem* after,
00236                                   const QString& lvtext,
00237                                   const QString& name ) :
00238     QListViewItem( parentItem, after, lvtext )
00239 {
00240     initColorAndShapes(type);
00241     generateAndInsertName( name );
00242 }
00243 
00244 
00248 KDGanttViewItem::~KDGanttViewItem()
00249 {
00250   myGanttView->notifyEditdialog( this );
00251   if ( startLine ) delete startLine;
00252   if ( endLine ) delete endLine  ;
00253   if ( startLineBack ) delete startLineBack  ;
00254   if ( endLineBack ) delete  endLineBack ;
00255   if ( actualEnd ) delete actualEnd  ;
00256   if ( textCanvas  ) delete textCanvas   ;
00257   if ( startShape ) delete  startShape ;
00258   if ( midShape ) delete midShape  ;
00259   if ( endShape ) delete endShape  ;
00260   if ( startShapeBack ) delete startShapeBack  ;
00261   if ( midShapeBack ) delete midShapeBack   ;
00262   if ( endShapeBack ) delete endShapeBack  ;
00263   if ( progressShape ) delete  progressShape ;
00264   if ( floatStartShape ) delete  floatStartShape ;
00265   if ( floatEndShape ) delete  floatEndShape ;
00266   myGanttView->myTimeTable->removeItemFromTasklinks( this );
00267   myGanttView->myCanvasView->resetCutPaste( this );
00268   if ( listView() ) {
00269       if ( isOpen() )
00270           setOpen( false );
00271       if ( parent() )
00272           parent()->takeItem( this );
00273       else
00274           myGanttView->myListView->takeItem( this );
00275       myGanttView->myTimeTable->updateMyContent();
00276   }
00277   // myGanttView->myTimeTable->removeItemFromTasklinks( this );
00278   // myGanttView->myCanvasView->resetCutPaste( this );
00279 }
00280 
00281 
00286 void KDGanttViewItem::generateAndInsertName( const QString& name )
00287 {
00288     // First check if we already had a name. This can be the case if
00289     // the item was reconstructed from an XML file.
00290     if( !_name.isEmpty() )
00291         // We had a name, remove it
00292         sItemDict.remove( _name );
00293 
00294     QString newName;
00295     if ( name.isEmpty() || sItemDict.find( name ) ) {
00296         // create unique name
00297         newName.sprintf( "%p", (void* )this );
00298         while( sItemDict.find( newName ) ) {
00299             newName += "_0";
00300         }
00301     } else {
00302         newName = name;
00303     }
00304     sItemDict.insert( newName, this );
00305     _name = newName;
00306 }
00307 
00308 
00314 QString KDGanttViewItem::name() const
00315 {
00316     return _name;
00317 }
00318 
00319 
00328 KDGanttViewItem* KDGanttViewItem::find( const QString& name )
00329 {
00330     if (name.isEmpty()) // avoid error msg from QDict
00331         return 0;
00332     return sItemDict.find( name );
00333 }
00334 
00335 
00336 
00344 KDGanttViewItem::Type KDGanttViewItem::type() const
00345 {
00346 
00347     return myType;
00348 }
00349 
00350 
00362 void KDGanttViewItem::setEnabled( bool on )
00363 {
00364   _enabled = on;
00365   if ( displaySubitemsAsGroup() ) {
00366     myGanttView->myTimeTable->inc_blockUpdating();
00367     KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
00368     while (temp != 0) {
00369       temp->setEnabled(  on );
00370       temp = temp->nextSibling();
00371     }
00372     QListViewItem::setEnabled( on );
00373     myGanttView->myTimeTable->dec_blockUpdating();
00374   }
00375   updateCanvasItems();
00376 }
00377 
00378 
00385 bool KDGanttViewItem::enabled () const
00386 {
00387   return _enabled;
00388 }
00389 
00390 
00391 // *********************************
00398 void KDGanttViewItem::setItemVisible( bool on )
00399 {
00400   if ( on ) {
00401     resetSubitemVisibility();
00402   } else
00403     setVisible( false );
00404   //updateCanvasItems();
00405   myGanttView->myTimeTable->updateMyContent();
00406 }
00407 
00408 
00415 bool KDGanttViewItem::itemVisible () const
00416 {
00417   return QListViewItem::isVisible();
00418 }
00419 
00420 
00421 // *************************************
00422 
00430 void KDGanttViewItem::setEditable( bool editable )
00431 {
00432     isEditable = editable;
00433 }
00434 
00435 
00443 bool KDGanttViewItem::editable() const
00444 {
00445     return isEditable;
00446 }
00447 
00448 
00461 void KDGanttViewItem::setDisplaySubitemsAsGroup( bool show )
00462 {
00463   if ( !show && _displaySubitemsAsGroup)
00464     isVisibleInGanttView = true;
00465   _displaySubitemsAsGroup = show;
00466   if ( parent() )
00467     if ( parent()->isOpen() )
00468      parent()->setOpen( true );
00469   if ( isOpen() )
00470     setOpen( true );
00471   updateCanvasItems();
00472 }
00473 
00474 
00482 bool KDGanttViewItem::displaySubitemsAsGroup() const
00483 {
00484     return _displaySubitemsAsGroup;
00485 }
00486 
00487 
00507 void KDGanttViewItem::setPriority( int prio )
00508 {
00509   if ( prio < 1 )
00510     prio = 1;
00511   if (prio > 199 )
00512     prio = 199;
00513   _priority = prio;
00514   updateCanvasItems();
00515 }
00516 
00517 
00523 int KDGanttViewItem::priority()
00524 {
00525     return _priority;
00526 }
00527 
00528 
00537 void KDGanttViewItem::setStartTime( const QDateTime&  )
00538 {
00539 }
00540 
00541 
00548 QDateTime KDGanttViewItem::startTime() const
00549 {
00550     return myStartTime;
00551 }
00552 
00553 
00562 void KDGanttViewItem::setEndTime( const QDateTime& end )
00563 {
00564     switch( type() ) {
00565     case Event:
00566         qDebug( "KDGantt:Event Item has no end time" );
00567         break;
00568     case Summary:
00569         ((KDGanttViewSummaryItem*)this)->setEndTime( end );
00570         break;
00571     case Task:
00572         qDebug( "KDGantt:Task Item has no end time" );
00573         break;
00574     default:
00575         qDebug( "Unknown type in KDGanttViewItem::typeToString()" );
00576     }
00577 }
00578 
00579 
00586 QDateTime KDGanttViewItem::endTime() const
00587 {
00588     return myEndTime;
00589 }
00590 
00591 
00603 void KDGanttViewItem::setText( const QString& text )
00604 {
00605     textCanvas->setText(text);
00606     textCanvasText = text;
00607     updateCanvasItems();
00608 }
00609 
00610 
00618 QString KDGanttViewItem::text() const
00619 {
00620     return textCanvasText;
00621 }
00622 
00623 
00627 void KDGanttViewItem::setListViewText( const QString& text, int column )
00628 {
00629     QListViewItem::setText( column, text );
00630 }
00631 
00632 
00640 void KDGanttViewItem::setListViewText( int column, const QString& text )
00641 {
00642     QListViewItem::setText( column, text );
00643 }
00644 
00645 
00654 QString KDGanttViewItem::listViewText( int column ) const
00655 {
00656     return QListViewItem::text( column );
00657 }
00658 
00659 
00666 void KDGanttViewItem::setFont( const QFont& font )
00667 {
00668     textCanvas->setFont(font);
00669     updateCanvasItems();
00670 }
00671 
00672 
00679 QFont KDGanttViewItem::font() const
00680 {
00681     return textCanvas->font();
00682 }
00683 
00684 
00691 void KDGanttViewItem::setTooltipText( const QString& text )
00692 {
00693     myToolTipText = text;
00694 }
00695 
00696 
00703 QString KDGanttViewItem::tooltipText() const
00704 {
00705 
00706     return myToolTipText;
00707 }
00708 
00709 
00716 void KDGanttViewItem::setWhatsThisText( const QString& text )
00717 {
00718     myWhatsThisText = text;
00719 }
00720 
00721 
00729 QString KDGanttViewItem::whatsThisText() const
00730 {
00731     return myWhatsThisText;
00732 }
00733 
00734 
00746 void KDGanttViewItem::setHighlight( bool highlight )
00747 {
00748     isHighlighted = highlight;
00749     if ( displaySubitemsAsGroup() ) {
00750       myGanttView->myTimeTable->inc_blockUpdating();
00751       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
00752       while (temp != 0) {
00753     temp->setHighlight( highlight );
00754     temp = temp->nextSibling();
00755       }
00756       myGanttView->myTimeTable->dec_blockUpdating();
00757     }
00758     updateCanvasItems();
00759 }
00760 
00761 
00769 bool KDGanttViewItem::highlight() const
00770 {
00771     return isHighlighted;
00772 }
00773 
00774 
00787 void KDGanttViewItem::setShapes( Shape start, Shape middle, Shape end )
00788 {
00789 
00790     myStartShape =  start;
00791     myMiddleShape= middle;
00792     myEndShape=  end;
00793     createShape(startShape,startShapeBack,start);
00794     createShape(midShape,midShapeBack,middle);
00795     midShape->setZ( 4 );
00796     createShape(endShape,endShapeBack,end);
00797     updateCanvasItems();
00798 }
00799 
00800 
00813 void KDGanttViewItem::createShape( KDCanvasPolygonItem* &itemShape,
00814                                    KDCanvasPolygonItem* &itemShapeBack,
00815                                    Shape shape )
00816 {
00817   if ( itemShape && type() ==  Task )
00818     return;
00819     if (itemShape) delete itemShape;
00820     if (itemShapeBack) delete itemShapeBack;
00821 
00822     QCanvasPolygonalItem * item;
00823     QCanvasPolygonalItem * itemBack;
00824     int size = myItemSize+2;
00825     int hei = (myItemSize/3)/2;
00826     switch (shape) {
00827     case TriangleDown:
00828         {
00829             item = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00830             QPointArray arr = QPointArray(3);
00831             arr.setPoint(0,-size/2,-hei);
00832             arr.setPoint(1,size/2,-hei);
00833             arr.setPoint(2,0,((size/2)-hei));
00834             ((QCanvasPolygon*)item)->setPoints(arr);
00835             size += 4;hei +=1;
00836             itemBack = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00837             arr.setPoint(0,-size/2,-hei);
00838             arr.setPoint(1,size/2,-hei);
00839             arr.setPoint(2,0,((size/2)-hei));
00840             ((QCanvasPolygon*)itemBack)->setPoints(arr);
00841 
00842             break;
00843         }
00844     case TriangleUp:
00845         {
00846             // I really do not know why, but  we get only an TriangleUp-icon
00847             // of the same size as a TriangleDown-icon, if we increment the size by 2
00848             size+=2;
00849             item = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00850             QPointArray arr = QPointArray(3);
00851             arr.setPoint(0,-size/2,hei);
00852             arr.setPoint(1,size/2,hei);
00853             arr.setPoint(2,0,(-size/2)+hei);
00854             ((QCanvasPolygon*)item)->setPoints(arr);
00855             size += 4;hei +=1;
00856             itemBack = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00857             arr.setPoint(0,-size/2,hei);
00858             arr.setPoint(1,size/2,hei);
00859             arr.setPoint(2,0,(-size/2)+hei);
00860             ((QCanvasPolygon*)itemBack)->setPoints(arr);
00861 
00862             break;
00863         }
00864 
00865     case Diamond:
00866         {
00867             item = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00868             QPointArray arr = QPointArray(4);
00869             arr.setPoint(0,0,-size/2);
00870             arr.setPoint(1,size/2,0);
00871             arr.setPoint(2,0,size/2);
00872             arr.setPoint(3,-size/2,0);
00873             ((QCanvasPolygon*)item)->setPoints(arr);
00874             size += 2;hei +=1;
00875             itemBack = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00876             arr.setPoint(0,0,-size/2);
00877             arr.setPoint(1,size/2,0);
00878             arr.setPoint(2,0,size/2);
00879             arr.setPoint(3,-size/2,0);
00880             ((QCanvasPolygon*)itemBack)->setPoints(arr);
00881             break;
00882         }
00883 
00884     case Square:
00885         {
00886             size -=2;
00887             item = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00888             QPointArray arr = QPointArray(4);
00889             arr.setPoint(0,-size/2,-size/2);
00890             arr.setPoint(1,size/2,-size/2);
00891             arr.setPoint(2,size/2,size/2);
00892             arr.setPoint(3,-size/2,size/2);
00893             ((QCanvasPolygon*)item)->setPoints(arr);
00894             size += 2;hei +=1;
00895             itemBack = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00896             arr.setPoint(0,-size/2,-size/2);
00897             arr.setPoint(1,size/2,-size/2);
00898             arr.setPoint(2,size/2,size/2);
00899             arr.setPoint(3,-size/2,size/2);
00900             ((QCanvasPolygon*)itemBack)->setPoints(arr);
00901             break;
00902         }
00903 
00904     case Circle:
00905         {
00906             size -= 2;
00907             item = new KDCanvasEllipse(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00908             ((KDCanvasEllipse*)item)->setSize(size,size);
00909             size += 2;hei +=1;
00910             itemBack = new KDCanvasEllipse(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem);
00911             ((KDCanvasEllipse*)itemBack)->setSize(size,size);
00912             break;
00913         }
00914     default:
00915         // Uninitialized shape, can e.g. be the case with free-busy
00916         // items which don't have any shapes
00917         return;
00918     }
00919     item->setBrush(Qt::SolidPattern);
00920     item->setZ(5);
00921     itemShape = (KDCanvasPolygonItem*) item;
00922     itemBack->setBrush(Qt::SolidPattern);
00923     itemBack->setZ(3);
00924     itemShapeBack = (KDCanvasPolygonItem*) itemBack;
00925 
00926 }
00927 
00928 
00937 void KDGanttViewItem::shapes( Shape& start, Shape& middle, Shape& end ) const
00938 {
00939     start = myStartShape;
00940     middle = myMiddleShape;
00941     end = myEndShape;
00942 }
00943 
00944 
00957 void KDGanttViewItem::setColors( const QColor& start, const QColor& middle,
00958                                  const QColor& end )
00959 {
00960 
00961     myStartColor=start ;
00962     myMiddleColor= middle;
00963     myEndColor= end;
00964     if ( displaySubitemsAsGroup() ) {
00965       myGanttView->myTimeTable->inc_blockUpdating();
00966       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
00967       while (temp != 0) {
00968     temp->setColors( start, middle, end );
00969     temp = temp->nextSibling();
00970       }
00971       myGanttView->myTimeTable->dec_blockUpdating();
00972     }
00973     updateCanvasItems();
00974 }
00975 
00976 
00985 void KDGanttViewItem::colors( QColor& start, QColor& middle, QColor& end ) const
00986 {
00987     start = myStartColor ;
00988     middle =  myMiddleColor;
00989     end  = myEndColor;
00990 
00991 }
00992 
00993 
01011 void KDGanttViewItem::setHighlightColors( const QColor& start, const QColor& middle, const QColor& end )
01012 {
01013     myStartColorHL=start ;
01014     myMiddleColorHL= middle;
01015     myEndColorHL= end;
01016     if ( displaySubitemsAsGroup() ) {
01017       myGanttView->myTimeTable->inc_blockUpdating();
01018       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01019       while (temp != 0) {
01020     temp->setHighlightColors( start,  middle,  end );
01021     temp = temp->nextSibling();
01022       }
01023       myGanttView->myTimeTable->dec_blockUpdating();
01024     }
01025     updateCanvasItems();
01026 }
01027 
01028 
01037 void KDGanttViewItem::highlightColors( QColor& start, QColor& middle, QColor& end ) const
01038 {
01039     start = myStartColorHL ;
01040     middle =  myMiddleColorHL;
01041     end  = myEndColorHL;
01042 }
01043 
01044 
01057 void KDGanttViewItem::setTextColor( const QColor& color )
01058 {
01059 
01060    myTextColor = color;
01061    if ( displaySubitemsAsGroup() ) {
01062       myGanttView->myTimeTable->inc_blockUpdating();
01063       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01064       while (temp != 0) {
01065     temp->setTextColor(color);
01066     temp = temp->nextSibling();
01067       }
01068       myGanttView->myTimeTable->dec_blockUpdating();
01069     }
01070     updateCanvasItems();
01071 }
01072 
01073 
01080 QColor KDGanttViewItem::textColor() const
01081 {
01082     return myTextColor;
01083 }
01084 
01085 
01108 void KDGanttViewItem::setPixmap( int column, const QPixmap& pixmap )
01109 {
01110     QListViewItem::setPixmap( column, pixmap );
01111 }
01112 
01116 void KDGanttViewItem::setPixmap( const QPixmap& pixmap )
01117 {
01118     QListViewItem::setPixmap( 0, pixmap );
01119 }
01120 
01121 
01129 const QPixmap* KDGanttViewItem::pixmap( int column ) const
01130 {
01131     return QListViewItem::pixmap( column );
01132 }
01133 
01134 
01150 void KDGanttViewItem::setDefaultColor( const QColor& color )
01151 {
01152     myDefaultColor = color;
01153 
01154 
01155    if ( displaySubitemsAsGroup() ) {
01156       myGanttView->myTimeTable->inc_blockUpdating();
01157       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01158       while (temp != 0) {
01159     temp->setDefaultColor( color );
01160     temp = temp->nextSibling();
01161       }
01162       myGanttView->myTimeTable->dec_blockUpdating();
01163     }
01164     updateCanvasItems();
01165 }
01166 
01167 
01168 
01176 QColor KDGanttViewItem::defaultColor() const
01177 {
01178     return myDefaultColor;
01179 }
01180 
01181 
01197 void KDGanttViewItem::setDefaultHighlightColor( const QColor& color )
01198 {
01199     myDefaultColorHL = color;
01200    if ( displaySubitemsAsGroup() ) {
01201       myGanttView->myTimeTable->inc_blockUpdating();
01202       KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01203       while (temp != 0) {
01204     temp->setDefaultHighlightColor( color );
01205     temp = temp->nextSibling();
01206       }
01207       myGanttView->myTimeTable->dec_blockUpdating();
01208     }
01209     updateCanvasItems();
01210 }
01211 
01212 
01220 QColor KDGanttViewItem::defaultHighlightColor() const
01221 {
01222     return myDefaultColorHL;
01223 }
01224 
01225 
01231 KDGanttViewItem* KDGanttViewItem::firstChild() const
01232 {
01233 
01234     return (KDGanttViewItem* )QListViewItem::firstChild();
01235 }
01236 
01237 
01244 KDGanttViewItem* KDGanttViewItem::nextSibling() const
01245 {
01246     return (KDGanttViewItem* )QListViewItem::nextSibling();
01247 }
01248 
01249 
01256 KDGanttViewItem* KDGanttViewItem::parent() const
01257 {
01258     return (KDGanttViewItem*)QListViewItem::parent();
01259 }
01260 
01261 
01267 KDGanttViewItem* KDGanttViewItem::itemAbove()
01268 {
01269     return (KDGanttViewItem* )QListViewItem::itemAbove();
01270 }
01271 
01272 
01281 KDGanttViewItem* KDGanttViewItem::itemBelow( bool includeDisabled )
01282 {
01283 
01284   KDGanttViewItem*  retItem = (KDGanttViewItem* )QListViewItem::itemBelow();
01285   if ( !includeDisabled ) {
01286     return  retItem;
01287   }
01288   if ( retItem ) {
01289     if (itemPos() + height() == retItem->itemPos() ) {
01290       return retItem;
01291     }
01292   }
01293   KDGanttViewItem*  Item2 = (KDGanttViewItem* )QListViewItem::listView()->itemAt(QPoint (2, QListViewItem::itemPos() + QListViewItem::height() +2) );
01294   if ( Item2 != 0 )
01295     if (!Item2->enabled() )
01296       return Item2;
01297   return retItem;
01298 }
01299 
01300 
01304 void KDGanttViewItem::updateCanvasItems()
01305 {
01306     if (blockUpdating) return;
01307     QPen p,pBack;
01308     QBrush b;
01309     b.setStyle(Qt::SolidPattern);
01310     if ( enabled() ) {
01311       textCanvas->setColor(myTextColor);
01312       if (isHighlighted) {
01313         b.setStyle(Qt::SolidPattern);
01314         b.setColor(myStartColorHL);
01315         startShape->setBrush(b);
01316         b.setColor(myMiddleColorHL);
01317         midShape->setBrush(b);
01318         b.setColor(myEndColorHL);
01319         endShape->setBrush(b);
01320         p.setWidth(myItemSize/3 -1);
01321         p.setColor(myStartColorHL);
01322         startLine->setPen(p);
01323         p.setColor(myEndColorHL);
01324         endLine->setPen(p);
01325       } else {
01326         b.setStyle(Qt::SolidPattern);
01327         b.setColor(myStartColor);
01328     //  qDebug("update color  %s %s", listViewText().latin1(),myStartColor.name().latin1() );
01329         startShape->setBrush(b);
01330         b.setColor(myMiddleColor);
01331         midShape->setBrush(b);
01332         b.setColor(myEndColor);
01333         endShape->setBrush(b);
01334         p.setWidth(myItemSize/3-1);
01335         p.setColor(myStartColor);
01336         startLine->setPen(p);
01337         p.setColor(myEndColor);
01338         endLine->setPen(p);
01339       }
01340     } else {
01341       //QColor discol = Qt::lightGray;
01342         QColor discol = QColor(232,232,232);
01343     textCanvas->setColor( QColor(150,150,150) );
01344         b.setStyle(Qt::SolidPattern);
01345         b.setColor(discol);
01346         startShape->setBrush(b);
01347         midShape->setBrush(b);
01348         endShape->setBrush(b);
01349         p.setWidth(myItemSize/3 -1);
01350         p.setColor(discol);
01351         startLine->setPen(p);
01352         endLine->setPen(p);
01353     }
01354     pBack.setWidth((myItemSize/3-1)+2);
01355     startLineBack->setPen(pBack);
01356     endLineBack->setPen(pBack);
01357     QFont f = textCanvas->font();
01358     f.setPixelSize(myItemSize);
01359     textCanvas->setFont(f);
01360     //if (isvisible) {
01361         myGanttView->myTimeTable->updateMyContent();
01362     //}
01363 }
01364 
01365 
01366 void KDGanttViewItem::initItem()
01367 {
01368 }
01369 
01370 
01374 void KDGanttViewItem::setOpen( bool open )
01375 {
01376   if ( _callListViewOnSetOpen ) {
01377     // notify the listview about a programatically called setOpen()
01378     if ( listView () )
01379       listView ()->setOpen( this, open );
01380 
01381   } else {
01382 
01383     QListViewItem::setOpen( open );
01384   }
01385 }
01386 
01387 
01388 void KDGanttViewItem::showItem( bool, int )
01389 {
01390 }
01391 
01392 
01393 QPoint KDGanttViewItem::getTaskLinkStartCoord(QPoint p)
01394 {
01395     textCanvas->move(p.x()+myItemSize, itemPos() + height()/2-myItemSize/2);
01396     return QPoint (myGanttView->myTimeHeader->getCoordX(myEndTime) +myItemSize/2,itemPos()+height()/2);
01397 }
01398 
01399 
01400 QPoint KDGanttViewItem::getTaskLinkEndCoord()
01401 {
01402     return QPoint (myGanttView->myTimeHeader->getCoordX(myStartTime)-myItemSize/2 ,itemPos()-myItemSize/2+height()/2-2);
01403 }
01404 
01405 
01406 void KDGanttViewItem::hideSubtree()
01407 {
01408   if (firstChild())
01409     firstChild()->hideSubtree();
01410   if ( nextSibling () )
01411     nextSibling ()->hideSubtree();
01412   showItem(false);
01413 }
01414 
01415 
01416 void KDGanttViewItem::setCallListViewOnSetOpen( bool call )
01417 {
01418   _callListViewOnSetOpen = call;
01419 }
01420 
01421 
01422 void KDGanttViewItem::initColorAndShapes(Type t)
01423 {
01424     _isMoveable = false;
01425     _isResizeable = false;
01426     setTextOffset(QPoint(0,0));
01427   //_isCalendar = false;
01428     _callListViewOnSetOpen = true;
01429     myType = t;
01430     myProgress = 0;
01431     progressShape = 0;
01432     floatStartShape = 0;
01433     floatEndShape = 0;
01434     blockUpdating = true;
01435     isVisibleInGanttView = false;
01436     startShape = 0;
01437     midShape = 0;
01438     endShape = 0;
01439     startShapeBack = 0;
01440     midShapeBack = 0;
01441     endShapeBack = 0;
01442 
01443     myItemSize = 10;
01444     myGanttView = ((KDListView *)listView())->myGanttView;
01445     myGanttView->myTimeHeader->saveCenterDateTime();
01446     myStartTime = myGanttView->myTimeHeader->myCenterDateTime;
01447     myEndTime = myStartTime;
01448     myToolTipText =QListViewItem::text(0);
01449     myWhatsThisText = QListViewItem::text(0);
01450     isHighlighted = false;
01451     isEditable = true;
01452     _displaySubitemsAsGroup = myGanttView->displaySubitemsAsGroup();
01453     startLine = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);//KDGanttViewItem );
01454     endLine = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01455     startLine->setZ(2);endLine->setZ(2);
01456     startLineBack = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);//KDGanttViewItem );
01457     endLineBack = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01458     startLineBack->setZ(1);endLineBack->setZ(1);
01459     actualEnd = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01460     actualEnd->setZ(5);
01461     actualEnd->setPen( QPen ( Qt::red, 3 ) );
01462 
01463     textCanvas = new KDCanvasText(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01464     textCanvas->setText("");
01465     textCanvas->setZ(10);
01466     // set textcolor
01467     setTextColor( myGanttView->textColor());
01468     // set default color
01469     setDefaultColor( myGanttView->defaultColor(myType));
01470     // set default highlight color
01471     setDefaultHighlightColor(myGanttView->defaultHighlightColor(myType));
01472     // set shapes
01473     if (!( shapeDefined = (myGanttView->shapes(myType,myStartShape,myMiddleShape,myEndShape)))) {
01474 
01475         //qDebug("KDGantt::KDGanttViewItem created with not user defined shapes");
01476     };
01477 
01478     setShapes(myStartShape,myMiddleShape,myEndShape);
01479     if ( type() == Task ) {
01480       //qDebug("new task %s ", listViewText().latin1());
01481       if ( startShape )
01482     delete startShape;
01483       startShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01484       progressShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01485     }
01486     floatStartShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01487     floatEndShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01488 
01489     // set color of shapes
01490     if (!( colorDefined = (myGanttView->colors(myType,myStartColor,myMiddleColor,myEndColor)))) {
01491 
01492     };
01493     setColors(defaultColor(),defaultColor(), defaultColor());
01494     // set highlight color of shapes
01495     if (!( colorHLDefined = (myGanttView->highlightColors(myType,myStartColorHL,myMiddleColorHL,myEndColorHL)))) {
01496 
01497     };
01498     setHighlightColors(defaultHighlightColor(),defaultHighlightColor(), defaultHighlightColor());
01499     setFont(myGanttView->font());
01500     // if (type() ==  Task)
01501     //setText(QListViewItem::text(0)); // testing only
01502     //isvisible = true;
01503     _priority = 150;
01504     _showNoInformation = false;
01505     _enabled = true;
01506     blockUpdating = false;
01507     updateCanvasItems();
01508 }
01509 
01510 
01511 QString KDGanttViewItem::shapeToString( Shape shape )
01512 {
01513     switch( shape ) {
01514     case TriangleDown:
01515         return "TriangleDown";
01516     case TriangleUp:
01517         return "TriangleUp";
01518     case Diamond:
01519         return "Diamond";
01520     case Square:
01521         return "Square";
01522     case Circle:
01523         return "Circle";
01524     }
01525     return "";
01526 }
01527 
01528 
01529 KDGanttViewItem::Shape KDGanttViewItem::stringToShape( const QString& string )
01530 {
01531     if( string == "TriangleDown" )
01532         return TriangleDown;
01533     else if( string == "TriangleUp" )
01534         return TriangleUp;
01535     else if( string == "Diamond" )
01536         return Diamond;
01537     else if( string == "Square" )
01538         return Square;
01539     else if( string == "Circle" )
01540         return Circle;
01541     else
01542         return TriangleDown;
01543 }
01544 
01545 
01552 void KDGanttViewItem::createNode( QDomDocument& doc,
01553                                   QDomElement& parentElement )
01554 {
01555     QDomElement itemElement = doc.createElement( "Item" );
01556     parentElement.appendChild( itemElement );
01557     itemElement.setAttribute( "Type", typeToString( type() ) );
01558 
01559     KDGanttXML::createDateTimeNode( doc, itemElement, "StartTime", startTime() );
01560     KDGanttXML::createDateTimeNode( doc, itemElement, "EndTime", endTime() );
01561     KDGanttXML::createFontNode( doc, itemElement, "Font", font() );
01562     KDGanttXML::createStringNode( doc, itemElement, "Text", text() );
01563     KDGanttXML::createStringNode( doc, itemElement, "TooltipText", tooltipText() );
01564     KDGanttXML::createStringNode( doc, itemElement, "WhatsThisText",
01565                              whatsThisText() );
01566     if( pixmap() )
01567         KDGanttXML::createPixmapNode( doc, itemElement, "Pixmap", *pixmap() );
01568     if( !listViewText().isNull() )
01569         KDGanttXML::createStringNode( doc, itemElement, "ListViewText",
01570                                  listViewText() );
01571     KDGanttXML::createBoolNode( doc, itemElement, "Open", isOpen() );
01572     KDGanttXML::createBoolNode( doc, itemElement, "Highlight", highlight() );
01573     Shape startShape, middleShape, endShape;
01574     shapes( startShape, middleShape, endShape );
01575     KDGanttXML::createStringNode( doc, itemElement, "StartShape",
01576                              shapeToString( startShape ) );
01577     KDGanttXML::createStringNode( doc, itemElement, "MiddleShape",
01578                              shapeToString( middleShape ) );
01579     KDGanttXML::createStringNode( doc, itemElement, "EndShape",
01580                              shapeToString( endShape ) );
01581     KDGanttXML::createColorNode( doc, itemElement, "DefaultColor", defaultColor() );
01582     QColor startColor, middleColor, endColor;
01583     colors( startColor, middleColor, endColor );
01584     KDGanttXML::createColorNode( doc, itemElement, "StartColor", startColor );
01585     KDGanttXML::createColorNode( doc, itemElement, "MiddleColor", middleColor );
01586     KDGanttXML::createColorNode( doc, itemElement, "EndColor", endColor );
01587     KDGanttXML::createColorNode( doc, itemElement, "DefaultHighlightColor",
01588                             defaultHighlightColor() );
01589     highlightColors( startColor, middleColor, endColor );
01590     KDGanttXML::createColorNode( doc, itemElement, "StartHighlightColor",
01591                             startColor );
01592     KDGanttXML::createColorNode( doc, itemElement, "MiddleHighlightColor",
01593                             middleColor );
01594     KDGanttXML::createColorNode( doc, itemElement, "EndHighlightColor", endColor );
01595     KDGanttXML::createColorNode( doc, itemElement, "TextColor", textColor() );
01596     KDGanttXML::createStringNode( doc, itemElement, "Name", name() );
01597     QDomElement itemsElement = doc.createElement( "Items" );
01598     itemElement.appendChild( itemsElement );
01599     KDGanttViewItem* currentItem = firstChild();
01600     while( currentItem ) {
01601         currentItem->createNode( doc, itemsElement );
01602         currentItem = currentItem->nextSibling();
01603     }
01604 
01605 }
01606 
01607 
01608 
01617 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttView* view,
01618                                                         QDomElement& element )
01619 {
01620     QString typeString = element.attribute( "Type" );
01621     Q_ASSERT( !typeString.isEmpty() );
01622     KDGanttViewItem* item;
01623     if( typeString == "Task" )
01624         item = new KDGanttViewTaskItem( view );
01625     else if( typeString == "Summary" )
01626         item = new KDGanttViewSummaryItem( view );
01627     else if( typeString == "Event" )
01628         item = new KDGanttViewEventItem( view );
01629     else {
01630         qDebug( "Unknown item type %s in KDGanttViewItem::createFromDomElement()", typeString.latin1() );
01631         return 0;
01632     }
01633 
01634     item->loadFromDomElement( element );
01635     return item;
01636 }
01637 
01638 
01648 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttView* view,
01649                                                         KDGanttViewItem* previous,
01650                                                         QDomElement& element )
01651 {
01652     QString typeString = element.attribute( "Type" );
01653     Q_ASSERT( !typeString.isEmpty() );
01654     KDGanttViewItem* item;
01655     if( typeString == "Task" )
01656         item = new KDGanttViewTaskItem( view, previous );
01657     else if( typeString == "Summary" )
01658         item = new KDGanttViewSummaryItem( view, previous );
01659     else if( typeString == "Event" )
01660         item = new KDGanttViewEventItem( view, previous );
01661     else {
01662         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01663         return 0;
01664     }
01665 
01666     item->loadFromDomElement( element );
01667     return item;
01668 }
01669 
01670 
01671 
01672 
01681 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttViewItem* parent,
01682                                                         QDomElement& element )
01683 {
01684     QString typeString = element.attribute( "Type" );
01685     Q_ASSERT( !typeString.isEmpty() );
01686     KDGanttViewItem* item;
01687     if( typeString == "Task" )
01688         item = new KDGanttViewTaskItem( parent );
01689     else if( typeString == "Summary" )
01690         item = new KDGanttViewSummaryItem( parent );
01691     else if( typeString == "Event" )
01692         item = new KDGanttViewEventItem( parent );
01693     else {
01694         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01695         return 0;
01696     }
01697 
01698     item->loadFromDomElement( element );
01699     return item;
01700 }
01701 
01702 
01712 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttViewItem* parent,
01713                                                         KDGanttViewItem* previous,
01714                                                         QDomElement& element )
01715 {
01716     QString typeString = element.attribute( "Type" );
01717     Q_ASSERT( !typeString.isEmpty() );
01718     KDGanttViewItem* item;
01719     if( typeString == "Task" )
01720         item = new KDGanttViewTaskItem( parent, previous );
01721     else if( typeString == "Summary" )
01722         item = new KDGanttViewSummaryItem( parent, previous );
01723     else if( typeString == "Event" )
01724         item = new KDGanttViewEventItem( parent, previous );
01725     else {
01726         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01727         return 0;
01728     }
01729 
01730     item->loadFromDomElement( element );
01731     return item;
01732 }
01733 
01734 
01735 /*
01736   Fills in the values in the item by reading the DOM element.
01737 */
01738 void KDGanttViewItem::loadFromDomElement( QDomElement& element )
01739 {
01740     QDomNode node = element.firstChild();
01741     Shape startShape = TriangleDown, middleShape = TriangleDown,
01742             endShape = TriangleDown;
01743     QColor startColor, middleColor, endColor;
01744     QColor startHighlightColor, middleHighlightColor, endHighlightColor;
01745     QString tempName;
01746     while( !node.isNull() ) {
01747         QDomElement element = node.toElement();
01748         if( !element.isNull() ) { // was really an element
01749             QString tagName = element.tagName();
01750             if( tagName == "StartTime" ) {
01751                 QDateTime value;
01752                 if( KDGanttXML::readDateTimeNode( element, value ) )
01753                     setStartTime( value );
01754             } else if( tagName == "EndTime" ) {
01755                 QDateTime value;
01756                 if( KDGanttXML::readDateTimeNode( element, value ) )
01757                     setEndTime( value );
01758             } else if( tagName == "Text" ) {
01759                 QString value;
01760                 if( KDGanttXML::readStringNode( element, value ) )
01761                     setText( value );
01762             } else if( tagName == "Font" ) {
01763                 QFont value;
01764                 if( KDGanttXML::readFontNode( element, value ) )
01765                     setFont( value );
01766             } else if( tagName == "TooltipText" ) {
01767                 QString value;
01768                 if( KDGanttXML::readStringNode( element, value ) )
01769                     setTooltipText( value );
01770             } else if( tagName == "WhatsThisText" ) {
01771                 QString value;
01772                 if( KDGanttXML::readStringNode( element, value ) )
01773                     setWhatsThisText( value );
01774             } else if( tagName == "Pixmap" ) {
01775                 QPixmap value;
01776                 if( KDGanttXML::readPixmapNode( element, value ) )
01777                     setPixmap( value );
01778             } else if( tagName == "ListViewText" ) {
01779                 QString value;
01780                 if( KDGanttXML::readStringNode( element, value ) )
01781                     setListViewText( value );
01782             } else if( tagName == "Open" ) {
01783                 bool value;
01784                 if( KDGanttXML::readBoolNode( element, value ) )
01785                     setOpen( value );
01786             } else if( tagName == "Highlight" ) {
01787                 bool value;
01788                 if( KDGanttXML::readBoolNode( element, value ) )
01789                     setHighlight( value );
01790             } else if( tagName == "StartShape" ) {
01791                 QString value;
01792                 if( KDGanttXML::readStringNode( element, value ) )
01793                     startShape = stringToShape( value );
01794             } else if( tagName == "MiddleShape" ) {
01795                 QString value;
01796                 if( KDGanttXML::readStringNode( element, value ) )
01797                     middleShape = stringToShape( value );
01798             } else if( tagName == "EndShape" ) {
01799                 QString value;
01800                 if( KDGanttXML::readStringNode( element, value ) )
01801                     endShape = stringToShape( value );
01802             } else if( tagName == "DefaultColor" ) {
01803                 QColor value;
01804                 if( KDGanttXML::readColorNode( element, value ) )
01805                     setDefaultColor( value );
01806             } else if( tagName == "StartColor" ) {
01807                 QColor value;
01808                 if( KDGanttXML::readColorNode( element, value ) )
01809                     startColor = value;
01810             } else if( tagName == "MiddleColor" ) {
01811                 QColor value;
01812                 if( KDGanttXML::readColorNode( element, value ) )
01813                     middleColor = value;
01814             } else if( tagName == "EndColor" ) {
01815                 QColor value;
01816                 if( KDGanttXML::readColorNode( element, value ) )
01817                     endColor = value;
01818             } else if( tagName == "DefaultHighlightColor" ) {
01819                 QColor value;
01820                 if( KDGanttXML::readColorNode( element, value ) )
01821                     setDefaultHighlightColor( value );
01822             } else if( tagName == "StartHighlightColor" ) {
01823                 QColor value;
01824                 if( KDGanttXML::readColorNode( element, value ) )
01825                     startHighlightColor = value;
01826             } else if( tagName == "MiddleHighlightColor" ) {
01827                 QColor value;
01828                 if( KDGanttXML::readColorNode( element, value ) )
01829                     middleHighlightColor = value;
01830             } else if( tagName == "EndHighlightColor" ) {
01831                 QColor value;
01832                 if( KDGanttXML::readColorNode( element, value ) )
01833                     endHighlightColor = value;
01834             } else if( tagName == "TextColor" ) {
01835                 QColor value;
01836                 if( KDGanttXML::readColorNode( element, value ) )
01837                     setTextColor( value );
01838             } else if( tagName == "Name" ) {
01839                 QString value;
01840                 if( KDGanttXML::readStringNode( element, value ) )
01841                     tempName = value;
01842             } else if( tagName == "Items" ) {
01843                 QDomNode node = element.firstChild();
01844                 KDGanttViewItem* previous = 0;
01845                 while( !node.isNull() ) {
01846                     QDomElement element = node.toElement();
01847                     if( !element.isNull() ) { // was really an element
01848                         QString tagName = element.tagName();
01849                         if( tagName == "Item" ) {
01850                             KDGanttViewItem* newItem;
01851                             if( previous )
01852                                 newItem =
01853                                     KDGanttViewItem::createFromDomElement( this,
01854                                                                            previous,
01855                                                                            element );
01856                             else
01857                                 newItem =
01858                                     KDGanttViewItem::createFromDomElement( this,
01859                                                                            element );
01860                             previous = newItem;
01861                         } else {
01862                             qDebug( "Unrecognized tag name: %s", tagName.latin1() );
01863                             Q_ASSERT( false );
01864                         }
01865                     }
01866 
01867                     node = node.nextSibling();
01868                 }
01869             } else {
01870                 qDebug( "Unrecognized tag name: %s", tagName.latin1() );
01871                 Q_ASSERT( false );
01872             }
01873         }
01874 
01875         node = node.nextSibling();
01876     }
01877 
01878     setColors( startColor, middleColor, endColor );
01879     setHighlightColors( startHighlightColor, middleHighlightColor,
01880                         endHighlightColor );
01881     setShapes( startShape, middleShape, endShape );
01882     generateAndInsertName( tempName );
01883 }
01884 
01885 
01886 QString KDGanttViewItem::typeToString( Type type )
01887 {
01888     switch( type ) {
01889     case Event:
01890         return "Event";
01891     case Summary:
01892         return "Summary";
01893     case Task:
01894         return "Task";
01895     default:
01896         qDebug( "Unknown type in KDGanttViewItem::typeToString()" );
01897         return "Summary";
01898     }
01899     return "";
01900 }
01901 
01902 
01908 int KDGanttViewItem::getCoordY()
01909 {
01910     return itemPos() + height()/2;
01911 }
01912 
01913 
01914 void KDGanttViewItem::showSubItems()
01915 {
01916   showSubitemTree( getCoordY() );
01917 }
01918 
01919 
01920 void KDGanttViewItem::showSubitemTree( int CoordY )
01921 {
01922 
01923   KDGanttViewItem* temp = firstChild();
01924   if (temp) {
01925     while (temp != 0) {
01926       if (temp->isOpen() || !temp->displaySubitemsAsGroup() ) {
01927     temp->showItem( true, CoordY );
01928     if ( temp->firstChild() )
01929       temp->firstChild()->hideSubtree();
01930       } else {
01931         if ( temp->displaySubitemsAsGroup() && temp->firstChild() )
01932       temp->hideSubtree();
01933     else {
01934       temp->showSubitemTree( CoordY );
01935     }
01936       }
01937       temp = temp->nextSibling();
01938     }
01939     showItem( false );
01940   } else {
01941     showItem( true, CoordY );
01942   }
01943 }
01944 
01945 
01951 QDateTime KDGanttViewItem::myChildStartTime()
01952 {
01953   QDateTime ret, tempTime;
01954   bool set = true;
01955   KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01956   if (temp) {
01957     while (temp != 0) {
01958       if ( !temp->displaySubitemsAsGroup() ) {
01959     tempTime = temp->startTime();
01960       } else {
01961     tempTime = temp->myChildStartTime();
01962       }
01963       if ( set ) {
01964     set = false;
01965     ret = tempTime;
01966       } else {
01967     if ( tempTime < ret ) {
01968       ret = tempTime;
01969     }
01970       }
01971       temp = temp->nextSibling();
01972     }
01973   } else {
01974     ret = startTime();
01975   }
01976   return ret;
01977 }
01978 
01979 
01985 QDateTime KDGanttViewItem::myChildEndTime()
01986 {
01987   QDateTime ret, tempTime;
01988   bool set = true;
01989   KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01990   if (temp) {
01991     while (temp != 0) {
01992       if ( !temp->displaySubitemsAsGroup() ) {
01993     tempTime = temp->endTime();
01994       } else {
01995     tempTime = temp->myChildEndTime();
01996       }
01997       if ( set ) {
01998     set = false;
01999     ret = tempTime;
02000       } else {
02001     if ( tempTime > ret ) {
02002       ret = tempTime;
02003     }
02004       }
02005       temp = temp->nextSibling();
02006     }
02007   } else {
02008     ret = endTime();
02009   }
02010   return ret;
02011 }
02012 
02013 
02020 bool KDGanttViewItem::showNoInformation()
02021 {
02022   return _showNoInformation;
02023 }
02024 
02025 
02037 void KDGanttViewItem::setShowNoInformation( bool show )
02038 {
02039   _showNoInformation = show;
02040   myGanttView->myTimeTable->updateMyContent();
02041 }
02042 
02043 
02052 KDGanttViewItem* KDGanttViewItem::getChildByName( const QString& name )
02053 {
02054   if ( listViewText() == name )
02055     return this;
02056   KDGanttViewItem* temp =  firstChild(),* ret;
02057   while (temp != 0) {
02058     if ( (ret = temp->getChildByName( name )))
02059       return ret;
02060     temp = temp->nextSibling();
02061   }
02062   return 0;
02063 }
02064 
02065 
02066 /*
02067 void  KDGanttViewItem::printinfo( QString s )
02068 {
02069   KDGanttViewItem* temp =  firstChild();
02070   while (temp != 0) {
02071     temp->printinfo("  "+s );
02072     temp = temp->nextSibling();
02073   }
02074 }
02075 */
02076 
02077 
02085 bool KDGanttViewItem::subitemIsCalendar() const
02086 {
02087   KDGanttViewItem*   temp = firstChild();
02088   bool ret = false;
02089   while (temp) {
02090     if (temp->firstChild() || temp->displaySubitemsAsGroup() ) {
02091       ret = true;
02092       break;
02093     }
02094     temp = temp->nextSibling();
02095   }
02096   return ret;
02097 }
02098 
02099 
02100 int  KDGanttViewItem::computeHeight()
02101 {
02102   int hei = 0;
02103   // if not visible, hide item and all subitems, return height = 0
02104   if ( !isVisible() ) {
02105     showItem( false );
02106     if ( firstChild() )
02107       firstChild()->hideSubtree();
02108     // qDebug("KDGanttViewItem::computeHeight() %s returns 0  ", QListViewItem::text(0).latin1());
02109     return 0;
02110   }
02111 
02112   KDGanttViewItem* temp;
02113   bool show = true;
02114 
02115   //  explanation of terms:
02116   //    display opened item as usual:
02117   //      display this item opened, display Gantt part on the timeline of this item.
02118   //      the same for all subitems: display all subitems on its own timeline
02119   //    display closed item as usual:
02120   //      display this item closed, display Gantt part on the timeline of this item.
02121   //      do not display any subitem.
02122 
02123   //  desired behaviour:
02124   //  if not in calendar mode( GanttView is NOT in calendar mode ):
02125   //    opened:
02126   //      display opened item as usual
02127   //    closed:
02128   //      if not displaySubitemsAsGroup()
02129   //        display closed item as usual
02130   //      else (  displaySubitemsAsGroup() == true )
02131   //        display not this item, display subitems on the timeline of this item
02132   //  else ( GanttView is in calendar mode )
02133   //    4 cases:
02134   //      opened && displaySubitemsAsGroup():
02135   //        display not this item, display subitems on the timeline of this item,
02136   //          which have the property displaySubitemsAsGroup() == false
02137   //        display the other items,
02138   //           which have the property displaySubitemsAsGroup() == true,
02139   //           as usual below this item on their own timeline
02140   //      opened && NOT displaySubitemsAsGroup():
02141   //        display opened item as usual
02142   //      closed && displaySubitemsAsGroup():
02143   //        display not this item, display subitems on the timeline of this item,
02144   //          which have the property displaySubitemsAsGroup() == false
02145   //      closed && NOT displaySubitemsAsGroup():
02146   //        display closed item as usual
02147   //
02148   if ( isOpen() ) {
02149     //qDebug("KDGanttViewItem::computeHeight() %s is open  ", QListViewItem::text(0).latin1());
02150     temp = firstChild();
02151     // if item opened, iterate over all subitems
02152     int tempHeight;
02153     // introduced special for performance reasons
02154     bool special = displaySubitemsAsGroup() && myGanttView->calendarMode();
02155     while (temp != 0) {
02156       tempHeight = temp->computeHeight();
02157       if ( special ) {
02158     if ( temp->displaySubitemsAsGroup() ) {
02159       hei += tempHeight;
02160       //qDebug(" hei added ");
02161     } else {
02162       temp->showSubitemTree( getCoordY() );
02163 
02164     }
02165       } else {
02166     hei += tempHeight;
02167     //qDebug(" hei added ");
02168       }
02169       temp = temp->nextSibling();
02170     }
02171   } else { // closed!
02172     //qDebug("KDGanttViewItem::computeHeight() %s is closed  ", QListViewItem::text(0).latin1());
02173 
02174     if ( !displaySubitemsAsGroup() ) {
02175       if ( firstChild() ) {
02176     firstChild()->hideSubtree();
02177       }
02178     } else {
02179       if ( firstChild() ) {
02180     showSubitemTree( getCoordY() );
02181     show =  false ;
02182       }
02183     }
02184 
02185   }
02186   if ( show )
02187      showItem( true );
02188 
02189   hei += height();
02190   //qDebug("KDGanttViewItem::computeHeight() %s returns:  %d  ", QListViewItem::text(0).latin1(), hei);
02191   return hei;
02192 }
02193 
02194 
02195 // if this item has at least one subitem which has the property displaySubitemsAsGroup(),
02196 //  a false is returned
02197 bool  KDGanttViewItem::showNoCross()
02198 {
02199   KDGanttViewItem * temp = firstChild();
02200   if ( !temp )
02201     return false;
02202   while ( temp ) {
02203     if ( temp->displaySubitemsAsGroup() ) {
02204       return false;
02205     }
02206     temp = temp->nextSibling();
02207  }
02208   return true;
02209 }
02210 
02211 
02212 void  KDGanttViewItem::paintBranches ( QPainter* p, const QColorGroup& cg,
02213                                        int w, int y, int h )
02214 {
02215   QListViewItem::paintBranches (  p,  cg, w,  y,  h);
02216   if ( !myGanttView->calendarMode() )
02217     return;
02218   else {
02219     KDGanttViewItem * temp = firstChild();
02220     while ( temp ) {
02221       if ( temp->showNoCross() ) {
02222     //qDebug("paintNoCross %s ", temp->listViewText(0).latin1());
02223     int y_coord = temp->itemPos() -height ()- itemPos();
02224     int hei = temp->height();
02225     //qDebug(" y %d w %d h %d ", y,w,h);
02226     //qDebug("yc %d  hei %d",y_coord,hei );
02227     myGanttView->myListView->paintemptyarea( p, QRect( 0,y+y_coord,w,hei));
02228     int x_c = w/2;
02229     int y_c = y+y_coord+ temp->height ()/2;
02230     int y_ce ;
02231     if ( temp->itemBelow() && temp->itemBelow()->parent() == this )
02232       y_ce =y+y_coord+ temp->height ();
02233     else
02234       y_ce = y_c;
02235     int i;
02236     for (i = y+y_coord+1; i <= y_ce; i+=2 ) {
02237       p->drawPoint( x_c, i );
02238     }
02239         for (i = x_c+2; i < w; i+=2 ) {
02240       p->drawPoint( i, y_c  );
02241     }
02242       }
02243       temp = temp->nextSibling();
02244     }
02245   }
02246 }
02247 
02248 
02249 // resets the visibility os the subitems according to the setting of calendar mode
02250 void  KDGanttViewItem::resetSubitemVisibility()
02251 {
02252   KDGanttViewItem* temp;
02253   temp = firstChild();
02254   bool allow = false;
02255   if ( myGanttView->calendarMode() ) {
02256     // in calendarmode only items can be opened which have subitems which have subitems
02257     if ( ! temp ) {
02258       if ( !parent() )
02259     // has no parent, has no child : show!
02260     setVisible( true );
02261       else
02262     // has parent, has no child : hide!
02263     setVisible( false );
02264       return;
02265     }
02266     setVisible( true );
02267     while (temp) {
02268       if (temp->firstChild()) {
02269     allow = true;
02270     temp->resetSubitemVisibility();
02271       }
02272       else {
02273     temp->setVisible(false);
02274       }
02275       temp = temp->nextSibling();
02276     }
02277   } else {
02278     setVisible( true );
02279     // all items can be opened
02280     allow = true;
02281     while (temp != 0) {
02282       temp->resetSubitemVisibility();
02283       temp = temp->nextSibling();
02284     }
02285   }
02286   if ( !allow && isOpen() )
02287     setOpen( false );
02288 
02289 }
02290 
02291 
02309 /* removed
02310 void KDGanttViewItem::setIsCalendar( bool cal )
02311 {
02312     _isCalendar = cal;
02313     updateCanvasItems();
02314 }
02315 */
02316 
02325 /* removed
02326 bool KDGanttViewItem::isCalendar( ) const
02327 {
02328     return _isCalendar;
02329 }
02330 */
02331 
02332 
02468 QPoint KDGanttViewItem::middleLeft()
02469 {
02470     return QPoint(myGanttView->myTimeHeader->getCoordX(myStartTime), itemPos()+height()/2);
02471 }
02475 QPoint KDGanttViewItem::middleRight()
02476 {
02477     return QPoint(myGanttView->myTimeHeader->getCoordX(myEndTime), itemPos()+height()/2);
02478 }
02482 void KDGanttViewItem::moveTextCanvas(int x, int y)
02483 {
02484     int mx = x + myTextOffset.x();
02485     int my = y + myTextOffset.y();
02486     if (myTextOffset.x() != 0)
02487         mx -= 2*myItemSize; // keep old behaviour
02488 
02489     textCanvas->move(mx+2*myItemSize,my-myItemSize/2);
02490     //qDebug("%s: moveTextCanvas(%d,%d) offset: %d,%d moved to  %d,%d",listViewText(0).latin1(),x,y,myTextOffset.x(),myTextOffset.y(),mx+2*myItemSize,my-myItemSize/2);
02491 }
02492 
02497 void KDGanttViewItem::moveTextCanvas()
02498 {
02499     QPoint m = myTextOffset+middleRight();
02500     textCanvas->move(m.x(), m.y()-myItemSize/2);
02501 }
02502 
02506 void KDGanttViewItem::setTextOffset(QPoint p)
02507 {
02508     //qDebug("%s: setTextOffset() offset: %d,%d",listViewText(0).latin1(),p.x(),p.y());
02509     myTextOffset.setX(p.x());
02510     myTextOffset.setY(p.y());
02511 }
02512 
02513 bool KDGanttViewItem::isMyTextCanvas(QCanvasItem *tc)
02514 {
02515     return tc == textCanvas;
02516 }
02517 
02525 void KDGanttViewItem::setProgress(int percent)
02526 {
02527     myProgress = QMAX(0, percent);
02528     myProgress = QMIN(100, myProgress);
02529 }
02530 
02537 void KDGanttViewItem::setFloatStartTime(const QDateTime &start)
02538 {
02539     myFloatStartTime = start;
02540 }
02541 
02548 void KDGanttViewItem::setFloatEndTime(const QDateTime &end)
02549 {
02550     myFloatEndTime = end;
02551 }
02552 
02553 void KDGanttViewItem::setMoveable(bool m)
02554 {
02555   _isMoveable = m;
02556 }
02557 
02558 bool KDGanttViewItem::isMoveable() const
02559 {
02560   return _isMoveable;
02561 }
02562 
02563 bool KDGanttViewItem::isResizeable() const
02564 {
02565   return _isResizeable;
02566 }
02567 
02568 void KDGanttViewItem::setResizeable(bool r)
02569 {
02570   _isResizeable = r;
02571 }
KDE Home | KDE Accessibility Home | Description of Access Keys