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/propertywidget.cpp

632 lines
20 KiB

/***************************************************************************
propertywidget.h - description
-------------------
begin : Do Sep 10 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 "propertywidget.h"
#include "documentitem.h"
#include "rectitem.h"
#include "commands.h"
#include "sqltables.h"
#include "barcodecombo.h"
#include "multilineeditdlg.h"
#include "textitem.h"
#include "imageitem.h"
#include "measurements.h"
#include "mycanvasview.h"
//NY20
#include "textlineitem.h"
#include "textlineedit.h"
//NY20
#include "tokendialog.h"
#include <kcolorbutton.h>
#include <kcombobox.h>
#include <kcommand.h>
#include <kiconloader.h>
#include <kimageio.h>
#include <klineedit.h>
#include <klocale.h>
#include <knuminput.h>
#include <ktextedit.h>
#include <kurlrequester.h>
#include <tqcheckbox.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqpainter.h>
#include <tqradiobutton.h>
#include <tqsqlquery.h>
#include <tqvbox.h>
#include <tqvbuttongroup.h>
#include <kmessagebox.h>
#define IMAGE_INTERNAL i18n("Image Saved in KBarcode")
void FillLineCombo( KComboBox* box )
{
/* A small helper function to fill
* a combobox with all by TQt
* supported pen styles.
*/
// TODO: Use the enum for TQt line styles here!
TQPainter p;
for( int i = 1; i < 6; i++ ) {
TQPixmap pixmap( 60, 20 );
pixmap.fill( TQt::white );
p.begin( &pixmap );
p.setPen( TQPen( TQt::black, 3, (TQt::PenStyle)i ) );
p.drawLine( 5, 10, 55, 10 );
p.end();
box->insertItem( pixmap );
}
}
PropertyWidget::PropertyWidget(TQWidget* parent )
: TQWidget( parent, 0 )
{
grid = new TQGridLayout( this, 2, 2 );
}
PropertyBorder::PropertyBorder( TQWidget* parent )
: PropertyWidget( parent )
{
checkBorder = new TQCheckBox( this );
checkBorder->setText( i18n("&Border Visible") );
buttonColor = new KColorButton( this );
spinWidth = new KIntNumInput( this );
spinWidth->setRange( 1, 100, 1, false );
comboLine = new KComboBox( false, this );
FillLineCombo( comboLine );
grid->addMultiCellWidget( checkBorder, 0, 0, 0, 1 );
grid->addWidget( new TQLabel( i18n("Color:"), this ), 1, 0 );
grid->addWidget( buttonColor, 1, 1 );
grid->addWidget( new TQLabel( i18n("Line Width:"), this ), 2, 0 );
grid->addWidget( spinWidth, 2, 1 );
grid->addWidget( new TQLabel( i18n("Line Style:"), this ), 3, 0 );
grid->addWidget( comboLine, 3, 1 );
connect( checkBorder, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableControls() ) );
}
void PropertyBorder::applySettings( DocumentItem* item, KMacroCommand* command )
{
BorderCommand* bc = new BorderCommand( checkBorder->isChecked(), TQPen( buttonColor->color(), spinWidth->value(), (TQt::PenStyle)(comboLine->currentItem() + 1) ), item );
bc->execute();
command->addCommand( bc );
}
void PropertyBorder::initSettings( DocumentItem* item )
{
checkBorder->setChecked( item->border() );
buttonColor->setColor( item->pen().color() );
spinWidth->setValue( item->pen().width() );
comboLine->setCurrentItem( item->pen().style() - 1 );
enableControls();
}
void PropertyBorder::enableControls()
{
buttonColor->setEnabled( checkBorder->isChecked() );
spinWidth->setEnabled( checkBorder->isChecked() );
comboLine->setEnabled( checkBorder->isChecked() );
}
PropertyRotation::PropertyRotation( TQWidget* parent )
: PropertyWidget( parent )
{
TQLabel* label = new TQLabel( i18n("&Rotation:"), this );
comboRotation = new KComboBox( FALSE, this );
label->setBuddy( comboRotation );
comboRotation->insertItem( i18n("0") );
comboRotation->insertItem( i18n("90") );
comboRotation->insertItem( i18n("180") );
comboRotation->insertItem( i18n("270") );
grid->addWidget( label, 0, 0 );
grid->addWidget( comboRotation, 0, 1 );
}
void PropertyRotation::applySettings( DocumentItem* item, KMacroCommand* command )
{
TextItem* text = static_cast<TextItem*>(item);
double rot = 0.0;
if( comboRotation->currentItem() == 1 )
rot = 90.0;
else if( comboRotation->currentItem() == 2 )
rot = 180.0;
else if( comboRotation->currentItem() == 3 )
rot = 270.0;
TextRotationCommand* rc = new TextRotationCommand( rot, text );
rc->execute();
command->addCommand( rc );
}
void PropertyRotation::initSettings( DocumentItem* item )
{
TextItem* text = static_cast<TextItem*>(item);
if( text->rotation() == 0.0 )
comboRotation->setCurrentItem( 0 );
else if( text->rotation() == 90.0 )
comboRotation->setCurrentItem( 1 );
else if( text->rotation() == 180.0 )
comboRotation->setCurrentItem( 2 );
else if( text->rotation() == 270.0 )
comboRotation->setCurrentItem( 3 );
}
PropertyFill::PropertyFill( TQWidget* parent )
: PropertyWidget( parent )
{
buttonColor = new KColorButton( this );
grid->addWidget( new TQLabel( i18n("Color:"), this ), 0, 0 );
grid->addWidget( buttonColor, 0, 1 );
}
void PropertyFill::applySettings( DocumentItem* item, KMacroCommand* command )
{
RectItem* rect = static_cast<RectItem*>(item);
FillCommand* fc = new FillCommand( buttonColor->color(), rect );
fc->execute();
command->addCommand( fc );
}
void PropertyFill::initSettings( DocumentItem* item )
{
RectItem* rect = static_cast<RectItem*>(item);
buttonColor->setColor( rect->color() );
}
PropertyBarcode::PropertyBarcode( TokenProvider* token, TQWidget* parent )
: PropertyWidget( parent )
{
TQLabel* TextLabel1 = new TQLabel( this, "TextLabel1" );
TextLabel1->setText( i18n( "Barcode Settings:" ) );
comboComplex = new KComboBox( FALSE, this );
if( SqlTables::isConnected() )
{
TQSqlQuery* query = new TQSqlQuery("select encoding_type from barcode_basic group by encoding_type");
while( query->next() )
comboComplex->insertItem( "Main:" + query->value( 0 ).toString() );
delete query;
query = new TQSqlQuery("select customer_no, encoding_type from customer_text group by customer_no, encoding_type");
while( query->next() )
comboComplex->insertItem( query->value( 0 ).toString() + ":" + query->value( 1 ).toString() );
delete query;
}
comboComplex->insertItem( "Static" );
barcode = new BarcodeWidget( this, "barcode" );
barcode->setTokenProvider( token );
//connect( this, TQT_SIGNAL( defaultClicked() ), this, TQT_SLOT( defaults() ) );
connect( comboComplex, TQT_SIGNAL( activated(int) ), this, TQT_SLOT(changedCombo() ) );
grid->addWidget( TextLabel1, 0, 0 );
grid->addWidget( comboComplex, 0, 1 );
grid->addMultiCellWidget( barcode, 1, 1, 0, 1 );
changedCombo();
}
// void PropertyBarcode::defaults()
// {
// comboComplex->setCurrentItem( 0 );
// barcode->defaults();
// }
void PropertyBarcode::changedCombo()
{
bool v = false;
if( comboComplex->currentItem() == comboComplex->count() - 1 )
v = true;
barcode->setDataEnabled( v );
barcode->setStandardEnabled( v );
}
void PropertyBarcode::applySettings( DocumentItem* item, KMacroCommand* command )
{
BarcodeItem* bcode = static_cast<BarcodeItem*>(item);
Barkode* d = new Barkode();
barcode->getData( *d );
if( comboComplex->currentItem() != comboComplex->count() - 1 ) {
d->setType( getTypeFromCaption( comboComplex->currentText() ) );
d->setValue( SqlTables::getInstance()->getBarcodeMaxLength( d->type() ) );
}
d->setDatabaseMode( comboComplex->currentText() );
BarcodeCommand* bc = new BarcodeCommand( bcode, d );
bc->execute();
command->addCommand( bc );
}
void PropertyBarcode::initSettings( DocumentItem* item )
{
BarcodeItem* bcode = static_cast<BarcodeItem*>(item);
barcode->setData( *bcode );
for( int i = 0; i < comboComplex->count(); i++ )
if( comboComplex->text( i ).lower() == bcode->databaseMode().lower() )
comboComplex->setCurrentItem( i );
changedCombo();
}
PropertyText::PropertyText( TokenProvider* token, TQWidget* parent )
: PropertyWidget( parent )
{
m_editor = new MultiLineEditor( token, this, "m_editor" );
grid->addWidget( m_editor, 0, 0 );
}
void PropertyText::applySettings( DocumentItem* item, KMacroCommand* command )
{
TextItem* text = static_cast<TextItem*>(item);
TextChangeCommand* tc = new TextChangeCommand( text, m_editor->text() );
tc->execute();
command->addCommand( tc );
}
void PropertyText::initSettings( DocumentItem* item )
{
TextItem* text = static_cast<TextItem*>(item);
m_editor->setText( text->text() );
}
//NY21
PropertyTextLine::PropertyTextLine( TokenProvider* token, TQWidget* parent )
: PropertyWidget( parent )
{
m_editor = new TextLineEditor( token, this );
grid->addWidget( m_editor, 0, 0 );
}
void PropertyTextLine::applySettings( DocumentItem* item, KMacroCommand* command )
{
TextLineItem* text = static_cast<TextLineItem*>(item);
TextLineChangeCommand* tc = new TextLineChangeCommand( text, m_editor->text(), m_editor->getFontType(),m_editor->getVertMag(),m_editor->getHorMag() );
tc->execute();
command->addCommand( tc );
}
void PropertyTextLine::initSettings( DocumentItem* item )
{
TextLineItem* text = static_cast<TextLineItem*>(item);
m_editor->setText( text->text() );
m_editor->setFontType(text->getFont());
m_editor->setHorMag(text->getMagHor());
m_editor->setVertMag(text->getMagVert());
}
//NY21
PropertySize::PropertySize( TQWidget* parent )
: PropertyWidget( parent )
{
const double low = -1000.0;
const double max = 1000.0;
TQVBox* box = new TQVBox( this );
checkLock = new TQCheckBox( i18n("&Protect item from being moved or resized"), box );
numTop = new KDoubleNumInput( low, max, 0.0, 0.2, 3, box );
numLeft = new KDoubleNumInput( numTop, low, max, 0.0, 0.2, 3, box );
numHeight = new KDoubleNumInput( numLeft, low, max, 0.0, 0.2, 3, box );
numWidth = new KDoubleNumInput( numHeight, low, max, 0.0, 0.2, 3, box );
numTop->setSuffix( Measurements::system() );
numLeft->setSuffix( Measurements::system() );
numHeight->setSuffix( Measurements::system() );
numWidth->setSuffix( Measurements::system() );
numTop->setLabel( i18n("&Top:"), AlignLeft | AlignCenter );
numLeft->setLabel( i18n("&Left:"), AlignLeft | AlignCenter );
numHeight->setLabel( i18n("&Height:"), AlignLeft | AlignCenter );
numWidth->setLabel( i18n("&Width:"), AlignLeft | AlignCenter );
grid->addWidget( box, 0, 0 );
connect( checkLock, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableControls() ));
}
void PropertySize::enableControls()
{
numTop->setEnabled( !checkLock->isChecked() );
numLeft->setEnabled( !checkLock->isChecked() );
numHeight->setEnabled( !checkLock->isChecked() );
numWidth->setEnabled( !checkLock->isChecked() );
}
void PropertySize::applySettings( DocumentItem* item, KMacroCommand* command )
{
TQRect r = item->rect();
TQPoint translation( 0, 0 );
TCanvasItem* canvasItem = item->canvasItem();
if( canvasItem )
{
MyCanvasView* view = canvasItem->canvasView();
translation = view->getTranslation();
}
if( Measurements::measurementSystem() == Measurements::Metric )
{
r.setX( (int)(numLeft->value() * 1000));
r.setY( (int)(numTop->value() * 1000));
r.setWidth( (int)(numWidth->value() * 1000));
r.setHeight( (int)(numHeight->value() * 1000));
}
else
{
/* This conversion from int to millimeter should get its own
* function or maybe even an own class.
*/
#warning "test inch to mm!"
r.setX( (int)(numLeft->value() * 1000 * 25.4000508001016 ) );
r.setY( (int)(numTop->value() * 1000 * 25.4000508001016 ) );
r.setWidth( (int)(numWidth->value() * 1000 * 25.4000508001016 ) );
r.setHeight( (int)(numHeight->value() * 1000 * 25.4000508001016 ) );
}
if( canvasItem )
{
if( item->rectMM().x() != r.x() || item->rectMM().y() != r.y() )
{
MoveCommand* mc = new MoveCommand( r.x(), r.y(), canvasItem );
mc->execute();
command->addCommand( mc );
}
if( item->rectMM() != r )
{
ResizeCommand* rc = new ResizeCommand( canvasItem, false );
rc->setRect( r.x(), r.y(), r.width(), r.height() );
rc->execute();
command->addCommand( rc );
}
if( checkLock->isChecked() != item->locked() )
{
LockCommand* lc = new LockCommand( checkLock->isChecked(), canvasItem );
lc->execute();
command->addCommand( lc );
}
}
}
void PropertySize::initSettings( DocumentItem* item )
{
TQRect r = item->rectMM();
TQPoint translation( 0, 0 );
TCanvasItem* canvasItem = item->canvasItem();
if( canvasItem )
{
MyCanvasView* view = canvasItem->canvasView();
translation = view->getTranslation();
}
if( Measurements::measurementSystem() == Measurements::Metric )
{
numLeft->setValue( r.x() / 1000.0 );
numTop->setValue( r.y() / 1000.0 );
numWidth->setValue( r.width() / 1000.0 );
numHeight->setValue( r.height() / 1000.0 );
}
else // Imperial
{
numLeft->setValue( (r.x() / 1000.0) / 25.4000508001016 );
numTop->setValue( (r.y() / 1000.0) / 25.4000508001016 );
numWidth->setValue( (r.width() / 1000.0) / 25.4000508001016 );
numHeight->setValue( (r.height() / 1000.0) / 25.4000508001016 );
}
checkLock->setChecked( item->locked() );
enableControls();
}
PropertyImage::PropertyImage( TokenProvider* token, TQWidget* parent )
: PropertyWidget( parent ), m_token( token )
{
TQLabel* label = new TQLabel( i18n("&Rotation:"), this );
comboRotation = new KComboBox( FALSE, this );
label->setBuddy( comboRotation );
TQVButtonGroup* groupFile = new TQVButtonGroup( i18n("&Image"), this );
radioImagePath = new TQRadioButton( i18n("&Load image from path"), groupFile );
imgUrl = new KURLRequester( groupFile );
imgUrl->setFilter( KImageIO::pattern( KImageIO::Reading ) );
imgUrl->setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
radioImageExpression = new TQRadioButton( i18n("&Read image path from expression"), groupFile );
imgHBox = new TQHBox( groupFile );
imgHBox->setSpacing( 5 );
imgExpression = new KLineEdit( imgHBox );
buttonToken = new KPushButton( i18n("&Insert Data Field..."), imgHBox );
buttonToken->setIconSet( TQIconSet( SmallIcon("contents") ) );
comboRotation->insertItem( i18n("0") );
comboRotation->insertItem( i18n("90") );
comboRotation->insertItem( i18n("180") );
comboRotation->insertItem( i18n("270") );
TQVButtonGroup* group = new TQVButtonGroup( i18n("&Size"), this );
radioOriginal = new TQRadioButton( i18n("&None"), group );
radioZoomed = new TQRadioButton( i18n("&Zoom"), group );
radioScaled = new TQRadioButton( i18n("S&cale"), group );
checkMirrorH = new TQCheckBox( i18n("Mirror &Horizontaly"), this );
checkMirrorV = new TQCheckBox( i18n("Mirror &Vertically"), this );
grid->addMultiCellWidget( groupFile, 0, 1, 0, 1 );
grid->addMultiCellWidget( group, 2, 3, 0, 1 );
grid->addWidget( label, 4, 0 );
grid->addWidget( comboRotation, 4, 1 );
grid->addMultiCellWidget( checkMirrorH, 5, 5, 0, 1 );
grid->addMultiCellWidget( checkMirrorV, 6, 6, 0, 1 );
connect( radioImageExpression, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableControls() ) );
connect( radioImagePath, TQT_SIGNAL( clicked() ), this, TQT_SLOT( enableControls() ) );
connect( buttonToken, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotTokens() ) );
}
void PropertyImage::applySettings( DocumentItem* item, KMacroCommand* command )
{
ImageItem* img = static_cast<ImageItem*>(item);
EImageScaling scaling = eImage_Original;
double rot = 0.0;
TQPixmap pix;
if( radioImagePath->isChecked() )
{
if( !imgUrl->url().isEmpty() )
{
if( !pix.load( imgUrl->url() ) )
KMessageBox::error( NULL, TQString( i18n("Image format not supported for file: %1") ).tqarg( imgUrl->url() ) );
}
else
{
pix = img->pixmap();
}
}
if( radioZoomed->isChecked() )
scaling = eImage_Zoomed;
else if( radioScaled->isChecked() )
scaling = eImage_Scaled;
if( comboRotation->currentItem() == 1 )
rot = 90.0;
else if( comboRotation->currentItem() == 2 )
rot = 180.0;
else if( comboRotation->currentItem() == 3 )
rot = 270.0;
PictureCommand* pc = new PictureCommand( rot, checkMirrorH->isChecked(), checkMirrorV->isChecked(), scaling, img );
pc->setExpression( radioImageExpression->isChecked() ? imgExpression->text() : TQString() );
pc->setPixmap( pix );
pc->execute();
command->addCommand( pc );
}
void PropertyImage::initSettings( DocumentItem* item )
{
ImageItem* img = static_cast<ImageItem*>(item);
TQString expr = img->expression();
if( !expr.isEmpty() )
{
radioImageExpression->setChecked( true );
imgExpression->setText( expr );
}
else
{
// imgUrl->setURL( IMAGE_INTERNAL );
radioImagePath->setChecked( true );
}
switch( img->scaling() )
{
default:
case eImage_Original:
radioOriginal->setChecked( true );
break;
case eImage_Scaled:
radioScaled->setChecked( true );
break;
case eImage_Zoomed:
radioZoomed->setChecked( true );
break;
}
if( img->rotation() == 0.0 )
comboRotation->setCurrentItem( 0 );
else if( img->rotation() == 90.0 )
comboRotation->setCurrentItem( 1 );
else if( img->rotation() == 180.0 )
comboRotation->setCurrentItem( 2 );
else if( img->rotation() == 270.0 )
comboRotation->setCurrentItem( 3 );
checkMirrorH->setChecked( img->mirrorHorizontal() );
checkMirrorV->setChecked( img->mirrorVertical() );
enableControls();
}
void PropertyImage::enableControls()
{
imgHBox->setEnabled( radioImageExpression->isChecked() );
imgUrl->setEnabled( radioImagePath->isChecked() );
}
void PropertyImage::slotTokens()
{
TokenDialog tokendlg( m_token, this, "tokendlg" );
if( tokendlg.exec() == TQDialog::Accepted )
imgExpression->insert( tokendlg.token() );
}
PropertyVisible::PropertyVisible( TQWidget* parent )
: PropertyWidget( parent )
{
TQLabel* label = new TQLabel( i18n("Evaluate JavsScript code to define the visibility of this item:"), this );
m_script = new KTextEdit( this );
grid->addWidget( label, 0, 0 );
grid->addMultiCellWidget( m_script, 1, 8, 0, 2 );
}
void PropertyVisible::applySettings( DocumentItem* item, KMacroCommand* command )
{
TCanvasItem* canvasItem = item->canvasItem();
ScriptCommand* sc = new ScriptCommand( m_script->text(), canvasItem );
sc->execute();
command->addCommand( sc);
}
void PropertyVisible::initSettings( DocumentItem* item )
{
m_script->setText( item->visibilityScript() );
}
#include "propertywidget.moc"