kword

KWClassicSerialDataSource.cpp

00001 /* This file is part of the KDE project
00002    Original file (mailmerge.cc): Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
00003    Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
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  * Class: KWClassicSerialDataSource
00046  *
00047  ******************************************************************/
00048 
00049 KWClassicSerialDataSource::KWClassicSerialDataSource(KInstance *inst,QObject *parent)
00050     : KWMailMergeDataSource(inst,parent)
00051 //    : doc( doc_ )
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 /*    if ( num == -1 )
00063         num = doc->getMailMergeRecord(); Is this really needed ?*/
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 /*    if ( num == -1 )
00075         num = doc->getMailMergeRecord(); Is this really needed?*/
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  * Class: KWClassicMailMergeEditorListItem
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  * Class: KWClassicMailMergeEditorList
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 //     connect( header(), SIGNAL( sectionClicked( int ) ),
00251 //           this, SLOT( sectionClicked( int ) ) );
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  * Class: KWClassicMailMergeEditor
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 //        dbList->updateItems();
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 //    back->resize( size() );
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     if ( db->getNumRecords() == 0 )
00520         return;
00521 
00522     KWMailMergeVariableInsertDia
00523         *dia = new KWMailMergeVariableInsertDia( this, db );
00524     if ( dia->exec() == QDialog::Accepted ) {
00525         dbList->clear();
00526         db->removeEntry( dia->getName() );
00527         changeRecord( records->value() + 1 );
00528         dbList->updateItems();
00529     }
00530     delete dia;
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys