diff options
Diffstat (limited to 'kplato/kptcanvasitem.cpp')
-rw-r--r-- | kplato/kptcanvasitem.cpp | 922 |
1 files changed, 922 insertions, 0 deletions
diff --git a/kplato/kptcanvasitem.cpp b/kplato/kptcanvasitem.cpp new file mode 100644 index 00000000..152fd837 --- /dev/null +++ b/kplato/kptcanvasitem.cpp @@ -0,0 +1,922 @@ +/* This file is part of the KDE project + Copyright (C) 2003 - 2004 Dag Andersen <danders@get2net.dk> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include "kpttask.h" +#include "kptcanvasitem.h" +#include "kptrelation.h" +#include "kptpertcanvas.h" +#include "kptganttview.h" + +#include <tdelocale.h> +#include <tqpainter.h> +#include <tqpointarray.h> +#include <tqptrlist.h> +#include <tqpoint.h> + +#include <kdebug.h> + +namespace KPlato +{ + +PertNodeItem::PertNodeItem( PertCanvas *view, Node &node, int row, int col ) + : TQCanvasPolygon(view->canvas()), + m_node(node), + m_row(row), + m_col(col) +{ + m_x = m_y = 0; + m_wgap = view->verticalGap(); + m_hgap = view->horizontalGap(); + m_width = view->itemSize().width(); + m_height = view->itemSize().height(); + + m_name = new TQCanvasText(node.name(), view->canvas()); + m_childRelations.setAutoDelete(true); +} + +PertNodeItem::~PertNodeItem() +{ + TQCanvasItemList list = canvas()->allItems(); + TQCanvasItemList::Iterator it = list.begin(); + for (; it != list.end(); ++it) + { + if ( *it == m_name ) + m_name->hide(); + if ( *it == m_leader ) + m_leader->hide(); + } + hide(); + } + +int PertNodeItem::rtti() const { return RTTI; } +int PertNodeItem::RTTI = 2000; + +void PertNodeItem::setVisible(bool yes) +{ + //kdDebug()<<k_funcinfo<<m_node.name()<<endl; + TQCanvasPolygon::setVisible(yes); + TQCanvasItemList list = canvas()->allItems(); + TQCanvasItemList::Iterator it = list.begin(); + for (; it != list.end(); ++it) + { + if ( *it == m_name ) + m_name->setVisible(yes); + if ( *it == m_leader ) + m_leader->setVisible(yes); + } +} + +void PertNodeItem::move(PertCanvas *view, int row, int col) +{ + //kdDebug()<<k_funcinfo<<endl; + m_row = row; m_col = col; + view->mapNode(this); + + // Now map my children + TQPtrListIterator<PertNodeRelation> it(m_childRelations); + for (; it.current(); ++it) + { + view->mapChildNode(this, it.current()->childItem, it.current()->relation->type()); + } + + // now move the item on the canvas + m_x = x(col); m_y = y(row); + m_left = TQPoint(m_x, m_y + m_height/2); + m_right = TQPoint(m_x + m_width, m_y + m_height/2); + TQCanvasPolygon::move(m_x, m_y); + if (m_name) + m_name->move(m_x+5, m_y+2); + + setVisible(true); + //kdDebug()<<k_funcinfo<<m_node.name()<<" moved to row,col=("<<m_row<<","<<m_col<<")"<<endl; +} + +void PertNodeItem::drawShape(TQPainter &p) +{ + //TQPen pen(pen()); + if (isSelected()) + p.setPen(TQPen(TQt::red, 2)); + TQPointArray a = poly; + int size = a.size()-1; + for(int i = 0; i < size; ++i) + { + //kdDebug()<<k_funcinfo<<" draw["<<i<<"]: "<<a[i].x()<<","<<a[i].y()<<" to "<<a[i+1].x()<<","<<a[i+1].y()<<endl; + p.drawLine(a[i], a[i+1]); + } + //setPen(pen); +} + +TQPoint PertNodeItem::exitPoint(Relation::Type type) const +{ + TQPoint ret; + switch(type) + { + case Relation::FinishStart: + case Relation::FinishFinish: + ret = m_right + TQPoint(pen().width(), 0); + break; + case Relation::StartStart: + ret = m_left + TQPoint(0, 4); + break; + } + return ret; +} + +TQPoint PertNodeItem::entryPoint(Relation::Type type) const +{ + TQPoint ret; + switch(type) + { + case Relation::FinishStart: + ret = m_left - TQPoint(pen().width(), 0); + break; + case Relation::FinishFinish: + ret = m_right - TQPoint(pen().width(), 4); + break; + case Relation::StartStart: + ret = m_left - TQPoint(pen().width(), 0); + break; + } + return ret; +} + +#ifndef NDEBUG +void PertNodeItem::printDebug( int /*info*/ ) +{ +} +#endif + +//////////////////// PertProjectItem ////////////////////////// + +PertProjectItem::PertProjectItem(PertCanvas *view, Node &node, int row, int col) + : PertNodeItem(view, node, row, col) +{ + //kdDebug()<<k_funcinfo<<"Node="<<node.name()<<" ("<<row<<","<<col<<")"<<endl; + + TQPointArray a; + a.putPoints(0, 5, + m_x+6, m_y, m_x+m_width, m_y, m_x+m_width-6, m_y+m_height, m_x, m_y+m_height, m_x+6, m_y); + setPoints(a); + + setPen(TQPen(TQt::cyan, 2)); +} + +PertProjectItem::~PertProjectItem() +{ +} + +int PertProjectItem::rtti() const { return RTTI; } +int PertProjectItem::RTTI = 2001; + +#ifndef NDEBUG +void PertProjectItem::printDebug( int /*info*/ ) +{ +} +#endif + + +//////////////////// PertTaskItem ////////////////////////// + +PertTaskItem::PertTaskItem(PertCanvas *view, Node &node, int row, int col) + : PertNodeItem(view, node, row, col) +{ + //kdDebug()<<k_funcinfo<<"Node="<<node.name()<<" ("<<row<<","<<col<<")"<<endl; + TQPointArray a; + if (node.type() == Node::Type_Summarytask) + { + a.putPoints(0, 5, m_x+6, m_y, m_x+m_width, m_y, m_x+m_width-6, m_y+m_height, m_x, m_y+m_height, m_x+6, m_y); + setPen(TQPen(TQt::cyan, 2)); + } + else + { + a.putPoints(0, 5, m_x, m_y, m_x+m_width, m_y, m_x+m_width, m_y+m_height, m_x, m_y+m_height, m_x, m_y); + setPen(TQPen(TQt::green, 2)); + } + setPoints(a); + +} + +PertTaskItem::~PertTaskItem() +{ +} + +int PertTaskItem::rtti() const { return RTTI; } +int PertTaskItem::RTTI = 2002; + + +#ifndef NDEBUG +void PertTaskItem::printDebug( int /*info*/ ) +{ +} +#endif + + +//////////////////// PertMilestoneItem ////////////////////////// + +PertMilestoneItem::PertMilestoneItem(PertCanvas *view, Node &node, int row, int col) + : PertNodeItem(view, node, row, col) +{ + //kdDebug()<<k_funcinfo<<"Node="<<node.name()<<" ("<<row<<","<<col<<")"<<endl; + + TQPointArray a; + a.putPoints(0, 7, + m_x, m_y+m_height/2, + m_x+6, m_y, + m_x+m_width-6, m_y, + m_x+m_width, m_y+m_height/2, + m_x+m_width-6, m_y+m_height, + m_x+6, m_y+m_height, + m_x, m_y+m_height/2); + + setPoints(a); + + setPen(TQPen(TQt::blue, 2)); +} + +PertMilestoneItem::~PertMilestoneItem() +{ +} + +int PertMilestoneItem::rtti() const { return RTTI; } +int PertMilestoneItem::RTTI = 2003; + +#ifndef NDEBUG +void PertMilestoneItem::printDebug( int /*info*/ ) +{ +} +#endif + + +//////////////////// PertRelationItem ////////////////////////// + +PertRelationItem::PertRelationItem( PertCanvas *view, PertNodeItem *parent, PertNodeItem *child, Relation *rel) + : TQCanvasPolygon(view->canvas()), + m_view(view), + m_rel(rel), + m_parentItem(parent), + m_childItem(child) +{ + //kdDebug()<<k_funcinfo<<"Parent="<<parent->node().name()<<" Child="<<child->node().name()<<endl; + draw(); + setVisible(true); +} + +PertRelationItem::~PertRelationItem() +{ + hide(); +} + +int PertRelationItem::rtti() const { return RTTI; } +int PertRelationItem::RTTI = 2020; + +void PertRelationItem::draw() +{ + //kdDebug()<<k_funcinfo<<endl; + // Some "rules": + // a) Relation::FinishStart: child column > parent column + // b) Relation::FinishFinish: child column >= parent column + // c) Relation::StartStart: child column >= parent column + // d) Child row can be >= parent row + + wgap = m_view->verticalGap(); + hgap = m_view->horizontalGap(); + + // could not use ...rect() here, don't know why + parentTop = (int)(m_parentItem->y()); + parentBottom = parentTop + (int)(m_parentItem->height()); + childTop = (int)(m_childItem->y()); + + childRow = m_childItem->row(); + childCol = m_childItem->column(); + parentRow = m_parentItem->row(); + parentCol = m_parentItem->column(); + //kdDebug()<<k_funcinfo<<"Parent="<<m_parentItem->node().name()<<" ("<<parentRow<<","<<parentCol<<") Child="<<m_childItem->node().name()<<" ("<<childRow<<","<<childCol<<")"<<endl; + + switch (type()) + { + case Relation::FinishStart: + setFinishStartPoints(); + break; + case Relation::FinishFinish: + setFinishFinishPoints(); + break; + case Relation::StartStart: + setStartStartPoints(); + break; + } + TQPointArray a = poly; + left = right = a[0].x(); + top = bottom = a[0].y(); + for (uint i = 0; i < a.size(); i++) + { + left = TQMIN(a[i].x(), left); + top = TQMIN(a[i].y(), top); + right = TQMAX(a[i].x(), right); + bottom = TQMAX(a[i].y(), bottom); + } + top -= 3; + bottom += 3; + + setPen(TQt::black); + setZ(45); + +/*#ifndef NDEBUG + kdDebug()<<" PertNodeRelation from parent: "<<m_rel->parent()->name()<<" to child: "<<m_rel->child()->name()<<endl; + TQPointArray pa = poly; + for (int i = 0; i < pa.size(); ++i) + kdDebug()<<" pa["<<i<<"]="<<pa[i].x()<<","<<pa[i].y()<<endl; +#endif*/ + +} + +void PertRelationItem::setFinishStartPoints() +{ + TQPoint parentPoint = m_parentItem->exitPoint(Relation::FinishStart); + TQPoint childPoint = m_childItem->entryPoint(Relation::FinishStart); + + TQPointArray a; + a.putPoints(0, 1, parentPoint.x(), parentPoint.y()); + + if ( parentRow == childRow ) + { + if (parentCol == childCol - 1 || rowFree(parentRow, parentCol+1, childCol-1)) + { + a.putPoints(1, 1, childPoint.x(), childPoint.y()); + } + else // go around below + { + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), // stop short + parentPoint.x()+(wgap/2), parentPoint.y()+3, // right/down + parentPoint.x()+(wgap/2), parentBottom+(hgap/2)-3, // stop short + parentPoint.x()+(wgap/2)+3, parentBottom+(hgap/2), // right/down + childPoint.x()-(wgap/2)-3, parentBottom+(hgap/2), // stop short + childPoint.x()-(wgap/2), parentBottom+(hgap/2)-3, // right/up + childPoint.x()-(wgap/2), childPoint.y()+3, // stop short + childPoint.x()-(wgap/2)+3, childPoint.y(), // right/up + childPoint.x(), childPoint.y()); + } + } + else if ( parentRow > childRow ) + { + if (parentCol == childCol - 1) + { + a.putPoints(1, 5, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()-3, + parentPoint.x()+wgap/2, childPoint.y()+3, + parentPoint.x()+(wgap/2)+3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + else // go around above + { + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()-3, + parentPoint.x()+wgap/2, parentTop-(hgap/2)+3, + parentPoint.x()+(wgap/2)+3, parentTop-(hgap/2), + childPoint.x()-(wgap/2)-3, parentTop-hgap/2, + childPoint.x()-(wgap/2), parentTop-(hgap/2)-3, + childPoint.x()-wgap/2, childPoint.y()+3, + childPoint.x()-(wgap/2)+3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + } + else if ( parentRow < childRow ) + { + if (parentCol == childCol - 1) + { + a.putPoints(1, 5, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()+3, + parentPoint.x()+wgap/2, childPoint.y()-3, + parentPoint.x()+(wgap/2)+3, childPoint.y(), + childPoint.x(), childPoint.y()); + + } + else + { + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()+3, + parentPoint.x()+wgap/2, childTop-(hgap/2)-3, + parentPoint.x()+(wgap/2)+3, childTop-(hgap/2), + childPoint.x()-(wgap/2)-3, childTop-(hgap/2), + childPoint.x()-(wgap/2), childTop-(hgap/2)+3, + childPoint.x()-wgap/2, childPoint.y()-3, + childPoint.x()-wgap/2+3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + } + setPoints(a); +} + +void PertRelationItem::setFinishFinishPoints() +{ + //kdDebug()<<k_funcinfo<<endl; + TQPoint parentPoint = m_parentItem->exitPoint(Relation::FinishFinish); + TQPoint childPoint = m_childItem->entryPoint(Relation::FinishFinish); + + TQPointArray a; + a.putPoints(0, 1, parentPoint.x(), parentPoint.y()); + + + if ( parentRow >= childRow ) + { + if (parentCol == childCol) + { + a.putPoints(1, 5, + childPoint.x()+(wgap/2)-3, parentPoint.y(), + childPoint.x()+(wgap/2), parentPoint.y()-3, + childPoint.x()+wgap/2, childPoint.y()+3, + childPoint.x()+(wgap/2)-3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + else if (parentCol < childCol) + { + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), // stop short + parentPoint.x()+(wgap/2), parentPoint.y()+3, // right/down + parentPoint.x()+(wgap/2), parentBottom+(hgap/2)-3, // stop short + parentPoint.x()+(wgap/2)+3, parentBottom+(hgap/2), // right/down + childPoint.x()+(wgap/2)-3, parentBottom+(hgap/2), // stop short + childPoint.x()+(wgap/2), parentBottom+(hgap/2)-3, // right/up + childPoint.x()+(wgap/2), childPoint.y()+3, // stop short + childPoint.x()+(wgap/2)-3, childPoint.y(), // left/up + childPoint.x(), childPoint.y()); + } + } + else // parentRow < choldRow + { + if (parentCol == childCol) + { + a.putPoints(1, 5, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()+3, + parentPoint.x()+wgap/2, childPoint.y()-3, + parentPoint.x()+(wgap/2)-3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + else if (parentCol < childCol) + { + if (rowFree(parentRow, parentCol+1, childCol)) + a.putPoints(1, 5, + childPoint.x()+(wgap/2)-3, parentPoint.y(), + childPoint.x()+(wgap/2), parentPoint.y()+3, + childPoint.x()+(wgap/2), childPoint.y()-3, + childPoint.x()+(wgap/2)-3, childPoint.y(), + childPoint.x(), childPoint.y()); + else + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()+3, + parentPoint.x()+wgap/2, childTop-(hgap/2)-3, + parentPoint.x()+(wgap/2)+3, childTop-(hgap/2), + childPoint.x()+(wgap/2)-3, childTop-(hgap/2), + childPoint.x()+(wgap/2), childTop-(hgap/2)+3, + childPoint.x()+(wgap/2), childPoint.y()-3, + childPoint.x()+(wgap/2)-3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + else + { + a.putPoints(1, 9, + parentPoint.x()+(wgap/2)-3, parentPoint.y(), + parentPoint.x()+(wgap/2), parentPoint.y()+3, + parentPoint.x()+wgap/2, childTop-(hgap/2)-3, + parentPoint.x()+(wgap/2)+3, childTop-(hgap/2), + childPoint.x()+(wgap/2)-3, childTop-(hgap/2), + childPoint.x()+(wgap/2), childTop-(hgap/2)+3, + childPoint.x()+wgap/2, childPoint.y()-3, + childPoint.x()+wgap/2-3, childPoint.y(), + childPoint.x(), childPoint.y()); + } + } + setPoints(a); +} + +void PertRelationItem::setStartStartPoints() +{ + //kdDebug()<<k_funcinfo<<endl; + TQPoint parentPoint = m_parentItem->exitPoint(Relation::StartStart); + TQPoint childPoint = m_childItem->entryPoint(Relation::StartStart); + + TQPointArray a; + a.putPoints(0, 1, parentPoint.x(), parentPoint.y()); + + if ( parentRow > childRow ) + { + if (parentCol == childCol) // go up + { + a.putPoints(1, 4, + parentPoint.x()-(wgap/2)+3, parentPoint.y(), + parentPoint.x()-(wgap/2), parentPoint.y()-3, + parentPoint.x()-(wgap/2), childPoint.y()+3, + parentPoint.x()-(wgap/2)+3, childPoint.y()); + } + else // go above myself + { + a.putPoints(1, 8, + parentPoint.x()-(wgap/2)+3, parentPoint.y(), + parentPoint.x()-(wgap/2), parentPoint.y()-3, + parentPoint.x()-(wgap/2), parentTop-(hgap/2)+3, + parentPoint.x()-(wgap/2)+3, parentTop-(hgap/2), + childPoint.x()-(wgap/2)-3, parentTop-(hgap/2), + childPoint.x()-(wgap/2), parentTop-(hgap/2)-3, + childPoint.x()-(wgap/2), childPoint.y()+3, + childPoint.x()-(wgap/2)+3, childPoint.y()); + } + } + else // go left/down + { + a.putPoints(1, 2, + parentPoint.x()-(wgap/2)+3, parentPoint.y(), + parentPoint.x()-(wgap/2), parentPoint.y()+3); + + if (parentCol == childCol) + { + a.putPoints(3, 2, + parentPoint.x()-(wgap/2), childPoint.y()-3, + parentPoint.x()-(wgap/2)+3, childPoint.y()); + } + else // go below myself + { + if (parentRow == childRow) // go up + { + a.putPoints(3, 6, + parentPoint.x()-(wgap/2), parentBottom+hgap/2-3, + parentPoint.x()-(wgap/2)+3, parentBottom+hgap/2, + childPoint.x()-(wgap/2)-3, parentBottom+hgap/2, + childPoint.x()-(wgap/2), parentBottom+hgap/2-3, + childPoint.x()-(wgap/2), childPoint.y()+3, + childPoint.x()-(wgap/2)+3, childPoint.y()); + } + else // go down + { + a.putPoints(3, 6, + parentPoint.x()-(wgap/2), childTop-(hgap/2)-3, + parentPoint.x()-(wgap/2)+3, childTop-hgap/2, + childPoint.x()-(wgap/2)-3, childTop-hgap/2, + childPoint.x()-(wgap/2), childTop-(hgap/2)+3, + childPoint.x()-(wgap/2), childPoint.y()-3, + childPoint.x()-(wgap/2)+3, childPoint.y()); + } + } + } + a.putPoints(a.size(), 1, childPoint.x(), childPoint.y()); + setPoints(a); +} + +void PertRelationItem::drawShape(TQPainter &p) +{ + //kdDebug()<<k_funcinfo<<" "<<m_rel->parent()->name()<<" to "<<m_rel->child()->name()<<endl; + // cannot use polygon's drawShape() as it doesn't use the pen + setBrush(Qt::NoBrush); + TQPointArray a = poly; + int size = a.size()-1; + for(int i = 0; i < size; ++i) + { + //kdDebug()<<k_funcinfo<<" draw["<<i<<"]: "<<a[i].x()<<","<<a[i].y()<<" to "<<a[i+1].x()<<","<<a[i+1].y()<<endl; + p.drawLine(a[i], a[i+1]); + } + // Draw arrow + int pos = a.size()-1; + int xoffset = -3; + if ( pos > 1&& a[pos-1].x() > a[pos].x()) + xoffset = 3; + TQPoint pnt(a[pos].x()+xoffset, a[pos].y()-3); + p.drawLine(a[pos], pnt); + pnt.setY(a[pos].y()+3); + p.drawLine(a[pos], pnt); +} + +TQPointArray PertRelationItem::areaPoints () const +{ + TQPointArray pa(4); + int pw = (pen().width()+1)/2; + if ( pw < 1 ) pw = 1; + if ( pen() == Qt::NoPen ) pw = 0; + pa[0] = TQPoint(left-pw,top-pw); + pa[1] = pa[0] + TQPoint(right-left+pw*2,0); + pa[2] = pa[1] + TQPoint(0,bottom-top+pw*2); + pa[3] = pa[0] + TQPoint(0,bottom-top+pw*2); +/* kdDebug()<<k_funcinfo<<" areaPoints: "<<m_rel->parent()->name()<<" to "<<m_rel->child()->name()<<endl; + kdDebug()<<" "<<pa[0].x()<<","<<pa[0].y()<<" "<<pa[1].x()<<","<<pa[1].y()<<endl; + kdDebug()<<" "<<pa[2].x()<<","<<pa[2].y()<<" "<<pa[3].x()<<","<<pa[3].y()<<endl;*/ + return pa; +} + +bool PertRelationItem::rowFree(int row, int startCol, int endCol) +{ + TQCanvasItemList list = canvas()->allItems(); + TQCanvasItemList::Iterator it = list.begin(); + for (; it != list.end(); ++it) + { + if ( (*it)->rtti() == PertProjectItem::RTTI || + (*it)->rtti() == PertTaskItem::RTTI || + (*it)->rtti() == PertMilestoneItem::RTTI ) + { + PertNodeItem *item = (PertNodeItem *)(*it); + if ( item->row() == row ) + { + int col = item->column(); + if (col >= startCol && col <= endCol) + { + //kdDebug()<<k_funcinfo<<"Hit on row,col="<<row<<","<<col<<endl; + return false; + } + } + } + } + return true; +} + +#ifndef NDEBUG +void PertRelationItem::printDebug( int /*info*/ ) +{ +} +#endif + +//////////////////// ItemBase ////////////////////////// +KDGanttViewTaskLink::LinkType ItemBase::kdLinkType(int relationType) { + switch (relationType) { + case Relation::FinishStart: + return KDGanttViewTaskLink::FinishStart; + break; + case Relation::FinishFinish: + return KDGanttViewTaskLink::FinishFinish; + break; + case Relation::StartStart: + return KDGanttViewTaskLink::StartStart; + break; + default: + break; + } + return KDGanttViewTaskLink::None; +} + +//////////////////// GanttViewSummaryItem ////////////////////////// + + +GanttViewSummaryItem::GanttViewSummaryItem(KDGanttView *parent, Node *node) + : KDGanttViewSummaryItem(parent, node->name()), + m_node(node), + m_view(parent) +{ + setExpandable(true); + setOpen(true); +} + +GanttViewSummaryItem::GanttViewSummaryItem(KDGanttViewItem *parent, Node *node) + : KDGanttViewSummaryItem(parent, node->name()), + m_node(node), + m_view(0) +{ + m_drawn = false; + GanttViewSummaryItem *p = dynamic_cast<GanttViewSummaryItem*>(parent); + if (p) + m_view = p->ganttView(); + setExpandable(true); + setOpen(true); +} + +void GanttViewSummaryItem::insertRelations(GanttView *view) +{ + //kdDebug()<<k_funcinfo<<endl; + + TQPtrListIterator<Relation> it(m_node->dependChildNodes()); + for (; it.current(); ++it) + { + KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child()); + if (child) + { + KDGanttViewTaskLink *link = new KDGanttViewTaskLink(this, child, kdLinkType(it.current()->type())); + //TODO i18n + TQString t = i18n("From: %1").arg(this->listViewText(0)); + t += "\n" + i18n("To: %1").arg(child->listViewText(0)); + if (it.current()->lag() > Duration::zeroDuration) { + t += "\n" + i18n("Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime)); + } + link->setTooltipText(t); + view->addTaskLink(link); + } + } +} + +KDGanttViewItem *GanttViewSummaryItem::find(Node *node) +{ + //kdDebug()<<k_funcinfo<<endl; + if (m_node == node) + return this; + + KDGanttViewItem *item = find(firstChild(), node); + if (item) + return item; + + return find(nextSibling(), node); +} + + +KDGanttViewItem *GanttViewSummaryItem::find(KDGanttViewItem *item, Node *node) +{ + if (!item) + return 0; + + if (item->type() == Event) + { + GanttViewEventItem *i = static_cast<GanttViewEventItem *>(item); + return i->find(node); + } + else if (item->type() == Task) + { + GanttViewTaskItem *i = static_cast<GanttViewTaskItem *>(item); + return i->find(node); + } + else if (item->type() == Summary) + { + GanttViewSummaryItem *i = static_cast<GanttViewSummaryItem *>(item); + return i->find(node); + } + return 0; +} + +//////////////////// GanttViewTaskItem ////////////////////////// + + +GanttViewTaskItem::GanttViewTaskItem(KDGanttView *parent, KPlato::Task *task) + : KDGanttViewTaskItem(parent, task->name()), + m_task(task), + m_view(parent) +{ +} + +GanttViewTaskItem::GanttViewTaskItem(KDGanttViewItem *parent, KPlato::Task *task) + : KDGanttViewTaskItem(parent, task->name()), + m_task(task), + m_view() +{ + m_drawn = false; + GanttViewSummaryItem *p = dynamic_cast<GanttViewSummaryItem*>(parent); + if (p) + m_view = p->ganttView(); +} + +void GanttViewTaskItem::insertRelations(GanttView *view) +{ + //kdDebug()<<k_funcinfo<<endl; + + TQPtrListIterator<Relation> it(m_task->dependChildNodes()); + for (; it.current(); ++it) + { + KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child()); + if (child) + { + KDGanttViewTaskLink *link = new KDGanttViewTaskLink(this, child, kdLinkType(it.current()->type())); + //TODO i18n + TQString t = i18n("From: %1").arg(this->listViewText(0)); + t += "\n" + i18n("To: %1").arg(child->listViewText(0)); + if (it.current()->lag() > Duration::zeroDuration) { + t += "\n" + i18n("Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime)); + } + link->setTooltipText(t); + view->addTaskLink(link); + } + } +} + +KDGanttViewItem *GanttViewTaskItem::find(Node *node) +{ + //kdDebug()<<k_funcinfo<<endl; + if (m_task == node) + return this; + + KDGanttViewItem *item = find(firstChild(), node); + if (item) + return item; + + return find(nextSibling(), node); +} + + +KDGanttViewItem *GanttViewTaskItem::find(KDGanttViewItem *item, Node *node) +{ + if (!item) + return 0; + + if (item->type() == Event) + { + GanttViewEventItem *i = static_cast<GanttViewEventItem *>(item); + return i->find(node); + } + else if (item->type() == Task) + { + GanttViewTaskItem *i= static_cast<GanttViewTaskItem *>(item); + return i->find(node); + } + else if (item->type() == Summary) + { + GanttViewSummaryItem *i = static_cast<GanttViewSummaryItem *>(item); + return i->find(node); + } + return 0; // avoid warning +} + +//////////////////// GanttViewEventItem ////////////////////////// + + +GanttViewEventItem::GanttViewEventItem(KDGanttView *parent, KPlato::Task *task) + : KDGanttViewEventItem(parent, task->name()), + m_task(task), + m_view(parent) +{ +} + +GanttViewEventItem::GanttViewEventItem(KDGanttViewItem *parent, KPlato::Task *task) + : KDGanttViewEventItem(parent, task->name()), + m_task(task), + m_view() +{ + m_drawn = false; + GanttViewSummaryItem *p = dynamic_cast<GanttViewSummaryItem*>(parent); + if (p) + m_view = p->ganttView(); +} + + +void GanttViewEventItem::insertRelations(GanttView *view) +{ + //kdDebug()<<k_funcinfo<<endl; + + TQPtrListIterator<Relation> it(m_task->dependChildNodes()); + for (; it.current(); ++it) + { + KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child()); + if (child) + { + KDGanttViewTaskLink *link = new KDGanttViewTaskLink(this, child, kdLinkType(it.current()->type())); + + TQString t = i18n("From: %1").arg(this->listViewText(0)); + t += "\n" + i18n("To: %1").arg(child->listViewText(0)); + if (it.current()->lag() > Duration::zeroDuration) { + t += "\n" + i18n("Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime)); + } + link->setTooltipText(t); + view->addTaskLink(link); + } + } +} + +KDGanttViewItem *GanttViewEventItem::find(Node *node) +{ + //kdDebug()<<k_funcinfo<<endl; + if (m_task == node) + return this; + + KDGanttViewItem *item = find(firstChild(), node); + if (item) + return item; + + return find(nextSibling(), node); +} + + +KDGanttViewItem *GanttViewEventItem::find(KDGanttViewItem *item, Node *node) +{ + if (!item) + return 0; + + if (item->type() == Event) + { + GanttViewEventItem *i = static_cast<GanttViewEventItem *>(item); + return i->find(node); + } + else if (item->type() == Task) + { + GanttViewTaskItem *i = static_cast<GanttViewTaskItem *>(item); + return i->find(node); + } + else if (item->type() == Summary) + { + GanttViewSummaryItem *i = static_cast<GanttViewSummaryItem *>(item); + return i->find(node); + } + return 0; +} + +} //KPlato namespace |