00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #include <fx.h>
00031 #include <fxkeys.h>
00032 #include "MFXEditableTable.h"
00033
00034 #ifdef CHECK_MEMORY_LEAKS
00035 #include <foreign/nvwa/debug_new.h>
00036 #endif // CHECK_MEMORY_LEAKS
00037
00038 FXDEFMAP(MFXEditableTable) MFXEditableTableMap[]= {
00039 FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,MFXEditableTable::onLeftBtnPress),
00040 FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,MFXEditableTable::onLeftBtnRelease),
00041 FXMAPFUNC(SEL_CLICKED,0,MFXEditableTable::onLeftBtnClicked),
00042 FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,MFXEditableTable::onRightBtnRelease),
00043 FXMAPFUNC(SEL_KEYRELEASE,0,MFXEditableTable::onKeyRelease),
00044 FXMAPFUNC(SEL_KEYPRESS,MFXEditableTable::ID_EDITOR, MFXEditableTable::onEditKeyPress),
00045
00046 FXMAPFUNC(SEL_FOCUSOUT,MFXEditableTable::ID_EDITOR, MFXEditableTable::onEditFocusOut),
00047 FXMAPFUNC(SEL_COMMAND,MFXEditableTable::ID_EDITEND, MFXEditableTable::onEditEnd),
00048
00049 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_HSCROLLED,MFXEditableTable::onHScrollerChanged),
00050 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_VSCROLLED,MFXEditableTable::onVScrollerChanged),
00051 FXMAPFUNC(SEL_CHANGED,FXWindow::ID_HSCROLLED,MFXEditableTable::onHScrollerDragged),
00052 FXMAPFUNC(SEL_CHANGED,FXWindow::ID_VSCROLLED,MFXEditableTable::onVScrollerDragged),
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 FXMAPFUNC(SEL_UPDATE,FXTable::ID_HORZ_GRID,MFXEditableTable::onUpdHorzGrid),
00075 FXMAPFUNC(SEL_UPDATE,FXTable::ID_VERT_GRID,MFXEditableTable::onUpdVertGrid),
00076 FXMAPFUNC(SEL_COMMAND,FXTable::ID_HORZ_GRID,MFXEditableTable::onCmdHorzGrid),
00077 FXMAPFUNC(SEL_COMMAND,FXTable::ID_VERT_GRID,MFXEditableTable::onCmdVertGrid),
00078 FXMAPFUNC(SEL_COMMAND,FXTable::ID_DELETE_COLUMN,MFXEditableTable::onCmdDeleteColumn),
00079 FXMAPFUNC(SEL_UPDATE,FXTable::ID_DELETE_COLUMN,MFXEditableTable::onUpdDeleteColumn),
00080 FXMAPFUNC(SEL_COMMAND,FXTable::ID_DELETE_ROW,MFXEditableTable::onCmdDeleteRow),
00081 FXMAPFUNC(SEL_UPDATE,FXTable::ID_DELETE_ROW,MFXEditableTable::onUpdDeleteRow),
00082 FXMAPFUNC(SEL_COMMAND,FXTable::ID_INSERT_COLUMN,MFXEditableTable::onCmdInsertColumn),
00083 FXMAPFUNC(SEL_COMMAND,FXTable::ID_INSERT_ROW,MFXEditableTable::onCmdInsertRow),
00084
00085 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_LEFT,MFXEditableTable::onCmdMoveLeft),
00086 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_RIGHT,MFXEditableTable::onCmdMoveRight),
00087 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_UP,MFXEditableTable::onCmdMoveUp),
00088 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_DOWN,MFXEditableTable::onCmdMoveDown),
00089 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_HOME,MFXEditableTable::onCmdMoveHome),
00090 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_END,MFXEditableTable::onCmdMoveEnd),
00091 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_TOP,MFXEditableTable::onCmdMoveTop),
00092 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_BOTTOM,MFXEditableTable::onCmdMoveBottom),
00093 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_PAGEDOWN,MFXEditableTable::onCmdMovePageDown),
00094 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_PAGEUP,MFXEditableTable::onCmdMovePageUp),
00095
00096 FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ROW_INDEX,MFXEditableTable::onCmdSelectRowIndex),
00097 FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_COLUMN_INDEX,MFXEditableTable::onCmdSelectColumnIndex),
00098 FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_COLUMN,MFXEditableTable::onCmdSelectColumn),
00099 FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ROW,MFXEditableTable::onCmdSelectRow),
00100
00101 FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ALL,MFXEditableTable::onCmdSelectAll),
00102 FXMAPFUNC(SEL_COMMAND,FXTable::ID_DESELECT_ALL,MFXEditableTable::onCmdDeselectAll),
00103 FXMAPFUNC(SEL_COMMAND,FXTable::ID_MARK,MFXEditableTable::onCmdMark),
00104 FXMAPFUNC(SEL_COMMAND,FXTable::ID_EXTEND,MFXEditableTable::onCmdExtend),
00105 };
00106
00107
00108
00109 FXIMPLEMENT(MFXEditableTable,FXTable,MFXEditableTableMap,ARRAYNUMBER(MFXEditableTableMap))
00110
00111
00112 MFXEditableTable::MFXEditableTable(FXComposite *p, FXObject* tgt,
00113 FXSelector sel, FXuint opts,
00114 FXint x, FXint y, FXint w, FXint h,
00115 FXint pl,FXint pr,FXint pt,FXint pb)
00116 : FXTable(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb),
00117 myEditedItem(0) {
00118 myEditor=
00119 new FXTextField((FXComposite*)getParent(),1,this,
00120 ID_EDITOR,FRAME_NORMAL|LAYOUT_EXPLICIT);
00121 myEditor->hide();
00122 flags |= FLAG_ENABLED|FLAG_DROPTARGET;
00123 }
00124
00125
00126 MFXEditableTable::~MFXEditableTable() {}
00127
00128
00129 long
00130 MFXEditableTable::onLeftBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
00131 editEnd();
00132 FXTable::onLeftBtnPress(sender, sel, ptr);
00133 return 1;
00134 }
00135
00136
00137 long
00138 MFXEditableTable::onLeftBtnClicked(FXObject* , FXSelector , void* ptr) {
00139 FXTablePos* e= (FXTablePos*)ptr;
00140 int r = e->row;
00141 int c = e->col;
00142 if (c==-1||r==-1) {
00143 return 1;
00144 }
00145 killSelection(false);
00146 myEditedItem = getItem(r, c);
00147 myEditedCol = c;
00148 myEditedRow = r;
00149 if (c>=0&&r>=0) {
00150 editItem(myEditedItem, 0);
00151 } else {
00152 editEnd();
00153 }
00154 return 1;
00155 }
00156
00157
00158 long
00159 MFXEditableTable::onLeftBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
00160 FXTable::onLeftBtnRelease(sender, sel, ptr);
00161
00162
00163
00164
00165
00166 return 1;
00167 }
00168
00169
00170 void
00171 MFXEditableTable::editItem(FXTableItem* item,FXint how) {
00172 if (item==0) {
00173 editEnd();
00174 return;
00175 }
00176 if (myWriteProtectedCols.find(myEditedCol)!=myWriteProtectedCols.end()) {
00177 editEnd();
00178 return;
00179 }
00180 FXTableItem* it= item;
00181 myPreviousText = item->getText();
00182 FXint x = getColumnX(myEditedCol) + getRowHeader()->getWidth() + xpos;
00183 FXint y = getRowY(myEditedRow) + getColumnHeader()->getHeight() + ypos;
00184 FXIcon* icon = item->getIcon();
00185 if (icon) x += icon->getWidth() + 4;
00186 FXint vw = getViewportWidth();
00187 if (vertical->shown()) vw -= vertical->getWidth();
00188 if (vw>getColumnWidth(myEditedCol)) {
00189 vw = getColumnWidth(myEditedCol) + x;
00190 }
00191 myEditor->setText(it->getText());
00192 myEditor->move(x, y);
00193 myEditor->resize(vw - x + 1, getRowHeight(myEditedRow) + 1);
00194 myEditor->show();
00195 myEditor->raise();
00196 myEditor->setFocus();
00197 if (how == 'I') {
00198 myEditor->killSelection();
00199 myEditor->setCursorPos(0);
00200 } else if (how == 'A') {
00201 myEditor->killSelection();
00202 myEditor->setCursorPos(myEditor->getText().length());
00203 } else myEditor->selectAll();
00204 myEditedItem = it;
00205 }
00206
00207
00208 void
00209 MFXEditableTable::editEnd() {
00210 if (!myEditedItem) return;
00211 FXTableItem* item= myEditedItem;
00212 myEditedItem = NULL;
00213 myEditor->hide();
00214 setFocus();
00215 FXString text = myEditor->getText();
00216 myEditedItem = 0;
00217 if (item->getText() == text) return;
00218 if (handle(item, FXSEL(SEL_COMMAND,ID_EDITEND), &text)) {
00219 item->setText(text);
00220 handle(this, FXSEL(SEL_CHANGED,0), item);
00221 }
00222 killSelection(true);
00223 if (target) {
00224 MFXEditedTableItem edited;
00225 edited.item = item;
00226 edited.row = myEditedRow;
00227 edited.col = myEditedCol;
00228 if (!target->handle(this,FXSEL(SEL_CHANGED, ID_TEXT_CHANGED), (void*) &edited)) {
00229 item->setText(myPreviousText);
00230 }
00231 }
00232 }
00233
00234
00235 long
00236 MFXEditableTable::onEditEnd(FXObject *,FXSelector ,void *) {
00237 delete myEditedItem;
00238 myEditedItem = 0;
00239 return 1;
00240 }
00241
00242
00243 void
00244 MFXEditableTable::editCancel() {
00245 if (!myEditedItem) return;
00246 myEditedItem = 0;
00247 myEditor->hide();
00248 setFocus();
00249 killSelection(true);
00250 }
00251
00252
00253 long
00254 MFXEditableTable::onEditKeyPress(FXObject*,FXSelector,void* ptr) {
00255 FXEvent* e= (FXEvent*)ptr;
00256 switch (e->code) {
00257 case KEY_Escape:
00258 editCancel();
00259 return 1;
00260 case KEY_Return:
00261 case KEY_KP_Enter:
00262 editEnd();
00263
00264
00265 return 1;
00266 case KEY_Up:
00267 case KEY_Down:
00268
00269
00270 return 1;
00271 }
00272 return 0;
00273 }
00274
00275
00276 long
00277 MFXEditableTable::onKeyRelease(FXObject* sender, FXSelector sel, void* ptr) {
00278 FXint key= ((FXEvent*)ptr)->code;
00279 if ( key == KEY_Return || key == KEY_KP_Enter) {
00280
00281 return 1;
00282 }
00283
00284 return FXTable::onKeyRelease(sender, sel, ptr);
00285 }
00286
00287
00288 long
00289 MFXEditableTable::onEditFocusOut(FXObject *,FXSelector ,void *) {
00290 editEnd();
00291 return 0;
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 long
00304 MFXEditableTable::onRightBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
00305
00306
00307
00308
00309
00310
00311 return FXTable::onRightBtnRelease(sender, sel, ptr);
00312 }
00313
00314
00315
00316 long
00317 MFXEditableTable::onHScrollerChanged(FXObject *o,FXSelector s,void *d) {
00318 editEnd();
00319 return FXScrollArea::onHScrollerChanged(o, s, d);
00320 }
00321
00322
00323 long
00324 MFXEditableTable::onVScrollerChanged(FXObject *o,FXSelector s,void *d) {
00325 editEnd();
00326 return FXScrollArea::onVScrollerChanged(o, s, d);
00327 }
00328
00329
00330 long
00331 MFXEditableTable::onHScrollerDragged(FXObject *o,FXSelector s,void *d) {
00332 editEnd();
00333 return FXScrollArea::onHScrollerDragged(o, s, d);
00334 }
00335
00336
00337 long
00338 MFXEditableTable::onVScrollerDragged(FXObject *o,FXSelector s,void *d) {
00339 editEnd();
00340 return FXScrollArea::onVScrollerDragged(o, s, d);
00341 }
00342
00343
00344 long
00345 MFXEditableTable::onAutoScroll(FXObject *o,FXSelector s,void *d) {
00346 editEnd();
00347 return FXTable::onAutoScroll(o, s, d);
00348 }
00349
00350
00351 long
00352 MFXEditableTable::onUngrabbed(FXObject *o,FXSelector s,void *d) {
00353 editEnd();
00354 return FXTable::onUngrabbed(o, s, d);
00355 }
00356
00357
00358 long
00359 MFXEditableTable::onRightBtnPress(FXObject *o,FXSelector s,void *d) {
00360 editEnd();
00361 return FXTable::onRightBtnPress(o, s, d);
00362 }
00363
00364
00365 long
00366 MFXEditableTable::onTabKeyPress(FXObject *o,FXSelector s,void *d) {
00367 editEnd();
00368 return FXTable::onKeyPress(o, s, d);
00369 }
00370
00371
00372 long
00373 MFXEditableTable::onTabKeyRelease(FXObject *o,FXSelector s,void *d) {
00374 editEnd();
00375 return FXTable::onKeyRelease(o, s, d);
00376 }
00377
00378
00379 long
00380 MFXEditableTable::onFocusIn(FXObject *o,FXSelector s,void *d) {
00381
00382 return FXTable::onFocusIn(o, s, d);
00383 }
00384
00385
00386 long
00387 MFXEditableTable::onFocusOut(FXObject *o,FXSelector s,void *d) {
00388
00389 return FXTable::onFocusOut(o, s, d);
00390 }
00391
00392
00393 long
00394 MFXEditableTable::onSelectionLost(FXObject *o,FXSelector s,void *d) {
00395
00396 return FXTable::onSelectionLost(o, s, d);
00397 }
00398
00399
00400 long
00401 MFXEditableTable::onSelectionGained(FXObject *o,FXSelector s,void *d) {
00402
00403 return FXTable::onSelectionGained(o, s, d);
00404 }
00405
00406
00407 long
00408 MFXEditableTable::onSelectionRequest(FXObject *o,FXSelector s,void *d) {
00409
00410 return FXTable::onSelectionRequest(o, s, d);
00411 }
00412
00413
00414 long
00415 MFXEditableTable::onClipboardLost(FXObject *o,FXSelector s,void *d) {
00416 editEnd();
00417 return FXTable::onClipboardLost(o, s, d);
00418 }
00419
00420
00421 long
00422 MFXEditableTable::onClipboardGained(FXObject *o,FXSelector s,void *d) {
00423 editEnd();
00424 return FXTable::onClipboardGained(o, s, d);
00425 }
00426
00427
00428 long
00429 MFXEditableTable::onClipboardRequest(FXObject *o,FXSelector s,void *d) {
00430 editEnd();
00431 return FXTable::onClipboardRequest(o, s, d);
00432 }
00433
00434
00435 long
00436 MFXEditableTable::onDoubleClicked(FXObject *,FXSelector ,void *) {
00437 editEnd();
00438 return 1;
00439
00440 }
00441
00442
00443 long
00444 MFXEditableTable::onTripleClicked(FXObject *,FXSelector ,void *) {
00445 editEnd();
00446 return 1;
00447
00448 }
00449
00450
00451 long
00452 MFXEditableTable::onCommand(FXObject *o,FXSelector s,void *d) {
00453 editEnd();
00454 return FXTable::onCommand(o, s, d);
00455 }
00456
00457
00458 long
00459 MFXEditableTable::onUpdHorzGrid(FXObject *o,FXSelector s,void *d) {
00460 editEnd();
00461 return FXTable::onUpdHorzGrid(o, s, d);
00462 }
00463
00464
00465 long
00466 MFXEditableTable::onUpdVertGrid(FXObject *o,FXSelector s,void *d) {
00467 editEnd();
00468 return FXTable::onUpdVertGrid(o, s, d);
00469 }
00470
00471
00472 long
00473 MFXEditableTable::onCmdHorzGrid(FXObject *o,FXSelector s,void *d) {
00474 editEnd();
00475 return FXTable::onCmdHorzGrid(o, s, d);
00476 }
00477
00478
00479 long
00480 MFXEditableTable::onCmdVertGrid(FXObject *o,FXSelector s,void *d) {
00481 editEnd();
00482 return FXTable::onCmdVertGrid(o, s, d);
00483 }
00484
00485
00486 long
00487 MFXEditableTable::onCmdDeleteColumn(FXObject *,FXSelector ,void *) {
00488 editEnd();
00489 return 1;
00490
00491 }
00492
00493
00494 long
00495 MFXEditableTable::onUpdDeleteColumn(FXObject *,FXSelector ,void *) {
00496 editEnd();
00497 return 1;
00498
00499 }
00500
00501
00502 long
00503 MFXEditableTable::onCmdDeleteRow(FXObject *,FXSelector ,void *) {
00504 editEnd();
00505 return 1;
00506
00507 }
00508
00509
00510 long
00511 MFXEditableTable::onUpdDeleteRow(FXObject *,FXSelector ,void *) {
00512 editEnd();
00513 return 1;
00514
00515 }
00516
00517
00518 long
00519 MFXEditableTable::onCmdInsertColumn(FXObject *,FXSelector ,void *) {
00520 editEnd();
00521 return 1;
00522
00523 }
00524
00525
00526 long
00527 MFXEditableTable::onCmdInsertRow(FXObject *,FXSelector ,void *) {
00528 editEnd();
00529 return 1;
00530
00531 }
00532
00533
00534
00535 long
00536 MFXEditableTable::onCmdMoveLeft(FXObject *o,FXSelector s,void *d) {
00537 editEnd();
00538 return FXTable::onCmdMoveLeft(o, s, d);
00539 }
00540
00541
00542 long
00543 MFXEditableTable::onCmdMoveRight(FXObject *o,FXSelector s,void *d) {
00544 editEnd();
00545 return FXTable::onCmdMoveRight(o, s, d);
00546 }
00547
00548
00549 long
00550 MFXEditableTable::onCmdMoveUp(FXObject *o,FXSelector s,void *d) {
00551 editEnd();
00552 return FXTable::onCmdMoveUp(o, s, d);
00553 }
00554
00555
00556 long
00557 MFXEditableTable::onCmdMoveDown(FXObject *o,FXSelector s,void *d) {
00558 editEnd();
00559 return FXTable::onCmdMoveDown(o, s, d);
00560 }
00561
00562
00563 long
00564 MFXEditableTable::onCmdMoveHome(FXObject *o,FXSelector s,void *d) {
00565 editEnd();
00566 return FXTable::onCmdMoveHome(o, s, d);
00567 }
00568
00569
00570 long
00571 MFXEditableTable::onCmdMoveEnd(FXObject *o,FXSelector s,void *d) {
00572 editEnd();
00573 return FXTable::onCmdMoveEnd(o, s, d);
00574 }
00575
00576
00577 long
00578 MFXEditableTable::onCmdMoveTop(FXObject *o,FXSelector s,void *d) {
00579 editEnd();
00580 return FXTable::onCmdMoveTop(o, s, d);
00581 }
00582
00583
00584 long
00585 MFXEditableTable::onCmdMoveBottom(FXObject *o,FXSelector s,void *d) {
00586 editEnd();
00587 return FXTable::onCmdMoveBottom(o, s, d);
00588 }
00589
00590
00591 long
00592 MFXEditableTable::onCmdMovePageDown(FXObject *o,FXSelector s,void *d) {
00593 editEnd();
00594 return FXTable::onCmdMovePageDown(o, s, d);
00595 }
00596
00597
00598 long
00599 MFXEditableTable::onCmdMovePageUp(FXObject *o,FXSelector s,void *d) {
00600 editEnd();
00601 return FXTable::onCmdMovePageUp(o, s, d);
00602 }
00603
00604
00605
00606 long
00607 MFXEditableTable::onCmdSelectRowIndex(FXObject *o,FXSelector s,void *d) {
00608 editEnd();
00609 return FXTable::onCmdSelectRowIndex(o, s, d);
00610 }
00611
00612
00613 long
00614 MFXEditableTable::onCmdSelectColumnIndex(FXObject *,FXSelector ,void *) {
00615 editEnd();
00616 return 1;
00617
00618 }
00619
00620
00621 long
00622 MFXEditableTable::onCmdSelectColumn(FXObject *,FXSelector ,void *) {
00623 editEnd();
00624 return 1;
00625
00626 }
00627
00628
00629 long
00630 MFXEditableTable::onCmdSelectRow(FXObject *o,FXSelector s,void *d) {
00631 editEnd();
00632 return FXTable::onCmdSelectRow(o, s, d);
00633 }
00634
00635
00636 long
00637 MFXEditableTable::onCmdSelectCell(FXObject *,FXSelector ,void *) {
00638
00639 return 1;
00640
00641 }
00642
00643
00644 long
00645 MFXEditableTable::onCmdSelectAll(FXObject *,FXSelector ,void *) {
00646 editEnd();
00647 return 1;
00648
00649 }
00650
00651
00652 long
00653 MFXEditableTable::onCmdDeselectAll(FXObject *,FXSelector ,void *) {
00654 editEnd();
00655 return 1;
00656
00657 }
00658
00659
00660 long
00661 MFXEditableTable::onCmdMark(FXObject *o,FXSelector s,void *d) {
00662 editEnd();
00663 return FXTable::onCmdMark(o, s, d);
00664 }
00665
00666
00667 long
00668 MFXEditableTable::onCmdExtend(FXObject *o,FXSelector s,void *d) {
00669 editEnd();
00670 return FXTable::onCmdExtend(o, s, d);
00671 }
00672
00673
00674 void
00675 MFXEditableTable::writeProtectCol(int col, bool val) {
00676 if (val) {
00677 myWriteProtectedCols.insert(col);
00678 } else {
00679 std::set<int>::iterator i = myWriteProtectedCols.find(col);
00680 if (i!=myWriteProtectedCols.end()) {
00681 myWriteProtectedCols.erase(i);
00682 }
00683 }
00684 }
00685
00686
00687
00688
00689