kdgantt

KDGanttViewTaskLink.cpp

00001 /* -*- Mode: C++ -*-
00002    $Id: KDGanttViewTaskLink.cpp 422535 2005-06-05 18:54:23Z adridg $
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 Qt, and distribute the resulting executable,
00030  ** without including the source code for Qt 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( QPtrList<KDGanttViewItem> from,
00066                                           QPtrList<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                                           QPtrList<KDGanttViewItem> from,
00113                                           QPtrList<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 QPtrList<KDCanvasLine>;
00170   verLineList = new QPtrList<KDCanvasLine>;
00171   horLineList2 = new QPtrList<KDCanvasLine>;
00172   verLineList2 = new QPtrList<KDCanvasLine>;
00173   horLineList3 = new QPtrList<KDCanvasLine>;
00174   topList = new QPtrList<KDCanvasPolygon>;
00175   topLeftList = new QPtrList<KDCanvasPolygon>;
00176   topRightList = new QPtrList<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       QPointArray arr = QPointArray(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(Qt::red );
00240   setColor(Qt::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     QPen p;
00269     QBrush 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     QPoint start, end;
00281     QPtrListIterator<KDCanvasLine> horIt(*horLineList);
00282     QPtrListIterator<KDCanvasLine> verIt(*verLineList);
00283     QPtrListIterator<KDCanvasPolygon> topIt(*topList);
00284     QPtrListIterator<KDGanttViewItem> fromIt(fromList);
00285     QPtrListIterator<KDGanttViewItem> toIt(toList);
00286     for ( ; fromIt.current(); ++fromIt ) {
00287         (*fromIt)->setTextOffset(QPoint(0,0));
00288         toIt.toFirst();
00289         for ( ; toIt.current(); ++toIt ) {
00290             (*toIt)->setTextOffset(QPoint(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     //qDebug("KDGanttViewTaskLink::showMeType %d",linkType());
00330     hide();
00331     isvisible = visible;
00332     int wid = 1;
00333     QPen p;
00334     QBrush 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     QPoint start, end;
00346     QPtrListIterator<KDCanvasLine> horIt(*horLineList);
00347     QPtrListIterator<KDCanvasLine> verIt(*verLineList);
00348     QPtrListIterator<KDCanvasLine> horIt2(*horLineList2);
00349     QPtrListIterator<KDCanvasLine> verIt2(*verLineList2);
00350     QPtrListIterator<KDCanvasLine> horIt3(*horLineList3);
00351     QPtrListIterator<KDCanvasPolygon> topIt(*topList);
00352     QPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList);
00353     QPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList);
00354     QPtrListIterator<KDGanttViewItem> fromIt(fromList);
00355     QPtrListIterator<KDGanttViewItem> toIt(toList);
00356     for ( ; fromIt.current(); ++fromIt ) {
00357         (*fromIt)->setTextOffset(QPoint(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(QPoint(30,0));
00372                 (*toIt)->moveTextCanvas();
00373                 switch (linkType()) {
00374                     case StartStart: {
00375                         start = (*fromIt)->middleLeft();
00376                         end = (*toIt)->middleLeft()-QPoint(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()+QPoint(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() - QPoint(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()+QPoint(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                         qWarning("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 QColor& color )
00593 {
00594   myColor = color;
00595   //if ( isvisible) setVisible(true );
00596  myTimeTable->updateMyContent();
00597 }
00598 
00599 
00606 QColor KDGanttViewTaskLink::color() const
00607 {
00608     return myColor;
00609 }
00610 
00611 
00618 void KDGanttViewTaskLink::setHighlightColor( const QColor& color )
00619 {
00620   myColorHL = color;
00621   //if ( isvisible) setVisible(true );
00622  myTimeTable->updateMyContent();
00623 }
00624 
00625 
00632 QColor KDGanttViewTaskLink::highlightColor() const
00633 {
00634     return myColorHL;
00635 }
00636 
00637 
00644 void KDGanttViewTaskLink::setTooltipText( const QString& text )
00645 {
00646    myToolTipText = text;
00647 }
00648 
00649 
00656 QString KDGanttViewTaskLink::tooltipText() const
00657 {
00658     return myToolTipText;
00659 }
00660 
00661 
00668 void KDGanttViewTaskLink::setWhatsThisText( const QString& text )
00669 {
00670   myWhatsThisText = text;
00671 
00672 }
00673 
00674 
00681 QString KDGanttViewTaskLink::whatsThisText() const
00682 {
00683   return myWhatsThisText;
00684 }
00685 
00686 
00693 QPtrList<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 QPtrList<KDGanttViewItem> KDGanttViewTaskLink::to() const
00726 {
00727     return toList;
00728 }
00729 
00730 
00737 void KDGanttViewTaskLink::createNode( QDomDocument& doc,
00738                                       QDomElement& parentElement )
00739 {
00740     QDomElement taskLinkElement = doc.createElement( "TaskLink" );
00741     parentElement.appendChild( taskLinkElement );
00742 
00743     QDomElement fromItemsElement = doc.createElement( "FromItems" );
00744     taskLinkElement.appendChild( fromItemsElement );
00745     QPtrList<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     QDomElement toItemsElement = doc.createElement( "ToItems" );
00752     taskLinkElement.appendChild( toItemsElement );
00753     QPtrList<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( QDomElement& element )
00784 {
00785     QDomNode node = element.firstChild();
00786     QStringList fromList, toList;
00787     bool highlight = false, visible = false;
00788     QColor color, highlightColor;
00789     QString tooltipText, whatsThisText, group;
00790     LinkType linktype=None;
00791     while( !node.isNull() ) {
00792         QDomElement element = node.toElement();
00793         if( !element.isNull() ) { // was really an element
00794             QString tagName = element.tagName();
00795             if( tagName == "FromItems" ) {
00796                 QDomNode node = element.firstChild();
00797                 while( !node.isNull() ) {
00798                     QDomElement element = node.toElement();
00799                     if( !element.isNull() ) { // was really an element
00800                         QString tagName = element.tagName();
00801                         if( tagName == "Item" ) {
00802                             QString value;
00803                             if( KDGanttXML::readStringNode( element, value ) )
00804                                 fromList << value;
00805                         } else {
00806                             qDebug( "Unrecognized tag name: %s", tagName.latin1() );
00807                             Q_ASSERT( false );
00808                         }
00809                     }
00810                     node = node.nextSibling();
00811                 }
00812             } else if( tagName == "ToItems" ) {
00813                 QDomNode node = element.firstChild();
00814                 while( !node.isNull() ) {
00815                     QDomElement element = node.toElement();
00816                     if( !element.isNull() ) { // was really an element
00817                         QString tagName = element.tagName();
00818                         if( tagName == "Item" ) {
00819                             QString value;
00820                             if( KDGanttXML::readStringNode( element, value ) )
00821                                 toList << value;
00822                         } else {
00823                             qDebug( "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                 QColor value;
00839                 if( KDGanttXML::readColorNode( element, value ) )
00840                     color = value;
00841             } else if( tagName == "HighlightColor" ) {
00842                 QColor value;
00843                 if( KDGanttXML::readColorNode( element, value ) )
00844                     highlightColor = value;
00845             } else if( tagName == "TooltipText" ) {
00846                 QString value;
00847                 if( KDGanttXML::readStringNode( element, value ) )
00848                     tooltipText = value;
00849             } else if( tagName == "WhatsThisText" ) {
00850                 QString value;
00851                 if( KDGanttXML::readStringNode( element, value ) )
00852                     whatsThisText = value;
00853             } else if( tagName == "Group" ) {
00854                 QString value;
00855                 if( KDGanttXML::readStringNode( element, value ) )
00856                     group = value;
00857             } else if( tagName == "Linktype" ) {
00858                 QString value;
00859                 if( KDGanttXML::readStringNode( element, value ) )
00860                     linktype = stringToLinkType( value );
00861             } else {
00862                 qDebug( "Unrecognized tag name: %s", tagName.latin1() );
00863                 Q_ASSERT( false );
00864             }
00865         }
00866         node = node.nextSibling();
00867     }
00868 
00869     QPtrList<KDGanttViewItem> fromItemList;
00870     QPtrList<KDGanttViewItem> toItemList;
00871     for( QStringList::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( QStringList::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         qDebug("Cannot create link: fromItemList is empty");
00886         return 0;
00887     }
00888     if (toItemList.isEmpty()) {
00889         qDebug("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     QPtrListIterator<KDCanvasLine> horIt(*horLineList);
00939     QPtrListIterator<KDCanvasLine> verIt(*verLineList);
00940     QPtrListIterator<KDCanvasLine> horIt2(*horLineList2);
00941     QPtrListIterator<KDCanvasLine> verIt2(*verLineList2);
00942     QPtrListIterator<KDCanvasLine> horIt3(*horLineList3);
00943     QPtrListIterator<KDCanvasPolygon> topIt(*topList);
00944     QPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList);
00945     QPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList);
00946     QPtrListIterator<KDGanttViewItem> fromIt(fromList);
00947     QPtrListIterator<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 QString 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 QString 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 }
KDE Home | KDE Accessibility Home | Description of Access Keys