Crazy Eddie's GUI System  0.8.4
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Pages
widgets/Tree.h
1 /***********************************************************************
2  created: 5-13-07
3  author: Jonathan Welch (Based on Code by David Durant)
4  *************************************************************************/
5 /***************************************************************************
6  * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining
9  * a copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sublicense, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be
17  * included in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  * OTHER DEALINGS IN THE SOFTWARE.
26  ***************************************************************************/
27 #ifndef _CEGUITree_h_
28 #define _CEGUITree_h_
29 
30 #include "../Base.h"
31 #include "../Window.h"
32 #include "../WindowManager.h"
33 #include "./TreeItem.h"
34 #include "./Scrollbar.h"
35 #include <vector>
36 
37 #if defined(_MSC_VER)
38 # pragma warning(push)
39 # pragma warning(disable : 4251)
40 #endif
41 
42 // Start of CEGUI namespace section
43 namespace CEGUI
44 {
50 class CEGUIEXPORT TreeEventArgs : public WindowEventArgs
51 {
52 public:
54  { treeItem = 0; }
55 
56  TreeItem *treeItem;
57 };
58 
59 
74 class CEGUIEXPORT Tree : public Window
75 {
76  friend class TreeItem;
77 
78  typedef std::vector<TreeItem*
79  CEGUI_VECTOR_ALLOC(TreeItem*)> LBItemList;
80 
81 public:
83  static const String EventNamespace;
84  static const String WidgetTypeName;
85 
86  /*************************************************************************
87  Constants
88  *************************************************************************/
89  // event names
134  static const String EventBranchOpened;
141  static const String EventBranchClosed;
142 
143  //Render the actual tree
144  void doTreeRender()
145  { populateGeometryBuffer(); }
146 
147  //UpdateScrollbars
148  void doScrollbars()
149  { configureScrollbars(); }
150 
151  /*************************************************************************
152  Accessor Methods
153  *************************************************************************/
161  size_t getItemCount(void) const
162  { return d_listItems.size(); }
163 
171  size_t getSelectedCount(void) const;
172 
181  TreeItem* getFirstSelectedItem(void) const;
182 
192  TreeItem* getLastSelectedItem(void) const
193  { return d_lastSelected; }
194 
212  TreeItem* getNextSelected(const TreeItem* start_item) const;
213 
214  TreeItem* getNextSelectedItemFromList(const LBItemList &itemList,
215  const TreeItem* start_item,
216  bool& foundStartItem) const;
217 
226  bool isSortEnabled(void) const
227  { return d_sorted; }
228 
229  void setItemRenderArea(Rectf& r)
230  { d_itemArea = r; }
231 
232  Scrollbar* getVertScrollbar()
233  { return d_vertScrollbar; }
234 
235  Scrollbar* getHorzScrollbar()
236  { return d_horzScrollbar; }
237 
245  bool isMultiselectEnabled(void) const
246  { return d_multiselect; }
247 
248  bool isItemTooltipsEnabled(void) const
249  { return d_itemTooltips; }
250 
270  TreeItem* findFirstItemWithText(const String& text);
271 
272  TreeItem* findNextItemWithText(const String& text,
273  const TreeItem* start_item);
274 
275  TreeItem* findItemWithTextFromList(const LBItemList &itemList,
276  const String& text,
277  const TreeItem* start_item,
278  bool foundStartItem);
279 
299  TreeItem* findFirstItemWithID(uint searchID);
300  TreeItem* findNextItemWithID(uint searchID, const TreeItem* start_item);
301  TreeItem* findItemWithIDFromList(const LBItemList &itemList, uint searchID,
302  const TreeItem* start_item,
303  bool foundStartItem);
304 
313  bool isTreeItemInList(const TreeItem* item) const;
314 
323  bool isVertScrollbarAlwaysShown(void) const;
324 
333  bool isHorzScrollbarAlwaysShown(void) const;
334 
335  /*************************************************************************
336  Manipulator Methods
337  *************************************************************************/
349  virtual void initialise(void);
350 
357  void resetList(void);
358 
371  void addItem(TreeItem* item);
372 
396  void insertItem(TreeItem* item, const TreeItem* position);
397 
410  void removeItem(const TreeItem* item);
411 
419  void clearAllSelections(void);
420  bool clearAllSelectionsFromList(const LBItemList &itemList);
421 
433  void setSortingEnabled(bool setting);
434 
447  void setMultiselectEnabled(bool setting);
448 
462  void setShowVertScrollbar(bool setting);
463 
477  void setShowHorzScrollbar(bool setting);
478 
479  void setItemTooltipsEnabled(bool setting);
480 
504  void setItemSelectState(TreeItem* item, bool state);
505 
529  void setItemSelectState(size_t item_index, bool state);
530 
548  virtual void setLookNFeel(const String& look);
549 
563  void handleUpdatedItemData(void);
564 
578  void ensureItemIsVisible(const TreeItem* item);
579 
580 
581  /*************************************************************************
582  Construction and Destruction
583  *************************************************************************/
588  Tree(const String& type, const String& name);
589 
594  virtual ~Tree(void);
595 
596 protected:
597  /*************************************************************************
598  Abstract Implementation Functions (must be provided by derived class)
599  *************************************************************************/
609  virtual Rectf getTreeRenderArea(void) const
610  { return d_itemArea; }
611 
623  virtual Scrollbar* createVertScrollbar(const String& name) const
624  { return static_cast<Scrollbar*>(getChild(name)); }
625 
637  virtual Scrollbar* createHorzScrollbar(const String& name) const
638  { return static_cast<Scrollbar*>(getChild(name)); }
639 
650  virtual void cacheTreeBaseImagery()
651  {}
652 
653  /*************************************************************************
654  Implementation Functions
655  *************************************************************************/
660  bool containsOpenItemRecursive(const LBItemList& itemList, TreeItem* item);
661 
666  void addTreeEvents(void);
667 
668 
674  void configureScrollbars(void);
675 
681  void selectRange(size_t start, size_t end);
682 
687  float getTotalItemsHeight(void) const;
688  void getTotalItemsInListHeight(const LBItemList &itemList,
689  float *heightSum) const;
690 
695  float getWidestItemWidth(void) const;
696  void getWidestItemWidthInList(const LBItemList &itemList, int itemDepth,
697  float *widest) const;
698 
707  bool getHeightToItemInList(const LBItemList &itemList,
708  const TreeItem *treeItem,
709  int itemDepth,
710  float *height) const;
711 
720  bool clearAllSelections_impl(void);
721 
730  TreeItem* getItemAtPoint(const Vector2f& pt) const;
731  TreeItem* getItemFromListAtPoint(const LBItemList &itemList, float *bottomY,
732  const Vector2f& pt) const;
733 
745  bool resetList_impl(void);
746 
752  bool handle_scrollChange(const EventArgs& args);
753 
754  // overridden from Window base class.
755  virtual void populateGeometryBuffer();
756  bool handleFontRenderSizeChange(const EventArgs& args);
757 
758  void drawItemList(LBItemList& itemList, Rectf& itemsArea, float widest,
759  Vector2f& itemPos, GeometryBuffer& geometry, float alpha);
760 
761  /*************************************************************************
762  New event handlers
763  *************************************************************************/
768  virtual void onListContentsChanged(WindowEventArgs& e);
769 
775  virtual void onSelectionChanged(TreeEventArgs& e);
776 
781  virtual void onSortModeChanged(WindowEventArgs& e);
782 
787  virtual void onMultiselectModeChanged(WindowEventArgs& e);
788 
794  virtual void onVertScrollbarModeChanged(WindowEventArgs& e);
795 
801  virtual void onHorzScrollbarModeChanged(WindowEventArgs& e);
802 
807  virtual void onBranchOpened(TreeEventArgs& e);
808 
813  virtual void onBranchClosed(TreeEventArgs& e);
814 
815  /*************************************************************************
816  Overridden Event handlers
817  *************************************************************************/
818  virtual void onSized(ElementEventArgs& e);
819  virtual void onMouseButtonDown(MouseEventArgs& e);
820  virtual void onMouseWheel(MouseEventArgs& e);
821  virtual void onMouseMove(MouseEventArgs& e);
822 
823  /*************************************************************************
824  Implementation Data
825  *************************************************************************/
827  bool d_sorted;
841  LBItemList d_listItems;
844  const ImagerySection* d_openButtonImagery;
845  const ImagerySection* d_closeButtonImagery;
846 
847 private:
848  /*************************************************************************
849  Private methods
850  *************************************************************************/
851  void addTreeProperties(void);
852  Rectf d_itemArea;
853 };
854 
860 bool lbi_less(const TreeItem* a, const TreeItem* b);
861 
862 
868 bool lbi_greater(const TreeItem* a, const TreeItem* b);
869 
870 } // End of CEGUI namespace section
871 
872 
873 #if defined(_MSC_VER)
874 # pragma warning(pop)
875 #endif
876 
877 #endif // end of guard _CEGUITree_h_