21#include "kptcanvasitem.h"
22#include "kptrelation.h"
23#include "kptpertcanvas.h"
24#include "kptganttview.h"
28#include <tqpointarray.h>
37PertNodeItem::PertNodeItem( PertCanvas *view, Node &node,
int row,
int col )
38 : TQCanvasPolygon(view->canvas()),
44 m_wgap = view->verticalGap();
45 m_hgap = view->horizontalGap();
46 m_width = view->itemSize().width();
47 m_height = view->itemSize().height();
49 m_name =
new TQCanvasText(node.name(), view->canvas());
50 m_childRelations.setAutoDelete(
true);
53PertNodeItem::~PertNodeItem()
55 TQCanvasItemList list = canvas()->allItems();
56 TQCanvasItemList::Iterator it = list.begin();
57 for (; it != list.end(); ++it)
61 if ( *it == m_leader )
67int PertNodeItem::rtti()
const {
return RTTI; }
68int PertNodeItem::RTTI = 2000;
70void PertNodeItem::setVisible(
bool yes)
73 TQCanvasPolygon::setVisible(yes);
74 TQCanvasItemList list = canvas()->allItems();
75 TQCanvasItemList::Iterator it = list.begin();
76 for (; it != list.end(); ++it)
79 m_name->setVisible(yes);
80 if ( *it == m_leader )
81 m_leader->setVisible(yes);
85void PertNodeItem::move(PertCanvas *view,
int row,
int col)
88 m_row = row; m_col = col;
92 TQPtrListIterator<PertNodeRelation> it(m_childRelations);
93 for (; it.current(); ++it)
95 view->mapChildNode(
this, it.current()->childItem, it.current()->relation->type());
99 m_x = x(col); m_y = y(row);
100 m_left = TQPoint(m_x, m_y + m_height/2);
101 m_right = TQPoint(m_x + m_width, m_y + m_height/2);
102 TQCanvasPolygon::move(m_x, m_y);
104 m_name->move(m_x+5, m_y+2);
110void PertNodeItem::drawShape(TQPainter &p)
114 p.setPen(TQPen(TQt::red, 2));
115 TQPointArray a = poly;
116 int size = a.size()-1;
117 for(
int i = 0; i < size; ++i)
120 p.drawLine(a[i], a[i+1]);
125TQPoint PertNodeItem::exitPoint(Relation::Type type)
const
130 case Relation::FinishStart:
131 case Relation::FinishFinish:
132 ret = m_right + TQPoint(pen().width(), 0);
134 case Relation::StartStart:
135 ret = m_left + TQPoint(0, 4);
141TQPoint PertNodeItem::entryPoint(Relation::Type type)
const
146 case Relation::FinishStart:
147 ret = m_left - TQPoint(pen().width(), 0);
149 case Relation::FinishFinish:
150 ret = m_right - TQPoint(pen().width(), 4);
152 case Relation::StartStart:
153 ret = m_left - TQPoint(pen().width(), 0);
160void PertNodeItem::printDebug(
int )
167PertProjectItem::PertProjectItem(PertCanvas *view, Node &node,
int row,
int col)
168 : PertNodeItem(view, node, row, col)
174 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);
177 setPen(TQPen(TQt::cyan, 2));
180PertProjectItem::~PertProjectItem()
184int PertProjectItem::rtti()
const {
return RTTI; }
185int PertProjectItem::RTTI = 2001;
188void PertProjectItem::printDebug(
int )
196PertTaskItem::PertTaskItem(PertCanvas *view, Node &node,
int row,
int col)
197 : PertNodeItem(view, node, row, col)
201 if (node.type() == Node::Type_Summarytask)
203 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);
204 setPen(TQPen(TQt::cyan, 2));
208 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);
209 setPen(TQPen(TQt::green, 2));
215PertTaskItem::~PertTaskItem()
219int PertTaskItem::rtti()
const {
return RTTI; }
220int PertTaskItem::RTTI = 2002;
224void PertTaskItem::printDebug(
int )
232PertMilestoneItem::PertMilestoneItem(PertCanvas *view, Node &node,
int row,
int col)
233 : PertNodeItem(view, node, row, col)
242 m_x+m_width, m_y+m_height/2,
243 m_x+m_width-6, m_y+m_height,
245 m_x, m_y+m_height/2);
249 setPen(TQPen(TQt::blue, 2));
252PertMilestoneItem::~PertMilestoneItem()
256int PertMilestoneItem::rtti()
const {
return RTTI; }
257int PertMilestoneItem::RTTI = 2003;
260void PertMilestoneItem::printDebug(
int )
268PertRelationItem::PertRelationItem( PertCanvas *view, PertNodeItem *parent, PertNodeItem *child, Relation *rel)
269 : TQCanvasPolygon(view->canvas()),
272 m_parentItem(parent),
280PertRelationItem::~PertRelationItem()
285int PertRelationItem::rtti()
const {
return RTTI; }
286int PertRelationItem::RTTI = 2020;
288void PertRelationItem::draw()
297 wgap = m_view->verticalGap();
298 hgap = m_view->horizontalGap();
301 parentTop = (int)(m_parentItem->y());
302 parentBottom = parentTop + (int)(m_parentItem->height());
303 childTop = (int)(m_childItem->y());
305 childRow = m_childItem->row();
306 childCol = m_childItem->column();
307 parentRow = m_parentItem->row();
308 parentCol = m_parentItem->column();
313 case Relation::FinishStart:
314 setFinishStartPoints();
316 case Relation::FinishFinish:
317 setFinishFinishPoints();
319 case Relation::StartStart:
320 setStartStartPoints();
323 TQPointArray a = poly;
324 left = right = a[0].x();
325 top = bottom = a[0].y();
326 for (uint i = 0; i < a.size(); i++)
328 left = TQMIN(a[i].x(), left);
329 top = TQMIN(a[i].y(), top);
330 right = TQMAX(a[i].x(), right);
331 bottom = TQMAX(a[i].y(), bottom);
348void PertRelationItem::setFinishStartPoints()
350 TQPoint parentPoint = m_parentItem->exitPoint(Relation::FinishStart);
351 TQPoint childPoint = m_childItem->entryPoint(Relation::FinishStart);
354 a.putPoints(0, 1, parentPoint.x(), parentPoint.y());
356 if ( parentRow == childRow )
358 if (parentCol == childCol - 1 || rowFree(parentRow, parentCol+1, childCol-1))
360 a.putPoints(1, 1, childPoint.x(), childPoint.y());
365 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
366 parentPoint.x()+(wgap/2), parentPoint.y()+3,
367 parentPoint.x()+(wgap/2), parentBottom+(hgap/2)-3,
368 parentPoint.x()+(wgap/2)+3, parentBottom+(hgap/2),
369 childPoint.x()-(wgap/2)-3, parentBottom+(hgap/2),
370 childPoint.x()-(wgap/2), parentBottom+(hgap/2)-3,
371 childPoint.x()-(wgap/2), childPoint.y()+3,
372 childPoint.x()-(wgap/2)+3, childPoint.y(),
373 childPoint.x(), childPoint.y());
376 else if ( parentRow > childRow )
378 if (parentCol == childCol - 1)
381 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
382 parentPoint.x()+(wgap/2), parentPoint.y()-3,
383 parentPoint.x()+wgap/2, childPoint.y()+3,
384 parentPoint.x()+(wgap/2)+3, childPoint.y(),
385 childPoint.x(), childPoint.y());
390 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
391 parentPoint.x()+(wgap/2), parentPoint.y()-3,
392 parentPoint.x()+wgap/2, parentTop-(hgap/2)+3,
393 parentPoint.x()+(wgap/2)+3, parentTop-(hgap/2),
394 childPoint.x()-(wgap/2)-3, parentTop-hgap/2,
395 childPoint.x()-(wgap/2), parentTop-(hgap/2)-3,
396 childPoint.x()-wgap/2, childPoint.y()+3,
397 childPoint.x()-(wgap/2)+3, childPoint.y(),
398 childPoint.x(), childPoint.y());
401 else if ( parentRow < childRow )
403 if (parentCol == childCol - 1)
406 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
407 parentPoint.x()+(wgap/2), parentPoint.y()+3,
408 parentPoint.x()+wgap/2, childPoint.y()-3,
409 parentPoint.x()+(wgap/2)+3, childPoint.y(),
410 childPoint.x(), childPoint.y());
416 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
417 parentPoint.x()+(wgap/2), parentPoint.y()+3,
418 parentPoint.x()+wgap/2, childTop-(hgap/2)-3,
419 parentPoint.x()+(wgap/2)+3, childTop-(hgap/2),
420 childPoint.x()-(wgap/2)-3, childTop-(hgap/2),
421 childPoint.x()-(wgap/2), childTop-(hgap/2)+3,
422 childPoint.x()-wgap/2, childPoint.y()-3,
423 childPoint.x()-wgap/2+3, childPoint.y(),
424 childPoint.x(), childPoint.y());
430void PertRelationItem::setFinishFinishPoints()
433 TQPoint parentPoint = m_parentItem->exitPoint(Relation::FinishFinish);
434 TQPoint childPoint = m_childItem->entryPoint(Relation::FinishFinish);
437 a.putPoints(0, 1, parentPoint.x(), parentPoint.y());
440 if ( parentRow >= childRow )
442 if (parentCol == childCol)
445 childPoint.x()+(wgap/2)-3, parentPoint.y(),
446 childPoint.x()+(wgap/2), parentPoint.y()-3,
447 childPoint.x()+wgap/2, childPoint.y()+3,
448 childPoint.x()+(wgap/2)-3, childPoint.y(),
449 childPoint.x(), childPoint.y());
451 else if (parentCol < childCol)
454 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
455 parentPoint.x()+(wgap/2), parentPoint.y()+3,
456 parentPoint.x()+(wgap/2), parentBottom+(hgap/2)-3,
457 parentPoint.x()+(wgap/2)+3, parentBottom+(hgap/2),
458 childPoint.x()+(wgap/2)-3, parentBottom+(hgap/2),
459 childPoint.x()+(wgap/2), parentBottom+(hgap/2)-3,
460 childPoint.x()+(wgap/2), childPoint.y()+3,
461 childPoint.x()+(wgap/2)-3, childPoint.y(),
462 childPoint.x(), childPoint.y());
467 if (parentCol == childCol)
470 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
471 parentPoint.x()+(wgap/2), parentPoint.y()+3,
472 parentPoint.x()+wgap/2, childPoint.y()-3,
473 parentPoint.x()+(wgap/2)-3, childPoint.y(),
474 childPoint.x(), childPoint.y());
476 else if (parentCol < childCol)
478 if (rowFree(parentRow, parentCol+1, childCol))
480 childPoint.x()+(wgap/2)-3, parentPoint.y(),
481 childPoint.x()+(wgap/2), parentPoint.y()+3,
482 childPoint.x()+(wgap/2), childPoint.y()-3,
483 childPoint.x()+(wgap/2)-3, childPoint.y(),
484 childPoint.x(), childPoint.y());
487 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
488 parentPoint.x()+(wgap/2), parentPoint.y()+3,
489 parentPoint.x()+wgap/2, childTop-(hgap/2)-3,
490 parentPoint.x()+(wgap/2)+3, childTop-(hgap/2),
491 childPoint.x()+(wgap/2)-3, childTop-(hgap/2),
492 childPoint.x()+(wgap/2), childTop-(hgap/2)+3,
493 childPoint.x()+(wgap/2), childPoint.y()-3,
494 childPoint.x()+(wgap/2)-3, childPoint.y(),
495 childPoint.x(), childPoint.y());
500 parentPoint.x()+(wgap/2)-3, parentPoint.y(),
501 parentPoint.x()+(wgap/2), parentPoint.y()+3,
502 parentPoint.x()+wgap/2, childTop-(hgap/2)-3,
503 parentPoint.x()+(wgap/2)+3, childTop-(hgap/2),
504 childPoint.x()+(wgap/2)-3, childTop-(hgap/2),
505 childPoint.x()+(wgap/2), childTop-(hgap/2)+3,
506 childPoint.x()+wgap/2, childPoint.y()-3,
507 childPoint.x()+wgap/2-3, childPoint.y(),
508 childPoint.x(), childPoint.y());
514void PertRelationItem::setStartStartPoints()
517 TQPoint parentPoint = m_parentItem->exitPoint(Relation::StartStart);
518 TQPoint childPoint = m_childItem->entryPoint(Relation::StartStart);
521 a.putPoints(0, 1, parentPoint.x(), parentPoint.y());
523 if ( parentRow > childRow )
525 if (parentCol == childCol)
528 parentPoint.x()-(wgap/2)+3, parentPoint.y(),
529 parentPoint.x()-(wgap/2), parentPoint.y()-3,
530 parentPoint.x()-(wgap/2), childPoint.y()+3,
531 parentPoint.x()-(wgap/2)+3, childPoint.y());
536 parentPoint.x()-(wgap/2)+3, parentPoint.y(),
537 parentPoint.x()-(wgap/2), parentPoint.y()-3,
538 parentPoint.x()-(wgap/2), parentTop-(hgap/2)+3,
539 parentPoint.x()-(wgap/2)+3, parentTop-(hgap/2),
540 childPoint.x()-(wgap/2)-3, parentTop-(hgap/2),
541 childPoint.x()-(wgap/2), parentTop-(hgap/2)-3,
542 childPoint.x()-(wgap/2), childPoint.y()+3,
543 childPoint.x()-(wgap/2)+3, childPoint.y());
549 parentPoint.x()-(wgap/2)+3, parentPoint.y(),
550 parentPoint.x()-(wgap/2), parentPoint.y()+3);
552 if (parentCol == childCol)
555 parentPoint.x()-(wgap/2), childPoint.y()-3,
556 parentPoint.x()-(wgap/2)+3, childPoint.y());
560 if (parentRow == childRow)
563 parentPoint.x()-(wgap/2), parentBottom+hgap/2-3,
564 parentPoint.x()-(wgap/2)+3, parentBottom+hgap/2,
565 childPoint.x()-(wgap/2)-3, parentBottom+hgap/2,
566 childPoint.x()-(wgap/2), parentBottom+hgap/2-3,
567 childPoint.x()-(wgap/2), childPoint.y()+3,
568 childPoint.x()-(wgap/2)+3, childPoint.y());
573 parentPoint.x()-(wgap/2), childTop-(hgap/2)-3,
574 parentPoint.x()-(wgap/2)+3, childTop-hgap/2,
575 childPoint.x()-(wgap/2)-3, childTop-hgap/2,
576 childPoint.x()-(wgap/2), childTop-(hgap/2)+3,
577 childPoint.x()-(wgap/2), childPoint.y()-3,
578 childPoint.x()-(wgap/2)+3, childPoint.y());
582 a.putPoints(a.size(), 1, childPoint.x(), childPoint.y());
586void PertRelationItem::drawShape(TQPainter &p)
590 setBrush(TQt::NoBrush);
591 TQPointArray a = poly;
592 int size = a.size()-1;
593 for(
int i = 0; i < size; ++i)
596 p.drawLine(a[i], a[i+1]);
599 int pos = a.size()-1;
601 if ( pos > 1&& a[pos-1].x() > a[pos].x())
603 TQPoint pnt(a[pos].x()+xoffset, a[pos].y()-3);
604 p.drawLine(a[pos], pnt);
605 pnt.setY(a[pos].y()+3);
606 p.drawLine(a[pos], pnt);
609TQPointArray PertRelationItem::areaPoints ()
const
612 int pw = (pen().width()+1)/2;
613 if ( pw < 1 ) pw = 1;
614 if ( pen() == TQt::NoPen ) pw = 0;
615 pa[0] = TQPoint(left-pw,top-pw);
616 pa[1] = pa[0] + TQPoint(right-left+pw*2,0);
617 pa[2] = pa[1] + TQPoint(0,bottom-top+pw*2);
618 pa[3] = pa[0] + TQPoint(0,bottom-top+pw*2);
625bool PertRelationItem::rowFree(
int row,
int startCol,
int endCol)
627 TQCanvasItemList list = canvas()->allItems();
628 TQCanvasItemList::Iterator it = list.begin();
629 for (; it != list.end(); ++it)
631 if ( (*it)->rtti() == PertProjectItem::RTTI ||
632 (*it)->rtti() == PertTaskItem::RTTI ||
633 (*it)->rtti() == PertMilestoneItem::RTTI )
635 PertNodeItem *item = (PertNodeItem *)(*it);
636 if ( item->row() == row )
638 int col = item->column();
639 if (col >= startCol && col <= endCol)
651void PertRelationItem::printDebug(
int )
657KDGanttViewTaskLink::LinkType ItemBase::kdLinkType(
int relationType) {
658 switch (relationType) {
659 case Relation::FinishStart:
660 return KDGanttViewTaskLink::FinishStart;
662 case Relation::FinishFinish:
663 return KDGanttViewTaskLink::FinishFinish;
665 case Relation::StartStart:
666 return KDGanttViewTaskLink::StartStart;
671 return KDGanttViewTaskLink::None;
677GanttViewSummaryItem::GanttViewSummaryItem(KDGanttView *parent, Node *node)
678 : KDGanttViewSummaryItem(parent, node->name()),
686GanttViewSummaryItem::GanttViewSummaryItem(KDGanttViewItem *parent, Node *node)
687 : KDGanttViewSummaryItem(parent, node->name()),
692 GanttViewSummaryItem *p =
dynamic_cast<GanttViewSummaryItem*
>(parent);
694 m_view = p->ganttView();
699void GanttViewSummaryItem::insertRelations(GanttView *view)
703 TQPtrListIterator<Relation> it(m_node->dependChildNodes());
704 for (; it.current(); ++it)
706 KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child());
709 KDGanttViewTaskLink *link =
new KDGanttViewTaskLink(
this, child, kdLinkType(it.current()->type()));
711 TQString t = i18n(
"From: %1").arg(this->listViewText(0));
712 t +=
"\n" + i18n(
"To: %1").arg(child->listViewText(0));
713 if (it.current()->lag() > Duration::zeroDuration) {
714 t +=
"\n" + i18n(
"Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime));
716 link->setTooltipText(t);
717 view->addTaskLink(link);
722KDGanttViewItem *GanttViewSummaryItem::find(Node *node)
728 KDGanttViewItem *item = find(firstChild(), node);
732 return find(nextSibling(), node);
736KDGanttViewItem *GanttViewSummaryItem::find(KDGanttViewItem *item, Node *node)
741 if (item->type() == Event)
743 GanttViewEventItem *i =
static_cast<GanttViewEventItem *
>(item);
744 return i->find(node);
746 else if (item->type() == Task)
748 GanttViewTaskItem *i =
static_cast<GanttViewTaskItem *
>(item);
749 return i->find(node);
751 else if (item->type() == Summary)
753 GanttViewSummaryItem *i =
static_cast<GanttViewSummaryItem *
>(item);
754 return i->find(node);
762GanttViewTaskItem::GanttViewTaskItem(KDGanttView *parent,
KPlato::Task *task)
763 : KDGanttViewTaskItem(parent, task->name()),
769GanttViewTaskItem::GanttViewTaskItem(KDGanttViewItem *parent,
KPlato::Task *task)
770 : KDGanttViewTaskItem(parent, task->name()),
775 GanttViewSummaryItem *p =
dynamic_cast<GanttViewSummaryItem*
>(parent);
777 m_view = p->ganttView();
780void GanttViewTaskItem::insertRelations(GanttView *view)
784 TQPtrListIterator<Relation> it(m_task->dependChildNodes());
785 for (; it.current(); ++it)
787 KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child());
790 KDGanttViewTaskLink *link =
new KDGanttViewTaskLink(
this, child, kdLinkType(it.current()->type()));
792 TQString t = i18n(
"From: %1").arg(this->listViewText(0));
793 t +=
"\n" + i18n(
"To: %1").arg(child->listViewText(0));
794 if (it.current()->lag() > Duration::zeroDuration) {
795 t +=
"\n" + i18n(
"Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime));
797 link->setTooltipText(t);
798 view->addTaskLink(link);
803KDGanttViewItem *GanttViewTaskItem::find(Node *node)
809 KDGanttViewItem *item = find(firstChild(), node);
813 return find(nextSibling(), node);
817KDGanttViewItem *GanttViewTaskItem::find(KDGanttViewItem *item, Node *node)
822 if (item->type() == Event)
824 GanttViewEventItem *i =
static_cast<GanttViewEventItem *
>(item);
825 return i->find(node);
827 else if (item->type() == Task)
829 GanttViewTaskItem *i=
static_cast<GanttViewTaskItem *
>(item);
830 return i->find(node);
832 else if (item->type() == Summary)
834 GanttViewSummaryItem *i =
static_cast<GanttViewSummaryItem *
>(item);
835 return i->find(node);
843GanttViewEventItem::GanttViewEventItem(KDGanttView *parent,
KPlato::Task *task)
844 : KDGanttViewEventItem(parent, task->name()),
850GanttViewEventItem::GanttViewEventItem(KDGanttViewItem *parent,
KPlato::Task *task)
851 : KDGanttViewEventItem(parent, task->name()),
856 GanttViewSummaryItem *p =
dynamic_cast<GanttViewSummaryItem*
>(parent);
858 m_view = p->ganttView();
862void GanttViewEventItem::insertRelations(GanttView *view)
866 TQPtrListIterator<Relation> it(m_task->dependChildNodes());
867 for (; it.current(); ++it)
869 KDGanttViewItem *child = find(m_view->firstChild(), it.current()->child());
872 KDGanttViewTaskLink *link =
new KDGanttViewTaskLink(
this, child, kdLinkType(it.current()->type()));
874 TQString t = i18n(
"From: %1").arg(this->listViewText(0));
875 t +=
"\n" + i18n(
"To: %1").arg(child->listViewText(0));
876 if (it.current()->lag() > Duration::zeroDuration) {
877 t +=
"\n" + i18n(
"Lag: %1").arg(it.current()->lag().toString(Duration::Format_i18nDayTime));
879 link->setTooltipText(t);
880 view->addTaskLink(link);
885KDGanttViewItem *GanttViewEventItem::find(Node *node)
891 KDGanttViewItem *item = find(firstChild(), node);
895 return find(nextSibling(), node);
899KDGanttViewItem *GanttViewEventItem::find(KDGanttViewItem *item, Node *node)
904 if (item->type() == Event)
906 GanttViewEventItem *i =
static_cast<GanttViewEventItem *
>(item);
907 return i->find(node);
909 else if (item->type() == Task)
911 GanttViewTaskItem *i =
static_cast<GanttViewTaskItem *
>(item);
912 return i->find(node);
914 else if (item->type() == Summary)
916 GanttViewSummaryItem *i =
static_cast<GanttViewSummaryItem *
>(item);
917 return i->find(node);
A task in the scheduling software is represented by this class.