listboxcontrol.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 1,165 行 · 第 1/3 页
CPP
1,165 行
//ListBoxControl.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*//* Generated by Together */#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/ListBoxControl.h"#include "vcf/ApplicationKit/DefaultListModel.h"#include "vcf/GraphicsKit/DrawUIState.h"using namespace VCF;static ListItem* previouslySelectedListItem = NULL;ListBoxControl::ListBoxControl(): listModel_(NULL), currentMaxWidth_(0), currentMaxHeight_(0), leftGutter_(2), rightGutter_(2), textBounded_(false), imageList_(NULL), stateImageList_(NULL), stateItemIndent_(19){ setListModel( new DefaultListModel() ); addComponent( getViewModel() ); init();}ListBoxControl::ListBoxControl( ListModel* listModel ): listModel_(NULL), currentMaxWidth_(0), currentMaxHeight_(0), leftGutter_(2), rightGutter_(2), textBounded_(false), imageList_(NULL), stateImageList_(NULL), stateItemIndent_(19){ setListModel( listModel ); init();}void ListBoxControl::init(){ singleSelectedItem_ = NULL; allowsMultiSelect_ = false; allowsExtendedSelect_ = true; setColor( GraphicsToolkit::getSystemColor( SYSCOLOR_WINDOW ) ); GraphicsContext* context = getContext(); defaultItemHeight_ = UIToolkit::getUIMetricValue( UIMetricsManager::mtListItemHeight ); EventHandler* lmh = new ListModelEventHandler<ListBoxControl>( this, &ListBoxControl::onItemAdded, "ListBoxControl::onItemAdded" ); listModel_->addItemAddedHandler( lmh ); lmh = new ListModelEventHandler<ListBoxControl>( this, &ListBoxControl::onItemDeleted, "ListBoxControl::onItemDeleted" ); listModel_->addItemDeletedHandler( lmh ); lmh = new ListModelEventHandler<ListBoxControl>( this, &ListBoxControl::onListModelContentsChanged, "ListBoxControl::onListModelContentsChanged" ); listModel_->addContentsChangedHandler( lmh ); selectedItemsContainer_.initContainer( selectedItems_ ); setUseColorForBackground( true );}ListBoxControl::~ListBoxControl(){ }void ListBoxControl::destroy(){ if ( NULL != listModel_ ) { EventHandler* ev = getEventHandler( "ListBoxControl::onItemAdded" ); if ( NULL != ev ) { listModel_->removeItemAddedHandler( ev ); } ev = getEventHandler( "ListBoxControl::onItemDeleted" ); if ( NULL != ev ) { listModel_->removeItemDeletedHandler( ev ); } ev = getEventHandler( "ListBoxControl::onListModelContentsChanged" ); if ( NULL != ev ) { listModel_->removeContentsChangedHandler( ev ); } //listModel_->release(); } CustomControl::destroy();}ListModel* ListBoxControl::getListModel(){ return listModel_;}void ListBoxControl::setListModel( ListModel * model ){ if ( model == listModel_ ) { return; } if ( NULL != listModel_ ) { EventHandler* ev = getEventHandler( "ListBoxControl::onItemAdded" ); if ( NULL != ev ) { listModel_->removeItemAddedHandler( ev ); } ev = getEventHandler( "ListBoxControl::onItemDeleted" ); if ( NULL != ev ) { listModel_->removeItemDeletedHandler( ev ); } ev = getEventHandler( "ListBoxControl::onListModelContentsChanged" ); if ( NULL != ev ) { listModel_->removeContentsChangedHandler( ev ); } } listModel_ = model; if ( NULL != listModel_ ) { } setViewModel( dynamic_cast<Model*>(listModel_) ); repaint();}void ListBoxControl::onListModelContentsChanged( ListModelEvent* event ){ repaint(); if ( NULL != event ){ switch ( event->getType() ){ case LIST_MODEL_CONTENTS_DELETED: { singleSelectedItem_ = NULL; selectedItems_.clear(); } break;/* case LIST_MODEL_ITEM_CHANGED: { ListItem* item = event->getListItem(); if ( NULL != item ){ listBoxPeer_->removeItem( item ); listBoxPeer_->addItem( item ); } } break; */ } }}void ListBoxControl::onItemAdded( ListModelEvent* event ){ //listBoxPeer_->addItem( event->getListItem() ); Scrollable* scrollable = getScrollable(); double width = getWidth(); Rect itemRect; double scrollW = 0; if ( NULL != scrollable ) { if ( scrollable->getVirtualViewHeight() > getHeight() ) { scrollW = scrollable->getVerticalScrollbarWidth(); } } GraphicsContext* ctx = getContext(); ListItem* item = event->getListItem(); itemRect.setRect( 0, currentMaxHeight_, width-scrollW, currentMaxHeight_ + defaultItemHeight_ ); item->setBounds( &itemRect ); currentMaxHeight_ += item->getBounds()->getHeight(); double imageWidth = 0.0; if ( NULL != imageList_ ) { imageWidth += imageList_->getImageWidth(); } currentMaxWidth_ = maxVal<double>( ctx->getTextWidth( item->getCaption() ) + leftGutter_ + rightGutter_ + imageWidth, currentMaxWidth_ ); if ( NULL != scrollable ) { if ( (getHeight() > currentMaxHeight_) && (scrollable->getVerticalPosition() > 0.0) ) { scrollable->setVerticalPosition( 0.0 ); } if ( (getWidth() > currentMaxWidth_) && (scrollable->getHorizontalPosition() > 0.0) ) { scrollable->setHorizontalPosition( 0.0 ); } scrollable->setVirtualViewSize( currentMaxWidth_, currentMaxHeight_ ); } repaint();}void ListBoxControl::onItemDeleted( ListModelEvent* event ){ ListItem* item = event->getListItem(); if ( item == singleSelectedItem_ ) { singleSelectedItem_ = NULL; } if ( item->isSelected() ) { eraseFromSelectedItems( item ); } currentMaxHeight_ -= item->getBounds()->getHeight(); //need to recalc currentMaxWidth_ here also if item removed was the widest item. DT Scrollable* scrollable = getScrollable(); if ( NULL != scrollable ) { if ( (getHeight() > currentMaxHeight_) && (scrollable->getVerticalPosition() > 0.0) ) { scrollable->setVerticalPosition( 0.0 ); } if ( (getWidth() > currentMaxWidth_) && (scrollable->getHorizontalPosition() > 0.0) ) { scrollable->setHorizontalPosition( 0.0 ); } scrollable->setVirtualViewSize( currentMaxWidth_, currentMaxHeight_ ); } repaint();}void ListBoxControl::rangeSelect( const bool & isSelected, ListItem * first, ListItem * last ){ if ( NULL == last ) { setSelectedItem( first ); //this will select it if ( false == isSelected ) { // we'll deselect it first->setSelected( isSelected ); singleSelectedItem_ = NULL; } repaint(); } else { if ( NULL != singleSelectedItem_ ) { singleSelectedItem_->setSelected( false ); } singleSelectedItem_ = NULL; selectedItems_.clear(); ListModel* lm = getListModel(); if ( NULL != lm ) { ulong32 start = first->getIndex(); ulong32 end = last->getIndex(); for ( ulong32 i=start;i<=end;i++) { ListItem* item = lm->getItemFromIndex( i ); if ( NULL != item ) { item->setSelected( isSelected ); if ( true == isSelected ) { selectedItems_.push_back( item ); } } } selectionChanged( NULL ); } }}Rect ListBoxControl::getStateRect( ListItem* item ){ Rect result; if ( item->getState() != Item::idsNone ) { Rect* itemBounds = item->getBounds(); result = *itemBounds; result.left_ += leftGutter_; if ( NULL != stateImageList_ ) { result.right_ = result.left_ + stateImageList_->getImageWidth(); result.top_ = itemBounds->top_ + (itemBounds->getHeight()/2.0 - stateImageList_->getImageHeight()/2.0); result.bottom_ = result.top_ + stateImageList_->getImageHeight(); } else { result.right_ = result.left_ + stateItemIndent_; result.top_ = itemBounds->top_ + (itemBounds->getHeight()/2.0 - (minVal<double>(stateItemIndent_,defaultItemHeight_)/2.0)); result.bottom_ = result.top_ + (minVal<double>(stateItemIndent_,defaultItemHeight_)); } if ( NULL != imageList_ ) { if ( NULL != stateImageList_ ) { result.offset( (maxVal<double>( imageList_->getImageWidth(), stateImageList_->getImageWidth() )), 0 ); } else { result.offset( (maxVal<double>( imageList_->getImageWidth(), stateItemIndent_ )), 0 ); } } else { if ( NULL != stateImageList_ ) { result.offset( (maxVal<double>( stateItemIndent_, stateImageList_->getImageWidth() )), 0 ); } else { //result.offset( -stateItemIndent_, 0 ); } } } return result;}void ListBoxControl::paintItemState( GraphicsContext* ctx, Rect& itemRect, ListItem* item ){ Rect stateRect = getStateRect( item ); stateRect.inflate( -1, -1 ); if ( NULL != stateImageList_ ) { itemRect.left_ = stateRect.right_; stateImageList_->draw( ctx, item->getStateImageIndex(), &stateRect ); } else { stateRect.inflate( -1, -1 ); itemRect.left_ = stateRect.right_; long state = item->getState(); ButtonState buttonState; buttonState.setActive( true ); if ( (state & Item::idsChecked) || (state & Item::idsUnChecked) ) { buttonState.setPressed( state == Item::idsChecked ? true : false ); ctx->drawThemeCheckboxRect( &stateRect, buttonState ); } else if ( (state & Item::idsRadioPressed) || (state & Item::idsRadioUnpressed) ) { buttonState.setPressed( state == Item::idsRadioPressed ? true : false ); ctx->drawThemeRadioButtonRect( &stateRect, buttonState ); } }}void ListBoxControl::paintItemImage( GraphicsContext* ctx, Rect& itemRect, ListItem* item ){ Rect imageRect;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?