00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FXFOLDINGLIST_H
00025 #define FXFOLDINGLIST_H
00026
00027 #ifndef FXSCROLLAREA_H
00028 #include "FXScrollArea.h"
00029 #endif
00030
00031 namespace FX {
00032
00033
00034 class FXIcon;
00035 class FXFont;
00036 class FXHeader;
00037 class FXFoldingList;
00038
00039
00040
00041 enum {
00042 FOLDINGLIST_EXTENDEDSELECT = 0,
00043 FOLDINGLIST_SINGLESELECT = 0x00100000,
00044 FOLDINGLIST_BROWSESELECT = 0x00200000,
00045 FOLDINGLIST_MULTIPLESELECT = 0x00300000,
00046 FOLDINGLIST_AUTOSELECT = 0x00400000,
00047 FOLDINGLIST_SHOWS_LINES = 0x00800000,
00048 FOLDINGLIST_SHOWS_BOXES = 0x01000000,
00049 FOLDINGLIST_ROOT_BOXES = 0x02000000,
00050 FOLDINGLIST_NORMAL = FOLDINGLIST_EXTENDEDSELECT
00051 };
00052
00053
00054
00055 class FXAPI FXFoldingItem : public FXObject {
00056 FXDECLARE(FXFoldingItem)
00057 friend class FXFoldingList;
00058 friend class FXDirList;
00059 protected:
00060 FXFoldingItem *parent;
00061 FXFoldingItem *prev;
00062 FXFoldingItem *next;
00063 FXFoldingItem *first;
00064 FXFoldingItem *last;
00065 FXString label;
00066 FXIcon *openIcon;
00067 FXIcon *closedIcon;
00068 void *data;
00069 FXuint state;
00070 FXint x,y;
00071 private:
00072 FXFoldingItem(const FXFoldingItem&);
00073 FXFoldingItem& operator=(const FXFoldingItem&);
00074 protected:
00075 FXFoldingItem():parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),openIcon(NULL),closedIcon(NULL),data(NULL),state(0),x(0),y(0){}
00076 virtual void draw(const FXFoldingList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const;
00077 virtual FXint hitItem(const FXFoldingList* list,FXint x,FXint y) const;
00078 public:
00079 enum{
00080 SELECTED = 1,
00081 FOCUS = 2,
00082 DISABLED = 4,
00083 OPENED = 8,
00084 EXPANDED = 16,
00085 HASITEMS = 32,
00086 DRAGGABLE = 64,
00087 OPENICONOWNED = 128,
00088 CLOSEDICONOWNED = 256
00089 };
00090 public:
00091
00092
00093 FXFoldingItem(const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL):parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),label(text),openIcon(oi),closedIcon(ci),data(ptr),state(0),x(0),y(0){}
00094
00095
00096 FXFoldingItem* getParent() const { return parent; }
00097
00098
00099 FXFoldingItem* getNext() const { return next; }
00100
00101
00102 FXFoldingItem* getPrev() const { return prev; }
00103
00104
00105 FXFoldingItem* getFirst() const { return first; }
00106
00107
00108 FXFoldingItem* getLast() const { return last; }
00109
00110
00111 FXFoldingItem* getBelow() const;
00112
00113
00114 FXFoldingItem* getAbove() const;
00115
00116
00117 FXint getNumChildren() const;
00118
00119
00120 virtual void setText(const FXString& txt);
00121
00122
00123 const FXString& getText() const { return label; }
00124
00125
00126 virtual void setOpenIcon(FXIcon* icn,FXbool owned=FALSE);
00127
00128
00129 FXIcon* getOpenIcon() const { return openIcon; }
00130
00131
00132 virtual void setClosedIcon(FXIcon* icn,FXbool owned=FALSE);
00133
00134
00135 FXIcon* getClosedIcon() const { return closedIcon; }
00136
00137
00138 void setData(void* ptr){ data=ptr; }
00139
00140
00141 void* getData() const { return data; }
00142
00143
00144 virtual void setFocus(FXbool focus);
00145
00146
00147 FXbool hasFocus() const { return (state&FOCUS)!=0; }
00148
00149
00150 virtual void setSelected(FXbool selected);
00151
00152
00153 FXbool isSelected() const { return (state&SELECTED)!=0; }
00154
00155
00156 virtual void setOpened(FXbool opened);
00157
00158
00159 FXbool isOpened() const { return (state&OPENED)!=0; }
00160
00161
00162 virtual void setExpanded(FXbool expanded);
00163
00164
00165 FXbool isExpanded() const { return (state&EXPANDED)!=0; }
00166
00167
00168 virtual void setEnabled(FXbool enabled);
00169
00170
00171 FXbool isEnabled() const { return (state&DISABLED)==0; }
00172
00173
00174 virtual void setDraggable(FXbool draggable);
00175
00176
00177 FXbool isDraggable() const { return (state&DRAGGABLE)!=0; }
00178
00179
00180 FXbool hasItems() const { return (state&HASITEMS)!=0; }
00181
00182
00183 void setHasItems(FXbool flag);
00184
00185
00186 FXbool isChildOf(const FXFoldingItem* item) const;
00187
00188
00189 FXbool isParentOf(const FXFoldingItem* item) const;
00190
00191
00192 virtual FXint getWidth(const FXFoldingList* list) const;
00193
00194
00195 virtual FXint getHeight(const FXFoldingList* list) const;
00196
00197
00198 virtual void create();
00199
00200
00201 virtual void detach();
00202
00203
00204 virtual void destroy();
00205
00206
00207 virtual void save(FXStream& store) const;
00208
00209
00210 virtual void load(FXStream& store);
00211
00212
00213 virtual ~FXFoldingItem();
00214 };
00215
00216
00217
00218
00219 typedef FXint (*FXFoldingListSortFunc)(const FXFoldingItem*,const FXFoldingItem*);
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 class FXAPI FXFoldingList : public FXScrollArea {
00245 FXDECLARE(FXFoldingList)
00246 protected:
00247 FXHeader *header;
00248 FXFoldingItem *firstitem;
00249 FXFoldingItem *lastitem;
00250 FXFoldingItem *anchoritem;
00251 FXFoldingItem *currentitem;
00252 FXFoldingItem *extentitem;
00253 FXFoldingItem *cursoritem;
00254 FXFoldingItem *viewableitem;
00255 FXFont *font;
00256 FXFoldingListSortFunc sortfunc;
00257 FXColor textColor;
00258 FXColor selbackColor;
00259 FXColor seltextColor;
00260 FXColor lineColor;
00261 FXint treeWidth;
00262 FXint treeHeight;
00263 FXint visible;
00264 FXint indent;
00265 FXint grabx;
00266 FXint graby;
00267 FXString lookup;
00268 FXString help;
00269 FXbool state;
00270 protected:
00271 FXFoldingList();
00272 void recompute();
00273 void mergesort(FXFoldingItem*& list);
00274 void sort(FXFoldingItem*& f1,FXFoldingItem*& t1,FXFoldingItem*& f2,FXFoldingItem*& t2,int n);
00275 virtual void moveContents(FXint x,FXint y);
00276 virtual FXFoldingItem* createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr);
00277 static FXint compareSection(const FXchar *p,const FXchar* q,FXint s);
00278 static FXint compareSectionCase(const FXchar *p,const FXchar* q,FXint s);
00279 private:
00280 FXFoldingList(const FXFoldingList&);
00281 FXFoldingList& operator=(const FXFoldingList&);
00282 public:
00283 long onPaint(FXObject*,FXSelector,void*);
00284 long onEnter(FXObject*,FXSelector,void*);
00285 long onLeave(FXObject*,FXSelector,void*);
00286 long onUngrabbed(FXObject*,FXSelector,void*);
00287 long onMotion(FXObject*,FXSelector,void*);
00288 long onKeyPress(FXObject*,FXSelector,void*);
00289 long onKeyRelease(FXObject*,FXSelector,void*);
00290 long onLeftBtnPress(FXObject*,FXSelector,void*);
00291 long onLeftBtnRelease(FXObject*,FXSelector,void*);
00292 long onRightBtnPress(FXObject*,FXSelector,void*);
00293 long onRightBtnRelease(FXObject*,FXSelector,void*);
00294 long onHeaderChanged(FXObject*,FXSelector,void*);
00295 long onQueryTip(FXObject*,FXSelector,void*);
00296 long onQueryHelp(FXObject*,FXSelector,void*);
00297 long onTipTimer(FXObject*,FXSelector,void*);
00298 long onFocusIn(FXObject*,FXSelector,void*);
00299 long onFocusOut(FXObject*,FXSelector,void*);
00300 long onAutoScroll(FXObject*,FXSelector,void*);
00301 long onClicked(FXObject*,FXSelector,void*);
00302 long onDoubleClicked(FXObject*,FXSelector,void*);
00303 long onTripleClicked(FXObject*,FXSelector,void*);
00304 long onCommand(FXObject*,FXSelector,void*);
00305 long onLookupTimer(FXObject*,FXSelector,void*);
00306 public:
00307 static FXint ascending(const FXFoldingItem*,const FXFoldingItem*);
00308 static FXint descending(const FXFoldingItem*,const FXFoldingItem*);
00309 static FXint ascendingCase(const FXFoldingItem*,const FXFoldingItem*);
00310 static FXint descendingCase(const FXFoldingItem*,const FXFoldingItem*);
00311 public:
00312 enum {
00313 ID_LOOKUPTIMER=FXScrollArea::ID_LAST,
00314 ID_HEADER_CHANGE,
00315 ID_LAST
00316 };
00317 public:
00318
00319
00320 FXFoldingList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FOLDINGLIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0);
00321
00322
00323 virtual void create();
00324
00325
00326 virtual void detach();
00327
00328
00329 virtual void layout();
00330
00331
00332 virtual FXint getDefaultWidth();
00333
00334
00335 virtual FXint getDefaultHeight();
00336
00337
00338 virtual FXint getContentWidth();
00339
00340
00341 virtual FXint getContentHeight();
00342
00343
00344 virtual void recalc();
00345
00346
00347 virtual bool canFocus() const;
00348
00349
00350 virtual void setFocus();
00351
00352
00353 virtual void killFocus();
00354
00355
00356 FXHeader* getHeader() const { return header; }
00357
00358
00359 void setHeaders(const FXchar** strings,FXint size=1);
00360
00361
00362 void setHeaders(const FXString& strings,FXint size=1);
00363
00364
00365 void appendHeader(const FXString& text,FXIcon *icon=NULL,FXint size=1);
00366
00367
00368 void removeHeader(FXint index);
00369
00370
00371 void setHeaderText(FXint index,const FXString& text);
00372
00373
00374 FXString getHeaderText(FXint index) const;
00375
00376
00377 void setHeaderIcon(FXint index,FXIcon *icon);
00378
00379
00380 FXIcon* getHeaderIcon(FXint index) const;
00381
00382
00383 void setHeaderSize(FXint index,FXint size);
00384
00385
00386 FXint getHeaderSize(FXint index) const;
00387
00388
00389 FXint getNumHeaders() const;
00390
00391
00392 FXint getNumItems() const;
00393
00394
00395 FXint getNumVisible() const { return visible; }
00396
00397
00398 void setNumVisible(FXint nvis);
00399
00400
00401 FXFoldingItem* getFirstItem() const { return firstitem; }
00402
00403
00404 FXFoldingItem* getLastItem() const { return lastitem; }
00405
00406
00407 FXint fillItems(FXFoldingItem* father,const FXchar** strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE);
00408
00409
00410 FXint fillItems(FXFoldingItem* father,const FXString& strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE);
00411
00412
00413 FXFoldingItem* insertItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE);
00414
00415
00416 FXFoldingItem* insertItem(FXFoldingItem* other,FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE);
00417
00418
00419 FXFoldingItem* appendItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE);
00420
00421
00422 FXFoldingItem* appendItem(FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE);
00423
00424
00425 FXFoldingItem* prependItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE);
00426
00427
00428 FXFoldingItem* prependItem(FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE);
00429
00430
00431 FXFoldingItem *moveItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item);
00432
00433
00434 FXFoldingItem* extractItem(FXFoldingItem* item,FXbool notify=FALSE);
00435
00436
00437 void removeItem(FXFoldingItem* item,FXbool notify=FALSE);
00438
00439
00440 void removeItems(FXFoldingItem* fm,FXFoldingItem* to,FXbool notify=FALSE);
00441
00442
00443 void clearItems(FXbool notify=FALSE);
00444
00445
00446 FXint getItemWidth(const FXFoldingItem* item) const { return item->getWidth(this); }
00447
00448
00449 FXint getItemHeight(const FXFoldingItem* item) const { return item->getHeight(this); }
00450
00451
00452 virtual FXFoldingItem* getItemAt(FXint x,FXint y) const;
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 FXFoldingItem* findItem(const FXString& text,FXFoldingItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const;
00465
00466
00467
00468
00469
00470
00471
00472
00473 FXFoldingItem* findItemByData(const void *ptr,FXFoldingItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const;
00474
00475
00476 virtual void makeItemVisible(FXFoldingItem* item);
00477
00478
00479 void setItemText(FXFoldingItem* item,const FXString& text);
00480
00481
00482 FXString getItemText(const FXFoldingItem* item) const;
00483
00484
00485 void setItemOpenIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned=FALSE);
00486
00487
00488 FXIcon* getItemOpenIcon(const FXFoldingItem* item) const;
00489
00490
00491 void setItemClosedIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned=FALSE);
00492
00493
00494 FXIcon* getItemClosedIcon(const FXFoldingItem* item) const;
00495
00496
00497 void setItemData(FXFoldingItem* item,void* ptr) const;
00498
00499
00500 void* getItemData(const FXFoldingItem* item) const;
00501
00502
00503 FXbool isItemSelected(const FXFoldingItem* item) const;
00504
00505
00506 FXbool isItemCurrent(const FXFoldingItem* item) const;
00507
00508
00509 FXbool isItemVisible(const FXFoldingItem* item) const;
00510
00511
00512 FXbool isItemOpened(const FXFoldingItem* item) const;
00513
00514
00515 FXbool isItemExpanded(const FXFoldingItem* item) const;
00516
00517
00518 FXbool isItemLeaf(const FXFoldingItem* item) const;
00519
00520
00521 FXbool isItemEnabled(const FXFoldingItem* item) const;
00522
00523
00524 FXint hitItem(const FXFoldingItem* item,FXint x,FXint y) const;
00525
00526
00527 void updateItem(FXFoldingItem* item);
00528
00529
00530 virtual FXbool enableItem(FXFoldingItem* item);
00531
00532
00533 virtual FXbool disableItem(FXFoldingItem* item);
00534
00535
00536 virtual FXbool selectItem(FXFoldingItem* item,FXbool notify=FALSE);
00537
00538
00539 virtual FXbool deselectItem(FXFoldingItem* item,FXbool notify=FALSE);
00540
00541
00542 virtual FXbool toggleItem(FXFoldingItem* item,FXbool notify=FALSE);
00543
00544
00545 virtual FXbool extendSelection(FXFoldingItem* item,FXbool notify=FALSE);
00546
00547
00548 virtual FXbool killSelection(FXbool notify=FALSE);
00549
00550
00551 virtual FXbool openItem(FXFoldingItem* item,FXbool notify=FALSE);
00552
00553
00554 virtual FXbool closeItem(FXFoldingItem* item,FXbool notify=FALSE);
00555
00556
00557 virtual FXbool collapseTree(FXFoldingItem* tree,FXbool notify=FALSE);
00558
00559
00560 virtual FXbool expandTree(FXFoldingItem* tree,FXbool notify=FALSE);
00561
00562
00563 virtual void setCurrentItem(FXFoldingItem* item,FXbool notify=FALSE);
00564
00565
00566 FXFoldingItem* getCurrentItem() const { return currentitem; }
00567
00568
00569 void setAnchorItem(FXFoldingItem* item);
00570
00571
00572 FXFoldingItem* getAnchorItem() const { return anchoritem; }
00573
00574
00575 FXFoldingItem* getCursorItem() const { return cursoritem; }
00576
00577
00578 void sortItems();
00579
00580
00581 void sortRootItems();
00582
00583
00584 void sortChildItems(FXFoldingItem* item);
00585
00586
00587 FXFoldingListSortFunc getSortFunc() const { return sortfunc; }
00588
00589
00590 void setSortFunc(FXFoldingListSortFunc func){ sortfunc=func; }
00591
00592
00593 void setFont(FXFont* fnt);
00594
00595
00596 FXFont* getFont() const { return font; }
00597
00598
00599 void setIndent(FXint in);
00600
00601
00602 FXint getIndent() const { return indent; }
00603
00604
00605 FXColor getTextColor() const { return textColor; }
00606
00607
00608 void setTextColor(FXColor clr);
00609
00610
00611 FXColor getSelBackColor() const { return selbackColor; }
00612
00613
00614 void setSelBackColor(FXColor clr);
00615
00616
00617 FXColor getSelTextColor() const { return seltextColor; }
00618
00619
00620 void setSelTextColor(FXColor clr);
00621
00622
00623 FXColor getLineColor() const { return lineColor; }
00624
00625
00626 void setLineColor(FXColor clr);
00627
00628
00629 FXuint getListStyle() const;
00630
00631
00632 void setListStyle(FXuint style);
00633
00634
00635 void setHelpText(const FXString& text);
00636
00637
00638 const FXString& getHelpText() const { return help; }
00639
00640
00641 virtual void save(FXStream& store) const;
00642
00643
00644 virtual void load(FXStream& store);
00645
00646
00647 virtual ~FXFoldingList();
00648 };
00649
00650 }
00651
00652
00653 #endif