KWMailMergeTDEABC.cpp
1/*
2 This file is part of the KDE project
3 Copyright (C) 2003 Tobias Koenig <tokoe@kde.org>
4 Joseph Wenninger <jowenn@kde.org>
5 Ingo Kloecker <kloecker@kde.org>
6 Copyright (C) 2004 Tobias Koenig <tokoe@kde.org>
7 Joseph Wenninger <jowenn@kde.org>
8 Ingo Kloecker <kloecker@kde.org>
9 Dirk Schmidt <fs@dirk-schmidt.net>
10
11 This library is free software; you can redistribute it and/or
12 modify it under the terms of the GNU Library General Public
13 License as published by the Free Software Foundation; either
14 version 2 of the License, or (at your option) any later version.
15
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Library General Public License for more details.
20
21 You should have received a copy of the GNU Library General Public License
22 along with this library; see the file COPYING.LIB. If not, write to
23 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 * Boston, MA 02110-1301, USA.
25*/
26
27#include <kdebug.h>
28#include <tdeglobal.h>
29#include <tdelocale.h>
30#include <tdeabc/distributionlist.h>
31#include <tdeabc/stdaddressbook.h>
32
33#include "KWMailMergeTDEABC.h"
34#include "KWMailMergeTDEABCConfig.h"
35
36KWMailMergeTDEABC::KWMailMergeTDEABC( TDEInstance *inst, TQObject *parent )
37 : KWMailMergeDataSource( inst, parent )
38{
39 _addressBook = TDEABC::StdAddressBook::self();
40 _iterator = _addressBook->begin();
41
42
43 // init record list
44 // Using names from kaddressbook.
45 sampleRecord[ ("KAddressbook identifier") ] = TDEABC::Addressee::uidLabel();
46 sampleRecord[ ("Name" ) ] = TDEABC::Addressee::nameLabel();
47 sampleRecord[ ("Formatted name" ) ] = TDEABC::Addressee::formattedNameLabel();
48 sampleRecord[ ("Family names" ) ] = TDEABC::Addressee::familyNameLabel();
49 sampleRecord[ ("Given name" ) ] = TDEABC::Addressee::givenNameLabel();
50 sampleRecord[ ("Additional names" ) ] = TDEABC::Addressee::additionalNameLabel();
51 sampleRecord[ ("Honorific prefixes" ) ] = TDEABC::Addressee::prefixLabel();
52 sampleRecord[ ("Honorific suffixes" ) ] = TDEABC::Addressee::suffixLabel();
53 sampleRecord[ ("Nick name" ) ] = TDEABC::Addressee::nickNameLabel();
54 sampleRecord[ ("Birthday" ) ] = TDEABC::Addressee::birthdayLabel();
55 sampleRecord[ ("Home address: Street" ) ] = TDEABC::Addressee::homeAddressStreetLabel();
56 sampleRecord[ ("Home address: Locality" ) ] = TDEABC::Addressee::homeAddressLocalityLabel();
57 sampleRecord[ ("Home address: Region" ) ] = TDEABC::Addressee::homeAddressRegionLabel();
58 sampleRecord[ ("Home address: Postal code" ) ] = TDEABC::Addressee::homeAddressPostalCodeLabel();
59 sampleRecord[ ("Home address: Country" ) ] = TDEABC::Addressee::homeAddressCountryLabel();
60 sampleRecord[ ("Home address: Label" ) ] = TDEABC::Addressee::homeAddressLabelLabel();
61 sampleRecord[ ("Business address: Street" ) ] = TDEABC::Addressee::businessAddressStreetLabel();
62 sampleRecord[ ("Business address: Locality" ) ] = TDEABC::Addressee::businessAddressLocalityLabel();
63 sampleRecord[ ("Business address: Region" ) ] = TDEABC::Addressee::businessAddressRegionLabel();
64 sampleRecord[ ("Business address: Postal code" ) ] = TDEABC::Addressee::businessAddressPostalCodeLabel();
65 sampleRecord[ ("Business address: Country" ) ] = TDEABC::Addressee::businessAddressCountryLabel();
66 sampleRecord[ ("Business address: Label" ) ] = TDEABC::Addressee::businessAddressLabelLabel();
67 sampleRecord[ ("Home phone" ) ] = TDEABC::Addressee::homePhoneLabel();
68 sampleRecord[ ("Business phone" ) ] = TDEABC::Addressee::businessPhoneLabel();
69 sampleRecord[ ("Mobile phone" ) ] = TDEABC::Addressee::mobilePhoneLabel();
70 sampleRecord[ ("Home fax" ) ] = TDEABC::Addressee::homeFaxLabel();
71 sampleRecord[ ("Business fax" ) ] = TDEABC::Addressee::businessFaxLabel();
72 sampleRecord[ ("Car phone" ) ] = TDEABC::Addressee::carPhoneLabel();
73 sampleRecord[ ("ISDN" ) ] = TDEABC::Addressee::isdnLabel();
74 sampleRecord[ ("Pager" ) ] = TDEABC::Addressee::pagerLabel();
75 sampleRecord[ ("Email" ) ] = TDEABC::Addressee::emailLabel();
76 sampleRecord[ ("Mailer" ) ] = TDEABC::Addressee::mailerLabel();
77 sampleRecord[ ("Time zone" ) ] = TDEABC::Addressee::timeZoneLabel();
78 sampleRecord[ ("Geographic position" ) ] = TDEABC::Addressee::geoLabel();
79 sampleRecord[ ("Title" ) ] = TDEABC::Addressee::titleLabel();
80 sampleRecord[ ("Role" ) ] = TDEABC::Addressee::roleLabel();
81 sampleRecord[ ("Organization" ) ] = TDEABC::Addressee::organizationLabel();
82 sampleRecord[ ("Note" ) ] = TDEABC::Addressee::noteLabel();
83 sampleRecord[ ("productId" ) ] = TDEABC::Addressee::productIdLabel();
84 sampleRecord[ ("Revision" ) ] = TDEABC::Addressee::revisionLabel();
85 sampleRecord[ ("sortString" ) ] = TDEABC::Addressee::sortStringLabel();
86 sampleRecord[ ("URL" ) ] = TDEABC::Addressee::urlLabel();
87 sampleRecord[ ("Secrecy" ) ] = TDEABC::Addressee::secrecyLabel();
88 sampleRecord[ ("Preferred address: Street" ) ] = TQString( "preferedAddressStreet" );
89 sampleRecord[ ("Preferred address: Locality" ) ] = TQString( "preferedAddressLocality" );
90 sampleRecord[ ("Preferred address: Region" ) ] = TQString( "preferedAddressRegion" );
91 sampleRecord[ ("Preferred address: Postal code" ) ] = TQString( "preferedAddressPostalCode" );
92 sampleRecord[ ("Preferred address: Country" ) ] = TQString( "preferedAddressCountry" );
93 sampleRecord[ ("Preferred address: Label" ) ] = TQString( "preferedAddressLabel" );
94}
95
96
97KWMailMergeTDEABC::~KWMailMergeTDEABC()
98{
99 ;
100}
101
102
103void KWMailMergeTDEABC::addEntry( const TQString &uid )
104{
105 _individualUIDs.append( uid );
106 makeUIDsExclusive();
107}
108
109
110void KWMailMergeTDEABC::addList( const TQString &id )
111{
112 _lists.append( id );
113 parseList( id );
114 makeUIDsExclusive();
115}
116
117
118void KWMailMergeTDEABC::clear()
119{
120 _exclusiveUIDs.clear();
121 _individualUIDs.clear();
122 _listUIDs.clear();
123 _lists.clear();
124}
125
126
127int KWMailMergeTDEABC::getNumRecords() const
128{
129 kdDebug() << "KWMailMergeTDEABC::getNumRecords(): " << _exclusiveUIDs.count() << endl;
130 return _exclusiveUIDs.count();
131}
132
133
134TQString KWMailMergeTDEABC::getValue( const TQString &name, int record ) const
135{
136 kdDebug() << "KWMailMergeTDEABC::getValue(" << name << ", " << record << ")" << endl;
137 if ( record < 0 )
138 return name;
139
140 // This doesn't ever happen, right? So why is it there? Dirk Schmidt
141 if ( record == -1 && _iterator == _addressBook->end() )
142 return "";
143
144 //
145 // Set the iterator to the asked Addressee.
146 //
147 bool uidAvailable = false;
148 if ( record != -1 )
149 {
150 int counter = 0;
151
152 for ( _UIDIterator = _exclusiveUIDs.begin(); _UIDIterator != _exclusiveUIDs.end()
153 && counter < record; _UIDIterator++ )
154 {
155 counter++;
156 }
157
158 for ( _iterator = _addressBook->begin(); _iterator != _addressBook->end(); ++_iterator )
159 {
160
161 if( _iterator->uid() == *_UIDIterator )
162 {
163 uidAvailable = true;
164 break;
165 }
166 }
167 }
168
169 if( !uidAvailable )
170 {
171 return ( i18n ( "KAddressbook entry '%1' not available." ).arg( *_UIDIterator ) );
172 }
173
174
175 TDEABC::Addressee addr = *_iterator;
176 _iterator++; // Don't know why. Could be removed? Dirk Schmidt
177
178
179 //
180 // Return the asked variable.
181 //
182 if ( name == "KAddressbook identifier" )
183 return addr.uid();
184 if ( name == "Name" )
185 return addr.name();
186 if ( name == "Formatted name" )
187 return addr.formattedName();
188 if ( name == "Family names" )
189 return addr.familyName();
190 if ( name == "Given name" )
191 return addr.givenName();
192 if ( name == "Additional names" )
193 return addr.additionalName();
194 if ( name == "Honorific prefixes" )
195 return addr.prefix();
196 if ( name == "Honorific suffixes" )
197 return addr.suffix();
198 if ( name == "Nick name" )
199 return addr.nickName();
200 if ( name == "Birthday" )
201 return TDEGlobal::locale()->formatDate( addr.birthday().date() );
202
203 if ( name == "Home address: Street" )
204 {
205 TDEABC::Address a = addr.address( TDEABC::Address::Home );
206 return a.street();
207 }
208 if ( name == "Home address: Locality" )
209 {
210 TDEABC::Address a = addr.address( TDEABC::Address::Home );
211 return a.locality();
212 }
213 if ( name == "Home address: Region" )
214 {
215 TDEABC::Address a = addr.address( TDEABC::Address::Home );
216 return a.region();
217 }
218 if ( name == "Home address: Postal code" )
219 {
220 TDEABC::Address a = addr.address( TDEABC::Address::Home );
221 return a.postalCode();
222 }
223 if ( name == "Home address: Country" )
224 {
225 TDEABC::Address a = addr.address( TDEABC::Address::Home );
226 return a.country();
227 }
228 if ( name == "Home address: Label" )
229 {
230 TDEABC::Address a = addr.address( TDEABC::Address::Home );
231 return a.label();
232 }
233
234 if ( name == "Business address: Street" )
235 {
236 TDEABC::Address a = addr.address( TDEABC::Address::Work );
237 return a.street();
238 }
239 if ( name == "Business address: Locality" )
240 {
241 TDEABC::Address a = addr.address( TDEABC::Address::Work );
242 return a.locality();
243 }
244 if ( name == "Business address: Region" )
245 {
246 TDEABC::Address a = addr.address( TDEABC::Address::Work );
247 return a.region();
248 }
249 if ( name == "Business address: Postal code" )
250 {
251 TDEABC::Address a = addr.address( TDEABC::Address::Work );
252 return a.postalCode();
253 }
254 if ( name == "Business address: Country" )
255 {
256 TDEABC::Address a = addr.address( TDEABC::Address::Work );
257 return a.country();
258 }
259 if ( name == "Business address: Label" )
260 {
261 TDEABC::Address a = addr.address( TDEABC::Address::Work );
262 return a.label();
263 }
264
265 if ( name == "Prefered address: Street" )
266 {
267 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
268 return a.street();
269 }
270
271 if ( name == "Prefered address: Locality" )
272 {
273 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
274 return a.locality();
275 }
276 if ( name == "Prefered address: Region" )
277 {
278 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
279 return a.region();
280 }
281 if ( name == "Prefered address: Postal code" )
282 {
283 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
284 return a.postalCode();
285 }
286 if ( name == "Prefered address: Country" )
287 {
288 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
289 return a.country();
290 }
291 if ( name == "Prefered address: Label" )
292 {
293 TDEABC::Address a = addr.address( TDEABC::Address::Pref );
294 return a.label();
295 }
296
297 if ( name == "Home phone" )
298 {
299 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Home );
300 return phone.number();
301 }
302 if ( name == "Business phone" )
303 {
304 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Work );
305 return phone.number();
306 }
307 if ( name == "Mobile phone" )
308 {
309 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Cell );
310 return phone.number();
311 }
312 if ( name == "Home fax" )
313 {
314 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Home | TDEABC::PhoneNumber::Fax );
315 return phone.number();
316 }
317 if ( name == "Business fax" )
318 {
319 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Work | TDEABC::PhoneNumber::Fax );
320 return phone.number();
321 }
322 if ( name == "Car phone" )
323 {
324 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Car );
325 return phone.number();
326 }
327 if ( name == "ISDN" )
328 {
329 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Isdn );
330 return phone.number();
331 }
332 if ( name == "Pager" )
333 {
334 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Pager );
335 return phone.number();
336 }
337
338 if ( name == "Email" )
339 return addr.preferredEmail();
340 if ( name == "Mailer" )
341 return addr.mailer();
342 if ( name == "Time zone" )
343 {
344 TDEABC::TimeZone zone = addr.timeZone();
345 return TQString::number( zone.offset() );
346 }
347 if ( name == "Geographic position" )
348 {
349 TDEABC::Geo geo = addr.geo();
350 TQString lat;
351 TQString longi;
352 if( geo.latitude()<0 )
353 lat = TQString( i18n("%1 South") ).arg( -geo.latitude() );
354 else
355 lat = TQString( i18n("%1 North") ).arg( geo.latitude() );
356
357 if( geo.longitude()<0 )
358 // There is something going wrong, because "W" is replaced by "q ".
359 // Needs fix.
360 longi = TQString( i18n("%1 West") ).arg( -geo.longitude() );
361 else
362 longi = TQString( i18n("%1 East") ).arg( geo.longitude() );
363
364 return i18n( "Geographic coordinates", "%1, %2" ).arg ( lat, longi );
365 }
366
367 if ( name == "Title" )
368 return addr.title();
369 if ( name == "Role" )
370 return addr.role();
371 if ( name == "Organization" )
372 return addr.organization();
373 if ( name == "Note" )
374 return addr.note();
375 if ( name == "productId" )
376 return addr.productId();
377 if ( name == "Revision" )
378 return TDEGlobal::locale()->formatDate( addr.revision().date() );
379 if ( name == "sortString" )
380 return addr.sortString();
381 if ( name == "URL" )
382 return addr.url().url();
383 if ( name == "Secrecy" )
384 {
385 TDEABC::Secrecy secrecy = addr.secrecy();
386 return TDEABC::Secrecy::typeLabel( secrecy.type() );
387 }
388
389 return ( i18n("Unkown mail merge variable: %1").arg ( name ) ) ;
390}
391
392
393TQStringList KWMailMergeTDEABC::lists() const
394{
395 return _lists;
396}
397
398
399void KWMailMergeTDEABC::load( TQDomElement& parentElem )
400{
401 clear();
402 TQDomNode contentNode=parentElem.namedItem("CONTENT");
403 if( contentNode.isNull() )
404 return;
405 for( TQDomNode rec=contentNode.firstChild(); !rec.isNull(); rec=rec.nextSibling() )
406 {
407 if( rec.nodeName()== "RECORD" )
408 {
409 for( TQDomElement recEnt=rec.firstChild().toElement(); !recEnt.isNull();
410 recEnt=recEnt.nextSibling().toElement() )
411 {
412 addEntry( recEnt.attribute( TQString::fromLatin1("uid") ) );
413 }
414 }
415 else if( rec.nodeName() == "LIST" )
416 {
417 for( TQDomElement recEnt=rec.firstChild().toElement(); !recEnt.isNull();
418 recEnt=recEnt.nextSibling().toElement() )
419 {
420 addList( recEnt.attribute( TQString::fromLatin1("listid") ) );
421 }
422 }
423 else
424 kdDebug() << "rec.nodeName(): " << rec.nodeName() << endl;
425 }
426}
427
428
429void KWMailMergeTDEABC::makeUIDsExclusive()
430{
431 _exclusiveUIDs = _individualUIDs + _listUIDs;
432 _exclusiveUIDs.sort();
433 kdDebug() << "KWMailMergeTDEABC::makeUIDsExclusive(): before: " << _exclusiveUIDs.join(",")
434 << endl;
435 TQString uid;
436 for( TQStringList::Iterator it=_exclusiveUIDs.begin();
437 it!=_exclusiveUIDs.end(); ++it )
438 {
439 if( *it == uid )
440 {
441 it = _exclusiveUIDs.remove( it );
442 }
443 uid = *it;
444 }
445 kdDebug() << "KWMailMergeTDEABC::makeUIDsExclusive(): after: " << _exclusiveUIDs.join(",")
446 << endl;
447}
448
449
450void KWMailMergeTDEABC::parseList( const TQString& listName )
451{
452 if( listName.isEmpty() )
453 return;
454
455 kdDebug() << "KWMailMergeTDEABC::parseList: " << listName << endl;
456 TDEABC::DistributionListManager dlm ( _addressBook );
457 dlm.load();
458
459 TQStringList::Iterator listIt;
460
461 TDEABC::DistributionList* list = dlm.list( listName );
462 TDEABC::DistributionList::Entry::List entries = list->entries();
463
464 TDEABC::DistributionList::Entry::List::Iterator itemIt;
465 for ( itemIt = entries.begin(); itemIt != entries.end(); ++itemIt )
466 {
467 kdDebug() << "WMailMergeTDEABC::parseList: Listentry UID: " <<
468 (*itemIt).addressee.uid() << endl;
469 _listUIDs.append( (*itemIt).addressee.uid() );
470 }
471}
472
473
474void KWMailMergeTDEABC::refresh( bool )
475{
476 kdDebug() << "KWMailMergeTDEABC::refresh()" << endl;
477 _iterator = _addressBook->begin();
478 _UIDIterator = _individualUIDs.begin();
479
480}
481
482
483void KWMailMergeTDEABC::save( TQDomDocument& doc, TQDomElement& parent)
484{
485 TQDomElement cont=doc.createElement(TQString::fromLatin1("CONTENT"));
486 parent.appendChild(cont);
487
488 TQValueList<TQString>::ConstIterator it = _individualUIDs.begin();
489 for( ; it != _individualUIDs.end(); ++it )
490 {
491 TQDomElement rec=doc.createElement(TQString::fromLatin1("RECORD"));
492 cont.appendChild(rec);
493 TQDomElement recEnt=doc.createElement(TQString::fromLatin1("ITEM"));
494 recEnt.setAttribute(TQString::fromLatin1("uid"),*it);
495 rec.appendChild(recEnt);
496 }
497
498 it = _lists.begin();
499 for( ; !(it == _lists.end()); ++it )
500 {
501 TQDomElement rec=doc.createElement(TQString::fromLatin1("LIST"));
502 cont.appendChild(rec);
503 TQDomElement recEnt=doc.createElement(TQString::fromLatin1("ITEM"));
504 recEnt.setAttribute(TQString::fromLatin1("listid"),*it);
505 rec.appendChild(recEnt);
506 }
507}
508
509bool KWMailMergeTDEABC::showConfigDialog( TQWidget* par, int action )
510{
511 bool ret=false;
512 if (action == KWSLCreate )
513 {
514 clear();
515 }
516
517 //if (action==KWSLOpen)
518 {
519 KWMailMergeTDEABCConfig *dia=new KWMailMergeTDEABCConfig( par, this );
520
521 ret=( dia->exec() == TQDialog::Accepted );
522 kdDebug() << "KWMailMergeTDEABCConfig::Accepted " << ret << endl;
523 delete dia;
524 }
525 refresh(false);
526
527 return ret;
528}
529
530
531TQStringList KWMailMergeTDEABC::singleRecords() const
532{
533 return _individualUIDs;
534}
535
536
537
538extern "C"
539{
540 KWORD_MAILMERGE_EXPORT KWMailMergeDataSource *create_kwmailmerge_tdeabc( TDEInstance *inst, TQObject *parent )
541 {
542 return new KWMailMergeTDEABC( inst, parent );
543 }
544}
545
546
547
548
549#include "KWMailMergeTDEABC.moc"
550
551