00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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