You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
7.6 KiB
293 lines
7.6 KiB
/* -*- Mode: C++ -*-
|
|
KDChart - a multi-platform charting engine
|
|
*/
|
|
|
|
/****************************************************************************
|
|
** Copyright (C) 2001-2003 Klarälvdalens Datakonsult AB. All rights reserved.
|
|
**
|
|
** This file is part of the KDChart library.
|
|
**
|
|
** This file may be distributed and/or modified under the terms of the
|
|
** GNU General Public License version 2 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
** packaging of this file.
|
|
**
|
|
** Licensees holding valid commercial KDChart licenses may use this file in
|
|
** accordance with the KDChart Commercial License Agreement provided with
|
|
** the Software.
|
|
**
|
|
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
**
|
|
** See http://www.klaralvdalens-datakonsult.se/?page=products for
|
|
** information about KDChart Commercial License Agreements.
|
|
**
|
|
** Contact info@klaralvdalens-datakonsult.se if any conditions of this
|
|
** licensing are not clear to you.
|
|
**
|
|
**********************************************************************/
|
|
#include "KDChartTextPiece.h"
|
|
|
|
#include <qstylesheet.h>
|
|
#include <qsimplerichtext.h>
|
|
#include <qfontmetrics.h>
|
|
#include <qpainter.h>
|
|
#include <qapplication.h>
|
|
#include <qrect.h>
|
|
|
|
KDChartTextPiece::KDChartTextPiece()
|
|
:QObject(0)
|
|
{
|
|
_isRichText = false;
|
|
_richText = 0;
|
|
|
|
_font = QApplication::font();
|
|
// These three are needed for both
|
|
_metrics = new QFontMetrics( _font );
|
|
_dirtyMetrics = true;
|
|
_text = QString("");
|
|
}
|
|
|
|
|
|
KDChartTextPiece::KDChartTextPiece( const QString& text, const QFont& font )
|
|
:QObject(0)
|
|
{
|
|
if( QStyleSheet::mightBeRichText( text ) ) {
|
|
_isRichText = true;
|
|
_richText = new QSimpleRichText( text, font );
|
|
_richText->adjustSize();
|
|
} else {
|
|
_isRichText = false;
|
|
_richText = 0;
|
|
}
|
|
|
|
// These three are needed for both
|
|
_metrics = new QFontMetrics( font );
|
|
_dirtyMetrics = true;
|
|
_text = text;
|
|
_font = font;
|
|
}
|
|
|
|
|
|
KDChartTextPiece::KDChartTextPiece( QPainter *p, const QString& text, const QFont& font )
|
|
:QObject(0)
|
|
{
|
|
|
|
if( QStyleSheet::mightBeRichText( text ) ) {
|
|
_isRichText = true;
|
|
_richText = new QSimpleRichText( text, font );
|
|
//qDebug( "richtext width %s", QString::number(_richText->width()).latin1());
|
|
//qDebug( "richtext height %s", QString::number(_richText->height()).latin1());
|
|
_richText->adjustSize();
|
|
//qDebug( "richtext width %s", QString::number(_richText->width()).latin1());
|
|
//qDebug( "richtext height %s", QString::number(_richText->height()).latin1());
|
|
|
|
} else {
|
|
_isRichText = false;
|
|
_richText = 0;
|
|
}
|
|
|
|
// These three are needed for both
|
|
_dirtyMetrics = (p == 0);
|
|
if( _dirtyMetrics ) {
|
|
_metrics = new QFontMetrics( font );
|
|
//qDebug("dirty metrics text: %s", text.latin1());
|
|
}
|
|
else{
|
|
p->save();
|
|
p->setFont( font );
|
|
_metrics = new QFontMetrics( p->fontMetrics() );
|
|
//qDebug ( "drawing metrics text: %s", text.latin1() );
|
|
//p->drawRect( _metrics->boundingRect( text) );
|
|
//p->drawText( _metrics->boundingRect(text).bottomRight(), text);
|
|
p->restore();
|
|
}
|
|
_text = text;
|
|
_font = font;
|
|
}
|
|
|
|
|
|
void KDChartTextPiece::deepCopy( const KDChartTextPiece* source )
|
|
{
|
|
if( !source || this == source )
|
|
return;
|
|
if( _richText )
|
|
delete _richText;
|
|
_isRichText = source->_isRichText;
|
|
if( source->_richText ) {
|
|
_richText = new QSimpleRichText( source->_text, source->_font );
|
|
_richText->adjustSize();
|
|
}
|
|
else
|
|
_richText = 0;
|
|
|
|
// used for both
|
|
if( _metrics )
|
|
delete _metrics;
|
|
_metrics = new QFontMetrics( *source->_metrics );
|
|
_dirtyMetrics = source->_dirtyMetrics;
|
|
_text = source->_text;
|
|
_font = source->_font;
|
|
}
|
|
|
|
const KDChartTextPiece* KDChartTextPiece::clone() const
|
|
{
|
|
KDChartTextPiece* newPiece = new KDChartTextPiece();
|
|
newPiece->deepCopy( this );
|
|
return newPiece;
|
|
}
|
|
|
|
|
|
KDChartTextPiece::~KDChartTextPiece()
|
|
{
|
|
if( _richText )
|
|
delete _richText;
|
|
if( _metrics )
|
|
delete _metrics;
|
|
}
|
|
|
|
|
|
int KDChartTextPiece::width() const
|
|
{
|
|
if( _isRichText )
|
|
return _richText->widthUsed();
|
|
else
|
|
return _metrics->width( _text );
|
|
}
|
|
|
|
|
|
int KDChartTextPiece::height() const
|
|
{
|
|
|
|
if( _isRichText ) {
|
|
//qDebug ("_richText height %s", QString::number(_richText->height()).latin1());
|
|
return _richText->height();
|
|
}
|
|
else {
|
|
|
|
//qDebug ("_metrics height %s", QString::number(_metrics->height()).latin1());
|
|
return _metrics->height();
|
|
}
|
|
}
|
|
|
|
|
|
int KDChartTextPiece::fontLeading() const
|
|
{
|
|
return _metrics->leading();
|
|
}
|
|
|
|
QRect KDChartTextPiece::rect( QPainter *p, const QRect& clipRect) const
|
|
{
|
|
QRect rect( clipRect );
|
|
QFont font( _font );
|
|
|
|
if( _isRichText ) {
|
|
|
|
// Pending Michel make sure the fonts are not too large
|
|
if ( _richText->height() > clipRect.height() || _richText->width() > clipRect.width() )
|
|
font.setPixelSize( QMIN( (int)clipRect.width(),(int)clipRect.height() ) );
|
|
|
|
_richText->setDefaultFont( font );
|
|
_richText->setWidth( p, clipRect.width() );
|
|
rect.setWidth( _richText->width() );
|
|
rect.setHeight( _richText->height() );
|
|
} else
|
|
rect = clipRect;
|
|
|
|
return rect;
|
|
}
|
|
|
|
void KDChartTextPiece::draw( QPainter *p, int x, int y,
|
|
const QRect& clipRect,
|
|
const QColor& color,
|
|
const QBrush* paper ) const
|
|
{
|
|
|
|
if( _isRichText ) {
|
|
|
|
QColorGroup cg;
|
|
//calculate the text area before drawing
|
|
QRect txtArea = rect( p,clipRect);
|
|
cg.setColor( QColorGroup::Text, color );
|
|
_richText->draw( p, txtArea.x(), txtArea.y(),txtArea , cg, paper );
|
|
} else {
|
|
p->save();
|
|
p->setFont( _font );
|
|
if( paper )
|
|
p->setBrush( *paper );
|
|
p->setPen( color );
|
|
//dont clip to avoid truncated text
|
|
//p->setClipRect( txtArea );
|
|
if( _dirtyMetrics ){
|
|
if( _metrics )
|
|
delete _metrics;
|
|
KDChartTextPiece* meNotConst = const_cast<KDChartTextPiece*>(this);
|
|
//KDChartTextPiece* meNotConst(const_cast<KDChartTextPiece*>(this));
|
|
meNotConst->_metrics = new QFontMetrics( p->fontMetrics() );
|
|
meNotConst->_dirtyMetrics = false;
|
|
}
|
|
|
|
p->drawText( x, y + _metrics->ascent(), _text );
|
|
p->restore();
|
|
}
|
|
}
|
|
|
|
|
|
void KDChartTextPiece::draw( QPainter *p, int x, int y,
|
|
const QRegion& clipRegion,
|
|
const QColor& color,
|
|
const QBrush* paper ) const
|
|
{
|
|
if( _isRichText ) {
|
|
QColorGroup cg;
|
|
cg.setColor( QColorGroup::Text, color );
|
|
_richText->setDefaultFont( _font );
|
|
_richText->setWidth( p, clipRegion.boundingRect().width() );
|
|
_richText->draw( p, x, y, clipRegion, cg, paper );
|
|
} else {
|
|
p->save();
|
|
p->setFont( _font );
|
|
if( paper )
|
|
p->setBrush( *paper );
|
|
p->setPen( color );
|
|
p->setClipRegion( clipRegion );
|
|
|
|
if( _dirtyMetrics ){
|
|
if( _metrics )
|
|
delete _metrics;
|
|
|
|
// this line does not compile with MSVC++:
|
|
// KDChartTextPiece* meNotConst( const_cast<KDChartTextPiece*>(this) );
|
|
KDChartTextPiece* meNotConst = const_cast<KDChartTextPiece*>(this);
|
|
|
|
meNotConst->_metrics = new QFontMetrics( p->fontMetrics() );
|
|
meNotConst->_dirtyMetrics = false;
|
|
}
|
|
|
|
p->drawText( x, y + _metrics->ascent(), _text );
|
|
p->restore();
|
|
}
|
|
}
|
|
|
|
|
|
QString KDChartTextPiece::text() const
|
|
{
|
|
return _text;
|
|
}
|
|
|
|
|
|
QFont KDChartTextPiece::font() const
|
|
{
|
|
return _font;
|
|
}
|
|
|
|
|
|
bool KDChartTextPiece::isRichText() const
|
|
{
|
|
return _isRichText;
|
|
}
|
|
|
|
|
|
|
|
#include "KDChartTextPiece.moc"
|