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 "elements/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
00109 static const String EventSelectionModeChanged;
00110 static const String EventNominatedSelectColumnChanged;
00111 static const String EventNominatedSelectRowChanged;
00112 static const String EventVertScrollbarModeChanged;
00113 static const String EventHorzScrollbarModeChanged;
00114 static const String EventSelectionChanged;
00115 static const String EventListContentsChanged;
00116 static const String EventSortColumnChanged;
00117 static const String EventSortDirectionChanged;
00118 static const String EventListColumnSized;
00119 static const String EventListColumnMoved;
00120
00121
00122
00123
00124 static const String VertScrollbarNameSuffix;
00125 static const String HorzScrollbarNameSuffix;
00126 static const String ListHeaderNameSuffix;
00127
00128
00129
00130
00135 enum SelectionMode
00136 {
00137 RowSingle,
00138 RowMultiple,
00139 CellSingle,
00140 CellMultiple,
00141 NominatedColumnSingle,
00142 NominatedColumnMultiple,
00143 ColumnSingle,
00144 ColumnMultiple,
00145 NominatedRowSingle,
00146 NominatedRowMultiple
00147 };
00148
00149
00150
00151
00152
00161 bool isUserSortControlEnabled(void) const;
00162
00163
00171 bool isUserColumnSizingEnabled(void) const;
00172
00173
00181 bool isUserColumnDraggingEnabled(void) const;
00182
00183
00191 uint getColumnCount(void) const;
00192
00193
00201 uint getRowCount(void) const;
00202
00203
00214 uint getSortColumn(void) const;
00215
00216
00229 uint getColumnWithID(uint col_id) const;
00230
00231
00244 uint getColumnWithHeaderText(const String& text) const;
00245
00246
00254 UDim getTotalColumnHeadersWidth(void) const;
00255
00256
00269 UDim getColumnHeaderWidth(uint col_idx) const;
00270
00271
00279 ListHeaderSegment::SortDirection getSortDirection(void) const;
00280
00281
00294 ListHeaderSegment& getHeaderSegmentForColumn(uint col_idx) const;
00295
00296
00309 uint getItemRowIndex(const ListboxItem* item) const;
00310
00311
00324 uint getItemColumnIndex(const ListboxItem* item) const;
00325
00326
00339 MCLGridRef getItemGridReference(const ListboxItem* item) const;
00340
00341
00354 ListboxItem* getItemAtGridReference(const MCLGridRef& grid_ref) const;
00355
00356
00373 bool isListboxItemInColumn(const ListboxItem* item, uint col_idx) const;
00374
00375
00392 bool isListboxItemInRow(const ListboxItem* item, uint row_idx) const;
00393
00394
00406 bool isListboxItemInList(const ListboxItem* item) const;
00407
00408
00427 ListboxItem* findColumnItemWithText(const String& text, uint col_idx, const ListboxItem* start_item) const;
00428
00429
00448 ListboxItem* findRowItemWithText(const String& text, uint row_idx, const ListboxItem* start_item) const;
00449
00450
00469 ListboxItem* findListItemWithText(const String& text, const ListboxItem* start_item) const;
00470
00471
00482 ListboxItem* getFirstSelectedItem(void) const;
00483
00484
00500 ListboxItem* getNextSelected(const ListboxItem* start_item) const;
00501
00502
00510 uint getSelectedCount(void) const;
00511
00512
00526 bool isItemSelected(const MCLGridRef& grid_ref) const;
00527
00528
00540 uint getNominatedSelectionColumnID(void) const;
00541
00542
00551 uint getNominatedSelectionColumn(void) const;
00552
00553
00562 uint getNominatedSelectionRow(void) const;
00563
00564
00572 MultiColumnList::SelectionMode getSelectionMode(void) const;
00573
00574
00583 bool isVertScrollbarAlwaysShown(void) const;
00584
00585
00594 bool isHorzScrollbarAlwaysShown(void) const;
00595
00596
00609 uint getColumnID(uint col_idx) const;
00610
00611
00624 uint getRowID(uint row_idx) const;
00625
00626
00639 uint getRowWithID(uint row_id) const;
00640
00641
00651 Rect getListRenderArea(void) const;
00652
00653
00665 Scrollbar* getVertScrollbar() const;
00666
00678 Scrollbar* getHorzScrollbar() const;
00679
00691 ListHeader* getListHeader() const;
00692
00697 float getTotalRowsHeight(void) const;
00698
00703 float getWidestColumnItemWidth(uint col_idx) const;
00704
00709 float getHighestRowItemHeight(uint row_idx) const;
00710
00711
00712
00713
00724 virtual void initialiseComponents(void);
00725
00726
00733 void resetList(void);
00734
00735
00752 void addColumn(const String& text, uint col_id, const UDim& width);
00753
00754
00775 void insertColumn(const String& text, uint col_id, const UDim& width, uint position);
00776
00777
00790 void removeColumn(uint col_idx);
00791
00792
00805 void removeColumnWithID(uint col_id);
00806
00807
00823 void moveColumn(uint col_idx, uint position);
00824
00825
00841 void moveColumnWithID(uint col_id, uint position);
00842
00843
00858 uint addRow(uint row_id = 0);
00859
00860
00883 uint addRow(ListboxItem* item, uint col_id, uint row_id = 0);
00884
00885
00904 uint insertRow(uint row_idx, uint row_id = 0);
00905
00906
00933 uint insertRow(ListboxItem* item, uint col_id, uint row_idx, uint row_id = 0);
00934
00935
00948 void removeRow(uint row_idx);
00949
00950
00966 void setItem(ListboxItem* item, const MCLGridRef& position);
00967
00968
00987 void setItem(ListboxItem* item, uint col_id, uint row_idx);
00988
00989
01002 void setSelectionMode(MultiColumnList::SelectionMode sel_mode);
01003
01004
01017 void setNominatedSelectionColumnID(uint col_id);
01018
01019
01032 void setNominatedSelectionColumn(uint col_idx);
01033
01034
01047 void setNominatedSelectionRow(uint row_idx);
01048
01049
01060 void setSortDirection(ListHeaderSegment::SortDirection direction);
01061
01062
01075 void setSortColumn(uint col_idx);
01076
01077
01090 void setSortColumnByID(uint col_id);
01091
01092
01104 void setShowVertScrollbar(bool setting);
01105
01106
01118 void setShowHorzScrollbar(bool setting);
01119
01120
01128 void clearAllSelections(void);
01129
01130
01151 void setItemSelectState(ListboxItem* item, bool state);
01152
01153
01174 void setItemSelectState(const MCLGridRef& grid_ref, bool state);
01175
01176
01185 void handleUpdatedItemData(void);
01186
01187
01203 void setColumnHeaderWidth(uint col_idx, const UDim& width);
01204
01205
01217 void setUserSortControlEnabled(bool setting);
01218
01219
01231 void setUserColumnSizingEnabled(bool setting);
01232
01233
01242 void setUserColumnDraggingEnabled(bool setting);
01243
01244
01258 void autoSizeColumnHeader(uint col_idx);
01259
01260
01276 void setRowID(uint row_idx, uint row_id);
01277
01278
01279
01280
01281
01286 MultiColumnList(const String& type, const String& name);
01287
01288
01293 virtual ~MultiColumnList(void);
01294
01295
01296 protected:
01297
01298
01299
01309
01310
01311
01312
01313
01314
01319 void configureScrollbars(void);
01320
01321
01326 bool selectRange(const MCLGridRef& start, const MCLGridRef& end);
01327
01328
01336 bool clearAllSelections_impl(void);
01337
01338
01347 ListboxItem* getItemAtPoint(const Point& pt) const;
01348
01349
01356 bool setItemSelectState_impl(const MCLGridRef grid_ref, bool state);
01357
01358
01363 void setSelectForItemsInRow(uint row_idx, bool state);
01364
01365
01370 void setSelectForItemsInColumn(uint col_idx, bool state);
01371
01372
01380 void moveColumn_impl(uint col_idx, uint position);
01381
01382
01394 bool resetList_impl(void);
01395
01396
01407 virtual bool testClassName_impl(const String& class_name) const
01408 {
01409 if (class_name=="MultiColumnList") return true;
01410 return Window::testClassName_impl(class_name);
01411 }
01412
01413
01414
01415 virtual bool validateWindowRenderer(const String& name) const
01416 {
01417 return (name == "MultiColumnList");
01418 }
01419
01420
01421 int writePropertiesXML(XMLSerializer& xml_stream) const;
01422
01427 void resortList();
01428
01429
01430
01431
01436 virtual void onSelectionModeChanged(WindowEventArgs& e);
01437
01438
01443 virtual void onNominatedSelectColumnChanged(WindowEventArgs& e);
01444
01445
01450 virtual void onNominatedSelectRowChanged(WindowEventArgs& e);
01451
01452
01457 virtual void onVertScrollbarModeChanged(WindowEventArgs& e);
01458
01459
01464 virtual void onHorzScrollbarModeChanged(WindowEventArgs& e);
01465
01466
01471 virtual void onSelectionChanged(WindowEventArgs& e);
01472
01473
01478 virtual void onListContentsChanged(WindowEventArgs& e);
01479
01480
01485 virtual void onSortColumnChanged(WindowEventArgs& e);
01486
01487
01492 virtual void onSortDirectionChanged(WindowEventArgs& e);
01493
01494
01499 virtual void onListColumnSized(WindowEventArgs& e);
01500
01501
01506 virtual void onListColumnMoved(WindowEventArgs& e);
01507
01508
01509
01510
01511
01512 virtual void onFontChanged(WindowEventArgs& e);
01513 virtual void onSized(WindowEventArgs& e);
01514 virtual void onMouseButtonDown(MouseEventArgs& e);
01515 virtual void onMouseWheel(MouseEventArgs& e);
01516
01517
01518
01519
01520
01521 bool handleHeaderScroll(const EventArgs& e);
01522 bool handleHeaderSegMove(const EventArgs& e);
01523 bool handleColumnSizeChange(const EventArgs& e);
01524 bool handleHorzScrollbar(const EventArgs& e);
01525 bool handleVertScrollbar(const EventArgs& e);
01526 bool handleSortColumnChange(const EventArgs& e);
01527 bool handleSortDirectionChange(const EventArgs& e);
01528 bool handleHeaderSegDblClick(const EventArgs& e);
01529
01535 struct ListRow
01536 {
01537 typedef std::vector<ListboxItem*> RowItems;
01538 RowItems d_items;
01539 uint d_sortColumn;
01540 uint d_rowID;
01541
01542
01543 ListboxItem* const& operator[](uint idx) const {return d_items[idx];}
01544 ListboxItem*& operator[](uint idx) {return d_items[idx];}
01545 bool operator<(const ListRow& rhs) const;
01546 bool operator>(const ListRow& rhs) const;
01547 };
01548
01549
01554 static bool pred_descend(const ListRow& a, const ListRow& b);
01555
01556
01557
01558
01559
01560
01561 bool d_forceVertScroll;
01562 bool d_forceHorzScroll;
01563
01564
01565 SelectionMode d_selectMode;
01566 uint d_nominatedSelectCol;
01567 uint d_nominatedSelectRow;
01568 bool d_multiSelect;
01569 bool d_fullRowSelect;
01570 bool d_fullColSelect;
01571 bool d_useNominatedRow;
01572 bool d_useNominatedCol;
01573 ListboxItem* d_lastSelected;
01574
01575 uint d_columnCount;
01576
01577
01578 typedef std::vector<ListRow> ListItemGrid;
01579 ListItemGrid d_grid;
01580
01581 friend class MultiColumnListWindowRenderer;
01582
01583
01584 private:
01585
01586
01587
01588 static MultiColumnListProperties::ColumnsMovable d_columnsMovableProperty;
01589 static MultiColumnListProperties::ColumnsSizable d_columnsSizableProperty;
01590 static MultiColumnListProperties::ForceHorzScrollbar d_forceHorzScrollProperty;
01591 static MultiColumnListProperties::ForceVertScrollbar d_forceVertScrollProperty;
01592 static MultiColumnListProperties::NominatedSelectionColumnID d_nominatedSelectColProperty;
01593 static MultiColumnListProperties::NominatedSelectionRow d_nominatedSelectRowProperty;
01594 static MultiColumnListProperties::SelectionMode d_selectModeProperty;
01595 static MultiColumnListProperties::SortColumnID d_sortColumnIDProperty;
01596 static MultiColumnListProperties::SortDirection d_sortDirectionProperty;
01597 static MultiColumnListProperties::SortSettingEnabled d_sortSettingProperty;
01598 static MultiColumnListProperties::ColumnHeader d_columnHeaderProperty;
01599 static MultiColumnListProperties::RowCount d_rowCountProperty;
01600
01601
01602
01603
01604
01605 void addMultiColumnListProperties(void);
01606 };
01607
01608 }
01609
01610 #if defined(_MSC_VER)
01611 # pragma warning(pop)
01612 #endif
01613
01614 #endif // end of guard _CEGUIMultiColumnList_h_