36#include "KDGanttViewSubwidgets.h"
37#include "KDGanttViewEventItem.h"
38#include "KDGanttViewSummaryItem.h"
39#include "KDGanttViewTaskItem.h"
40#ifndef KDGANTT_MASTER_CVS
41#include "KDGanttViewSubwidgets.moc"
49#include <tqapplication.h>
50#include <tqdrawutil.h>
52#include <tqdragobject.h>
58#include <kcalendarsystem.h>
61KDTimeTableWidget:: KDTimeTableWidget( TQWidget* parent,
KDGanttView* myGantt)
64 myGanttView = myGantt;
65 taskLinksVisible =
true;
66 flag_blockUpdating =
false;
67 int_blockUpdating = 0;
68 gridPen.setStyle(TQt::DotLine);
69 gridPen.setColor(TQColor(100,100,100));
70 maximumComputedGridHeight = 0;
72 denseLineBrush = TQBrush( TQColor ( 240,240,240 ));
73 noInfoLineBrush = TQBrush( TQColor ( 100,100,100 ), TQt::FDiagPattern );
80TQPtrList<KDGanttViewTaskLink> KDTimeTableWidget::taskLinks()
82 return myTaskLinkList;
85void KDTimeTableWidget::clearTaskLinks()
88 TQPtrListIterator<KDGanttViewTaskLink> it(myTaskLinkList);
89 while (it.current()) {
95void KDTimeTableWidget::resetWidth(
int wid )
97 if ( wid == width() ) {
104 if ( ! pendingHeight )
105 pendingHeight = height();
110void KDTimeTableWidget::checkHeight(
int hei )
114 if ( pendingHeight < hei+100)
115 pendingHeight = hei+100;
116 if ( ! pendingWidth )
117 pendingWidth = width();
118 maximumComputedGridHeight = 0;
123void KDTimeTableWidget::setNoInformationBrush(
const TQBrush& brush )
125 noInfoLineBrush = brush;
128TQBrush KDTimeTableWidget::noInformationBrush()
const
130 return noInfoLineBrush;
135 TQPtrListIterator<KDGanttViewTaskLink> it((myTaskLinkList));
136 for ( ; it.current(); ++it ) {
137 it.current()->removeItemFromList( item );
141void KDTimeTableWidget::expandItem( TQListViewItem * item)
143 item->invalidateHeight () ;
147void KDTimeTableWidget::collapseItem( TQListViewItem * item)
149 item->invalidateHeight () ;
154void KDTimeTableWidget::highlightItem( TQListViewItem * item )
156 static bool itemwashighlighted;
161 itemwashighlighted = highlightedItem->
highlight();
163 item->invalidateHeight () ;
164 myGanttView->myListView->contentsY();
167int KDTimeTableWidget::computeHeight()
175 hei += temp->computeHeight();
183 emit heightComputed( hei );
186void KDTimeTableWidget::computeVerticalGrid()
192 int cw = myGanttView->myTimeHeader->myGridMinorWidth;
195 if (pendingHeight > height() )
204 KDCanvasLine* templine;
205 KDCanvasRectangle* temprect;
208 bool colorIterator =
true;
211 if (myGanttView->showMinorTicks()){
213 TQPtrListIterator<KDCanvasRectangle> itcol(columnColorList);
214 TQPtrListIterator<KDCanvasLine> itgrid(verGridList);
215 for ( ; itgrid.current(); ++itgrid ) {
217 itgrid.current()->setPoints(i,0,i,h);
218 itgrid.current()->show();
220 if (myGanttView->myTimeHeader->getColumnColor(colcol,i,i+cw))
223 colPen.setColor(colcol);
225 colorIterator = itcol.current();
232 itcol.current()->setPen( TQt::NoPen );
233 itcol.current()->setBrush( TQBrush( colcol, SolidPattern) );
234 itcol.current()->setSize(cw ,h );
235 itcol.current()->move( i, 0 );
236 itcol.current()->show();
245 temprect =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
246 temprect->setPen( TQt::NoPen );
247 temprect->setBrush( TQBrush( colcol, SolidPattern) );
248 temprect->setSize(cw ,h );
249 temprect->move( i, 0 );
252 columnColorList.append(temprect);
257 itgrid.current()->hide();
261 for ( ;i < wid;i += cw) {
262 templine =
new KDCanvasLine(
this,0,Type_is_KDGanttGridItem);
263 templine->setPen(gridPen);
264 templine->setPoints(i,0,i,h);
267 verGridList.append(templine);
268 if (myGanttView->myTimeHeader->getColumnColor(colcol,i,i+cw))
270 colPen.setColor(colcol);
272 colorIterator = itcol.current();
278 itcol.current()->setPen( TQt::NoPen );
279 itcol.current()->setBrush( TQBrush( colcol, SolidPattern) );
280 itcol.current()->setSize(cw ,h );
281 itcol.current()->move( i, 0 );
282 itcol.current()->show();
285 temprect =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
286 temprect->setPen( TQt::NoPen );
287 temprect->setBrush( TQBrush( colcol, SolidPattern) );
288 temprect->setSize(cw ,h );
289 temprect->move( i, 0 );
292 columnColorList.append(temprect);
305 for ( ; itcol.current(); ++itcol )
306 itcol.current()->hide();
308 if (myGanttView->showMajorTicks()) {
309 TQValueList<int>::iterator intIt = myGanttView->myTimeHeader->majorTicks.begin();
310 TQValueList<int>::iterator intItEnd = myGanttView->myTimeHeader->majorTicks.end();
311 TQPtrListIterator<KDCanvasRectangle> itcol(columnColorList);
312 TQPtrListIterator<KDCanvasLine> itgrid(verGridList);
314 for ( ; itgrid.current(); ++itgrid ) {
315 if (intIt != intItEnd) {
318 itgrid.current()->setPoints(left,0,left,h);
319 itgrid.current()->show();
322 if (myGanttView->myTimeHeader->getColumnColor(colcol,left,(*intIt) ))
324 int mid = (-left+(*intIt));
325 colPen.setColor(colcol);
326 colPen.setWidth((*intIt)-left);
328 colorIterator = itcol.current();
334 itcol.current()->setPen( TQt::NoPen );
335 itcol.current()->setBrush( TQBrush( colcol, SolidPattern) );
336 itcol.current()->setSize(mid ,h );
337 itcol.current()->move( left, 0 );
338 itcol.current()->show();
341 temprect =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
342 temprect->setPen( TQt::NoPen );
343 temprect->setBrush( TQBrush( colcol, SolidPattern) );
344 temprect->setSize(mid,h );
345 temprect->move( left, 0 );
348 columnColorList.append(temprect);
362 itgrid.current()->hide();
365 KDCanvasLine* templine;
367 for ( ;intIt != intItEnd ;++intIt) {
369 templine =
new KDCanvasLine(
this,0,Type_is_KDGanttGridItem);
370 templine->setPen(gridPen);
371 templine->setPoints((*intIt),0,(*intIt),h);
374 verGridList.append(templine);
376 if (myGanttView->myTimeHeader->getColumnColor(colcol,left,(*intIt)))
378 int mid = (-left+(*intIt));
379 colPen.setColor(colcol);
380 colPen.setWidth((*intIt)-left);
382 colorIterator = itcol.current();
388 itcol.current()->setPen( TQt::NoPen );
389 itcol.current()->setBrush( TQBrush( colcol, SolidPattern) );
390 itcol.current()->setSize(mid ,h );
391 itcol.current()->move( left, 0 );
392 itcol.current()->show();
395 temprect =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
396 temprect->setPen( TQt::NoPen );
397 temprect->setBrush( TQBrush( colcol, SolidPattern) );
398 temprect->setSize(mid ,h );
399 temprect->move( left, 0 );
402 columnColorList.append(temprect);
416 for ( ; itcol.current(); ++itcol ) {
417 itcol.current()->hide();
423 TQPtrListIterator<KDCanvasLine> itgrid(verGridList);
424 for ( ; itgrid.current(); ++itgrid ) {
425 itgrid.current()->hide();
427 TQPtrListIterator<KDCanvasRectangle> itcol(columnColorList);
428 for ( ; itcol.current(); ++itcol ) {
429 itcol.current()->hide();
434void KDTimeTableWidget::computeHorizontalGrid()
444 KDCanvasLine* templine;
445 TQPtrListIterator<KDCanvasLine> ithor(horGridList);
446 if ( ithor.current() ) {
447 templine = ithor.current();
450 templine =
new KDCanvasLine(
this,0,Type_is_KDGanttGridItem);
451 templine->setPen(gridPen);
453 horGridList.append(templine);
455 templine->setPoints(0,0,wid,0);
459 posY = temp->itemPos() + temp->height();
460 if ( ithor.current() ) {
461 templine = ithor.current();
465 templine =
new KDCanvasLine(
this,0,Type_is_KDGanttGridItem);
466 templine->setPen(gridPen);
468 horGridList.append(templine);
470 if ( templine->endPoint() != TQPoint(wid,posY ))
471 templine->setPoints(0,posY,wid,posY );
472 if ( !templine->isVisible() )
481 while ( ithor.current() ) {
482 if ( ithor.current()->isVisible() )
483 ithor.current()->hide();
488void KDTimeTableWidget::computeDenseLines()
496 TQPtrListIterator<KDCanvasRectangle> ithordense(horDenseList);
497 KDCanvasRectangle* denseLine;
498 int tempDenseLineCount = 0;
500 if ( temp->isVisible() ) {
501 ++tempDenseLineCount;
502 if ( tempDenseLineCount == denseLineCount ) {
503 tempDenseLineCount = 0;
504 if ( ithordense.current() ) {
505 denseLine = ithordense.current();
508 denseLine =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
510 horDenseList.append( denseLine );
512 if ( denseLine->rect() != TQRect(0, temp->itemPos(),wid, temp->height()) ) {
513 denseLine->move( 0, temp->itemPos() );
514 denseLine->setSize( wid, temp->height());
516 if (denseLine->brush() != denseLineBrush ) {
517 denseLine->setPen( TQPen( TQt::NoPen ) );
518 denseLine->setBrush( denseLineBrush);
520 if (!denseLine->isVisible() )
529 while ( ithordense.current() ) {
530 if ( ithordense.current()->isVisible() ) {
531 ithordense.current()->hide();
536void KDTimeTableWidget::computeShowNoInformation()
544 TQPtrListIterator<KDCanvasRectangle> itnoinfo(showNoInfoList);
545 KDCanvasRectangle* noInfoLine;
548 if ( itnoinfo.current() ) {
549 noInfoLine = itnoinfo.current();
552 noInfoLine =
new KDCanvasRectangle(
this,0,Type_is_KDGanttGridItem);
553 showNoInfoList.append( noInfoLine );
554 noInfoLine->setZ(-1);
556 noInfoLine->move( 0, temp->itemPos() );
557 noInfoLine->setSize( wid, temp->height());
558 noInfoLine->setPen( TQPen( TQt::NoPen ) );
559 noInfoLine->setBrush( noInfoLineBrush);
564 while ( itnoinfo.current() ) {
565 itnoinfo.current()->hide();
571void KDTimeTableWidget::computeTaskLinks()
574 TQPtrListIterator<KDGanttViewTaskLink> it((myTaskLinkList));
575 for ( ; it.current(); ++it ) {
576 if (it.current()->isVisible())
577 it.current()->showMe(
true);
579 it.current()->showMe(
false);
586void KDTimeTableWidget::updateMyContent()
588 if ( flag_blockUpdating || int_blockUpdating ) {
601 int hei = computeHeight();
603 int viewport_hei = myGanttView->myCanvasView->viewport()->height();
604 if ( viewport_hei > hei )
605 hei = viewport_hei + 100;
606 if ( myGanttView->myTimeHeader->registerStartTime() )
608 if ( myGanttView->myTimeHeader->registerEndTime() )
610 if ( hei > height() ) {
611 if ( ! pendingWidth )
612 pendingWidth = width();
613 if ( pendingHeight < hei )
616 if (pendingHeight > hei )
618 if (hei > maximumComputedGridHeight)
620 maximumComputedGridHeight = hei;
622 myGanttView->myTimeHeader->computeIntervals( hei );
624 computeVerticalGrid();
627 computeHorizontalGrid();
629 computeShowNoInformation();
632 if (pendingWidth && pendingHeight ) {
633 resize( pendingWidth, pendingHeight );
636 emit heightComputed( 0 );
646void KDTimeTableWidget::inc_blockUpdating( )
648 ++ int_blockUpdating;
651void KDTimeTableWidget::dec_blockUpdating( )
653 -- int_blockUpdating;
656void KDTimeTableWidget::setBlockUpdating(
bool block )
659 int_blockUpdating = 0;
660 flag_blockUpdating = block;
662bool KDTimeTableWidget::blockUpdating()
664 return flag_blockUpdating;
667void KDTimeTableWidget::setShowTaskLinks(
bool show )
669 taskLinksVisible = show;
672bool KDTimeTableWidget::showTaskLinks()
674 return taskLinksVisible;
676void KDTimeTableWidget::setHorBackgroundLines(
int count, TQBrush brush )
678 denseLineBrush = brush;
681 denseLineCount = count;
685int KDTimeTableWidget::horBackgroundLines( TQBrush& brush )
687 brush = denseLineBrush;
688 return denseLineCount;
691int KDTimeTableWidget::getCoordX( TQDateTime dt ) {
692 return myGanttView->myTimeHeader->getCoordX(dt);
698KDTimeHeaderWidget:: KDTimeHeaderWidget( TQWidget* parent,
KDGanttView* gant )
701 myToolTip =
new KDTimeHeaderToolTip(
this,
this);
704 flagDoNotRecomputeAfterChange =
true;
705 TQDateTime start = (TQDateTime::currentDateTime ()).addSecs(-3600);
706 setHorizonStart(start);
707 setHorizonEnd( start.addSecs(3600*2));
708 flagStartTimeSet =
false;
709 flagEndTimeSet =
false;
710 myCenterDateTime = TQDateTime::currentDateTime ();
711 setScale(KDGanttView::Auto);
713 myMaxScale = KDGanttView::Month;
714 myMinScale = KDGanttView::Minute;
715 myAutoScaleMinorTickcount = 100;
716 setMajorScaleCount( 1 );
717 setMinorScaleCount( 1);
718 setMinimumColumnWidth( 5 );
719 setYearFormat(KDGanttView::FourDigit );
720 setHourFormat( KDGanttView::Hour_12 );
722 setWeekendBackgroundColor(TQColor(220,220,220) );
723 setWeekendDays( 6, 7 );
724 myGridMinorWidth = 0;
725 myPopupMenu =
new TQPopupMenu(
this);
726 TQPopupMenu * zoomPopupMenu =
new TQPopupMenu(
this);
727 myPopupMenu->insertItem (i18n(
"Zoom"),zoomPopupMenu, 1);
728 zoomPopupMenu->insertItem( i18n(
"Zoom to 100%"),
this, TQ_SLOT(setSettings(
int)),0 ,21,21 );
729 zoomPopupMenu->insertItem( i18n(
"Zoom to Fit"),
this, TQ_SLOT(setSettings(
int)),0 ,20,20 );
730 zoomPopupMenu->insertItem( i18n(
"Zoom In (x 2)"),
this, TQ_SLOT(setSettings(
int)),0 ,22,22 );
731 zoomPopupMenu->insertItem( i18n(
"Zoom In (x 6)"),
this, TQ_SLOT(setSettings(
int)),0 ,24,24 );
732 zoomPopupMenu->insertItem( i18n(
"Zoom In (x 12)"),
this, TQ_SLOT(setSettings(
int)),0 ,26,26 );
733 zoomPopupMenu->insertItem( i18n(
"Zoom Out (x 1/2)"),
this, TQ_SLOT(setSettings(
int)),0 ,23,23 );
734 zoomPopupMenu->insertItem( i18n(
"Zoom Out (x 1/6)"),
this, TQ_SLOT(setSettings(
int)),0 ,25,25 );
735 zoomPopupMenu->insertItem( i18n(
"Zoom Out (x 1/12)"),
this, TQ_SLOT(setSettings(
int)),0 ,27,27 );
736 scalePopupMenu =
new TQPopupMenu(
this);
737 myPopupMenu->insertItem (i18n(
"Scale"),scalePopupMenu, 2);
738 scalePopupMenu->insertItem( i18n(
"Minute"),
this, TQ_SLOT(setSettings(
int)),0 ,1,1 );
739 scalePopupMenu->insertItem( i18n(
"Hour"),
this, TQ_SLOT(setSettings(
int)),0 ,2,2 );
740 scalePopupMenu->insertItem( i18n(
"Day"),
this, TQ_SLOT(setSettings(
int)),0 ,3,3 );
741 scalePopupMenu->insertItem( i18n(
"Week"),
this, TQ_SLOT(setSettings(
int)),0 ,4,4 );
742 scalePopupMenu->insertItem( i18n(
"Month"),
this, TQ_SLOT(setSettings(
int)),0 ,5,5 );
743 scalePopupMenu->insertItem( i18n(
"Auto"),
this, TQ_SLOT(setSettings(
int)),0 ,6,6 );
744 scalePopupMenu->setCheckable (
true );
745 timePopupMenu =
new TQPopupMenu(
this);
746 myPopupMenu->insertItem (i18n(
"Time Format"),timePopupMenu, 3);
747 timePopupMenu->insertItem( i18n(
"24 Hour"),
this, TQ_SLOT(setSettings(
int)),0 ,40,40 );
748 timePopupMenu->insertItem( i18n(
"12 PM Hour"),
this, TQ_SLOT(setSettings(
int)),0 ,41,41 );
749 timePopupMenu->insertItem( i18n(
"24:00 Hour"),
this, TQ_SLOT(setSettings(
int)),0 ,42,42 );
750 yearPopupMenu =
new TQPopupMenu(
this);
751 myPopupMenu->insertItem (i18n(
"Year Format"),yearPopupMenu, 4);
752 yearPopupMenu->insertItem( i18n(
"Four Digit"),
this, TQ_SLOT(setSettings(
int)),0 ,50,50 );
753 yearPopupMenu->insertItem( i18n(
"Two Digit"),
this, TQ_SLOT(setSettings(
int)),0 ,51,51 );
754 yearPopupMenu->insertItem( i18n(
"Two Digit Apostrophe"),
this, TQ_SLOT(setSettings(
int)),0 ,52,52 );
755 yearPopupMenu->insertItem( i18n(
"No Date on Minute/Hour Scale"),
this, TQ_SLOT(setSettings(
int)),0 ,53,53 );
757 gridPopupMenu =
new TQPopupMenu(
this);
758 myPopupMenu->insertItem (i18n(
"Grid"),gridPopupMenu,5);
759 gridPopupMenu->insertItem( i18n(
"Show Minor Grid"),
this, TQ_SLOT(setSettings(
int)),0 ,10,10 );
760 gridPopupMenu->insertItem( i18n(
"Show Major Grid"),
this, TQ_SLOT(setSettings(
int)),0 ,11,11 );
761 gridPopupMenu->insertItem( i18n(
"Show No Grid"),
this, TQ_SLOT(setSettings(
int)),0 ,12,12 );
762 myPopupMenu->insertItem( i18n(
"Print"),
this, TQ_SLOT(setSettings(
int)),0 ,30,30 );
763 connect(myPopupMenu, TQ_SIGNAL ( aboutToShow () ) ,
this, TQ_SLOT( preparePopupMenu() )) ;
764 flagZoomToFit =
false;
765 setShowMinorTicks(
true );
766 myRealEnd = myHorizonEnd;
767 myRealStart = myHorizonStart;
768 autoComputeTimeLine =
true;
769 flagDoNotRecomputeAfterChange =
false;
770 flagDoNotRepaintAfterChange =
false;
771 setShowPopupMenu(
false,
false,
false,
false,
false,
false,
false);
772 for (
int j =1;j<8;++j)
773 weekdayColor[j] = TQt::white;
780KDTimeHeaderWidget::~KDTimeHeaderWidget()
784void KDTimeHeaderWidget::preparePopupMenu()
786 myPopupMenu->setItemVisible ( 1, flagShowZoom );
787 myPopupMenu->setItemVisible ( 2, flagShowScale );
788 myPopupMenu->setItemVisible ( 3, flagShowTime );
789 myPopupMenu->setItemVisible ( 4, flagShowYear );
790 myPopupMenu->setItemVisible ( 5, flagShowGrid);
791 myPopupMenu->setItemVisible ( 30, flagShowPrint );
793 myPopupMenu->changeItem( 1, i18n(
"Zoom (Fit)"));
795 myPopupMenu->changeItem( 1, i18n(
"Zoom (%1)").arg( TQString::number( zoomFactor(),
'f',3) ) );
798 while ( (
id = scalePopupMenu->idAt( i++ )) >= 0 ) {
799 scalePopupMenu->setItemChecked (
id,
false );
801 scalePopupMenu->setItemChecked ( scalePopupMenu->idAt ( (
int)( scale()) ),
true );
803 while ( (
id = timePopupMenu->idAt( i++ )) >= 0 ) {
804 timePopupMenu->setItemChecked (
id,
false );
806 timePopupMenu->setItemChecked ( timePopupMenu->idAt ( (
int)( hourFormat()) ),
true );
808 while ( (
id = yearPopupMenu->idAt( i++ )) >= 0 ) {
809 yearPopupMenu->setItemChecked (
id,
false );
811 yearPopupMenu->setItemChecked ( yearPopupMenu->idAt ( (
int)( yearFormat()) ),
true );
813 while ( (
id = gridPopupMenu->idAt( i++ )) >= 0 ) {
814 gridPopupMenu->setItemChecked (
id,
false );
817 gridPopupMenu->setItemChecked ( gridPopupMenu->idAt ( 0 ), showMinorTicks() );
818 gridPopupMenu->setItemChecked ( gridPopupMenu->idAt ( 1 ), showMajorTicks() );
819 gridPopupMenu->setItemChecked ( gridPopupMenu->idAt ( 2 ),
820 !(showMajorTicks() || showMinorTicks()) );
825TQString KDTimeHeaderWidget::getToolTipText(TQPoint p)
827 return TDEGlobal::locale()->formatDateTime(getDateTimeForIndex(p.x()));
829void KDTimeHeaderWidget::addTickRight(
int num )
831 int secs = ((num*getTickTime())-30);
832 setHorizonEnd(getDateTimeForIndex(width()).addSecs(secs));
836void KDTimeHeaderWidget::addTickLeft(
int num )
838 int secs = ((num*getTickTime())-30);
839 setHorizonStart(getDateTimeForIndex(0).addSecs(-secs));
843int KDTimeHeaderWidget::getTickTime()
845 return getDateTimeForIndex(0).secsTo(getDateTimeForIndex(myGridMinorWidth));
849void KDTimeHeaderWidget::checkWidth(
int wid )
854 myMinimumWidth = wid + 1;
855 if ( myMinimumWidth > width() ||
856 ( myMinimumWidth > mySizeHint &&
857 myMinimumWidth < (width() - myGridMinorWidth )) )
864 if (myGanttView && myGanttView->myCanvasView)
865 myGanttView->myCanvasView->updateScrollBars();
868bool KDTimeHeaderWidget::registerStartTime()
871 TQListViewItemIterator it( myGanttView->myListView );
872 if (!flagStartTimeSet) {
873 TQDateTime temp , time;
875 bool setNewTime =
false;
881 for ( ; it.current(); ++it ) {
886 switch( item->
type() ) {
887 case KDGanttViewItem::Event:
891 case KDGanttViewItem::Summary:
892 case KDGanttViewItem::Task:
905 if ( myHorizonStart != temp) {
906 myHorizonStart = temp;
916bool KDTimeHeaderWidget::registerEndTime()
918 if (!flagEndTimeSet) {
919 TQDateTime temp , time;
921 bool setNewTime =
false;
926 TQListViewItemIterator it( myGanttView->myListView );
927 for ( ; it.current(); ++it ) {
932 switch( item->
type() ) {
933 case KDGanttViewItem::Event:
937 case KDGanttViewItem::Summary:
943 case KDGanttViewItem::Task:
956 if (myHorizonEnd != temp ) {
967void KDTimeHeaderWidget::setShowPopupMenu(
bool show,
975 flagShowPopupMenu = show;
976 flagShowZoom = showZoom;
977 flagShowScale = showScale;
978 flagShowTime = showTime;
979 flagShowYear = showYear;
980 flagShowGrid = showGrid;
981 flagShowPrint = showPrint;
985bool KDTimeHeaderWidget::showPopupMenu()
const
987 return flagShowPopupMenu;
990void KDTimeHeaderWidget::setSettings(
int i)
995 setScale(KDGanttView::Minute );
998 setScale(KDGanttView::Hour );
1001 setScale(KDGanttView::Day );
1004 setScale(KDGanttView::Week );
1007 setScale(KDGanttView::Month );
1010 setScale(KDGanttView::Auto );
1013 setShowMinorTicks(
true );
1016 setShowMajorTicks(
true );{
1021 setShowMajorTicks(
false );
1022 setShowMinorTicks(
false);
1040 zoom(0.16666,
false);
1046 zoom(0.08333,
false);
1049 myGanttView->print();
1085void KDTimeHeaderWidget::zoomToFit()
1087 flagZoomToFit =
true;
1090 if (myGanttView && myGanttView->myCanvasView)
1091 myGanttView->myCanvasView->updateScrollBars();
1093double KDTimeHeaderWidget::zoomFactor()
1095 return myZoomFactor;
1097double KDTimeHeaderWidget::secsFromTo( TQDateTime begin, TQDateTime end )
1101 days = begin.daysTo(end);
1102 temp = begin.addDays((
int) days);
1103 secs = temp.secsTo(end);
1104 secs += days * 86400.0;
1109void KDTimeHeaderWidget::zoomToSelection( TQDateTime start, TQDateTime end)
1111 if (start < myHorizonStart) {
1112 myHorizonStart = start;
1113 flagStartTimeSet =
true;
1116 if (end > myHorizonEnd) {
1118 flagEndTimeSet =
true;
1121 flagDoNotRepaintAfterChange =
true;
1123 int viewWid = myGanttView->myCanvasView->viewport()->width();
1124 int timeWid = getCoordX(end)-getCoordX(start);
1126 fac = ( (double)viewWid)/((double) timeWid );
1128 timeWid = getCoordX(end)-getCoordX(start);
1130 int lastScaleCount = 0;
1131 while (timeWid >viewWid || ( ( myRealMinorScaleCount != lastScaleCount) && timeWid*2 < viewWid ) ) {
1132 lastScaleCount = myRealMinorScaleCount;
1133 fac = (fac * (double)viewWid)/(double)timeWid;
1135 timeWid = getCoordX(end)-getCoordX(start);
1136 if ( count++ > 10 ) {
1141 flagDoNotRepaintAfterChange =
false;
1144 moveTimeLineTo((getCoordX(start)-(viewWid-timeWid)/2));
1146 if (myGanttView && myGanttView->myCanvasView)
1147 myGanttView->myCanvasView->updateScrollBars();
1149void KDTimeHeaderWidget::moveTimeLineTo(
int X)
1151 int Y = myGanttView->myCanvasView->contentsY ();
1152 myGanttView->myCanvasView->setContentsPos (X, Y );
1155void KDTimeHeaderWidget::zoom(
double factor,
bool absolute)
1157 flagZoomToFit =
false;
1158 if ( factor < 0.000001 ) {
1159 tqDebug(
"KDGanttView::zoom() : Zoom factor to low. Nothing zoomed. ");
1166 newZoom = myZoomFactor * factor;
1167 double relativeZoom;
1168 relativeZoom = newZoom / myZoomFactor;
1172 int viewWid = myGanttView->myCanvasView->viewport()->width();
1173 if ( width() * relativeZoom < viewWid && ( newZoom > 1.01 || newZoom < 0.99 ) ) {
1174 tqDebug(
"KDGanttView::zoom() : Zoom factor to low for current horizon. ");
1178 myZoomFactor = newZoom;
1181 if (myGanttView && myGanttView->myCanvasView)
1182 myGanttView->myCanvasView->updateScrollBars();
1192void KDTimeHeaderWidget::setHorizonStart(
const TQDateTime& start )
1194 myHorizonStart = start;
1195 flagStartTimeSet =
true;
1206TQDateTime KDTimeHeaderWidget::horizonStart()
const
1208 return myHorizonStart;
1219void KDTimeHeaderWidget::setHorizonEnd(
const TQDateTime& start )
1221 myHorizonEnd = start;
1222 flagEndTimeSet =
true;
1234TQDateTime KDTimeHeaderWidget::horizonEnd()
const
1236 return myHorizonEnd;
1248void KDTimeHeaderWidget::setScale(Scale unit )
1254 if (myGanttView && myGanttView->myCanvasView)
1255 myGanttView->myCanvasView->updateScrollBars();
1277void KDTimeHeaderWidget::setMaximumScale( Scale unit )
1302void KDTimeHeaderWidget::setMinimumScale( Scale unit )
1329void KDTimeHeaderWidget::setMinimumColumnWidth(
int width )
1331 myMinimumColumWidth = width;
1342int KDTimeHeaderWidget::minimumColumnWidth()
const
1344 return myMinimumColumWidth;
1355void KDTimeHeaderWidget::setYearFormat( YearFormat format )
1357 myYearFormat = format;
1370 return myYearFormat;
1381void KDTimeHeaderWidget::setHourFormat( HourFormat format )
1383 myHourFormat = format;
1396 return myHourFormat;
1406void KDTimeHeaderWidget::setShowMajorTicks(
bool show )
1408 flagShowMajorTicks = show;
1410 setShowMinorTicks(
false);
1422bool KDTimeHeaderWidget::showMajorTicks()
const
1424 return flagShowMajorTicks;
1434void KDTimeHeaderWidget::setShowMinorTicks(
bool show )
1436 flagShowMinorTicks = show;
1438 setShowMajorTicks(
false );
1450bool KDTimeHeaderWidget::showMinorTicks()
const
1452 return flagShowMinorTicks;
1464void KDTimeHeaderWidget::setColumnBackgroundColor(
const TQDateTime& column,
1465 const TQColor& color,
1466 Scale mini, Scale maxi )
1468 ColumnColorList::iterator it;
1469 for ( it = ccList.begin(); it != ccList.end(); ++it ) {
1470 if ((*it).datetime == column) {
1471 (*it).color = color;
1472 (*it).minScaleView = mini;
1473 (*it).maxScaleView = maxi;
1477 DateTimeColor newItem;
1478 newItem.datetime = column;
1479 newItem.color = color;
1480 newItem.minScaleView = mini;
1481 newItem.maxScaleView = maxi;
1482 ccList.append(newItem);
1486void KDTimeHeaderWidget::computeIntervals(
int height )
1489 IntervalColorList::iterator it;
1491 for ( it = icList.begin(); it != icList.end(); ++it ) {
1492 if ( (*it).minScaleView <= myRealScale && (*it).maxScaleView >= myRealScale ) {
1493 left = getCoordX((*it).datetime);
1494 right = getCoordX((*it).end);
1495 if ( right == left )
1497 (*it).canvasRect->setPen( TQt::NoPen );
1498 (*it).canvasRect->setBrush( TQBrush( (*it).color, SolidPattern) );
1499 (*it).canvasRect->setSize( right - left ,height );
1500 (*it).canvasRect->move( left,0 );
1501 (*it).canvasRect->show();
1503 (*it).canvasRect->hide();
1514bool KDTimeHeaderWidget::changeBackgroundInterval(
const TQDateTime& oldstart,
1515 const TQDateTime& oldend,
1516 const TQDateTime& newstart,
1517 const TQDateTime& newend )
1519 IntervalColorList::iterator it;
1520 for ( it = icList.begin(); it != icList.end(); ++it ) {
1521 if ((*it).datetime == oldstart && (*it).end == oldend ) {
1522 IntervalColorList::iterator it2;
1523 for ( it2 = icList.begin(); it2 != icList.end(); ++it2 ) {
1524 if ((*it2).datetime == newstart && (*it2).end == newend )
1527 (*it).datetime = newstart;
1535bool KDTimeHeaderWidget::deleteBackgroundInterval(
const TQDateTime& start,
1536 const TQDateTime& end)
1538 IntervalColorList::iterator it;
1539 for ( it = icList.begin(); it != icList.end(); ++it ) {
1540 if ((*it).datetime == start && (*it).end == end ) {
1542 delete (*it).canvasRect;
1551void KDTimeHeaderWidget::setIntervalBackgroundColor(
const TQDateTime& start,
1552 const TQDateTime& end,
1553 const TQColor& color,
1558 IntervalColorList::iterator it;
1559 for ( it = icList.begin(); it != icList.end(); ++it ) {
1560 if ((*it).datetime == start && (*it).end == end ) {
1561 (*it).color = color;
1562 (*it).minScaleView = mini;
1563 (*it).maxScaleView = maxi;
1567 DateTimeColor newItem;
1568 if ( start <= end ) {
1569 newItem.datetime = start;
1572 newItem.datetime = end;
1573 newItem.end = start;
1575 newItem.color = color;
1576 newItem.minScaleView = mini;
1577 newItem.maxScaleView = maxi;
1579 newItem.canvasRect =
new KDCanvasRectangle(myGanttView->myTimeTable,0,Type_is_KDGanttGridItem);
1580 newItem.canvasRect->setZ(-19);
1581 icList.append(newItem);
1585void KDTimeHeaderWidget::clearBackgroundColor()
1588 IntervalColorList::iterator itic;
1589 for ( itic = icList.begin(); itic != icList.end(); ++itic ) {
1590 delete (*itic).canvasRect;
1596TQDateTime KDTimeHeaderWidget::getDateTimeForIndex(
int X,
bool local )
1600 TQPoint p = TQPoint ( X, 1 );
1601 coordX = myGanttView->myTimeHeaderScroll->viewportToContents(myGanttView->myTimeHeaderScroll->mapFromGlobal( p )).x();
1604 double secs = (secsFromTo( myRealStart, myRealEnd ) * ((double)coordX))/(
double)width();
1605 double days = secs/86400.0;
1606 secs = secs - ( ((int) days) *86400.0 );
1607 return (myRealStart.addDays ( (
int) days )).addSecs( (
int) secs);
1617bool KDTimeHeaderWidget::getColumnColor(TQColor& col,
int coordLow,
int coordHigh)
1619 if (!flagShowMajorTicks && !flagShowMinorTicks)
1621 TQDateTime start,end;
1622 start = getDateTimeForIndex(coordLow);
1623 end = getDateTimeForIndex(coordHigh).addSecs(-1);
1624 Scale tempScale = myRealScale;
1625 if (flagShowMajorTicks)
1626 switch (myRealScale)
1628 case KDGanttView::Minute: tempScale = KDGanttView::Hour;
break;
1629 case KDGanttView::Hour: tempScale = KDGanttView::Day ;
break;
1630 case KDGanttView::Day: tempScale = KDGanttView::Week ;
break;
1631 case KDGanttView::Week: tempScale = KDGanttView::Month ;
break;
1632 case KDGanttView::Month:
return false ;
break;
1633 case KDGanttView::Auto:
return false ;
break;
1636 ColumnColorList::iterator it;
1637 for ( it = ccList.begin(); it != ccList.end(); ++it ) {
1638 if ((*it).datetime >= start && (*it).datetime <= end) {
1639 if (tempScale >= (*it).minScaleView && tempScale <= (*it).maxScaleView ) {
1646 if (tempScale > KDGanttView::Day)
return false;
1648 start = getDateTimeForIndex((coordLow+coordHigh)/2);
1649 int day = start.date().dayOfWeek ();
1651 if (weekdayColor[day] != TQt::white) {
1652 col = weekdayColor[day];
1656 int endday = myWeekendDaysEnd;
1657 col = myWeekendBackgroundColor;
1658 if (myWeekendDaysStart > myWeekendDaysEnd)
1660 if (day >= myWeekendDaysStart && day <= endday) {
1663 if (day+7 >= myWeekendDaysStart && day+7 <= endday) {
1678TQColor KDTimeHeaderWidget::columnBackgroundColor(
const TQDateTime& column )
const
1682 ColumnColorList::const_iterator ite;
1683 for ( ite = ccList.begin(); ite != ccList.end(); ++ite ) {
1684 if ((*ite).datetime == column) {
1700void KDTimeHeaderWidget::setWeekendBackgroundColor(
const TQColor& color )
1702 myWeekendBackgroundColor = color ;
1713TQColor KDTimeHeaderWidget::weekendBackgroundColor()
const
1715 return myWeekendBackgroundColor;
1728void KDTimeHeaderWidget::setWeekdayBackgroundColor(
const TQColor& color,
int weekday )
1730 weekdayColor[weekday] = color;
1742TQColor KDTimeHeaderWidget::weekdayBackgroundColor(
int weekday)
const
1744 return weekdayColor[weekday];
1758void KDTimeHeaderWidget::setWeekendDays(
int start,
int end )
1760 myWeekendDaysStart = start;
1761 myWeekendDaysEnd = end;
1773void KDTimeHeaderWidget::weekendDays(
int& start,
int& end )
const
1775 start = myWeekendDaysStart;
1776 end = myWeekendDaysEnd ;
1787void KDTimeHeaderWidget::setMajorScaleCount(
int count )
1789 myMajorScaleCount=count;
1800int KDTimeHeaderWidget::majorScaleCount()
const
1802 return myMajorScaleCount;
1812void KDTimeHeaderWidget::setMinorScaleCount(
int count )
1814 myMinorScaleCount = count;
1825int KDTimeHeaderWidget::minorScaleCount()
const
1827 return myMinorScaleCount ;
1832void KDTimeHeaderWidget::resizeEvent ( TQResizeEvent * )
1835 paintPix.resize( 800, height () );
1839void KDTimeHeaderWidget::updateTimeTable()
1842 if (flagDoNotRecomputeAfterChange)
return;
1844 int scrollLineStep = myGridMinorWidth;
1845 if (showMajorTicks()) {
1846 TQValueList<int>::iterator intIt = majorTicks.begin();
1847 scrollLineStep = 5 * myGridMinorWidth;
1848 if (intIt != majorTicks.end()) {
1851 if (intIt != majorTicks.end()) {
1852 scrollLineStep = *intIt-left;
1856 myGanttView->myCanvasView->horizontalScrollBar()->setLineStep(scrollLineStep);
1857 myGanttView->myTimeTable->maximumComputedGridHeight = 0;
1858 myGanttView->myTimeTable->updateMyContent();
1862void KDTimeHeaderWidget::setAutoScaleMinorTickCount(
int count )
1864 myAutoScaleMinorTickcount = count;
1870int KDTimeHeaderWidget::autoScaleMinorTickCount()
1872 return myAutoScaleMinorTickcount;
1876void KDTimeHeaderWidget::repaintMe(
int left,
int paintwid, TQPainter* painter)
1878 if (flagDoNotRecomputeAfterChange)
return;
1879 TQColorGroup qcg =TQColorGroup( white, black,white, darkGray,black,gray,gray) ;
1882 if ( paintwid > paintPix.width()-100 )
1883 paintPix.resize( paintwid+100, height () );
1887 p =
new TQPainter( &paintPix );
1888 offsetLeft = left-50;
1891 p->fillRect( left-offsetLeft, 0, paintwid, height(), TQBrush(paletteBackgroundColor()) );
1894 if ( beginMouseDown < endMouseDown ) {
1895 start = beginMouseDown ;
1896 wid = endMouseDown - beginMouseDown ;
1898 start = endMouseDown ;
1899 wid = -endMouseDown + beginMouseDown ;
1901 p->fillRect( start-offsetLeft, 0, wid, height(), TQBrush(paletteBackgroundColor().dark()) );
1904 p->fillRect( left-offsetLeft, 0, paintwid, height(), TQBrush(paletteBackgroundColor()) );
1906 p->setPen(TQColor(40,40,40));
1907 TQFont tempFont = p->font();
1908 tempFont.setWeight(63);
1909 p->setFont(tempFont);
1910 int hei1 = myMajorGridHeight,
1912 wid1 = myGridMinorWidth;
1916 TQValueList<TQString>::iterator it;
1917 TQValueList<int>::iterator intIt = majorTicks.begin();
1918 for ( it = majorText.begin(); it != majorText.end(); ++it ) {
1919 xCoord = (*intIt++);
1920 if (((*intIt)>= left && xCoord <= left+paintwid)) {
1921 qDrawShadeLine ( p,xCoord-offsetLeft ,hei1+1, xCoord-offsetLeft, -2, qcg,
true, lwid, 1 );
1922 p->drawText(xCoord+4-offsetLeft,hei1-4,(*it));
1925 qDrawShadeLine ( p,left-offsetLeft ,hei1, left+paintwid-offsetLeft, hei1, qcg,
true, lwid, 1 );
1927 for ( it = minorText.begin(); it != minorText.end(); ++it ) {
1928 if (i*wid1 >= left-wid1 && i*wid1 <= left+paintwid) {
1929 qDrawShadeLine ( p,i*wid1-offsetLeft ,hei1-1, i*wid1-offsetLeft, hei2, qcg,
true, lwid, 1 );
1930 p->drawText(i*wid1+1-offsetLeft,hei1+1,wid1-1,hei2-hei1,TQt::AlignCenter,(*it));
1935 p->drawLine(left-offsetLeft,hei1,left+paintwid-offsetLeft,hei1);
1936 qDrawShadeLine ( p,left-offsetLeft ,hei2-1, left+paintwid-offsetLeft, hei2-1, qcg,
true, lwid, 1 );
1937 p->drawLine(left-offsetLeft,hei2-1,left+paintwid-offsetLeft,hei2-1);
1941 bitBlt (
this, left, 0, &paintPix, 50, 0, paintwid, height() );
1948TQDateTime KDTimeHeaderWidget::getEvenTimeDate(TQDateTime tempdatetime ,Scale sc)
1952 int tempMinorScaleCount = myRealMinorScaleCount;
1955 case KDGanttView::Month:
1956 tempdate = tempdatetime.date();
1957 while (tempdate.day ()!= 1 )
1958 tempdate = tempdate.addDays(-1);
1961 tempdatetime = TQDateTime (tempdate, TQTime (0,0));
1963 case KDGanttView::Week:
1964 tempdate = tempdatetime.date();
1965 while (tempdate.dayOfWeek ()!= TDEGlobal::locale()->weekStartDay())
1966 tempdate = tempdate.addDays(-1);
1968 tempdatetime = TQDateTime (tempdate, TQTime (0,0));
1970 case KDGanttView::Day:
1971 tempdatetime = TQDateTime (tempdatetime.date(), TQTime ( 0,0 ) );
1973 case KDGanttView::Hour:
1974 hour = tempdatetime.time().hour();
1975 while (24%tempMinorScaleCount > 0 && 24%tempMinorScaleCount < 24)
1976 ++tempMinorScaleCount;
1977 hour = ( hour /tempMinorScaleCount)*tempMinorScaleCount;
1978 tempdatetime = TQDateTime (tempdatetime.date(), TQTime (hour, 0 ));
1980 case KDGanttView::Minute:
1981 min = tempdatetime.time().minute();
1982 while (60%tempMinorScaleCount > 0 && 60%tempMinorScaleCount < 60)
1983 ++tempMinorScaleCount;
1985 min = (min /tempMinorScaleCount)*tempMinorScaleCount;
1986 tempdatetime = TQDateTime (tempdatetime.date(), TQTime (tempdatetime.time().hour(),min ));
1989 case KDGanttView::Auto:
1992 return tempdatetime;
1996void KDTimeHeaderWidget::computeRealScale(TQDateTime start)
1999 if (myScale ==KDGanttView::Auto) {
2002 double secsPerMinor = (((double)start.secsTo(myHorizonEnd)))/((double)myAutoScaleMinorTickcount);
2003 secsPerMinor /= myZoomFactor;
2004 if (secsPerMinor <= 1800) {
2005 myRealScale = KDGanttView::Minute;
2006 myRealMinorScaleCount = (int) secsPerMinor/60;
2008 if (secsPerMinor <= 12*3600) {
2009 myRealScale = KDGanttView::Hour;
2010 myRealMinorScaleCount = (int) secsPerMinor/3600;
2012 if (secsPerMinor <= 24*3600*3) {
2013 myRealScale = KDGanttView::Day;
2014 myRealMinorScaleCount = (int) secsPerMinor/(3600*24);
2016 if (secsPerMinor <= 24*3600*14) {
2017 myRealScale = KDGanttView::Week;
2018 myRealMinorScaleCount = (int) secsPerMinor/(3600*24*7);
2020 myRealScale = KDGanttView::Month;
2021 myRealMinorScaleCount = (int) secsPerMinor/(3600*24*30);
2027 if(myRealMinorScaleCount == 0)
2028 myRealMinorScaleCount = 1;
2029 myRealMajorScaleCount = 1;
2033 myRealScale = myScale;
2034 if (myRealScale > myMaxScale)
2035 myRealScale = myMaxScale;
2036 if (myRealScale < myMinScale)
2037 myRealScale = myMinScale;
2038 myRealMinorScaleCount = (int) ( ((
double)myMinorScaleCount) /myZoomFactor );
2039 double tempZoom = myZoomFactor;
2040 myRealMajorScaleCount = myMajorScaleCount;
2041 while (myRealMinorScaleCount == 0) {
2042 if (myRealScale == myMinScale) {
2043 myRealMinorScaleCount = 1;
2046 switch (myRealScale)
2048 case KDGanttView::Minute:
2049 myRealMinorScaleCount = 1;
2052 case KDGanttView::Hour:
2053 myRealScale = KDGanttView::Minute;
2054 tempZoom = tempZoom/60;
2056 case KDGanttView::Day:
2057 myRealScale = KDGanttView::Hour;
2058 tempZoom = tempZoom/24;
2060 case KDGanttView::Week:
2061 myRealScale = KDGanttView::Day;
2062 tempZoom = tempZoom/7;
2064 case KDGanttView::Month:
2065 myRealScale = KDGanttView::Week ;
2066 tempZoom = tempZoom*7/30;
2068 case KDGanttView::Auto:
2071 myRealMinorScaleCount = (int) ( myMinorScaleCount /tempZoom );
2077void KDTimeHeaderWidget::computeTicks(
bool doNotComputeRealScale)
2079 if (flagDoNotRecomputeAfterChange)
return;
2080 bool block = myGanttView->myTimeTable->blockUpdating();
2081 myGanttView->myTimeTable->setBlockUpdating(
true );
2086 if ( !doNotComputeRealScale )
2087 saveCenterDateTime();
2088 if (!doNotComputeRealScale)
2089 computeRealScale(myHorizonStart);
2090 myRealStart = getEvenTimeDate(myHorizonStart ,myRealScale);
2091 if (!doNotComputeRealScale)
2092 computeRealScale(myRealStart);
2093 int tempMinorScaleCount = myRealMinorScaleCount,
2094 tempMajorScaleCount = myRealMajorScaleCount;
2095 int minorItems,minorPerMajor = 1;
2096 minorItems = (int) (secsFromTo( myRealStart, myHorizonEnd)/60.0);
2100 TQString testTextMinor,testTextMajor, tempStr;
2101 TQRect itemRectMinor, itemRectMajor;
2102 TQDate tempDate = myRealStart.date();
2103 myRealEnd = myRealStart;
2105 switch (myRealScale)
2108 case KDGanttView::Minute:
2109 testTextMinor =
"60";
2110 if (myHourFormat == KDGanttView::Hour_12)
2111 testTextMajor =
"Mon Aug 30, 12 AMx";
2113 testTextMajor =
"Mon Aug 30, 24:00x";
2114 minorPerMajor = 6000;
2116 case KDGanttView::Hour:
2117 minorItems = minorItems/60;
2118 if (myHourFormat == KDGanttView::Hour_24)
2119 testTextMinor =
"24x";
2121 testTextMinor =
"12 AM";
2122 testTextMajor =
"Mon Aug 30, x";
2123 if ( yearFormat() != KDGanttView::NoDate )
2124 testTextMajor += getYear(TQDate::currentDate());
2125 minorPerMajor = 2400;
2127 case KDGanttView::Day:
2128 minorItems = minorItems/(60*24);
2129 testTextMinor =
"88";
2130 testTextMajor =
"Aug 30, x"+getYear(TQDate::currentDate());
2131 minorPerMajor = 700;
2133 case KDGanttView::Week:
2134 minorItems = minorItems/(60*24*7);
2135 testTextMinor =
"88";
2136 testTextMajor =
"Aug x"+getYear(TQDate::currentDate());
2137 minorPerMajor = 435;
2139 case KDGanttView::Month:
2140 minorItems = (minorItems*12)/(60*24*365);
2141 testTextMinor =
"M";
2142 testTextMajor =
"x"+getYear(TQDate::currentDate());
2143 minorPerMajor = 1200;
2145 case KDGanttView::Auto:
2146 tqDebug(
"KDGanttView::Internal Error in KDTimeHeaderWidget::computeTicks() ");
2147 tqDebug(
" RealScale == Auto : This may not be! ");
2150 itemRectMinor = p.boundingRect ( 10, 10, 2, 2, TQt::AlignLeft,testTextMinor);
2151 itemRectMajor = p.boundingRect ( 10, 10, 2, 2, TQt::AlignLeft,testTextMajor);
2154 Height = itemRectMinor.height()+itemRectMajor.height()+11;
2155 Width = (itemRectMinor.width()+5);
2156 if (Width < minimumColumnWidth()) Width = minimumColumnWidth();
2159 int maxWid = myGanttView->myCanvasView->viewport()->width();
2161 maxWid = maximumWidth();
2162 while((minorItems/tempMinorScaleCount+1)*Width > maxWid)
2163 ++tempMinorScaleCount;
2165 mySizeHint = (minorItems/tempMinorScaleCount+1)*Width;
2166 switch (myRealScale)
2168 case KDGanttView::Minute:
2169 if (tempMinorScaleCount < 60)
2170 while (60%tempMinorScaleCount > 0 && 60%tempMinorScaleCount < 60)
2171 ++tempMinorScaleCount;
2172 if (tempMinorScaleCount >= 60) {
2173 myRealScale = KDGanttView::Hour;
2174 myRealMinorScaleCount = tempMinorScaleCount/ 60;
2176 myRealMajorScaleCount = 1;
2177 tqDebug(
"KDGantt::Overzoom:Rescaling from Minute to Hour");
2178 myGanttView->myTimeTable->setBlockUpdating( block );
2179 emit myGanttView->rescaling( KDGanttView::Hour );
2184 case KDGanttView::Hour:
2185 while (24%tempMinorScaleCount > 0 && 24%tempMinorScaleCount < 24)
2186 ++tempMinorScaleCount;
2187 if (tempMinorScaleCount >= 24) {
2188 myRealScale = KDGanttView::Day;
2189 myRealMinorScaleCount = tempMinorScaleCount/ 24;
2191 myRealMajorScaleCount = 1;
2192 tqDebug(
"KDGantt::Overzoom:Rescaling from Hour to Day");
2193 myGanttView->myTimeTable->setBlockUpdating( block );
2194 emit myGanttView->rescaling( KDGanttView::Day );
2203 while((minorItems/tempMinorScaleCount+1)*Width < myMinimumWidth ) {
2206 minorItems = (minorItems/tempMinorScaleCount)+1;
2208 minorPerMajor = (minorPerMajor*tempMajorScaleCount)/tempMinorScaleCount;
2212 while ((minorPerMajor*Width)/100 < itemRectMajor.width()) {
2213 minorPerMajor = minorPerMajor/tempMajorScaleCount;
2214 ++tempMajorScaleCount;
2215 minorPerMajor = minorPerMajor*tempMajorScaleCount;
2219 myGridMinorWidth = Width;
2221 Width *= minorItems;
2223 if (width() != Width || height() != Height )
2225 resize( Width, Height );
2226 emit sizeChanged( Width );
2228 myMajorGridHeight = itemRectMajor.height()+5;
2229 TQTime tempTime = myRealStart.time();
2230 TQDateTime tempDateTime;
2232 const KCalendarSystem * calendar = TDEGlobal::locale()->calendar();
2233 switch (myRealScale)
2235 case KDGanttView::Minute:
2236 myRealEnd = myRealEnd.addSecs((minorItems)*tempMinorScaleCount*60);
2237 for ( i = 0; i < minorItems;++i) {
2238 tempStr.setNum(tempTime.minute());
2239 minorText.append(tempStr);
2240 tempTime = tempTime.addSecs(60*tempMinorScaleCount);
2242 tempDateTime = myRealStart;
2243 while (tempDateTime.time().minute() != 0)
2244 tempDateTime = tempDateTime.addSecs(60);
2245 while (tempDateTime < myRealEnd) {
2246 majorTicks.append( getCoordX(tempDateTime));
2247 tempStr.setNum(tempDateTime.date().day());
2248 if ( yearFormat() == KDGanttView::NoDate ) {
2249 tempStr = calendar->weekDayName( tempDateTime.date() )+
", "
2250 +getHour(tempDateTime.time());
2252 tempStr = calendar->weekDayName( tempDateTime.date(),
true )+
" "+
2253 calendar->monthName( tempDateTime.date().month(), tempDateTime.date().year(),
true)+
" "+
2254 tempStr+
", "+getHour(tempDateTime.time());
2257 majorText.append(tempStr);
2258 tempDateTime = tempDateTime.addSecs(3600*tempMajorScaleCount);
2260 majorTicks.append( getCoordX(tempDateTime));
2263 case KDGanttView::Hour:
2264 myRealEnd = myRealEnd.addSecs(minorItems*tempMinorScaleCount*60*60);
2266 for ( i = 0; i < minorItems;++i) {
2267 tempStr = getHour(tempTime);
2268 minorText.append(tempStr);
2269 tempTime = tempTime.addSecs(3600*tempMinorScaleCount);
2271 tempDateTime = myRealStart;
2272 while (tempDateTime.time().hour() != 0)
2273 tempDateTime = tempDateTime.addSecs(3600);
2274 while (tempDateTime < myRealEnd) {
2275 majorTicks.append( getCoordX(tempDateTime));
2276 tempStr.setNum(tempDateTime.date().day());
2277 if ( yearFormat() == KDGanttView::NoDate ) {
2278 tempStr = calendar->weekDayName( tempDateTime.date() );
2280 tempStr = calendar->weekDayName( tempDateTime.date(),
true )+
" "+
2281 calendar->monthName( tempDateTime.date().month(), tempDateTime.date().year(),
true)+
" "+
2282 tempStr+
", "+getYear(tempDateTime.date());
2284 majorText.append(tempStr);
2285 tempDateTime = tempDateTime.addDays(tempMajorScaleCount);
2287 majorTicks.append( getCoordX(tempDateTime));
2289 case KDGanttView::Day:
2290 myRealEnd = myRealEnd.addDays(minorItems*tempMinorScaleCount);
2291 for ( i = 0; i < minorItems;++i) {
2292 if (tempMinorScaleCount == 1)
2293 minorText.append((calendar->weekDayName(tempDate,
true)).left(1));
2295 minorText.append(TQString::number(tempDate.day()));
2296 tempDate = tempDate.addDays(tempMinorScaleCount);
2298 tempDate = myRealStart.date();
2299 while (tempDate.dayOfWeek() != TDEGlobal::locale()->weekStartDay())
2300 tempDate = tempDate.addDays(1);
2301 while (tempDate < myRealEnd.date()) {
2302 majorTicks.append( getCoordX(tempDate));
2303 tempStr.setNum(tempDate.day());
2304 tempStr = calendar->monthName(tempDate.month(), tempDate.year(),
true)+
" "+
2305 tempStr+
", "+getYear(tempDate);
2306 majorText.append(tempStr);
2307 tempDate = tempDate.addDays(7*tempMajorScaleCount);
2309 majorTicks.append( getCoordX(tempDate));
2311 case KDGanttView::Week:
2312 myRealEnd = myRealEnd.addDays(minorItems*tempMinorScaleCount*7);
2313 for ( i = 0; i < minorItems;++i) {
2314 tempStr.setNum(tempDate.day());
2315 minorText.append(tempStr);
2316 tempDate = tempDate.addDays(7*tempMinorScaleCount);
2318 tempDate = myRealStart.date();
2319 while (tempDate.day() != TDEGlobal::locale()->weekStartDay())
2320 tempDate = tempDate.addDays(1);
2321 while (tempDate < myRealEnd.date()) {
2322 majorTicks.append( getCoordX(tempDate));
2323 tempStr = calendar->monthName(tempDate.month(), tempDate.year(),
true)+
" "+getYear(tempDate);
2324 majorText.append(tempStr);
2325 tempDate = tempDate.addMonths(tempMajorScaleCount);
2327 majorTicks.append( getCoordX(tempDate));
2329 case KDGanttView::Month:
2330 myRealEnd = myRealEnd.addMonths(minorItems*tempMinorScaleCount);
2331 for ( i = 0; i < minorItems;++i) {
2332 minorText.append((calendar->monthName(tempDate.month(), tempDate.year(),
true)).left(1));
2333 tempDate = tempDate.addMonths(tempMinorScaleCount);
2335 tempDate = myRealStart.date();
2336 while (tempDate.month() != 1)
2337 tempDate = tempDate.addMonths(1);
2338 while (tempDate < myRealEnd.date()) {
2339 majorTicks.append( getCoordX(tempDate));
2340 tempStr = getYear(tempDate);
2341 majorText.append(tempStr);
2342 tempDate = tempDate.addYears(tempMajorScaleCount);
2344 majorTicks.append( getCoordX(tempDate));
2346 case KDGanttView::Auto:
2350 if (flagDoNotRepaintAfterChange) {
2351 myGanttView->myTimeTable->setBlockUpdating( block );
2355 myGanttView->myTimeTable->setBlockUpdating( block );
2357 centerDateTime(myCenterDateTime);
2362void KDTimeHeaderWidget::saveCenterDateTime()
2364 double wid = width();
2365 double allsecs = secsFromTo( myRealStart, myRealEnd );
2366 double center = myGanttView->myCanvasView->viewport()->width();
2367 center = center / 2;
2368 center = center + myGanttView->myCanvasView->contentsX();
2369 double secs = (allsecs*center)/wid;
2370 double days = secs/86400.0;
2371 secs = secs - ( (int) days *86400.0 );
2372 myCenterDateTime = (myRealStart.addDays ( (
int) days )).addSecs( (
int) secs);
2376void KDTimeHeaderWidget::centerDateTime(
const TQDateTime& center )
2378 moveTimeLineTo(getCoordX( center )-(myGanttView->myCanvasView->viewport()->width() /2));
2384void KDTimeHeaderWidget::paintEvent(TQPaintEvent *p)
2386 repaintMe(p->rect().x(),p->rect().width());
2390int KDTimeHeaderWidget::getCoordX(TQDate date)
2393 int daysAll = myRealStart.daysTo(myRealEnd);
2394 if (daysAll == 0)
return 0;
2395 int days = myRealStart.daysTo(TQDateTime(date));
2396 return (wid *days) /daysAll;
2400int KDTimeHeaderWidget::getCoordX(TQDateTime datetime)
2402 double wid = width();
2403 double secsAll = secsFromTo( myRealStart, myRealEnd );
2404 if (secsAll == 0.0)
return 0;
2405 double secs = secsFromTo( myRealStart, datetime);
2406 return ((
int)((wid *(secs /secsAll))+0.5));
2410TQString KDTimeHeaderWidget::getYear(TQDate date)
2413 ret.setNum(date.year());
2414 switch (yearFormat()) {
2415 case KDGanttView::FourDigit:
2418 case KDGanttView::TwoDigit:
2421 case KDGanttView::TwoDigitApostrophe:
2422 ret =
"'"+ret.right(2);
2424 case KDGanttView::NoDate:
2432TQString KDTimeHeaderWidget::getHour(TQTime time)
2435 int hour = time.hour();
2436 if (myHourFormat == KDGanttView::Hour_12) {
2438 if (hour > 12) hour -=12;
2442 if (hour == 0) hour = 12;
2447 if (myHourFormat == KDGanttView::Hour_24)
2458void KDTimeHeaderWidget::mousePressEvent ( TQMouseEvent * e )
2461 switch ( e->button() ) {
2462 case TQt::LeftButton:
2464 beginMouseDown = e->pos().x();
2465 endMouseDown = e->pos().x();
2467 case TQt::RightButton:
2468 if (flagShowPopupMenu)
2469 myPopupMenu->popup(e->globalPos());
2471 case TQt::MidButton:
2480void KDTimeHeaderWidget::mouseReleaseEvent ( TQMouseEvent * )
2486 if ( beginMouseDown < endMouseDown ) {
2487 start = beginMouseDown;
2490 start = endMouseDown;
2491 end = beginMouseDown;
2495 if ( end > width() )
2499 emit myGanttView->timeIntervalSelected( getDateTimeForIndex(start),getDateTimeForIndex(end) );
2500 emit myGanttView->timeIntervallSelected( getDateTimeForIndex(start),getDateTimeForIndex(end) );
2508void KDTimeHeaderWidget::mouseDoubleClickEvent ( TQMouseEvent * )
2514void KDTimeHeaderWidget::mouseMoveEvent ( TQMouseEvent * e )
2517 if ( e->pos().y() < -height() || e->pos().y() > 2* height() ) {
2522 endMouseDown = e->pos().x();
2525 if (endMouseDown < -x() ) {
2526 val = myGanttView->myCanvasView->horizontalScrollBar()->value() -
2527 myGanttView->myCanvasView->horizontalScrollBar()->lineStep();
2532 if (endMouseDown > -x() +parentWidget()->width() ) {
2533 val = myGanttView->myCanvasView->horizontalScrollBar()->value() +
2534 myGanttView->myCanvasView->horizontalScrollBar()->lineStep();
2537 repaintMe(-x(),parentWidget()->width());
2539 if ( val > myGanttView->myCanvasView->horizontalScrollBar()->maxValue() ) {
2540 val = myGanttView->myCanvasView->horizontalScrollBar()->maxValue();
2542 myGanttView->myCanvasView->horizontalScrollBar()->setValue( val );
2552KDLegendWidget:: KDLegendWidget( TQWidget* parent,
2557 myLegendParent = legendParent;
2559 scroll =
new TQScrollView( legendParent );
2560 setMaximizedWidget( scroll );
2562 setMinimizedWidget( myLabel =
new TQLabel( i18n(
" Legend is hidden" ),
this) );
2563 setGeometry( 0, 0, 50, 50 );
2568void KDLegendWidget::setAsDoctwindow(
bool dockwin )
2570 if ( (dock == 0 && !dockwin) || ( dock && dockwin ) )
2574 setMaximizedWidget( 0 );
2576 if ( dock )
delete dock;
2577 dock =
new TQDockWindow(TQDockWindow:: OutsideDock,0 );
2578 dock->resize( 200, 100 );
2579 dock->setHorizontallyStretchable(
true );
2580 dock->setVerticallyStretchable(
true );
2581 dock->setCaption(i18n(
"Legend: ") );
2582 dock->setResizeEnabled (
true );
2586 scroll =
new TQScrollView( dock );
2588 dock->setWidget(scroll);
2589 setMaximizedWidget( dock );
2593 setMaximizedWidget( 0 );
2600 scroll =
new TQScrollView( myLegendParent );
2602 setMaximizedWidget( scroll );
2609bool KDLegendWidget::asDoctwindow( )
2617TQDockWindow* KDLegendWidget::dockwindow( )
2623void KDLegendWidget::setFont( TQFont font)
2625 myLegend->setFont( font);
2626 myLabel->setFont( font);
2627 TQWidget::setFont( font );
2631void KDLegendWidget::drawToPainter( TQPainter *p )
2633 p->drawPixmap( 0, 0, TQPixmap::grabWidget( myLegend ) );
2637TQSize KDLegendWidget::legendSize()
2639 return myLegend->size();
2643TQSize KDLegendWidget::legendSizeHint()
2645 TQApplication::sendPostedEvents( 0, TQEvent::LayoutHint );
2646 return TQSize( myLegend->sizeHint().width(), myLegend->sizeHint().height()+scroll->horizontalScrollBar()->height());
2650void KDLegendWidget::showMe (
bool show )
2656void KDLegendWidget::clearLegend ( )
2658 if ( myLegend )
delete myLegend;
2660 myLegend =
new TQGroupBox( 1, TQt::Horizontal, scroll->viewport() );
2662 myLegend =
new TQGroupBox( 1, TQt::Horizontal, i18n(
"Legend" ), scroll->viewport() );
2663 myLegend->setBackgroundColor( TQt::white );
2664 myLegend->setFont( font() );
2665 scroll->addChild( myLegend );
2666 scroll->setResizePolicy( TQScrollView::AutoOneFit );
2667 myLegend->layout()->setMargin( 11 );
2668 myLegend->setFrameStyle( TQFrame::NoFrame );
2670 scroll->setMaximumHeight( 32000 );
2672 scroll->setMaximumHeight( legendSizeHint().height() );
2676void KDLegendWidget::addLegendItem(
KDGanttViewItem::Shape shape,
const TQColor& shapeColor,
const TQString& text )
2680 TQWidget *w =
new TQWidget( myLegend );
2681 w->setBackgroundColor( TQt::white );
2682 TQHBoxLayout *lay =
new TQHBoxLayout( w ,0, 6);
2683 temp =
new TQLabel ( w );
2684 lay->addWidget( temp, 0, TQt:: AlignRight);
2686 temp =
new TQLabel ( text, w );
2687 temp->setBackgroundColor( TQt::white );
2688 lay->addWidget( temp, 0, TQt:: AlignLeft);
2691 scroll->setMaximumHeight( 32000 );
2693 scroll->setMaximumHeight( legendSizeHint().height() );
2697bool KDLegendWidget::isShown ( )
2699 return !isMinimized();
2703KDListView::KDListView(TQWidget* parent,
KDGanttView* gantView):TQListView (parent)
2705 myGanttView = gantView;
2706 setAcceptDrops(
true);
2707 new KDListViewWhatsThis(viewport(),
this);
2708 setRootIsDecorated(
true );
2709 setAllColumnsShowFocus(
true );
2710 addColumn( i18n(
"Task Name" ) );
2713 setHScrollBarMode (TQScrollView::AlwaysOn );
2714 setDefaultRenameAction(TQListView::Accept);
2715 setColumnWidthMode ( 0,Maximum );
2716 _calendarMode =
false;
2721void KDListView::dragItem( TQListViewItem * )
2726TQString KDListView::getWhatsThisText(TQPoint p)
2731 return i18n(
"No item Found" );
2734void KDListView::setCalendarMode(
bool mode )
2736 _calendarMode = mode;
2740void KDListView::setOpen(TQListViewItem * item,
bool open )
2742 if (! _calendarMode || ! open ) {
2744 TQListView::setOpen ( item, open );
2751 TQListViewItem* temp;
2752 temp = item->firstChild();
2753 bool openItem =
false;
2756 temp->setVisible(
true );
2760 temp->setVisible(
false );
2763 temp = temp->nextSibling();
2767 TQListView::setOpen ( item, open );
2773void KDListView::contentsMouseDoubleClickEvent ( TQMouseEvent * e )
2775 TQListView::contentsMouseDoubleClickEvent ( e );
2781 emit myGanttView->lvItemDoubleClicked ( (
KDGanttViewItem*) itemAt(e->pos() ) );
2782 emit myGanttView->itemDoubleClicked ( (
KDGanttViewItem*) itemAt(e->pos() ) );
2788void KDListView::drawToPainter ( TQPainter * p,
bool drawHeader )
2791 drawAllContents ( p, 0, 0, contentsWidth(), contentsHeight() );
2796 TQPen pen = TQPen(TQt::lightGray, 1);
2798 TQHeader *h = header();
2799 for (
int s = 0; s < h->count(); ++s) {
2800 TQRect r = h->sectionRect(s);
2802 p->translate(0, -r.height());
2805 p->drawText(r.x()+2, r.y(), r.width()-2, r.height(), columnAlignment(s)|TQt::AlignVCenter, h->label(s), -1);
2808 p->drawRect(r.x(), r.y()+1, r.width(), r.height()-2);
2815int KDListView::buildDrawables(TQPtrList<KDListView::DrawableItem> &lst,
int level,
int ypos, TQListViewItem *item,
int ymin,
int ymax)
const {
2817 int ih = item->height();
2818 if (y < ymin && y+ih > ymin) {
2821 if (y >= ymin && y < ymax) {
2822 KDListView::DrawableItem *dr =
new KDListView::DrawableItem(level, y, item);
2827 if (item->isOpen()) {
2828 TQListViewItem *child = item->firstChild();
2829 for (; child; child = child->nextSibling()) {
2830 y = buildDrawables(lst, level+1, y, child, ymin, ymax);
2839void KDListView::drawAllContents(TQPainter * p,
int cx,
int cy,
int cw,
int ch) {
2840 if ( columns() == 0 ) {
2841 paintEmptyArea( p, TQRect( cx, cy, cw, ch ) );
2845 TQPtrList<KDListView::DrawableItem> drawables;
2846 drawables.setAutoDelete(
true);
2847 TQListViewItem *child = firstChild();
2850 for (; child; child = child->nextSibling()) {
2851 ypos = buildDrawables(drawables, level, ypos, child, cy, cy+ch);
2854 p->setFont( font() );
2856 TQPtrListIterator<KDListView::DrawableItem> it(drawables);
2859 int fx = -1, x, fc = 0, lc = 0;
2861 KDListView::DrawableItem * current;
2863 while ( (current = it.current()) != 0 ) {
2865 int ih = current->i->height();
2866 int ith = current->i->totalHeight();
2871 if ( ih > 0 && current->y < cy+ch && current->y+ih > cy ) {
2877 cs = header()->cellSize( 0 );
2878 while ( x + cs <= cx && c < header()->count() ) {
2881 if ( c < header()->count() )
2882 cs = header()->cellSize( c );
2886 while( x < cx + cw && c < header()->count() ) {
2889 if ( c < header()->count() )
2890 cs = header()->cellSize( c );
2899 const TQColorGroup &cg = ( palette().inactive() );
2901 while ( c < lc && !drawables.isEmpty() ) {
2902 int i = header()->mapToLogical( c );
2903 cs = header()->cellSize( c );
2904 r.setRect( x, current->y-cy, cs, ih );
2906 r.setLeft( r.left() + current->l * treeStepSize() );
2910 if ( !( r.width() == 0 || r.height() == 0 ) ) {
2911 p->translate( r.left(), r.top() );
2912 int ac = header()->mapToLogical( c );
2915 int align = columnAlignment( ac );
2916 if ( align == AlignAuto ) align = AlignLeft;
2917 bool sel = current->i->isSelected();
2919 current->i->setSelected(
false);
2920 current->i->paintCell( p, cg, ac, r.width(), align );
2922 current->i->setSelected(sel);
2931 const int cell = header()->mapToActual( 0 );
2934 tx = header()->cellPos( cell );
2972void KDListView::resizeEvent(TQResizeEvent *)
2976void KDListView::dragEnterEvent ( TQDragEnterEvent * e)
2978 if ( !myGanttView->dropEnabled() ) {
2982 myGanttView->lvDragEnterEvent(e);
2986void KDListView::dragMoveEvent ( TQDragMoveEvent * e)
2988 if ( !myGanttView->dropEnabled() ) {
2994 setCurrentItem( gItem );
2995 if ( e->source() == myGanttView )
2996 draggedItem = myGanttView->myCanvasView->lastClickedItem;
2998 if (myGanttView->lvDragMoveEvent ( e , draggedItem, gItem ) )
3004 if ( e->source() == myGanttView && gItem ){
3008 if ( pItem == myGanttView->myCanvasView->lastClickedItem ) {
3014 if ( gItem == myGanttView->myCanvasView->lastClickedItem ) {
3022void KDListView::dragLeaveEvent ( TQDragLeaveEvent * )
3026void KDListView::dropEvent ( TQDropEvent *e )
3028 if ( !myGanttView->dropEnabled() ) {
3034 if ( e->source() == myGanttView )
3035 draggedItem = myGanttView->myCanvasView->lastClickedItem;
3036 if (myGanttView->lvDropEvent ( e, draggedItem, gItem ))
3042 if ( gItem == myGanttView->myCanvasView->lastClickedItem && gItem != 0 ) {
3043 tqDebug(
"KDGanttView::Possible bug in drag&drop code ");
3047 TQDomDocument doc(
"GanttView" );
3048 doc.setContent(
string );
3049 TQDomElement docRoot = doc.documentElement();
3050 TQDomNode node = docRoot.firstChild();
3051 bool enable = myGanttView->myTimeTable->blockUpdating( );
3052 myGanttView->myTimeTable->setBlockUpdating(
true );
3053 while( !node.isNull() ) {
3054 TQDomElement element = node.toElement();
3055 if( !element.isNull() ) {
3056 TQString tagName = element.tagName();
3057 if( tagName ==
"Items" ) {
3058 TQDomNode node = element.firstChild();
3059 while( !node.isNull() ) {
3060 TQDomElement element = node.toElement();
3061 if( !element.isNull() ) {
3062 TQString tagName = element.tagName();
3063 if( tagName ==
"Item" ) {
3071 tqDebug(
"Unrecognized tag name: %s", tagName.latin1() );
3076 node = node.nextSibling();
3081 node = node.nextSibling();
3084 newItem->resetSubitemVisibility();
3085 myGanttView->slot_lvDropped(e, draggedItem, gItem);
3086 myGanttView->myTimeTable->setBlockUpdating( enable );
3087 myGanttView->myTimeTable->updateMyContent();
3091TQDragObject * KDListView::dragObject ()
3093 return TQListView::dragObject ();
3096void KDListView::startDrag ()
3098 if ( ! myGanttView->dragEnabled() )
3101 myGanttView->myCanvasView->lastClickedItem = cItem;
3102 myGanttView->lvStartDrag (cItem);
3105KDCanvasText::KDCanvasText( KDTimeTableWidget* canvas,
3108 TQCanvasText(canvas)
3110 myParentType = type;
3111 myParentItem = parentItem;
3115KDCanvasLine::KDCanvasLine( KDTimeTableWidget* canvas,
3118 TQCanvasLine(canvas)
3120 myParentType = type;
3121 myParentItem = parentItem;
3125KDCanvasPolygonItem::KDCanvasPolygonItem( KDTimeTableWidget* canvas,
3128 TQCanvasPolygonalItem( canvas )
3130 myParentType = type;
3131 myParentItem = parentItem;
3135KDCanvasPolygon::KDCanvasPolygon( KDTimeTableWidget* canvas,
3138 TQCanvasPolygon( canvas )
3140 myParentType = type;
3141 myParentItem = parentItem;
3145KDCanvasEllipse::KDCanvasEllipse( KDTimeTableWidget* canvas,
3148 TQCanvasEllipse( canvas )
3150 myParentType = type;
3151 myParentItem = parentItem;
3155KDCanvasRectangle::KDCanvasRectangle( KDTimeTableWidget* canvas,
3158 TQCanvasRectangle( canvas )
3160 myParentType = type;
3161 myParentItem = parentItem;
3167KDGanttCanvasView::KDGanttCanvasView(
KDGanttView* sender,TQCanvas* canvas, TQWidget* parent,
const
3168 char* name ) : TQCanvasView ( canvas, parent, name ), scrollBarTimer( 0,
"scrollBarTimer" )
3170 setHScrollBarMode (TQScrollView::AlwaysOn );
3171 setVScrollBarMode( TQScrollView::AlwaysOn );
3172 myToolTip =
new KDCanvasToolTip(viewport(),
this);
3173 mySignalSender = sender;
3179 linkItemsEnabled =
false;
3180 linkLine =
new TQCanvasLine(canvas);
3182 linkLine->setZ(1000);
3184 new KDCanvasWhatsThis(viewport(),
this);
3185 onItem =
new TQPopupMenu(
this );
3186 TQPopupMenu * newMenu =
new TQPopupMenu(
this );
3187 TQPopupMenu * onView =
new TQPopupMenu(
this );
3188 onView->insertItem( i18n(
"Summary" ),
this,
3189 TQ_SLOT ( newRootItem(
int ) ), 0, 0 );
3190 onView->insertItem( i18n(
"Event" ),
this,
3191 TQ_SLOT ( newRootItem(
int ) ), 0, 1);
3192 onView->insertItem( i18n(
"Task" ),
this,
3193 TQ_SLOT ( newRootItem(
int ) ), 0, 2 );
3195 onItem->insertItem( i18n(
"New Root" ), onView );
3196 newMenu->insertItem( i18n(
"Summary" ),
3197 this, TQ_SLOT ( newChildItem(
int) ), 0, 0 );
3198 newMenu->insertItem( i18n(
"Event" ),
3199 this, TQ_SLOT ( newChildItem(
int ) ), 0, 1 );
3200 newMenu->insertItem( i18n(
"Task" ),
3201 this, TQ_SLOT ( newChildItem(
int ) ), 0, 2 );
3203 onItem->insertItem( i18n(
"New Child" ), newMenu );
3204 TQPopupMenu * afterMenu =
new TQPopupMenu(
this );
3205 afterMenu->insertItem( i18n(
"Summary" ),
3206 this, TQ_SLOT ( newChildItem(
int) ), 0, 0+4 );
3207 afterMenu->insertItem( i18n(
"Event" ),
3208 this, TQ_SLOT ( newChildItem(
int ) ), 0, 1+4 );
3209 afterMenu->insertItem( i18n(
"Task" ),
3210 this, TQ_SLOT ( newChildItem(
int ) ), 0, 2+4 );
3211 onItem->insertItem( i18n(
"New After" ), afterMenu );
3212 TQPopupMenu *pasteMenu =
new TQPopupMenu(
this );
3213 pasteMenu->insertItem( i18n(
"As Root" ),
3214 this, TQ_SLOT ( pasteItem(
int ) ), 0, 0 );
3215 pasteMenu->insertItem( i18n(
"As Child" ),
3216 this, TQ_SLOT ( pasteItem(
int ) ), 0, 1 );
3217 pasteMenu->insertItem( i18n(
"After" ),
3218 this, TQ_SLOT ( pasteItem(
int ) ), 0, 2 );
3219 onItem->insertItem( i18n(
"Paste" ), pasteMenu, 3 );
3220 onItem->insertItem( i18n(
"Cut Item" ),
this, TQ_SLOT ( cutItem() ) );
3221 onItem->setItemEnabled( 3,
false );
3222 myMyContentsHeight = 0;
3223 _showItemAddPopupMenu =
false;
3225 TQObject *scrollViewTimer = child(
"scrollview scrollbar timer",
"TQTimer",
false );
3226 Q_ASSERT( scrollViewTimer );
3227 if ( scrollViewTimer ) {
3228 disconnect( scrollViewTimer, TQ_SIGNAL(timeout()),
this, TQ_SLOT(updateScrollBars() ) );
3231 connect( &scrollBarTimer, TQ_SIGNAL(timeout()),
this, TQ_SLOT(myUpdateScrollBars() ) );
3233 myScrollTimer =
new TQTimer(
this,
"myScrollTimer" );
3234 connect( myScrollTimer, TQ_SIGNAL( timeout() ), TQ_SLOT( slotScrollTimer() ) );
3235 autoScrollEnabled =
false;
3239KDGanttCanvasView::~KDGanttCanvasView()
3245void KDGanttCanvasView::setShowPopupMenu(
bool show )
3247 _showItemAddPopupMenu = show;
3249bool KDGanttCanvasView::showPopupMenu()
3251 return _showItemAddPopupMenu;
3255void KDGanttCanvasView::moveMyContent(
int,
int y)
3257 setContentsPos(contentsX(), y);
3260void KDGanttCanvasView::resizeEvent ( TQResizeEvent * e )
3262 int ho = e->oldSize().height();
3263 int wo = e->oldSize().width();
3268 verticalScrollBar()->setUpdatesEnabled(
false );
3269 TQScrollView::resizeEvent ( e ) ;
3271 emit heightResized( viewport()->height());
3273 emit widthResized( viewport()->width() );
3276 scrollBarTimer.start(0,
true);
3279void KDGanttCanvasView::myUpdateScrollBars()
3281 setMyContentsHeight( 0 );
3283void KDGanttCanvasView::setMyContentsHeight(
int hei )
3287 myMyContentsHeight = hei;
3288 verticalScrollBar()->setUpdatesEnabled(
true );
3289 if ( viewport()->height() <= myMyContentsHeight )
3290 verticalScrollBar()->setRange( 0, myMyContentsHeight- viewport()->height()+1);
3292 verticalScrollBar()->setRange( 0,0 );
3295 if ( horizontalScrollBar()->value() != mySignalSender->myTimeHeaderScroll->horizontalScrollBar()->value() ) {
3297 mySignalSender->myTimeHeaderScroll->horizontalScrollBar()->setValue(horizontalScrollBar()->value() );
3305void KDGanttCanvasView::updateHorScrollBar() {
3308 horizontalScrollBar()->setRange(mySignalSender->myTimeHeaderScroll->horizontalScrollBar()->minValue(), mySignalSender->myTimeHeaderScroll->horizontalScrollBar()->maxValue());
3314 lastClickedItem = item;
3319 mySignalSender->myListView->insertItem( item );
3320 if ( item == cuttedItem )
3325 parent->insertItem( cuttedItem );
3326 if ( item == cuttedItem )
3331 if ( parent->
parent() ) {
3332 parent->
parent()->insertItem( item );
3335 mySignalSender->myListView->insertItem( item );
3336 item->moveItem( parent );
3337 if ( item == cuttedItem )
3341void KDGanttCanvasView::cutItem()
3343 lastClickedItem->hideSubtree();
3345 if ( lastClickedItem->parent() )
3346 lastClickedItem->parent()->takeItem(lastClickedItem);
3348 mySignalSender->myListView->takeItem( lastClickedItem );
3349 mySignalSender->myTimeTable->updateMyContent();
3352 cuttedItem = lastClickedItem;
3353 onItem->setItemEnabled( 3,
true );
3360 if ( item == 0 && cuttedItem ) {
3364 if (item == cuttedItem) {
3365 onItem->setItemEnabled( 3,
false );
3370void KDGanttCanvasView::pasteItem(
int type )
3376 mySignalSender->myListView->insertItem( cuttedItem );
3379 lastClickedItem->insertItem( cuttedItem );
3382 if ( lastClickedItem->parent() ) {
3383 lastClickedItem->parent()->insertItem( cuttedItem );
3386 mySignalSender->myListView->insertItem( cuttedItem );
3387 cuttedItem->moveItem( lastClickedItem );
3393 onItem->setItemEnabled( 3,
false );
3394 mySignalSender->myTimeTable->updateMyContent();
3396void KDGanttCanvasView::newRootItem(
int type)
3413 mySignalSender->editItem( temp );
3416void KDGanttCanvasView::newChildItem(
int type )
3430 if ( lastClickedItem->parent() )
3431 temp =
new KDGanttViewEventItem( lastClickedItem->parent(), lastClickedItem, i18n(
"New Event" ) );
3436 if ( lastClickedItem->parent() )
3442 if ( lastClickedItem->parent() )
3443 temp =
new KDGanttViewTaskItem( lastClickedItem->parent(), lastClickedItem, i18n(
"New Task" ) );
3453 mySignalSender->editItem( temp );
3456void KDGanttCanvasView::drawToPainter ( TQPainter * p )
3458 drawContents ( p, 0, 0, canvas()->width(), canvas()->height() );
3460TQString KDGanttCanvasView::getToolTipText(TQPoint p)
3462 TQCanvasItemList il = canvas()->collisions ( viewportToContents( p ));
3463 TQCanvasItemList::Iterator it;
3464 for ( it = il.begin(); it != il.end(); ++it ) {
3465 switch (getType(*it)) {
3466 case Type_is_KDGanttViewItem:
3467 return (getItem(*it))->tooltipText();
3469 case Type_is_KDGanttTaskLink:
3470 return (getLink(*it))->tooltipText();
3479TQString KDGanttCanvasView::getWhatsThisText(TQPoint p)
3481 TQCanvasItemList il = canvas() ->collisions (viewportToContents( p ));
3482 TQCanvasItemList::Iterator it;
3483 for ( it = il.begin(); it != il.end(); ++it ) {
3484 switch (getType(*it)) {
3485 case Type_is_KDGanttViewItem:
3486 return (getItem(*it))->whatsThisText();
3488 case Type_is_KDGanttTaskLink:
3489 return (getLink(*it))->whatsThisText();
3506void KDGanttCanvasView::contentsMousePressEvent ( TQMouseEvent * e )
3513 if (e->button() == TQt::RightButton && mySignalSender->editable()) {
3514 lastClickedItem = (
KDGanttViewItem*) mySignalSender->myListView->itemAt( TQPoint(2,e->pos().y()));
3515 if ( lastClickedItem ) {
3516 if ( lastClickedItem->displaySubitemsAsGroup() && ! lastClickedItem->isOpen() ) {
3518 TQCanvasItemList il = canvas() ->collisions ( e->pos() );
3519 TQCanvasItemList::Iterator it;
3520 for ( it = il.begin(); it != il.end(); ++it ) {
3521 if ( getType(*it) == Type_is_KDGanttViewItem ) {
3522 lastClickedItem = getItem(*it);
3526 if ( _showItemAddPopupMenu )
3527 onItem->popup(e->globalPos());
3530 TQCanvasItemList il = canvas() ->collisions ( e->pos() );
3531 TQCanvasItemList::Iterator it;
3532 for ( it = il.begin(); it != il.end(); ++it ) {
3533 switch ( e->button() ) {
3534 case TQt::LeftButton:
3535 switch (getType(*it)) {
3536 case Type_is_KDGanttViewItem:
3537 currentItem = getItem(*it);
3538 if (! currentItem->enabled() ) {
3540 }
else if (linkItemsEnabled &&
3541 !currentItem->isMyTextCanvas(*it)) {
3542 fromArea = getItemArea(currentItem, e->pos().x());
3544 fromItem = currentItem;
3545 linkLine->setPoints(e->pos().x(), e->pos().y(), e->pos().x(), e->pos().y());
3550 case Type_is_KDGanttTaskLink:
3551 currentLink = getLink(*it);
3557 case TQt::RightButton:
3558 switch (getType(*it)) {
3559 case Type_is_KDGanttViewItem:
3560 currentItem = getItem(*it);
3561 if (! currentItem->enabled() )
3564 case Type_is_KDGanttTaskLink:
3565 currentLink = getLink(*it);
3569 case TQt::MidButton:
3570 switch (getType(*it)) {
3571 case Type_is_KDGanttViewItem:
3572 currentItem = getItem(*it);
3573 if (! currentItem->enabled() )
3576 case Type_is_KDGanttTaskLink:
3577 currentLink = getLink(*it);
3585 if (e->button() == TQt::RightButton ) {
3586 mySignalSender->gvContextMenuRequested( currentItem, e->globalPos() );
3588 if (autoScrollEnabled && e->button() == TQt::LeftButton) {
3589 myScrollTimer->start(50);
3599void KDGanttCanvasView::contentsMouseReleaseEvent ( TQMouseEvent * e )
3602 mySignalSender->gvMouseButtonClicked( e->button(), currentItem , e->globalPos() );
3608 switch ( e->button() ) {
3609 case TQt::LeftButton:
3610 myScrollTimer->stop();
3612 mySignalSender->itemLeftClicked( currentItem );
3613 mySignalSender->gvItemLeftClicked( currentItem );
3616 mySignalSender->taskLinkLeftClicked( currentLink );
3617 if (linkItemsEnabled && fromItem) {
3620 TQCanvasItemList il = canvas() ->collisions ( e->pos() );
3621 TQCanvasItemList::Iterator it;
3622 for ( it = il.begin(); it != il.end(); ++it ) {
3623 if (getType(*it) == Type_is_KDGanttViewItem) {
3625 if (!toItem->isMyTextCanvas(*it)) {
3626 int toArea = getItemArea(toItem, e->pos().x());
3627 if (toArea > 0 && toItem && fromItem != toItem) {
3628 mySignalSender->linkItems(fromItem, toItem, getLinkType(fromArea, toArea));
3637 case TQt::RightButton:
3639 mySignalSender->itemRightClicked( currentItem );
3640 mySignalSender->gvItemRightClicked( currentItem );
3644 mySignalSender->taskLinkRightClicked( currentLink );
3646 case TQt::MidButton:
3648 mySignalSender->itemMidClicked( currentItem );
3649 mySignalSender->gvItemMidClicked( currentItem );
3652 mySignalSender->taskLinkRightClicked( currentLink );
3658 if ( lastClicked != currentItem )
3659 mySignalSender->gvCurrentChanged( currentItem );
3660 lastClicked = currentItem;
3671void KDGanttCanvasView::contentsMouseDoubleClickEvent ( TQMouseEvent * e )
3673 TQCanvasItemList il = canvas() ->collisions ( e->pos() );
3674 TQCanvasItemList::Iterator it;
3675 for ( it = il.begin(); it != il.end(); ++it ) {
3676 switch ( e->button() ) {
3677 case TQt::LeftButton:
3678 switch (getType(*it)) {
3679 case Type_is_KDGanttViewItem:
3680 if ( getItem(*it)->enabled() )
3681 mySignalSender->itemDoubleClicked(getItem(*it));
3682 mySignalSender->gvItemDoubleClicked(getItem(*it));
3685 case Type_is_KDGanttTaskLink:
3686 mySignalSender->taskLinkDoubleClicked(getLink(*it));
3731void KDGanttCanvasView::contentsMouseMoveEvent ( TQMouseEvent *e )
3734 static int moves = 0;
3735 if ( (currentLink || currentItem) && (moves < 3) ) {
3743 if (autoScrollEnabled)
3744 mousePos = e->pos()- TQPoint(contentsX(),contentsY());
3747 linkLine->setPoints(linkLine->startPoint().x(), linkLine->startPoint().y(), e->pos().x(), e->pos().y());
3767void KDGanttCanvasView::viewportPaintEvent ( TQPaintEvent * pe )
3769 TQCanvasView::viewportPaintEvent ( pe );
3771void KDGanttCanvasView::set_Mouse_Tracking(
bool on)
3773 viewport()->setMouseTracking(on);
3775int KDGanttCanvasView::getType(TQCanvasItem* it)
3777 switch (it->rtti()) {
3778 case TQCanvasItem::Rtti_Line:
return ((KDCanvasLine*)it)->myParentType;
3779 case TQCanvasItem::Rtti_Ellipse:
return ((KDCanvasEllipse *)it)->myParentType;
3780 case TQCanvasItem::Rtti_Text:
return ((KDCanvasText *)it)->myParentType;
3781 case TQCanvasItem::Rtti_Polygon:
return ((KDCanvasPolygon *)it)->myParentType;
3782 case TQCanvasItem::Rtti_Rectangle:
return ((KDCanvasRectangle *)it)->myParentType;
3788 switch (it->rtti()) {
3789 case TQCanvasItem::Rtti_Line:
return (
KDGanttViewItem*) ((KDCanvasLine*)it)->myParentItem;
3790 case TQCanvasItem::Rtti_Ellipse:
return (
KDGanttViewItem*) ((KDCanvasEllipse *)it)->myParentItem;
3791 case TQCanvasItem::Rtti_Text:
return (
KDGanttViewItem*) ((KDCanvasText *)it)->myParentItem;
3792 case TQCanvasItem::Rtti_Polygon:
return (
KDGanttViewItem*) ((KDCanvasPolygon *)it)->myParentItem;
3793 case TQCanvasItem::Rtti_Rectangle:
return (
KDGanttViewItem*) ((KDCanvasRectangle *)it)->myParentItem;
3800 switch (it->rtti()) {
3801 case TQCanvasItem::Rtti_Line:
return (
KDGanttViewTaskLink*) ((KDCanvasLine*)it)->myParentItem;
3802 case TQCanvasItem::Rtti_Ellipse:
return (
KDGanttViewTaskLink*) ((KDCanvasEllipse *)it)->myParentItem;
3803 case TQCanvasItem::Rtti_Text:
return (
KDGanttViewTaskLink*) ((KDCanvasText *)it)->myParentItem;
3804 case TQCanvasItem::Rtti_Polygon:
return (
KDGanttViewTaskLink*) ((KDCanvasPolygon *)it)->myParentItem;
3809void KDGanttCanvasView::slotScrollTimer() {
3810 int mx = mousePos.x();
3811 int my = mousePos.y();
3816 else if (mx > visibleWidth())
3820 else if (my > visibleHeight())
3821 dy = TQMIN(5, verticalScrollBar()->maxValue()-verticalScrollBar()->value());
3823 if (dx != 0 || dy != 0)
3830 KDTimeTableWidget *tt =
dynamic_cast<KDTimeTableWidget *
>(canvas());
3832 tqWarning(
"Cannot cast canvas to KDTimeTableWidget");
3836 int start = tt->getCoordX(item->
startTime());
3838 if (item->
type() == KDGanttViewItem::Event) {
3839 x > start ? area = 2 : area = 1;
3841 end = tt->getCoordX(item->
endTime());
3842 if ((end - start)/2 > (x - start))
3850int KDGanttCanvasView::getLinkType(
int from,
int to) {
3852 if ((from == 1) && (to == 1)) {
3853 return KDGanttViewTaskLink::StartStart;
3855 if ((from == 1) && (to == 2)) {
3856 return KDGanttViewTaskLink::StartFinish;
3858 if ((from == 2) && (to == 1)) {
3859 return KDGanttViewTaskLink::FinishStart;
3861 if ((from == 2) && (to == 2)) {
3862 return KDGanttViewTaskLink::FinishFinish;
3864 return KDGanttViewTaskLink::None;
The KDGanttMinimizeSplitter class implements a splitter widget with minimize buttons.
static bool decode(const TQMimeSource *e, TQString &)
static bool canDecode(const TQMimeSource *e)
KDGanttViewItem * itemBelow(bool includeDisabled=true)
TQString whatsThisText() const
KDGanttViewItem * nextSibling() const
KDGanttViewItem * parent() const
TQDateTime endTime() const
static KDGanttViewItem * createFromDomElement(KDGanttView *view, TQDomElement &element)
void setDisplaySubitemsAsGroup(bool show)
KDGanttViewItem * firstChild() const
bool isVisibleInGanttView
TQDateTime startTime() const
static TQPixmap getPixmap(KDGanttViewItem::Shape shape, const TQColor &shapeColor, const TQColor &backgroundColor, int itemSize)