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