kword

KWClassicSerialDataSource.cpp
1/* This file is part of the KDE project
2 Original file (mailmerge.cpp): Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
3 Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19*/
20
21#include "KWClassicSerialDataSource.h"
22#include "KWClassicSerialDataSource.moc"
23#include "KWMailMergeDataBase.h"
24#include <kinputdialog.h>
25#include <tqlabel.h>
26#include <tqhbox.h>
27#include <tqlayout.h>
28#include <tqvbox.h>
29#include <tqpushbutton.h>
30#include <tqlineedit.h>
31#include <tqvalidator.h>
32#include <tdelocale.h>
33#include <kdebug.h>
34#include <tqtoolbutton.h>
35#include <tqtooltip.h>
36#include <kiconloader.h>
37#include <tqheader.h>
38#include "KWDocument.h"
39#include "defs.h"
40
41#define KWSLCPBarIcon( x ) BarIcon( x, db->KWInstance() )
42
43/******************************************************************
44 *
45 * Class: KWClassicSerialDataSource
46 *
47 ******************************************************************/
48
49KWClassicSerialDataSource::KWClassicSerialDataSource(TDEInstance *inst,TQObject *parent)
50 : KWMailMergeDataSource(inst,parent)
51// : doc( doc_ )
52{
53}
54
55KWClassicSerialDataSource::~KWClassicSerialDataSource()
56{
57}
58
59TQString KWClassicSerialDataSource::getValue( const TQString &name, int record ) const
60{
61 int num = record;
62/* if ( num == -1 )
63 num = doc->getMailMergeRecord(); Is this really needed ?*/
64
65 if ( num < 0 || num > (int)db.count() )
66 return name;
67
68 return db[ num ][ name ];
69}
70
71void KWClassicSerialDataSource::setValue( const TQString &name, const TQString &value, int record )
72{
73 int num = record;
74/* if ( num == -1 )
75 num = doc->getMailMergeRecord(); Is this really needed?*/
76
77 if ( num < 0 || num > (int)db.count() )
78 return;
79
80 db[ num ][ name ] = value;
81}
82
83void KWClassicSerialDataSource::appendRecord()
84{
85 DbRecord record( sampleRecord );
86 db.append( record );
87}
88
89void KWClassicSerialDataSource::addEntry( const TQString &name )
90{
91 sampleRecord[ name ] = i18n( "No Value" );
92 Db::Iterator it = db.begin();
93 for ( ; it != db.end(); ++it )
94 ( *it )[ name ] = sampleRecord[ name ];
95}
96
97void KWClassicSerialDataSource::removeEntry( const TQString &name )
98{
99 sampleRecord.remove( name );
100 Db::Iterator it = db.begin();
101 for ( ; it != db.end(); ++it )
102 ( *it ).remove( name );
103}
104
105void KWClassicSerialDataSource::removeRecord( int i )
106{
107 if ( (i < 0) || (i > (int)db.count() - 1) )
108 return;
109
110 kdDebug()<<TQString("Removing record %1").arg(i)<<endl;
111
112 Db::Iterator it = db.at( i);
113 db.remove( it );
114}
115
116void KWClassicSerialDataSource::save( TQDomDocument &doc, TQDomElement &parent)
117{
118 TQDomElement def=doc.createElement(TQString::fromLatin1("DEFINITION"));
119 parent.appendChild(def);
120 for (DbRecord::Iterator it=sampleRecord.begin();it!=sampleRecord.end();++it)
121 {
122 TQDomElement defEnt=doc.createElement(TQString::fromLatin1("FIELD"));
123 defEnt.setAttribute(TQString::fromLatin1("name"),it.key());
124 def.appendChild(defEnt);
125 }
126 TQDomElement cont=doc.createElement(TQString::fromLatin1("CONTENT"));
127 parent.appendChild(cont);
128 for (Db::Iterator dbI=db.begin();dbI!=db.end();++dbI)
129 {
130 TQDomElement rec=doc.createElement(TQString::fromLatin1("RECORD"));
131 cont.appendChild(rec);
132 for (DbRecord::Iterator it=sampleRecord.begin();it!=sampleRecord.end();++it)
133 {
134 TQDomElement recEnt=doc.createElement(TQString::fromLatin1("ITEM"));
135 recEnt.setAttribute(TQString::fromLatin1("name"),it.key());
136 recEnt.setAttribute(TQString::fromLatin1("data"),(*dbI)[it.key()]);
137 rec.appendChild(recEnt);
138 }
139 }
140}
141
142void KWClassicSerialDataSource::load( TQDomElement& parentElem )
143{
144 db.clear();
145 sampleRecord.clear();
146 TQDomNode defNd=parentElem.namedItem("DEFINITION");
147 if (defNd.isNull()) return;
148 TQDomElement def=defNd.toElement();
149 for (TQDomElement defEnt=def.firstChild().toElement();!defEnt.isNull();defEnt=defEnt.nextSibling().toElement())
150 {
151 sampleRecord[defEnt.attribute(TQString::fromLatin1("name"))]=i18n( "No Value" );
152 }
153 TQDomNode contNd=parentElem.namedItem("CONTENT");
154 if (contNd.isNull()) return;
155 for (TQDomNode rec=contNd.firstChild();!rec.isNull();rec=rec.nextSibling())
156 {
157 appendRecord();
158 for (TQDomElement recEnt=rec.firstChild().toElement();!recEnt.isNull();recEnt=recEnt.nextSibling().toElement())
159 {
160 setValue(recEnt.attribute(TQString::fromLatin1("name")),
161 recEnt.attribute(TQString::fromLatin1("data")),db.count()-1);
162 }
163 }
164}
165
166bool KWClassicSerialDataSource::showConfigDialog(TQWidget *par,int action)
167{
168 if (action==KWSLCreate)
169 {
170 db.clear();
171 sampleRecord.clear();
172 }
173 KWClassicMailMergeEditor *dia=new KWClassicMailMergeEditor( par, this );
174 bool ret=(dia->exec()==TQDialog::Accepted);
175 delete dia;
176 return ret;
177}
178
179
180/******************************************************************
181 *
182 * Class: KWClassicMailMergeEditorListItem
183 *
184 ******************************************************************/
185
186KWClassicMailMergeEditorListItem::KWClassicMailMergeEditorListItem( TQListView *parent )
187 : TQListViewItem( parent )
188{
189 editWidget = new TQLineEdit( listView()->viewport() );
190 listView()->addChild( editWidget );
191}
192
193KWClassicMailMergeEditorListItem::KWClassicMailMergeEditorListItem( TQListView *parent, TQListViewItem *after )
194 : TQListViewItem( parent, after )
195{
196 editWidget = new TQLineEdit( listView()->viewport() );
197 listView()->addChild( editWidget );
198}
199
200KWClassicMailMergeEditorListItem::~KWClassicMailMergeEditorListItem()
201{
202 delete editWidget;
203}
204
205void KWClassicMailMergeEditorListItem::setText( int i, const TQString &text )
206{
207 TQListViewItem::setText( i, text );
208 if ( i == 1 )
209 editWidget->setText( text );
210}
211
212TQString KWClassicMailMergeEditorListItem::text( int i ) const
213{
214 if ( i == 1 )
215 return editWidget->text();
216 return TQListViewItem::text( i );
217}
218
219void KWClassicMailMergeEditorListItem::setup()
220{
221 setHeight( TQMAX( listView()->fontMetrics().height(),
222 editWidget->sizeHint().height() ) );
223 if ( listView()->columnWidth( 1 ) < editWidget->sizeHint().width() )
224 listView()->setColumnWidth( 1, editWidget->sizeHint().width() );
225}
226
227void KWClassicMailMergeEditorListItem::update()
228{
229 editWidget->resize( listView()->header()->cellSize( 1 ), height() );
230 listView()->moveChild( editWidget, listView()->header()->cellPos( 1 ),
231 listView()->itemPos( this ) + listView()->contentsY() );
232 editWidget->show();
233}
234
235/******************************************************************
236 *
237 * Class: KWClassicMailMergeEditorList
238 *
239 ******************************************************************/
240
241KWClassicMailMergeEditorList::KWClassicMailMergeEditorList( TQWidget *parent, KWClassicSerialDataSource *db_ )
242 : TQListView( parent ), db( db_ )
243{
244 setSorting( -1 );
245 addColumn( i18n( "Name" ) );
246 addColumn( i18n( "Value" ) );
247 header()->setMovingEnabled( false );
248 connect( header(), TQ_SIGNAL( sizeChange( int, int, int ) ),
249 this, TQ_SLOT( columnSizeChange( int, int, int ) ) );
250// connect( header(), TQ_SIGNAL( sectionClicked( int ) ),
251// this, TQ_SLOT( sectionClicked( int ) ) );
252 disconnect( header(), TQ_SIGNAL( sectionClicked( int ) ),
253 this, TQ_SLOT( changeSortColumn( int ) ) );
254
255 currentRecord = -1;
256}
257
258void KWClassicMailMergeEditorList::invalidateCurrentRecord()
259{
260 currentRecord=-1;
261}
262
263KWClassicMailMergeEditorList::~KWClassicMailMergeEditorList()
264{
265 if ( currentRecord == -1 )
266 return;
267
268 TQListViewItemIterator lit( this );
269 TQMap< TQString, TQString >::ConstIterator it = db->getRecordEntries().begin();
270 for ( ; it != db->getRecordEntries().end(); ++it ) {
271 TQListViewItem *item = 0;
272 item = lit.current();
273 ++lit;
274 if ( currentRecord != -1 && item )
275 db->setValue( it.key(), item->text( 1 ), currentRecord );
276 }
277}
278
279void KWClassicMailMergeEditorList::columnSizeChange( int c, int, int )
280{
281 if ( c == 0 || c == 1 )
282 updateItems();
283}
284
285void KWClassicMailMergeEditorList::sectionClicked( int )
286{
287 updateItems();
288}
289
290void KWClassicMailMergeEditorList::updateItems()
291{
292 TQListViewItemIterator it( this );
293 for ( ; it.current(); ++it )
294 ( (KWClassicMailMergeEditorListItem*)it.current() )->update();
295}
296
297void KWClassicMailMergeEditorList::displayRecord( int i )
298{
299 if ( i < 0 || i >= db->getNumRecords() )
300 return;
301
302 bool create = !firstChild();
303 TQListViewItemIterator lit( this );
304 TQMap< TQString, TQString >::ConstIterator it = db->getRecordEntries().begin();
305 TQListViewItem *after = 0;
306 for ( ; it != db->getRecordEntries().end(); ++it ) {
307 TQListViewItem *item = 0;
308 if ( create ) {
309 item = new KWClassicMailMergeEditorListItem( this, after );
310 item->setText( 0, it.key() );
311 after = item;
312 } else {
313 item = lit.current();
314 ++lit;
315 if ( currentRecord != -1 && item )
316 db->setValue( it.key(), item->text( 1 ), currentRecord );
317 }
318
319 if ( item )
320 item->setText( 1, db->getValue( it.key(), i ) );
321 }
322 updateItems();
323 currentRecord = i;
324}
325
326/******************************************************************
327 *
328 * Class: KWClassicMailMergeEditor
329 *
330 ******************************************************************/
331
332KWClassicMailMergeEditor::KWClassicMailMergeEditor( TQWidget *parent, KWClassicSerialDataSource *db_ )
333 : KDialogBase( Plain, i18n( "Mail Merge - Editor" ), Ok | Cancel, Ok, parent, "", true ), db( db_ )
334{
335 back = plainPage();
336
337 TQVBoxLayout *l = new TQVBoxLayout( back );
338 l->setAutoAdd(true);
339 l->setSpacing( KDialog::spacingHint() );
340
341 TQHBox *toolbar = new TQHBox( back );
342
343 first = new TQToolButton( toolbar );
344 first->setIconSet( SmallIconSet( "go-first" ) );
345 first->setFixedSize( first->sizeHint() );
346 connect(first, TQ_SIGNAL(clicked()), this, TQ_SLOT(firstRecord()));
347
348 back_ = new TQToolButton( toolbar );
349 back_->setIconSet( SmallIconSet( "back" ) );
350 back_->setFixedSize( back_->sizeHint() );
351 connect(back_, TQ_SIGNAL(clicked()), this, TQ_SLOT(prevRecord()));
352
353 records = new TQSpinBox( 1, db->getNumRecords(), 1, toolbar );
354 records->setMaximumHeight( records->sizeHint().height() );
355 connect( records, TQ_SIGNAL( valueChanged( int ) ),
356 this, TQ_SLOT( changeRecord( int ) ) );
357
358 forward = new TQToolButton( toolbar );
359 forward->setIconSet( SmallIconSet( "forward" ) );
360 forward->setFixedSize( forward->sizeHint() );
361 connect(forward, TQ_SIGNAL(clicked()), this, TQ_SLOT(nextRecord()));
362
363 finish = new TQToolButton( toolbar );
364 finish->setIconSet( SmallIconSet( "go-last" ) );
365 finish->setFixedSize( finish->sizeHint() );
366 connect(finish, TQ_SIGNAL(clicked()), this, TQ_SLOT(lastRecord()));
367
368 TQWidget *sep = new TQWidget( toolbar );
369 sep->setMaximumWidth( 10 );
370
371 newRecord = new TQToolButton( toolbar );
372 newRecord->setIconSet( SmallIconSet( "sl_addrecord" ) );
373 newRecord->setFixedSize( newRecord->sizeHint() );
374 connect( newRecord, TQ_SIGNAL( clicked() ),
375 this, TQ_SLOT( addRecord() ) );
376 TQToolTip::add( newRecord, i18n( "Add record" ) );
377
378 newEntry = new TQToolButton( toolbar );
379 newEntry->setIconSet( SmallIconSet( "sl_addentry" ) );
380 newEntry->setFixedSize( newEntry->sizeHint() );
381 connect( newEntry, TQ_SIGNAL( clicked() ),
382 this, TQ_SLOT( addEntry() ) );
383 TQToolTip::add( newEntry, i18n( "Add entry" ) );
384
385 deleteRecord = new TQToolButton( toolbar );
386 deleteRecord->setIconSet( SmallIconSet( "sl_delrecord" ) );
387 deleteRecord->setFixedSize( deleteRecord->sizeHint() );
388 connect( deleteRecord, TQ_SIGNAL( clicked() ),
389 this, TQ_SLOT( removeRecord() ) );
390 TQToolTip::add( deleteRecord, i18n( "Remove record" ) );
391
392 deleteEntry = new TQToolButton( toolbar );
393 deleteEntry->setIconSet( SmallIconSet( "sl_delentry" ) );
394 deleteEntry->setFixedSize( deleteEntry->sizeHint() );
395 connect( deleteEntry, TQ_SIGNAL( clicked() ),
396 this, TQ_SLOT( removeEntry() ) );
397 TQToolTip::add( deleteEntry, i18n( "Remove entry" ) );
398
399 dbList = new KWClassicMailMergeEditorList( back, db );
400
401 if ( db->getNumRecords() > 0 ) {
402 records->setValue( 1 );
403 dbList->displayRecord(0);
404// dbList->updateItems();
405 } else {
406 first->setEnabled(false);
407 back_->setEnabled(false);
408 forward->setEnabled(false);
409 finish->setEnabled(false);
410 newRecord->setEnabled(false);
411 deleteEntry->setEnabled(false);
412 deleteRecord->setEnabled(false);
413 records->setEnabled(true);
414 }
415 setInitialSize( TQSize( 600, 400 ) );
416 updateButton();
417}
418
419void KWClassicMailMergeEditor::firstRecord()
420{
421 records->setValue(1);
422 updateButton();
423}
424
425void KWClassicMailMergeEditor::prevRecord()
426{
427 records->setValue(records->value()-1);
428 updateButton();
429}
430
431void KWClassicMailMergeEditor::nextRecord()
432{
433 records->setValue(records->value()+1);
434 updateButton();
435}
436
437void KWClassicMailMergeEditor::lastRecord()
438{
439 records->setValue(records->maxValue());
440 updateButton();
441}
442
443
444void KWClassicMailMergeEditor::updateButton()
445{
446 int val = records->value();
447 first->setEnabled( val > 1);
448 back_->setEnabled( val> 1 );
449 forward->setEnabled( val < records->maxValue() );
450 finish->setEnabled( val < records->maxValue());
451
452}
453
454void KWClassicMailMergeEditor::resizeEvent( TQResizeEvent *e )
455{
456 KDialogBase::resizeEvent( e );
457// back->resize( size() );
458}
459
460void KWClassicMailMergeEditor::changeRecord( int i )
461{
462 dbList->displayRecord( i - 1 );
463}
464
465void KWClassicMailMergeEditor::addEntry()
466{
467 bool ok;
468 TQString value=KInputDialog::getText( i18n("Add Entry"),
469 i18n("Enter entry name:"),
470 TQString(),
471 &ok,
472 this);
473 if ((ok) && !value.isEmpty())
474 {
475 if ( db->getNumRecords() == 0 )
476 {
477 first->setEnabled(true);
478 back_->setEnabled(true);
479 forward->setEnabled(true);
480 finish->setEnabled(true);
481 newRecord->setEnabled(true);
482 deleteEntry->setEnabled(true);
483 deleteRecord->setEnabled(true);
484 records->setEnabled(true);
485 addRecord();
486 }
487 dbList->clear();
488 db->addEntry( value );
489 changeRecord( records->value() );
490 dbList->updateItems();
491 }
492 updateButton();
493}
494
495void KWClassicMailMergeEditor::addRecord()
496{
497 db->appendRecord();
498 records->setRange( records->minValue(), records->maxValue() + 1 );
499 records->setValue( db->getNumRecords() );
500 updateButton();
501
502}
503
504void KWClassicMailMergeEditor::removeEntry()
505{
506 TQListViewItem * item = dbList->selectedItem ();
507 if ( item )
508 {
509 db->removeEntry( item->text(0) );
510 dbList->clear();
511 changeRecord( records->value() );
512 dbList->updateItems();
513 updateButton();
514 }
515#if defined( TQ_CC_GNU )
516#warning reimplement
517#endif
518/*
519 if ( db->getNumRecords() == 0 )
520 return;
521
522 KWMailMergeVariableInsertDia
523 *dia = new KWMailMergeVariableInsertDia( this, db );
524 if ( dia->exec() == TQDialog::Accepted ) {
525 dbList->clear();
526 db->removeEntry( dia->getName() );
527 changeRecord( records->value() + 1 );
528 dbList->updateItems();
529 }
530 delete dia;
531*/
532}
533
534void KWClassicMailMergeEditor::removeRecord()
535{
536 if ( db->getNumRecords() == 0 )
537 return;
538
539 db->removeRecord( records->value() - 1 );
540 dbList->invalidateCurrentRecord();
541 if ( db->getNumRecords() > 0 ) {
542 records->setRange( records->minValue(), records->maxValue() - 1 );
543 records->setValue( 1 );
544 dbList->clear();
545 dbList->updateItems();
546 } else
547 {
548 dbList->clear();
549 records->setEnabled( false );
550 }
551
552 if ( db->getNumRecords() == 0 )
553 {
554 newRecord->setEnabled(false);
555 deleteEntry->setEnabled(false);
556 deleteRecord->setEnabled(false);
557 records->setEnabled(true);
558 }
559
560 updateButton();
561}
562
563extern "C" {
564 KWORD_MAILMERGE_EXPORT KWMailMergeDataSource *create_kwmailmerge_classic(TDEInstance *inst,TQObject *parent)
565 {
566 return new KWClassicSerialDataSource(inst,parent);
567 }
568
569}