00001
00002
00003
00004
00005
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
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
00046 if(e->button() == RightButton && e->state() == ControlButton ) {
00047 _menu->popup(e->globalPos());
00048 return;
00049 }
00050
00051
00052
00053
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
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
00083
00084 _itemTextEdit->setReadOnly(!_currentItem->isEditable());
00085
00086 _itemTextEdit->show();
00087
00088 }
00089
00090
00091
00092
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 }
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
00292
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:
00555
00556 deleteSelectedItems();
00557 break;
00558
00559 case 4102:
00560
00561 insertIntoSelectedItem();
00562 break;
00563
00564 case 4119:
00565
00566 emit scroll(0, dx*15);
00567 break;
00568
00569 case 4118:
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 }