00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "KWClassicSerialDataSource.h"
00022 #include "KWClassicSerialDataSource.moc"
00023 #include "KWMailMergeDataBase.h"
00024 #include <kinputdialog.h>
00025 #include <qlabel.h>
00026 #include <qhbox.h>
00027 #include <qlayout.h>
00028 #include <qvbox.h>
00029 #include <qpushbutton.h>
00030 #include <qlineedit.h>
00031 #include <qvalidator.h>
00032 #include <klocale.h>
00033 #include <kdebug.h>
00034 #include <qtoolbutton.h>
00035 #include <qtooltip.h>
00036 #include <kiconloader.h>
00037 #include <qheader.h>
00038 #include "KWDocument.h"
00039 #include "defs.h"
00040
00041 #define KWSLCPBarIcon( x ) BarIcon( x, db->KWInstance() )
00042
00043
00044
00045
00046
00047
00048
00049 KWClassicSerialDataSource::KWClassicSerialDataSource(KInstance *inst,QObject *parent)
00050 : KWMailMergeDataSource(inst,parent)
00051
00052 {
00053 }
00054
00055 KWClassicSerialDataSource::~KWClassicSerialDataSource()
00056 {
00057 }
00058
00059 QString KWClassicSerialDataSource::getValue( const QString &name, int record ) const
00060 {
00061 int num = record;
00062
00063
00064
00065 if ( num < 0 || num > (int)db.count() )
00066 return name;
00067
00068 return db[ num ][ name ];
00069 }
00070
00071 void KWClassicSerialDataSource::setValue( const QString &name, const QString &value, int record )
00072 {
00073 int num = record;
00074
00075
00076
00077 if ( num < 0 || num > (int)db.count() )
00078 return;
00079
00080 db[ num ][ name ] = value;
00081 }
00082
00083 void KWClassicSerialDataSource::appendRecord()
00084 {
00085 DbRecord record( sampleRecord );
00086 db.append( record );
00087 }
00088
00089 void KWClassicSerialDataSource::addEntry( const QString &name )
00090 {
00091 sampleRecord[ name ] = i18n( "No Value" );
00092 Db::Iterator it = db.begin();
00093 for ( ; it != db.end(); ++it )
00094 ( *it )[ name ] = sampleRecord[ name ];
00095 }
00096
00097 void KWClassicSerialDataSource::removeEntry( const QString &name )
00098 {
00099 sampleRecord.remove( name );
00100 Db::Iterator it = db.begin();
00101 for ( ; it != db.end(); ++it )
00102 ( *it ).remove( name );
00103 }
00104
00105 void KWClassicSerialDataSource::removeRecord( int i )
00106 {
00107 if ( (i < 0) || (i > (int)db.count() - 1) )
00108 return;
00109
00110 kdDebug()<<QString("Removing record %1").arg(i)<<endl;
00111
00112 Db::Iterator it = db.at( i);
00113 db.remove( it );
00114 }
00115
00116 void KWClassicSerialDataSource::save( QDomDocument &doc, QDomElement &parent)
00117 {
00118 QDomElement def=doc.createElement(QString::fromLatin1("DEFINITION"));
00119 parent.appendChild(def);
00120 for (DbRecord::Iterator it=sampleRecord.begin();it!=sampleRecord.end();++it)
00121 {
00122 QDomElement defEnt=doc.createElement(QString::fromLatin1("FIELD"));
00123 defEnt.setAttribute(QString::fromLatin1("name"),it.key());
00124 def.appendChild(defEnt);
00125 }
00126 QDomElement cont=doc.createElement(QString::fromLatin1("CONTENT"));
00127 parent.appendChild(cont);
00128 for (Db::Iterator dbI=db.begin();dbI!=db.end();++dbI)
00129 {
00130 QDomElement rec=doc.createElement(QString::fromLatin1("RECORD"));
00131 cont.appendChild(rec);
00132 for (DbRecord::Iterator it=sampleRecord.begin();it!=sampleRecord.end();++it)
00133 {
00134 QDomElement recEnt=doc.createElement(QString::fromLatin1("ITEM"));
00135 recEnt.setAttribute(QString::fromLatin1("name"),it.key());
00136 recEnt.setAttribute(QString::fromLatin1("data"),(*dbI)[it.key()]);
00137 rec.appendChild(recEnt);
00138 }
00139 }
00140 }
00141
00142 void KWClassicSerialDataSource::load( QDomElement& parentElem )
00143 {
00144 db.clear();
00145 sampleRecord.clear();
00146 QDomNode defNd=parentElem.namedItem("DEFINITION");
00147 if (defNd.isNull()) return;
00148 QDomElement def=defNd.toElement();
00149 for (QDomElement defEnt=def.firstChild().toElement();!defEnt.isNull();defEnt=defEnt.nextSibling().toElement())
00150 {
00151 sampleRecord[defEnt.attribute(QString::fromLatin1("name"))]=i18n( "No Value" );
00152 }
00153 QDomNode contNd=parentElem.namedItem("CONTENT");
00154 if (contNd.isNull()) return;
00155 for (QDomNode rec=contNd.firstChild();!rec.isNull();rec=rec.nextSibling())
00156 {
00157 appendRecord();
00158 for (QDomElement recEnt=rec.firstChild().toElement();!recEnt.isNull();recEnt=recEnt.nextSibling().toElement())
00159 {
00160 setValue(recEnt.attribute(QString::fromLatin1("name")),
00161 recEnt.attribute(QString::fromLatin1("data")),db.count()-1);
00162 }
00163 }
00164 }
00165
00166 bool KWClassicSerialDataSource::showConfigDialog(QWidget *par,int action)
00167 {
00168 if (action==KWSLCreate)
00169 {
00170 db.clear();
00171 sampleRecord.clear();
00172 }
00173 KWClassicMailMergeEditor *dia=new KWClassicMailMergeEditor( par, this );
00174 bool ret=(dia->exec()==QDialog::Accepted);
00175 delete dia;
00176 return ret;
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186 KWClassicMailMergeEditorListItem::KWClassicMailMergeEditorListItem( QListView *parent )
00187 : QListViewItem( parent )
00188 {
00189 editWidget = new QLineEdit( listView()->viewport() );
00190 listView()->addChild( editWidget );
00191 }
00192
00193 KWClassicMailMergeEditorListItem::KWClassicMailMergeEditorListItem( QListView *parent, QListViewItem *after )
00194 : QListViewItem( parent, after )
00195 {
00196 editWidget = new QLineEdit( listView()->viewport() );
00197 listView()->addChild( editWidget );
00198 }
00199
00200 KWClassicMailMergeEditorListItem::~KWClassicMailMergeEditorListItem()
00201 {
00202 delete editWidget;
00203 }
00204
00205 void KWClassicMailMergeEditorListItem::setText( int i, const QString &text )
00206 {
00207 QListViewItem::setText( i, text );
00208 if ( i == 1 )
00209 editWidget->setText( text );
00210 }
00211
00212 QString KWClassicMailMergeEditorListItem::text( int i ) const
00213 {
00214 if ( i == 1 )
00215 return editWidget->text();
00216 return QListViewItem::text( i );
00217 }
00218
00219 void KWClassicMailMergeEditorListItem::setup()
00220 {
00221 setHeight( QMAX( listView()->fontMetrics().height(),
00222 editWidget->sizeHint().height() ) );
00223 if ( listView()->columnWidth( 1 ) < editWidget->sizeHint().width() )
00224 listView()->setColumnWidth( 1, editWidget->sizeHint().width() );
00225 }
00226
00227 void KWClassicMailMergeEditorListItem::update()
00228 {
00229 editWidget->resize( listView()->header()->cellSize( 1 ), height() );
00230 listView()->moveChild( editWidget, listView()->header()->cellPos( 1 ),
00231 listView()->itemPos( this ) + listView()->contentsY() );
00232 editWidget->show();
00233 }
00234
00235
00236
00237
00238
00239
00240
00241 KWClassicMailMergeEditorList::KWClassicMailMergeEditorList( QWidget *parent, KWClassicSerialDataSource *db_ )
00242 : QListView( parent ), db( db_ )
00243 {
00244 setSorting( -1 );
00245 addColumn( i18n( "Name" ) );
00246 addColumn( i18n( "Value" ) );
00247 header()->setMovingEnabled( FALSE );
00248 connect( header(), SIGNAL( sizeChange( int, int, int ) ),
00249 this, SLOT( columnSizeChange( int, int, int ) ) );
00250
00251
00252 disconnect( header(), SIGNAL( sectionClicked( int ) ),
00253 this, SLOT( changeSortColumn( int ) ) );
00254
00255 currentRecord = -1;
00256 }
00257
00258 void KWClassicMailMergeEditorList::invalidateCurrentRecord()
00259 {
00260 currentRecord=-1;
00261 }
00262
00263 KWClassicMailMergeEditorList::~KWClassicMailMergeEditorList()
00264 {
00265 if ( currentRecord == -1 )
00266 return;
00267
00268 QListViewItemIterator lit( this );
00269 QMap< QString, QString >::ConstIterator it = db->getRecordEntries().begin();
00270 for ( ; it != db->getRecordEntries().end(); ++it ) {
00271 QListViewItem *item = 0;
00272 item = lit.current();
00273 ++lit;
00274 if ( currentRecord != -1 && item )
00275 db->setValue( it.key(), item->text( 1 ), currentRecord );
00276 }
00277 }
00278
00279 void KWClassicMailMergeEditorList::columnSizeChange( int c, int, int )
00280 {
00281 if ( c == 0 || c == 1 )
00282 updateItems();
00283 }
00284
00285 void KWClassicMailMergeEditorList::sectionClicked( int )
00286 {
00287 updateItems();
00288 }
00289
00290 void KWClassicMailMergeEditorList::updateItems()
00291 {
00292 QListViewItemIterator it( this );
00293 for ( ; it.current(); ++it )
00294 ( (KWClassicMailMergeEditorListItem*)it.current() )->update();
00295 }
00296
00297 void KWClassicMailMergeEditorList::displayRecord( int i )
00298 {
00299 if ( i < 0 || i >= db->getNumRecords() )
00300 return;
00301
00302 bool create = !firstChild();
00303 QListViewItemIterator lit( this );
00304 QMap< QString, QString >::ConstIterator it = db->getRecordEntries().begin();
00305 QListViewItem *after = 0;
00306 for ( ; it != db->getRecordEntries().end(); ++it ) {
00307 QListViewItem *item = 0;
00308 if ( create ) {
00309 item = new KWClassicMailMergeEditorListItem( this, after );
00310 item->setText( 0, it.key() );
00311 after = item;
00312 } else {
00313 item = lit.current();
00314 ++lit;
00315 if ( currentRecord != -1 && item )
00316 db->setValue( it.key(), item->text( 1 ), currentRecord );
00317 }
00318
00319 if ( item )
00320 item->setText( 1, db->getValue( it.key(), i ) );
00321 }
00322 updateItems();
00323 currentRecord = i;
00324 }
00325
00326
00327
00328
00329
00330
00331
00332 KWClassicMailMergeEditor::KWClassicMailMergeEditor( QWidget *parent, KWClassicSerialDataSource *db_ )
00333 : KDialogBase( Plain, i18n( "Mail Merge - Editor" ), Ok | Cancel, Ok, parent, "", true ), db( db_ )
00334 {
00335 back = plainPage();
00336
00337 QVBoxLayout *l = new QVBoxLayout( back );
00338 l->setAutoAdd(true);
00339 l->setSpacing( KDialog::spacingHint() );
00340
00341 QHBox *toolbar = new QHBox( back );
00342
00343 first = new QToolButton( toolbar );
00344 first->setIconSet( SmallIconSet( "start" ) );
00345 first->setFixedSize( first->sizeHint() );
00346 connect(first, SIGNAL(clicked()), this, SLOT(firstRecord()));
00347
00348 back_ = new QToolButton( toolbar );
00349 back_->setIconSet( SmallIconSet( "back" ) );
00350 back_->setFixedSize( back_->sizeHint() );
00351 connect(back_, SIGNAL(clicked()), this, SLOT(prevRecord()));
00352
00353 records = new QSpinBox( 1, db->getNumRecords(), 1, toolbar );
00354 records->setMaximumHeight( records->sizeHint().height() );
00355 connect( records, SIGNAL( valueChanged( int ) ),
00356 this, SLOT( changeRecord( int ) ) );
00357
00358 forward = new QToolButton( toolbar );
00359 forward->setIconSet( SmallIconSet( "forward" ) );
00360 forward->setFixedSize( forward->sizeHint() );
00361 connect(forward, SIGNAL(clicked()), this, SLOT(nextRecord()));
00362
00363 finish = new QToolButton( toolbar );
00364 finish->setIconSet( SmallIconSet( "finish" ) );
00365 finish->setFixedSize( finish->sizeHint() );
00366 connect(finish, SIGNAL(clicked()), this, SLOT(lastRecord()));
00367
00368 QWidget *sep = new QWidget( toolbar );
00369 sep->setMaximumWidth( 10 );
00370
00371 newRecord = new QToolButton( toolbar );
00372 newRecord->setIconSet( SmallIconSet( "sl_addrecord" ) );
00373 newRecord->setFixedSize( newRecord->sizeHint() );
00374 connect( newRecord, SIGNAL( clicked() ),
00375 this, SLOT( addRecord() ) );
00376 QToolTip::add( newRecord, i18n( "Add record" ) );
00377
00378 newEntry = new QToolButton( toolbar );
00379 newEntry->setIconSet( SmallIconSet( "sl_addentry" ) );
00380 newEntry->setFixedSize( newEntry->sizeHint() );
00381 connect( newEntry, SIGNAL( clicked() ),
00382 this, SLOT( addEntry() ) );
00383 QToolTip::add( newEntry, i18n( "Add entry" ) );
00384
00385 deleteRecord = new QToolButton( toolbar );
00386 deleteRecord->setIconSet( SmallIconSet( "sl_delrecord" ) );
00387 deleteRecord->setFixedSize( deleteRecord->sizeHint() );
00388 connect( deleteRecord, SIGNAL( clicked() ),
00389 this, SLOT( removeRecord() ) );
00390 QToolTip::add( deleteRecord, i18n( "Remove record" ) );
00391
00392 deleteEntry = new QToolButton( toolbar );
00393 deleteEntry->setIconSet( SmallIconSet( "sl_delentry" ) );
00394 deleteEntry->setFixedSize( deleteEntry->sizeHint() );
00395 connect( deleteEntry, SIGNAL( clicked() ),
00396 this, SLOT( removeEntry() ) );
00397 QToolTip::add( deleteEntry, i18n( "Remove entry" ) );
00398
00399 dbList = new KWClassicMailMergeEditorList( back, db );
00400
00401 if ( db->getNumRecords() > 0 ) {
00402 records->setValue( 1 );
00403 dbList->displayRecord(0);
00404
00405 } else {
00406 first->setEnabled(false);
00407 back_->setEnabled(false);
00408 forward->setEnabled(false);
00409 finish->setEnabled(false);
00410 newRecord->setEnabled(false);
00411 deleteEntry->setEnabled(false);
00412 deleteRecord->setEnabled(false);
00413 records->setEnabled(true);
00414 }
00415 setInitialSize( QSize( 600, 400 ) );
00416 updateButton();
00417 }
00418
00419 void KWClassicMailMergeEditor::firstRecord()
00420 {
00421 records->setValue(1);
00422 updateButton();
00423 }
00424
00425 void KWClassicMailMergeEditor::prevRecord()
00426 {
00427 records->setValue(records->value()-1);
00428 updateButton();
00429 }
00430
00431 void KWClassicMailMergeEditor::nextRecord()
00432 {
00433 records->setValue(records->value()+1);
00434 updateButton();
00435 }
00436
00437 void KWClassicMailMergeEditor::lastRecord()
00438 {
00439 records->setValue(records->maxValue());
00440 updateButton();
00441 }
00442
00443
00444 void KWClassicMailMergeEditor::updateButton()
00445 {
00446 int val = records->value();
00447 first->setEnabled( val > 1);
00448 back_->setEnabled( val> 1 );
00449 forward->setEnabled( val < records->maxValue() );
00450 finish->setEnabled( val < records->maxValue());
00451
00452 }
00453
00454 void KWClassicMailMergeEditor::resizeEvent( QResizeEvent *e )
00455 {
00456 KDialogBase::resizeEvent( e );
00457
00458 }
00459
00460 void KWClassicMailMergeEditor::changeRecord( int i )
00461 {
00462 dbList->displayRecord( i - 1 );
00463 }
00464
00465 void KWClassicMailMergeEditor::addEntry()
00466 {
00467 bool ok;
00468 QString value=KInputDialog::getText( i18n("Add Entry"),
00469 i18n("Enter entry name:"),
00470 QString::null,
00471 &ok,
00472 this);
00473 if ((ok) && !value.isEmpty())
00474 {
00475 if ( db->getNumRecords() == 0 )
00476 {
00477 first->setEnabled(true);
00478 back_->setEnabled(true);
00479 forward->setEnabled(true);
00480 finish->setEnabled(true);
00481 newRecord->setEnabled(true);
00482 deleteEntry->setEnabled(true);
00483 deleteRecord->setEnabled(true);
00484 records->setEnabled(true);
00485 addRecord();
00486 }
00487 dbList->clear();
00488 db->addEntry( value );
00489 changeRecord( records->value() );
00490 dbList->updateItems();
00491 }
00492 updateButton();
00493 }
00494
00495 void KWClassicMailMergeEditor::addRecord()
00496 {
00497 db->appendRecord();
00498 records->setRange( records->minValue(), records->maxValue() + 1 );
00499 records->setValue( db->getNumRecords() );
00500 updateButton();
00501
00502 }
00503
00504 void KWClassicMailMergeEditor::removeEntry()
00505 {
00506 QListViewItem * item = dbList->selectedItem ();
00507 if ( item )
00508 {
00509 db->removeEntry( item->text(0) );
00510 dbList->clear();
00511 changeRecord( records->value() );
00512 dbList->updateItems();
00513 updateButton();
00514 }
00515 #if defined( Q_CC_GNU )
00516 #warning reimplement
00517 #endif
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532 }
00533
00534 void KWClassicMailMergeEditor::removeRecord()
00535 {
00536 if ( db->getNumRecords() == 0 )
00537 return;
00538
00539 db->removeRecord( records->value() - 1 );
00540 dbList->invalidateCurrentRecord();
00541 if ( db->getNumRecords() > 0 ) {
00542 records->setRange( records->minValue(), records->maxValue() - 1 );
00543 records->setValue( 1 );
00544 dbList->clear();
00545 dbList->updateItems();
00546 } else
00547 {
00548 dbList->clear();
00549 records->setEnabled( FALSE );
00550 }
00551
00552 if ( db->getNumRecords() == 0 )
00553 {
00554 newRecord->setEnabled(false);
00555 deleteEntry->setEnabled(false);
00556 deleteRecord->setEnabled(false);
00557 records->setEnabled(true);
00558 }
00559
00560 updateButton();
00561 }
00562
00563 extern "C" {
00564 KWORD_MAILMERGE_EXPORT KWMailMergeDataSource *create_kwmailmerge_classic(KInstance *inst,QObject *parent)
00565 {
00566 return new KWClassicSerialDataSource(inst,parent);
00567 }
00568
00569 }