43 mOffsetButtonSeparator(2),
55 std::string skinButtonEmpty;
64 mWidthSeparator = utility::parseValue<int>(
getUserString(
"WidthSeparator"));
68 mHeightButton = utility::parseValue<int>(
getUserString(
"HeightButton"));
69 if (mHeightButton < 0)
75 if (mClient !=
nullptr)
78 if (
nullptr == mClient)
83 if (mWidgetEmpty ==
nullptr)
87 if (!skinButtonEmpty.empty())
91 if (getUpdateByResize())
104 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnNameAt");
105 mVectorColumnInfo[_column].name = _name;
113 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
114 mVectorColumnInfo[_column].width = _width;
120 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnNameAt");
121 return mVectorColumnInfo[_column].name;
126 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnWidthAt");
127 return mVectorColumnInfo[_column].width;
132 while (!mVectorColumnInfo.empty())
138 mSortColumnIndex = _column;
159 if (mVectorColumnInfo.empty())
161 return mVectorColumnInfo.front().list->getItemCount();
167 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
169 (*iter).list->removeAllItems();
175 void MultiListBox::updateBackSelected(
size_t _index)
179 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
181 (*iter).list->clearIndexSelected();
186 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
188 (*iter).list->setIndexSelected(_index);
195 if (_index == mItemSelected)
198 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::setIndexSelected");
201 mItemSelected = _index;
207 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemAt");
213 if (_column == mSortColumnIndex)
219 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::getSubItemNameAt");
231 int MultiListBox::getButtonHeight()
const
233 if (mHeaderPlace !=
nullptr)
235 return mHeightButton;
238 void MultiListBox::updateOnlyEmpty()
240 if (
nullptr == mWidgetEmpty)
244 if (mWidthBar >= mClient->
getWidth())
248 mWidgetEmpty->
setCoord(mWidthBar, 0, mClient->
getWidth() - mWidthBar, getButtonHeight());
253 void MultiListBox::notifyListChangePosition(ListBox* _sender,
size_t _position)
255 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
257 if (_sender != (*iter).list)
258 (*iter).list->setIndexSelected(_position);
261 updateBackSelected(_position);
269 void MultiListBox::notifyListSelectAccept(ListBox* _sender,
size_t _position)
275 void MultiListBox::notifyListChangeFocus(ListBox* _sender,
size_t _position)
277 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
279 if (_sender != (*iter).list)
282 (*iter).list->_setItemFocus(mLastMouseFocusIndex,
false);
284 (*iter).list->_setItemFocus(_position,
true);
287 mLastMouseFocusIndex = _position;
290 void MultiListBox::notifyListChangeScrollPosition(ListBox* _sender,
size_t _position)
292 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
294 if (_sender != (*iter).list)
295 (*iter).list->setScrollPosition(_position);
305 void MultiListBox::redrawButtons()
308 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
310 if (pos == mSortColumnIndex)
313 (*iter).button->setImageName(
"Up");
315 (*iter).button->setImageName(
"Down");
318 (*iter).button->setImageName(
"None");
320 (*iter).button->setCaption((*iter).name);
325 void MultiListBox::frameEntered(
float _frame)
330 void MultiListBox::frameAdvise(
bool _advise)
345 mFrameAdvise =
false;
350 Widget* MultiListBox::getSeparator(
size_t _index)
352 if (!mWidthSeparator || mSkinSeparator.empty())
355 if (_index == mVectorColumnInfo.size() - 1)
358 while (_index >= mSeparators.size())
361 mSeparators.push_back(separator);
364 return mSeparators[_index];
367 void MultiListBox::flipList()
372 size_t last = mVectorColumnInfo.front().list->getItemCount();
381 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
383 (*iter).list->swapItemsAt(first, last);
393 bool MultiListBox::compare(ListBox* _list,
size_t _left,
size_t _right)
397 std::swap(_left, _right);
399 result = _list->getItemNameAt(_left) < _list->getItemNameAt(_right);
401 requestOperatorLess(
this, mSortColumnIndex, _list->getItemNameAt(_left), _list->getItemNameAt(_right), result);
405 void MultiListBox::sortList()
410 ListBox* list = mVectorColumnInfo[mSortColumnIndex].list;
412 size_t count = list->getItemCount();
419 for (
size_t step = count >> 1; step > 0 ; step >>= 1)
421 for (
size_t i = 0; i < (count - step); i++)
427 if (compare(list, first, last))
430 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
432 (*iter).list->swapItemsAt(first, last);
447 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::insertItemAt");
450 _index = mVectorColumnInfo.front().list->getItemCount();
454 if ((mItemSelected !=
ITEM_NONE) && (_index <= mItemSelected))
460 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
462 (*iter).list->insertItemAt(index,
"");
464 mVectorColumnInfo.front().list->setItemNameAt(index, _name);
465 mVectorColumnInfo.front().list->setItemDataAt(index, _data);
472 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
473 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::removeItemAt");
477 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
479 (*iter).list->removeItemAt(index);
483 size_t count = mVectorColumnInfo.begin()->list->getItemCount();
488 if (_index < mItemSelected)
490 else if ((_index == mItemSelected) && (mItemSelected == count))
498 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
499 MYGUI_ASSERT_RANGE(_index1, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
500 MYGUI_ASSERT_RANGE(_index2, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
511 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnDataAt");
512 mVectorColumnInfo[_index].data = _data;
517 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemDataAt");
525 return mVectorColumnInfo.size();
555 return mItemSelected;
578 ListBox* MultiListBox::getSubItemAt(
size_t _column)
581 return mVectorColumnInfo[_column].list;
614 _column = mVectorColumnInfo.size();
618 mVectorColumnInfo.back().width = _width;
620 mVectorColumnInfo.back().name = _name;
621 mVectorColumnInfo.back().data = _data;
622 mVectorColumnInfo.back().button->setCaption(_name);
624 if (_column == (mVectorColumnInfo.size() - 1))
628 mVectorColumnInfo.back().list->setScrollVisible(
true);
632 _swapColumnsAt(_column, mVectorColumnInfo.size() - 1);
638 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::removeColumnAt");
640 ColumnInfo& info = mVectorColumnInfo[_column];
650 _swapColumnsAt(_index1, _index2);
653 void MultiListBox::_swapColumnsAt(
size_t _index1,
size_t _index2)
655 if (_index1 == _index2)
658 mVectorColumnInfo[_index1].list->setScrollVisible(
false);
659 mVectorColumnInfo[_index2].list->setScrollVisible(
false);
661 std::swap(mVectorColumnInfo[_index1], mVectorColumnInfo[_index2]);
665 mVectorColumnInfo.back().list->setScrollVisible(
true);
673 if (child !=
nullptr)
684 if (child !=
nullptr)
690 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
692 if ((*item).button == _widget)
693 (*item).button =
nullptr;
701 if (!mVectorColumnInfo.empty())
702 mVectorColumnInfo.back().list->setScrollVisible(
false);
712 column.list->eventListChangePosition +=
newDelegate(
this, &MultiListBox::notifyListChangePosition);
713 column.list->eventListMouseItemFocus +=
newDelegate(
this, &MultiListBox::notifyListChangeFocus);
714 column.list->eventListChangeScroll +=
newDelegate(
this, &MultiListBox::notifyListChangeScrollPosition);
715 column.list->eventListSelectAccept +=
newDelegate(
this, &MultiListBox::notifyListSelectAccept);
717 if (mHeaderPlace !=
nullptr)
725 if (!mVectorColumnInfo.empty())
727 size_t count = mVectorColumnInfo.front().list->getItemCount();
728 for (
size_t pos = 0; pos < count; ++pos)
729 column.list->addItem(
"");
732 mVectorColumnInfo.push_back(column);
737 mVectorColumnInfo.back().list->setScrollVisible(
true);
740 void MultiListBox::_unwrapItem(MultiListItem* _item)
742 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
744 if ((*item).item == _item)
746 if ((*item).button !=
nullptr)
749 mVectorColumnInfo.erase(item);
754 if (mVectorColumnInfo.empty())
768 if (!mVectorColumnInfo.empty())
769 mVectorColumnInfo.back().list->setScrollVisible(
true);
775 return mVectorColumnInfo[_index].item;
790 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
792 if (mVectorColumnInfo[index].item == _item)
806 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
807 mVectorColumnInfo[_index].sizeType = _value;
825 if (getUpdateByResize())
833 if (getUpdateByResize())
852 bool MultiListBox::getUpdateByResize()
854 if (mWidgetEmpty !=
nullptr)
857 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
865 int MultiListBox::getColumnWidth(
size_t _index,
int _freeSpace,
size_t _countStars,
size_t _lastIndexStar,
int _starWidth)
const
867 const ColumnInfo& info = mVectorColumnInfo[_index];
871 return info.realWidth;
875 return info.realWidth;
879 if (_lastIndexStar == _index)
881 return _starWidth + _freeSpace - (_starWidth * _countStars);
891 int MultiListBox::updateWidthColumns(
size_t& _countStars,
size_t& _lastIndexStar)
898 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
900 ColumnInfo& info = mVectorColumnInfo[index];
904 info.realWidth = info.button->getWidth() - info.button->getTextRegion().width + info.button->getTextSize().width;
908 info.realWidth = info.width < 0 ? 0 : info.width;
914 _lastIndexStar = index;
921 width += info.realWidth;
927 void MultiListBox::updateColumns()
929 size_t countStars = 0;
932 int allColumnsWidth = updateWidthColumns(countStars, lastIndexStar);
933 int clientWidth = mClient->
getWidth();
934 int separatorsWidth = mVectorColumnInfo.empty() ? 0 : (mVectorColumnInfo.size() - 1) * mWidthSeparator;
935 int freeSpace = clientWidth - separatorsWidth - allColumnsWidth;
936 int starWidth = (countStars != 0 && freeSpace > 0) ? (freeSpace / countStars) : 0;
939 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
941 ColumnInfo& info = mVectorColumnInfo[index];
943 int columnWidth = getColumnWidth(index, freeSpace, countStars, lastIndexStar, starWidth);
945 if (mHeaderPlace !=
nullptr)
947 info.item->setCoord(mWidthBar, 0, columnWidth, mClient->
getHeight());
951 info.item->setCoord(mWidthBar, mHeightButton, columnWidth, mClient->
getHeight() - mHeightButton);
954 info.button->setCoord(mWidthBar, 0, columnWidth, getButtonHeight());
955 info.button->_setInternalData(index);
957 mWidthBar += columnWidth;
960 Widget* separator = getSeparator(index);
963 separator->setCoord(mWidthBar, 0, mWidthSeparator, mClient->
getHeight());
966 mWidthBar += mWidthSeparator;