MyGUI  3.0.3
MyGUI_MultiList.cpp
Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009 
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014 
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019 
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00022 */
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_MultiList.h"
00025 #include "MyGUI_ResourceSkin.h"
00026 #include "MyGUI_Button.h"
00027 #include "MyGUI_StaticImage.h"
00028 #include "MyGUI_List.h"
00029 #include "MyGUI_Gui.h"
00030 #include "MyGUI_WidgetManager.h"
00031 
00032 namespace MyGUI
00033 {
00034 
00035     MultiList::MultiList() :
00036         mHeightButton(0),
00037         mWidthBar(0),
00038         mButtonMain(nullptr),
00039         mLastMouseFocusIndex(ITEM_NONE),
00040         mSortUp(true),
00041         mSortColumnIndex(ITEM_NONE),
00042         mWidthSeparator(0),
00043         mOffsetButtonSeparator(2),
00044         mItemSelected(ITEM_NONE),
00045         mFrameAdvise(false),
00046         mClient(nullptr)
00047     {
00048     }
00049 
00050     void MultiList::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name)
00051     {
00052         Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
00053 
00054         initialiseWidgetSkin(_info);
00055     }
00056 
00057     MultiList::~MultiList()
00058     {
00059         frameAdvise(false);
00060         shutdownWidgetSkin();
00061     }
00062 
00063     void MultiList::baseChangeWidgetSkin(ResourceSkin* _info)
00064     {
00065         shutdownWidgetSkin();
00066         Base::baseChangeWidgetSkin(_info);
00067         initialiseWidgetSkin(_info);
00068     }
00069 
00070     void MultiList::initialiseWidgetSkin(ResourceSkin* _info)
00071     {
00072         // парсим свойства
00073         const MapString& properties = _info->getProperties();
00074         if (!properties.empty())
00075         {
00076             MapString::const_iterator iter = properties.find("SkinButton");
00077             if (iter != properties.end()) mSkinButton = iter->second;
00078             iter = properties.find("HeightButton");
00079             if (iter != properties.end()) mHeightButton = utility::parseInt(iter->second);
00080             if (mHeightButton < 0) mHeightButton = 0;
00081 
00082             iter = properties.find("SkinList");
00083             if (iter != properties.end()) mSkinList = iter->second;
00084 
00085             iter = properties.find("SkinButtonEmpty");
00086             if (iter != properties.end())
00087             {
00088                 mButtonMain = mClient->createWidget<Button>(iter->second,
00089                     IntCoord(0, 0, mClient->getWidth(), mHeightButton), Align::Default);
00090             }
00091 
00092             iter = properties.find("WidthSeparator");
00093             if (iter != properties.end()) mWidthSeparator = utility::parseInt(iter->second);
00094             iter = properties.find("SkinSeparator");
00095             if (iter != properties.end()) mSkinSeparator = iter->second;
00096         }
00097 
00098         for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter)
00099         {
00100             if (*(*iter)->_getInternalData<std::string>() == "Client")
00101             {
00102                 MYGUI_DEBUG_ASSERT( ! mClient, "widget already assigned");
00103                 mClient = (*iter);
00104                 mWidgetClient = (*iter); // чтобы размер возвращался клиентской зоны
00105             }
00106         }
00107         // мона и без клиента
00108         if (nullptr == mClient) mClient = this;
00109     }
00110 
00111     void MultiList::shutdownWidgetSkin()
00112     {
00113         mWidgetClient = nullptr;
00114         mClient = nullptr;
00115     }
00116 
00117     //----------------------------------------------------------------------------------//
00118     // методы для работы со столбцами
00119     void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)
00120     {
00121         MYGUI_ASSERT_RANGE_INSERT(_column, mVectorColumnInfo.size(), "MultiList::insertColumnAt");
00122         if (_column == ITEM_NONE) _column = mVectorColumnInfo.size();
00123 
00124         // скрываем у крайнего скролл
00125         if (!mVectorColumnInfo.empty())
00126             mVectorColumnInfo.back().list->setScrollVisible(false);
00127         else mSortColumnIndex = 0;
00128 
00129         ColumnInfo column;
00130         column.width = _width < 0 ? 0 : _width;
00131 
00132         column.list = mClient->createWidget<List>(mSkinList, IntCoord(), Align::Left | Align::VStretch);
00133         column.list->eventListChangePosition = newDelegate(this, &MultiList::notifyListChangePosition);
00134         column.list->eventListMouseItemFocus = newDelegate(this, &MultiList::notifyListChangeFocus);
00135         column.list->eventListChangeScroll = newDelegate(this, &MultiList::notifyListChangeScrollPosition);
00136         column.list->eventListSelectAccept = newDelegate(this, &MultiList::notifyListSelectAccept);
00137 
00138         column.button = mClient->createWidget<Button>(mSkinButton, IntCoord(), Align::Default);
00139         column.button->eventMouseButtonClick = newDelegate(this, &MultiList::notifyButtonClick);
00140         column.name = _name;
00141         column.data = _data;
00142 
00143         // если уже были столбики, то делаем то же колличество полей
00144         if (!mVectorColumnInfo.empty())
00145         {
00146             size_t count = mVectorColumnInfo.front().list->getItemCount();
00147             for (size_t pos=0; pos<count; ++pos)
00148                 column.list->addItem("");
00149         }
00150 
00151         mVectorColumnInfo.insert(mVectorColumnInfo.begin() + _column, column);
00152 
00153         updateColumns();
00154 
00155         // показываем скролл нового крайнего
00156         mVectorColumnInfo.back().list->setScrollVisible(true);
00157     }
00158 
00159     void MultiList::setColumnNameAt(size_t _column, const UString& _name)
00160     {
00161         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::setColumnNameAt");
00162         mVectorColumnInfo[_column].name = _name;
00163         redrawButtons();
00164     }
00165 
00166     void MultiList::setColumnWidthAt(size_t _column, int _width)
00167     {
00168         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::setColumnWidthAt");
00169         mVectorColumnInfo[_column].width = _width < 0 ? 0 : _width;
00170         updateColumns();
00171     }
00172 
00173     const UString& MultiList::getColumnNameAt(size_t _column)
00174     {
00175         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getColumnNameAt");
00176         return mVectorColumnInfo[_column].name;
00177     }
00178 
00179     int MultiList::getColumnWidthAt(size_t _column)
00180     {
00181         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getColumnWidthAt");
00182         return mVectorColumnInfo[_column].width;
00183     }
00184 
00185     void MultiList::removeColumnAt(size_t _column)
00186     {
00187         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::removeColumnAt");
00188 
00189         ColumnInfo& info = mVectorColumnInfo[_column];
00190 
00191         WidgetManager& manager = WidgetManager::getInstance();
00192         manager.destroyWidget(info.button);
00193         manager.destroyWidget(info.list);
00194 
00195         mVectorColumnInfo.erase(mVectorColumnInfo.begin() + _column);
00196 
00197         if (mVectorColumnInfo.empty())
00198         {
00199             mSortColumnIndex = ITEM_NONE;
00200             mItemSelected = ITEM_NONE;
00201         }
00202         else
00203         {
00204             mSortColumnIndex = 0;
00205             mSortUp = true;
00206             sortList();
00207         }
00208 
00209         updateColumns();
00210     }
00211 
00212     void MultiList::removeAllColumns()
00213     {
00214         WidgetManager& manager = WidgetManager::getInstance();
00215         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00216         {
00217             manager.destroyWidget((*iter).button);
00218             manager.destroyWidget((*iter).list);
00219         }
00220         mVectorColumnInfo.clear();
00221         mSortColumnIndex = ITEM_NONE;
00222 
00223         updateColumns();
00224 
00225         mItemSelected = ITEM_NONE;
00226     }
00227 
00228     void MultiList::sortByColumn(size_t _column, bool _backward)
00229     {
00230         mSortColumnIndex = _column;
00231         if (_backward)
00232         {
00233             mSortUp = !mSortUp;
00234             redrawButtons();
00235             // если было недосортированно то сортируем
00236             if (mFrameAdvise) sortList();
00237 
00238             flipList();
00239         }
00240         else
00241         {
00242             mSortUp = true;
00243             redrawButtons();
00244             sortList();
00245         }
00246     }
00247 
00248     size_t MultiList::getItemCount() const
00249     {
00250         if (mVectorColumnInfo.empty()) return 0;
00251         return mVectorColumnInfo.front().list->getItemCount();
00252     }
00253 
00254     void MultiList::removeAllItems()
00255     {
00256         BiIndexBase::removeAllItems();
00257         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00258         {
00259             (*iter).list->removeAllItems();
00260         }
00261 
00262         mItemSelected = ITEM_NONE;
00263     }
00264 
00265     /*size_t MultiList::getItemIndexSelected()
00266     {
00267         if (mVectorColumnInfo.empty()) return ITEM_NONE;
00268         size_t item = mVectorColumnInfo.front().list->getItemIndexSelected();
00269         return (ITEM_NONE == item) ? ITEM_NONE : BiIndexBase::convertToFace(item);
00270     }*/
00271 
00272     void MultiList::updateBackSelected(size_t _index)
00273     {
00274         if (_index == ITEM_NONE)
00275         {
00276             for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00277             {
00278                 (*iter).list->clearIndexSelected();
00279             }
00280         }
00281         else
00282         {
00283             //size_t index = BiIndexBase::convertToBack(_index);
00284             for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00285             {
00286                 (*iter).list->setIndexSelected(_index);
00287             }
00288         }
00289     }
00290 
00291     void MultiList::setIndexSelected(size_t _index)
00292     {
00293         if (_index == mItemSelected) return;
00294 
00295         MYGUI_ASSERT_RANGE(0, mVectorColumnInfo.size(), "MultiList::setIndexSelected");
00296         MYGUI_ASSERT_RANGE_AND_NONE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::setIndexSelected");
00297 
00298         mItemSelected = _index;
00299         updateBackSelected(BiIndexBase::convertToBack(mItemSelected));
00300     }
00301 
00302     void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)
00303     {
00304         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::setSubItemAt");
00305         MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::setSubItemAt");
00306 
00307         size_t index = BiIndexBase::convertToBack(_index);
00308         mVectorColumnInfo[_column].list->setItemNameAt(index, _name);
00309 
00310         // если мы попортили список с активным сортом, надо пересчитывать
00311         if (_column == mSortColumnIndex) frameAdvise(true);
00312     }
00313 
00314     const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)
00315     {
00316         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemNameAt");
00317         MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemNameAt");
00318 
00319         size_t index = BiIndexBase::convertToBack(_index);
00320         return mVectorColumnInfo[_column].list->getItemNameAt(index);
00321     }
00322 
00323     size_t MultiList::findSubItemWith(size_t _column, const UString& _name)
00324     {
00325         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::findSubItemWith");
00326 
00327         size_t index = mVectorColumnInfo[_column].list->findItemIndexWith(_name);
00328         return BiIndexBase::convertToFace(index);
00329     }
00330     //----------------------------------------------------------------------------------//
00331 
00332     void MultiList::updateOnlyEmpty()
00333     {
00334         if (nullptr == mButtonMain) return;
00335         // кнопка, для заполнения пустоты
00336         if (mWidthBar >= mClient->getWidth()) mButtonMain->setVisible(false);
00337         else
00338         {
00339             mButtonMain->setCoord(mWidthBar, 0, mClient->getWidth()-mWidthBar, mHeightButton);
00340             mButtonMain->setVisible(true);
00341         }
00342     }
00343 
00344     void MultiList::notifyListChangePosition(List* _sender, size_t _position)
00345     {
00346         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00347         {
00348             if (_sender != (*iter).list) (*iter).list->setIndexSelected(_position);
00349         }
00350 
00351         updateBackSelected(_position);
00352 
00353         mItemSelected = BiIndexBase::convertToFace(_position);
00354 
00355         // наш евент
00356         eventListChangePosition(this, mItemSelected);
00357     }
00358 
00359     void MultiList::notifyListSelectAccept(List* _sender, size_t _position)
00360     {
00361         // наш евент
00362         eventListSelectAccept(this, BiIndexBase::convertToFace(_position));
00363     }
00364 
00365     void MultiList::notifyListChangeFocus(List* _sender, size_t _position)
00366     {
00367         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00368         {
00369             if (_sender != (*iter).list)
00370             {
00371                 if (ITEM_NONE != mLastMouseFocusIndex) (*iter).list->_setItemFocus(mLastMouseFocusIndex, false);
00372                 if (ITEM_NONE != _position) (*iter).list->_setItemFocus(_position, true);
00373             }
00374         }
00375         mLastMouseFocusIndex = _position;
00376     }
00377 
00378     void MultiList::notifyListChangeScrollPosition(List* _sender, size_t _position)
00379     {
00380         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00381         {
00382             if (_sender != (*iter).list)
00383                 (*iter).list->setScrollPosition(_position);
00384         }
00385     }
00386 
00387     void MultiList::notifyButtonClick(MyGUI::Widget* _sender)
00388     {
00389         size_t index = *_sender->_getInternalData<size_t>();
00390         sortByColumn(index, index == mSortColumnIndex);
00391     }
00392 
00393     void MultiList::redrawButtons()
00394     {
00395         size_t pos = 0;
00396         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00397         {
00398             if (pos == mSortColumnIndex)
00399             {
00400                 if (mSortUp) setButtonImageIndex((*iter).button, SORT_UP);
00401                 else setButtonImageIndex((*iter).button, SORT_DOWN);
00402             }
00403             else setButtonImageIndex((*iter).button, SORT_NONE);
00404             (*iter).button->setCaption((*iter).name);
00405             pos++;
00406         }
00407     }
00408 
00409     void MultiList::setButtonImageIndex(Button* _button, size_t _index)
00410     {
00411         StaticImage* image = _button->getStaticImage();
00412         if ( nullptr == image ) return;
00413         if (image->getItemResource())
00414         {
00415             static const size_t CountIcons = 3;
00416             static const char * IconNames[CountIcons + 1] = { "None", "Up", "Down", "" };
00417             if (_index >= CountIcons) _index = CountIcons;
00418             image->setItemName(IconNames[_index]);
00419         }
00420         else
00421         {
00422             image->setItemSelect(_index);
00423         }
00424     }
00425 
00426     void MultiList::frameEntered(float _frame)
00427     {
00428         sortList();
00429     }
00430 
00431     void MultiList::frameAdvise(bool _advise)
00432     {
00433         if ( _advise )
00434         {
00435             if ( ! mFrameAdvise )
00436             {
00437                 MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate( this, &MultiList::frameEntered );
00438                 mFrameAdvise = true;
00439             }
00440         }
00441         else
00442         {
00443             if ( mFrameAdvise )
00444             {
00445                 MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate( this, &MultiList::frameEntered );
00446                 mFrameAdvise = false;
00447             }
00448         }
00449     }
00450 
00451     Widget* MultiList::getSeparator(size_t _index)
00452     {
00453         if (!mWidthSeparator || mSkinSeparator.empty()) return nullptr;
00454         // последний столбик
00455         if (_index == mVectorColumnInfo.size()-1) return nullptr;
00456 
00457         while (_index >= mSeparators.size())
00458         {
00459             Widget* separator = mClient->createWidget<Widget>(mSkinSeparator, IntCoord(), Align::Default);
00460             mSeparators.push_back(separator);
00461         }
00462 
00463         return mSeparators[_index];
00464     }
00465 
00466     void MultiList::updateColumns()
00467     {
00468         mWidthBar = 0;
00469         size_t index = 0;
00470         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00471         {
00472             (*iter).list->setCoord(mWidthBar, mHeightButton, (*iter).width, mClient->getHeight() - mHeightButton);
00473             (*iter).button->setCoord(mWidthBar, 0, (*iter).width, mHeightButton);
00474             (*iter).button->_setInternalData(index);
00475 
00476             mWidthBar += (*iter).width;
00477 
00478             // промежуток между листами
00479             Widget* separator = getSeparator(index);
00480             if (separator)
00481             {
00482                 separator->setCoord(mWidthBar, 0, mWidthSeparator, mClient->getHeight());
00483             }
00484 
00485             mWidthBar += mWidthSeparator;
00486             index++;
00487         }
00488 
00489         redrawButtons();
00490         updateOnlyEmpty();
00491     }
00492 
00493     void MultiList::flipList()
00494     {
00495         if (ITEM_NONE == mSortColumnIndex) return;
00496 
00497         size_t last = mVectorColumnInfo.front().list->getItemCount();
00498         if (0 == last) return;
00499         last --;
00500         size_t first = 0;
00501 
00502         while (first < last)
00503         {
00504             BiIndexBase::swapItemsBackAt(first, last);
00505             for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00506             {
00507                 (*iter).list->swapItemsAt(first, last);
00508             }
00509 
00510             first++;
00511             last--;
00512         }
00513 
00514         updateBackSelected(BiIndexBase::convertToBack(mItemSelected));
00515     }
00516 
00517     bool MultiList::compare(List* _list, size_t _left, size_t _right)
00518     {
00519         bool result = false;
00520         if (mSortUp) std::swap(_left, _right);
00521         if (requestOperatorLess.empty()) result = _list->getItemNameAt(_left) < _list->getItemNameAt(_right);
00522         else requestOperatorLess(this, mSortColumnIndex, _list->getItemNameAt(_left), _list->getItemNameAt(_right), result);
00523         return result;
00524     }
00525 
00526     void MultiList::sortList()
00527     {
00528         if (ITEM_NONE == mSortColumnIndex) return;
00529 
00530         List* list = mVectorColumnInfo[mSortColumnIndex].list;
00531 
00532         size_t count = list->getItemCount();
00533         if (0 == count) return;
00534 
00535         // shell sort
00536         int first, last;
00537         for (size_t step = count>>1; step>0 ; step >>= 1)
00538         {
00539             for (size_t i=0;i<(count-step);i++)
00540             {
00541                 first=i;
00542                 while (first>=0)
00543                 {
00544                     last = first+step;
00545                     if (compare(list, first, last))
00546                     {
00547                         BiIndexBase::swapItemsBackAt(first, last);
00548                         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00549                         {
00550                             (*iter).list->swapItemsAt(first, last);
00551                         }
00552                     }
00553                     first--;
00554                 }
00555             }
00556         }
00557 
00558         frameAdvise(false);
00559 
00560         updateBackSelected(BiIndexBase::convertToBack(mItemSelected));
00561     }
00562 
00563     void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)
00564     {
00565         MYGUI_ASSERT_RANGE(0, mVectorColumnInfo.size(), "MultiList::insertItemAt");
00566         MYGUI_ASSERT_RANGE_INSERT(_index, mVectorColumnInfo.front().list->getItemCount(), "MultiList::insertItemAt");
00567         if (ITEM_NONE == _index) _index = mVectorColumnInfo.front().list->getItemCount();
00568 
00569         // если надо, то меняем выделенный элемент
00570         // при сортировке, обновится
00571         if ((mItemSelected != ITEM_NONE) && (_index <= mItemSelected)) mItemSelected ++;
00572 
00573         size_t index = BiIndexBase::insertItemAt(_index);
00574 
00575         // вставляем во все поля пустые, а потом присваиваем первому
00576         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00577         {
00578             (*iter).list->insertItemAt(index, "");
00579         }
00580         mVectorColumnInfo.front().list->setItemNameAt(index, _name);
00581         mVectorColumnInfo.front().list->setItemDataAt(index, _data);
00582 
00583         frameAdvise(true);
00584     }
00585 
00586     void MultiList::removeItemAt(size_t _index)
00587     {
00588         MYGUI_ASSERT_RANGE(0, mVectorColumnInfo.size(), "MultiList::removeItemAt");
00589         MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::removeItemAt");
00590 
00591         size_t index = BiIndexBase::removeItemAt(_index);
00592 
00593         for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
00594         {
00595             (*iter).list->removeItemAt(index);
00596         }
00597 
00598         // если надо, то меняем выделенный элемент
00599         size_t count = mVectorColumnInfo.begin()->list->getItemCount();
00600         if (count == 0) mItemSelected = ITEM_NONE;
00601         else if (mItemSelected != ITEM_NONE)
00602         {
00603             if (_index < mItemSelected) mItemSelected --;
00604             else if ((_index == mItemSelected) && (mItemSelected == count)) mItemSelected --;
00605         }
00606         updateBackSelected(BiIndexBase::convertToBack(mItemSelected));
00607     }
00608 
00609     void MultiList::swapItemsAt(size_t _index1, size_t _index2)
00610     {
00611         MYGUI_ASSERT_RANGE(0, mVectorColumnInfo.size(), "MultiList::removeItemAt");
00612         MYGUI_ASSERT_RANGE(_index1, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::swapItemsAt");
00613         MYGUI_ASSERT_RANGE(_index2, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::swapItemsAt");
00614 
00615         // при сортированном, меняем только индексы
00616         BiIndexBase::swapItemsFaceAt(_index1, _index2);
00617 
00618         // при несортированном, нужно наоборот, поменять только данные
00619         // FIXME
00620     }
00621 
00622     void MultiList::setColumnDataAt(size_t _index, Any _data)
00623     {
00624         MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::setColumnDataAt");
00625         mVectorColumnInfo[_index].data = _data;
00626     }
00627 
00628     void MultiList::setSubItemDataAt(size_t _column, size_t _index, Any _data)
00629     {
00630         MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::setSubItemDataAt");
00631         MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::setSubItemDataAt");
00632 
00633         size_t index = BiIndexBase::convertToBack(_index);
00634         mVectorColumnInfo[_column].list->setItemDataAt(index, _data);
00635     }
00636 
00637 } // namespace MyGUI