/***************************************************************************
                         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 <tdeapplication.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 );

    painter->setPen( TQt::black );
    srt.setWidth( painter, w );
    srt.draw( painter, 0, 0, TQRect( 0, 0, w, h ), cg );

    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;    
}

