summaryrefslogtreecommitdiffstats
path: root/kdgantt/KDGanttViewTaskLink.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdgantt/KDGanttViewTaskLink.cpp')
-rw-r--r--kdgantt/KDGanttViewTaskLink.cpp1007
1 files changed, 1007 insertions, 0 deletions
diff --git a/kdgantt/KDGanttViewTaskLink.cpp b/kdgantt/KDGanttViewTaskLink.cpp
new file mode 100644
index 00000000..22a50b8a
--- /dev/null
+++ b/kdgantt/KDGanttViewTaskLink.cpp
@@ -0,0 +1,1007 @@
+/* -*- Mode: C++ -*-
+ $Id$
+ KDGantt - a multi-platform charting engine
+*/
+/****************************************************************************
+ ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved.
+ **
+ ** This file is part of the KDGantt library.
+ **
+ ** This file may be distributed and/or modified under the terms of the
+ ** GNU General Public License version 2 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file.
+ **
+ ** Licensees holding valid commercial KDGantt licenses may use this file in
+ ** accordance with the KDGantt Commercial License Agreement provided with
+ ** the Software.
+ **
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for
+ ** information about KDGantt Commercial License Agreements.
+ **
+ ** Contact info@klaralvdalens-datakonsult.se if any conditions of this
+ ** licensing are not clear to you.
+ **
+ ** As a special exception, permission is given to link this program
+ ** with any edition of Qt, and distribute the resulting executable,
+ ** without including the source code for Qt in the source distribution.
+ **
+ **********************************************************************/
+
+
+#include "KDGanttViewTaskLink.h"
+#include "KDGanttViewTaskLinkGroup.h"
+#include "KDGanttViewSubwidgets.h"
+#include "KDGanttXMLTools.h"
+
+
+/*! \class KDGanttViewTaskLink KDGanttViewTaskLink.h
+ This class represents a link between a number of Gantt chart items.
+
+ It always connects source items with target items. Task links can
+ be grouped into KDGanttViewTaskLinkGroup objects.
+ If a Gantt view item is deleted, it is removed from the fromList or
+ from the toList.
+ If one of the lists becomes empty, the complete task link is deleted
+ as well.
+
+ The task link is deleted by KDGanttViews d'tor.
+ You may delete the task link yourself, if you do it
+ _before_ KDGanttViews d'tor is called.
+*/
+
+
+/*!
+ Creates a task link that connects all items in the source item list from
+ to all items in the destination item list to.
+
+ \param from the source items
+ \param to the target items
+ \param type the link type for the connection
+*/
+KDGanttViewTaskLink::KDGanttViewTaskLink( QPtrList<KDGanttViewItem> from,
+ QPtrList<KDGanttViewItem> to,
+ LinkType type )
+{
+ fromList= from;
+ toList = to;
+ myGroup = 0;
+ setLinkType(type);
+ initTaskLink();
+}
+
+
+/*!
+ \overload
+
+ Creates a task link that connects two items.
+ Note, that the from() and to() functions are returning a list,
+ in this case containing only one item.
+
+ \param from the source item
+ \param to the target item
+ \param type the link type for the connection
+*/
+KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewItem* from,
+ KDGanttViewItem* to,
+ LinkType type )
+{
+ fromList.append(from);
+ toList.append(to);
+ myGroup = 0;
+ setLinkType(type);
+ initTaskLink();
+
+}
+
+/*!
+ Creates a task link that connects all items in the source item list from
+ to all items in the destination item list to.
+ Inserts the link directly into a link group.
+
+ \param group the link group to insert this link into
+ \param from the source items
+ \param to the target items
+ \param type the link type for the connection
+*/
+
+KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewTaskLinkGroup* group,
+ QPtrList<KDGanttViewItem> from,
+ QPtrList<KDGanttViewItem> to,
+ LinkType type )
+{
+ fromList = from;
+ toList = to;
+ myGroup = 0;
+ setLinkType(type);
+ initTaskLink();
+ setGroup(group);
+}
+
+/*!
+ \overload
+
+ Creates a task link that connects two items and inserts the link
+ directly into a link group.
+ Note, that the from() and to() functions are returning a list,
+ in this case containing only one item.
+
+ \param group the link group to insert this link into
+ \param from the source item
+ \param to the target item
+ \param type the link type for the connection
+*/
+
+KDGanttViewTaskLink::KDGanttViewTaskLink( KDGanttViewTaskLinkGroup* group,
+ KDGanttViewItem* from,
+ KDGanttViewItem* to,
+ LinkType type )
+{
+ fromList.append(from);
+ toList.append(to);
+ myGroup = 0;
+ setLinkType(type);
+ initTaskLink();
+ setGroup(group);
+}
+
+
+KDGanttViewTaskLink::~KDGanttViewTaskLink( )
+{
+ setGroup(0);
+ myTimeTable->myTaskLinkList.remove(this);
+ delete horLineList;
+ delete verLineList;
+ delete horLineList2;
+ delete verLineList2;
+ delete horLineList3;
+ delete topList;
+ delete topLeftList;
+ delete topRightList;
+}
+
+
+void KDGanttViewTaskLink::initTaskLink()
+{
+ horLineList = new QPtrList<KDCanvasLine>;
+ verLineList = new QPtrList<KDCanvasLine>;
+ horLineList2 = new QPtrList<KDCanvasLine>;
+ verLineList2 = new QPtrList<KDCanvasLine>;
+ horLineList3 = new QPtrList<KDCanvasLine>;
+ topList = new QPtrList<KDCanvasPolygon>;
+ topLeftList = new QPtrList<KDCanvasPolygon>;
+ topRightList = new QPtrList<KDCanvasPolygon>;
+ horLineList->setAutoDelete( true );
+ verLineList->setAutoDelete( true );
+ horLineList2->setAutoDelete( true );
+ verLineList2->setAutoDelete( true );
+ horLineList3->setAutoDelete( true );
+ topList->setAutoDelete( true );
+ topLeftList->setAutoDelete( true );
+ topRightList->setAutoDelete( true );
+ myTimeTable = fromList.getFirst()->myGanttView->myTimeTable;
+ KDCanvasLine* horLine,*verLine;
+ KDCanvasLine* horLine2,*verLine2;
+ KDCanvasLine* horLine3;
+ KDCanvasPolygon* top;
+ KDCanvasPolygon* topLeft;
+ KDCanvasPolygon* topRight;
+ unsigned int i, j;
+ for ( i = 0;i < fromList.count();++i) {
+ for ( j = 0;j < toList.count();++j) {
+ horLine = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink);
+ verLine = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink);
+ horLine2 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink);
+ verLine2 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink);
+ horLine3 = new KDCanvasLine(myTimeTable,this,Type_is_KDGanttTaskLink);
+ top = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink);
+ topLeft = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink);
+ topRight = new KDCanvasPolygon(myTimeTable,this,Type_is_KDGanttTaskLink);
+ QPointArray arr = QPointArray(3);
+ arr.setPoint(0,-4,-5);
+ arr.setPoint(1,4,-5);
+ arr.setPoint(2,0,0);
+ top->setPoints(arr);
+ arr.setPoint(0,5,-5); // need an extra y pixel, canvas bug?
+ arr.setPoint(1,5,5); // need an extra y pixel, canvas bug?
+ arr.setPoint(2,0,0);
+ topLeft->setPoints(arr);
+ arr.setPoint(0,-5,-4);
+ arr.setPoint(1,-5,4);
+ arr.setPoint(2,0,0);
+ topRight->setPoints(arr);
+ horLineList->append(horLine);
+ verLineList->append(verLine);
+ horLineList2->append(horLine2);
+ verLineList2->append(verLine2);
+ horLineList3->append(horLine3);
+ topList->append(top);
+ topLeftList->append(topLeft);
+ topRightList->append(topRight);
+ horLine->setZ(1);
+ verLine->setZ(1);
+ horLine2->setZ(1);
+ verLine2->setZ(1);
+ horLine3->setZ(1);
+ top->setZ(1);
+ topLeft->setZ(1);
+ topRight->setZ(1);
+ }
+ }
+
+ setTooltipText( "Tasklink" );
+ setWhatsThisText( "Tasklink" );
+ myTimeTable->myTaskLinkList.append(this);
+ setHighlight( false);
+ setHighlightColor(Qt::red );
+ setColor(Qt::black);
+ setVisible(true);
+}
+
+
+/*!
+ Specifies whether this task link should be visible or not.
+
+ \param visible pass true to make this task link visible, and false
+ to hide it
+ \sa isVisible()
+*/
+
+void KDGanttViewTaskLink::setVisible( bool visible )
+{
+ showMe ( visible );
+ myTimeTable->updateMyContent();
+}
+void KDGanttViewTaskLink::showMe( bool visible )
+{
+ if (linkType() != None) {
+ showMeType(visible);
+ return;
+ }
+ hide();
+
+ isvisible = visible;
+ int wid = 1;
+ QPen p;
+ QBrush b;
+ p.setWidth(wid);
+ b.setStyle(Qt::SolidPattern);
+ if (ishighlighted) {
+ b.setColor(myColorHL);
+ p.setColor(myColorHL);
+
+ } else {
+ b.setColor(myColor);
+ p.setColor(myColor);
+ }
+ QPoint start, end;
+ QPtrListIterator<KDCanvasLine> horIt(*horLineList);
+ QPtrListIterator<KDCanvasLine> verIt(*verLineList);
+ QPtrListIterator<KDCanvasPolygon> topIt(*topList);
+ QPtrListIterator<KDGanttViewItem> fromIt(fromList);
+ QPtrListIterator<KDGanttViewItem> toIt(toList);
+ for ( ; fromIt.current(); ++fromIt ) {
+ (*fromIt)->setTextOffset(QPoint(0,0));
+ toIt.toFirst();
+ for ( ; toIt.current(); ++toIt ) {
+ (*toIt)->setTextOffset(QPoint(0,0));
+ if (!isvisible || ! (*fromIt)->isVisibleInGanttView || !(*toIt)->isVisibleInGanttView || !myTimeTable->taskLinksVisible) {
+ (*horIt)->hide();
+ (*verIt)->hide();
+ (*topIt)->hide();
+ ++horIt;
+ ++verIt;
+ ++topIt;
+ } else {
+ (*horIt)->setPen(p);
+ (*verIt)->setPen(p);
+ (*topIt)->setBrush(b);
+ end = (*toIt)->getTaskLinkEndCoord();
+ start = (*fromIt)->getTaskLinkStartCoord(end);
+ (*horIt)->setPoints(start.x(),start.y(),end.x()+wid,start.y());
+ (*verIt)->setPoints(end.x()+wid/2,start.y(),end.x()+wid/2,end.y()-2);
+ (*topIt)->move(end.x()+wid/2,end.y());
+ (*horIt)->show();
+ (*verIt)->show();
+ (*topIt)->show();
+ ++horIt;
+ ++verIt;
+ ++topIt;
+
+ }
+ }
+ }
+ while ( horIt.current() ) {
+ (*horIt)->hide();
+ (*verIt)->hide();
+ (*topIt)->hide();
+ ++horIt;
+ ++verIt;
+ ++topIt;
+ }
+}
+
+void KDGanttViewTaskLink::showMeType( bool visible )
+{
+ //qDebug("KDGanttViewTaskLink::showMeType %d",linkType());
+ hide();
+ isvisible = visible;
+ int wid = 1;
+ QPen p;
+ QBrush b;
+ p.setWidth(wid);
+ b.setStyle(Qt::SolidPattern);
+ if (ishighlighted) {
+ b.setColor(myColorHL);
+ p.setColor(myColorHL);
+
+ } else {
+ b.setColor(myColor);
+ p.setColor(myColor);
+ }
+ QPoint start, end;
+ QPtrListIterator<KDCanvasLine> horIt(*horLineList);
+ QPtrListIterator<KDCanvasLine> verIt(*verLineList);
+ QPtrListIterator<KDCanvasLine> horIt2(*horLineList2);
+ QPtrListIterator<KDCanvasLine> verIt2(*verLineList2);
+ QPtrListIterator<KDCanvasLine> horIt3(*horLineList3);
+ QPtrListIterator<KDCanvasPolygon> topIt(*topList);
+ QPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList);
+ QPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList);
+ QPtrListIterator<KDGanttViewItem> fromIt(fromList);
+ QPtrListIterator<KDGanttViewItem> toIt(toList);
+ for ( ; fromIt.current(); ++fromIt ) {
+ (*fromIt)->setTextOffset(QPoint(30,0));
+ (*fromIt)->moveTextCanvas();
+ toIt.toFirst();
+ for ( ; toIt.current(); ++toIt ) {
+ if (isvisible && (*fromIt)->isVisibleInGanttView &&
+ (*toIt)->isVisibleInGanttView && myTimeTable->taskLinksVisible) {
+ (*horIt)->setPen(p);
+ (*verIt)->setPen(p);
+ (*horIt2)->setPen(p);
+ (*verIt2)->setPen(p);
+ (*horIt3)->setPen(p);
+ (*topIt)->setBrush(b);
+ (*topLeftIt)->setBrush(b);
+ (*topRightIt)->setBrush(b);
+ (*toIt)->setTextOffset(QPoint(30,0));
+ (*toIt)->moveTextCanvas();
+ switch (linkType()) {
+ case StartStart: {
+ start = (*fromIt)->middleLeft();
+ end = (*toIt)->middleLeft()-QPoint(12,0);
+ bool down = start.y() < end.y();
+ (*horIt)->setPoints(start.x()-xOffset(*fromIt),start.y(),
+ start.x()-10, start.y());
+ (*verIt)->setPoints(
+ (*horIt)->endPoint().x(),
+ (*horIt)->endPoint().y(),
+ (*horIt)->endPoint().x(),
+ (down ? (*toIt)->itemPos()+1
+ : (*toIt)->itemPos()+(*toIt)->height()-1));
+ (*horIt2)->setPoints((*verIt)->endPoint().x(),
+ (*verIt)->endPoint().y(),
+ end.x()-12,
+ (*verIt)->endPoint().y());
+ (*verIt2)->setPoints((*horIt2)->endPoint().x(),
+ (*horIt2)->endPoint().y(),
+ (*horIt2)->endPoint().x(),
+ end.y());
+ (*horIt3)->setPoints((*verIt2)->endPoint().x(),
+ (*verIt2)->endPoint().y(),
+ end.x(),
+ end.y());
+ (*topRightIt)->move(end.x(),end.y());
+ (*topRightIt)->show();
+ break;
+ }
+ case FinishFinish: {
+ start = (*fromIt)->middleRight();
+ end = (*toIt)->middleRight()+QPoint(12,0);
+ bool down = start.y() < end.y();
+ (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(),
+ start.x()+10, start.y());
+ (*verIt)->setPoints(
+ (*horIt)->endPoint().x(),
+ (*horIt)->endPoint().y(),
+ (*horIt)->endPoint().x(),
+ (down ? (*toIt)->itemPos()+1
+ : (*toIt)->itemPos()+(*toIt)->height()-1));
+ (*horIt2)->setPoints((*verIt)->endPoint().x(),
+ (*verIt)->endPoint().y(),
+ end.x()+12,
+ (*verIt)->endPoint().y());
+ (*verIt2)->setPoints((*horIt2)->endPoint().x(),
+ (*horIt2)->endPoint().y(),
+ (*horIt2)->endPoint().x(),
+ end.y());
+ (*horIt3)->setPoints((*verIt2)->endPoint().x(),
+ (*verIt2)->endPoint().y(),
+ end.x(),
+ end.y());
+ (*topLeftIt)->move(end.x(),end.y());
+ (*topLeftIt)->show();
+ break;
+ }
+ case FinishStart: {
+ start = (*fromIt)->middleRight();
+ end = (*toIt)->middleLeft() - QPoint(12,0);
+ bool down = start.y() < end.y();
+ (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(),
+ start.x()+10,start.y());
+ (*verIt)->setPoints(
+ (*horIt)->endPoint().x(),
+ (*horIt)->endPoint().y(),
+ (*horIt)->endPoint().x(),
+ (down ? (*toIt)->itemPos()+1
+ : (*toIt)->itemPos()+(*toIt)->height()-1));
+ (*horIt2)->setPoints((*verIt)->endPoint().x(),
+ (*verIt)->endPoint().y(),
+ end.x()-12,
+ (*verIt)->endPoint().y());
+ (*verIt2)->setPoints((*horIt2)->endPoint().x(),
+ (*horIt2)->endPoint().y(),
+ (*horIt2)->endPoint().x(),
+ end.y());
+ (*horIt3)->setPoints((*verIt2)->endPoint().x(),
+ (*verIt2)->endPoint().y(),
+ end.x(),
+ end.y());
+ (*topRightIt)->move(end.x(),end.y());
+
+ (*topRightIt)->show();
+
+ break;
+ }
+ case StartFinish: {
+ start = (*fromIt)->middleRight();
+ end = (*toIt)->middleRight()+QPoint(12,0);
+ bool down = start.y() < end.y();
+ (*horIt)->setPoints(start.x()+xOffset(*fromIt),start.y(),
+ start.x()+10, start.y());
+ (*verIt)->setPoints(
+ (*horIt)->endPoint().x(),
+ (*horIt)->endPoint().y(),
+ (*horIt)->endPoint().x(),
+ (down ? (*toIt)->itemPos()+1
+ : (*toIt)->itemPos()+(*toIt)->height()-1));
+ (*horIt2)->setPoints((*verIt)->endPoint().x(),
+ (*verIt)->endPoint().y(),
+ end.x()-12,
+ (*verIt)->endPoint().y());
+ (*verIt2)->setPoints((*horIt2)->endPoint().x(),
+ (*horIt2)->endPoint().y(),
+ (*horIt2)->endPoint().x(),
+ end.y());
+ (*horIt3)->setPoints((*verIt2)->endPoint().x(),
+ (*verIt2)->endPoint().y(),
+ end.x(),
+ end.y());
+ (*topRightIt)->move(end.x(),end.y());
+ (*topRightIt)->show();
+ break;
+ }
+ default:
+ qWarning("KDGanttViewTaskLink: Unknown link type");
+ break;
+ }
+ (*horIt)->show();
+ (*verIt)->show();
+ (*horIt2)->show();
+ (*verIt2)->show();
+ (*horIt3)->show();
+ }
+ ++horIt;
+ ++verIt;
+ ++horIt2;
+ ++verIt2;
+ ++horIt3;
+ ++topIt;
+ ++topLeftIt;
+ ++topRightIt;
+ }
+ }
+}
+
+/*!
+ Returns whether this task link should be visible or not.
+
+ \return true if the task link is visible
+ \sa setVisible()
+*/
+bool KDGanttViewTaskLink::isVisible() const
+{
+
+ return isvisible;
+}
+
+
+/*!
+ Returns the group (if any) to which this task link belongs.
+
+ \return the group to which this task link belongs; 0 if it does not
+ belong to any group.
+ \sa KDGanttViewTaskLinkGroup
+*/
+KDGanttViewTaskLinkGroup* KDGanttViewTaskLink::group()
+{
+ return myGroup;
+}
+
+
+/*!
+ Inserts this task link in a group.
+ If the parameter is 0, the task link is removed from any group
+
+ \param group the group, this task link has to be inserted
+
+ \sa KDGanttViewTaskLinkGroup
+*/
+void KDGanttViewTaskLink::setGroup(KDGanttViewTaskLinkGroup* group)
+{
+
+ myTimeTable->myGanttView->addTaskLinkGroup(group);
+ if(myGroup == group)
+ return;
+ if (myGroup != 0)
+ myGroup->removeItem(this);
+ myGroup = group;
+ if (myGroup != 0)
+ myGroup->insertItem(this);
+}
+
+
+/*!
+ Specifies whether this task link should be shown highlighted. The
+ user can also highlight a task link with the mouse.
+
+ \param highlight pass true in order to highlight this task link
+ \sa highlight()
+*/
+void KDGanttViewTaskLink::setHighlight( bool highlight )
+{
+ ishighlighted = highlight ;
+ // if ( isvisible) setVisible(true );
+ myTimeTable->updateMyContent();
+}
+
+
+/*!
+ Returns whether this task link is highlighted, either
+ programmatically by setHighlight() or by the user with the mouse.
+
+ \return true if the task link is highlighted
+ \sa setHighlight()
+*/
+bool KDGanttViewTaskLink::highlight() const
+{
+ return ishighlighted;
+}
+
+
+/*!
+ Specifies the color to draw this task link in.
+
+ \param color the color to draw this task link in
+ \sa color()
+*/
+void KDGanttViewTaskLink::setColor( const QColor& color )
+{
+ myColor = color;
+ //if ( isvisible) setVisible(true );
+ myTimeTable->updateMyContent();
+}
+
+
+/*!
+ Returns the color in which this task link is drawn.
+
+ \return the color in which this task link is drawn
+ \sa setColor()
+*/
+QColor KDGanttViewTaskLink::color() const
+{
+ return myColor;
+}
+
+
+/*!
+ Specifies the highlight color to draw this task link in.
+
+ \param color the highlight color to draw this task link in
+ \sa highlightColor()
+*/
+void KDGanttViewTaskLink::setHighlightColor( const QColor& color )
+{
+ myColorHL = color;
+ //if ( isvisible) setVisible(true );
+ myTimeTable->updateMyContent();
+}
+
+
+/*!
+ Returns the highlight color in which this task link is drawn.
+
+ \return the highlight color in which this task link is drawn
+ \sa setHighlightColor()
+*/
+QColor KDGanttViewTaskLink::highlightColor() const
+{
+ return myColorHL;
+}
+
+
+/*!
+ Specifies the text to be shown as a tooltip for this task link.
+
+ \param text the tooltip text
+ \sa tooltipText()
+*/
+void KDGanttViewTaskLink::setTooltipText( const QString& text )
+{
+ myToolTipText = text;
+}
+
+
+/*!
+ Returns the tooltip text of this task link.
+
+ \return the tooltip text of this task link
+ \sa setTooltipText()
+*/
+QString KDGanttViewTaskLink::tooltipText() const
+{
+ return myToolTipText;
+}
+
+
+/*!
+ Specifies the text to be shown in a what's this window for this task link.
+
+ \param text the what's this text
+ \sa whatsThisText()
+*/
+void KDGanttViewTaskLink::setWhatsThisText( const QString& text )
+{
+ myWhatsThisText = text;
+
+}
+
+
+/*!
+ Returns the what's this text of this task link.
+
+ \return the what's this text of this task link
+ \sa setWhatsThisText()
+*/
+QString KDGanttViewTaskLink::whatsThisText() const
+{
+ return myWhatsThisText;
+}
+
+
+/*!
+ Returns the list of source item of this task link.
+
+ \return the ist of source item of this task link
+ \sa to()
+*/
+QPtrList<KDGanttViewItem> KDGanttViewTaskLink::from() const
+{
+ return fromList;
+}
+
+
+/*!
+ Removes a KDGanttViewItem from the lists.
+
+ \sa to() from()
+*/
+void KDGanttViewTaskLink::removeItemFromList( KDGanttViewItem* item )
+{
+ bool itemremoved = false;
+ if (fromList.remove( item )) {
+ itemremoved = true;
+ }
+ if ( toList.remove( item )) {
+ itemremoved = true;
+ }
+ if ( itemremoved ) {
+ setVisible( isvisible );
+ }
+}
+
+
+/*!
+ Returns the list of target items of this task link.
+
+ \return the list of target item of this task link
+ \sa from()
+*/
+QPtrList<KDGanttViewItem> KDGanttViewTaskLink::to() const
+{
+ return toList;
+}
+
+
+/*!
+ Creates a DOM node that describes this task link.
+
+ \param doc the DOM document to which the node belongs
+ \param parentElement the element into which to insert this node
+*/
+void KDGanttViewTaskLink::createNode( QDomDocument& doc,
+ QDomElement& parentElement )
+{
+ QDomElement taskLinkElement = doc.createElement( "TaskLink" );
+ parentElement.appendChild( taskLinkElement );
+
+ QDomElement fromItemsElement = doc.createElement( "FromItems" );
+ taskLinkElement.appendChild( fromItemsElement );
+ QPtrList<KDGanttViewItem> fromList = from();
+ KDGanttViewItem* item;
+ for( item = fromList.first(); item;
+ item = fromList.next() )
+ KDGanttXML::createStringNode( doc, fromItemsElement, "Item", item->name() );
+
+ QDomElement toItemsElement = doc.createElement( "ToItems" );
+ taskLinkElement.appendChild( toItemsElement );
+ QPtrList<KDGanttViewItem> toList = to();
+ for( item = toList.first(); item;
+ item = toList.next() )
+ KDGanttXML::createStringNode( doc, toItemsElement, "Item", item->name() );
+
+ KDGanttXML::createBoolNode( doc, taskLinkElement, "Highlight", highlight() );
+ KDGanttXML::createColorNode( doc, taskLinkElement, "Color", color() );
+ KDGanttXML::createColorNode( doc, taskLinkElement, "HighlightColor",
+ highlightColor() );
+ KDGanttXML::createStringNode( doc, taskLinkElement, "TooltipText",
+ tooltipText() );
+ KDGanttXML::createStringNode( doc, taskLinkElement, "WhatsThisText",
+ whatsThisText() );
+ if( group() )
+ KDGanttXML::createStringNode( doc, taskLinkElement, "Group",
+ group()->name() );
+ KDGanttXML::createBoolNode( doc, taskLinkElement, "Visible",
+ isVisible() );
+ KDGanttXML::createStringNode( doc, taskLinkElement, "Linktype",
+ linkTypeToString( myLinkType ) );
+}
+
+
+/*!
+ Creates a KDGanttViewTaskLink according to the specification in a DOM
+ element.
+
+ \param element the DOM element from which to read the specification
+ \return the newly created task link
+*/
+KDGanttViewTaskLink* KDGanttViewTaskLink::createFromDomElement( QDomElement& element )
+{
+ QDomNode node = element.firstChild();
+ QStringList fromList, toList;
+ bool highlight = false, visible = false;
+ QColor color, highlightColor;
+ QString tooltipText, whatsThisText, group;
+ LinkType linktype=None;
+ while( !node.isNull() ) {
+ QDomElement element = node.toElement();
+ if( !element.isNull() ) { // was really an element
+ QString tagName = element.tagName();
+ if( tagName == "FromItems" ) {
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ) {
+ QDomElement element = node.toElement();
+ if( !element.isNull() ) { // was really an element
+ QString tagName = element.tagName();
+ if( tagName == "Item" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ fromList << value;
+ } else {
+ qDebug( "Unrecognized tag name: %s", tagName.latin1() );
+ Q_ASSERT( false );
+ }
+ }
+ node = node.nextSibling();
+ }
+ } else if( tagName == "ToItems" ) {
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ) {
+ QDomElement element = node.toElement();
+ if( !element.isNull() ) { // was really an element
+ QString tagName = element.tagName();
+ if( tagName == "Item" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ toList << value;
+ } else {
+ qDebug( "Unrecognized tag name: %s", tagName.latin1() );
+ Q_ASSERT( false );
+ }
+ }
+ node = node.nextSibling();
+ }
+ } else if( tagName == "Highlight" ) {
+ bool value;
+ if( KDGanttXML::readBoolNode( element, value ) )
+ highlight = value;
+ } else if( tagName == "Visible" ) {
+ bool value;
+ if( KDGanttXML::readBoolNode( element, value ) )
+ visible = value;
+ } else if( tagName == "Color" ) {
+ QColor value;
+ if( KDGanttXML::readColorNode( element, value ) )
+ color = value;
+ } else if( tagName == "HighlightColor" ) {
+ QColor value;
+ if( KDGanttXML::readColorNode( element, value ) )
+ highlightColor = value;
+ } else if( tagName == "TooltipText" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ tooltipText = value;
+ } else if( tagName == "WhatsThisText" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ whatsThisText = value;
+ } else if( tagName == "Group" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ group = value;
+ } else if( tagName == "Linktype" ) {
+ QString value;
+ if( KDGanttXML::readStringNode( element, value ) )
+ linktype = stringToLinkType( value );
+ } else {
+ qDebug( "Unrecognized tag name: %s", tagName.latin1() );
+ Q_ASSERT( false );
+ }
+ }
+ node = node.nextSibling();
+ }
+
+ QPtrList<KDGanttViewItem> fromItemList;
+ QPtrList<KDGanttViewItem> toItemList;
+ for( QStringList::const_iterator fromIt = fromList.begin();
+ fromIt != fromList.end(); ++fromIt ) {
+ KDGanttViewItem* item = KDGanttViewItem::find( *fromIt );
+ if( item )
+ fromItemList.append( item );
+ }
+ for( QStringList::const_iterator toIt = toList.begin();
+ toIt != toList.end(); ++toIt ) {
+ KDGanttViewItem* item = KDGanttViewItem::find( *toIt );
+ if( item )
+ toItemList.append( item );
+ }
+ // safeguard aginst incorrect names
+ if (fromItemList.isEmpty()) {
+ qDebug("Cannot create link: fromItemList is empty");
+ return 0;
+ }
+ if (toItemList.isEmpty()) {
+ qDebug("Cannot create link: toItemList is empty");
+ return 0;
+ }
+ KDGanttViewTaskLink* tl = new KDGanttViewTaskLink( fromItemList,
+ toItemList );
+ tl->setLinkType( linktype );
+ tl->setVisible( visible );
+ tl->setHighlight( highlight );
+ tl->setColor( color );
+ tl->setHighlightColor( highlightColor );
+ tl->setTooltipText( tooltipText );
+ tl->setWhatsThisText( whatsThisText );
+ KDGanttViewTaskLinkGroup* gr = KDGanttViewTaskLinkGroup::find( group );
+ if( gr )
+ tl->setGroup( gr );
+
+ return tl;
+}
+
+int KDGanttViewTaskLink::linkType()
+{
+ return myLinkType;
+}
+
+void KDGanttViewTaskLink::setLinkType(int type)
+{
+ myLinkType = static_cast<LinkType>(type);
+}
+
+int KDGanttViewTaskLink::xOffset(KDGanttViewItem *item)
+{
+ switch (item->type()) {
+ case KDGanttViewItem::Task:
+ return 0;
+ break;
+ case KDGanttViewItem::Event:
+ return 4;
+ break;
+ case KDGanttViewItem::Summary:
+ return 4;
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+void KDGanttViewTaskLink::hide()
+{
+ QPtrListIterator<KDCanvasLine> horIt(*horLineList);
+ QPtrListIterator<KDCanvasLine> verIt(*verLineList);
+ QPtrListIterator<KDCanvasLine> horIt2(*horLineList2);
+ QPtrListIterator<KDCanvasLine> verIt2(*verLineList2);
+ QPtrListIterator<KDCanvasLine> horIt3(*horLineList3);
+ QPtrListIterator<KDCanvasPolygon> topIt(*topList);
+ QPtrListIterator<KDCanvasPolygon> topLeftIt(*topLeftList);
+ QPtrListIterator<KDCanvasPolygon> topRightIt(*topRightList);
+ QPtrListIterator<KDGanttViewItem> fromIt(fromList);
+ QPtrListIterator<KDGanttViewItem> toIt(toList);
+ for ( ; fromIt.current(); ++fromIt ) {
+ toIt.toFirst();
+ for ( ; toIt.current(); ++toIt ) {
+ (*horIt)->hide();
+ (*verIt)->hide();
+ (*horIt2)->hide();
+ (*verIt2)->hide();
+ (*horIt3)->hide();
+ (*topIt)->hide();
+ (*topLeftIt)->hide();
+ (*topRightIt)->hide();
+ ++horIt;
+ ++verIt;
+ ++horIt2;
+ ++verIt2;
+ ++horIt3;
+ ++topIt;
+ ++topLeftIt;
+ ++topRightIt;
+ }
+ }
+}
+
+QString KDGanttViewTaskLink::linkTypeToString( LinkType type )
+{
+ switch( type ) {
+ case None:
+ return "None";
+ break;
+ case FinishStart:
+ return "FinishStart";
+ break;
+ case FinishFinish:
+ return "FinishFinish";
+ break;
+ case StartStart:
+ return "StartStart";
+ break;
+ case StartFinish:
+ return "StartFinish";
+ break;
+ default:
+ break;
+ }
+ return "";
+}
+
+KDGanttViewTaskLink::LinkType KDGanttViewTaskLink::stringToLinkType( const QString type )
+{
+ if (type == "FinishStart")
+ return FinishStart;
+ if (type == "FinishFinish")
+ return FinishFinish;
+ if (type == "StartStart")
+ return StartStart;
+ if (type == "StartFinish")
+ return StartFinish;
+
+ return None;
+}