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 }