treelistcontrol.cpp

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

CPP
2,390
字号
				itemBounds.right_ = itemBounds.left_ + column->getWidth();			}			else {				GraphicsContext* ctx = getContext();				double w = ctx->getTextWidth( item->getCaption() );				itemBounds.right_ = itemBounds.right_ + w + getCurrentIndent(item) ;			}		}	}	Rect intersect = itemBounds.makeIntersection( rect );	if ( !intersect.isEmpty() && !intersect.isNull() ) {		hitTestList.push_back( item );	}	if ( (false == item->isLeaf()) && (true == item->isExpanded()) ) {		Enumerator<TreeItem*>* children = item->getChildren();		while ( true == children->hasMoreElements() ) {			TreeItem* child = children->nextElement();			hitTest( rect, child, hitTestList );		}	}	return result;}void TreeListControl::mouseMove( MouseEvent* event ){	CustomControl::mouseMove( event );	if ( (true == event->hasLeftButton()) && (true == draggingSelectionRect_) ) {		/**		!!!!!!!HACK!!!!!!!				We need to put this in the paint code and simply invalidate here!				!!!!!!!HACK!!!!!!!		*/		GraphicsContext* context = getContext();		DrawUIState state;		state.setActive( true );		context->drawThemeSelectionRect( &dragSelectionRect_, state );		Point* pt = event->getPoint();		dragSelectionRect_.setRect( dragPoint_.x_, dragPoint_.y_, pt->x_, pt->y_ );		dragSelectionRect_.normalize();		context->drawThemeSelectionRect( &dragSelectionRect_, state );		bool needsRepaint = false;		if ( !draggingSelectedItems_.empty() ) {			std::vector<TreeItem*>::iterator it = draggingSelectedItems_.begin() ;			while ( it != draggingSelectedItems_.end() ) {				(*it)->setSelected( false );				ItemEvent event( this, ITEM_EVENT_UNSELECTED );				event.setUserData((void*)(*it));				ItemSelected.fireEvent( &event );				std::vector<TreeItem*>::iterator found = std::find( selectedItems_.begin(), selectedItems_.end(), *it ) ;				if ( found != selectedItems_.end() ) {					selectedItems_.erase( found );				}				it ++;			}			needsRepaint = true;		}		draggingSelectedItems_.clear();		Enumerator<TreeItem*>* rootChildren = treeModel_->getRootItems();		while ( rootChildren->hasMoreElements() ) {			TreeItem* rootItem = rootChildren->nextElement();			hitTest( &dragSelectionRect_, rootItem, draggingSelectedItems_ );		}		if ( !draggingSelectedItems_.empty() ) {			std::vector<TreeItem*>::iterator it = draggingSelectedItems_.begin() ;			while ( it != draggingSelectedItems_.end() ) {				if ( false == (*it)->isSelected() ) {					(*it)->setSelected( true );					selectedItems_.push_back( *it );				}				it ++;			}			needsRepaint = true;		}		if ( needsRepaint ) {			repaint();		}	}}void TreeListControl::mouseUp( MouseEvent* event ){	CustomControl::mouseUp( event );	if ( (true == event->hasLeftButton()) && (true == draggingSelectionRect_) ) {		GraphicsContext* context = getContext();		DrawUIState state;		state.setActive(true);		context->drawThemeSelectionRect( &dragSelectionRect_, state );		Point* pt = event->getPoint();		dragSelectionRect_.setRect( dragPoint_.x_, dragPoint_.y_, pt->x_, pt->y_ );		dragSelectionRect_.normalize();		context->drawThemeSelectionRect( &dragSelectionRect_, state );		context->drawThemeSelectionRect( &dragSelectionRect_, state );		repaint();	}}void TreeListControl::setImageList( ImageList* imageList ){	if ( NULL != imageList_ ) {		imageList_->release();	}	imageList_ = imageList;	if ( NULL != imageList_ ) {		imageList_->addRef();		itemHeight_ = maxVal<double>( itemHeight_, maxVal<double>( imageList_->getImageWidth(), imageList_->getImageHeight() ) );	}}ImageList* TreeListControl::getImageList(){	return imageList_;}ImageList* TreeListControl::getStateImageList(){	return stateImageList_;}void TreeListControl::setStateImageList( ImageList* imageList ){	if ( NULL != stateImageList_ ) {		stateImageList_->release();	}	stateImageList_ = imageList;	if ( NULL != stateImageList_ ) {		stateImageList_->addRef();	}}long TreeListControl::getDisplayOptions(){	return displayOptions_;}void TreeListControl::setDisplayOptions( const long& displayOptions ){	displayOptions_ = displayOptions;	if ( displayOptions_ & TreeListControl::tdoShowColumnHeader ) {		header_->setHeight( columnHeight_ );	}	else {		header_->setHeight( 0.0 );	}	repaint();}TreeItem* TreeListControl::isPtOverItem(Point* point){	TreeItem* result = NULL;	std::vector<TreeItem*> visibleItems;	populateVisiblityList( visibleItems );	std::vector<TreeItem*>::iterator it = visibleItems.begin();	while ( it != visibleItems.end() ) {		TreeItem* item = *it;		if ( item->containsPoint( point ) ) {			result = item;			break;		}		it ++;	}	return result;}TreeItem* TreeListControl::getSelectedItem(){	TreeItem* result = NULL;	if ( false == selectedItems_.empty() ) {		result = selectedItems_[0];	}	return result;}bool TreeListControl::getAllowLabelEditing(){	return allowLabelEditing_;}void TreeListControl::setAllowLabelEditing( const bool& allowLabelEditing ){	allowLabelEditing_ = allowLabelEditing;}void TreeListControl::onColumnWidthChanged( ItemEvent* event ){	ColumnItem* item = (ColumnItem*)event->getSource();	if ( item->getIndex() == 0 ) {		double width = item->getWidth();		double minWidth = (itemIndent_ + stateItemIndent_) * 1.5;		if ( width < minWidth ) {			item->setWidth( minWidth );		}	}	repaint();}void TreeListControl::setAllowsMultipleSelection( const bool& multiSelect ){	if ( (false == multiSelect) && (false == selectedItems_.empty() ) ) {		TreeItem* first = NULL;		if ( ! selectedItems_.empty() ) {			first = selectedItems_[0];		}		clearSelectedItems();		if ( NULL != first ) {			selectedItems_.push_back( first );			first->setSelected( true );		}		repaint();	}	allowMultipleSelection_ = multiSelect;}void TreeListControl::setSelectedItem( TreeItem* item, const bool& isSelected ){	if ( true == allowMultipleSelection_ ) {		std::vector<TreeItem*>::iterator found = std::find( selectedItems_.begin(), selectedItems_.end(),																item );		if ( (true == isSelected) && (found == selectedItems_.end()) ) {			selectedItems_.push_back( item );		}		else if ( found != selectedItems_.end() ) {			if ( false == isSelected ) {				selectedItems_.erase( found );			}		}	}	else {		if ( true == isSelected ) {			std::vector<TreeItem*>::iterator found = std::find( selectedItems_.begin(), selectedItems_.end(), item );			if ( found == selectedItems_.end() ) {				selectedItems_.push_back( item );			}		}		else {			clearSelectedItems();		}	}	item->setSelected( isSelected );	if ( true == isSelected ) {		ItemEvent event( this, ITEM_EVENT_SELECTED );		event.setUserData( (void*)item );		ItemSelected.fireEvent( &event );	}	else	{		ItemEvent event( this, ITEM_EVENT_UNSELECTED );		event.setUserData( (void*)item );		ItemSelected.fireEvent( &event );	}}Enumerator<TreeItem*>* TreeListControl::getSelectedItems(){	return selectedItemContainer_.getEnumerator();}bool TreeListControl::listVisibleItems( std::vector<TreeItem*>& items, TreeItem* itemToSearch, const double& top, const double& bottom ){	bool result = false;	if ( NULL != itemToSearch ) {		Rect* bounds = itemToSearch->getBounds();		if ( bounds->isNull() || bounds->isEmpty() ) {			bounds->setRect( 1, itemHeight_ * items.size(), getWidth()-1, itemHeight_ * items.size() + itemHeight_ );					}		if ( (bounds->bottom_ >= top) || (bounds->top_ < bottom) ){			items.push_back( itemToSearch );			result = true;			if ( (!itemToSearch->isLeaf()) && (itemToSearch->isExpanded()) ) {				//check children				Enumerator<TreeItem*>* children = itemToSearch->getChildren();				while ( children->hasMoreElements() ) {					TreeItem* child = children->nextElement();					if ( false == listVisibleItems( items, child, top, bottom ) ) {						break;					}				}			}		}	}	return result;}void TreeListControl::populateVisiblityList( std::vector<TreeItem*>& items, Rect* bounds ){	Enumerator<TreeItem*>* rootItems = treeModel_->getRootItems();	Rect clientBounds;	if ( NULL != bounds ) {		clientBounds = *bounds;	}	else {		clientBounds = getClientBounds();				clientBounds.top_ += header_->getHeight();				Scrollable* scrollable = getScrollable();		if ( NULL != scrollable ) {			clientBounds.offset( 0, scrollable->getVerticalPosition() );		}	}	while ( rootItems->hasMoreElements() ) {		TreeItem* child = rootItems->nextElement();		if ( false == listVisibleItems( items, child, clientBounds.top_, clientBounds.bottom_ ) ) {			break;		}	}	}double TreeListControl::getCurrentIndent( TreeItem* item ){	double result = getItemIndent() * item->getLevel();	result += EXPANDER_SPACER*2;  //scootch over for the expander	//determine if we have an image list present	if ( NULL != imageList_ ) {		result += imageList_->getImageWidth();	}	if ( Item::idsNone != item->getState() ) {		if ( NULL != stateImageList_ ) {			result += stateImageList_->getImageWidth();		}		else {			result += stateItemIndent_;		}	}	return result;}double TreeListControl::getDefaultItemHeight(){	double result = itemHeight_;	if ( NULL != imageList_ ) {		result = maxVal<double>( result, imageList_->getImageHeight() );	}	return result;}void TreeListControl::setDefaultItemHeight( const double& defaultItemHeight ){	itemHeight_ = defaultItemHeight;}Rect TreeListControl::getStateRect( TreeItem* item, const double& indent ){	Rect result;	if ( item->getState() != Item::idsNone ) {		Rect* itemBounds = item->getBounds();		result = *itemBounds;		result.left_ += indent;		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_,itemHeight_)/2.0));			result.bottom_ = result.top_ + (minVal<double>(stateItemIndent_,itemHeight_));		}		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 TreeListControl::showHierarchyLines( const bool& show ){	if ( true == show ) {		displayOptions_ |= TreeListControl::tdoShowHierarchyLines;	}	else {		displayOptions_ &= ~TreeListControl::tdoShowHierarchyLines;	}	repaint();}void TreeListControl::showRowLines( const bool& show ){	if ( true == show ) {		displayOptions_ |= TreeListControl::tdoShowRowLines;	}	else {		displayOptions_ &= ~TreeListControl::tdoShowRowLines;	}	repaint();}void TreeListControl::showColumnLines( const bool& show ){	if ( true == show ) {		displayOptions_ |= TreeListControl::tdoShowColumnLines;	}	else {		displayOptions_ &= ~TreeListControl::tdoShowColumnLines;	}	repaint();}void TreeListControl::showFullRowSelection( const bool& show ){	if ( true == show ) {		displayOptions_ |= TreeListControl::tdoShowFullRowSelection;	}	else {		displayOptions_ &= ~TreeListControl::tdoShowFullRowSelection;	}

⌨️ 快捷键说明

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