/*************************************************************************** barcodeitem.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 "barcodeitem.h" #include "tcanvasitem.h" #include #include #include BarcodeItem::BarcodeItem() : Barkode(), DocumentItem() { init(); } BarcodeItem::BarcodeItem( const Barkode & bcode ) : Barkode( bcode ), DocumentItem() { init(); } TQMap BarcodeItem::legacy; void BarcodeItem::init() { // read barcodes saved by kbarcode < 1.3.0 /* // disable legacy code as it is really old // and conflicts with tbarcode2 support if( !legacy.count() ) { legacy.insert( "0", "any" ); legacy.insert( "1", "ean" ); legacy.insert( "2", "upc" ); legacy.insert( "3", "isbn" ); legacy.insert( "4", "code39" ); legacy.insert( "5", "code128" ); legacy.insert( "6", "code128c" ); legacy.insert( "7", "code128b" ); legacy.insert( "8", "i25" ); legacy.insert( "9", "i28raw" ); legacy.insert( "10", "cbr" ); legacy.insert( "11", "msi" ); legacy.insert( "12", "pls" ); legacy.insert( "13", "code93" ); legacy.insert( "14", "msi" ); legacy.insert( "15", "code39 -c" ); legacy.insert( "16", "i25 -c" ); } */ setBorder( false ); setRect( TQRect( 0, 0, 100, 100 ) ); updateBarcode(); } void BarcodeItem::loadXML (TQDomElement* element) { // TODO: default() should be called first and the current values should be used // instead of the now hardcoded values // i.e: setQuietZone( element->attribute("margin", TQString::number( quietZone() ) ).toInt() ); setQuietZone( element->attribute("margin", "10" ).toInt() ); setRotation( element->attribute("rotation", "0" ).toInt() ); setScaling( element->attribute("scale", "1000" ).toDouble() / 1000 ); setCut( element->attribute("cut", "1.0" ).toDouble() ); setType( element->attribute("type", "code39" ) ); /* * check for encoding types saved by kbarcode <= 1.2.0 */ if( legacy.contains( type() ) ) setType( legacy[type()] ); setTextVisible( element->attribute("text", "0" ).toInt() ); setDatabaseMode( element->attribute("caption", "Static" ) ); if( engine()->options() ) engine()->options()->load( element ); setDatamatrixSize( element->attribute( "datamatrix.size", "0" ).toInt() ); setSequenceEnabled( element->attribute( "sequenceenabled", "0" ).toInt() ); if( sequenceEnabled() ) { setSequenceMode( (ESequence)element->attribute( "sequencemode", "0" ).toInt() ); setSequenceStep( element->attribute( "sequencestep", "1" ).toInt() ); setSequenceStart( element->attribute( "sequencestart", "0" ).toInt() ); } 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() == "value" ) setValue( e.text() ); n = n.nextSibling(); } DocumentItem::loadXML( element ); updateBarcode(); } void BarcodeItem::saveXML (TQDomElement* element) { element->setAttribute( "margin", quietZone() ); element->setAttribute( "rotation", rotation() ); element->setAttribute( "cut", cut() ); element->setAttribute( "caption", databaseMode() ); /* * This values are only needed for !cache and for sequences */ element->setAttribute( "sequenceenabled", sequenceEnabled() ); if( sequenceEnabled() ) { element->setAttribute( "sequencemode", (int)sequenceMode() ); element->setAttribute( "sequencestep", sequenceStep() ); element->setAttribute( "sequencestart", sequenceStart() ); } element->setAttribute( "type", type() ); element->setAttribute( "text", textVisible() ); element->setAttribute( "scale", scaling()*1000 ); if( engine()->options() ) engine()->options()->save( element ); element->setAttribute( "datamatrix.size", datamatrixSize() ); TQDomElement texttag = element->ownerDocument().createElement( "value" ); texttag.appendChild( element->ownerDocument().createTextNode( value() ) ); element->appendChild( texttag ); DocumentItem::saveXML( element ); } void BarcodeItem::draw (TQPainter* painter) { if( DocumentItem::paintDevice() && DocumentItem::paintDevice()->isExtDev() ) { painter->save(); /* TQPaintDeviceMetrics metrics( DocumentItem::paintDevice() ); double scalex = (double)metrics.logicalDpiX() / (double)TQPaintDevice::x11AppDpiX(); double scaley = (double)metrics.logicalDpiY() / (double)TQPaintDevice::x11AppDpiY(); painter->scale( 1.0 / scalex, 1.0 / scaley ); */ //painter->drawPixmap( rect().x(), rect().y(), m_pixmap ); drawBarcode( *painter, rect().x(), rect().y() ); painter->restore(); } else { painter->save(); drawBarcode( *painter, rect().x(), rect().y() ); painter->restore(); TCanvasItem* citem = canvasItem(); if( citem ) { citem->setSize( Barkode::size().width(), Barkode::size().height() ); } // TODO: do a bitBlt when device is screen //painter->drawPixmap( rect().x(), rect().y(), m_pixmap ); //bitBlt( painter->device(), rect().x(), rect().y(), &m_pixmap, 0, 0, rect().width(), rect().height(), TQt::CopyROP ); } DocumentItem::drawBorder( painter ); } void BarcodeItem::drawZpl( TQTextStream* stream ) { TQString encoding = ZPLUtils::encoding( type() ); if( encoding.isNull() ) { tqDebug( "ERROR: No ZPL barcode found"); return; } *stream << ZPLUtils::fieldOrigin( rect().x(), rect().y() ); *stream << "^B" << encoding; *stream << ZPLUtils::fieldData( value() ); } void BarcodeItem::drawIpl( TQTextStream* stream, IPLUtils* utils ) { TQString encoding = utils->encoding( type() ); if( encoding.isEmpty() ) { tqDebug( "ERROR: No IPL barcode found"); return; } int counter = utils->counter(); TQString s = TQString("B%1;").arg( counter ); // field number s += utils->fieldOrigin( rect().x(), rect().y() ); s += TQString("c%1;").arg( encoding ); // encoding type s += TQString("h%1;").arg( rect().height() ); // height of barcode s += TQString("w%1;").arg( 3 ); // width of barcode (per line) s += TQString("d0,%1;").arg( value().length() ); // max length of data *stream << utils->field( s ); utils->addValue( value() ); } void BarcodeItem::drawEPcl( TQTextStream* stream ) { TQString encoding = EPCLUtils::encoding( type() ); if( encoding.isEmpty() ) { tqDebug( "ERROR: No EPCL barcode found"); return; } // Coordinates cannot start at zero TQString s = TQString("B %1").arg( rect().x()+1 ); s += TQString(" %1 0").arg( rect().y() + rect().height() ); s += TQString(" %1 1 4").arg( encoding ); s += TQString(" %1 1").arg( rect().height() ); s += TQString(" %1").arg( value() ); *stream << EPCLUtils::field( s ); } void BarcodeItem::updateBarcode() { Barkode::setTokenProvider( tokenProvider() ); Barkode::update( DocumentItem::paintDevice() ); setSize( Barkode::size().width(), Barkode::size().height() ); }