00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _CEGUIMultiColumnList_h_
00031 #define _CEGUIMultiColumnList_h_
00032
00033 #include "../CEGUIBase.h"
00034 #include "../CEGUIWindow.h"
00035 #include "CEGUIListHeader.h"
00036 #include "CEGUIMultiColumnListProperties.h"
00037
00038
00039 #if defined(_MSC_VER)
00040 # pragma warning(push)
00041 # pragma warning(disable : 4251)
00042 #endif
00043
00044
00045
00046 namespace CEGUI
00047 {
00048
00053 struct CEGUIEXPORT MCLGridRef
00054 {
00055 MCLGridRef(uint r, uint c) : row(r), column(c) {}
00056
00057 uint row;
00058 uint column;
00059
00060
00061 MCLGridRef& operator=(const MCLGridRef& rhs);
00062 bool operator<(const MCLGridRef& rhs) const;
00063 bool operator<=(const MCLGridRef& rhs) const;
00064 bool operator>(const MCLGridRef& rhs) const;
00065 bool operator>=(const MCLGridRef& rhs) const;
00066 bool operator==(const MCLGridRef& rhs) const;
00067 bool operator!=(const MCLGridRef& rhs) const;
00068 };
00069
00074 class CEGUIEXPORT MultiColumnListWindowRenderer : public WindowRenderer
00075 {
00076 public:
00081 MultiColumnListWindowRenderer(const String& name);
00082
00092 virtual Rect getListRenderArea(void) const = 0;
00093 };
00094
00099 class CEGUIEXPORT MultiColumnList : public Window
00100 {
00101 public:
00102 static const String EventNamespace;
00103 static const String WidgetTypeName;
00104
00105
00106
00107
00108
00114 static const String EventSelectionModeChanged;
00120 static const String EventNominatedSelectColumnChanged;
00126 static const String EventNominatedSelectRowChanged;
00132 static const String EventVertScrollbarModeChanged;
00138 static const String EventHorzScrollbarModeChanged;
00144 static const String EventSelectionChanged;
00150 static const String EventListContentsChanged;
00156 static const String EventSortColumnChanged;
00162 static const String EventSortDirectionChanged;
00168 static const String EventListColumnSized;
00174 static const String EventListColumnMoved;
00175
00176
00177
00178
00179 static const String VertScrollbarNameSuffix;
00180 static const String HorzScrollbarNameSuffix;
00181 static const String ListHeaderNameSuffix;
00182
00183
00184
00185
00190 enum SelectionMode
00191 {
00192 RowSingle,
00193 RowMultiple,
00194 CellSingle,
00195 CellMultiple,
00196 NominatedColumnSingle,
00197 NominatedColumnMultiple,
00198 ColumnSingle,
00199 ColumnMultiple,
00200 NominatedRowSingle,
00201 NominatedRowMultiple
00202 };
00203
00204
00205
00206
00207
00216 bool isUserSortControlEnabled(void) const;
00217
00218
00226 bool isUserColumnSizingEnabled(void) const;
00227
00228
00236 bool isUserColumnDraggingEnabled(void) const;
00237
00238
00246 uint getColumnCount(void) const;
00247
00248
00256 uint getRowCount(void) const;
00257
00258
00269 uint getSortColumn(void) const;
00270
00271
00284 uint getColumnWithID(uint col_id) const;
00285
00286
00299 uint getColumnWithHeaderText(const String& text) const;
00300
00301
00309 UDim getTotalColumnHeadersWidth(void) const;
00310
00311
00324 UDim getColumnHeaderWidth(uint col_idx) const;
00325
00326
00334 ListHeaderSegment::SortDirection getSortDirection(void) const;
00335
00336
00349 ListHeaderSegment& getHeaderSegmentForColumn(uint col_idx) const;
00350
00351
00364 uint getItemRowIndex(const ListboxItem* item) const;
00365
00366
00379 uint getItemColumnIndex(const ListboxItem* item) const;
00380
00381
00394 MCLGridRef getItemGridReference(const ListboxItem* item) const;
00395
00396
00409 ListboxItem* getItemAtGridReference(const MCLGridRef& grid_ref) const;
00410
00411
00428 bool isListboxItemInColumn(const ListboxItem* item, uint col_idx) const;
00429
00430
00447 bool isListboxItemInRow(const ListboxItem* item, uint row_idx) const;
00448
00449
00461 bool isListboxItemInList(const ListboxItem* item) const;
00462
00463
00482 ListboxItem* findColumnItemWithText(const String& text, uint col_idx, const ListboxItem* start_item) const;
00483
00484
00503 ListboxItem* findRowItemWithText(const String& text, uint row_idx, const ListboxItem* start_item) const;
00504
00505
00524 ListboxItem* findListItemWithText(const String& text, const ListboxItem* start_item) const;
00525
00526
00537 ListboxItem* getFirstSelectedItem(void) const;
00538
00539
00555 ListboxItem* getNextSelected(const ListboxItem* start_item) const;
00556
00557
00565 uint getSelectedCount(void) const;
00566
00567
00581 bool isItemSelected(const MCLGridRef& grid_ref) const;
00582
00583
00595 uint getNominatedSelectionColumnID(void) const;
00596
00597
00606 uint getNominatedSelectionColumn(void) const;
00607
00608
00617 uint getNominatedSelectionRow(void) const;
00618
00619
00627 MultiColumnList::SelectionMode getSelectionMode(void) const;
00628
00629
00638 bool isVertScrollbarAlwaysShown(void) const;
00639
00640
00649 bool isHorzScrollbarAlwaysShown(void) const;
00650
00651
00664 uint getColumnID(uint col_idx) const;
00665
00666
00679 uint getRowID(uint row_idx) const;
00680
00681
00694 uint getRowWithID(uint row_id) const;
00695
00696
00706 Rect getListRenderArea(void) const;
00707
00708
00720 Scrollbar* getVertScrollbar() const;
00721
00733 Scrollbar* getHorzScrollbar() const;
00734
00746 ListHeader* getListHeader() const;
00747
00752 float getTotalRowsHeight(void) const;
00753
00758 float getWidestColumnItemWidth(uint col_idx) const;
00759
00764 float getHighestRowItemHeight(uint row_idx) const;
00765
00766
00767
00768
00779 virtual void initialiseComponents(void);
00780
00781
00788 void resetList(void);
00789
00790
00807 void addColumn(const String& text, uint col_id, const UDim& width);
00808
00809
00830 void insertColumn(const String& text, uint col_id, const UDim& width, uint position);
00831
00832
00845 void removeColumn(uint col_idx);
00846
00847
00860 void removeColumnWithID(uint col_id);
00861
00862
00878 void moveColumn(uint col_idx, uint position);
00879
00880
00896 void moveColumnWithID(uint col_id, uint position);
00897
00898
00913 uint addRow(uint row_id = 0);
00914
00915
00938 uint addRow(ListboxItem* item, uint col_id, uint row_id = 0);
00939
00940
00959 uint insertRow(uint row_idx, uint row_id = 0);
00960
00961
00988 uint insertRow(ListboxItem* item, uint col_id, uint row_idx, uint row_id = 0);
00989
00990
01003 void removeRow(uint row_idx);
01004
01005
01021 void setItem(ListboxItem* item, const MCLGridRef& position);
01022
01023
01042 void setItem(ListboxItem* item, uint col_id, uint row_idx);
01043
01044
01057 void setSelectionMode(MultiColumnList::SelectionMode sel_mode);
01058
01059
01072 void setNominatedSelectionColumnID(uint col_id);
01073
01074
01087 void setNominatedSelectionColumn(uint col_idx);
01088
01089
01102 void setNominatedSelectionRow(uint row_idx);
01103
01104
01115 void setSortDirection(ListHeaderSegment::SortDirection direction);
01116
01117
01130 void setSortColumn(uint col_idx);
01131
01132
01145 void setSortColumnByID(uint col_id);
01146
01147
01159 void setShowVertScrollbar(bool setting);
01160
01161
01173 void setShowHorzScrollbar(bool setting);
01174
01175
01183 void clearAllSelections(void);
01184
01185
01206 void setItemSelectState(ListboxItem* item, bool state);
01207
01208
01229 void setItemSelectState(const MCLGridRef& grid_ref, bool state);
01230
01231
01240 void handleUpdatedItemData(void);
01241
01242
01258 void setColumnHeaderWidth(uint col_idx, const UDim& width);
01259
01260
01272 void setUserSortControlEnabled(bool setting);
01273
01274
01286 void setUserColumnSizingEnabled(bool setting);
01287
01288
01297 void setUserColumnDraggingEnabled(bool setting);
01298
01299
01313 void autoSizeColumnHeader(uint col_idx);
01314
01315
01331 void setRowID(uint row_idx, uint row_id);
01332
01333
01334
01335
01336
01341 MultiColumnList(const String& type, const String& name);
01342
01343
01348 virtual ~MultiColumnList(void);
01349
01350
01351 protected:
01352
01353
01354
01364
01365
01366
01367
01368
01369
01374 void configureScrollbars(void);
01375
01376
01381 bool selectRange(const MCLGridRef& start, const MCLGridRef& end);
01382
01383
01391 bool clearAllSelections_impl(void);
01392
01393
01402 ListboxItem* getItemAtPoint(const Point& pt) const;
01403
01404
01411 bool setItemSelectState_impl(const MCLGridRef grid_ref, bool state);
01412
01413
01418 void setSelectForItemsInRow(uint row_idx, bool state);
01419
01420
01425 void setSelectForItemsInColumn(uint col_idx, bool state);
01426
01427
01435 void moveColumn_impl(uint col_idx, uint position);
01436
01437
01449 bool resetList_impl(void);
01450
01451
01462 virtual bool testClassName_impl(const String& class_name) const
01463 {
01464 if (class_name=="MultiColumnList") return true;
01465 return Window::testClassName_impl(class_name);
01466 }
01467
01468
01469
01470 virtual bool validateWindowRenderer(const String& name) const
01471 {
01472 return (name == "MultiColumnList");
01473 }
01474
01475
01476 int writePropertiesXML(XMLSerializer& xml_stream) const;
01477
01482 void resortList();
01483
01484
01485
01486
01491 virtual void onSelectionModeChanged(WindowEventArgs& e);
01492
01493
01498 virtual void onNominatedSelectColumnChanged(WindowEventArgs& e);
01499
01500
01505 virtual void onNominatedSelectRowChanged(WindowEventArgs& e);
01506
01507
01512 virtual void onVertScrollbarModeChanged(WindowEventArgs& e);
01513
01514
01519 virtual void onHorzScrollbarModeChanged(WindowEventArgs& e);
01520
01521
01526 virtual void onSelectionChanged(WindowEventArgs& e);
01527
01528
01533 virtual void onListContentsChanged(WindowEventArgs& e);
01534
01535
01540 virtual void onSortColumnChanged(WindowEventArgs& e);
01541
01542
01547 virtual void onSortDirectionChanged(WindowEventArgs& e);
01548
01549
01554 virtual void onListColumnSized(WindowEventArgs& e);
01555
01556
01561 virtual void onListColumnMoved(WindowEventArgs& e);
01562
01563
01564
01565
01566
01567 virtual void onFontChanged(WindowEventArgs& e);
01568 virtual void onSized(WindowEventArgs& e);
01569 virtual void onMouseButtonDown(MouseEventArgs& e);
01570 virtual void onMouseWheel(MouseEventArgs& e);
01571
01572
01573
01574
01575
01576 bool handleHeaderScroll(const EventArgs& e);
01577 bool handleHeaderSegMove(const EventArgs& e);
01578 bool handleColumnSizeChange(const EventArgs& e);
01579 bool handleHorzScrollbar(const EventArgs& e);
01580 bool handleVertScrollbar(const EventArgs& e);
01581 bool handleSortColumnChange(const EventArgs& e);
01582 bool handleSortDirectionChange(const EventArgs& e);
01583 bool handleHeaderSegDblClick(const EventArgs& e);
01584
01590 struct ListRow
01591 {
01592 typedef std::vector<ListboxItem*> RowItems;
01593 RowItems d_items;
01594 uint d_sortColumn;
01595 uint d_rowID;
01596
01597
01598 ListboxItem* const& operator[](uint idx) const {return d_items[idx];}
01599 ListboxItem*& operator[](uint idx) {return d_items[idx];}
01600 bool operator<(const ListRow& rhs) const;
01601 bool operator>(const ListRow& rhs) const;
01602 };
01603
01604
01609 static bool pred_descend(const ListRow& a, const ListRow& b);
01610
01611
01612
01613
01614
01615
01616 bool d_forceVertScroll;
01617 bool d_forceHorzScroll;
01618
01619
01620 SelectionMode d_selectMode;
01621 uint d_nominatedSelectCol;
01622 uint d_nominatedSelectRow;
01623 bool d_multiSelect;
01624 bool d_fullRowSelect;
01625 bool d_fullColSelect;
01626 bool d_useNominatedRow;
01627 bool d_useNominatedCol;
01628 ListboxItem* d_lastSelected;
01629
01630 uint d_columnCount;
01631
01632
01633 typedef std::vector<ListRow> ListItemGrid;
01634 ListItemGrid d_grid;
01635
01636 friend class MultiColumnListWindowRenderer;
01637
01638
01639 private:
01640
01641
01642
01643 static MultiColumnListProperties::ColumnsMovable d_columnsMovableProperty;
01644 static MultiColumnListProperties::ColumnsSizable d_columnsSizableProperty;
01645 static MultiColumnListProperties::ForceHorzScrollbar d_forceHorzScrollProperty;
01646 static MultiColumnListProperties::ForceVertScrollbar d_forceVertScrollProperty;
01647 static MultiColumnListProperties::NominatedSelectionColumnID d_nominatedSelectColProperty;
01648 static MultiColumnListProperties::NominatedSelectionRow d_nominatedSelectRowProperty;
01649 static MultiColumnListProperties::SelectionMode d_selectModeProperty;
01650 static MultiColumnListProperties::SortColumnID d_sortColumnIDProperty;
01651 static MultiColumnListProperties::SortDirection d_sortDirectionProperty;
01652 static MultiColumnListProperties::SortSettingEnabled d_sortSettingProperty;
01653 static MultiColumnListProperties::ColumnHeader d_columnHeaderProperty;
01654 static MultiColumnListProperties::RowCount d_rowCountProperty;
01655
01656
01657
01658
01659
01660 void addMultiColumnListProperties(void);
01661 };
01662
01663 }
01664
01665 #if defined(_MSC_VER)
01666 # pragma warning(pop)
01667 #endif
01668
01669 #endif // end of guard _CEGUIMultiColumnList_h_