kdgantt

KDGanttViewItem.cpp

00001 /* -*- Mode: C++ -*-
00002    $Id: KDGanttViewItem.cpp 422535 2005-06-05 18:54:23Z adridg $
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     setTextOffset(QPoint(0,0));
01425   //_isCalendar = false;
01426     _callListViewOnSetOpen = true;
01427     myType = t;
01428     myProgress = 0;
01429     progressShape = 0;
01430     floatStartShape = 0;
01431     floatEndShape = 0;
01432     blockUpdating = true;
01433     isVisibleInGanttView = false;
01434     startShape = 0;
01435     midShape = 0;
01436     endShape = 0;
01437     startShapeBack = 0;
01438     midShapeBack = 0;
01439     endShapeBack = 0;
01440 
01441     myItemSize = 10;
01442     myGanttView = ((KDListView *)listView())->myGanttView;
01443     myGanttView->myTimeHeader->saveCenterDateTime();
01444     myStartTime = myGanttView->myTimeHeader->myCenterDateTime;
01445     myEndTime = myStartTime;
01446     myToolTipText =QListViewItem::text(0);
01447     myWhatsThisText = QListViewItem::text(0);
01448     isHighlighted = false;
01449     isEditable = true;
01450     _displaySubitemsAsGroup = myGanttView->displaySubitemsAsGroup();
01451     startLine = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);//KDGanttViewItem );
01452     endLine = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01453     startLine->setZ(2);endLine->setZ(2);
01454     startLineBack = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);//KDGanttViewItem );
01455     endLineBack = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01456     startLineBack->setZ(1);endLineBack->setZ(1);
01457     actualEnd = new KDCanvasLine(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01458     actualEnd->setZ(5);
01459     actualEnd->setPen( QPen ( Qt::red, 3 ) );
01460 
01461     textCanvas = new KDCanvasText(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01462     textCanvas->setText("");
01463     textCanvas->setZ(10);
01464     // set textcolor
01465     setTextColor( myGanttView->textColor());
01466     // set default color
01467     setDefaultColor( myGanttView->defaultColor(myType));
01468     // set default highlight color
01469     setDefaultHighlightColor(myGanttView->defaultHighlightColor(myType));
01470     // set shapes
01471     if (!( shapeDefined = (myGanttView->shapes(myType,myStartShape,myMiddleShape,myEndShape)))) {
01472 
01473         //qDebug("KDGantt::KDGanttViewItem created with not user defined shapes");
01474     };
01475 
01476     setShapes(myStartShape,myMiddleShape,myEndShape);
01477     if ( type() == Task ) {
01478       //qDebug("new task %s ", listViewText().latin1());
01479       if ( startShape )
01480     delete startShape;
01481       startShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01482       progressShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01483     }
01484     floatStartShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01485     floatEndShape = (KDCanvasPolygonItem*)new  KDCanvasRectangle(myGanttView->myTimeTable,this,Type_is_KDGanttViewItem);
01486 
01487     // set color of shapes
01488     if (!( colorDefined = (myGanttView->colors(myType,myStartColor,myMiddleColor,myEndColor)))) {
01489 
01490     };
01491     setColors(defaultColor(),defaultColor(), defaultColor());
01492     // set highlight color of shapes
01493     if (!( colorHLDefined = (myGanttView->highlightColors(myType,myStartColorHL,myMiddleColorHL,myEndColorHL)))) {
01494 
01495     };
01496     setHighlightColors(defaultHighlightColor(),defaultHighlightColor(), defaultHighlightColor());
01497     setFont(myGanttView->font());
01498     // if (type() ==  Task)
01499     //setText(QListViewItem::text(0)); // testing only
01500     //isvisible = true;
01501     _priority = 150;
01502     _showNoInformation = false;
01503     _enabled = true;
01504     blockUpdating = false;
01505     updateCanvasItems();
01506 }
01507 
01508 
01509 QString KDGanttViewItem::shapeToString( Shape shape )
01510 {
01511     switch( shape ) {
01512     case TriangleDown:
01513         return "TriangleDown";
01514     case TriangleUp:
01515         return "TriangleUp";
01516     case Diamond:
01517         return "Diamond";
01518     case Square:
01519         return "Square";
01520     case Circle:
01521         return "Circle";
01522     }
01523     return "";
01524 }
01525 
01526 
01527 KDGanttViewItem::Shape KDGanttViewItem::stringToShape( const QString& string )
01528 {
01529     if( string == "TriangleDown" )
01530         return TriangleDown;
01531     else if( string == "TriangleUp" )
01532         return TriangleUp;
01533     else if( string == "Diamond" )
01534         return Diamond;
01535     else if( string == "Square" )
01536         return Square;
01537     else if( string == "Circle" )
01538         return Circle;
01539     else
01540         return TriangleDown;
01541 }
01542 
01543 
01550 void KDGanttViewItem::createNode( QDomDocument& doc,
01551                                   QDomElement& parentElement )
01552 {
01553     QDomElement itemElement = doc.createElement( "Item" );
01554     parentElement.appendChild( itemElement );
01555     itemElement.setAttribute( "Type", typeToString( type() ) );
01556 
01557     KDGanttXML::createDateTimeNode( doc, itemElement, "StartTime", startTime() );
01558     KDGanttXML::createDateTimeNode( doc, itemElement, "EndTime", endTime() );
01559     KDGanttXML::createFontNode( doc, itemElement, "Font", font() );
01560     KDGanttXML::createStringNode( doc, itemElement, "Text", text() );
01561     KDGanttXML::createStringNode( doc, itemElement, "TooltipText", tooltipText() );
01562     KDGanttXML::createStringNode( doc, itemElement, "WhatsThisText",
01563                              whatsThisText() );
01564     if( pixmap() )
01565         KDGanttXML::createPixmapNode( doc, itemElement, "Pixmap", *pixmap() );
01566     if( !listViewText().isNull() )
01567         KDGanttXML::createStringNode( doc, itemElement, "ListViewText",
01568                                  listViewText() );
01569     KDGanttXML::createBoolNode( doc, itemElement, "Open", isOpen() );
01570     KDGanttXML::createBoolNode( doc, itemElement, "Highlight", highlight() );
01571     Shape startShape, middleShape, endShape;
01572     shapes( startShape, middleShape, endShape );
01573     KDGanttXML::createStringNode( doc, itemElement, "StartShape",
01574                              shapeToString( startShape ) );
01575     KDGanttXML::createStringNode( doc, itemElement, "MiddleShape",
01576                              shapeToString( middleShape ) );
01577     KDGanttXML::createStringNode( doc, itemElement, "EndShape",
01578                              shapeToString( endShape ) );
01579     KDGanttXML::createColorNode( doc, itemElement, "DefaultColor", defaultColor() );
01580     QColor startColor, middleColor, endColor;
01581     colors( startColor, middleColor, endColor );
01582     KDGanttXML::createColorNode( doc, itemElement, "StartColor", startColor );
01583     KDGanttXML::createColorNode( doc, itemElement, "MiddleColor", middleColor );
01584     KDGanttXML::createColorNode( doc, itemElement, "EndColor", endColor );
01585     KDGanttXML::createColorNode( doc, itemElement, "DefaultHighlightColor",
01586                             defaultHighlightColor() );
01587     highlightColors( startColor, middleColor, endColor );
01588     KDGanttXML::createColorNode( doc, itemElement, "StartHighlightColor",
01589                             startColor );
01590     KDGanttXML::createColorNode( doc, itemElement, "MiddleHighlightColor",
01591                             middleColor );
01592     KDGanttXML::createColorNode( doc, itemElement, "EndHighlightColor", endColor );
01593     KDGanttXML::createColorNode( doc, itemElement, "TextColor", textColor() );
01594     KDGanttXML::createStringNode( doc, itemElement, "Name", name() );
01595     QDomElement itemsElement = doc.createElement( "Items" );
01596     itemElement.appendChild( itemsElement );
01597     KDGanttViewItem* currentItem = firstChild();
01598     while( currentItem ) {
01599         currentItem->createNode( doc, itemsElement );
01600         currentItem = currentItem->nextSibling();
01601     }
01602 
01603 }
01604 
01605 
01606 
01615 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttView* view,
01616                                                         QDomElement& element )
01617 {
01618     QString typeString = element.attribute( "Type" );
01619     Q_ASSERT( !typeString.isEmpty() );
01620     KDGanttViewItem* item;
01621     if( typeString == "Task" )
01622         item = new KDGanttViewTaskItem( view );
01623     else if( typeString == "Summary" )
01624         item = new KDGanttViewSummaryItem( view );
01625     else if( typeString == "Event" )
01626         item = new KDGanttViewEventItem( view );
01627     else {
01628         qDebug( "Unknown item type %s in KDGanttViewItem::createFromDomElement()", typeString.latin1() );
01629         return 0;
01630     }
01631 
01632     item->loadFromDomElement( element );
01633     return item;
01634 }
01635 
01636 
01646 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttView* view,
01647                                                         KDGanttViewItem* previous,
01648                                                         QDomElement& element )
01649 {
01650     QString typeString = element.attribute( "Type" );
01651     Q_ASSERT( !typeString.isEmpty() );
01652     KDGanttViewItem* item;
01653     if( typeString == "Task" )
01654         item = new KDGanttViewTaskItem( view, previous );
01655     else if( typeString == "Summary" )
01656         item = new KDGanttViewSummaryItem( view, previous );
01657     else if( typeString == "Event" )
01658         item = new KDGanttViewEventItem( view, previous );
01659     else {
01660         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01661         return 0;
01662     }
01663 
01664     item->loadFromDomElement( element );
01665     return item;
01666 }
01667 
01668 
01669 
01670 
01679 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttViewItem* parent,
01680                                                         QDomElement& element )
01681 {
01682     QString typeString = element.attribute( "Type" );
01683     Q_ASSERT( !typeString.isEmpty() );
01684     KDGanttViewItem* item;
01685     if( typeString == "Task" )
01686         item = new KDGanttViewTaskItem( parent );
01687     else if( typeString == "Summary" )
01688         item = new KDGanttViewSummaryItem( parent );
01689     else if( typeString == "Event" )
01690         item = new KDGanttViewEventItem( parent );
01691     else {
01692         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01693         return 0;
01694     }
01695 
01696     item->loadFromDomElement( element );
01697     return item;
01698 }
01699 
01700 
01710 KDGanttViewItem* KDGanttViewItem::createFromDomElement( KDGanttViewItem* parent,
01711                                                         KDGanttViewItem* previous,
01712                                                         QDomElement& element )
01713 {
01714     QString typeString = element.attribute( "Type" );
01715     Q_ASSERT( !typeString.isEmpty() );
01716     KDGanttViewItem* item;
01717     if( typeString == "Task" )
01718         item = new KDGanttViewTaskItem( parent, previous );
01719     else if( typeString == "Summary" )
01720         item = new KDGanttViewSummaryItem( parent, previous );
01721     else if( typeString == "Event" )
01722         item = new KDGanttViewEventItem( parent, previous );
01723     else {
01724         qDebug( "Unknown item type in KDGanttViewItem::createFromDomElement()" );
01725         return 0;
01726     }
01727 
01728     item->loadFromDomElement( element );
01729     return item;
01730 }
01731 
01732 
01733 /*
01734   Fills in the values in the item by reading the DOM element.
01735 */
01736 void KDGanttViewItem::loadFromDomElement( QDomElement& element )
01737 {
01738     QDomNode node = element.firstChild();
01739     Shape startShape = TriangleDown, middleShape = TriangleDown,
01740             endShape = TriangleDown;
01741     QColor startColor, middleColor, endColor;
01742     QColor startHighlightColor, middleHighlightColor, endHighlightColor;
01743     QString tempName;
01744     while( !node.isNull() ) {
01745         QDomElement element = node.toElement();
01746         if( !element.isNull() ) { // was really an element
01747             QString tagName = element.tagName();
01748             if( tagName == "StartTime" ) {
01749                 QDateTime value;
01750                 if( KDGanttXML::readDateTimeNode( element, value ) )
01751                     setStartTime( value );
01752             } else if( tagName == "EndTime" ) {
01753                 QDateTime value;
01754                 if( KDGanttXML::readDateTimeNode( element, value ) )
01755                     setEndTime( value );
01756             } else if( tagName == "Text" ) {
01757                 QString value;
01758                 if( KDGanttXML::readStringNode( element, value ) )
01759                     setText( value );
01760             } else if( tagName == "Font" ) {
01761                 QFont value;
01762                 if( KDGanttXML::readFontNode( element, value ) )
01763                     setFont( value );
01764             } else if( tagName == "TooltipText" ) {
01765                 QString value;
01766                 if( KDGanttXML::readStringNode( element, value ) )
01767                     setTooltipText( value );
01768             } else if( tagName == "WhatsThisText" ) {
01769                 QString value;
01770                 if( KDGanttXML::readStringNode( element, value ) )
01771                     setWhatsThisText( value );
01772             } else if( tagName == "Pixmap" ) {
01773                 QPixmap value;
01774                 if( KDGanttXML::readPixmapNode( element, value ) )
01775                     setPixmap( value );
01776             } else if( tagName == "ListViewText" ) {
01777                 QString value;
01778                 if( KDGanttXML::readStringNode( element, value ) )
01779                     setListViewText( value );
01780             } else if( tagName == "Open" ) {
01781                 bool value;
01782                 if( KDGanttXML::readBoolNode( element, value ) )
01783                     setOpen( value );
01784             } else if( tagName == "Highlight" ) {
01785                 bool value;
01786                 if( KDGanttXML::readBoolNode( element, value ) )
01787                     setHighlight( value );
01788             } else if( tagName == "StartShape" ) {
01789                 QString value;
01790                 if( KDGanttXML::readStringNode( element, value ) )
01791                     startShape = stringToShape( value );
01792             } else if( tagName == "MiddleShape" ) {
01793                 QString value;
01794                 if( KDGanttXML::readStringNode( element, value ) )
01795                     middleShape = stringToShape( value );
01796             } else if( tagName == "EndShape" ) {
01797                 QString value;
01798                 if( KDGanttXML::readStringNode( element, value ) )
01799                     endShape = stringToShape( value );
01800             } else if( tagName == "DefaultColor" ) {
01801                 QColor value;
01802                 if( KDGanttXML::readColorNode( element, value ) )
01803                     setDefaultColor( value );
01804             } else if( tagName == "StartColor" ) {
01805                 QColor value;
01806                 if( KDGanttXML::readColorNode( element, value ) )
01807                     startColor = value;
01808             } else if( tagName == "MiddleColor" ) {
01809                 QColor value;
01810                 if( KDGanttXML::readColorNode( element, value ) )
01811                     middleColor = value;
01812             } else if( tagName == "EndColor" ) {
01813                 QColor value;
01814                 if( KDGanttXML::readColorNode( element, value ) )
01815                     endColor = value;
01816             } else if( tagName == "DefaultHighlightColor" ) {
01817                 QColor value;
01818                 if( KDGanttXML::readColorNode( element, value ) )
01819                     setDefaultHighlightColor( value );
01820             } else if( tagName == "StartHighlightColor" ) {
01821                 QColor value;
01822                 if( KDGanttXML::readColorNode( element, value ) )
01823                     startHighlightColor = value;
01824             } else if( tagName == "MiddleHighlightColor" ) {
01825                 QColor value;
01826                 if( KDGanttXML::readColorNode( element, value ) )
01827                     middleHighlightColor = value;
01828             } else if( tagName == "EndHighlightColor" ) {
01829                 QColor value;
01830                 if( KDGanttXML::readColorNode( element, value ) )
01831                     endHighlightColor = value;
01832             } else if( tagName == "TextColor" ) {
01833                 QColor value;
01834                 if( KDGanttXML::readColorNode( element, value ) )
01835                     setTextColor( value );
01836             } else if( tagName == "Name" ) {
01837                 QString value;
01838                 if( KDGanttXML::readStringNode( element, value ) )
01839                     tempName = value;
01840             } else if( tagName == "Items" ) {
01841                 QDomNode node = element.firstChild();
01842                 KDGanttViewItem* previous = 0;
01843                 while( !node.isNull() ) {
01844                     QDomElement element = node.toElement();
01845                     if( !element.isNull() ) { // was really an element
01846                         QString tagName = element.tagName();
01847                         if( tagName == "Item" ) {
01848                             KDGanttViewItem* newItem;
01849                             if( previous )
01850                                 newItem =
01851                                     KDGanttViewItem::createFromDomElement( this,
01852                                                                            previous,
01853                                                                            element );
01854                             else
01855                                 newItem =
01856                                     KDGanttViewItem::createFromDomElement( this,
01857                                                                            element );
01858                             previous = newItem;
01859                         } else {
01860                             qDebug( "Unrecognized tag name: %s", tagName.latin1() );
01861                             Q_ASSERT( false );
01862                         }
01863                     }
01864 
01865                     node = node.nextSibling();
01866                 }
01867             } else {
01868                 qDebug( "Unrecognized tag name: %s", tagName.latin1() );
01869                 Q_ASSERT( false );
01870             }
01871         }
01872 
01873         node = node.nextSibling();
01874     }
01875 
01876     setColors( startColor, middleColor, endColor );
01877     setHighlightColors( startHighlightColor, middleHighlightColor,
01878                         endHighlightColor );
01879     setShapes( startShape, middleShape, endShape );
01880     generateAndInsertName( tempName );
01881 }
01882 
01883 
01884 QString KDGanttViewItem::typeToString( Type type )
01885 {
01886     switch( type ) {
01887     case Event:
01888         return "Event";
01889     case Summary:
01890         return "Summary";
01891     case Task:
01892         return "Task";
01893     default:
01894         qDebug( "Unknown type in KDGanttViewItem::typeToString()" );
01895         return "Summary";
01896     }
01897     return "";
01898 }
01899 
01900 
01906 int KDGanttViewItem::getCoordY()
01907 {
01908     return itemPos() + height()/2;
01909 }
01910 
01911 
01912 void KDGanttViewItem::showSubItems()
01913 {
01914   showSubitemTree( getCoordY() );
01915 }
01916 
01917 
01918 void KDGanttViewItem::showSubitemTree( int CoordY )
01919 {
01920 
01921   KDGanttViewItem* temp = firstChild();
01922   if (temp) {
01923     while (temp != 0) {
01924       if (temp->isOpen() || !temp->displaySubitemsAsGroup() ) {
01925     temp->showItem( true, CoordY );
01926     if ( temp->firstChild() )
01927       temp->firstChild()->hideSubtree();
01928       } else {
01929         if ( temp->displaySubitemsAsGroup() && temp->firstChild() )
01930       temp->hideSubtree();
01931     else {
01932       temp->showSubitemTree( CoordY );
01933     }
01934       }
01935       temp = temp->nextSibling();
01936     }
01937     showItem( false );
01938   } else {
01939     showItem( true, CoordY );
01940   }
01941 }
01942 
01943 
01949 QDateTime KDGanttViewItem::myChildStartTime()
01950 {
01951   QDateTime ret, tempTime;
01952   bool set = true;
01953   KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01954   if (temp) {
01955     while (temp != 0) {
01956       if ( !temp->displaySubitemsAsGroup() ) {
01957     tempTime = temp->startTime();
01958       } else {
01959     tempTime = temp->myChildStartTime();
01960       }
01961       if ( set ) {
01962     set = false;
01963     ret = tempTime;
01964       } else {
01965     if ( tempTime < ret ) {
01966       ret = tempTime;
01967     }
01968       }
01969       temp = temp->nextSibling();
01970     }
01971   } else {
01972     ret = startTime();
01973   }
01974   return ret;
01975 }
01976 
01977 
01983 QDateTime KDGanttViewItem::myChildEndTime()
01984 {
01985   QDateTime ret, tempTime;
01986   bool set = true;
01987   KDGanttViewItem* temp = (KDGanttViewItem*) firstChild();
01988   if (temp) {
01989     while (temp != 0) {
01990       if ( !temp->displaySubitemsAsGroup() ) {
01991     tempTime = temp->endTime();
01992       } else {
01993     tempTime = temp->myChildEndTime();
01994       }
01995       if ( set ) {
01996     set = false;
01997     ret = tempTime;
01998       } else {
01999     if ( tempTime > ret ) {
02000       ret = tempTime;
02001     }
02002       }
02003       temp = temp->nextSibling();
02004     }
02005   } else {
02006     ret = endTime();
02007   }
02008   return ret;
02009 }
02010 
02011 
02018 bool KDGanttViewItem::showNoInformation()
02019 {
02020   return _showNoInformation;
02021 }
02022 
02023 
02035 void KDGanttViewItem::setShowNoInformation( bool show )
02036 {
02037   _showNoInformation = show;
02038   myGanttView->myTimeTable->updateMyContent();
02039 }
02040 
02041 
02050 KDGanttViewItem* KDGanttViewItem::getChildByName( const QString& name )
02051 {
02052   if ( listViewText() == name )
02053     return this;
02054   KDGanttViewItem* temp =  firstChild(),* ret;
02055   while (temp != 0) {
02056     if ( (ret = temp->getChildByName( name )))
02057       return ret;
02058     temp = temp->nextSibling();
02059   }
02060   return 0;
02061 }
02062 
02063 
02064 /*
02065 void  KDGanttViewItem::printinfo( QString s )
02066 {
02067   KDGanttViewItem* temp =  firstChild();
02068   while (temp != 0) {
02069     temp->printinfo("  "+s );
02070     temp = temp->nextSibling();
02071   }
02072 }
02073 */
02074 
02075 
02083 bool KDGanttViewItem::subitemIsCalendar() const
02084 {
02085   KDGanttViewItem*   temp = firstChild();
02086   bool ret = false;
02087   while (temp) {
02088     if (temp->firstChild() || temp->displaySubitemsAsGroup() ) {
02089       ret = true;
02090       break;
02091     }
02092     temp = temp->nextSibling();
02093   }
02094   return ret;
02095 }
02096 
02097 
02098 int  KDGanttViewItem::computeHeight()
02099 {
02100   int hei = 0;
02101   // if not visible, hide item and all subitems, return height = 0
02102   if ( !isVisible() ) {
02103     showItem( false );
02104     if ( firstChild() )
02105       firstChild()->hideSubtree();
02106     // qDebug("KDGanttViewItem::computeHeight() %s returns 0  ", QListViewItem::text(0).latin1());
02107     return 0;
02108   }
02109 
02110   KDGanttViewItem* temp;
02111   bool show = true;
02112 
02113   //  explanation of terms:
02114   //    display opened item as usual:
02115   //      display this item opened, display Gantt part on the timeline of this item.
02116   //      the same for all subitems: display all subitems on its own timeline
02117   //    display closed item as usual:
02118   //      display this item closed, display Gantt part on the timeline of this item.
02119   //      do not display any subitem.
02120 
02121   //  desired behaviour:
02122   //  if not in calendar mode( GanttView is NOT in calendar mode ):
02123   //    opened:
02124   //      display opened item as usual
02125   //    closed:
02126   //      if not displaySubitemsAsGroup()
02127   //        display closed item as usual
02128   //      else (  displaySubitemsAsGroup() == true )
02129   //        display not this item, display subitems on the timeline of this item
02130   //  else ( GanttView is in calendar mode )
02131   //    4 cases:
02132   //      opened && displaySubitemsAsGroup():
02133   //        display not this item, display subitems on the timeline of this item,
02134   //          which have the property displaySubitemsAsGroup() == false
02135   //        display the other items,
02136   //           which have the property displaySubitemsAsGroup() == true,
02137   //           as usual below this item on their own timeline
02138   //      opened && NOT displaySubitemsAsGroup():
02139   //        display opened item as usual
02140   //      closed && displaySubitemsAsGroup():
02141   //        display not this item, display subitems on the timeline of this item,
02142   //          which have the property displaySubitemsAsGroup() == false
02143   //      closed && NOT displaySubitemsAsGroup():
02144   //        display closed item as usual
02145   //
02146   if ( isOpen() ) {
02147     //qDebug("KDGanttViewItem::computeHeight() %s is open  ", QListViewItem::text(0).latin1());
02148     temp = firstChild();
02149     // if item opened, iterate over all subitems
02150     int tempHeight;
02151     // introduced special for performance reasons
02152     bool special = displaySubitemsAsGroup() && myGanttView->calendarMode();
02153     while (temp != 0) {
02154       tempHeight = temp->computeHeight();
02155       if ( special ) {
02156     if ( temp->displaySubitemsAsGroup() ) {
02157       hei += tempHeight;
02158       //qDebug(" hei added ");
02159     } else {
02160       temp->showSubitemTree( getCoordY() );
02161 
02162     }
02163       } else {
02164     hei += tempHeight;
02165     //qDebug(" hei added ");
02166       }
02167       temp = temp->nextSibling();
02168     }
02169   } else { // closed!
02170     //qDebug("KDGanttViewItem::computeHeight() %s is closed  ", QListViewItem::text(0).latin1());
02171 
02172     if ( !displaySubitemsAsGroup() ) {
02173       if ( firstChild() ) {
02174     firstChild()->hideSubtree();
02175       }
02176     } else {
02177       if ( firstChild() ) {
02178     showSubitemTree( getCoordY() );
02179     show =  false ;
02180       }
02181     }
02182 
02183   }
02184   if ( show )
02185      showItem( true );
02186 
02187   hei += height();
02188   //qDebug("KDGanttViewItem::computeHeight() %s returns:  %d  ", QListViewItem::text(0).latin1(), hei);
02189   return hei;
02190 }
02191 
02192 
02193 // if this item has at least one subitem which has the property displaySubitemsAsGroup(),
02194 //  a false is returned
02195 bool  KDGanttViewItem::showNoCross()
02196 {
02197   KDGanttViewItem * temp = firstChild();
02198   if ( !temp )
02199     return false;
02200   while ( temp ) {
02201     if ( temp->displaySubitemsAsGroup() ) {
02202       return false;
02203     }
02204     temp = temp->nextSibling();
02205  }
02206   return true;
02207 }
02208 
02209 
02210 void  KDGanttViewItem::paintBranches ( QPainter* p, const QColorGroup& cg,
02211                                        int w, int y, int h )
02212 {
02213   QListViewItem::paintBranches (  p,  cg, w,  y,  h);
02214   if ( !myGanttView->calendarMode() )
02215     return;
02216   else {
02217     KDGanttViewItem * temp = firstChild();
02218     while ( temp ) {
02219       if ( temp->showNoCross() ) {
02220     //qDebug("paintNoCross %s ", temp->listViewText(0).latin1());
02221     int y_coord = temp->itemPos() -height ()- itemPos();
02222     int hei = temp->height();
02223     //qDebug(" y %d w %d h %d ", y,w,h);
02224     //qDebug("yc %d  hei %d",y_coord,hei );
02225     myGanttView->myListView->paintemptyarea( p, QRect( 0,y+y_coord,w,hei));
02226     int x_c = w/2;
02227     int y_c = y+y_coord+ temp->height ()/2;
02228     int y_ce ;
02229     if ( temp->itemBelow() && temp->itemBelow()->parent() == this )
02230       y_ce =y+y_coord+ temp->height ();
02231     else
02232       y_ce = y_c;
02233     int i;
02234     for (i = y+y_coord+1; i <= y_ce; i+=2 ) {
02235       p->drawPoint( x_c, i );
02236     }
02237         for (i = x_c+2; i < w; i+=2 ) {
02238       p->drawPoint( i, y_c  );
02239     }
02240       }
02241       temp = temp->nextSibling();
02242     }
02243   }
02244 }
02245 
02246 
02247 // resets the visibility os the subitems according to the setting of calendar mode
02248 void  KDGanttViewItem::resetSubitemVisibility()
02249 {
02250   KDGanttViewItem* temp;
02251   temp = firstChild();
02252   bool allow = false;
02253   if ( myGanttView->calendarMode() ) {
02254     // in calendarmode only items can be opened which have subitems which have subitems
02255     if ( ! temp ) {
02256       if ( !parent() )
02257     // has no parent, has no child : show!
02258     setVisible( true );
02259       else
02260     // has parent, has no child : hide!
02261     setVisible( false );
02262       return;
02263     }
02264     setVisible( true );
02265     while (temp) {
02266       if (temp->firstChild()) {
02267     allow = true;
02268     temp->resetSubitemVisibility();
02269       }
02270       else {
02271     temp->setVisible(false);
02272       }
02273       temp = temp->nextSibling();
02274     }
02275   } else {
02276     setVisible( true );
02277     // all items can be opened
02278     allow = true;
02279     while (temp != 0) {
02280       temp->resetSubitemVisibility();
02281       temp = temp->nextSibling();
02282     }
02283   }
02284   if ( !allow && isOpen() )
02285     setOpen( false );
02286 
02287 }
02288 
02289 
02307 /* removed
02308 void KDGanttViewItem::setIsCalendar( bool cal )
02309 {
02310     _isCalendar = cal;
02311     updateCanvasItems();
02312 }
02313 */
02314 
02323 /* removed
02324 bool KDGanttViewItem::isCalendar( ) const
02325 {
02326     return _isCalendar;
02327 }
02328 */
02329 
02330 
02466 QPoint KDGanttViewItem::middleLeft()
02467 {
02468     return QPoint(myGanttView->myTimeHeader->getCoordX(myStartTime), itemPos()+height()/2);
02469 }
02473 QPoint KDGanttViewItem::middleRight()
02474 {
02475     return QPoint(myGanttView->myTimeHeader->getCoordX(myEndTime), itemPos()+height()/2);
02476 }
02480 void KDGanttViewItem::moveTextCanvas(int x, int y)
02481 {
02482     int mx = x + myTextOffset.x();
02483     int my = y + myTextOffset.y();
02484     if (myTextOffset.x() != 0)
02485         mx -= 2*myItemSize; // keep old behaviour
02486         
02487     textCanvas->move(mx+2*myItemSize,my-myItemSize/2);
02488     //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);
02489 }
02490 
02495 void KDGanttViewItem::moveTextCanvas() 
02496 {
02497     QPoint m = myTextOffset+middleRight();
02498     textCanvas->move(m.x(), m.y()-myItemSize/2);
02499 }
02500 
02504 void KDGanttViewItem::setTextOffset(QPoint p) 
02505 {
02506     //qDebug("%s: setTextOffset() offset: %d,%d",listViewText(0).latin1(),p.x(),p.y());
02507     myTextOffset.setX(p.x());
02508     myTextOffset.setY(p.y());
02509 }
02510 
02511 bool KDGanttViewItem::isMyTextCanvas(QCanvasItem *tc)
02512 {
02513     return tc == textCanvas;
02514 }
02515 
02523 void KDGanttViewItem::setProgress(int percent)
02524 {
02525     myProgress = QMAX(0, percent);
02526     myProgress = QMIN(100, myProgress);
02527 }
02528 
02535 void KDGanttViewItem::setFloatStartTime(const QDateTime &start)
02536 {
02537     myFloatStartTime = start;
02538 }
02539     
02546 void KDGanttViewItem::setFloatEndTime(const QDateTime &end)
02547 {
02548     myFloatEndTime = end;
02549 }
KDE Home | KDE Accessibility Home | Description of Access Keys