Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

qwt_text.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2003   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 // vim: expandtab
00011 
00012 #include <qpainter.h>
00013 #include <qpalette.h>
00014 #if QT_VERSION < 0x040000
00015 #include <qsimplerichtext.h>
00016 #include <qstylesheet.h>
00017 #else
00018 #include <qtextdocument.h>
00019 #endif
00020 #include "qwt_painter.h"
00021 #include "qwt_text.h"
00022 
00023 Qt::TextFormat QwtText::d_defaultFormat = Qt::AutoText;
00024 
00025 class QwtText::PrivateData
00026 {
00027 public:
00028     PrivateData(const QString &txt, const QFont &fnt, int flgs, 
00029             const QColor &c, const QPen &pen, const QBrush &brush):
00030         flags(flgs),
00031         text(txt),
00032         font(fnt),
00033         color(c),
00034         fontMetrics(fnt),
00035         rectPen(pen),
00036         rectBrush(brush)
00037     {
00038     }
00039 
00040     int flags;
00041     QString text;
00042     QFont font;
00043     QColor color;
00044     QFontMetrics fontMetrics;
00045     QPen rectPen;
00046     QBrush rectBrush;
00047 };
00048 
00049 class QwtRichText::PrivateData
00050 {
00051 public:
00052     PrivateData():
00053         doc(NULL)
00054     {
00055     }
00056     ~PrivateData()
00057     {
00058         delete doc;
00059     }
00060 #if QT_VERSION < 0x040000
00061     QSimpleRichText *doc;
00062 #else
00063     QTextDocument *doc;
00064 #endif
00065 };
00066 
00067 #if QT_VERSION < 0x040000
00068 static QSimpleRichText *richText(const QString &text, const QFont &font)
00069 {
00070     return new QSimpleRichText(text, font);
00071 }
00072 #else
00073 static QTextDocument *richText(const QString &text, const QFont &font)
00074 {
00075     QTextDocument *doc = new QTextDocument();
00076     doc->setUndoRedoEnabled(false);
00077     doc->setDefaultFont(font);
00078     doc->setHtml(text);
00079     
00080     return doc;
00081 }
00082 #endif
00083 
00095 QwtText::QwtText(const QString &text, const QFont &font, 
00096    int flags, const QColor &color, const QPen &pen, const QBrush &brush)
00097 {
00098     d_data = new PrivateData(text, font, flags, color, pen, brush);
00099 }
00100 
00102 QwtText::~QwtText() 
00103 {
00104     delete d_data;
00105 }
00106 
00120 QwtText *QwtText::makeText(const QString &text, 
00121     int flags, const QFont &font, const QColor &color,
00122     const QPen &pen, const QBrush &brush)
00123 {
00124     return makeText(text, defaultFormat(), flags, font, color, pen, brush);
00125 }
00126 
00140 QwtText *QwtText::makeText(const QString &text, Qt::TextFormat format,
00141     int flags, const QFont &font, const QColor &color,
00142     const QPen &pen, const QBrush &brush)
00143 {
00144 #ifndef QT_NO_RICHTEXT
00145     bool richText = false;
00146     if (format == Qt::RichText)
00147         richText = true;
00148     else if ( format == Qt::AutoText )
00149     {
00150 #if QT_VERSION < 0x040000
00151         if ( QStyleSheet::mightBeRichText(text) )
00152 #else
00153         if ( Qt::mightBeRichText(text) )
00154 #endif
00155             richText = true;
00156     }
00157     
00158     if ( richText )
00159         return new QwtRichText(text, font, flags, color, pen, brush);
00160 
00161 #endif
00162 
00163     return new QwtPlainText(text, font, flags, color, pen, brush);
00164 }
00165 
00167 void QwtText::setDefaultFormat(Qt::TextFormat format)
00168 {
00169     d_defaultFormat = format;
00170 }
00171 
00173 Qt::TextFormat QwtText::defaultFormat()
00174 {
00175     return d_defaultFormat;
00176 }
00177 
00179 void QwtText::setText(const QString &text) 
00180 { 
00181     d_data->text = text; 
00182 }
00183 
00185 QString QwtText::text() const 
00186 { 
00187     return d_data->text; 
00188 }
00189 
00191 void QwtText::setFont(const QFont &font) 
00192 {
00193     d_data->font = font; 
00194     d_data->fontMetrics = QFontMetrics(font);
00195 }
00196 
00198 QFont QwtText::font() const 
00199 { 
00200     return d_data->font; 
00201 }
00202 
00204 QFontMetrics QwtText::fontMetrics() const 
00205 { 
00206     return d_data->fontMetrics; 
00207 }
00208 
00213 void QwtText::setFlags(int flags) 
00214 { 
00215     d_data->flags = flags; 
00216 }
00217 
00219 int QwtText::flags() const 
00220 { 
00221     return d_data->flags; 
00222 }
00223 
00225 void QwtText::setColor(const QColor &color) 
00226 { 
00227     d_data->color = color; 
00228 }
00229 
00231 QColor QwtText::color() const 
00232 { 
00233     return d_data->color; 
00234 }
00235 
00237 void QwtText::setRectPen(const QPen &pen) 
00238 { 
00239     d_data->rectPen = pen; 
00240 }
00241 
00243 QPen QwtText::rectPen() const 
00244 { 
00245     return d_data->rectPen; 
00246 }
00247 
00249 void QwtText::setRectBrush(const QBrush &brush) 
00250 { 
00251     d_data->rectBrush = brush; 
00252 }
00253 
00255 QBrush QwtText::rectBrush() const 
00256 { 
00257     return d_data->rectBrush; 
00258 }
00259 
00271 QwtPlainText::QwtPlainText(const QString &text, const QFont &font,
00272         int flags, const QColor &color, const QPen &pen, const QBrush &brush):
00273     QwtText(text, font, flags, color, pen, brush) 
00274 {
00275 }
00276 
00284 QwtPlainText::QwtPlainText(const QString &text, 
00285         const QFont &font, const QColor &color):
00286     QwtText(text, font, 
00287 #if QT_VERSION < 0x040000
00288         Qt::AlignCenter | Qt::WordBreak | Qt::ExpandTabs, 
00289 #else
00290         Qt::AlignCenter | Qt::TextWordWrap | Qt::TextExpandTabs,
00291 #endif
00292         color) 
00293 {
00294 }
00295 
00297 QwtText *QwtPlainText::clone() const
00298 {
00299     return new QwtPlainText(
00300         text(), font(), flags(), color(), rectPen(), rectBrush());
00301 }
00302 
00308 int QwtPlainText::heightForWidth(int width) const
00309 {
00310     const QwtLayoutMetrics metrics(QwtPainter::metricsMap());
00311     return metrics.heightForWidth(text(), width, flags(), fontMetrics());
00312 }
00313 
00319 void QwtPlainText::draw(QPainter *painter, const QRect &rect) const
00320 {
00321     painter->save();
00322     painter->setPen(rectPen());
00323     painter->setBrush(rectBrush());
00324     QwtPainter::drawRect(painter, rect);
00325     painter->restore();
00326 
00327     painter->save();
00328     painter->setFont(font());
00329     painter->setPen(color());
00330     QwtPainter::drawText(painter, rect, flags(), text());
00331     painter->restore();
00332 }
00333 
00334 QRect QwtPlainText::boundingRect(QPainter *painter) const
00335 {
00336     const QwtLayoutMetrics metrics(QwtPainter::metricsMap());
00337     
00338     if (painter)
00339     {
00340         painter->save();
00341         painter->setFont(font());
00342         const QRect rect = metrics.boundingRect(text(), 
00343             flags(), painter);
00344         painter->restore();
00345         return rect;
00346     }
00347 
00348     return metrics.boundingRect(text(), flags(), fontMetrics());
00349 }
00350 
00351 #ifndef QT_NO_RICHTEXT
00352 
00364 QwtRichText::QwtRichText(const QString &text, const QFont &font,
00365         int flags, const QColor &color, const QPen &pen, const QBrush &brush):
00366     QwtText(text, font, flags, color, pen, brush)
00367 { 
00368     d_data = new PrivateData;
00369     d_data->doc = richText(text, font);
00370     setText(text); 
00371 }
00372 
00380 QwtRichText::QwtRichText(const QString &text, const QFont &font,
00381         const QColor &color):
00382     QwtText(text, font,
00383 #if QT_VERSION < 0x040000
00384         Qt::AlignCenter | Qt::WordBreak | Qt::ExpandTabs,
00385 #else
00386         Qt::AlignCenter | Qt::TextWordWrap | Qt::TextExpandTabs,
00387 #endif
00388         color)
00389 { 
00390     d_data = new PrivateData;
00391     d_data->doc = richText(text, font);
00392     setText(text); 
00393 }
00394 
00396 QwtRichText::~QwtRichText() 
00397 { 
00398     delete d_data; 
00399 }
00400 
00402 QwtText *QwtRichText::clone() const
00403 {
00404     return new QwtRichText(
00405         text(), font(), flags(), color(), rectPen(), rectBrush());
00406 }
00407 
00409 void QwtRichText::setText(const QString &text)
00410 {
00411     QwtText::setText(text);
00412 
00413     delete d_data->doc;
00414     d_data->doc = richText(taggedText(text, flags()), font());
00415 }
00416 
00418 void QwtRichText::setFont(const QFont &font)
00419 {
00420     d_data->doc->setDefaultFont(font);
00421     QwtText::setFont(font);
00422 }
00423 
00425 void QwtRichText::setFlags(int flags)
00426 {
00427     QwtText::setFlags(flags);
00428 
00429     delete d_data->doc;
00430     d_data->doc = richText(taggedText(text(), flags), font());
00431 }
00432 
00438 int QwtRichText::heightForWidth(int width) const
00439 {
00440     const QwtLayoutMetrics metrics(QwtPainter::metricsMap());
00441     return metrics.heightForWidth(*d_data->doc, width);
00442 }
00443 
00449 void QwtRichText::draw(QPainter *painter, const QRect &rect) const
00450 {
00451     painter->save();
00452     painter->setPen(rectPen());
00453     painter->setBrush(rectBrush());
00454     QwtPainter::drawRect(painter, rect);
00455     painter->restore();
00456 
00457     painter->save();
00458 
00459     painter->setPen(color());
00460     painter->setFont(font());
00461 
00462     QwtPainter::drawSimpleRichText(painter, rect, flags(), *d_data->doc);
00463 
00464     painter->restore();
00465 }
00466 
00467 #if QT_VERSION < 0x040000
00468 QRect QwtRichText::boundingRect(QPainter *painter) const
00469 {
00470     const QwtLayoutMetrics metrics(QwtPainter::metricsMap());
00471     return metrics.boundingRect(*d_data->doc, flags(), painter);
00472 }
00473 #else
00474 QRect QwtRichText::boundingRect(QPainter *) const
00475 {
00476     const QwtLayoutMetrics metrics(QwtPainter::metricsMap());
00477     return metrics.boundingRect(text(), *d_data->doc, flags());
00478 }
00479 #endif
00480 
00482 QString QwtRichText::taggedText(const QString &text, int flags) const
00483 {
00484     QString rich = text;
00485 
00486     // By default QSimpleRichText is Qt::AlignLeft
00487     if (flags & Qt::AlignJustify) 
00488     {
00489         rich.prepend(QString::fromLatin1("<div align=\"justify\">"));
00490         rich.append(QString::fromLatin1("</div>"));
00491     } 
00492     else if (flags & Qt::AlignRight)
00493     {
00494         rich.prepend(QString::fromLatin1("<div align=\"right\">"));
00495         rich.append(QString::fromLatin1("</div>"));
00496     }
00497     else if (flags & Qt::AlignHCenter) 
00498     {
00499         rich.prepend(QString::fromLatin1("<div align=\"center\">"));
00500         rich.append(QString::fromLatin1("</div>"));
00501     }
00502 
00503     return rich;
00504 }
00505 
00506 #endif

Generated on Wed Aug 31 23:02:30 2005 for Qwt User's Guide by  doxygen 1.4.1