1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2012, Rene Gollent, rene@gollent.com. 4 * Distributed under the terms of the MIT License. 5 */ 6 #ifndef TREE_TABLE_H 7 #define TREE_TABLE_H 8 9 #include <vector> 10 11 #include <ColumnTypes.h> 12 #include <Variant.h> 13 14 #include "table/AbstractTable.h" 15 #include "table/TableColumn.h" 16 17 18 class TreeTable; 19 class TreeTableModel; 20 class TreeTableNode; 21 class TreeTableRow; 22 23 24 class TreeTablePath { 25 public: 26 TreeTablePath(); 27 TreeTablePath(const TreeTablePath& other); 28 TreeTablePath(const TreeTablePath& other, 29 int32 childIndex); 30 ~TreeTablePath(); 31 32 bool AddComponent(int32 childIndex); 33 int32 RemoveLastComponent(); 34 void Clear(); 35 36 int32 CountComponents() const; 37 int32 ComponentAt(int32 index) const; 38 39 TreeTablePath& operator=(const TreeTablePath& other); 40 bool operator==(const TreeTablePath& other) const; 41 bool operator!=(const TreeTablePath& other) const; 42 43 private: 44 typedef std::vector<int32> ComponentVector; 45 46 private: 47 ComponentVector fComponents; 48 }; 49 50 51 class TreeTableModelListener { 52 public: 53 virtual ~TreeTableModelListener(); 54 55 virtual void TableNodesAdded(TreeTableModel* model, 56 const TreeTablePath& path, int32 childIndex, 57 int32 count); 58 virtual void TableNodesRemoved(TreeTableModel* model, 59 const TreeTablePath& path, int32 childIndex, 60 int32 count); 61 virtual void TableNodesChanged(TreeTableModel* model, 62 const TreeTablePath& path, int32 childIndex, 63 int32 count); 64 }; 65 66 67 class TreeTableModel : public AbstractTableModelBase { 68 public: 69 virtual ~TreeTableModel(); 70 71 virtual void* Root() const = 0; 72 // the root itself isn't shown 73 74 virtual int32 CountChildren(void* parent) const = 0; 75 virtual void* ChildAt(void* parent, int32 index) const = 0; 76 77 virtual bool GetValueAt(void* object, int32 columnIndex, 78 BVariant& value) = 0; 79 80 virtual void* NodeForPath(const TreeTablePath& path) const; 81 82 virtual bool AddListener(TreeTableModelListener* listener); 83 virtual void RemoveListener( 84 TreeTableModelListener* listener); 85 86 protected: 87 typedef BObjectList<TreeTableModelListener> ListenerList; 88 89 protected: 90 void NotifyNodesAdded(const TreeTablePath& path, 91 int32 childIndex, int32 count); 92 void NotifyNodesRemoved(const TreeTablePath& path, 93 int32 childIndex, int32 count); 94 void NotifyNodesChanged(const TreeTablePath& path, 95 int32 childIndex, int32 count); 96 97 protected: 98 ListenerList fListeners; 99 }; 100 101 102 class TreeTableSelectionModel { 103 public: 104 TreeTableSelectionModel(TreeTable* table); 105 ~TreeTableSelectionModel(); 106 107 int32 CountNodes(); 108 void* NodeAt(int32 index); 109 bool GetPathAt(int32 index, TreeTablePath& _path); 110 111 private: 112 friend class TreeTable; 113 114 private: 115 void _SelectionChanged(); 116 void _Update(); 117 TreeTableNode* _NodeAt(int32 index); 118 119 private: 120 TreeTable* fTreeTable; 121 TreeTableNode** fNodes; 122 int32 fNodeCount; 123 }; 124 125 126 class TreeTableToolTipProvider { 127 public: 128 virtual ~TreeTableToolTipProvider(); 129 130 virtual bool GetToolTipForTablePath( 131 const TreeTablePath& path, 132 int32 columnIndex, BToolTip** _tip) = 0; 133 // columnIndex can be -1, if not in a column 134 }; 135 136 137 class TreeTableListener { 138 public: 139 virtual ~TreeTableListener(); 140 141 virtual void TreeTableSelectionChanged(TreeTable* table); 142 virtual void TreeTableNodeInvoked(TreeTable* table, 143 const TreeTablePath& path); 144 virtual void TreeTableNodeExpandedChanged(TreeTable* table, 145 const TreeTablePath& path, bool expanded); 146 147 virtual void TreeTableCellMouseDown(TreeTable* table, 148 const TreeTablePath& path, 149 int32 columnIndex, BPoint screenWhere, 150 uint32 buttons); 151 virtual void TreeTableCellMouseUp(TreeTable* table, 152 const TreeTablePath& path, 153 int32 columnIndex, BPoint screenWhere, 154 uint32 buttons); 155 }; 156 157 158 class TreeTable : public AbstractTable, private TreeTableModelListener { 159 public: 160 TreeTable(const char* name, uint32 flags, 161 border_style borderStyle = B_NO_BORDER, 162 bool showHorizontalScrollbar = true); 163 TreeTable(TreeTableModel* model, 164 const char* name, uint32 flags, 165 border_style borderStyle = B_NO_BORDER, 166 bool showHorizontalScrollbar = true); 167 virtual ~TreeTable(); 168 169 bool SetTreeTableModel(TreeTableModel* model); 170 TreeTableModel* GetTreeTableModel() const { return fModel; } 171 172 void SetToolTipProvider( 173 TreeTableToolTipProvider* toolTipProvider); 174 TreeTableToolTipProvider* ToolTipProvider() const 175 { return fToolTipProvider; } 176 177 TreeTableSelectionModel* SelectionModel(); 178 179 void SelectNode(const TreeTablePath& path, 180 bool extendSelection); 181 void DeselectNode(const TreeTablePath& path); 182 void DeselectAllNodes(); 183 184 bool IsNodeExpanded(const TreeTablePath& path) const; 185 void SetNodeExpanded(const TreeTablePath& path, 186 bool expanded, 187 bool expandAncestors = false); 188 189 void ScrollToNode(const TreeTablePath& path); 190 191 bool AddTreeTableListener( 192 TreeTableListener* listener); 193 void RemoveTreeTableListener( 194 TreeTableListener* listener); 195 196 protected: 197 virtual bool GetToolTipAt(BPoint point, BToolTip** _tip); 198 199 virtual void SelectionChanged(); 200 201 virtual AbstractColumn* CreateColumn(TableColumn* column); 202 203 virtual void ColumnMouseDown(AbstractColumn* column, 204 BRow* row, BField* field, 205 BPoint screenWhere, uint32 buttons); 206 virtual void ColumnMouseUp(AbstractColumn* column, 207 BRow* row, BField* field, 208 BPoint screenWhere, uint32 buttons); 209 210 private: 211 virtual void TableNodesAdded(TreeTableModel* model, 212 const TreeTablePath& path, int32 childIndex, 213 int32 count); 214 virtual void TableNodesRemoved(TreeTableModel* model, 215 const TreeTablePath& path, int32 childIndex, 216 int32 count); 217 virtual void TableNodesChanged(TreeTableModel* model, 218 const TreeTablePath& path, int32 childIndex, 219 int32 count); 220 221 private: 222 class Column; 223 224 friend class TreeTableSelectionModel; 225 226 typedef BObjectList<TreeTableListener> ListenerList; 227 228 private: 229 virtual void ExpandOrCollapse(BRow* row, bool expand); 230 virtual void ItemInvoked(); 231 232 bool _AddChildRows(TreeTableNode* parentNode, 233 int32 childIndex, int32 count, 234 int32 columnCount); 235 void _RemoveChildRows(TreeTableNode* parentNode, 236 int32 childIndex, int32 count); 237 238 void _SetNodeExpanded(TreeTableNode* node, 239 bool expanded, 240 bool expandAncestors = false); 241 242 TreeTableNode* _NodeForPath(const TreeTablePath& path) const; 243 void _GetPathForNode(TreeTableNode* node, 244 TreeTablePath& _path) const; 245 246 private: 247 TreeTableModel* fModel; 248 TreeTableToolTipProvider* fToolTipProvider; 249 TreeTableNode* fRootNode; 250 TreeTableSelectionModel fSelectionModel; 251 ListenerList fListeners; 252 int32 fIgnoreSelectionChange; 253 }; 254 255 256 #endif // TREE_TABLE_H 257