listboxcontrol.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,165 行 · 第 1/3 页

CPP
1,165
字号
	imageRect.left_ += leftGutter_;	imageRect.right_ = imageRect.left_ + imageList_->getImageWidth();	ulong32 index = item->getImageIndex();		imageRect.top_ = itemRect.top_ + (itemRect.getHeight()/2.0 - imageList_->getImageHeight()/2.0);	imageRect.bottom_ = imageRect.top_ + imageList_->getImageHeight();		if ( !imageRect.isEmpty() ) {		imageRect.inflate( -1, -1 );		itemRect.left_ = imageRect.right_;		imageList_->draw( ctx, index, &imageRect );	}}void ListBoxControl::paintItem( GraphicsContext* ctx, Rect& itemRect, 							   double currentTop, Color* selectedTextColor, 							   const Rect& bounds, double scrollWidth, double offsetX,							   ListItem* item ){	double y = currentTop + ( (itemRect.getHeight()/2.0) - (ctx->getTextHeight( "EM" )/2.0) );	if ( item->isSelected() ) {		paintSelectionRect( ctx, &Rect(bounds.left_-leftGutter_, itemRect.top_, itemRect.right_, itemRect.bottom_), item );		ctx->getCurrentFont()->setColor( selectedTextColor );	}	else {		ctx->getCurrentFont()->setColor( getFont()->getColor() );	}			Rect tmp = itemRect;	bool stateNeedsDrawing = false;	bool imageNeedsDrawing = false;	if ( NULL != imageList_ ) {		imageNeedsDrawing = true;	}	if ( Item::idsNone != item->getState() ) {		stateNeedsDrawing = true;	}	itemRect.setLeft( bounds.left_ );	if ( imageNeedsDrawing ) {		paintItemImage( ctx, itemRect, item );	}	if ( stateNeedsDrawing ) {		paintItemState( ctx, itemRect, item );	}		String itemText = item->getCaption();	if ( getUseLocaleStrings() ) {		itemText = System::getCurrentThreadLocale()->translate( itemText );	}		if( textBounded_ ){		Rect itemPaintRect;		itemPaintRect.setRect(itemRect.left_ + leftGutter_, currentTop, offsetX + bounds.getWidth() - scrollWidth - leftGutter_, currentTop + defaultItemHeight_ );		ctx->textBoundedBy( &itemPaintRect, itemText, false );	}	else{		ctx->textAt( itemRect.left_ + leftGutter_, y, itemText );	}		if ( item->canPaint() ) {		item->paint( ctx, &tmp );	}}void ListBoxControl::paint( GraphicsContext* ctx ){	CustomControl::paint( ctx );	ListModel* lm = getListModel();	Scrollable* scrollable = this->getScrollable();	Rect bounds = getClientBounds();	ctx->setClippingRect( &ctx->getViewableBounds() );	double width = bounds.getWidth();	double scrollW = 0;	double offsetx = bounds.left_ + leftGutter_;	if ( NULL != scrollable ) {		if ( scrollable->getVirtualViewHeight() > getHeight() ) {			scrollW = scrollable->getVerticalScrollbarWidth();		}		offsetx = maxVal<>( offsetx, offsetx + scrollable->getHorizontalPosition() );	}	if ( NULL != lm ) {		Color* selectedTextColor =				GraphicsToolkit::getSystemColor( SYSCOLOR_SELECTION_TEXT );		Enumerator<ListItem*>* items= lm->getItems();		double currentTop = bounds.top_;		Rect itemRect;		Rect itemPaintRect;		double totalHeight = 0;		Color oldFontColor;		oldFontColor = *getFont()->getColor();		Rect viewBounds = ctx->getViewableBounds();		//Point origin = ctx->getOrigin();		//viewBounds.offset( -origin.x_, -origin.y_ );		while ( true == items->hasMoreElements() ) {			ListItem* item = items->nextElement();			itemRect.setRect( offsetx, currentTop, offsetx + (width-scrollW), currentTop + defaultItemHeight_ );			if ( ((itemRect.top_ <= viewBounds.bottom_ ) && (itemRect.bottom_ >= viewBounds.top_ )) ||					(itemRect.containsPt( &viewBounds.getTopLeft()) || (itemRect.containsPt( &viewBounds.getBottomRight() )) ) ) {				totalHeight += itemRect.getHeight();							paintItem( ctx, itemRect, currentTop, selectedTextColor, 							bounds, scrollW, offsetx, item );							}			currentTop += itemRect.getHeight();		}	}}void ListBoxControl::paintSelectionRect( GraphicsContext* ctx, Rect* rect, ListItem* item ){	Color* selectedColor = GraphicsToolkit::getSystemColor( SYSCOLOR_SELECTION );	Color* selectedTextColor = GraphicsToolkit::getSystemColor( SYSCOLOR_SELECTION_TEXT );	Color* greyColor = GraphicsToolkit::getSystemColor( SYSCOLOR_SHADOW );	ctx->setColor( selectedColor );	ctx->rectangle( rect );	ctx->fillPath();	ctx->setColor( greyColor );	ctx->strokePath();	ctx->setColor( selectedTextColor );}ListItem* ListBoxControl::findSingleSelectedItem( Point* pt ){	ListItem* result = NULL;	Point tmpPt = *pt;	tmpPt.x_ = 1;	ListModel* lm = getListModel();	if ( NULL != lm ) {		Enumerator<ListItem*>* items= lm->getItems();		double currentTop = 0.0;		Rect itemRect;		while ( true == items->hasMoreElements() ) {			ListItem* item = items->nextElement();			itemRect.setRect( 0, currentTop, getWidth(), currentTop + defaultItemHeight_ );			if ( true == itemRect.containsPt( &tmpPt ) ) {				result = item;				break;			}			currentTop += itemRect.getHeight();		}	}	return result;}bool ListBoxControl::stateHitTest( Point* point, ListItem* item ){	bool result = false;	Rect stateRect = getStateRect( item );	result = stateRect.containsPt( point );	return result;}void ListBoxControl::mouseDown( MouseEvent* event ){	CustomControl::mouseDown( event );	if ( (true == event->hasLeftButton()) && (Component::csNormal == getComponentState()) ) {		keepMouseEvents();		ListItem* foundItem = findSingleSelectedItem( event->getPoint() );		if ( NULL != foundItem ) {			//check state hit test first!			if ( foundItem->getState() != Item::idsNone ) {				if ( stateHitTest( event->getPoint(), foundItem ) ) {					long state = foundItem->getState();					if ( Item::idsChecked == state ) {						state = Item::idsUnChecked;					}					else if ( Item::idsUnChecked == state ) {						state = Item::idsChecked;					}					else if ( Item::idsRadioUnpressed == state ) {						state = Item::idsRadioPressed;					}					else if ( Item::idsRadioPressed == state ) {						state = Item::idsRadioUnpressed;					}					foundItem->setState( state );					ItemEvent event( foundItem, ListBoxControl::lbeItemStateChangeRequested );					ItemStateChangeRequested.fireEvent( &event );					repaint();					return;				}			}			if ( true == allowsMultiSelect_ && true == allowsExtendedSelect_ ) {				if( event->hasShiftKey() ){					if( foundItem == singleSelectedItem_ ){						for( ulong32 j=0;j<selectedItems_.size();j++ ){							selectedItems_[j]->setSelected(false);						}						selectedItems_.clear();						selectedItems_.push_back(foundItem);						foundItem->setSelected(true);						selectionChanged( foundItem );					}					else if( NULL != singleSelectedItem_ ){						ulong32 foundItemPos = foundItem->getIndex();						ulong32 singlePos = singleSelectedItem_->getIndex();						for( ulong32 j=0;j<selectedItems_.size();j++ ){							selectedItems_[j]->setSelected(false);						}						if(foundItemPos < singlePos){// rangeSelect clears selectedItems_							rangeSelect(true, foundItem, singleSelectedItem_ );						}						else{							rangeSelect(true, singleSelectedItem_, foundItem );						}						singleSelectedItem_ = foundItem;						selectionChanged( foundItem );					}					else{// needed if no items currently selected.						foundItem->setSelected(true);						selectedItems_.push_back(foundItem);						singleSelectedItem_ = foundItem;						selectionChanged( foundItem );					}				}				else if( event->hasControlKey() ){					if( foundItem->isSelected() ){						foundItem->setSelected(false);						singleSelectedItem_ = NULL;						eraseFromSelectedItems( foundItem );						selectionChanged( foundItem );					}					else{						foundItem->setSelected(true);						selectedItems_.push_back(foundItem);						singleSelectedItem_ = foundItem;						selectionChanged( foundItem );					}				}				else{					if( !(selectedItems_.empty()) ) {						for( ulong32 j=0;j<selectedItems_.size();j++ ){							selectedItems_[j]->setSelected(false);						}						selectedItems_.clear();					}															selectedItems_.push_back(foundItem);					foundItem->setSelected( true );					singleSelectedItem_ = foundItem;					selectionChanged( foundItem );				}			}			else if ( true == allowsMultiSelect_ && false == allowsExtendedSelect_ ){				if( foundItem->isSelected() ){					foundItem->setSelected(false);					singleSelectedItem_ = NULL;					eraseFromSelectedItems( foundItem );					selectionChanged( foundItem );				}				else{					foundItem->setSelected( true );					singleSelectedItem_ = foundItem;					selectedItems_.push_back( foundItem );					selectionChanged( foundItem );				}			}			else {				selectedItems_.clear();				selectedItems_.push_back( foundItem );				setSelectedItem( foundItem );			}		}	}}void ListBoxControl::mouseMove( MouseEvent* event ){	CustomControl::mouseMove( event );	if ( (true == event->hasLeftButton()) && (Component::csNormal == getComponentState()) ) {		ListItem* foundItem = findSingleSelectedItem( event->getPoint() );		if ( NULL != foundItem ) {			if ( true == allowsMultiSelect_ ) {				if ( true == foundItem->isSelected() ){					singleSelectedItem_ = foundItem; 				}				else {					//selectedItems_.push_back( foundItem );					setSelectedItem( foundItem );				}			}			else {				if ( foundItem != singleSelectedItem_ )  {	   					//JC - Integrated change by Berkano (Thanks Brian!) - fixes bug [1015368] ListBoxControl Mousemove error 					if(!selectedItems_.empty()) {					// selectedItems_[0] = foundItem;//assumes index 0 exists					setSelectedItem( foundItem );					}				}			}		}	}}void ListBoxControl::mouseUp( MouseEvent* event ){	CustomControl::mouseUp( event );	if ( (true == event->hasLeftButton()) && (Component::csNormal == getComponentState()) ) {		releaseMouseEvents();	}}void ListBoxControl::mouseClick( MouseEvent* event ){	CustomControl::mouseClick( event );}void ListBoxControl::mouseDblClick( MouseEvent* event ){	CustomControl::mouseDblClick( event );}void ListBoxControl::keyDown( KeyboardEvent* event ){	CustomControl::keyDown( event );	if ( Component::csNormal == getComponentState() ) {		if ( true == this->allowsMultiSelect_ ) {		}		else {			ListItem* item = this->getSelectedItem();			ListModel* lm = getListModel();			if ( (NULL != item) && (NULL != lm) ) {				ulong32 index = item->getIndex();				if ( vkUpArrow == event->getVirtualCode() ) {					index --;				}				else if ( vkDownArrow == event->getVirtualCode() ) {					index ++;				}				item = lm->getItemFromIndex( index );				if ( NULL != item ) {					setSelectedItem( item );				}			}		}	}}void ListBoxControl::keyUp( KeyboardEvent* event ){	CustomControl::keyUp( event );}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?