23 mWidgetEmpty(nullptr),
36 Base::initialiseOverride();
38 std::string skinButtonEmpty;
50 mWidthSeparator = utility::parseValue<int>(
getUserString(
"WidthSeparator"));
54 mHeightButton = utility::parseValue<int>(
getUserString(
"HeightButton"));
55 if (mHeightButton < 0)
64 if (mWidgetEmpty ==
nullptr)
69 if (!skinButtonEmpty.empty())
73 if (getUpdateByResize())
79 Base::shutdownOverride();
84 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnNameAt");
85 mVectorColumnInfo[_column].name = _name;
93 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
94 mVectorColumnInfo[_column].width = _width;
100 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnNameAt");
101 return mVectorColumnInfo[_column].name;
106 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnWidthAt");
107 return mVectorColumnInfo[_column].width;
112 while (!mVectorColumnInfo.empty())
118 mSortColumnIndex = _column;
139 if (mVectorColumnInfo.empty())
141 return mVectorColumnInfo.front().list->getItemCount();
147 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
149 (*iter).list->removeAllItems();
155 void MultiListBox::updateBackSelected(
size_t _index)
159 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
161 (*iter).list->clearIndexSelected();
166 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
168 (*iter).list->setIndexSelected(_index);
175 if (_index == mItemSelected)
178 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::setIndexSelected");
181 mItemSelected = _index;
187 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemAt");
193 if (_column == mSortColumnIndex)
199 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::getSubItemNameAt");
211 int MultiListBox::getButtonHeight()
const
213 if (mHeaderPlace !=
nullptr)
215 return mHeightButton;
218 void MultiListBox::updateOnlyEmpty()
220 if (
nullptr == mWidgetEmpty)
233 void MultiListBox::notifyListChangePosition(ListBox* _sender,
size_t _position)
235 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
237 if (_sender != (*iter).list)
238 (*iter).list->setIndexSelected(_position);
241 updateBackSelected(_position);
249 void MultiListBox::notifyListSelectAccept(ListBox* _sender,
size_t _position)
257 IBNotifyItemData infoConvertedIndex(_info);
262 void MultiListBox::notifyListChangeFocus(ListBox* _sender,
size_t _position)
264 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
266 if (_sender != (*iter).list)
269 (*iter).list->_setItemFocus(mLastMouseFocusIndex,
false);
271 (*iter).list->_setItemFocus(_position,
true);
274 mLastMouseFocusIndex = _position;
277 void MultiListBox::notifyListChangeScrollPosition(ListBox* _sender,
size_t _position)
279 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
281 if (_sender != (*iter).list)
282 (*iter).list->setScrollPosition(_position);
292 void MultiListBox::redrawButtons()
295 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
297 if (pos == mSortColumnIndex)
300 (*iter).button->setImageName(
"Up");
302 (*iter).button->setImageName(
"Down");
305 (*iter).button->setImageName(
"None");
307 (*iter).button->setCaption((*iter).name);
312 void MultiListBox::frameEntered(
float _frame)
317 void MultiListBox::frameAdvise(
bool _advise)
332 mFrameAdvise =
false;
337 Widget* MultiListBox::getSeparator(
size_t _index)
339 if (!mWidthSeparator || mSkinSeparator.empty())
342 if (_index == mVectorColumnInfo.size() - 1)
345 while (_index >= mSeparators.size())
348 mSeparators.push_back(separator);
351 return mSeparators[_index];
354 void MultiListBox::flipList()
359 size_t last = mVectorColumnInfo.front().list->getItemCount();
368 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
370 (*iter).list->swapItemsAt(first, last);
380 bool MultiListBox::compare(ListBox* _list,
size_t _left,
size_t _right)
384 std::swap(_left, _right);
387 result = _list->getItemNameAt(_left) < _list->getItemNameAt(_right);
391 requestOperatorLess.m_eventObsolete(
this, mSortColumnIndex, _list->getItemNameAt(_left), _list->getItemNameAt(_right), result);
397 void MultiListBox::sortList()
402 ListBox* list = mVectorColumnInfo[mSortColumnIndex].list;
404 size_t count = list->getItemCount();
411 for (
size_t step = count >> 1; step > 0 ; step >>= 1)
413 for (
size_t i = 0; i < (count - step); i++)
419 if (compare(list, first, last))
422 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
424 (*iter).list->swapItemsAt(first, last);
439 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::insertItemAt");
442 _index = mVectorColumnInfo.front().list->getItemCount();
446 if ((mItemSelected !=
ITEM_NONE) && (_index <= mItemSelected))
452 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
454 (*iter).list->insertItemAt(index,
"");
456 mVectorColumnInfo.front().list->setItemNameAt(index, _name);
457 mVectorColumnInfo.front().list->setItemDataAt(index, _data);
464 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
465 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::removeItemAt");
469 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
471 (*iter).list->removeItemAt(index);
475 size_t count = mVectorColumnInfo.begin()->list->getItemCount();
480 if (_index < mItemSelected)
482 else if ((_index == mItemSelected) && (mItemSelected == count))
490 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
491 MYGUI_ASSERT_RANGE(_index1, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
492 MYGUI_ASSERT_RANGE(_index2, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
503 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnDataAt");
504 mVectorColumnInfo[_index].data = _data;
509 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemDataAt");
517 return mVectorColumnInfo.size();
547 return mItemSelected;
570 ListBox* MultiListBox::getSubItemAt(
size_t _column)
573 return mVectorColumnInfo[_column].list;
606 _column = mVectorColumnInfo.size();
610 mVectorColumnInfo.back().width = _width;
612 mVectorColumnInfo.back().name = _name;
613 mVectorColumnInfo.back().data = _data;
614 mVectorColumnInfo.back().button->setCaption(_name);
616 if (_column == (mVectorColumnInfo.size() - 1))
620 mVectorColumnInfo.back().list->setScrollVisible(
true);
624 _swapColumnsAt(_column, mVectorColumnInfo.size() - 1);
630 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::removeColumnAt");
632 ColumnInfo& info = mVectorColumnInfo[_column];
642 _swapColumnsAt(_index1, _index2);
645 void MultiListBox::_swapColumnsAt(
size_t _index1,
size_t _index2)
647 if (_index1 == _index2)
650 mVectorColumnInfo[_index1].list->setScrollVisible(
false);
651 mVectorColumnInfo[_index2].list->setScrollVisible(
false);
653 std::swap(mVectorColumnInfo[_index1], mVectorColumnInfo[_index2]);
657 mVectorColumnInfo.back().list->setScrollVisible(
true);
662 Base::onWidgetCreated(_widget);
665 if (child !=
nullptr)
673 Base::onWidgetDestroy(_widget);
676 if (child !=
nullptr)
682 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
684 if ((*item).button == _widget)
685 (*item).button =
nullptr;
693 if (!mVectorColumnInfo.empty())
694 mVectorColumnInfo.back().list->setScrollVisible(
false);
705 column.list->eventListMouseItemFocus +=
newDelegate(
this, &MultiListBox::notifyListChangeFocus);
706 column.list->eventListChangeScroll +=
newDelegate(
this, &MultiListBox::notifyListChangeScrollPosition);
707 column.list->eventListSelectAccept +=
newDelegate(
this, &MultiListBox::notifyListSelectAccept);
708 column.list->eventNotifyItem +=
newDelegate(
this, &MultiListBox::notifyListNotifyItem);
710 if (mHeaderPlace !=
nullptr)
718 if (!mVectorColumnInfo.empty())
720 size_t count = mVectorColumnInfo.front().list->getItemCount();
721 for (
size_t pos = 0; pos < count; ++pos)
722 column.list->addItem(
"");
725 mVectorColumnInfo.push_back(column);
730 mVectorColumnInfo.back().list->setScrollVisible(
true);
733 void MultiListBox::_unwrapItem(MultiListItem* _item)
735 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
737 if ((*item).item == _item)
739 if ((*item).button !=
nullptr)
742 mVectorColumnInfo.erase(item);
747 if (mVectorColumnInfo.empty())
761 if (!mVectorColumnInfo.empty())
762 mVectorColumnInfo.back().list->setScrollVisible(
true);
768 return mVectorColumnInfo[_index].item;
783 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
785 if (mVectorColumnInfo[index].item == _item)
799 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
800 mVectorColumnInfo[_index].sizeType = _value;
811 Base::setPosition(_point);
816 Base::setSize(_size);
818 if (getUpdateByResize())
824 Base::setCoord(_coord);
826 if (getUpdateByResize())
830 bool MultiListBox::getUpdateByResize()
832 if (mWidgetEmpty !=
nullptr)
835 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
843 int MultiListBox::getColumnWidth(
size_t _index,
int _freeSpace,
size_t _countStars,
size_t _lastIndexStar,
int _starWidth)
const
845 const ColumnInfo& info = mVectorColumnInfo[_index];
849 return info.realWidth;
853 return info.realWidth;
857 if (_lastIndexStar == _index)
859 return _starWidth + _freeSpace - (_starWidth * _countStars);
869 int MultiListBox::updateWidthColumns(
size_t& _countStars,
size_t& _lastIndexStar)
876 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
878 ColumnInfo& info = mVectorColumnInfo[index];
882 info.realWidth = info.button->getWidth() - info.button->getTextRegion().width + info.button->getTextSize().width;
886 info.realWidth = info.width < 0 ? 0 : info.width;
892 _lastIndexStar = index;
899 width += info.realWidth;
905 void MultiListBox::updateColumns()
907 size_t countStars = 0;
910 int allColumnsWidth = updateWidthColumns(countStars, lastIndexStar);
912 int separatorsWidth = mVectorColumnInfo.empty() ? 0 : (mVectorColumnInfo.size() - 1) * mWidthSeparator;
913 int freeSpace = clientWidth - separatorsWidth - allColumnsWidth;
914 int starWidth = (countStars != 0 && freeSpace > 0) ? (freeSpace / countStars) : 0;
917 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
919 ColumnInfo& info = mVectorColumnInfo[index];
921 int columnWidth = getColumnWidth(index, freeSpace, countStars, lastIndexStar, starWidth);
923 if (mHeaderPlace !=
nullptr)
932 info.button->setCoord(mWidthBar, 0, columnWidth, getButtonHeight());
933 info.button->_setInternalData(index);
935 mWidthBar += columnWidth;
938 Widget* separator = getSeparator(index);
944 mWidthBar += mWidthSeparator;