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 + -
显示快捷键?