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) 00581 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.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:18:34 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003