kgantt Library API Documentation

xQGanttBarViewPort_Events.cpp

00001 //
00002 //  file    : xQGanttBarViewPort_Events.C
00003 //  date    : 11 nov 2000
00004 //  changed : 27 dec 2000
00005 //  author  : jh
00006 //
00007 
00008 
00009 #include "xQGanttBarViewPort.h"
00010 #include "xQGanttBarView.h"
00011 
00012 #include <math.h>
00013 
00014 KGanttItem* xQGanttBarViewPort::_currentItem;
00015 
00016 
00017 static int _currentMButton;
00018 static bool _Mousemoved;
00019 static bool _selectItem;
00020 
00021 static int _timediff;
00022 
00023 static bool _changeEnd, _changeStart;
00024 static int oldw = -1, oldx = -1;
00025 
00026 QDateTime _tmpStartDateTime, _tmpEndDateTime;
00027 
00028 
00029 void 
00030 xQGanttBarViewPort::mousePressEvent(QMouseEvent* e)
00031 {
00032   //  set _currentItem to pushed mousebutton
00033   _currentMButton = e->button();
00034   _Mousemoved = false;
00035 
00036   _startPoint->setX( e->x() );
00037   _startPoint->setY( e->y() );
00038 
00039   _endPoint->setX( e->x() );
00040   _endPoint->setY( e->y() );
00041 
00042   _itemInfo->hide();
00043   _itemTextEdit->hide();
00044 
00045   //  right mousebutton & control -> popup menu
00046   if(e->button() == RightButton && e->state() == ControlButton ) {
00047     _menu->popup(e->globalPos());
00048     return;
00049   }
00050 
00051 
00052   /*
00053    *  get clicked item and position
00054    */
00055   _currentItem = NULL;
00056   Position pos = check(&_currentItem, e->x(), e->y());
00057 
00058   if(!_currentItem) {
00059     unselectAll();
00060     return;
00061   }
00062   
00063 
00064   /*
00065    *  edit text
00066    */
00067   if(e->button() == MidButton && _mode == Select) {
00068 
00069     xQTaskPosition* tp = _gItemList.find(_currentItem);
00070     QPainter p(this);
00071 
00072     QRect rect = p.boundingRect(tp->_textPosX, 
00073                 tp->_textPosY, 200, 
00074                 tp->_screenH, AlignLeft, _currentItem->getText() );
00075 
00076     _itemTextEdit->setText(_currentItem->getText());
00077     _itemTextEdit->move(tp->_textPosX, tp->_screenY + _margin + 1);
00078     _itemTextEdit->setFixedWidth(rect.width()+40);
00079     _itemTextEdit->setFixedHeight(tp->_screenH - 2 * _margin - 2);
00080     _itemTextEdit->setFocus();
00081     
00082     // if item is not editable, _itemTextEdit should be not editable
00083     // as well
00084     _itemTextEdit->setReadOnly(!_currentItem->isEditable());
00085 
00086     _itemTextEdit->show();
00087 
00088   }
00089 
00090 
00091   /*
00092    *  open/close item, move start, end, item
00093    */
00094   if(e->button() == LeftButton && _mode == Select) {
00095 
00096     _timediff = 0;
00097 
00098     switch(pos) {
00099 
00100     case Handle:
00101 
00102       _currentItem->open( !_currentItem->isOpen() );
00103       break;
00104       
00105     case Center:
00106       
00107       _changeEnd   = true;
00108       _changeStart = true;
00109       
00110       if(e->state() == ShiftButton) {
00111 
00112     QString tmp; tmp.sprintf("%s\n", _currentItem->getText().latin1() );
00113     
00114     tmp += _currentItem->getStart().toString();
00115     tmp += " - ";
00116     tmp += _currentItem->getEnd().toString();
00117     
00118     _itemInfo->setText( tmp );
00119     _itemInfo->adjustSize();
00120     
00121     _itemInfo->move(e->x() + 25, _gItemList.find(_currentItem)->_screenY - 50 );
00122     _itemInfo->show();
00123       }
00124       else
00125     _selectItem = true;
00126       
00127       break;
00128 
00129     
00130     case East:
00131 
00132       _changeEnd = true;
00133       _changeStart = false;
00134       break;
00135 
00136     
00137     case West:
00138 
00139       _changeStart = true;
00140       _changeEnd = false;
00141       break;
00142 
00143     default :
00144       break;
00145 
00146     }
00147 
00148   
00149     
00150   } // if(e->button() == LeftButton && _mode == Select)
00151   
00152 }
00153 
00154 
00155 
00156 void
00157 xQGanttBarViewPort::mouseReleaseEvent(QMouseEvent* e)
00158 {
00159   switch(_mode) {
00160 
00161   case Select: {
00162 
00163     if(_Mousemoved == true) {
00164       
00165       _itemInfo->hide();
00166 
00167       if(_changeStart == true || _changeEnd == true) {
00168       
00169     if(_changeStart == true) {
00170       _currentItem->setStart( _tmpStartDateTime );
00171     }
00172     if(_changeEnd == true) {
00173       _currentItem->setEnd( _tmpEndDateTime );
00174     }
00175     
00176     oldx = -1; oldw = -1;
00177     
00178     recalc();
00179     QWidget::update();
00180     
00181       }
00182     }
00183     else {
00184       if(_currentItem && _selectItem) {
00185 
00186 
00187     if(e->state() & ControlButton) {
00188       _currentItem->select( !_currentItem->isSelected() );
00189     }
00190     else {
00191       bool state = _currentItem->isSelected();
00192       unselectAll();
00193       _currentItem->select( !state );
00194     }
00195 
00196     QWidget::update();
00197     _selectItem = false;
00198 
00199       }
00200     }
00201 
00202     _changeEnd   = false;
00203     _changeStart = false;
00204 
00205   }
00206   break;
00207   
00208 
00209   case Zoom:
00210     
00211     if(!_Mousemoved) {
00212       
00213       if(e->button() ==  LeftButton)
00214     zoom(1.4, e->x(), e->y() );
00215       
00216       
00217       if(e->button() ==  RightButton)
00218     zoom(0.7, e->x(), e->y() );
00219       
00220 
00221       if(e->button() ==  MidButton)
00222     zoomAll();
00223 
00224     }
00225     else {
00226 
00227       if(_currentMButton ==  LeftButton) {
00228 
00229     QPainter p(this);
00230     QPen pen(DashLine);
00231     pen.setColor(red);
00232     p.setRasterOp(XorROP);      
00233     p.setPen( pen );
00234 
00235     p.drawRect(_startPoint->x(),
00236            _startPoint->y(), 
00237            _endPoint->x()-_startPoint->x(),
00238            _endPoint->y() - _startPoint->y());
00239 
00240     double x1 = _startPoint->x();
00241     double y1 = _startPoint->y();
00242 
00243     double x2 = _endPoint->x();
00244     double y2 = _endPoint->y();
00245 
00246     double sys_width  = fabs(x2 - x1);
00247 
00248     double mass = (_parent->visibleWidth()/ sys_width);
00249 
00250     zoom(mass, (int) (x1+(x2-x1)/2), (int) (y1+(y2-y1)/2) );
00251 
00252 
00253       }
00254     }
00255 
00256     break;
00257 
00258 
00259   default:
00260     break;
00261 
00262   }
00263 
00264   _Mousemoved = false;
00265   _currentMButton = 0;
00266 
00267 }
00268 
00269 
00270 
00271 void
00272 xQGanttBarViewPort::mouseMoveEvent(QMouseEvent* e)
00273 {
00274   if(fabs((float)(_startPoint->x() - e->x())) < 2 &&
00275      fabs((float)(_startPoint->y() - e->y())) < 2 )
00276     return;
00277 
00278   static QPen _dashPen(QColor(255,0,0),DashLine);
00279   static QPen _solidPen(QColor(200,200,200));
00280 
00281   _Mousemoved = true;
00282 
00283   switch(_mode) {
00284     
00285   case Select: {
00286     
00287     if(_currentMButton == LeftButton && _currentItem) {
00288 
00289       QPainter p(this);
00290       p.setRasterOp(XorROP);
00291       // QPen pen(DashLine);
00292       // pen.setColor(red);
00293       p.setPen( _dashPen );
00294 
00295       QString stmp;
00296       stmp.sprintf("%s\n", _currentItem->getText().latin1() );
00297 
00298       int pixeldiff = e->x() - _startPoint->x();
00299       _timediff = (int) ((double) pixeldiff / _scaleX + 0.5 );
00300       
00301       xQTaskPosition* tpos = _gItemList[_currentItem];
00302 
00303       int x = tpos->_screenX; int w = tpos->_screenW;
00304       
00305       if(_changeStart && _changeEnd) {
00306     double tmp = (double) _timediff/(double) _snapgrid;
00307     _timediff = ((int) (tmp + sgn(tmp) * 0.5)) * _snapgrid;
00308     stmp += _currentItem->getStart().addSecs(_timediff*60).toString();
00309     stmp += " - ";
00310     stmp += _currentItem->getEnd().addSecs(_timediff*60).toString();    
00311     x += (int) (_timediff * _scaleX);
00312 
00313     _tmpStartDateTime = _currentItem->getStart().addSecs(_timediff*60);
00314     _tmpEndDateTime = _currentItem->getEnd().addSecs(_timediff*60);
00315 
00316       }
00317       else {
00318 
00319     if(_changeStart) {
00320 
00321       QDateTime movedStart( _currentItem->getStart().addSecs(_timediff*60) );
00322 
00323       _tmpStartDateTime.setDate( movedStart.date() );
00324       _tmpStartDateTime.setTime(QTime(0,0,0,0));
00325 
00326       double diff = _tmpStartDateTime.secsTo(movedStart)/60;
00327 
00328       double tmp = diff/(double) _snapgrid;
00329       _timediff = ((int) (tmp + sgn(tmp) * 0.5)) * _snapgrid;
00330       
00331       _tmpStartDateTime = _tmpStartDateTime.addSecs(_timediff*60);
00332       _timediff = _currentItem->getStart().secsTo(_tmpStartDateTime)/60;
00333 
00334       stmp += _tmpStartDateTime.toString().latin1();
00335       stmp += " - ";
00336       stmp += _currentItem->getEnd().toString();
00337 
00338       x += (int) (_timediff * _scaleX);
00339       w -= (int) (_timediff * _scaleX);
00340     }
00341     
00342     if(_changeEnd) {
00343 
00344       QDateTime movedEnd( _currentItem->getEnd().addSecs(_timediff*60) );
00345 
00346       _tmpEndDateTime.setDate( movedEnd.date() );
00347       _tmpEndDateTime.setTime(QTime(0,0,0,0));
00348 
00349       double diff = _tmpEndDateTime.secsTo(movedEnd)/60;
00350 
00351       double tmp = diff/(double) _snapgrid;
00352       _timediff = ((int) (tmp + sgn(tmp) * 0.5)) * _snapgrid;
00353 
00354       _tmpEndDateTime = _tmpEndDateTime.addSecs(_timediff*60);
00355       _timediff = _currentItem->getEnd().secsTo(_tmpEndDateTime)/60;
00356 
00357       stmp += _currentItem->getStart().toString();
00358       stmp += " - ";
00359       stmp += _tmpEndDateTime.toString().latin1();
00360 
00361       w += (int) (_timediff * _scaleX);
00362 
00363     }
00364 
00365       }
00366 
00367       _itemInfo->setText( stmp );
00368       _itemInfo->adjustSize();
00369       _itemInfo->move(e->x() + 25, _gItemList.find(_currentItem)->_screenY - 50);
00370       _itemInfo->show();
00371 
00372       if(oldx > 0) {
00373     p.fillRect(oldx, _gItemList.find(_currentItem)->_screenY, 
00374            oldw, _gItemList.find(_currentItem)->_screenH,
00375            QBrush(QColor(50,50,50), Dense4Pattern));
00376     p.drawRect(oldx, _gItemList.find(_currentItem)->_screenY, 
00377            oldw, _gItemList.find(_currentItem)->_screenH);
00378 
00379     p.setPen(_solidPen);
00380     if(_changeStart)
00381       p.drawLine(oldx, 0, oldx, height());
00382     if(oldw > 2)
00383       if(_changeEnd)
00384         p.drawLine(oldx + oldw, 0, oldx + oldw, height());
00385 
00386       }
00387 
00388       p.setPen(_dashPen);
00389       p.fillRect(x, _gItemList.find(_currentItem)->_screenY, 
00390          w, _gItemList.find(_currentItem)->_screenH,
00391          QBrush(QColor(50,50,50), Dense4Pattern) );
00392       p.drawRect(x, _gItemList.find(_currentItem)->_screenY, 
00393          w, _gItemList.find(_currentItem)->_screenH);
00394 
00395       p.setPen(_solidPen);
00396       if(_changeStart)
00397     p.drawLine(x, 0, x, height());
00398 
00399       if(w>2)
00400       if(_changeEnd)
00401     p.drawLine(x + w, 0, x + w, height());
00402 
00403       oldx = x; oldw = w;
00404 
00405     }
00406     else {
00407       
00408       static Position _pos = Outside;
00409       
00410       KGanttItem* item = NULL;
00411       
00412       Position pos = check(&item, e->x(), e->y());
00413       
00414       if(_pos != pos) {
00415     
00416     _pos = pos;
00417     
00418     if(pos == West || pos == East) {
00419       setCursor( splitHCursor );
00420       break;
00421     }
00422     if(pos == North || pos == South) {
00423       setCursor( splitVCursor );
00424       break;
00425     }
00426     if(pos == Center) {
00427       setCursor( upArrowCursor);
00428       break;
00429     }
00430     if(pos == Handle) {
00431       setCursor(pointingHandCursor);
00432       break;
00433     }
00434     
00435     setCursor(arrowCursor);
00436     
00437       }
00438     }
00439   }
00440   break;
00441 
00442 
00443   case Zoom: {
00444 
00445     if(_currentMButton == LeftButton) {
00446 
00447       static QString strpos;
00448 
00449       strpos = "";
00450 
00451       int s = worldX(_startPoint->x());
00452       QDateTime d1 = _toplevelitem->getStart().addSecs(s*60);
00453 
00454       s = worldX(e->x());
00455       QDateTime d2 = _toplevelitem->getStart().addSecs(s*60);
00456 
00457       strpos += d1.date().toString();
00458       strpos += " - ";
00459       strpos += d2.date().toString();
00460 
00461       emit message(strpos);
00462 
00463       QPainter p(this);
00464       QPen pen(DashLine);
00465       pen.setColor(red);
00466 
00467       p.setRasterOp(XorROP);
00468 
00469       p.setPen( pen );
00470             
00471       p.drawRect(_startPoint->x(),
00472          _startPoint->y(),
00473          _endPoint->x()-_startPoint->x(),
00474          _endPoint->y() - _startPoint->y());    
00475 
00476       QBrush _selectedbrush( QColor(50,50,50), Dense4Pattern );
00477 
00478       p.fillRect( _startPoint->x(), _startPoint->y(), 
00479           _endPoint->x()-_startPoint->x(), _endPoint->y() - _startPoint->y(),
00480           _selectedbrush );
00481 
00482       _endPoint->setX( e->x() );
00483       _endPoint->setY( e->y() );
00484 
00485 
00486       p.drawRect(_startPoint->x(), _startPoint->y(), 
00487          _endPoint->x()-_startPoint->x(), _endPoint->y() - _startPoint->y());
00488 
00489       p.fillRect( _startPoint->x(), _startPoint->y(),
00490           _endPoint->x()-_startPoint->x(), _endPoint->y() - _startPoint->y(),
00491           _selectedbrush );
00492     }
00493 
00494   }
00495 
00496   break;
00497 
00498   case Move: {
00499     emit scroll(_startPoint->x() - e->x(), _startPoint->y() - e->y() );
00500   }
00501   break;
00502 
00503 
00504   default :
00505     break;
00506 
00507   }
00508 }
00509 
00510 
00511 void 
00512 xQGanttBarViewPort::keyPressEvent(QKeyEvent* e)
00513 {
00514 
00515   printf("xQGanttBarViewPort::keyPressEvent() key = %d \n", e->key() );
00516 
00517   int dx = 15;
00518   
00519   if(e->state() == ControlButton)
00520     dx *= 10;
00521   
00522   switch(e->key()) {
00523     
00524   case Key_Left:
00525     
00526     emit scroll(-dx,0);
00527     break;
00528     
00529   case Key_Right:
00530     
00531     emit scroll(dx,0);
00532     break;
00533     
00534   case Key_Up:
00535     
00536     emit scroll(0,-dx);
00537     break;
00538     
00539   case Key_Down:
00540     
00541     emit scroll(0, dx);
00542     break;
00543 
00544   case 43:  // +
00545 
00546     zoom(1.4);
00547     break;
00548 
00549   case 45: // -
00550 
00551     zoom(0.7);
00552     break;
00553 
00554   case 4103:  // del
00555 
00556     deleteSelectedItems();
00557     break;
00558 
00559   case 4102:  // einfg
00560 
00561     insertIntoSelectedItem();
00562     break;
00563 
00564   case 4119:  // bild v
00565 
00566     emit scroll(0, dx*15);
00567     break;
00568 
00569   case 4118:  // bild ^
00570 
00571     emit scroll(0,-dx*15);
00572     break;
00573 
00574   }
00575   
00576 } 
00577 
00578 
00579 void 
00580 xQGanttBarViewPort::paintEvent(QPaintEvent * e) 
00582 {
00583   update(e->rect().left(), e->rect().top(),
00584      e->rect().right(), e->rect().bottom() );
00585 }
KDE Logo
This file is part of the documentation for kgantt Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:42 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003