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