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.
kbarcode/kbarcode/dsrichtext.h

194 lines
7.0 KiB

/***************************************************************************
dsrichtext.h - description
-------------------
begin : Fre Okt 17 2003
copyright : (C) 2003 by Dominik Seichter
email : domseichter@web.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef DSRICHTEXT_H
#define DSRICHTEXT_H
#define TQT_TEXT_BUG
/*#undef TQT_TEXT_BUG*/
#ifdef TQT_TEXT_BUG
#include <tqcolor.h>
#include <tqfont.h>
#include <tqstring.h>
#include <tqvaluelist.h>
class DSRichText;
/** This class represents one word,
* formated with a font, a color and an
* alignment.
*/
struct formated_word {
TQString text;
TQFont font;
TQColor color;
int alignment;
bool line;
};
typedef TQValueList<formated_word> WordList;
/** This structure represents a single line.
* Every line contains a list of formated_words.
* Wordwrapping has been applied before the line
* was created.
* lineSpacing, ascent and leading come from the
* biggest font in the line.
*/
struct formated_line {
int width;
int lineSpacing;
int ascent;
int leading;
bool line;
WordList formats;
};
typedef TQValueList<formated_line> LineList;
class TQColor;
class TQPainter;
/** A richtext rendering class, which draws a piece
* of HTML formated richtext on any TQPainter.
* This class works with all printer resolutions compared
* to the buggy TQSimpleRichText
*
* rendering the richtext happens in 3 steps:
* <ul>
* <li> the HTML data is parsed into text_format structures. Each
* of these text_format structures may represend multiple lines, but
* also single words. This depends on how long a formated text is.
* this step happens in the constructor and in parseParagraph()</li>
* <li> the text_format structures are parsed into line structures.
* In this step the wordwrapping is calculated. Each line structure
* has again text_format structures. This is necessary because a line
* of text may of course contain different formattings. A line struct is always
* a single line of drawn text, not more and not less.
* happens in draw() and fillLines()</li>
* <li> the line structure is drawn line by line using TQPainter.
* happens in draw()</li>
* </ul>
*
* Printing to the screen is easy and the usage does not differ from
* TQSimpleRichText. Drawing on TQPrinter is a little bit more complicated.
* The most important thing is that you may not use TQPainter::scale().
* A small example on how to print on a TQPrinter:
* <pre>
* TQPrinter printer( TQPrinter::HighResolution );
* TQPainter painter( &printer );
* TQPaintDeviceMetrics metrics( &printer );
* double scalex = (double)metrics.logicalDpiX() / (double)TQPaintDevice::x11AppDpiX();
* double scaley = (double)metrics.logicalDpiY() / (double)TQPaintDevice::x11AppDpiY();
*
* DSRichText dsr( "&lt;html&gt;&lt;p&gt;Hallo World&lt;/p&gt;&lt;/html&gt;" );
* dsr.setWidth( 200 ); // in screenresolution coordinates
* dsr.setHeight( 80 ); // in screenresolution coordinates
* painter.translate( 10 * scalex, 10 * scaley ); // draw at 10, 10 instead of 0, 0
* dsr.scale( scalex, scaley );
* dsr.draw( &painter );
* </pre>
*
*@author Dominik Seichter
*/
class DSRichText {
public:
/** construct a DSRichText object. @p t is formated text as produces by TQTextEdit.
*/
DSRichText( const TQString & t );
~DSRichText();
void setX( int x );
void setY( int y );
/** draw the formated text on the TQPainter* @p p
*/
void draw( TQPainter* p );
/** set the width of the clipping rectangle
*/
void setWidth( int width );
/** set the height of the clipping rectangle
*/
void setHeight( int height );
/** scale everything. This is necessary to print on devices
* with another resolution than the screen. TQPainter::scale() won't work.
*/
void setScale( double x, double y ) {
sx = x; sy = y;
};
private:
/** parse a single pare of <p></p> elements
*/
bool parseParagraph();
/** remove <p> and </p> from the TQString @p t and return it.
* This function is also responsible for getting the
* correct alignment of the paragraph.
*/
TQString parseParagraphTag( const TQString & t, int* alignment );
/** parse the align attribute of a <p> tag and return the corresponding TQt alignment value.
*/
int parseAlignment( const TQString & align );
/** parse the css style attribute of a <span> tag and return a matching TQFont for these
* style. The font color is saved in the TQColor* @p color.
*/
TQFont parseStyle( const TQString & s, TQColor* color );
TQString parse( const TQString & t, const TQString & find, const TQString & end, int start );
void parseWords( const TQString & t, formated_word* w, WordList* words );
void initFormat( formated_word* f, int alignment );
void initLine( TQValueList<formated_line>* l );
void updateSpacing( TQValueList<formated_line>* l, TQFontMetrics* fm );
/** draw the line @p line justified as blockquote
*/
void drawJustified( formated_line* line );
/** calculate the y-deviation needed, because of different font sizes in this line
*/
inline int yDeviation( const formated_line* line );
/** replace HTML escape sequences such as &lt; to their real character meaning (i.e. < )
*/
TQString replaceEscapeSequences( const TQString & t );
/** fill the line structures with data
*/
void fillLines();
int pos; // current position in text
int start; // start of a tag
int end; // end of a tag
int x; // x position
int y; // y position
int w; // width of the text element
int h; // height of the text element
int xpos; // x position at the beginning
int ypos; // y position at the beginning
double sx;
double sy;
TQString text;
TQFont m_base;
TQColor m_color;
TQPainter* painter;
TQValueList<LineList> line_p;
TQValueList<WordList> word_p;
};
#endif // TQT_TEXT_BUG
#endif