summaryrefslogtreecommitdiff
path: root/core/pim/addressbook/abeditor.cpp
Unidiff
Diffstat (limited to 'core/pim/addressbook/abeditor.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/pim/addressbook/abeditor.cpp619
1 files changed, 619 insertions, 0 deletions
diff --git a/core/pim/addressbook/abeditor.cpp b/core/pim/addressbook/abeditor.cpp
new file mode 100644
index 0000000..6354db9
--- a/dev/null
+++ b/core/pim/addressbook/abeditor.cpp
@@ -0,0 +1,619 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qt Palmtop Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20
21#include "abeditor.h"
22#include "addresspicker.h"
23
24#include <qpe/categoryselect.h>
25#include <qpe/qpeapplication.h>
26#include <qpe/qpedialog.h>
27
28#include <qcombobox.h>
29#include <qlabel.h>
30#include <qlayout.h>
31#include <qlineedit.h>
32#include <qmultilineedit.h>
33#include <qscrollview.h>
34#include <qtoolbutton.h>
35#include <qpushbutton.h>
36#include <qmainwindow.h>
37
38
39static inline bool containsAlphaNum( const QString &str );
40static inline bool constainsWhiteSpace( const QString &str );
41
42
43// helper functions, convert our comma delimited list to proper
44// file format...
45void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
46 QString &strAll );
47
48// helper convert from file format to comma delimited...
49void parseEmailTo( const QString &strDefaultEmail,
50 const QString &strOtherEmail, QString &strBack );
51
52
53
54AbEditor::AbEditor( const Contact &entry, const QValueList<int> *newOrdered,
55 QStringList *slNewOrdered,
56 QWidget *parent = 0, const char *name = 0, WFlags fl = 0 )
57 : QDialog( parent, name, TRUE, fl ),
58 orderedValues( newOrdered ),
59 slOrdered( slNewOrdered )
60{
61 init();
62 initMap();
63 setEntry( entry );
64}
65
66AbEditor::~AbEditor()
67{
68}
69
70void AbEditor::init()
71{
72 middleEdit = 0;
73 QVBoxLayout *vb = new QVBoxLayout( this );
74 svPage = new QScrollView( this );
75 svPage->setHScrollBarMode( QScrollView::AlwaysOff );
76 vb->addWidget( svPage );
77 svPage->setResizePolicy( QScrollView::AutoOneFit );
78 svPage->setFrameStyle( QFrame::NoFrame );
79
80 QWidget *container = new QWidget( svPage->viewport() );
81 svPage->addChild( container );
82
83 QGridLayout *gl = new QGridLayout( container, 20, 2, 4, 2 );
84
85 QLabel *l = new QLabel( tr("First Name"), container );
86 gl->addWidget( l, 0, 0 );
87 firstEdit = new QLineEdit( container );
88 gl->addWidget( firstEdit, 0, 1 );
89
90 l = new QLabel( tr("Last Name"), container );
91 gl->addWidget( l, 1, 0 );
92 lastEdit = new QLineEdit( container );
93 gl->addWidget( lastEdit, 1, 1 );
94
95 l = new QLabel( tr("Categories"), container );
96 gl->addWidget( l, 2, 0 );
97
98 cmbCat = new CategorySelect( container );
99 gl->addWidget( cmbCat, 2, 1 );
100
101 int i;
102 bool foundGender,
103 foundNotes;
104 foundGender = foundNotes = false;
105 QStringList::ConstIterator it = slOrdered->begin();
106 for ( i = 0; it != slOrdered->end(); i++, ++it ) {
107 if ( !foundGender && *it == tr("Gender") ) {
108 foundGender = true;
109 } else if ( !foundNotes && *it == tr("Notes") ) {
110 foundNotes = true;
111 } else {
112 l = new QLabel( *it, container );
113 listName.append( l );
114 gl->addWidget( l, i + 3, 0 );
115 QLineEdit *e = new QLineEdit( container );
116 listValue.append( e );
117 gl->addWidget( e, i + 3, 1 );
118 if ( *it == tr( "Middle Name" ) )
119 middleEdit = e;
120 }
121 }
122 l = new QLabel( tr("Gender"), container );
123 gl->addWidget( l, slOrdered->count() + 3, 0 );
124 genderCombo = new QComboBox( container );
125 genderCombo->insertItem( "", 0 );
126 genderCombo->insertItem( tr( "Male" ), 1 );
127 genderCombo->insertItem( tr( "Female" ), 2 );
128 gl->addWidget( genderCombo, slOrdered->count() + 3, 1 );
129
130 dlgNote = new QDialog( this, "Note Dialog", TRUE );
131 dlgNote->setCaption( tr("Enter Note") );
132 QVBoxLayout *vbNote = new QVBoxLayout( dlgNote );
133 // lblNote = new QLabel( dlgNote );
134 // lblNote->setMinimumSize( lblNote->sizeHint() + QSize( 0, 4 ) );
135 // vbNote->addWidget( lblNote );
136 txtNote = new QMultiLineEdit( dlgNote );
137 vbNote->addWidget( txtNote );
138
139 QHBoxLayout *hb = new QHBoxLayout( vb );
140 hb->addStretch( 2 );
141 QPushButton *pb = new QPushButton( tr("Notes..."), this );
142 hb->addWidget( pb );
143 connect( pb, SIGNAL(clicked()), this, SLOT(slotNote()) );
144
145 new QPEDialogListener(this);
146}
147
148void AbEditor::initMap()
149{
150 /*
151 // since the fields and the XML fields exist, create a map
152 // between them...
153 Config cfg1( "AddressBook" );
154 Config cfg2( "AddressBook" );
155 QString strCfg1,
156 strCfg2;
157 int i;
158
159 // This stuff better exist...
160 cfg1.setGroup( "AddressFields" );
161 cfg2.setGroup( "XMLFields" );
162 i = 0;
163 strCfg1 = cfg1.readEntry( "Field" + QString::number(i), QString::null );
164 strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++),
165 QString::null );
166 while ( !strCfg1.isNull() && !strCfg2.isNull() ) {
167 mapField.insert( strCfg1, strCfg2 );
168 strCfg1 = cfg1.readEntry( "Field" + QString::number(i),
169 QString::null );
170 strCfg2 = cfg2.readEntry( "XMLField" + QString::number(i++),
171 QString::null );
172 }
173 */
174}
175
176void AbEditor::loadFields()
177{
178 QStringList::ConstIterator it;
179 QListIterator<QLabel> lit( listName );
180 for ( it = slOrdered->begin(); *lit; ++lit, ++it ) {
181 (*lit)->setText( *it );
182 }
183}
184
185void AbEditor::setEntry( const Contact &entry )
186{
187 ent = entry;
188 QListIterator<QLineEdit> it( listValue );
189 firstEdit->setText( ent.firstName() );
190 lastEdit->setText( ent.lastName() );
191 cmbCat->setCategories( ent.categories(), "Contacts", tr("Contacts") );
192
193 // ### Fix...
194 QValueList<int>::ConstIterator itVl;
195 for ( itVl = orderedValues->begin(); *it && itVl != orderedValues->end();
196 ++itVl, ++it ) {
197 switch( *itVl ) {
198 case Qtopia::Title:
199 (*it)->setText(ent.title());
200 break;
201 case Qtopia::MiddleName:
202 (*it)->setText( ent.middleName() );
203 break;
204 case Qtopia::Suffix:
205 (*it)->setText( ent.suffix() );
206 break;
207
208 // email
209 case Qtopia::DefaultEmail:
210 case Qtopia::Emails:
211 {
212 QString strDefEmail = ent.defaultEmail();
213 QString strAllEmail = ent.emails();
214 QString strFinal;
215 parseEmailTo( strDefEmail, strAllEmail, strFinal );
216 (*it)->setText( strFinal );
217 // make sure we see the "default"
218 (*it)->home( false );
219 break;
220 }
221
222 // home
223 case Qtopia::HomeStreet:
224 (*it)->setText(ent.homeStreet() );
225 break;
226 case Qtopia::HomeCity:
227 (*it)->setText( ent.homeCity() );
228 break;
229 case Qtopia::HomeState:
230 (*it)->setText( ent.homeState() );
231 break;
232 case Qtopia::HomeZip:
233 (*it)->setText( ent.homeZip() );
234 break;
235 case Qtopia::HomeCountry:
236 (*it)->setText( ent.homeCountry() );
237 break;
238 case Qtopia::HomePhone:
239 (*it)->setText( ent.homePhone() );
240 break;
241 case Qtopia::HomeFax:
242 (*it)->setText( ent.homeFax() );
243 break;
244 case Qtopia::HomeMobile:
245 (*it)->setText( ent.homeMobile() );
246 break;
247 case Qtopia::HomeWebPage:
248 (*it)->setText( ent.homeWebpage() );
249 break;
250
251 // business
252 case Qtopia::Company:
253 (*it)->setText( ent.company() );
254 break;
255 case Qtopia::BusinessStreet:
256 (*it)->setText( ent.businessStreet() );
257 break;
258 case Qtopia::BusinessCity:
259 (*it)->setText( ent.businessCity() );
260 break;
261 case Qtopia::BusinessState:
262 (*it)->setText( ent.businessState() );
263 break;
264 case Qtopia::BusinessZip:
265 (*it)->setText( ent.businessZip() );
266 break;
267 case Qtopia::BusinessCountry:
268 (*it)->setText( ent.businessCountry() );
269 break;
270 case Qtopia::BusinessWebPage:
271 (*it)->setText( ent.businessWebpage() );
272 break;
273 case Qtopia::JobTitle:
274 (*it)->setText( ent.jobTitle() );
275 break;
276 case Qtopia::Department:
277 (*it)->setText( ent.department() );
278 break;
279 case Qtopia::Office:
280 (*it)->setText( ent.office() );
281 break;
282 case Qtopia::BusinessPhone:
283 (*it)->setText( ent.businessPhone() );
284 break;
285 case Qtopia::BusinessFax:
286 (*it)->setText( ent.businessFax() );
287 break;
288 case Qtopia::BusinessMobile:
289 (*it)->setText( ent.businessMobile() );
290 break;
291 case Qtopia::BusinessPager:
292 (*it)->setText( ent.businessPager() );
293 break;
294 case Qtopia::Profession:
295 (*it)->setText( ent.profession() );
296 break;
297 case Qtopia::Assistant:
298 (*it)->setText( ent.assistant() );
299 break;
300 case Qtopia::Manager:
301 (*it)->setText( ent.manager() );
302 break;
303
304 // personal
305 case Qtopia::Spouse:
306 (*it)->setText( ent.spouse() );
307 break;
308 case Qtopia::Children:
309 (*it)->setText( ent.children() );
310 break;
311 case Qtopia::Birthday:
312 (*it)->setText( ent.birthday() );
313 break;
314 case Qtopia::Anniversary:
315 (*it)->setText( ent.anniversary() );
316 break;
317 case Qtopia::Nickname:
318 (*it)->setText( ent.nickname() );
319 break;
320
321 }
322 }
323
324 QString gender = ent.gender();
325 genderCombo->setCurrentItem( gender.toInt() );
326
327 txtNote->setText( ent.notes() );
328}
329
330void AbEditor::accept()
331{
332 if ( isEmpty() )
333 reject();
334 else {
335 saveEntry();
336 QDialog::accept();
337 }
338}
339
340bool AbEditor::isEmpty()
341{
342 // analyze all the fields and make sure there is _something_ there
343 // that warrants saving...
344 QString t = firstEdit->text();
345 if ( !t.isEmpty() && containsAlphaNum( t ) )
346 return false;
347
348 t = lastEdit->text();
349 if ( !t.isEmpty() && containsAlphaNum( t ) )
350 return false;
351
352 QListIterator<QLineEdit> it( listValue );
353 for ( ; it.current(); ++it ) {
354 t = it.current()->text();
355 if ( !t.isEmpty() && containsAlphaNum( t ) )
356 return false;
357 }
358
359 t = txtNote->text();
360 if ( !t.isEmpty() && containsAlphaNum( t ) )
361 return false;
362
363 return true;
364}
365
366void AbEditor::saveEntry()
367{
368 QString strDefaultEmail, strOtherEmail;
369
370 // determine if there has been a change in names
371 if ( ent.firstName() != firstEdit->text() ||
372 ent.lastName() != lastEdit->text()
373 || (middleEdit && ent.middleName() != middleEdit->text()) ) {
374 // set the names
375 ent.setFirstName( firstEdit->text() );
376 ent.setLastName( lastEdit->text() );
377 if ( middleEdit )
378 ent.setMiddleName( middleEdit->text() );
379 ent.setFileAs();
380 }
381
382 ent.setCategories( cmbCat->currentCategories() );
383
384 QListIterator<QLineEdit> it( listValue );
385 int i;
386 QValueList<int>::ConstIterator<int> vlIt;
387 for ( i = 0, vlIt = orderedValues->begin();
388 it.current(); ++it, ++vlIt, i++ ) {
389 switch( *vlIt ) {
390 case Qtopia::Title:
391 ent.setTitle( it.current()->text() );
392 break;
393 case Qtopia::MiddleName:
394 ent.setMiddleName( it.current()->text() );
395 break;
396 case Qtopia::Suffix:
397 ent.setSuffix( it.current()->text() );
398 break;
399 // case Qtopia::Category:
400 // {
401 // // QStringList slCat = QStringList::split( ";", value );
402 // // QValueList<int> cat;
403 // // for ( QStringList::ConstIterator it = slCat.begin();
404 // // it != slCat.end(); ++it )
405 // // cat.append( (*it).toInt() );
406 // // ent.setCategories( cat );
407 // }
408 // break;
409
410 // email
411 case Qtopia::DefaultEmail:
412 case Qtopia::Emails:
413 parseEmailFrom( it.current()->text(), strDefaultEmail,
414 strOtherEmail );
415 ent.setDefaultEmail( strDefaultEmail );
416 ent.setEmails( strOtherEmail );
417 break;
418
419 // home
420 case Qtopia::HomeStreet:
421 ent.setHomeStreet( it.current()->text() );
422 break;
423 case Qtopia::HomeCity:
424 ent.setHomeCity( it.current()->text() );
425 break;
426 case Qtopia::HomeState:
427 ent.setHomeState( it.current()->text() );
428 break;
429 case Qtopia::HomeZip:
430 ent.setHomeZip( it.current()->text() );
431 break;
432 case Qtopia::HomeCountry:
433 ent.setHomeCountry( it.current()->text() );
434 break;
435 case Qtopia::HomePhone:
436 ent.setHomePhone( it.current()->text() );
437 break;
438 case Qtopia::HomeFax:
439 ent.setHomeFax( it.current()->text() );
440 break;
441 case Qtopia::HomeMobile:
442 ent.setHomeMobile( it.current()->text() );
443 break;
444 case Qtopia::HomeWebPage:
445 ent.setHomeWebpage( it.current()->text() );
446 break;
447
448 // business
449 case Qtopia::Company:
450 ent.setCompany( it.current()->text() );
451 break;
452 case Qtopia::BusinessStreet:
453 ent.setBusinessStreet( it.current()->text() );
454 break;
455 case Qtopia::BusinessCity:
456 ent.setBusinessCity( it.current()->text() );
457 break;
458 case Qtopia::BusinessState:
459 ent.setBusinessState( it.current()->text() );
460 break;
461 case Qtopia::BusinessZip:
462 ent.setBusinessZip( it.current()->text() );
463 break;
464 case Qtopia::BusinessCountry:
465 ent.setBusinessCountry( it.current()->text() );
466 break;
467 case Qtopia::BusinessWebPage:
468 ent.setBusinessWebpage( it.current()->text() );
469 break;
470 case Qtopia::JobTitle:
471 ent.setJobTitle( it.current()->text() );
472 break;
473 case Qtopia::Department:
474 ent.setDepartment( it.current()->text() );
475 break;
476 case Qtopia::Office:
477 ent.setOffice( it.current()->text() );
478 break;
479 case Qtopia::BusinessPhone:
480 ent.setBusinessPhone( it.current()->text() );
481 break;
482 case Qtopia::BusinessFax:
483 ent.setBusinessFax( it.current()->text() );
484 break;
485 case Qtopia::BusinessMobile:
486 ent.setBusinessMobile( it.current()->text() );
487 break;
488 case Qtopia::BusinessPager:
489 ent.setBusinessPager( it.current()->text() );
490 break;
491 case Qtopia::Profession:
492 ent.setProfession( it.current()->text() );
493 break;
494 case Qtopia::Assistant:
495 ent.setAssistant( it.current()->text() );
496 break;
497 case Qtopia::Manager:
498 ent.setManager( it.current()->text() );
499 break;
500
501 // personal
502 case Qtopia::Spouse:
503 ent.setSpouse( it.current()->text() );
504 break;
505 case Qtopia::Children:
506 ent.setChildren( it.current()->text() );
507 break;
508 case Qtopia::Birthday:
509 ent.setBirthday( it.current()->text() );
510 break;
511 case Qtopia::Anniversary:
512 ent.setAnniversary( it.current()->text() );
513 break;
514 case Qtopia::Nickname:
515 ent.setNickname( it.current()->text() );
516 break;
517 default:
518 break;
519
520 }
521 }
522
523 int gender = genderCombo->currentItem();
524 ent.setGender( QString::number( gender ) );
525
526 QString str = txtNote->text();
527 if ( !str.isNull() )
528 ent.setNotes( str );
529}
530
531void AbEditor::slotNote()
532{
533 dlgNote->showMaximized();
534 if ( !dlgNote->exec() ) {
535 // reset the note...
536 txtNote->setText( ent.notes() );
537 }
538}
539
540void AbEditor::setNameFocus()
541{
542 firstEdit->setFocus();
543}
544
545void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
546 QString &strAll )
547{
548 int where,
549 start;
550 if ( txt.isEmpty() )
551 return;
552 // find the first
553 where = txt.find( ',' );
554 if ( where < 0 ) {
555 strDefaultEmail = txt;
556 strAll = txt;
557 } else {
558 strDefaultEmail = txt.left( where ).stripWhiteSpace();
559 strAll = strDefaultEmail;
560 while ( where > -1 ) {
561 strAll.append(" ");
562 start = where;
563 where = txt.find( ',', where + 1 );
564 if ( where > - 1 )
565 strAll.append( txt.mid(start + 1, where - start - 1).stripWhiteSpace() );
566 else // grab until the end...
567 strAll.append( txt.right(txt.length() - start - 1).stripWhiteSpace() );
568 }
569 }
570}
571
572void parseEmailTo( const QString &strDefaultEmail,
573 const QString &strOtherEmail, QString &strBack )
574{
575 // create a comma dilimeted set of emails...
576 // use the power of short circuiting...
577 bool foundDefault = false;
578 QString strTmp;
579 int start = 0;
580 int where;
581 // start at the beginng.
582 strBack = strDefaultEmail;
583 where = 0;
584 while ( where > -1 ) {
585 start = where;
586 where = strOtherEmail.find( ' ', where + 1 );
587 if ( where > 0 ) {
588 strTmp = strOtherEmail.mid( start, where - start ).stripWhiteSpace();
589 } else
590 strTmp = strOtherEmail.right( strOtherEmail.length() - start ).stripWhiteSpace();
591 if ( foundDefault || strTmp != strDefaultEmail ) {
592 strBack.append( ", " );
593 strBack.append( strTmp );
594 } else
595 foundDefault = true;
596 }
597}
598
599
600static inline bool containsAlphaNum( const QString &str )
601{
602 int i,
603 count = str.length();
604 for ( i = 0; i < count; i++ )
605 if ( !str[i].isSpace() )
606 return TRUE;
607 return FALSE;
608}
609
610static inline bool constainsWhiteSpace( const QString &str )
611{
612 int i,
613 count = str.length();
614 for (i = 0; i < count; i++ )
615 if ( str[i].isSpace() )
616 return TRUE;
617 return FALSE;
618}
619