tabbedpages.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 827 行 · 第 1/2 页
CPP
827 行
//TabbedPages.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/TabbedPages.h"#include "vcf/ApplicationKit/DefaultTabModel.h"#include "vcf/ApplicationKit/DefaultTabPage.h"#include "vcf/ApplicationKit/Panel.h"#include "vcf/ApplicationKit/Containers.h"#include "vcf/GraphicsKit/DrawUIState.h"#define SCROLL_FWD_TAG 200#define SCROLL_BKWD_TAG 201using namespace VCF;class TabSheet : public Panel {public: TabSheet() { setBorder( NULL ); } virtual void paint( GraphicsContext* ctx ) { CustomControl::paint( ctx ); Rect bounds = getClientBounds(); DrawUIState state; state.setEnabled( isEnabled() ); state.setActive( isActive() ); ctx->drawThemeTabContent( &bounds, state ); paintChildren( ctx ); }};TabbedPages::TabbedPages(): CustomControl( true ), model_( NULL ){ setContainerDelegate( this ); setContainer( new StandardContainer() ); init();}void TabbedPages::init(){ setBorder( NULL ); //add a listener to the tab model setTabModel( new DefaultTabModel() ); addComponent( getViewModel() ); borderWidth_ = UIToolkit::getUIMetricValue( UIMetricsManager::mtContainerBorderDelta );; Size sz = UIToolkit::getUIMetricSize( UIMetricsManager::mtTabSize ); tabHeight_ = sz.height_; // 21.0; tabViewOffset_ = 0.0; EventHandler* ev = new ButtonEventHandler<TabbedPages>( this, &TabbedPages::onScrollButtonClicked, "onScrollButtonClicked" ); }TabbedPages::~TabbedPages(){ }/*void TabbedPages::recalcScrollerButtonsPos(){ TabModel* model = getModel(); double width = 0.0; Enumerator<TabPage*>* pages = model->getPages(); while ( true == pages->hasMoreElements() ) { TabPage* aPage = pages->nextElement(); width += getTabPageWidth( aPage ); } if ( width > this->getWidth() ) { //make the scrollers visible; double h = tabAreaBounds_.top_ - borderWidth_/2.0; double l = getWidth() - (scrollForward_->getWidth() + borderWidth_/2.0); scrollForward_->setTop( 1 ); scrollForward_->setHeight( h ); scrollForward_->setWidth( h ); scrollForward_->setLeft( l ); scrollBackward_->setTop( 1 ); scrollBackward_->setHeight( h ); scrollBackward_->setWidth( h ); scrollBackward_->setLeft( l - scrollBackward_->getWidth() ); scrollForward_->setVisible( true ); scrollBackward_->setVisible( true ); } else { tabViewOffset_ = 0; scrollForward_->setVisible( false ); scrollBackward_->setVisible( false ); } }*/double TabbedPages::getTabPageWidth( TabPage* page, GraphicsContext* ctx ){ double result; GraphicsContext* ctxToUse = ctx; if ( NULL == ctxToUse ) { ctxToUse = getContext(); } result = ctxToUse->getTextWidth( page->getPageName() ) + 5.0 + tabHeight_; return result;}void TabbedPages::paint( GraphicsContext* context ){ CustomControl::paint( context ); Border* border = getBorder(); Rect bounds; if ( NULL != border ) { bounds = border->getClientRect( &bounds, this ); } else { bounds.setRect( 0, 0, getWidth(), getHeight() ); } BackgroundState bkg; bkg.setEnabled( isEnabled() ); bkg.setActive( isActive() ); bkg.colorType_ = SYSCOLOR_FACE; context->drawThemeBackground( &bounds, bkg ); DrawUIState pageState; pageState.setEnabled( isEnabled() ); pageState.setActive( isActive() ); bounds.inflate( -borderWidth_,-borderWidth_ ); Size sz = UIToolkit::getUIMetricSize( UIMetricsManager::mtTabSize ); bounds.top_ += sz.height_; context->drawThemeTabPage( &bounds, pageState ); if ( NULL != model_ ){ Enumerator<TabPage*>* pages = model_->getPages(); Rect tabsRect(0,0,0,0); TabPage* selectedPage = NULL; double currentLeft = bounds.left_; Rect selectedRect; uint32 pageCount = model_->getPageCount(); double tabWidth = tabAreaBounds_.getWidth() / pageCount; double width = tabWidth; while ( true == pages->hasMoreElements() ){ TabPage* page = pages->nextElement(); VCF_ASSERT( NULL != page ); width = minVal<>( tabWidth, getTabPageWidth( page, context ) ); tabsRect.setRect( currentLeft, bounds.top_ - tabHeight_, currentLeft+ width, bounds.top_ ); tabsRect.offset( tabViewOffset_, 0 ); if ( true == page->isSelected() ) { selectedPage = page; selectedRect = tabsRect; } else { page->paint( context, &tabsRect ); } currentLeft += width; }/* //if ( oldClipRect.isEmpty() ) { //oldClipRect.setRect( 0, 0, getWidth(), getHeight() ); //} //context->setClippingRect( &oldClipRect ); if ( NULL != selectedPage ) { Control* component = selectedPage->getPageComponent(); if ( NULL != component ){ Rect tmp( tabAreaBounds_ );//*(component->getBounds()) ); tmp.inflate( 2,2 ); activePageBorder_.paint( &tmp, context ); } //fill with blank space first selectedRect.inflate( 2, 2, 2, 1 ); context->rectangle( &selectedRect ); context->fillPath(); selectedPage->paint( context, &selectedRect ); } */ if ( NULL != selectedPage ) { selectedRect.inflate( 0, 2, 2, 1 ); selectedPage->paint( context, &selectedRect ); } } paintChildren( context );}TabModel* TabbedPages::getModel(){ return model_;}void TabbedPages::setTabModel( TabModel* model ){ if ( NULL != model_ ) {// model_->release(); } model_ = model; if ( NULL != model_ ) { //model_->addRef(); //model_->addView( this ); Model* mod = dynamic_cast<Model*>(model_); if ( NULL != mod ) { mod->addView( this ); //calls setViewModel() for us } EventHandler* ev = getEventHandler( "TabbedPages::onTabPageAdded" ); if ( NULL == ev ) { ev = new TabModelEventHandler<TabbedPages>( this, &TabbedPages::onTabPageAdded, "TabbedPages::onTabPageAdded" ); } model_->addTabPageAddedHandler( ev ); ev = getEventHandler( "TabbedPages::onTabPageRemoved" ); if ( NULL == ev ) { ev = new TabModelEventHandler<TabbedPages>( this, &TabbedPages::onTabPageRemoved, "TabbedPages::onTabPageRemoved" ); } model_->addTabPageRemovedHandler( ev ); ev = getEventHandler( "TabbedPages::onTabPageSelected" ); if ( NULL == ev ) { ev = new TabModelEventHandler<TabbedPages>( this, &TabbedPages::onTabPageSelected, "TabbedPages::onTabPageSelected" ); } model_->addTabPageSelectedHandler( ev ); } else { setViewModel( NULL ); }}void TabbedPages::onTabPageAdded( TabModelEvent* event ){ //calculate the total width //needed by all the tab pages //if the width is gbreater than the controls //width then we need to make the scroll buttons //visible //repaint(); TabPage* page = event->getTabPage(); TabSheet* sheet = new TabSheet(); page->setPageComponent( sheet ); add( sheet, AlignClient ); //sheet->setVisible( true ); resizeChildren(NULL); //recalcScrollerButtonsPos();}void TabbedPages::onTabPageRemoved( TabModelEvent* event ){ TabPage* page = event->getTabPage(); TabPage* pageToMakeCurrent = NULL; TabModel* model = getModel(); bool next = false; if ( NULL != page ) { Enumerator<TabPage*>* pages = model->getPages(); while ( true == pages->hasMoreElements() ) { TabPage* aPage = pages->nextElement(); if ( next ) { pageToMakeCurrent = aPage; break; } if ( aPage == page ) { next = true; } } if ( (!next) || (NULL == pageToMakeCurrent) ) { pages->reset(); if ( true == pages->hasMoreElements() ) { pageToMakeCurrent = pages->nextElement(); } } Control* control = page->getPageComponent(); page->setPageComponent( NULL ); remove( control ); removeComponent( control ); control->free(); } if ( pageToMakeCurrent == page ) { pageToMakeCurrent = NULL; } if ( NULL != pageToMakeCurrent ) { model->setSelectedPage( pageToMakeCurrent ); } resizeChildren(NULL); //recalcScrollerButtonsPos();}void TabbedPages::onTabPageSelected( TabModelEvent* event ){ TabPage* page = event->getTabPage(); if ( true == page->isSelected() ){ Enumerator<Control*>* children = getChildren(); while ( true == children->hasMoreElements() ){ Control* comp = children->nextElement(); if ( comp != page->getPageComponent() ){ if ( comp->getVisible() ) { comp->setVisible( false ); } } } page->getPageComponent()->setVisible( true ); Container* container = page->getPageComponent()->getContainer(); if ( NULL != container ) { container->resizeChildren(NULL); /* Control* tabControl = container->getFirstTabControl(); if ( NULL != tabControl ) { tabControl->setFocused(); } else { } */ page->getPageComponent()->setFocused(); } } repaint();}TabPage* TabbedPages::addNewPage( const String& caption ){ DefaultTabPage* page = new DefaultTabPage(); page->setModel( getViewModel() ); page->setPageName( caption ); tabHeight_ = maxVal<double>( tabHeight_, page->getPreferredHeight() );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?