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 TQt, and distribute the resulting executable, 00031 ** without including the source code for TQt 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 "tqpainter.h" 00043 00044 #include "KDGanttXMLTools.h" 00045 00046 00160 TQDict<KDGanttViewItem> KDGanttViewItem::sItemDict; 00161 00171 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttView* view, 00172 const TQString& lvtext, 00173 const TQString& name ) : 00174 TQListViewItem(view->myListView,lvtext) 00175 { 00176 initColorAndShapes(type); 00177 generateAndInsertName( name ); 00178 } 00179 00180 00191 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttViewItem* parentItem, 00192 const TQString& lvtext, 00193 const TQString& name ) : 00194 TQListViewItem(parentItem,lvtext) 00195 { 00196 initColorAndShapes(type); 00197 generateAndInsertName( name ); 00198 } 00199 00200 00212 KDGanttViewItem::KDGanttViewItem( Type type, KDGanttView* view, 00213 KDGanttViewItem* after, 00214 const TQString& lvtext, 00215 const TQString& name ) : 00216 TQListViewItem(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 TQString& lvtext, 00237 const TQString& name ) : 00238 TQListViewItem( 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 TQString& 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 TQString 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 TQString KDGanttViewItem::name() const 00315 { 00316 return _name; 00317 } 00318 00319 00328 KDGanttViewItem* KDGanttViewItem::find( const TQString& name ) 00329 { 00330 if (name.isEmpty()) // avoid error msg from TQDict 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 TQListViewItem::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 TQListViewItem::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 TQDateTime& ) 00538 { 00539 } 00540 00541 00548 TQDateTime KDGanttViewItem::startTime() const 00549 { 00550 return myStartTime; 00551 } 00552 00553 00562 void KDGanttViewItem::setEndTime( const TQDateTime& 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 TQDateTime KDGanttViewItem::endTime() const 00587 { 00588 return myEndTime; 00589 } 00590 00591 00603 void KDGanttViewItem::setText( const TQString& text ) 00604 { 00605 textCanvas->setText(text); 00606 textCanvasText = text; 00607 updateCanvasItems(); 00608 } 00609 00610 00618 TQString KDGanttViewItem::text() const 00619 { 00620 return textCanvasText; 00621 } 00622 00623 00627 void KDGanttViewItem::setListViewText( const TQString& text, int column ) 00628 { 00629 TQListViewItem::setText( column, text ); 00630 } 00631 00632 00640 void KDGanttViewItem::setListViewText( int column, const TQString& text ) 00641 { 00642 TQListViewItem::setText( column, text ); 00643 } 00644 00645 00654 TQString KDGanttViewItem::listViewText( int column ) const 00655 { 00656 return TQListViewItem::text( column ); 00657 } 00658 00659 00666 void KDGanttViewItem::setFont( const TQFont& font ) 00667 { 00668 textCanvas->setFont(font); 00669 updateCanvasItems(); 00670 } 00671 00672 00679 TQFont KDGanttViewItem::font() const 00680 { 00681 return textCanvas->font(); 00682 } 00683 00684 00691 void KDGanttViewItem::setTooltipText( const TQString& text ) 00692 { 00693 myToolTipText = text; 00694 } 00695 00696 00703 TQString KDGanttViewItem::tooltipText() const 00704 { 00705 00706 return myToolTipText; 00707 } 00708 00709 00716 void KDGanttViewItem::setWhatsThisText( const TQString& text ) 00717 { 00718 myWhatsThisText = text; 00719 } 00720 00721 00729 TQString 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 TQCanvasPolygonalItem * item; 00823 TQCanvasPolygonalItem * 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 TQPointArray arr = TQPointArray(3); 00831 arr.setPoint(0,-size/2,-hei); 00832 arr.setPoint(1,size/2,-hei); 00833 arr.setPoint(2,0,((size/2)-hei)); 00834 ((TQCanvasPolygon*)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 ((TQCanvasPolygon*)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 TQPointArray arr = TQPointArray(3); 00851 arr.setPoint(0,-size/2,hei); 00852 arr.setPoint(1,size/2,hei); 00853 arr.setPoint(2,0,(-size/2)+hei); 00854 ((TQCanvasPolygon*)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 ((TQCanvasPolygon*)itemBack)->setPoints(arr); 00861 00862 break; 00863 } 00864 00865 case Diamond: 00866 { 00867 item = new KDCanvasPolygon(myGanttView->myTimeTable, this,Type_is_KDGanttViewItem); 00868 TQPointArray arr = TQPointArray(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 ((TQCanvasPolygon*)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 ((TQCanvasPolygon*)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 TQPointArray arr = TQPointArray(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 ((TQCanvasPolygon*)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 ((TQCanvasPolygon*)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 TQColor& start, const TQColor& middle, 00958 const TQColor& 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( TQColor& start, TQColor& middle, TQColor& end ) const 00986 { 00987 start = myStartColor ; 00988 middle = myMiddleColor; 00989 end = myEndColor; 00990 00991 } 00992 00993 01011 void KDGanttViewItem::setHighlightColors( const TQColor& start, const TQColor& middle, const TQColor& 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( TQColor& start, TQColor& middle, TQColor& end ) const 01038 { 01039 start = myStartColorHL ; 01040 middle = myMiddleColorHL; 01041 end = myEndColorHL; 01042 } 01043 01044 01057 void KDGanttViewItem::setTextColor( const TQColor& 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 TQColor KDGanttViewItem::textColor() const 01081 { 01082 return myTextColor; 01083 } 01084 01085 01108 void KDGanttViewItem::setPixmap( int column, const TQPixmap& pixmap ) 01109 { 01110 TQListViewItem::setPixmap( column, pixmap ); 01111 } 01112 01116 void KDGanttViewItem::setPixmap( const TQPixmap& pixmap ) 01117 { 01118 TQListViewItem::setPixmap( 0, pixmap ); 01119 } 01120 01121 01129 const TQPixmap* KDGanttViewItem::pixmap( int column ) const 01130 { 01131 return TQListViewItem::pixmap( column ); 01132 } 01133 01134 01150 void KDGanttViewItem::setDefaultColor( const TQColor& 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 TQColor KDGanttViewItem::defaultColor() const 01177 { 01178 return myDefaultColor; 01179 } 01180 01181 01197 void KDGanttViewItem::setDefaultHighlightColor( const TQColor& 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 TQColor KDGanttViewItem::defaultHighlightColor() const 01221 { 01222 return myDefaultColorHL; 01223 } 01224 01225 01231 KDGanttViewItem* KDGanttViewItem::firstChild() const 01232 { 01233 01234 return (KDGanttViewItem* )TQListViewItem::firstChild(); 01235 } 01236 01237 01244 KDGanttViewItem* KDGanttViewItem::nextSibling() const 01245 { 01246 return (KDGanttViewItem* )TQListViewItem::nextSibling(); 01247 } 01248 01249 01256 KDGanttViewItem* KDGanttViewItem::parent() const 01257 { 01258 return (KDGanttViewItem*)TQListViewItem::parent(); 01259 } 01260 01261 01267 KDGanttViewItem* KDGanttViewItem::itemAbove() 01268 { 01269 return (KDGanttViewItem* )TQListViewItem::itemAbove(); 01270 } 01271 01272 01281 KDGanttViewItem* KDGanttViewItem::itemBelow( bool includeDisabled ) 01282 { 01283 01284 KDGanttViewItem* retItem = (KDGanttViewItem* )TQListViewItem::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* )TQListViewItem::listView()->itemAt(TQPoint (2, TQListViewItem::itemPos() + TQListViewItem::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 TQPen p,pBack; 01308 TQBrush 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 //TQColor discol = TQt::lightGray; 01342 TQColor discol = TQColor(232,232,232); 01343 textCanvas->setColor( TQColor(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 TQFont 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 TQListViewItem::setOpen( open ); 01384 } 01385 } 01386 01387 01388 void KDGanttViewItem::showItem( bool, int ) 01389 { 01390 } 01391 01392 01393 TQPoint KDGanttViewItem::getTaskLinkStartCoord(TQPoint p) 01394 { 01395 textCanvas->move(p.x()+myItemSize, itemPos() + height()/2-myItemSize/2); 01396 return TQPoint (myGanttView->myTimeHeader->getCoordX(myEndTime) +myItemSize/2,itemPos()+height()/2); 01397 } 01398 01399 01400 TQPoint KDGanttViewItem::getTaskLinkEndCoord() 01401 { 01402 return TQPoint (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(TQPoint(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 =TQListViewItem::text(0); 01449 myWhatsThisText = TQListViewItem::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( TQPen ( TQt::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(TQListViewItem::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 TQString 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 TQString& 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( TQDomDocument& doc, 01553 TQDomElement& parentElement ) 01554 { 01555 TQDomElement 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 TQColor 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 TQDomElement 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 TQDomElement& element ) 01619 { 01620 TQString 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 TQDomElement& element ) 01651 { 01652 TQString 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 TQDomElement& element ) 01683 { 01684 TQString 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 TQDomElement& element ) 01715 { 01716 TQString 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( TQDomElement& element ) 01739 { 01740 TQDomNode node = element.firstChild(); 01741 Shape startShape = TriangleDown, middleShape = TriangleDown, 01742 endShape = TriangleDown; 01743 TQColor startColor, middleColor, endColor; 01744 TQColor startHighlightColor, middleHighlightColor, endHighlightColor; 01745 TQString tempName; 01746 while( !node.isNull() ) { 01747 TQDomElement element = node.toElement(); 01748 if( !element.isNull() ) { // was really an element 01749 TQString tagName = element.tagName(); 01750 if( tagName == "StartTime" ) { 01751 TQDateTime value; 01752 if( KDGanttXML::readDateTimeNode( element, value ) ) 01753 setStartTime( value ); 01754 } else if( tagName == "EndTime" ) { 01755 TQDateTime value; 01756 if( KDGanttXML::readDateTimeNode( element, value ) ) 01757 setEndTime( value ); 01758 } else if( tagName == "Text" ) { 01759 TQString value; 01760 if( KDGanttXML::readStringNode( element, value ) ) 01761 setText( value ); 01762 } else if( tagName == "Font" ) { 01763 TQFont value; 01764 if( KDGanttXML::readFontNode( element, value ) ) 01765 setFont( value ); 01766 } else if( tagName == "TooltipText" ) { 01767 TQString value; 01768 if( KDGanttXML::readStringNode( element, value ) ) 01769 setTooltipText( value ); 01770 } else if( tagName == "WhatsThisText" ) { 01771 TQString value; 01772 if( KDGanttXML::readStringNode( element, value ) ) 01773 setWhatsThisText( value ); 01774 } else if( tagName == "Pixmap" ) { 01775 TQPixmap value; 01776 if( KDGanttXML::readPixmapNode( element, value ) ) 01777 setPixmap( value ); 01778 } else if( tagName == "ListViewText" ) { 01779 TQString 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 TQString value; 01792 if( KDGanttXML::readStringNode( element, value ) ) 01793 startShape = stringToShape( value ); 01794 } else if( tagName == "MiddleShape" ) { 01795 TQString value; 01796 if( KDGanttXML::readStringNode( element, value ) ) 01797 middleShape = stringToShape( value ); 01798 } else if( tagName == "EndShape" ) { 01799 TQString value; 01800 if( KDGanttXML::readStringNode( element, value ) ) 01801 endShape = stringToShape( value ); 01802 } else if( tagName == "DefaultColor" ) { 01803 TQColor value; 01804 if( KDGanttXML::readColorNode( element, value ) ) 01805 setDefaultColor( value ); 01806 } else if( tagName == "StartColor" ) { 01807 TQColor value; 01808 if( KDGanttXML::readColorNode( element, value ) ) 01809 startColor = value; 01810 } else if( tagName == "MiddleColor" ) { 01811 TQColor value; 01812 if( KDGanttXML::readColorNode( element, value ) ) 01813 middleColor = value; 01814 } else if( tagName == "EndColor" ) { 01815 TQColor value; 01816 if( KDGanttXML::readColorNode( element, value ) ) 01817 endColor = value; 01818 } else if( tagName == "DefaultHighlightColor" ) { 01819 TQColor value; 01820 if( KDGanttXML::readColorNode( element, value ) ) 01821 setDefaultHighlightColor( value ); 01822 } else if( tagName == "StartHighlightColor" ) { 01823 TQColor value; 01824 if( KDGanttXML::readColorNode( element, value ) ) 01825 startHighlightColor = value; 01826 } else if( tagName == "MiddleHighlightColor" ) { 01827 TQColor value; 01828 if( KDGanttXML::readColorNode( element, value ) ) 01829 middleHighlightColor = value; 01830 } else if( tagName == "EndHighlightColor" ) { 01831 TQColor value; 01832 if( KDGanttXML::readColorNode( element, value ) ) 01833 endHighlightColor = value; 01834 } else if( tagName == "TextColor" ) { 01835 TQColor value; 01836 if( KDGanttXML::readColorNode( element, value ) ) 01837 setTextColor( value ); 01838 } else if( tagName == "Name" ) { 01839 TQString value; 01840 if( KDGanttXML::readStringNode( element, value ) ) 01841 tempName = value; 01842 } else if( tagName == "Items" ) { 01843 TQDomNode node = element.firstChild(); 01844 KDGanttViewItem* previous = 0; 01845 while( !node.isNull() ) { 01846 TQDomElement element = node.toElement(); 01847 if( !element.isNull() ) { // was really an element 01848 TQString 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 TQString 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 TQDateTime KDGanttViewItem::myChildStartTime() 01952 { 01953 TQDateTime 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 TQDateTime KDGanttViewItem::myChildEndTime() 01986 { 01987 TQDateTime 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 TQString& 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( TQString 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 ", TQListViewItem::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 ", TQListViewItem::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 ", TQListViewItem::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 ", TQListViewItem::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 ( TQPainter* p, const TQColorGroup& cg, 02213 int w, int y, int h ) 02214 { 02215 TQListViewItem::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, TQRect( 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 TQPoint KDGanttViewItem::middleLeft() 02469 { 02470 return TQPoint(myGanttView->myTimeHeader->getCoordX(myStartTime), itemPos()+height()/2); 02471 } 02475 TQPoint KDGanttViewItem::middleRight() 02476 { 02477 return TQPoint(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 TQPoint m = myTextOffset+middleRight(); 02500 textCanvas->move(m.x(), m.y()-myItemSize/2); 02501 } 02502 02506 void KDGanttViewItem::setTextOffset(TQPoint 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(TQCanvasItem *tc) 02514 { 02515 return tc == textCanvas; 02516 } 02517 02525 void KDGanttViewItem::setProgress(int percent) 02526 { 02527 myProgress = TQMAX(0, percent); 02528 myProgress = TQMIN(100, myProgress); 02529 } 02530 02537 void KDGanttViewItem::setFloatStartTime(const TQDateTime &start) 02538 { 02539 myFloatStartTime = start; 02540 } 02541 02548 void KDGanttViewItem::setFloatEndTime(const TQDateTime &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 }