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