1 /******************************************************************************** 2 * * 3 * L i s t W i d g e t * 4 * * 5 ********************************************************************************* 6 * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * 7 ********************************************************************************* 8 * This library is free software; you can redistribute it and/or * 9 * modify it under the terms of the GNU Lesser General Public * 10 * License as published by the Free Software Foundation; either * 11 * version 2.1 of the License, or (at your option) any later version. * 12 * * 13 * This library is distributed in the hope that it will be useful, * 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 16 * Lesser General Public License for more details. * 17 * * 18 * You should have received a copy of the GNU Lesser General Public * 19 * License along with this library; if not, write to the Free Software * 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * 21 ********************************************************************************* 22 * $Id: FXList.h 3297 2015-12-14 20:30:04Z arthurcnorman $ * 23 ********************************************************************************/ 24 #ifndef FXLIST_H 25 #define FXLIST_H 26 27 #ifndef FXSCROLLAREA_H 28 #include "FXScrollArea.h" 29 #endif 30 31 namespace FX { 32 33 34 /// List styles 35 enum { 36 LIST_EXTENDEDSELECT = 0, /// Extended selection mode allows for drag-selection of ranges of items 37 LIST_SINGLESELECT = 0x00100000, /// Single selection mode allows up to one item to be selected 38 LIST_BROWSESELECT = 0x00200000, /// Browse selection mode enforces one single item to be selected at all times 39 LIST_MULTIPLESELECT = 0x00300000, /// Multiple selection mode is used for selection of individual items 40 LIST_AUTOSELECT = 0x00400000, /// Automatically select under cursor 41 LIST_NORMAL = LIST_EXTENDEDSELECT 42 }; 43 44 45 class FXIcon; 46 class FXFont; 47 class FXList; 48 49 50 /// List item 51 class FXAPI FXListItem : public FXObject { 52 FXDECLARE(FXListItem) 53 friend class FXList; 54 protected: 55 FXString label; 56 FXIcon *icon; 57 void *data; 58 FXuint state; 59 FXint x,y; 60 private: 61 FXListItem(const FXListItem&); 62 FXListItem& operator=(const FXListItem&); 63 protected: FXListItem()64 FXListItem():icon(NULL),data(NULL),state(0),x(0),y(0){} 65 virtual void draw(const FXList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h); 66 virtual FXint hitItem(const FXList* list,FXint x,FXint y) const; 67 public: 68 enum { 69 SELECTED = 1, /// Selected 70 FOCUS = 2, /// Focus 71 DISABLED = 4, /// Disabled 72 DRAGGABLE = 8, /// Draggable 73 ICONOWNED = 16 /// Icon owned by item 74 }; 75 public: 76 77 /// Construct new item with given text, icon, and user-data label(text)78 FXListItem(const FXString& text,FXIcon* ic=NULL,void* ptr=NULL):label(text),icon(ic),data(ptr),state(0),x(0),y(0){} 79 80 /// Change item's text label 81 virtual void setText(const FXString& txt); 82 83 /// Return item's text label getText()84 const FXString& getText() const { return label; } 85 86 /// Change item's icon, deleting the old icon if it was owned 87 virtual void setIcon(FXIcon* icn,FXbool owned=FALSE); 88 89 /// Return item's icon getIcon()90 FXIcon* getIcon() const { return icon; } 91 92 /// Change item's user data setData(void * ptr)93 void setData(void* ptr){ data=ptr; } 94 95 /// Get item's user data getData()96 void* getData() const { return data; } 97 98 /// Make item draw as focused 99 virtual void setFocus(FXbool focus); 100 101 /// Return true if item has focus hasFocus()102 FXbool hasFocus() const { return (state&FOCUS)!=0; } 103 104 /// Select item 105 virtual void setSelected(FXbool selected); 106 107 /// Return true if this item is selected isSelected()108 FXbool isSelected() const { return (state&SELECTED)!=0; } 109 110 /// Enable or disable item 111 virtual void setEnabled(FXbool enabled); 112 113 /// Return true if this item is enabled isEnabled()114 FXbool isEnabled() const { return (state&DISABLED)==0; } 115 116 /// Make item draggable 117 virtual void setDraggable(FXbool draggable); 118 119 /// Return true if this item is draggable isDraggable()120 FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } 121 122 /// Return width of item as drawn in list 123 virtual FXint getWidth(const FXList* list) const; 124 125 /// Return height of item as drawn in list 126 virtual FXint getHeight(const FXList* list) const; 127 128 /// Create server-side resources 129 virtual void create(); 130 131 /// Detach server-side resources 132 virtual void detach(); 133 134 /// Destroy server-side resources 135 virtual void destroy(); 136 137 /// Save to stream 138 virtual void save(FXStream& store) const; 139 140 /// Load from stream 141 virtual void load(FXStream& store); 142 143 /// Destroy item and free icons if owned 144 virtual ~FXListItem(); 145 }; 146 147 148 /// List item collate function 149 typedef FXint (*FXListSortFunc)(const FXListItem*,const FXListItem*); 150 151 152 /// List of FXListItem's 153 typedef FXObjectListOf<FXListItem> FXListItemList; 154 155 156 /** 157 * A List Widget displays a list of items, each with a text and 158 * optional icon. When an item's selected state changes, the list sends 159 * a SEL_SELECTED or SEL_DESELECTED message. A change of the current 160 * item is signified by the SEL_CHANGED message. 161 * The list sends SEL_COMMAND messages when the user clicks on an item, 162 * and SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED when the user 163 * clicks once, twice, or thrice, respectively. 164 * When items are added, replaced, or removed, the list sends messages of 165 * the type SEL_INSERTED, SEL_REPLACED, or SEL_DELETED. 166 * In each of these cases, the index to the item, if any, is passed in the 167 * 3rd argument of the message. 168 */ 169 class FXAPI FXList : public FXScrollArea { 170 FXDECLARE(FXList) 171 protected: 172 FXListItemList items; // Item list 173 FXint anchor; // Anchor item 174 FXint current; // Current item 175 FXint extent; // Extent item 176 FXint cursor; // Cursor item 177 FXint viewable; // Viewable item 178 FXFont *font; // Font 179 FXColor textColor; // Text color 180 FXColor selbackColor; // Selected back color 181 FXColor seltextColor; // Selected text color 182 FXint listWidth; // List width 183 FXint listHeight; // List height 184 FXint visible; // Number of rows high 185 FXString help; // Help text 186 FXListSortFunc sortfunc; // Item sort function 187 FXint grabx; // Grab point x 188 FXint graby; // Grab point y 189 FXString lookup; // Lookup string 190 FXbool state; // State of item 191 protected: 192 FXList(); 193 void recompute(); 194 virtual FXListItem *createItem(const FXString& text,FXIcon* icon,void* ptr); 195 private: 196 FXList(const FXList&); 197 FXList &operator=(const FXList&); 198 public: 199 long onPaint(FXObject*,FXSelector,void*); 200 long onEnter(FXObject*,FXSelector,void*); 201 long onLeave(FXObject*,FXSelector,void*); 202 long onUngrabbed(FXObject*,FXSelector,void*); 203 long onKeyPress(FXObject*,FXSelector,void*); 204 long onKeyRelease(FXObject*,FXSelector,void*); 205 long onLeftBtnPress(FXObject*,FXSelector,void*); 206 long onLeftBtnRelease(FXObject*,FXSelector,void*); 207 long onRightBtnPress(FXObject*,FXSelector,void*); 208 long onRightBtnRelease(FXObject*,FXSelector,void*); 209 long onMotion(FXObject*,FXSelector,void*); 210 long onFocusIn(FXObject*,FXSelector,void*); 211 long onFocusOut(FXObject*,FXSelector,void*); 212 long onAutoScroll(FXObject*,FXSelector,void*); 213 long onClicked(FXObject*,FXSelector,void*); 214 long onDoubleClicked(FXObject*,FXSelector,void*); 215 long onTripleClicked(FXObject*,FXSelector,void*); 216 long onCommand(FXObject*,FXSelector,void*); 217 long onQueryTip(FXObject*,FXSelector,void*); 218 long onQueryHelp(FXObject*,FXSelector,void*); 219 long onTipTimer(FXObject*,FXSelector,void*); 220 long onLookupTimer(FXObject*,FXSelector,void*); 221 long onCmdSetValue(FXObject*,FXSelector,void*);public: 222 long onCmdGetIntValue(FXObject*,FXSelector,void*); 223 long onCmdSetIntValue(FXObject*,FXSelector,void*); 224 public: 225 static FXint ascending(const FXListItem* a,const FXListItem* b); 226 static FXint descending(const FXListItem* a,const FXListItem* b); 227 static FXint ascendingCase(const FXListItem* a,const FXListItem* b); 228 static FXint descendingCase(const FXListItem* a,const FXListItem* b); 229 public: 230 enum { 231 ID_LOOKUPTIMER=FXScrollArea::ID_LAST, 232 ID_LAST 233 }; 234 public: 235 236 /// Construct a list with initially no items in it 237 FXList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=LIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); 238 239 /// Create server-side resources 240 virtual void create(); 241 242 /// Detach server-side resources 243 virtual void detach(); 244 245 /// Perform layout 246 virtual void layout(); 247 248 /// Return default width 249 virtual FXint getDefaultWidth(); 250 251 /// Return default height 252 virtual FXint getDefaultHeight(); 253 254 /// Compute and return content width 255 virtual FXint getContentWidth(); 256 257 /// Return content height 258 virtual FXint getContentHeight(); 259 260 /// Recalculate layout 261 virtual void recalc(); 262 263 /// List widget can receive focus 264 virtual bool canFocus() const; 265 266 /// Move the focus to this window 267 virtual void setFocus(); 268 269 /// Remove the focus from this window 270 virtual void killFocus(); 271 272 /// Return the number of items in the list getNumItems()273 FXint getNumItems() const { return items.no(); } 274 275 /// Return number of visible items getNumVisible()276 FXint getNumVisible() const { return visible; } 277 278 /// Change the number of visible items 279 void setNumVisible(FXint nvis); 280 281 /// Return the item at the given index 282 FXListItem *getItem(FXint index) const; 283 284 /// Replace the item with a [possibly subclassed] item 285 FXint setItem(FXint index,FXListItem* item,FXbool notify=FALSE); 286 287 /// Replace items text, icon, and user-data pointer 288 FXint setItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 289 290 /// Fill list by appending items from array of strings 291 FXint fillItems(const FXchar** strings,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 292 293 /// Fill list by appending items from newline separated strings 294 FXint fillItems(const FXString& strings,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 295 296 /// Insert a new [possibly subclassed] item at the give index 297 FXint insertItem(FXint index,FXListItem* item,FXbool notify=FALSE); 298 299 /// Insert item at index with given text, icon, and user-data pointer 300 FXint insertItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 301 302 /// Append a [possibly subclassed] item to the list 303 FXint appendItem(FXListItem* item,FXbool notify=FALSE); 304 305 /// Append new item with given text and optional icon, and user-data pointer 306 FXint appendItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 307 308 /// Prepend a [possibly subclassed] item to the list 309 FXint prependItem(FXListItem* item,FXbool notify=FALSE); 310 311 /// Prepend new item with given text and optional icon, and user-data pointer 312 FXint prependItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); 313 314 /// Move item from oldindex to newindex 315 FXint moveItem(FXint newindex,FXint oldindex,FXbool notify=FALSE); 316 317 /// Extract item from list 318 FXListItem* extractItem(FXint index,FXbool notify=FALSE); 319 320 /// Remove item from list 321 void removeItem(FXint index,FXbool notify=FALSE); 322 323 /// Remove all items from list 324 void clearItems(FXbool notify=FALSE); 325 326 /// Return item width 327 FXint getItemWidth(FXint index) const; 328 329 /// Return item height 330 FXint getItemHeight(FXint index) const; 331 332 /// Return index of item at x,y, if any 333 virtual FXint getItemAt(FXint x,FXint y) const; 334 335 /// Return item hit code: 0 no hit; 1 hit the icon; 2 hit the text 336 FXint hitItem(FXint index,FXint x,FXint y) const; 337 338 /** 339 * Search items by name, beginning from item start. If the start 340 * item is -1 the search will start at the first item in the list. 341 * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the 342 * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP 343 * to control whether the search wraps at the start or end of the list. 344 * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, 345 * passing SEARCH_PREFIX causes searching for a prefix of the item name. 346 * Return -1 if no matching item is found. 347 */ 348 FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; 349 350 /** 351 * Search items by associated user data, beginning from item start. If the 352 * start item is -1 the search will start at the first item in the list. 353 * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the 354 * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP 355 * to control whether the search wraps at the start or end of the list. 356 */ 357 FXint findItemByData(const void *ptr,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; 358 359 /// Scroll to bring item into view 360 virtual void makeItemVisible(FXint index); 361 362 /// Change item text 363 void setItemText(FXint index,const FXString& text); 364 365 /// Return item text 366 FXString getItemText(FXint index) const; 367 368 /// Change item icon, deleting the old icon if it was owned 369 void setItemIcon(FXint index,FXIcon* icon,FXbool owned=FALSE); 370 371 /// Return item icon, if any 372 FXIcon* getItemIcon(FXint index) const; 373 374 /// Change item user-data pointer 375 void setItemData(FXint index,void* ptr); 376 377 /// Return item user-data pointer 378 void* getItemData(FXint index) const; 379 380 /// Return TRUE if item is selected 381 FXbool isItemSelected(FXint index) const; 382 383 /// Return TRUE if item is current 384 FXbool isItemCurrent(FXint index) const; 385 386 /// Return TRUE if item is visible 387 FXbool isItemVisible(FXint index) const; 388 389 /// Return TRUE if item is enabled 390 FXbool isItemEnabled(FXint index) const; 391 392 /// Repaint item 393 void updateItem(FXint index) const; 394 395 /// Enable item 396 virtual FXbool enableItem(FXint index); 397 398 /// Disable item 399 virtual FXbool disableItem(FXint index); 400 401 /// Select item 402 virtual FXbool selectItem(FXint index,FXbool notify=FALSE); 403 404 /// Deselect item 405 virtual FXbool deselectItem(FXint index,FXbool notify=FALSE); 406 407 /// Toggle item selection state 408 virtual FXbool toggleItem(FXint index,FXbool notify=FALSE); 409 410 /// Extend selection from anchor item to index 411 virtual FXbool extendSelection(FXint index,FXbool notify=FALSE); 412 413 /// Deselect all items 414 virtual FXbool killSelection(FXbool notify=FALSE); 415 416 /// Change current item 417 virtual void setCurrentItem(FXint index,FXbool notify=FALSE); 418 419 /// Return current item, if any getCurrentItem()420 FXint getCurrentItem() const { return current; } 421 422 /// Change anchor item 423 void setAnchorItem(FXint index); 424 425 /// Return anchor item, if any getAnchorItem()426 FXint getAnchorItem() const { return anchor; } 427 428 /// Get item under the cursor, if any getCursorItem()429 FXint getCursorItem() const { return cursor; } 430 431 /// Sort items using current sort function 432 void sortItems(); 433 434 /// Return sort function getSortFunc()435 FXListSortFunc getSortFunc() const { return sortfunc; } 436 437 /// Change sort function setSortFunc(FXListSortFunc func)438 void setSortFunc(FXListSortFunc func){ sortfunc=func; } 439 440 /// Change text font 441 void setFont(FXFont* fnt); 442 443 /// Return text font getFont()444 FXFont* getFont() const { return font; } 445 446 /// Return normal text color getTextColor()447 FXColor getTextColor() const { return textColor; } 448 449 /// Change normal text color 450 void setTextColor(FXColor clr); 451 452 /// Return selected text background getSelBackColor()453 FXColor getSelBackColor() const { return selbackColor; } 454 455 /// Change selected text background 456 void setSelBackColor(FXColor clr); 457 458 /// Return selected text color getSelTextColor()459 FXColor getSelTextColor() const { return seltextColor; } 460 461 /// Change selected text color 462 void setSelTextColor(FXColor clr); 463 464 /// Return list style 465 FXuint getListStyle() const; 466 467 /// Change list style 468 void setListStyle(FXuint style); 469 470 /// Set the status line help text for this list 471 void setHelpText(const FXString& text); 472 473 /// Get the status line help text for this list getHelpText()474 const FXString& getHelpText() const { return help; } 475 476 /// Save list to a stream 477 virtual void save(FXStream& store) const; 478 479 /// Load list from a stream 480 virtual void load(FXStream& store); 481 482 /// Destructor 483 virtual ~FXList(); 484 }; 485 486 } 487 488 #endif 489