KDGanttViewTaskLink.cpp
00001 /* -*- Mode: C++ -*- 00002 $Id$ 00003 KDGantt - a multi-platform charting engine 00004 */ 00005 /**************************************************************************** 00006 ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved. 00007 ** 00008 ** This file is part of the KDGantt library. 00009 ** 00010 ** This file may be distributed and/or modified under the terms of the 00011 ** GNU General Public License version 2 as published by the Free Software 00012 ** Foundation and appearing in the file LICENSE.GPL included in the 00013 ** packaging of this file. 00014 ** 00015 ** Licensees holding valid commercial KDGantt licenses may use this file in 00016 ** accordance with the KDGantt Commercial License Agreement provided with 00017 ** the Software. 00018 ** 00019 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00020 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00021 ** 00022 ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for 00023 ** information about KDGantt Commercial License Agreements. 00024 ** 00025 ** Contact info@klaralvdalens-datakonsult.se if any conditions of this 00026 ** licensing are not clear to you. 00027 ** 00028 ** As a special exception, permission is given to link this program 00029 ** with any edition of TQt, and distribute the resulting executable, 00030 ** without including the source code for TQt in the source distribution. 00031 ** 00032 **********************************************************************/ 00033 00034 00035 #include "KDGanttViewTaskLink.h" 00036 #include "KDGanttViewTaskLinkGroup.h" 00037 #include "KDGanttViewSubwidgets.h" 00038 #include "KDGanttXMLTools.h" 00039 00040 00065 KDGanttViewTaskLink::KDGanttViewTaskLink( TQPtrList<KDGanttViewItem> from, 00066 TQPtrList<KDGanttViewItem> to, 00067 LinkType type ) 00068 { 00069 fromList= from; 00070 toList = to; 00071 myGroup = 0; 00072 setLinkType(type); 00073 initTaskLink(); 00074 } 00075 00076 00088 KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewItem* from, 00089 KDGanttViewItem* to, 00090 LinkType type ) 00091 { 00092 fromList.append(from); 00093 toList.append(to); 00094 myGroup = 0; 00095 setLinkType(type); 00096 initTaskLink(); 00097 00098 } 00099 00111 KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewTaskLinkGroup* group, 00112 TQPtrList<KDGanttViewItem> from, 00113 TQPtrList<KDGanttViewItem> to, 00114 LinkType type ) 00115 { 00116 fromList = from; 00117 toList = to; 00118 myGroup = 0; 00119 setLinkType(type); 00120 initTaskLink(); 00121 setGroup(group); 00122 } 00123 00138 KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewTaskLinkGroup* group, 00139 KDGanttViewItem* from, 00140 KDGanttViewItem* to, 00141 LinkType type ) 00142 { 00143 fromList.append(from); 00144 toList.append(to); 00145 myGroup = 0; 00146 setLinkType(type); 00147 initTaskLink(); 00148 setGroup(group); 00149 } 00150 00151 00152 KDGanttViewTaskLink::~KDGanttViewTaskLink( ) 00153 { 00154 setGroup(0); 00155 myTimeTable->myTaskLinkList.remove(this); 00156 delete horLineList; 00157 delete verLineList; 00158 delete horLineList2; 00159 delete verLineList2; 00160 delete horLineList3; 00161 delete topList; 00162 delete topLeftList; 00163 delete topRightList; 00164 } 00165 00166 00167 void KDGanttViewTaskLink::initTaskLink() 00168 { 00169 horLineList = new TQPtrList<KDCanvasLine>; 00170 verLineList = new TQPtrList<KDCanvasLine>; 00171 horLineList2 = new TQPtrList<KDCanvasLine>; 00172 verLineList2 = new TQPtrList<KDCanvasLine>; 00173 horLineList3 = new TQPtrList<KDCanvasLine>; 00174 topList = new TQPtrList<KDCanvasPolygon>; 00175 topLeftList = new TQPtrList<KDCanvasPolygon>; 00176 topRightList = new TQPtrList<KDCanvasPolygon>; 00177 horLineList->setAutoDelete( true ); 00178 verLineList->setAutoDelete( true ); 00179 horLineList2->setAutoDelete( true ); 00180 verLineList2->setAutoDelete( true ); 00181 horLineList3->setAutoDelete( true ); 00182 topList->setAutoDelete( true ); 00183 topLeftList->setAutoDelete( true ); 00184 topRightList->setAutoDelete( true ); 00185 myTimeTable = fromList.getFirst()->myGanttView->myTimeTable; 00186 KDCanvasLine* horLine,*verLine; 00187 KDCanvasLine* horLine2,*verLine2; 00188 KDCanvasLine* horLine3; 00189 KDCanvasPolygon* top; 00190 KDCanvasPolygon* topLeft; 00191 KDCanvasPolygon* topRight; 00192 unsigned int i, j; 00193 for ( i = 0;i < fromList.count();++i) { 00194 for ( j = 0;j < toList.count();++j) { 00195 horLine = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink); 00196 verLine = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink); 00197 horLine2 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink); 00198 verLine2 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink); 00199 horLine3 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink); 00200 top = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink); 00201 topLeft = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink); 00202 topRight = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink); 00203 TQPointArray arr = TQPointArray(3); 00204 arr.setPoint(0,-4,-5); 00205 arr.setPoint(1,4,-5); 00206 arr.setPoint(2,0,0); 00207 top->setPoints(arr); 00208 arr.setPoint(0,5,-5); // need an extra y pixel, canvas bug? 00209 arr.setPoint(1,5,5); // need an extra y pixel, canvas bug? 00210 arr.setPoint(2,0,0); 00211 topLeft->setPoints(arr); 00212 arr.setPoint(0,-5,-4); 00213 arr.setPoint(1,-5,4); 00214 arr.setPoint(2,0,0); 00215 topRight->setPoints(arr); 00216 horLineList->append(horLine); 00217 verLineList->append(verLine); 00218 horLineList2->append(horLine2); 00219 verLineList2->append(verLine2); 00220 horLineList3->append(horLine3); 00221 topList->append(top); 00222 topLeftList->append(topLeft); 00223 topRightList->append(topRight); 00224 horLine->setZ(1); 00225 verLine->setZ(1); 00226 horLine2->setZ(1); 00227 verLine2->setZ(1); 00228 horLine3->setZ(1); 00229 top->setZ(1); 00230 topLeft->setZ(1); 00231 topRight->setZ(1); 00232 } 00233 } 00234 00235 setTooltipText( "Tasklink" ); 00236 setWhatsThisText( "Tasklink" ); 00237 myTimeTable->myTaskLinkList.append(this); 00238 setHighlight( false); 00239 setHighlightColor(TQt::red ); 00240 setColor(TQt::black); 00241 setVisible(true); 00242 } 00243 00244 00253 void KDGanttViewTaskLink::setVisible( bool visible ) 00254 { 00255 showMe ( visible ); 00256 myTimeTable->updateMyContent(); 00257 } 00258 void KDGanttViewTaskLink::showMe( bool visible ) 00259 { 00260 if (linkType() != None) { 00261 showMeType(visible); 00262 return; 00263 } 00264 hide(); 00265 00266 isvisible = visible; 00267 int wid = 1; 00268 TQPen p; 00269 TQBrush b; 00270 p.setWidth(wid); 00271 b.setStyle(Qt::SolidPattern); 00272 if (ishighlighted) { 00273 b.setColor(myColorHL); 00274 p.setColor(myColorHL); 00275 00276 } else { 00277 b.setColor(myColor); 00278 p.setColor(myColor); 00279 } 00280 TQPoint start, end; 00281 TQPtrListIterator<KDCanvasLine> horIt(*horLineList); 00282 TQPtrListIterator<KDCanvasLine> verIt(*verLineList); 00283 TQPtrListIterator<KDCanvasPolygon> topIt(*topList); 00284 TQPtrListIterator<KDGanttViewItem> fromIt(fromList); 00285 TQPtrListIterator<KDGanttViewItem> toIt(toList); 00286 for ( ; fromIt.current(); ++fromIt ) { 00287 (*fromIt)->setTextOffset(TQPoint(0,0)); 00288 toIt.toFirst(); 00289 for ( ; toIt.current(); ++toIt ) { 00290 (*toIt)->setTextOffset(TQPoint(0,0)); 00291 if (!isvisible || ! (*fromIt)->isVisibleInGanttView || !(*toIt)->isVisibleInGanttView || !myTimeTable->taskLinksVisible) { 00292 (*horIt)->hide(); 00293 (*verIt)->hide(); 00294 (*topIt)->hide(); 00295 ++horIt; 00296 ++verIt; 00297 ++topIt; 00298 } else { 00299 (*horIt)->setPen(p); 00300 (*verIt)->setPen(p); 00301 (*topIt)->setBrush(b); 00302 end = (*toIt)->getTaskLinkEndCoord(); 00303 start = (*fromIt)->getTaskLinkStartCoord(end); 00304 (*horIt)->setPoints(start.x(),start.y(),end.x()+wid,start.y()); 00305 (*verIt)->setPoints(end.x()+wid/2,start.y(),end.x()+wid/2,end.y()-2); 00306 (*topIt)->move(end.x()+wid/2,end.y()); 00307 (*horIt)->show(); 00308 (*verIt)->show(); 00309 (*topIt)->show(); 00310 ++horIt; 00311 ++verIt; 00312 ++topIt; 00313 00314 } 00315 } 00316 } 00317 while ( horIt.current() ) { 00318 (*horIt)->hide(); 00319 (*verIt)->hide(); 00320 (*topIt)->hide(); 00321 ++horIt; 00322 ++verIt; 00323 ++topIt; 00324 } 00325 } 00326 00327 void KDGanttViewTaskLink::showMeType( bool visible ) 00328 { 00329 //tqDebug("KDGanttViewTaskLink::showMeType %d",linkType()); 00330 hide(); 00331 isvisible = visible; 00332 int wid = 1; 00333 TQPen p; 00334 TQBrush b; 00335 p.setWidth(wid); 00336 b.setStyle(Qt::SolidPattern); 00337 if (ishighlighted) { 00338 b.setColor(myColorHL); 00339 p.setColor(myColorHL); 00340 00341 } else { 00342 b.setColor(myColor); 00343 p.setColor(myColor); 00344 } 00345 TQPoint start, end; 00346 TQPtrListIterator<KDCanvasLine> horIt(*horLineList); 00347 TQPtrListIterator<KDCanvasLine> verIt(*verLineList); 00348 TQPtrListIterator<KDCanvasLine> horIt2(*horLineList2); 00349 TQPtrListIterator<KDCanvasLine> verIt2(*verLineList2); 00350 TQPtrListIterator<KDCanvasLine> horIt3(*horLineList3); 00351 TQPtrListIterator<KDCanvasPolygon> topIt(*topList); 00352 TQPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList); 00353 TQPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList); 00354 TQPtrListIterator<KDGanttViewItem> fromIt(fromList); 00355 TQPtrListIterator<KDGanttViewItem> toIt(toList); 00356 for ( ; fromIt.current(); ++fromIt ) { 00357 (*fromIt)->setTextOffset(TQPoint(30,0)); 00358 (*fromIt)->moveTextCanvas(); 00359 toIt.toFirst(); 00360 for ( ; toIt.current(); ++toIt ) { 00361 if (isvisible && (*fromIt)->isVisibleInGanttView && 00362 (*toIt)->isVisibleInGanttView && myTimeTable->taskLinksVisible) { 00363 (*horIt)->setPen(p); 00364 (*verIt)->setPen(p); 00365 (*horIt2)->setPen(p); 00366 (*verIt2)->setPen(p); 00367 (*horIt3)->setPen(p); 00368 (*topIt)->setBrush(b); 00369 (*topLeftIt)->setBrush(b); 00370 (*topRightIt)->setBrush(b); 00371 (*toIt)->setTextOffset(TQPoint(30,0)); 00372 (*toIt)->moveTextCanvas(); 00373 switch (linkType()) { 00374 case StartStart: { 00375 start = (*fromIt)->middleLeft(); 00376 end = (*toIt)->middleLeft()-TQPoint(12,0); 00377 bool down = start.y() < end.y(); 00378 (*horIt)->setPoints(start.x()-xOffset(*fromIt),start.y(), 00379 start.x()-10, start.y()); 00380 (*verIt)->setPoints( 00381 (*horIt)->endPoint().x(), 00382 (*horIt)->endPoint().y(), 00383 (*horIt)->endPoint().x(), 00384 (down ? (*toIt)->itemPos()+1 00385 : (*toIt)->itemPos()+(*toIt)->height()-1)); 00386 (*horIt2)->setPoints((*verIt)->endPoint().x(), 00387 (*verIt)->endPoint().y(), 00388 end.x()-12, 00389 (*verIt)->endPoint().y()); 00390 (*verIt2)->setPoints((*horIt2)->endPoint().x(), 00391 (*horIt2)->endPoint().y(), 00392 (*horIt2)->endPoint().x(), 00393 end.y()); 00394 (*horIt3)->setPoints((*verIt2)->endPoint().x(), 00395 (*verIt2)->endPoint().y(), 00396 end.x(), 00397 end.y()); 00398 (*topRightIt)->move(end.x(),end.y()); 00399 (*topRightIt)->show(); 00400 break; 00401 } 00402 case FinishFinish: { 00403 start = (*fromIt)->middleRight(); 00404 end = (*toIt)->middleRight()+TQPoint(12,0); 00405 bool down = start.y() < end.y(); 00406 (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(), 00407 start.x()+10, start.y()); 00408 (*verIt)->setPoints( 00409 (*horIt)->endPoint().x(), 00410 (*horIt)->endPoint().y(), 00411 (*horIt)->endPoint().x(), 00412 (down ? (*toIt)->itemPos()+1 00413 : (*toIt)->itemPos()+(*toIt)->height()-1)); 00414 (*horIt2)->setPoints((*verIt)->endPoint().x(), 00415 (*verIt)->endPoint().y(), 00416 end.x()+12, 00417 (*verIt)->endPoint().y()); 00418 (*verIt2)->setPoints((*horIt2)->endPoint().x(), 00419 (*horIt2)->endPoint().y(), 00420 (*horIt2)->endPoint().x(), 00421 end.y()); 00422 (*horIt3)->setPoints((*verIt2)->endPoint().x(), 00423 (*verIt2)->endPoint().y(), 00424 end.x(), 00425 end.y()); 00426 (*topLeftIt)->move(end.x(),end.y()); 00427 (*topLeftIt)->show(); 00428 break; 00429 } 00430 case FinishStart: { 00431 start = (*fromIt)->middleRight(); 00432 end = (*toIt)->middleLeft() - TQPoint(12,0); 00433 bool down = start.y() < end.y(); 00434 (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(), 00435 start.x()+10,start.y()); 00436 (*verIt)->setPoints( 00437 (*horIt)->endPoint().x(), 00438 (*horIt)->endPoint().y(), 00439 (*horIt)->endPoint().x(), 00440 (down ? (*toIt)->itemPos()+1 00441 : (*toIt)->itemPos()+(*toIt)->height()-1)); 00442 (*horIt2)->setPoints((*verIt)->endPoint().x(), 00443 (*verIt)->endPoint().y(), 00444 end.x()-12, 00445 (*verIt)->endPoint().y()); 00446 (*verIt2)->setPoints((*horIt2)->endPoint().x(), 00447 (*horIt2)->endPoint().y(), 00448 (*horIt2)->endPoint().x(), 00449 end.y()); 00450 (*horIt3)->setPoints((*verIt2)->endPoint().x(), 00451 (*verIt2)->endPoint().y(), 00452 end.x(), 00453 end.y()); 00454 (*topRightIt)->move(end.x(),end.y()); 00455 00456 (*topRightIt)->show(); 00457 00458 break; 00459 } 00460 case StartFinish: { 00461 start = (*fromIt)->middleRight(); 00462 end = (*toIt)->middleRight()+TQPoint(12,0); 00463 bool down = start.y() < end.y(); 00464 (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(), 00465 start.x()+10, start.y()); 00466 (*verIt)->setPoints( 00467 (*horIt)->endPoint().x(), 00468 (*horIt)->endPoint().y(), 00469 (*horIt)->endPoint().x(), 00470 (down ? (*toIt)->itemPos()+1 00471 : (*toIt)->itemPos()+(*toIt)->height()-1)); 00472 (*horIt2)->setPoints((*verIt)->endPoint().x(), 00473 (*verIt)->endPoint().y(), 00474 end.x()-12, 00475 (*verIt)->endPoint().y()); 00476 (*verIt2)->setPoints((*horIt2)->endPoint().x(), 00477 (*horIt2)->endPoint().y(), 00478 (*horIt2)->endPoint().x(), 00479 end.y()); 00480 (*horIt3)->setPoints((*verIt2)->endPoint().x(), 00481 (*verIt2)->endPoint().y(), 00482 end.x(), 00483 end.y()); 00484 (*topRightIt)->move(end.x(),end.y()); 00485 (*topRightIt)->show(); 00486 break; 00487 } 00488 default: 00489 tqWarning("KDGanttViewTaskLink: Unknown link type"); 00490 break; 00491 } 00492 (*horIt)->show(); 00493 (*verIt)->show(); 00494 (*horIt2)->show(); 00495 (*verIt2)->show(); 00496 (*horIt3)->show(); 00497 } 00498 ++horIt; 00499 ++verIt; 00500 ++horIt2; 00501 ++verIt2; 00502 ++horIt3; 00503 ++topIt; 00504 ++topLeftIt; 00505 ++topRightIt; 00506 } 00507 } 00508 } 00509 00516 bool KDGanttViewTaskLink::isVisible() const 00517 { 00518 00519 return isvisible; 00520 } 00521 00522 00530 KDGanttViewTaskLinkGroup* KDGanttViewTaskLink::group() 00531 { 00532 return myGroup; 00533 } 00534 00535 00544 void KDGanttViewTaskLink::setGroup(KDGanttViewTaskLinkGroup* group) 00545 { 00546 00547 myTimeTable->myGanttView->addTaskLinkGroup(group); 00548 if(myGroup == group) 00549 return; 00550 if (myGroup != 0) 00551 myGroup->removeItem(this); 00552 myGroup = group; 00553 if (myGroup != 0) 00554 myGroup->insertItem(this); 00555 } 00556 00557 00565 void KDGanttViewTaskLink::setHighlight( bool highlight ) 00566 { 00567 ishighlighted = highlight ; 00568 // if ( isvisible) setVisible(true ); 00569 myTimeTable->updateMyContent(); 00570 } 00571 00572 00580 bool KDGanttViewTaskLink::highlight() const 00581 { 00582 return ishighlighted; 00583 } 00584 00585 00592 void KDGanttViewTaskLink::setColor( const TQColor& color ) 00593 { 00594 myColor = color; 00595 //if ( isvisible) setVisible(true ); 00596 myTimeTable->updateMyContent(); 00597 } 00598 00599 00606 TQColor KDGanttViewTaskLink::color() const 00607 { 00608 return myColor; 00609 } 00610 00611 00618 void KDGanttViewTaskLink::setHighlightColor( const TQColor& color ) 00619 { 00620 myColorHL = color; 00621 //if ( isvisible) setVisible(true ); 00622 myTimeTable->updateMyContent(); 00623 } 00624 00625 00632 TQColor KDGanttViewTaskLink::highlightColor() const 00633 { 00634 return myColorHL; 00635 } 00636 00637 00644 void KDGanttViewTaskLink::setTooltipText( const TQString& text ) 00645 { 00646 myToolTipText = text; 00647 } 00648 00649 00656 TQString KDGanttViewTaskLink::tooltipText() const 00657 { 00658 return myToolTipText; 00659 } 00660 00661 00668 void KDGanttViewTaskLink::setWhatsThisText( const TQString& text ) 00669 { 00670 myWhatsThisText = text; 00671 00672 } 00673 00674 00681 TQString KDGanttViewTaskLink::whatsThisText() const 00682 { 00683 return myWhatsThisText; 00684 } 00685 00686 00693 TQPtrList<KDGanttViewItem> KDGanttViewTaskLink::from() const 00694 { 00695 return fromList; 00696 } 00697 00698 00704 void KDGanttViewTaskLink::removeItemFromList( KDGanttViewItem* item ) 00705 { 00706 bool itemremoved = false; 00707 if (fromList.remove( item )) { 00708 itemremoved = true; 00709 } 00710 if ( toList.remove( item )) { 00711 itemremoved = true; 00712 } 00713 if ( itemremoved ) { 00714 setVisible( isvisible ); 00715 } 00716 } 00717 00718 00725 TQPtrList<KDGanttViewItem> KDGanttViewTaskLink::to() const 00726 { 00727 return toList; 00728 } 00729 00730 00737 void KDGanttViewTaskLink::createNode( TQDomDocument& doc, 00738 TQDomElement& parentElement ) 00739 { 00740 TQDomElement taskLinkElement = doc.createElement( "TaskLink" ); 00741 parentElement.appendChild( taskLinkElement ); 00742 00743 TQDomElement fromItemsElement = doc.createElement( "FromItems" ); 00744 taskLinkElement.appendChild( fromItemsElement ); 00745 TQPtrList<KDGanttViewItem> fromList = from(); 00746 KDGanttViewItem* item; 00747 for( item = fromList.first(); item; 00748 item = fromList.next() ) 00749 KDGanttXML::createStringNode( doc, fromItemsElement, "Item", item->name() ); 00750 00751 TQDomElement toItemsElement = doc.createElement( "ToItems" ); 00752 taskLinkElement.appendChild( toItemsElement ); 00753 TQPtrList<KDGanttViewItem> toList = to(); 00754 for( item = toList.first(); item; 00755 item = toList.next() ) 00756 KDGanttXML::createStringNode( doc, toItemsElement, "Item", item->name() ); 00757 00758 KDGanttXML::createBoolNode( doc, taskLinkElement, "Highlight", highlight() ); 00759 KDGanttXML::createColorNode( doc, taskLinkElement, "Color", color() ); 00760 KDGanttXML::createColorNode( doc, taskLinkElement, "HighlightColor", 00761 highlightColor() ); 00762 KDGanttXML::createStringNode( doc, taskLinkElement, "TooltipText", 00763 tooltipText() ); 00764 KDGanttXML::createStringNode( doc, taskLinkElement, "WhatsThisText", 00765 whatsThisText() ); 00766 if( group() ) 00767 KDGanttXML::createStringNode( doc, taskLinkElement, "Group", 00768 group()->name() ); 00769 KDGanttXML::createBoolNode( doc, taskLinkElement, "Visible", 00770 isVisible() ); 00771 KDGanttXML::createStringNode( doc, taskLinkElement, "Linktype", 00772 linkTypeToString( myLinkType ) ); 00773 } 00774 00775 00783 KDGanttViewTaskLink* KDGanttViewTaskLink::createFromDomElement( TQDomElement& element ) 00784 { 00785 TQDomNode node = element.firstChild(); 00786 TQStringList fromList, toList; 00787 bool highlight = false, visible = false; 00788 TQColor color, highlightColor; 00789 TQString tooltipText, whatsThisText, group; 00790 LinkType linktype=None; 00791 while( !node.isNull() ) { 00792 TQDomElement element = node.toElement(); 00793 if( !element.isNull() ) { // was really an element 00794 TQString tagName = element.tagName(); 00795 if( tagName == "FromItems" ) { 00796 TQDomNode node = element.firstChild(); 00797 while( !node.isNull() ) { 00798 TQDomElement element = node.toElement(); 00799 if( !element.isNull() ) { // was really an element 00800 TQString tagName = element.tagName(); 00801 if( tagName == "Item" ) { 00802 TQString value; 00803 if( KDGanttXML::readStringNode( element, value ) ) 00804 fromList << value; 00805 } else { 00806 tqDebug( "Unrecognized tag name: %s", tagName.latin1() ); 00807 Q_ASSERT( false ); 00808 } 00809 } 00810 node = node.nextSibling(); 00811 } 00812 } else if( tagName == "ToItems" ) { 00813 TQDomNode node = element.firstChild(); 00814 while( !node.isNull() ) { 00815 TQDomElement element = node.toElement(); 00816 if( !element.isNull() ) { // was really an element 00817 TQString tagName = element.tagName(); 00818 if( tagName == "Item" ) { 00819 TQString value; 00820 if( KDGanttXML::readStringNode( element, value ) ) 00821 toList << value; 00822 } else { 00823 tqDebug( "Unrecognized tag name: %s", tagName.latin1() ); 00824 Q_ASSERT( false ); 00825 } 00826 } 00827 node = node.nextSibling(); 00828 } 00829 } else if( tagName == "Highlight" ) { 00830 bool value; 00831 if( KDGanttXML::readBoolNode( element, value ) ) 00832 highlight = value; 00833 } else if( tagName == "Visible" ) { 00834 bool value; 00835 if( KDGanttXML::readBoolNode( element, value ) ) 00836 visible = value; 00837 } else if( tagName == "Color" ) { 00838 TQColor value; 00839 if( KDGanttXML::readColorNode( element, value ) ) 00840 color = value; 00841 } else if( tagName == "HighlightColor" ) { 00842 TQColor value; 00843 if( KDGanttXML::readColorNode( element, value ) ) 00844 highlightColor = value; 00845 } else if( tagName == "TooltipText" ) { 00846 TQString value; 00847 if( KDGanttXML::readStringNode( element, value ) ) 00848 tooltipText = value; 00849 } else if( tagName == "WhatsThisText" ) { 00850 TQString value; 00851 if( KDGanttXML::readStringNode( element, value ) ) 00852 whatsThisText = value; 00853 } else if( tagName == "Group" ) { 00854 TQString value; 00855 if( KDGanttXML::readStringNode( element, value ) ) 00856 group = value; 00857 } else if( tagName == "Linktype" ) { 00858 TQString value; 00859 if( KDGanttXML::readStringNode( element, value ) ) 00860 linktype = stringToLinkType( value ); 00861 } else { 00862 tqDebug( "Unrecognized tag name: %s", tagName.latin1() ); 00863 Q_ASSERT( false ); 00864 } 00865 } 00866 node = node.nextSibling(); 00867 } 00868 00869 TQPtrList<KDGanttViewItem> fromItemList; 00870 TQPtrList<KDGanttViewItem> toItemList; 00871 for( TQStringList::const_iterator fromIt = fromList.begin(); 00872 fromIt != fromList.end(); ++fromIt ) { 00873 KDGanttViewItem* item = KDGanttViewItem::find( *fromIt ); 00874 if( item ) 00875 fromItemList.append( item ); 00876 } 00877 for( TQStringList::const_iterator toIt = toList.begin(); 00878 toIt != toList.end(); ++toIt ) { 00879 KDGanttViewItem* item = KDGanttViewItem::find( *toIt ); 00880 if( item ) 00881 toItemList.append( item ); 00882 } 00883 // safeguard aginst incorrect names 00884 if (fromItemList.isEmpty()) { 00885 tqDebug("Cannot create link: fromItemList is empty"); 00886 return 0; 00887 } 00888 if (toItemList.isEmpty()) { 00889 tqDebug("Cannot create link: toItemList is empty"); 00890 return 0; 00891 } 00892 KDGanttViewTaskLink* tl = new KDGanttViewTaskLink( fromItemList, 00893 toItemList ); 00894 tl->setLinkType( linktype ); 00895 tl->setVisible( visible ); 00896 tl->setHighlight( highlight ); 00897 tl->setColor( color ); 00898 tl->setHighlightColor( highlightColor ); 00899 tl->setTooltipText( tooltipText ); 00900 tl->setWhatsThisText( whatsThisText ); 00901 KDGanttViewTaskLinkGroup* gr = KDGanttViewTaskLinkGroup::find( group ); 00902 if( gr ) 00903 tl->setGroup( gr ); 00904 00905 return tl; 00906 } 00907 00908 int KDGanttViewTaskLink::linkType() 00909 { 00910 return myLinkType; 00911 } 00912 00913 void KDGanttViewTaskLink::setLinkType(int type) 00914 { 00915 myLinkType = static_cast<LinkType>(type); 00916 } 00917 00918 int KDGanttViewTaskLink::xOffset(KDGanttViewItem *item) 00919 { 00920 switch (item->type()) { 00921 case KDGanttViewItem::Task: 00922 return 0; 00923 break; 00924 case KDGanttViewItem::Event: 00925 return 4; 00926 break; 00927 case KDGanttViewItem::Summary: 00928 return 4; 00929 break; 00930 default: 00931 break; 00932 } 00933 return 0; 00934 } 00935 00936 void KDGanttViewTaskLink::hide() 00937 { 00938 TQPtrListIterator<KDCanvasLine> horIt(*horLineList); 00939 TQPtrListIterator<KDCanvasLine> verIt(*verLineList); 00940 TQPtrListIterator<KDCanvasLine> horIt2(*horLineList2); 00941 TQPtrListIterator<KDCanvasLine> verIt2(*verLineList2); 00942 TQPtrListIterator<KDCanvasLine> horIt3(*horLineList3); 00943 TQPtrListIterator<KDCanvasPolygon> topIt(*topList); 00944 TQPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList); 00945 TQPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList); 00946 TQPtrListIterator<KDGanttViewItem> fromIt(fromList); 00947 TQPtrListIterator<KDGanttViewItem> toIt(toList); 00948 for ( ; fromIt.current(); ++fromIt ) { 00949 toIt.toFirst(); 00950 for ( ; toIt.current(); ++toIt ) { 00951 (*horIt)->hide(); 00952 (*verIt)->hide(); 00953 (*horIt2)->hide(); 00954 (*verIt2)->hide(); 00955 (*horIt3)->hide(); 00956 (*topIt)->hide(); 00957 (*topLeftIt)->hide(); 00958 (*topRightIt)->hide(); 00959 ++horIt; 00960 ++verIt; 00961 ++horIt2; 00962 ++verIt2; 00963 ++horIt3; 00964 ++topIt; 00965 ++topLeftIt; 00966 ++topRightIt; 00967 } 00968 } 00969 } 00970 00971 TQString KDGanttViewTaskLink::linkTypeToString( LinkType type ) 00972 { 00973 switch( type ) { 00974 case None: 00975 return "None"; 00976 break; 00977 case FinishStart: 00978 return "FinishStart"; 00979 break; 00980 case FinishFinish: 00981 return "FinishFinish"; 00982 break; 00983 case StartStart: 00984 return "StartStart"; 00985 break; 00986 case StartFinish: 00987 return "StartFinish"; 00988 break; 00989 default: 00990 break; 00991 } 00992 return ""; 00993 } 00994 00995 KDGanttViewTaskLink::LinkType KDGanttViewTaskLink::stringToLinkType( const TQString type ) 00996 { 00997 if (type == "FinishStart") 00998 return FinishStart; 00999 if (type == "FinishFinish") 01000 return FinishFinish; 01001 if (type == "StartStart") 01002 return StartStart; 01003 if (type == "StartFinish") 01004 return StartFinish; 01005 01006 return None; 01007 }