/*!
@file
@author Albert Semenov
@date 04/2008
@module
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see .
*/
#ifndef __MYGUI_MULTI_LIST_H__
#define __MYGUI_MULTI_LIST_H__
#include "MyGUI_Prerequest.h"
#include "MyGUI_Widget.h"
#include "MyGUI_List.h"
#include "MyGUI_Any.h"
#include "MyGUI_BiIndexBase.h"
#include "MyGUI_EventPair.h"
namespace MyGUI
{
//OBSOLETE
typedef delegates::CDelegate5 EventHandle_WidgetIntUTFStringUTFStringBool;
typedef delegates::CDelegate5 EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef;
typedef delegates::CDelegate2 EventHandle_MultiListPtrSizeT;
class MYGUI_EXPORT MultiList :
public Widget,
public BiIndexBase
{
MYGUI_RTTI_DERIVED( MultiList )
public:
MultiList();
//------------------------------------------------------------------------------//
// Methods for work with columns (RU:методы для работы со столбцами)
//------------------------------------------------------------------------------//
// манипуляции айтемами
//! Get number of columns
size_t getColumnCount() { return mVectorColumnInfo.size(); }
/** Insert new column
@param _column New column will be inserted before _column
@param _name Name of new column
@param _width Width of new column
*/
void insertColumnAt(size_t _column, const UString& _name, int _width, Any _data = Any::Null);
/** Add new column at last position
@param _width Width of new column
@param _name Name of new column
*/
void addColumn(const UString& _name, int _width, Any _data = Any::Null) { insertColumnAt(ITEM_NONE, _name, _width, _data); }
/** Delete column */
void removeColumnAt(size_t _column);
/** Delete all columns */
void removeAllColumns();
//------------------------------------------------------------------------------//
// манипуляции отображением
/** Set column name
@param _column Index of column
@param _name New name of column
*/
void setColumnNameAt(size_t _column, const UString& _name);
/** Set column width
@param _column Index of column
@param _name New width of column
*/
void setColumnWidthAt(size_t _column, int _width);
/** Get _column name */
const UString& getColumnNameAt(size_t _column);
/** Get _column width */
int getColumnWidthAt(size_t _column);
/** Sort multilist by column */
void sortByColumn(size_t _column, bool _backward = false);
//------------------------------------------------------------------------------//
// манипуляции данными
//! Replace an item data at a specified position
void setColumnDataAt(size_t _index, Any _data);
//! Clear an item data at a specified position
void clearColumnDataAt(size_t _index) { setColumnDataAt(_index, Any::Null); }
//! Get item data from specified position
template
ValueType * getColumnDataAt(size_t _index, bool _throw = true)
{
MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::getItemDataAt");
return mVectorColumnInfo[_index].data.castType(_throw);
}
//------------------------------------------------------------------------------//
// Methods for work with lines (RU:методы для работы со строками)
/** @note
All indexes used here is indexes of unsorted Multilist. Even if you sorted
it - all items indexes will be same as before sort.
*/
//------------------------------------------------------------------------------//
// манипуляции айтемами
/** Get number of items (lines) */
size_t getItemCount() const;
/** Insert new item before _index line */
void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
/** Add new item at the end */
void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
//! Remove item at a specified position
void removeItemAt(size_t _index);
/** Delete all items */
void removeAllItems();
//! Swap items at a specified positions
void swapItemsAt(size_t _index1, size_t _index2);
//------------------------------------------------------------------------------//
// манипуляции отображением
//! Replace an item name
void setItemNameAt(size_t _index, const UString& _name) { setSubItemNameAt(0, _index, _name); }
//! Get item name from specified position
const UString& getItemNameAt(size_t _index) { return getSubItemNameAt(0, _index); }
//------------------------------------------------------------------------------//
// манипуляции выделениями
/** Get index of selected item (ITEM_NONE if none selected) */
size_t getIndexSelected() { return mItemSelected; }
/** Select specified _index */
void setIndexSelected(size_t _index);
/** Clear item selection */
void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
//------------------------------------------------------------------------------//
// манипуляции данными
//! Replace an item data at a specified position
void setItemDataAt(size_t _index, Any _data) { setSubItemDataAt(0, _index, _data); }
//! Clear an item data at a specified position
void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
//! Get item data from specified position
template
ValueType * getItemDataAt(size_t _index, bool _throw = true)
{
return getSubItemDataAt(0, _index, _throw);
}
//------------------------------------------------------------------------------//
// Methods for work with sub lines (RU:методы для работы со саб строками)
//------------------------------------------------------------------------------//
// манипуляции данными
/** Set sub item
@param _column Index of column
@param _index Index of line
@param _name New sub item value
*/
void setSubItemNameAt(size_t _column, size_t _index, const UString& _name);
/** Get sub item name*/
const UString& getSubItemNameAt(size_t _column, size_t _index);
/** Search item in specified _column, returns index of the first occurrence in column or ITEM_NONE if item not found */
size_t findSubItemWith(size_t _column, const UString& _name);
//------------------------------------------------------------------------------//
// манипуляции данными
//! Replace an item data at a specified position
void setSubItemDataAt(size_t _column, size_t _index, Any _data);
//! Clear an item data at a specified position
void clearSubItemDataAt(size_t _column, size_t _index) { setSubItemDataAt(_column, _index, Any::Null); }
//! Get item data from specified position
template
ValueType * getSubItemDataAt(size_t _column, size_t _index, bool _throw = true)
{
MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemDataAt");
MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemDataAt");
size_t index = BiIndexBase::convertToBack(_index);
return mVectorColumnInfo[_column].list->getItemDataAt(index, _throw);
}
/*internal:*/
virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
/*event:*/
/** Event : Enter pressed or double click.\n
signature : void method(MyGUI::MultiList* _sender, size_t _index)\n
@param _sender widget that called this event
@param _index of selected item
*/
EventPair eventListSelectAccept;
/** Event : Selected item position changed.\n
signature : void method(MyGUI::MultiList* _sender, size_t _index)\n
@param _sender widget that called this event
@param _index of new item
*/
EventPair eventListChangePosition;
/** Event : Less than operator for sort multilist by columns.\n
signature : void method(MyGUI::MultiList* _sender, size_t _column, const UString& _firstItem, const UString& _secondItem, bool& _less)\n
@param _sender widget that called this event
@param _column Index of column
@param _firstItem Strings for compare
@param _secondItem Strings for compare
@param _less Comparsion result (write your value here)
*/
EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef requestOperatorLess;
/*obsolete:*/
#ifndef MYGUI_DONT_USE_OBSOLETE
MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
size_t getItemIndexSelected() { return getIndexSelected(); }
MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
void clearItemSelected() { clearIndexSelected(); }
MYGUI_OBSOLETE("use : size_t MultiList::findSubItemWith(size_t _column, const UString& _name)")
size_t findItem(size_t _column, const UString& _name) { return findSubItemWith(_column, _name); }
MYGUI_OBSOLETE("use : const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)")
const UString& getSubItem(size_t _column, size_t _index) { return getSubItemNameAt(_column, _index); }
MYGUI_OBSOLETE("use : void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)")
void setSubItem(size_t _column, size_t _index, const UString& _name) { setSubItemNameAt(_column, _index, _name); }
MYGUI_OBSOLETE("use : void MultiList::removeColumnAt(size_t _column)")
void deleteColumn(size_t _column) { removeColumnAt(_column); }
MYGUI_OBSOLETE("use : void MultiList::removeAllColumns()")
void deleteAllColumns() { removeAllColumns(); }
MYGUI_OBSOLETE("use : int MultiList::getColumnWidthAt(size_t _column)")
int getColumnWidth(size_t _column) { return getColumnWidthAt(_column); }
MYGUI_OBSOLETE("use : const UString& MultiList::getColumnNameAt(size_t _column)")
const UString& getColumnName(size_t _column) { return getColumnNameAt(_column); }
MYGUI_OBSOLETE("use : void MultiList::setColumnWidthAt(size_t _column, int _width)")
void setColumnWidth(size_t _column, int _width) { setColumnWidthAt(_column, _width); }
MYGUI_OBSOLETE("use : void MultiList::addColumn(const UString& _name, int _width, Any _data)")
void addColumn(int _width, const UString& _name) { addColumn(_name, _width); }
MYGUI_OBSOLETE("use : void MultiList::setColumnNameAt(size_t _column, const UString& _name)")
void setColumnName(size_t _column, const UString& _name) { setColumnNameAt(_column, _name); }
MYGUI_OBSOLETE("use : void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)")
void insertColumn(size_t _column, int _width, const UString& _name) { insertColumnAt(_column, _name, _width); }
MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
size_t getItemSelect() { return getIndexSelected(); }
MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
void resetItemSelect() { clearIndexSelected(); }
MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
void setItemSelect(size_t _index) { setIndexSelected(_index); }
MYGUI_OBSOLETE("use : void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)")
void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); }
MYGUI_OBSOLETE("use : void MultiList::setItemNameAt(size_t _index, const UString& _name)")
void setItem(size_t _index, const UString& _name) { setItemNameAt(_index, _name); }
MYGUI_OBSOLETE("use : const UString& MultiList::getItemNameAt(size_t _index)")
const UString& getItem(size_t _index) { return getItemNameAt(_index); }
MYGUI_OBSOLETE("use : void MultiList::removeItemAt(size_t _index)")
void deleteItem(size_t _index) { removeItemAt(_index); }
MYGUI_OBSOLETE("use : void MultiList::removeAllItems()")
void deleteAllItems() { removeAllItems(); }
#endif // MYGUI_DONT_USE_OBSOLETE
protected:
virtual ~MultiList();
void baseChangeWidgetSkin(ResourceSkin* _info);
void notifyListChangePosition(List* _sender, size_t _position);
void notifyListChangeFocus(List* _sender, size_t _position);
void notifyListChangeScrollPosition(List* _sender, size_t _position);
void notifyButtonClick(Widget* _sender);
void notifyListSelectAccept(List* _sender, size_t _position);
void updateColumns();
void redrawButtons();
void updateOnlyEmpty();
bool compare(List* _list, size_t _left, size_t _right);
void sortList();
void flipList();
Widget* getSeparator(size_t _index);
void setButtonImageIndex(Button* _button, size_t _index);
void updateBackSelected(size_t _index);
private:
void initialiseWidgetSkin(ResourceSkin* _info);
void shutdownWidgetSkin();
void frameEntered(float _frame);
void frameAdvise(bool _advise);
private:
struct ColumnInfo
{
List* list;
Button* button;
int width;
UString name;
Any data;
};
typedef std::vector VectorColumnInfo;
enum ImageSort
{
SORT_NONE,
SORT_UP,
SORT_DOWN
};
private:
int mHeightButton;
int mWidthBar;
std::string mSkinButton, mSkinList;
Button* mButtonMain;
VectorColumnInfo mVectorColumnInfo;
VectorWidgetPtr mSeparators;
size_t mLastMouseFocusIndex;
bool mSortUp;
size_t mSortColumnIndex;
int mWidthSeparator;
std::string mSkinSeparator;
int mOffsetButtonSeparator;
size_t mItemSelected;
bool mFrameAdvise;
Widget* mClient;
};
} // namespace MyGUI
#endif // __MYGUI_MULTI_LIST_H__