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.
253 lines
7.2 KiB
253 lines
7.2 KiB
/***************************************************************************
|
|
textitem.cpp - description
|
|
-------------------
|
|
begin : Do Sep 2 2004
|
|
copyright : (C) 2004 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.
|
|
|
|
***************************************************************************/
|
|
|
|
#include "textitem.h"
|
|
#include "labelutils.h"
|
|
#include "labeleditor.h"
|
|
#include "tokenprovider.h"
|
|
|
|
// we need sin and cos
|
|
#include <math.h>
|
|
|
|
#include <tqapplication.h>
|
|
#include <tqdom.h>
|
|
#include <tqpaintdevicemetrics.h>
|
|
#include <tqpainter.h>
|
|
#include <tqpicture.h>
|
|
#include <tqsimplerichtext.h>
|
|
|
|
#include <kapplication.h>
|
|
#include <tqwmatrix.h>
|
|
|
|
TextItem::TextItem()
|
|
: DocumentItem()
|
|
{
|
|
init();
|
|
}
|
|
|
|
void TextItem::init()
|
|
{
|
|
m_text = TQString();
|
|
m_rotation = 0.0;
|
|
|
|
setBorder( false );
|
|
setRect( TQRect( 0, 0, 100, 100 ) );
|
|
}
|
|
|
|
void TextItem::draw(TQPainter* painter)
|
|
{
|
|
bool autosize = false;
|
|
const TQString t = tokenProvider() ? tokenProvider()->parse( m_text ) : m_text;
|
|
|
|
if( t != m_text )
|
|
autosize = true;
|
|
|
|
TQPaintDeviceMetrics metrics( DocumentItem::paintDevice() );
|
|
|
|
double scalex = (double)metrics.logicalDpiX() / (double)TQPaintDevice::x11AppDpiX();
|
|
double scaley = (double)metrics.logicalDpiY() / (double)TQPaintDevice::x11AppDpiY();
|
|
|
|
TQColorGroup cg;
|
|
TQSimpleRichText srt( t, painter->font() );
|
|
|
|
/*
|
|
int width = (rect().width() < (int)((double)srt.widthUsed()*scalex) && autosize) ? srt.widthUsed() : rect().width();
|
|
int height = (rect().height() < (int)((double)srt.height()*scaley) && autosize) ? srt.height() : rect().height();
|
|
*/
|
|
|
|
int width = (int)((double)rect().width() / scalex);
|
|
int height = (int)((double)rect().height() / scaley);
|
|
|
|
painter->save();
|
|
|
|
int w = rect().width();
|
|
int h = rect().height();
|
|
|
|
switch( (int)m_rotation )
|
|
{
|
|
default:
|
|
case 0:
|
|
painter->translate( rect().x(), rect().y() );
|
|
break;
|
|
case 90:
|
|
painter->translate( rect().x() + w, rect().y() );
|
|
tqSwap( w, h );
|
|
break;
|
|
case 180:
|
|
painter->translate( rect().x() + w, rect().y() + h );
|
|
break;
|
|
case 270:
|
|
painter->translate( rect().x(), rect().y() + h );
|
|
tqSwap( w, h );
|
|
break;
|
|
};
|
|
|
|
painter->rotate( m_rotation );
|
|
|
|
if( !TextItem::IsTQtTextRenderingBroken() )
|
|
{
|
|
painter->setPen( TQt::black );
|
|
srt.setWidth( painter, w );
|
|
srt.draw( painter, 0, 0, TQRect( 0, 0, w, h ), cg );
|
|
}
|
|
else
|
|
{
|
|
TQRect r( 0, 0, width, height );
|
|
TQPicture picture;
|
|
TQPainter p( &picture );
|
|
LabelUtils::renderString( &p, t, r, scalex, scaley );
|
|
p.end();
|
|
painter->drawPicture( 0, 0, picture );
|
|
}
|
|
|
|
painter->restore();
|
|
|
|
DocumentItem::drawBorder( painter );
|
|
}
|
|
|
|
void TextItem::drawZpl( TQTextStream* stream )
|
|
{
|
|
// simply remove all html tags....
|
|
TQString data = m_text.replace( TQRegExp("<[^>]*>"), "" );
|
|
*stream << ZPLUtils::fieldOrigin( rect().x(), rect().y() );
|
|
*stream << ZPLUtils::font( TQFont() ); // todo: select a valid font
|
|
}
|
|
|
|
void TextItem::drawIpl( TQTextStream* stream, IPLUtils* utils )
|
|
{
|
|
int counter = utils->counter();
|
|
|
|
// simply remove all html tags....
|
|
TQString data = m_text.replace( TQRegExp("<[^>]*>"), "" );
|
|
|
|
TQString s = TQString("H%1;").arg( counter ); // field number
|
|
|
|
s += utils->fieldOrigin( rect().x(), rect().y() );
|
|
|
|
s += TQString("c%1;").arg( 2 ); // font
|
|
s += TQString("h%1;").arg( 2 ); // vertical magnification ("height")
|
|
s += TQString("w%1;").arg( 2 ); // horicontyl magnification ("width")
|
|
s += TQString("d0,%1;").arg( data.length() ); // max length of data !
|
|
|
|
*stream << utils->field( s );
|
|
utils->addValue( data );
|
|
}
|
|
|
|
void TextItem::drawEPcl( TQTextStream* stream )
|
|
{
|
|
// TODO: parse text field HTML
|
|
|
|
// Need to wrap string if too long...
|
|
//
|
|
|
|
// break string into lines
|
|
TQString t = m_text.replace( TQRegExp("<[^>]*>"), "" );
|
|
// @DOM:
|
|
// TODO:
|
|
// provide an API which simplifies wordwrapping for
|
|
// barcode printers
|
|
|
|
TQStringList lines = TQStringList::split( "\n", t );
|
|
|
|
TQStringList::Iterator line = lines.begin();
|
|
for( int i=0; line != lines.end(); ++line, ++i ){
|
|
TQString s = TQString("T %1").arg( rect().x() + 1 );
|
|
s += TQString(" %1 0 0 0 50 1").arg( rect().y()+50+1 + i*52 );
|
|
s += TQString(" %1").arg( *line );
|
|
*stream << EPCLUtils::field( s );
|
|
}
|
|
}
|
|
|
|
void TextItem::loadXML (TQDomElement* element)
|
|
{
|
|
TQDomNode n = element->firstChild();
|
|
while( !n.isNull() ) {
|
|
TQDomElement e = n.toElement(); // try to convert the node to an element.
|
|
if( !e.isNull() )
|
|
if( e.tagName() == "text" )
|
|
{
|
|
setText( e.text() );
|
|
break;
|
|
}
|
|
n = n.nextSibling();
|
|
}
|
|
|
|
m_rotation = element->attribute("rotation", "0.0").toDouble();
|
|
DocumentItem::loadXML( element );
|
|
}
|
|
|
|
void TextItem::saveXML (TQDomElement* element)
|
|
{
|
|
TQDomElement texttag = element->ownerDocument().createElement( "text" );
|
|
texttag.appendChild( element->ownerDocument().createTextNode( text() ) );
|
|
element->appendChild( texttag );
|
|
element->setAttribute( "rotation", m_rotation );
|
|
|
|
DocumentItem::saveXML( element );
|
|
}
|
|
|
|
TQString TextItem::text () const
|
|
{
|
|
return m_text;
|
|
}
|
|
|
|
void TextItem::setText (const TQString & text)
|
|
{
|
|
m_text = text;
|
|
}
|
|
|
|
bool TextItem::s_qt_broken_init = false;
|
|
bool TextItem::s_qt_broken = false;
|
|
|
|
bool TextItem::IsTQtTextRenderingBroken()
|
|
{
|
|
if( !s_qt_broken_init )
|
|
{
|
|
TQString version( tqVersion() );
|
|
// tqDebug( "Detected TQt Version: %s", version.latin1() );
|
|
int major = version.section( ".", 0, 0 ).toInt();
|
|
int minor = version.section( ".", 1, 1 ).toInt();
|
|
int bugfix = version.section( ".", 2, 2 ).toInt();
|
|
|
|
if( major >= 3 )
|
|
{
|
|
if( major == 3 && minor < 3 )
|
|
s_qt_broken = true;
|
|
else if( major == 3 && minor == 3 )
|
|
{
|
|
if( bugfix < 2 )
|
|
s_qt_broken = true;
|
|
else
|
|
s_qt_broken = false;
|
|
}
|
|
else
|
|
s_qt_broken = false;
|
|
}
|
|
else
|
|
s_qt_broken = true;
|
|
|
|
if( s_qt_broken )
|
|
tqDebug("TQt's text redering is broken - using KBarcode fix.");
|
|
|
|
s_qt_broken_init = true;
|
|
return s_qt_broken;
|
|
}
|
|
else
|
|
return s_qt_broken;
|
|
}
|
|
|