Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members

FXList.h

00001 /********************************************************************************
00002 *                                                                               *
00003 *                            L i s t   W i d g e t                              *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1997,2004 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or                 *
00009 * modify it under the terms of the GNU Lesser General Public                    *
00010 * License as published by the Free Software Foundation; either                  *
00011 * version 2.1 of the License, or (at your option) any later version.            *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
00016 * Lesser General Public License for more details.                               *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public              *
00019 * License along with this library; if not, write to the Free Software           *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
00021 *********************************************************************************
00022 * $Id: FXList.h,v 1.67 2004/02/08 17:17:33 fox Exp $                            *
00023 ********************************************************************************/
00024 #ifndef FXLIST_H
00025 #define FXLIST_H
00026 
00027 #ifndef FXSCROLLAREA_H
00028 #include "FXScrollArea.h"
00029 #endif
00030 
00031 namespace FX {
00032 
00033 
00034 /// List styles
00035 enum {
00036   LIST_EXTENDEDSELECT    = 0,             /// Extended selection mode allows for drag-selection of ranges of items
00037   LIST_SINGLESELECT      = 0x00100000,    /// Single selection mode allows up to one item to be selected
00038   LIST_BROWSESELECT      = 0x00200000,    /// Browse selection mode enforces one single item to be selected at all times
00039   LIST_MULTIPLESELECT    = 0x00300000,    /// Multiple selection mode is used for selection of individual items
00040   LIST_AUTOSELECT        = 0x00400000,    /// Automatically select under cursor
00041   LIST_NORMAL            = LIST_EXTENDEDSELECT
00042   };
00043 
00044 
00045 class FXIcon;
00046 class FXFont;
00047 class FXList;
00048 
00049 
00050 /// List item
00051 class FXAPI FXListItem : public FXObject {
00052   FXDECLARE(FXListItem)
00053   friend class FXList;
00054 protected:
00055   FXString  label;
00056   FXIcon   *icon;
00057   void     *data;
00058   FXuint    state;
00059   FXint     x,y;
00060 protected:
00061   FXListItem():icon(NULL),data(NULL),state(0),x(0),y(0){}
00062   virtual void draw(const FXList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h);
00063   virtual FXint hitItem(const FXList* list,FXint x,FXint y) const;
00064 protected:
00065   enum {
00066     SELECTED  = 1,
00067     FOCUS     = 2,
00068     DISABLED  = 4,
00069     DRAGGABLE = 8,
00070     ICONOWNED = 16
00071     };
00072 public:
00073   FXListItem(const FXString& text,FXIcon* ic=NULL,void* ptr=NULL):label(text),icon(ic),data(ptr),state(0),x(0),y(0){}
00074   virtual void setText(const FXString& txt){ label=txt; }
00075   const FXString& getText() const { return label; }
00076   virtual void setIcon(FXIcon* icn){ icon=icn; }
00077   FXIcon* getIcon() const { return icon; }
00078   void setData(void* ptr){ data=ptr; }
00079   void* getData() const { return data; }
00080   virtual void setFocus(FXbool focus);
00081   FXbool hasFocus() const { return (state&FOCUS)!=0; }
00082   virtual void setSelected(FXbool selected);
00083   FXbool isSelected() const { return (state&SELECTED)!=0; }
00084   virtual void setEnabled(FXbool enabled);
00085   FXbool isEnabled() const { return (state&DISABLED)==0; }
00086   virtual void setDraggable(FXbool draggable);
00087   FXbool isDraggable() const { return (state&DRAGGABLE)!=0; }
00088   virtual void setIconOwned(FXuint owned=ICONOWNED);
00089   FXuint isIconOwned() const { return (state&ICONOWNED); }
00090   virtual FXint getWidth(const FXList* list) const;
00091   virtual FXint getHeight(const FXList* list) const;
00092   virtual void create();
00093   virtual void detach();
00094   virtual void destroy();
00095   virtual void save(FXStream& store) const;
00096   virtual void load(FXStream& store);
00097   virtual ~FXListItem();
00098   };
00099 
00100 
00101 /// List item collate function
00102 typedef FXint (*FXListSortFunc)(const FXListItem*,const FXListItem*);
00103 
00104 
00105 /// List Widget
00106 class FXAPI FXList : public FXScrollArea {
00107   FXDECLARE(FXList)
00108 protected:
00109   FXListItem   **items;             // Item list
00110   FXint          nitems;            // Number of items
00111   FXint          anchor;            // Anchor item
00112   FXint          current;           // Current item
00113   FXint          extent;            // Extent item
00114   FXint          cursor;            // Cursor item
00115   FXFont        *font;              // Font
00116   FXColor        textColor;         // Text color
00117   FXColor        selbackColor;      // Selected back color
00118   FXColor        seltextColor;      // Selected text color
00119   FXint          listWidth;         // List width
00120   FXint          listHeight;        // List height
00121   FXint          visible;           // Number of rows high
00122   FXString       help;              // Help text
00123   FXListSortFunc sortfunc;          // Item sort function
00124   FXint          grabx;             // Grab point x
00125   FXint          graby;             // Grab point y
00126   FXString       lookup;            // Lookup string
00127   FXbool         state;             // State of item
00128 protected:
00129   FXList();
00130   void recompute();
00131   virtual FXListItem *createItem(const FXString& text,FXIcon* icon,void* ptr);
00132 private:
00133   FXList(const FXList&);
00134   FXList &operator=(const FXList&);
00135 public:
00136   long onPaint(FXObject*,FXSelector,void*);
00137   long onEnter(FXObject*,FXSelector,void*);
00138   long onLeave(FXObject*,FXSelector,void*);
00139   long onUngrabbed(FXObject*,FXSelector,void*);
00140   long onKeyPress(FXObject*,FXSelector,void*);
00141   long onKeyRelease(FXObject*,FXSelector,void*);
00142   long onLeftBtnPress(FXObject*,FXSelector,void*);
00143   long onLeftBtnRelease(FXObject*,FXSelector,void*);
00144   long onRightBtnPress(FXObject*,FXSelector,void*);
00145   long onRightBtnRelease(FXObject*,FXSelector,void*);
00146   long onMotion(FXObject*,FXSelector,void*);
00147   long onFocusIn(FXObject*,FXSelector,void*);
00148   long onFocusOut(FXObject*,FXSelector,void*);
00149   long onAutoScroll(FXObject*,FXSelector,void*);
00150   long onClicked(FXObject*,FXSelector,void*);
00151   long onDoubleClicked(FXObject*,FXSelector,void*);
00152   long onTripleClicked(FXObject*,FXSelector,void*);
00153   long onCommand(FXObject*,FXSelector,void*);
00154   long onQueryTip(FXObject*,FXSelector,void*);
00155   long onQueryHelp(FXObject*,FXSelector,void*);
00156   long onTipTimer(FXObject*,FXSelector,void*);
00157   long onLookupTimer(FXObject*,FXSelector,void*);
00158   long onCmdSetValue(FXObject*,FXSelector,void*);public:
00159   long onCmdGetIntValue(FXObject*,FXSelector,void*);
00160   long onCmdSetIntValue(FXObject*,FXSelector,void*);
00161 public:
00162   static FXint ascending(const FXListItem* a,const FXListItem* b);
00163   static FXint descending(const FXListItem* a,const FXListItem* b);
00164   static FXint ascendingCase(const FXListItem* a,const FXListItem* b);
00165   static FXint descendingCase(const FXListItem* a,const FXListItem* b);
00166 public:
00167   enum {
00168     ID_LOOKUPTIMER=FXScrollArea::ID_LAST,
00169     ID_LAST
00170     };
00171 public:
00172 
00173   /// Construct a list with nvis visible items; the list is initially empty
00174   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);
00175 
00176   /// Create server-side resources
00177   virtual void create();
00178 
00179   /// Detach server-side resources
00180   virtual void detach();
00181 
00182   /// Perform layout
00183   virtual void layout();
00184 
00185   /// Return default width
00186   virtual FXint getDefaultWidth();
00187 
00188   /// Return default height
00189   virtual FXint getDefaultHeight();
00190 
00191   /// Compute and return content width
00192   virtual FXint getContentWidth();
00193 
00194   /// Return content height
00195   virtual FXint getContentHeight();
00196 
00197   /// Recalculate layout
00198   virtual void recalc();
00199 
00200   /// List widget can receive focus
00201   virtual FXbool canFocus() const;
00202 
00203   /// Move the focus to this window
00204   virtual void setFocus();
00205 
00206   /// Remove the focus from this window
00207   virtual void killFocus();
00208 
00209   /// Return the number of items in the list
00210   FXint getNumItems() const { return nitems; }
00211 
00212   /// Return number of visible items
00213   FXint getNumVisible() const { return visible; }
00214 
00215   /// Change the number of visible items
00216   void setNumVisible(FXint nvis);
00217 
00218   /// Return the item at the given index
00219   FXListItem *getItem(FXint index) const;
00220 
00221   /// Replace the item with a [possibly subclassed] item
00222   FXint setItem(FXint index,FXListItem* item,FXbool notify=FALSE);
00223 
00224   /// Replace items text, icon, and user-data pointer
00225   FXint setItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE);
00226 
00227   /// Insert a new [possibly subclassed] item at the give index
00228   FXint insertItem(FXint index,FXListItem* item,FXbool notify=FALSE);
00229 
00230   /// Insert item at index with given text, icon, and user-data pointer
00231   FXint insertItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE);
00232 
00233   /// Append a [possibly subclassed] item to the list
00234   FXint appendItem(FXListItem* item,FXbool notify=FALSE);
00235 
00236   /// Append new item with given text and optional icon, and user-data pointer
00237   FXint appendItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE);
00238 
00239   /// Prepend a [possibly subclassed] item to the list
00240   FXint prependItem(FXListItem* item,FXbool notify=FALSE);
00241 
00242   /// Prepend new item with given text and optional icon, and user-data pointer
00243   FXint prependItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE);
00244 
00245   /// Move item from oldindex to newindex
00246   FXint moveItem(FXint newindex,FXint oldindex,FXbool notify=FALSE);
00247 
00248   /// Remove item from list
00249   void removeItem(FXint index,FXbool notify=FALSE);
00250 
00251   /// Remove all items from list
00252   void clearItems(FXbool notify=FALSE);
00253 
00254   /// Return item width
00255   FXint getItemWidth(FXint index) const;
00256 
00257   /// Return item height
00258   FXint getItemHeight(FXint index) const;
00259 
00260   /// Return index of item at x,y, if any
00261   FXint getItemAt(FXint x,FXint y) const;
00262 
00263   /// Return item hit code: 0 no hit; 1 hit the icon; 2 hit the text
00264   FXint hitItem(FXint index,FXint x,FXint y) const;
00265 
00266   /**
00267   * Search items for item by name, starting from start item; the
00268   * flags argument controls the search direction, and case sensitivity.
00269   */
00270   FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const;
00271 
00272   /// Scroll to bring item into view
00273   void makeItemVisible(FXint index);
00274 
00275   /// Change item text
00276   void setItemText(FXint index,const FXString& text);
00277 
00278   /// Return item text
00279   FXString getItemText(FXint index) const;
00280 
00281   /// Change item icon
00282   void setItemIcon(FXint index,FXIcon* icon);
00283 
00284   /// Return item icon, if any
00285   FXIcon* getItemIcon(FXint index) const;
00286 
00287   /// Change item user-data pointer
00288   void setItemData(FXint index,void* ptr);
00289 
00290   /// Return item user-data pointer
00291   void* getItemData(FXint index) const;
00292 
00293   /// Return TRUE if item is selected
00294   FXbool isItemSelected(FXint index) const;
00295 
00296   /// Return TRUE if item is current
00297   FXbool isItemCurrent(FXint index) const;
00298 
00299   /// Return TRUE if item is visible
00300   FXbool isItemVisible(FXint index) const;
00301 
00302   /// Return TRUE if item is enabled
00303   FXbool isItemEnabled(FXint index) const;
00304 
00305   /// Repaint item
00306   void updateItem(FXint index) const;
00307 
00308   /// Enable item
00309   FXbool enableItem(FXint index);
00310 
00311   /// Disable item
00312   FXbool disableItem(FXint index);
00313 
00314   /// Select item
00315   virtual FXbool selectItem(FXint index,FXbool notify=FALSE);
00316 
00317   /// Deselect item
00318   virtual FXbool deselectItem(FXint index,FXbool notify=FALSE);
00319 
00320   /// Toggle item selection state
00321   virtual FXbool toggleItem(FXint index,FXbool notify=FALSE);
00322 
00323   /// Extend selection from anchor item to index
00324   virtual FXbool extendSelection(FXint index,FXbool notify=FALSE);
00325 
00326   /// Deselect all items
00327   virtual FXbool killSelection(FXbool notify=FALSE);
00328 
00329   /// Change current item
00330   virtual void setCurrentItem(FXint index,FXbool notify=FALSE);
00331 
00332   /// Return current item, if any
00333   FXint getCurrentItem() const { return current; }
00334 
00335   /// Change anchor item
00336   void setAnchorItem(FXint index);
00337 
00338   /// Return anchor item, if any
00339   FXint getAnchorItem() const { return anchor; }
00340 
00341   /// Get item under the cursor, if any
00342   FXint getCursorItem() const { return cursor; }
00343 
00344   /// Sort items using current sort function
00345   void sortItems();
00346 
00347   /// Change text font
00348   void setFont(FXFont* fnt);
00349 
00350   /// Return text font
00351   FXFont* getFont() const { return font; }
00352 
00353   /// Return normal text color
00354   FXColor getTextColor() const { return textColor; }
00355 
00356   /// Change normal text color
00357   void setTextColor(FXColor clr);
00358 
00359   /// Return selected text background
00360   FXColor getSelBackColor() const { return selbackColor; }
00361 
00362   /// Change selected text background
00363   void setSelBackColor(FXColor clr);
00364 
00365   /// Return selected text color
00366   FXColor getSelTextColor() const { return seltextColor; }
00367 
00368   /// Change selected text color
00369   void setSelTextColor(FXColor clr);
00370 
00371   /// Return sort function
00372   FXListSortFunc getSortFunc() const { return sortfunc; }
00373 
00374   /// Change sort function
00375   void setSortFunc(FXListSortFunc func){ sortfunc=func; }
00376 
00377   /// Return list style
00378   FXuint getListStyle() const;
00379 
00380   /// Change list style
00381   void setListStyle(FXuint style);
00382 
00383   /// Set the status line help text for this list
00384   void setHelpText(const FXString& text);
00385 
00386   /// Get the status line help text for this list
00387   FXString getHelpText() const { return help; }
00388 
00389   /// Save list to a stream
00390   virtual void save(FXStream& store) const;
00391 
00392   /// Load list from a stream
00393   virtual void load(FXStream& store);
00394 
00395   /// Destructor
00396   virtual ~FXList();
00397   };
00398 
00399 }
00400 
00401 #endif

Copyright © 1997-2004 Jeroen van der Zijp