summaryrefslogtreecommitdiff
authoreilers <eilers>2002-10-08 12:33:52 (UTC)
committer eilers <eilers>2002-10-08 12:33:52 (UTC)
commita194611bf645fe7e2e9e83733ababc587fd42f1d (patch) (unidiff)
tree2c21a5576bce48dba2fe83f6c849c0d16025a848
parent333fec32d47ea32de9fb4c8cd378a519785a1ff8 (diff)
downloadopie-a194611bf645fe7e2e9e83733ababc587fd42f1d.zip
opie-a194611bf645fe7e2e9e83733ababc587fd42f1d.tar.gz
opie-a194611bf645fe7e2e9e83733ababc587fd42f1d.tar.bz2
Joined development branch: It uses the new PIM API
Some features in "View" added by Darwin Zins, but they are not finished..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/abeditor.cpp17
-rw-r--r--core/pim/addressbook/abeditor.h8
-rw-r--r--core/pim/addressbook/ablabel.cpp2
-rw-r--r--core/pim/addressbook/ablabel.h6
-rw-r--r--core/pim/addressbook/abtable.cpp1664
-rw-r--r--core/pim/addressbook/abtable.h36
-rw-r--r--core/pim/addressbook/addressbook.cpp1493
-rw-r--r--core/pim/addressbook/addressbook.h109
-rw-r--r--core/pim/addressbook/contacteditor.cpp4
-rw-r--r--core/pim/addressbook/contacteditor.h10
10 files changed, 1612 insertions, 1737 deletions
diff --git a/core/pim/addressbook/abeditor.cpp b/core/pim/addressbook/abeditor.cpp
index 6354db9..91e8722 100644
--- a/core/pim/addressbook/abeditor.cpp
+++ b/core/pim/addressbook/abeditor.cpp
@@ -51,7 +51,7 @@ void parseEmailTo( const QString &strDefaultEmail,
51 51
52 52
53 53
54AbEditor::AbEditor( const Contact &entry, const QValueList<int> *newOrdered, 54AbEditor::AbEditor( const OContact &entry, const QValueList<int> *newOrdered,
55 QStringList *slNewOrdered, 55 QStringList *slNewOrdered,
56 QWidget *parent = 0, const char *name = 0, WFlags fl = 0 ) 56 QWidget *parent = 0, const char *name = 0, WFlags fl = 0 )
57 : QDialog( parent, name, TRUE, fl ), 57 : QDialog( parent, name, TRUE, fl ),
@@ -182,7 +182,7 @@ void AbEditor::loadFields()
182 } 182 }
183} 183}
184 184
185void AbEditor::setEntry( const Contact &entry ) 185void AbEditor::setEntry( const OContact &entry )
186{ 186{
187 ent = entry; 187 ent = entry;
188 QListIterator<QLineEdit> it( listValue ); 188 QListIterator<QLineEdit> it( listValue );
@@ -410,12 +410,12 @@ void AbEditor::saveEntry()
410 // email 410 // email
411 case Qtopia::DefaultEmail: 411 case Qtopia::DefaultEmail:
412 case Qtopia::Emails: 412 case Qtopia::Emails:
413 parseEmailFrom( it.current()->text(), strDefaultEmail, 413 parseEmailFrom( it.current()->text(), strDefaultEmail,
414 strOtherEmail ); 414 strOtherEmail );
415 ent.setDefaultEmail( strDefaultEmail ); 415 ent.setDefaultEmail( strDefaultEmail );
416 ent.setEmails( strOtherEmail ); 416 ent.setEmails( strOtherEmail );
417 break; 417 break;
418 418
419 // home 419 // home
420 case Qtopia::HomeStreet: 420 case Qtopia::HomeStreet:
421 ent.setHomeStreet( it.current()->text() ); 421 ent.setHomeStreet( it.current()->text() );
@@ -549,6 +549,7 @@ void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
549 start; 549 start;
550 if ( txt.isEmpty() ) 550 if ( txt.isEmpty() )
551 return; 551 return;
552
552 // find the first 553 // find the first
553 where = txt.find( ',' ); 554 where = txt.find( ',' );
554 if ( where < 0 ) { 555 if ( where < 0 ) {
diff --git a/core/pim/addressbook/abeditor.h b/core/pim/addressbook/abeditor.h
index 9ce6704..a9c1c5f 100644
--- a/core/pim/addressbook/abeditor.h
+++ b/core/pim/addressbook/abeditor.h
@@ -38,17 +38,17 @@ class AbEditor : public QDialog
38{ 38{
39 Q_OBJECT 39 Q_OBJECT
40public: 40public:
41 AbEditor( const Contact &entry, const QValueList<int> *newOrdedValues, 41 AbEditor( const OContact &entry, const QValueList<int> *newOrdedValues,
42 QStringList *slNewOrdered, 42 QStringList *slNewOrdered,
43 QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); 43 QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
44 ~AbEditor(); 44 ~AbEditor();
45 void loadFields(); 45 void loadFields();
46 void setNameFocus(); 46 void setNameFocus();
47 Contact entry() const { return ent; } 47 OContact entry() const { return ent; }
48 48
49public slots: 49public slots:
50 void slotNote(); 50 void slotNote();
51 void setEntry( const Contact &entry ); 51 void setEntry( const OContact &entry );
52 52
53protected slots: 53protected slots:
54 void accept(); 54 void accept();
@@ -63,7 +63,7 @@ private:
63 QDialog *dlgNote; 63 QDialog *dlgNote;
64 QLabel *lblNote; 64 QLabel *lblNote;
65 QMultiLineEdit *txtNote; 65 QMultiLineEdit *txtNote;
66 Contact ent; 66 OContact ent;
67 QScrollView *svPage; 67 QScrollView *svPage;
68 QLineEdit *firstEdit; 68 QLineEdit *firstEdit;
69 QLineEdit *lastEdit; 69 QLineEdit *lastEdit;
diff --git a/core/pim/addressbook/ablabel.cpp b/core/pim/addressbook/ablabel.cpp
index 3bf3e12..cf1e39f 100644
--- a/core/pim/addressbook/ablabel.cpp
+++ b/core/pim/addressbook/ablabel.cpp
@@ -34,7 +34,7 @@ AbLabel::~AbLabel()
34{ 34{
35} 35}
36 36
37void AbLabel::init( const Contact &entry ) 37void AbLabel::init( const OContact &entry )
38{ 38{
39 ent = entry; 39 ent = entry;
40} 40}
diff --git a/core/pim/addressbook/ablabel.h b/core/pim/addressbook/ablabel.h
index cfbd999..9086c4a 100644
--- a/core/pim/addressbook/ablabel.h
+++ b/core/pim/addressbook/ablabel.h
@@ -20,7 +20,7 @@
20#ifndef ABLABEL_H 20#ifndef ABLABEL_H
21#define ABLABEL_H 21#define ABLABEL_H
22 22
23#include <qpe/contact.h> 23#include <opie/ocontact.h>
24#include <qtextview.h> 24#include <qtextview.h>
25 25
26class AbLabel : public QTextView 26class AbLabel : public QTextView
@@ -32,7 +32,7 @@ public:
32 ~AbLabel(); 32 ~AbLabel();
33 33
34public slots: 34public slots:
35 void init( const Contact &entry ); 35 void init( const OContact &entry );
36 void sync(); 36 void sync();
37 37
38signals: 38signals:
@@ -42,7 +42,7 @@ protected:
42 void keyPressEvent( QKeyEvent * ); 42 void keyPressEvent( QKeyEvent * );
43 43
44private: 44private:
45 Contact ent; 45 OContact ent;
46 46
47}; 47};
48 48
diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp
index 3fa1a7c..08c6d0a 100644
--- a/core/pim/addressbook/abtable.cpp
+++ b/core/pim/addressbook/abtable.cpp
@@ -25,10 +25,13 @@
25#include <qpe/stringutil.h> 25#include <qpe/stringutil.h>
26#include <qpe/qcopenvelope_qws.h> 26#include <qpe/qcopenvelope_qws.h>
27 27
28#include <opie/orecordlist.h>
29
28#include <qasciidict.h> 30#include <qasciidict.h>
29#include <qdatetime.h> 31#include <qdatetime.h>
30#include <qfile.h> 32#include <qfile.h>
31#include <qregexp.h> 33#include <qregexp.h>
34#include <qmessagebox.h>
32 35
33#include "abtable.h" 36#include "abtable.h"
34 37
@@ -39,110 +42,102 @@
39 42
40#include <ctype.h> //toupper() for key hack 43#include <ctype.h> //toupper() for key hack
41 44
42static bool contactCompare( const Contact &cnt, const QRegExp &r, int category ); 45static bool contactCompare( const OContact &cnt, const QRegExp &r, int category );
43
44//### qtmail/addresslist.cpp hardcodes this filename as well
45static QString journalFileName()
46{
47 QString str = getenv("HOME");
48 str +="/.abjournal";
49 return str;
50}
51
52 46
53 47
54/*! 48/*!
55 \class AbTableItem abtable.h 49 \class AbTableItem abtable.h
56 50
57 \brief QTableItem based class for showing a field of an entry 51 \brief QTableItem based class for showing a field of an entry
58*/ 52*/
59 53
60AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s, 54AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s,
61 const QString &secondSortKey) 55 const QString &secondSortKey)
62 : QTableItem( t, et, s ) 56 : QTableItem( t, et, s )
63{ 57{
64 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower(); 58 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower();
65 sortKey = Qtopia::buildSortKey( s, secondSortKey ); 59 sortKey = Qtopia::buildSortKey( s, secondSortKey );
66} 60}
67 61
68int AbTableItem::alignment() const 62int AbTableItem::alignment() const
69{ 63{
70 return AlignLeft|AlignVCenter; 64 return AlignLeft|AlignVCenter;
71} 65}
72 66
73QString AbTableItem::key() const 67QString AbTableItem::key() const
74{ 68{
75 return sortKey; 69 return sortKey;
76} 70}
77 71
78// A way to reset the item, without out doing a delete or a new... 72// A way to reset the item, without out doing a delete or a new...
79void AbTableItem::setItem( const QString &txt, const QString &secondKey ) 73void AbTableItem::setItem( const QString &txt, const QString &secondKey )
80{ 74{
81 setText( txt ); 75 setText( txt );
82 sortKey = Qtopia::buildSortKey( txt, secondKey ); 76 sortKey = Qtopia::buildSortKey( txt, secondKey );
83 77
84 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower(); 78 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower();
85} 79}
86 80
87/*! 81/*!
88 \class AbPickItem abtable.h 82 \class AbPickItem abtable.h
89 83
90 \brief QTableItem based class for showing slection of an entry 84 \brief QTableItem based class for showing slection of an entry
91*/ 85*/
92 86
93AbPickItem::AbPickItem( QTable *t ) : 87AbPickItem::AbPickItem( QTable *t ) :
94 QTableItem(t, WhenCurrent, "?") 88 QTableItem(t, WhenCurrent, "?")
95{ 89{
96} 90}
97 91
98QWidget *AbPickItem::createEditor() const 92QWidget *AbPickItem::createEditor() const
99{ 93{
100 QComboBox* combo = new QComboBox( table()->viewport() ); 94 QComboBox* combo = new QComboBox( table()->viewport() );
101 ( (AbPickItem*)this )->cb = combo; 95 ( (AbPickItem*)this )->cb = combo;
102 AbTable* t = static_cast<AbTable*>(table()); 96 AbTable* t = static_cast<AbTable*>(table());
103 QStringList c = t->choiceNames(); 97 QStringList c = t->choiceNames();
104 int cur = 0; 98 int cur = 0;
105 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) { 99 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) {
106 if ( *it == text() ) 100 if ( *it == text() )
107 cur = combo->count(); 101 cur = combo->count();
108 combo->insertItem(*it); 102 combo->insertItem(*it);
109 } 103 }
110 combo->setCurrentItem(cur); 104 combo->setCurrentItem(cur);
111 return combo; 105 return combo;
112} 106}
113 107
114void AbPickItem::setContentFromEditor( QWidget *w ) 108void AbPickItem::setContentFromEditor( QWidget *w )
115{ 109{
116 if ( w->inherits("QComboBox") ) 110 if ( w->inherits("QComboBox") )
117 setText( ( (QComboBox*)w )->currentText() ); 111 setText( ( (QComboBox*)w )->currentText() );
118 else 112 else
119 QTableItem::setContentFromEditor( w ); 113 QTableItem::setContentFromEditor( w );
120} 114}
121 115
122/*! 116/*!
123 \class AbTable abtable.h 117 \class AbTable abtable.h
124 118
125 \brief QTable based class for showing a list of entries 119 \brief QTable based class for showing a list of entries
126*/ 120*/
127 121
128AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *name ) 122AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *name )
129// #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR 123 // #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR
130// : QTable( 0, 0, parent, name, TRUE ), 124 // : QTable( 0, 0, parent, name, TRUE ),
131// #else 125 // #else
132 : QTable( parent, name ), 126 : QTable( parent, name ),
133// #endif 127 // #endif
134 lastSortCol( -1 ), 128 lastSortCol( -1 ),
135 asc( TRUE ), 129 asc( TRUE ),
136 intFields( order ), 130 intFields( order ),
137 currFindRow( -2 ), 131 currFindRow( -2 ),
138 mCat( 0 ) 132 mCat( 0 ),
139{ 133 m_contactdb ("addressbook")
140 mCat.load( categoryFileName() ); 134{
141 setSelectionMode( NoSelection ); 135 mCat.load( categoryFileName() );
142 init(); 136 setSelectionMode( NoSelection );
143 setSorting( TRUE ); 137 init();
144 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), 138 setSorting( TRUE );
145 this, SLOT(itemClicked(int,int)) ); 139 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)),
140 this, SLOT(itemClicked(int,int)) );
146} 141}
147 142
148AbTable::~AbTable() 143AbTable::~AbTable()
@@ -151,696 +146,471 @@ AbTable::~AbTable()
151 146
152void AbTable::init() 147void AbTable::init()
153{ 148{
154 showChar = '\0'; 149 showChar = '\0';
155 setNumRows( 0 ); 150 setNumRows( 0 );
156 setNumCols( 2 ); 151 setNumCols( 2 );
157 152
158 horizontalHeader()->setLabel( 0, tr( "Full Name" )); 153 horizontalHeader()->setLabel( 0, tr( "Full Name" ));
159 horizontalHeader()->setLabel( 1, tr( "Contact" )); 154 horizontalHeader()->setLabel( 1, tr( "Contact" ));
160 setLeftMargin( 0 ); 155 setLeftMargin( 0 );
161 verticalHeader()->hide(); 156 verticalHeader()->hide();
157 columnVisible = true;
162} 158}
163 159
164void AbTable::columnClicked( int col ) 160void AbTable::columnClicked( int col )
165{ 161{
166 if ( !sorting() ) 162 if ( !sorting() )
167 return; 163 return;
168 164
169 if ( lastSortCol == -1 ) 165 if ( lastSortCol == -1 )
170 lastSortCol = col; 166 lastSortCol = col;
171 167
172 if ( col == lastSortCol ) { 168 if ( col == lastSortCol ) {
173 asc = !asc; 169 asc = !asc;
174 } else { 170 } else {
175 lastSortCol = col; 171 lastSortCol = col;
176 asc = TRUE; 172 asc = TRUE;
177 } 173 }
178 resort(); 174 //QMessageBox::information( this, "resort", "columnClicked" );
175 resort();
179} 176}
180 177
181void AbTable::resort() 178void AbTable::resort()
182{ 179{
183 if ( sorting() ) { 180 if ( sorting() ) {
184 if ( lastSortCol == -1 ) 181 if ( lastSortCol == -1 )
185 lastSortCol = 0; 182 lastSortCol = 0;
186 sortColumn( lastSortCol, asc, TRUE ); 183 sortColumn( lastSortCol, asc, TRUE );
187 updateVisible(); 184 //QMessageBox::information( this, "resort", "resort" );
188 } 185 updateVisible();
186 }
189} 187}
190 188
191Contact AbTable::currentEntry() 189OContact AbTable::currentEntry()
192{ 190{
193 Contact cnt; 191 OContact cnt;
194 AbTableItem *abItem; 192 AbTableItem *abItem;
195 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 )); 193 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 ));
196 if ( abItem ) { 194 if ( abItem ) {
197 cnt = contactList[abItem]; 195 cnt = contactList[abItem];
198 } 196 //cnt = contactList[currentRow()];
199 return cnt; 197 }
198 return cnt;
200} 199}
201 200
202void AbTable::replaceCurrentEntry( const Contact &newContact ) 201void AbTable::replaceCurrentEntry( const OContact &newContact )
203{ 202{
204 int row = currentRow(); 203 int row = currentRow();
205 updateJournal( newContact, Contact::ACTION_REPLACE, row ); 204 updateVisible();
206 updateVisible(); 205
207 206 journalFreeReplace( newContact, row );
208 journalFreeReplace( newContact, row ); 207
209} 208}
210 209
211void AbTable::deleteCurrentEntry() 210void AbTable::deleteCurrentEntry()
212{ 211{
213 int row = currentRow(); 212 int row = currentRow();
214 AbTableItem *abItem; 213
215 abItem = static_cast<AbTableItem*>(item( row, 0 )); 214 // a little wasteful, but it ensure's there is only one place
216 Contact oldContact; 215 // where we delete.
217 oldContact = contactList[abItem]; 216 journalFreeRemove( row );
218 updateJournal( oldContact, Contact::ACTION_REMOVE, row ); 217 updateVisible();
219 218
220 // a little wasteful, but it ensure's there is only one place 219 if ( numRows() == 0 )
221 // where we delete. 220 emit empty( TRUE );
222 journalFreeRemove( row ); 221
223 updateVisible();
224
225 if ( numRows() == 0 )
226 emit empty( TRUE );
227} 222}
228 223
229void AbTable::clear() 224void AbTable::clear()
230{ 225{
231 contactList.clear(); 226 contactList.clear();
232 for ( int r = 0; r < numRows(); ++r ) { 227 for ( int r = 0; r < numRows(); ++r ) {
233 for ( int c = 0; c < numCols(); ++c ) { 228 for ( int c = 0; c < numCols(); ++c ) {
234 if ( cellWidget( r, c ) ) 229 if ( cellWidget( r, c ) )
235 clearCellWidget( r, c ); 230 clearCellWidget( r, c );
236 clearCell( r, c ); 231 clearCell( r, c );
232 }
237 } 233 }
238 } 234 setNumRows( 0 );
239 setNumRows( 0 );
240} 235}
241 236
242void AbTable::refresh() 237void AbTable::refresh()
243{ 238{
244 int rows = numRows(); 239 int rows = numRows();
245 QString value; 240 QString value;
246 AbTableItem *abi; 241 AbTableItem *abi;
247 for ( int r = 0; r < rows; ++r ) { 242
248 abi = static_cast<AbTableItem*>( item(r, 0) ); 243 // hide columns so no flashing ?
249 value = findContactContact( contactList[abi] ); 244 if ( showBk == "Cards" ) {
250 static_cast<AbTableItem*>( item(r, 1) )->setItem( value, abi->text() ); 245 hideColumn(0);
251 } 246 hideColumn(1);
252 resort(); 247 }
248 for ( int r = 0; r < rows; ++r ) {
249 abi = static_cast<AbTableItem*>( item(r, 0) );
250 value = findContactContact( contactList[abi], r );
251 static_cast<AbTableItem*>( item(r, 1) )->setItem( value, abi->text() );
252 }
253 resort();
253} 254}
254 255
255void AbTable::keyPressEvent( QKeyEvent *e ) 256void AbTable::keyPressEvent( QKeyEvent *e )
256{ 257{
257 char key = toupper( e->ascii() ); 258 char key = toupper( e->ascii() );
258 259
259 if ( key >= 'A' && key <= 'Z' ) 260 if ( key >= 'A' && key <= 'Z' )
260 moveTo( key ); 261 moveTo( key );
261 262
262 switch( e->key() ) { 263 switch( e->key() ) {
263 case Qt::Key_Space: 264 case Qt::Key_Space:
264 case Qt::Key_Return: 265 case Qt::Key_Return:
265 case Qt::Key_Enter: 266 case Qt::Key_Enter:
266 emit details(); 267 emit details();
267 break; 268 break;
268 default: 269 default:
269 QTable::keyPressEvent( e ); 270 QTable::keyPressEvent( e );
270 } 271 }
271} 272}
272 273
273void AbTable::moveTo( char c ) 274void AbTable::moveTo( char c )
274{ 275{
275 276
276 int rows = numRows(); 277 int rows = numRows();
277 QString value; 278 QString value;
278 AbTableItem *abi; 279 AbTableItem *abi;
279 int r; 280 int r;
280 if ( asc ) { 281 if ( asc ) {
281 r = 0; 282 r = 0;
282 while ( r < rows-1) { 283 while ( r < rows-1) {
283 abi = static_cast<AbTableItem*>( item(r, 0) ); 284 abi = static_cast<AbTableItem*>( item(r, 0) );
284 QChar first = abi->key()[0]; 285 QChar first = abi->key()[0];
285 //### is there a bug in QChar to char comparison??? 286 //### is there a bug in QChar to char comparison???
286 if ( first.row() || first.cell() >= c ) 287 if ( first.row() || first.cell() >= c )
287 break; 288 break;
288 r++; 289 r++;
289 } 290 }
290 } else { 291 } else {
291 //### should probably disable reverse sorting instead 292 //### should probably disable reverse sorting instead
292 r = rows - 1; 293 r = rows - 1;
293 while ( r > 0 ) { 294 while ( r > 0 ) {
294 abi = static_cast<AbTableItem*>( item(r, 0) ); 295 abi = static_cast<AbTableItem*>( item(r, 0) );
295 QChar first = abi->key()[0]; 296 QChar first = abi->key()[0];
296 //### is there a bug in QChar to char comparison??? 297 //### is there a bug in QChar to char comparison???
297 if ( first.row() || first.cell() >= c ) 298 if ( first.row() || first.cell() >= c )
298 break; 299 break;
299 r--; 300 r--;
301 }
300 } 302 }
301 } 303 setCurrentCell( r, currentColumn() );
302 setCurrentCell( r, currentColumn() );
303} 304}
304 305
305 306
306QString AbTable::findContactName( const Contact &entry ) 307QString AbTable::findContactName( const OContact &entry )
307{ 308{
308 // We use the fileAs, then company, defaultEmail 309 // We use the fileAs, then company, defaultEmail
309 QString str; 310 QString str;
310 str = entry.fileAs(); 311 str = entry.fileAs();
311 if ( str.isEmpty() ) {
312 str = entry.company();
313 if ( str.isEmpty() ) { 312 if ( str.isEmpty() ) {
314 str = entry.defaultEmail(); 313 str = entry.company();
314 if ( str.isEmpty() ) {
315 str = entry.defaultEmail();
316 }
315 } 317 }
316 } 318 return str;
317 return str; 319}
318} 320
319 321QString AbTable::findContactContact( const OContact &entry, int /* row */ )
320QString AbTable::findContactContact( const Contact &entry ) 322{
321{ 323 QString value;
322 QString value; 324 value = "";
323 value = ""; 325 for ( QValueList<int>::ConstIterator it = intFields->begin();
324 for ( QValueList<int>::ConstIterator it = intFields->begin(); 326 it != intFields->end(); ++it ) {
325 it != intFields->end(); ++it ) { 327 switch ( *it ) {
326 switch ( *it ) { 328 default:
327 default: 329 break;
328 break; 330 case Qtopia::Title:
329 case Qtopia::Title: 331 value = entry.title();
330 value = entry.title(); 332 break;
331 break; 333 case Qtopia::Suffix:
332 case Qtopia::Suffix: 334 value = entry.suffix();
333 value = entry.suffix(); 335 break;
334 break; 336 case Qtopia::FileAs:
335 case Qtopia::FileAs: 337 value = entry.fileAs();
336 value = entry.fileAs(); 338 break;
337 break; 339 case Qtopia::DefaultEmail:
338 case Qtopia::DefaultEmail: 340 value = entry.defaultEmail();
339 value = entry.defaultEmail(); 341 case Qtopia::Emails:
340 case Qtopia::Emails: 342 value = entry.emails();
341 value = entry.emails(); 343 break;
342 break; 344 case Qtopia::HomeStreet:
343 case Qtopia::HomeStreet: 345 value = entry.homeStreet();
344 value = entry.homeStreet(); 346 break;
345 break; 347 case Qtopia::HomeCity:
346 case Qtopia::HomeCity: 348 value = entry.homeCity();
347 value = entry.homeCity(); 349 break;
348 break; 350 case Qtopia::HomeState:
349 case Qtopia::HomeState: 351 value = entry.homeState();
350 value = entry.homeState(); 352 break;
351 break; 353 case Qtopia::HomeZip:
352 case Qtopia::HomeZip: 354 value = entry.homeZip();
353 value = entry.homeZip(); 355 break;
354 break; 356 case Qtopia::HomeCountry:
355 case Qtopia::HomeCountry: 357 value = entry.homeCountry();
356 value = entry.homeCountry(); 358 break;
357 break; 359 case Qtopia::HomePhone:
358 case Qtopia::HomePhone: 360 value = entry.homePhone();
359 value = entry.homePhone(); 361 break;
360 break; 362 case Qtopia::HomeFax:
361 case Qtopia::HomeFax: 363 value = entry.homeFax();
362 value = entry.homeFax(); 364 break;
363 break; 365 case Qtopia::HomeMobile:
364 case Qtopia::HomeMobile: 366 value = entry.homeMobile();
365 value = entry.homeMobile(); 367 break;
366 break; 368 case Qtopia::HomeWebPage:
367 case Qtopia::HomeWebPage: 369 value = entry.homeWebpage();
368 value = entry.homeWebpage(); 370 break;
369 break; 371 case Qtopia::Company:
370 case Qtopia::Company: 372 value = entry.company();
371 value = entry.company(); 373 break;
372 break; 374 case Qtopia::BusinessCity:
373 case Qtopia::BusinessCity: 375 value = entry.businessCity();
374 value = entry.businessCity(); 376 break;
375 break; 377 case Qtopia::BusinessStreet:
376 case Qtopia::BusinessStreet: 378 value = entry.businessStreet();
377 value = entry.businessStreet(); 379 break;
378 break; 380 case Qtopia::BusinessZip:
379 case Qtopia::BusinessZip: 381 value = entry.businessZip();
380 value = entry.businessZip(); 382 break;
381 break; 383 case Qtopia::BusinessCountry:
382 case Qtopia::BusinessCountry: 384 value = entry.businessCountry();
383 value = entry.businessCountry(); 385 break;
384 break; 386 case Qtopia::BusinessWebPage:
385 case Qtopia::BusinessWebPage: 387 value = entry.businessWebpage();
386 value = entry.businessWebpage(); 388 break;
387 break; 389 case Qtopia::JobTitle:
388 case Qtopia::JobTitle: 390 value = entry.jobTitle();
389 value = entry.jobTitle(); 391 break;
390 break; 392 case Qtopia::Department:
391 case Qtopia::Department: 393 value = entry.department();
392 value = entry.department(); 394 break;
393 break; 395 case Qtopia::Office:
394 case Qtopia::Office: 396 value = entry.office();
395 value = entry.office(); 397 break;
396 break; 398 case Qtopia::BusinessPhone:
397 case Qtopia::BusinessPhone: 399 value = entry.businessPhone();
398 value = entry.businessPhone(); 400 break;
399 break; 401 case Qtopia::BusinessFax:
400 case Qtopia::BusinessFax: 402 value = entry.businessFax();
401 value = entry.businessFax(); 403 break;
402 break; 404 case Qtopia::BusinessMobile:
403 case Qtopia::BusinessMobile: 405 value = entry.businessMobile();
404 value = entry.businessMobile(); 406 break;
405 break; 407 case Qtopia::BusinessPager:
406 case Qtopia::BusinessPager: 408 value = entry.businessPager();
407 value = entry.businessPager(); 409 break;
408 break; 410 case Qtopia::Profession:
409 case Qtopia::Profession: 411 value = entry.profession();
410 value = entry.profession(); 412 break;
411 break; 413 case Qtopia::Assistant:
412 case Qtopia::Assistant: 414 value = entry.assistant();
413 value = entry.assistant(); 415 break;
414 break; 416 case Qtopia::Manager:
415 case Qtopia::Manager: 417 value = entry.manager();
416 value = entry.manager(); 418 break;
417 break; 419 case Qtopia::Spouse:
418 case Qtopia::Spouse: 420 value = entry.spouse();
419 value = entry.spouse(); 421 break;
420 break; 422 case Qtopia::Gender:
421 case Qtopia::Gender: 423 value = entry.gender();
422 value = entry.gender(); 424 break;
423 break; 425 case Qtopia::Birthday:
424 case Qtopia::Birthday: 426 value = entry.birthday();
425 value = entry.birthday(); 427 break;
426 break; 428 case Qtopia::Anniversary:
427 case Qtopia::Anniversary: 429 value = entry.anniversary();
428 value = entry.anniversary(); 430 break;
429 break; 431 case Qtopia::Nickname:
430 case Qtopia::Nickname: 432 value = entry.nickname();
431 value = entry.nickname(); 433 break;
432 break; 434 case Qtopia::Children:
433 case Qtopia::Children: 435 value = entry.children();
434 value = entry.children(); 436 break;
435 break; 437 case Qtopia::Notes:
436 case Qtopia::Notes: 438 value = entry.notes();
437 value = entry.notes(); 439 break;
438 break; 440 }
441 if ( !value.isEmpty() )
442 break;
439 } 443 }
440 if ( !value.isEmpty() ) 444 return value;
441 break;
442 }
443 return value;
444} 445}
445 446
446void AbTable::addEntry( const Contact &newCnt ) 447void AbTable::addEntry( const OContact &newCnt )
447{ 448{
448 int row = numRows(); 449 int row = numRows();
449 setNumRows( row + 1 ); 450
450 updateJournal( newCnt, Contact::ACTION_ADD ); 451 setNumRows( row + 1 );
451 insertIntoTable( newCnt, row ); 452 insertIntoTable( newCnt, row );
452 setCurrentCell( row, 0 ); 453
453 updateVisible(); 454 qWarning("abtable:AddContact");
455 m_contactdb.add ( newCnt );
456
457 setCurrentCell( row, 0 );
458 // updateVisible();
454} 459}
455 460
456void AbTable::resizeRows( int size ) { 461void AbTable::resizeRows() {
457/* 462 /*
458 if (numRows()) { 463 if (numRows()) {
459 for (int i = 0; i < numRows(); i++) { 464 for (int i = 0; i < numRows(); i++) {
460 setRowHeight( i, size ); 465 setRowHeight( i, size );
461 } 466 }
462 }*/ 467 }
463 updateVisible(); 468 updateVisible();
469 */
464} 470}
465 471
466void AbTable::updateJournal( const Contact &cnt,
467 Contact::journal_action action, int row )
468{
469 QFile f( journalFileName() );
470 if ( !f.open(IO_WriteOnly|IO_Append) )
471 return;
472 QString buf;
473 QCString str;
474 buf = "<Contact ";
475 cnt.save( buf );
476 buf += " action=\"" + QString::number( (int)action ) + "\" ";
477 if ( action == Contact::ACTION_REMOVE || action == Contact::ACTION_REPLACE)
478 buf += " actionrow=\"" + QString::number(row) + "\" ";
479 buf += "/>\n";
480 QCString cstr = buf.utf8();
481 f.writeBlock( cstr.data(), cstr.length() );
482 QCopEnvelope( "QPE/PIM", "addressbookUpdated()" );
483}
484 472
485bool AbTable::save( const QString &fn ) 473bool AbTable::save( const QString& /* fn */ )
486{ 474{
487// QTime t; 475 // QTime t;
488// t.start(); 476 // t.start();
489 477 qWarning("abtable:Save data");
490 QString strNewFile = fn + ".new"; 478 m_contactdb.save();
491 QFile f( strNewFile ); 479
492 if ( !f.open( IO_WriteOnly|IO_Raw ) ) 480 return true;
493 return false;
494
495 int total_written;
496 QString out;
497 out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n"
498 " <Groups>\n"
499 " </Groups>\n"
500 " <Contacts>\n";
501 QMapIterator<AbTableItem*, Contact> it;
502 for ( it = contactList.begin(); it != contactList.end(); ++it ) {
503 out += "<Contact ";
504 it.data().save( out );
505 out += "/>\n";
506 QCString cstr = out.utf8();
507 total_written = f.writeBlock( cstr.data(), cstr.length() );
508 if ( total_written != int(cstr.length()) ) {
509 f.close();
510 QFile::remove( strNewFile );
511 return false;
512 }
513 out = "";
514 }
515 out += " </Contacts>\n</AddressBook>\n";
516
517 QCString cstr = out.utf8();
518 total_written = f.writeBlock( cstr.data(), cstr.length() );
519 if ( total_written != int(cstr.length()) ) {
520 f.close();
521 QFile::remove( strNewFile );
522 return false;
523 }
524 f.close();
525
526// qDebug("saving: %d", t.elapsed() );
527
528 // move the file over, I'm just going to use the system call
529 // because, I don't feel like using QDir.
530 if ( ::rename( strNewFile.latin1(), fn.latin1() ) < 0 ) {
531 qWarning( "problem renaming file %s to %s, errno: %d",
532 strNewFile.latin1(), fn.latin1(), errno );
533 // remove the tmp file...
534 QFile::remove( strNewFile );
535 }
536 // remove the journal...
537 QFile::remove( journalFileName() );
538 return true;
539} 481}
540 482
541void AbTable::load( const QString &fn ) 483void AbTable::load( const QString& /* fn */ )
542{ 484{
543 setSorting( false ); 485 setSorting( false );
544 loadFile( fn, false ); 486 setUpdatesEnabled( FALSE );
545 // merge in the journal 487
546 if ( QFile::exists( journalFileName() ) ) { 488 qWarning("abtable:Load data");
547 loadFile( journalFileName(), true ); 489
548 save( fn ); 490 OContactAccess::List list = m_contactdb.allRecords();
549 } 491 OContactAccess::List::Iterator it;
550 setSorting( true ); 492 setNumRows( list.count() );
551 resort(); 493 int row = 0;
494 for ( it = list.begin(); it != list.end(); ++it )
495 insertIntoTable( *it, row++ );
496
497 resort();
498
499 setUpdatesEnabled( TRUE );
500
501 setSorting( true );
502 //resort();
552} 503}
553 504
554void AbTable::loadFile( const QString &strFile, bool journalFile )
555{
556// QTime t;
557// t.start();
558 QFile f( strFile );
559 if ( !f.open(IO_ReadOnly) )
560 return;
561 QList<Contact> list;
562 list.setAutoDelete( TRUE );
563 QByteArray ba = f.readAll();
564 f.close();
565 if (ba.isEmpty() )
566 return;
567 char *uc = ba.data();//(QChar *)data.unicode();
568 int len = ba.size();//data.length();
569 bool foundAction = false;
570 Contact::journal_action action;
571 bool foundKey = false;
572 int journalKey = 0;
573
574 const int JOURNALACTION = Qtopia::Notes + 1;
575 const int JOURNALROW = JOURNALACTION + 1;
576
577 // **********************************
578 // CHANGE THE SIZE OF THE DICT IF YOU ADD ANY MORE FIELDS!!!!
579 // **********************************
580 QAsciiDict<int> dict( 47 );
581 dict.setAutoDelete( TRUE );
582 dict.insert( "Uid", new int(Qtopia::AddressUid) );
583 dict.insert( "Title", new int(Qtopia::Title) );
584 dict.insert( "FirstName", new int(Qtopia::FirstName) );
585 dict.insert( "MiddleName", new int(Qtopia::MiddleName) );
586 dict.insert( "LastName", new int(Qtopia::LastName) );
587 dict.insert( "Suffix", new int(Qtopia::Suffix) );
588 dict.insert( "FileAs", new int(Qtopia::FileAs) );
589 dict.insert( "Categories", new int(Qtopia::AddressCategory) );
590 dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) );
591 dict.insert( "Emails", new int(Qtopia::Emails) );
592 dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) );
593 dict.insert( "HomeCity", new int(Qtopia::HomeCity) );
594 dict.insert( "HomeState", new int(Qtopia::HomeState) );
595 dict.insert( "HomeZip", new int(Qtopia::HomeZip) );
596 dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) );
597 dict.insert( "HomePhone", new int(Qtopia::HomePhone) );
598 dict.insert( "HomeFax", new int(Qtopia::HomeFax) );
599 dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) );
600 dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) );
601 dict.insert( "Company", new int(Qtopia::Company) );
602 dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) );
603 dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) );
604 dict.insert( "BusinessState", new int(Qtopia::BusinessState) );
605 dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) );
606 dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) );
607 dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) );
608 dict.insert( "JobTitle", new int(Qtopia::JobTitle) );
609 dict.insert( "Department", new int(Qtopia::Department) );
610 dict.insert( "Office", new int(Qtopia::Office) );
611 dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) );
612 dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) );
613 dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) );
614 dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) );
615 dict.insert( "Profession", new int(Qtopia::Profession) );
616 dict.insert( "Assistant", new int(Qtopia::Assistant) );
617 dict.insert( "Manager", new int(Qtopia::Manager) );
618 dict.insert( "Spouse", new int(Qtopia::Spouse) );
619 dict.insert( "Children", new int(Qtopia::Children) );
620 dict.insert( "Gender", new int(Qtopia::Gender) );
621 dict.insert( "Birthday", new int(Qtopia::Birthday) );
622 dict.insert( "Anniversary", new int(Qtopia::Anniversary) );
623 dict.insert( "Nickname", new int(Qtopia::Nickname) );
624 dict.insert( "Notes", new int(Qtopia::Notes) );
625 dict.insert( "action", new int(JOURNALACTION) );
626 dict.insert( "actionrow", new int(JOURNALROW) );
627
628 int i = 0;
629 int num = 0;
630 char *point;
631 while ( (point = strstr( uc+i, "<Contact " ) ) != NULL ) {
632 i = point - uc;
633 // if we are reading the standard file, we just need to
634 // insert info, so just say we'll do an insert...
635 action = Contact::ACTION_ADD;
636 // new Contact
637 Contact *cnt = new Contact;
638 i += 9;
639 while ( 1 ) {
640 while ( i < len && (uc[i] == ' ' || uc[i] == '\n' || uc[i] == '\r') )
641 i++;
642 if ( i >= len-2 || (uc[i] == '/' && uc[i+1] == '>') )
643 break;
644 // we have another attribute read it.
645 int j = i;
646 while ( j < len && uc[j] != '=' )
647 j++;
648 char *attr = uc+i;
649 uc[j] = '\0';
650 //qDebug("attr=%s", attr.latin1() );
651 i = ++j; // skip =
652 while ( i < len && uc[i] != '"' )
653 i++;
654 j = ++i;
655 bool haveEnt = FALSE;
656 bool haveUtf = FALSE;
657 while ( j < len && uc[j] != '"' ) {
658 if ( uc[j] == '&' )
659 haveEnt = TRUE;
660 if ( ((unsigned char)uc[j]) > 0x7f )
661 haveUtf = TRUE;
662 j++;
663 }
664
665 if ( j == i ) {
666 // empty value
667 i = j + 1;
668 continue;
669 }
670
671 QString value = haveUtf ? QString::fromUtf8( uc+i, j-i )
672 : QString::fromLatin1( uc+i, j-i );
673 if ( haveEnt )
674 value = Qtopia::plainString( value );
675 i = j + 1;
676
677 int *find = dict[ attr ];
678 if ( !find ) {
679 cnt->setCustomField(attr, value);
680 continue;
681 }
682#if 1
683 switch( *find ) {
684 case Qtopia::AddressUid:
685 cnt->setUid( value.toInt() );
686 break;
687 case Qtopia::AddressCategory:
688 cnt->setCategories( Qtopia::Record::idsFromString( value ));
689 break;
690 case JOURNALACTION:
691 action = Contact::journal_action(value.toInt());
692 break;
693 case JOURNALROW:
694 journalKey = value.toInt();
695 break;
696 505
697 default: 506void AbTable::realignTable( int row )
698 cnt->insert( *find, value ); 507{
699 break; 508 QTableItem *ti1,
700 } 509 *ti2;
701#endif 510 int totalRows = numRows();
511 for ( int curr = row; curr < totalRows - 1; curr++ ) {
512 // the same info from the todo list still applies, but I
513 // don't think it is _too_ bad.
514 ti1 = item( curr + 1, 0 );
515 ti2 = item( curr + 1, 1 );
516 takeItem( ti1 );
517 takeItem( ti2 );
518 setItem( curr, 0, ti1 );
519 setItem( curr, 1, ti2 );
702 } 520 }
703 521 setNumRows( totalRows - 1 );
704 // sadly we can't delay adding of items from the journal to get 522 resort();
705 // the proper effect, but then, the journal should _never_ be 523}
706 // that huge, and recovering from a crash is not necessarily 524
707 // a *fast* thing. 525// Add contact into table.
708 switch ( action ) { 526void AbTable::insertIntoTable( const OContact &cnt, int row )
709 case Contact::ACTION_ADD: 527{
710 if ( journalFile ) { 528 QString strName,
529 strContact;
530
531 strName = findContactName( cnt );
532 strContact = findContactContact( cnt, row );
533
534 AbTableItem *ati;
535 ati = new AbTableItem( this, QTableItem::Never, strName, strContact);
536 contactList.insert( ati, cnt );
537 setItem( row, 0, ati );
538 ati = new AbTableItem( this, QTableItem::Never, strContact, strName);
539 setItem( row, 1, ati );
540
541 //### cannot do this; table only has two columns at this point
542 // setItem( row, 2, new AbPickItem( this ) );
543
544 // resort at some point?
545}
546
547
548// Replace or add an entry
549void AbTable::journalFreeReplace( const OContact &cnt, int row )
550{
551 QString strName,
552 strContact;
553 AbTableItem *ati = 0l;
554
555 strName = findContactName( cnt );
556 strContact = findContactContact( cnt, row );
557 ati = static_cast<AbTableItem*>(item(row, 0));
558
559 // Replace element if found in row "row"
560 // or add this element if not.
561 if ( ati != 0 ) { // replace
562 // :SX db access -> replace
563 qWarning ("Replace Contact in DB ! UID: %d", contactList[ati].uid() );
564 m_contactdb.replace ( cnt );
565
566 contactList.remove( ati );
567 ati->setItem( strName, strContact );
568 contactList.insert( ati, cnt );
569
570 ati = static_cast<AbTableItem*>(item(row, 1));
571 ati->setItem( strContact, strName );
572
573 }else{ // add
711 int myrows = numRows(); 574 int myrows = numRows();
712 setNumRows( myrows + 1 ); 575 setNumRows( myrows + 1 );
713 insertIntoTable( *cnt, myrows ); 576 insertIntoTable( cnt, myrows );
714 delete cnt; 577 // gets deleted when returning -- Why ? (se)
715 } 578 // :SX db access -> add
716 else 579 qWarning ("Are you sure to add to database ? -> Currently disabled !!");
717 list.append( cnt ); 580 // m_contactdb.add( cnt );
718 break;
719 case Contact::ACTION_REMOVE:
720 // yup, we don't use the entry to remove the object...
721 journalFreeRemove( journalKey );
722 delete cnt;
723 break;
724 case Contact::ACTION_REPLACE:
725 journalFreeReplace( *cnt, journalKey );
726 delete cnt;
727 break;
728 default:
729 break;
730 } 581 }
731 num++;
732 foundAction = false;
733 foundKey = false;
734 // if ( num % 100 == 0 ) {
735 // qDebug("loading file, num=%d, t=%d", num, t.elapsed() );
736 // }
737 }
738 if ( list.count() > 0 ) {
739 internalAddEntries( list );
740 }
741// qDebug("done loading %d, t=%d", num, t.elapsed() );
742
743}
744
745void AbTable::realignTable( int row )
746{
747 QTableItem *ti1,
748 *ti2;
749 int totalRows = numRows();
750 for ( int curr = row; curr < totalRows - 1; curr++ ) {
751 // the same info from the todo list still applies, but I
752 // don't think it is _too_ bad.
753 ti1 = item( curr + 1, 0 );
754 ti2 = item( curr + 1, 1 );
755 takeItem( ti1 );
756 takeItem( ti2 );
757 setItem( curr, 0, ti1 );
758 setItem( curr, 1, ti2 );
759 }
760 setNumRows( totalRows - 1 );
761 resort();
762}
763
764void AbTable::insertIntoTable( const Contact &cnt, int row )
765{
766 QString strName,
767 strContact;
768
769 strName = findContactName( cnt );
770 strContact = findContactContact( cnt );
771
772 AbTableItem *ati;
773 ati = new AbTableItem( this, QTableItem::Never, strName, strContact);
774 contactList.insert( ati, cnt );
775 setItem( row, 0, ati );
776 ati = new AbTableItem( this, QTableItem::Never, strContact, strName);
777 setItem( row, 1, ati );
778
779 //### cannot do this; table only has two columns at this point
780 // setItem( row, 2, new AbPickItem( this ) );
781
782 // resort at some point?
783}
784
785void AbTable::internalAddEntries( QList<Contact> &list )
786{
787 setUpdatesEnabled( FALSE );
788 setNumRows( list.count() );
789 int row = 0;
790 Contact *it;
791 for ( it = list.first(); it; it = list.next() )
792 insertIntoTable( *it, row++ );
793 resort();
794 setUpdatesEnabled( TRUE );
795}
796
797
798void AbTable::journalFreeReplace( const Contact &cnt, int row )
799{
800 QString strName,
801 strContact;
802 AbTableItem *ati = 0l;
803
804 strName = findContactName( cnt );
805 strContact = findContactContact( cnt );
806 ati = static_cast<AbTableItem*>(item(row, 0));
807 if ( ati != 0 ) {
808 contactList.remove( ati );
809 ati->setItem( strName, strContact );
810 contactList.insert( ati, cnt );
811
812 ati = static_cast<AbTableItem*>(item(row, 1));
813 ati->setItem( strContact, strName );
814 }else{
815 int myrows = numRows();
816 setNumRows( myrows + 1 );
817 insertIntoTable( cnt, myrows );
818 // gets deleted when returning
819 }
820} 582}
821 583
584// Remove entry
822void AbTable::journalFreeRemove( int row ) 585void AbTable::journalFreeRemove( int row )
823{ 586{
824 AbTableItem *ati; 587 AbTableItem *ati;
825 ati = static_cast<AbTableItem*>(item(row, 0)); 588 ati = static_cast<AbTableItem*>(item(row, 0));
826 if ( !ati ) 589 if ( !ati )
827 return; 590 return;
828 contactList.remove( ati ); 591
829 realignTable( row ); 592 // :SX db access -> remove
593 qWarning ("Remove Contact from DB ! UID: %d",contactList[ati].uid() );
594 m_contactdb.remove( contactList[ati].uid() );
595
596 contactList.remove( ati );
597
598 realignTable( row );
599
830} 600}
831 601
832#if QT_VERSION <= 230 602#if QT_VERSION <= 230
833#ifndef SINGLE_APP 603#ifndef SINGLE_APP
834void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch ) 604void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch )
835{ 605{
836 // Region of the rect we should draw 606 // Region of the rect we should draw
837 QRegion reg( QRect( cx, cy, cw, ch ) ); 607 QRegion reg( QRect( cx, cy, cw, ch ) );
838 // Subtract the table from it 608 // Subtract the table from it
839 reg = reg.subtract( QRect( QPoint( 0, 0 ), tableSize() ) ); 609 reg = reg.subtract( QRect( QPoint( 0, 0 ), tableSize() ) );
840 // And draw the rectangles (transformed as needed) 610 // And draw the rectangles (transformed as needed)
841 QArray<QRect> r = reg.rects(); 611 QArray<QRect> r = reg.rects();
842 for (unsigned int i=0; i<r.count(); i++) 612 for (unsigned int i=0; i<r.count(); i++)
843 p->fillRect( r[i], colorGroup().brush( QColorGroup::Base ) ); 613 p->fillRect( r[i], colorGroup().brush( QColorGroup::Base ) );
844} 614}
845#endif 615#endif
846#endif 616#endif
@@ -864,347 +634,369 @@ void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch )
864void AbTable::slotDoFind( const QString &findString, bool caseSensitive, 634void AbTable::slotDoFind( const QString &findString, bool caseSensitive,
865 bool backwards, int category ) 635 bool backwards, int category )
866{ 636{
867 if ( currFindRow < -1 ) 637 if ( currFindRow < -1 )
868 currFindRow = currentRow() - 1; 638 currFindRow = currentRow() - 1;
869 clearSelection( TRUE ); 639 clearSelection( TRUE );
870 int rows, 640 int rows, row;
871 row; 641 AbTableItem *ati;
872 AbTableItem *ati; 642 QRegExp r( findString );
873 QRegExp r( findString ); 643 r.setCaseSensitive( caseSensitive );
874 r.setCaseSensitive( caseSensitive ); 644 rows = numRows();
875 rows = numRows(); 645 static bool wrapAround = true;
876 static bool wrapAround = true; 646
877 647 if ( !backwards ) {
878 if ( !backwards ) { 648 for ( row = currFindRow + 1; row < rows; row++ ) {
879 for ( row = currFindRow + 1; row < rows; row++ ) { 649 ati = static_cast<AbTableItem*>( item(row, 0) );
880 ati = static_cast<AbTableItem*>( item(row, 0) ); 650 if ( contactCompare( contactList[ati], r, category ) )
881 if ( contactCompare( contactList[ati], r, category ) ) 651 //if ( contactCompare( contactList[row], r, category ) )
882 break; 652 break;
883 653 }
654 } else {
655 for ( row = currFindRow - 1; row > -1; row-- ) {
656 ati = static_cast<AbTableItem*>( item(row, 0) );
657 if ( contactCompare( contactList[ati], r, category ) )
658 //if ( contactCompare( contactList[row], r, category ) )
659 break;
660 }
884 } 661 }
885 } else { 662 if ( row >= rows || row < 0 ) {
886 for ( row = currFindRow - 1; row > -1; row-- ) { 663 if ( row < 0 )
887 ati = static_cast<AbTableItem*>( item(row, 0) ); 664 currFindRow = rows;
888 if ( contactCompare( contactList[ati], r, category ) ) 665 else
889 break; 666 currFindRow = -1;
667
668 if ( wrapAround )
669 emit signalWrapAround();
670 else
671 emit signalNotFound();
672
673 wrapAround = !wrapAround;
674 } else {
675 currFindRow = row;
676 QTableSelection foundSelection;
677 foundSelection.init( currFindRow, 0 );
678 foundSelection.expandTo( currFindRow, numCols() - 1 );
679 addSelection( foundSelection );
680 setCurrentCell( currFindRow, numCols() - 1 );
681 wrapAround = true;
890 } 682 }
891 }
892 if ( row >= rows || row < 0 ) {
893 if ( row < 0 )
894 currFindRow = rows;
895 else
896 currFindRow = -1;
897
898 if ( wrapAround )
899 emit signalWrapAround();
900 else
901 emit signalNotFound();
902
903 wrapAround = !wrapAround;
904 } else {
905 currFindRow = row;
906 QTableSelection foundSelection;
907 foundSelection.init( currFindRow, 0 );
908 foundSelection.expandTo( currFindRow, numCols() - 1 );
909 addSelection( foundSelection );
910 setCurrentCell( currFindRow, numCols() - 1 );
911 wrapAround = true;
912 }
913} 683}
914 684
915static bool contactCompare( const Contact &cnt, const QRegExp &r, int category ) 685static bool contactCompare( const OContact &cnt, const QRegExp &r, int category )
916{ 686{
917 bool returnMe; 687 bool returnMe;
918 QArray<int> cats; 688 QArray<int> cats;
919 cats = cnt.categories(); 689 cats = cnt.categories();
920 690
921 returnMe = false; 691 returnMe = false;
922 if ( (category == -1 && cats.count() == 0) || category == -2 ) 692 if ( (category == -1 && cats.count() == 0) || category == -2 )
923 returnMe = cnt.match( r );
924 else {
925 int i;
926 for ( i = 0; i < int(cats.count()); i++ ) {
927 if ( cats[i] == category ) {
928 returnMe = cnt.match( r ); 693 returnMe = cnt.match( r );
929 break; 694 else {
930 } 695 int i;
696 for ( i = 0; i < int(cats.count()); i++ ) {
697 if ( cats[i] == category ) {
698 returnMe = cnt.match( r );
699 break;
700 }
701 }
931 } 702 }
932 } 703
933 return returnMe; 704 return returnMe;
934} 705}
935 706
936void AbTable::fitColumns() 707void AbTable::fitColumns()
937{ 708{
938 int contentsWidth = visibleWidth(); 709 int contentsWidth = visibleWidth() / 2;
939 int n = numCols(); 710
940 int pw = n == 3 ? columnWidth(2) : 0; 711 if ( showBk == "Cards" ) {
941 setColumnWidth( 0, contentsWidth - contentsWidth / 2 ); 712 showColumn(1);
942 setColumnWidth( 1, contentsWidth / 2 - pw ); 713 //adjustColumn(1);
714 setColumnWidth( 1, visibleWidth() );
715 columnVisible = false;
716 } else {
717 if ( columnVisible == false ){
718 showColumn(0);
719 columnVisible = true;
720 }
721 setColumnWidth( 0, contentsWidth );
722 adjustColumn(1);
723 if ( columnWidth(1) < contentsWidth )
724 setColumnWidth( 1, contentsWidth );
725 }
943} 726}
944 727
945void AbTable::show() 728void AbTable::show()
946{ 729{
947 fitColumns(); 730 fitColumns();
948 QTable::show(); 731 QTable::show();
949} 732}
950 733
951void AbTable::setChoiceNames( const QStringList& list) 734void AbTable::setChoiceNames( const QStringList& list)
952{ 735{
953 choicenames = list; 736 choicenames = list;
954 if ( choicenames.isEmpty() ) { 737 if ( choicenames.isEmpty() ) {
955 // hide pick column 738 // hide pick column
956 setNumCols( 2 ); 739 setNumCols( 2 );
957 } else { 740 } else {
958 // show pick column 741 // show pick column
959 setNumCols( 3 ); 742 setNumCols( 3 );
960 setColumnWidth( 2, fontMetrics().width(tr( "Pick" ))+8 ); 743 setColumnWidth( 2, fontMetrics().width(tr( "Pick" ))+8 );
961 horizontalHeader()->setLabel( 2, tr( "Pick" )); 744 horizontalHeader()->setLabel( 2, tr( "Pick" ));
962 } 745 }
963 fitColumns(); 746 fitColumns();
964} 747}
965 748
966void AbTable::itemClicked(int,int col) 749void AbTable::itemClicked(int,int col)
967{ 750{
968 if ( col == 2 ) { 751 if ( col == 2 ) {
969 return; 752 return;
970 } else { 753 } else {
971 emit details(); 754 emit details();
972 } 755 }
973} 756}
974 757
975QStringList AbTable::choiceNames() const 758QStringList AbTable::choiceNames() const
976{ 759{
977 return choicenames; 760 return choicenames;
978} 761}
979 762
980void AbTable::setChoiceSelection(int /*index*/, const QStringList& /*list*/) 763void AbTable::setChoiceSelection(int /*index*/, const QStringList& /*list*/)
981{ 764{
982 /* ###### 765 /* ######
983 766
984 QString selname = choicenames.at(index); 767 QString selname = choicenames.at(index);
985 for (each row) { 768 for (each row) {
986 Contact *c = contactForRow(row); 769 OContact *c = contactForRow(row);
987 if ( list.contains(c->email) ) { 770 if ( list.contains(c->email) ) {
988 list.remove(c->email); 771 list.remove(c->email);
989 setText(row, 2, selname); 772 setText(row, 2, selname);
990 } 773 }
991 } 774 }
992 for (remaining list items) { 775 for (remaining list items) {
993 Contact *c = new contact(item); 776 OContact *c = new contact(item);
994 setText(newrow, 2, selname); 777 setText(newrow, 2, selname);
995 } 778 }
996 779
997 */ 780 */
998} 781}
999 782
1000QStringList AbTable::choiceSelection(int /*index*/) const 783QStringList AbTable::choiceSelection(int /*index*/) const
1001{ 784{
1002 QStringList r; 785 QStringList r;
1003 /* ###### 786 /* ######
1004 787
1005 QString selname = choicenames.at(index); 788 QString selname = choicenames.at(index);
1006 for (each row) { 789 for (each row) {
1007 Contact *c = contactForRow(row); 790 OContact *c = contactForRow(row);
1008 if ( text(row,2) == selname ) { 791 if ( text(row,2) == selname ) {
1009 r.append(c->email); 792 r.append(c->email);
1010 }
1011 } 793 }
1012 794 }
1013 */ 795
1014 return r; 796 */
797 return r;
1015} 798}
1016 799
1017void AbTable::setShowCategory( const QString &c ) 800void AbTable::setShowCategory( const QString &b, const QString &c )
1018{ 801{
1019 showCat = c; 802 showBk = b;
1020 updateVisible(); 803 showCat = c;
804 //QMessageBox::information( this, "setShowCategory", "setShowCategory" );
805 //updateVisible();
806 refresh();
807 ensureCellVisible( currentRow(), 0 );
808 updateVisible(); // :SX
1021} 809}
1022 810
1023void AbTable::setShowByLetter( char c ) 811void AbTable::setShowByLetter( char c )
1024{ 812{
1025 showChar = tolower(c); 813 showChar = tolower(c);
1026 updateVisible(); 814 updateVisible();
1027} 815}
1028 816
1029QString AbTable::showCategory() const 817QString AbTable::showCategory() const
1030{ 818{
1031 return showCat; 819 return showCat;
1032} 820}
1033 821
822QString AbTable::showBook() const
823{
824 return showBk;
825}
1034 826
1035QStringList AbTable::categories() 827QStringList AbTable::categories()
1036{ 828{
1037 mCat.load( categoryFileName() ); 829 mCat.load( categoryFileName() );
1038 QStringList categoryList = mCat.labels( "Contacts" ); 830 QStringList categoryList = mCat.labels( "Contacts" );
1039 return categoryList; 831 return categoryList;
1040} 832}
1041 833
1042void AbTable::updateVisible() 834void AbTable::updateVisible()
1043{ 835{
1044 int visible, 836 int visible,
1045 totalRows, 837 totalRows,
1046 id, 838 id,
1047 totalCats, 839 totalCats,
1048 it, 840 it,
1049 row; 841 row;
1050 bool hide; 842 bool hide;
1051 AbTableItem *ati; 843 AbTableItem *ati;
1052 Contact *cnt; 844 OContact *cnt;
1053 QString fileAsName; 845 QString fileAsName;
1054 QString tmpStr; 846 QString tmpStr;
1055 visible = 0; 847 visible = 0;
1056 848
1057 setPaintingEnabled( FALSE ); 849 setPaintingEnabled( FALSE );
1058 850
1059 totalRows = numRows(); 851 totalRows = numRows();
1060 id = mCat.id( "Contacts", showCat ); 852 id = mCat.id( "Contacts", showCat );
1061 QArray<int> cats; 853 QArray<int> cats;
1062 for ( row = 0; row < totalRows; row++ ) { 854 for ( row = 0; row < totalRows; row++ ) {
1063 ati = static_cast<AbTableItem*>( item(row, 0) ); 855 ati = static_cast<AbTableItem*>( item(row, 0) );
1064 cnt = &contactList[ati]; 856 cnt = &contactList[ati];
1065 cats = cnt->categories(); 857 cats = cnt->categories();
1066 fileAsName = cnt->fileAs(); 858 fileAsName = cnt->fileAs();
1067 hide = false; 859 hide = false;
1068 if ( !showCat.isEmpty() ) { 860 if ( !showCat.isEmpty() ) {
1069 if ( showCat == tr( "Unfiled" ) ) { 861 if ( showCat == tr( "Unfiled" ) ) {
1070 if ( cats.count() > 0 ) 862 if ( cats.count() > 0 )
1071 hide = true; 863 hide = true;
1072 } else { 864 } else {
1073 // do some comparing 865 // do some comparing
1074 if ( !hide ) { 866 if ( !hide ) {
1075 hide = true; 867 hide = true;
1076 totalCats = int(cats.count()); 868 totalCats = int(cats.count());
1077 for ( it = 0; it < totalCats; it++ ) { 869 for ( it = 0; it < totalCats; it++ ) {
1078 if ( cats[it] == id ) { 870 if ( cats[it] == id ) {
1079 hide = false; 871 hide = false;
1080 break; 872 break;
873 }
874 }
875 }
1081 } 876 }
1082 }
1083 } 877 }
1084 } 878 if ( showChar != '\0' ) {
1085 } 879 tmpStr = fileAsName.left(1);
1086 if ( showChar != '\0' ) { 880 tmpStr = tmpStr.lower();
1087 tmpStr = fileAsName.left(1); 881 if ( tmpStr != QString(QChar(showChar)) && showChar != '#' ) {
1088 tmpStr = tmpStr.lower(); 882 hide = true;
1089 if ( tmpStr != QString(QChar(showChar)) && showChar != '#' ) { 883 }
1090 hide = true; 884 if ( showChar == '#' ) {
1091 } 885 if (tmpStr == "a")
1092 if ( showChar == '#' ) { 886 hide = true;
1093 if (tmpStr == "a") 887
1094 hide = true; 888 if (tmpStr == "b")
1095 889 hide = true;
1096 if (tmpStr == "b") 890
1097 hide = true; 891 if (tmpStr == "c")
1098 892 hide = true;
1099 if (tmpStr == "c") 893
1100 hide = true; 894 if (tmpStr == "d")
1101 895 hide = true;
1102 if (tmpStr == "d") 896
1103 hide = true; 897 if (tmpStr == "e")
1104 898 hide = true;
1105 if (tmpStr == "e") 899
1106 hide = true; 900 if (tmpStr == "f")
1107 901 hide = true;
1108 if (tmpStr == "f") 902
1109 hide = true; 903 if (tmpStr == "g")
1110 904 hide = true;
1111 if (tmpStr == "g") 905
1112 hide = true; 906 if (tmpStr == "h")
1113 907 hide = true;
1114 if (tmpStr == "h") 908
1115 hide = true; 909 if (tmpStr == "i")
1116 910 hide = true;
1117 if (tmpStr == "i") 911
1118 hide = true; 912 if (tmpStr == "j")
1119 913 hide = true;
1120 if (tmpStr == "j") 914
1121 hide = true; 915 if (tmpStr == "k")
1122 916 hide = true;
1123 if (tmpStr == "k") 917
1124 hide = true; 918 if (tmpStr == "l")
1125 919 hide = true;
1126 if (tmpStr == "l") 920
1127 hide = true; 921 if (tmpStr == "m")
1128 922 hide = true;
1129 if (tmpStr == "m") 923
1130 hide = true; 924 if (tmpStr == "n")
1131 925 hide = true;
1132 if (tmpStr == "n") 926
1133 hide = true; 927 if (tmpStr == "o")
1134 928 hide = true;
1135 if (tmpStr == "o") 929
1136 hide = true; 930 if (tmpStr == "p")
1137 931 hide = true;
1138 if (tmpStr == "p") 932
1139 hide = true; 933 if (tmpStr == "q")
1140 934 hide = true;
1141 if (tmpStr == "q") 935
1142 hide = true; 936 if (tmpStr == "r")
1143 937 hide = true;
1144 if (tmpStr == "r") 938
1145 hide = true; 939 if (tmpStr == "s")
1146 940 hide = true;
1147 if (tmpStr == "s") 941
1148 hide = true; 942 if (tmpStr == "t")
1149 943 hide = true;
1150 if (tmpStr == "t") 944
1151 hide = true; 945 if (tmpStr == "u")
1152 946 hide = true;
1153 if (tmpStr == "u") 947
1154 hide = true; 948 if (tmpStr == "v")
1155 949 hide = true;
1156 if (tmpStr == "v") 950
1157 hide = true; 951 if (tmpStr == "w")
1158 952 hide = true;
1159 if (tmpStr == "w") 953
1160 hide = true; 954 if (tmpStr == "x")
1161 955 hide = true;
1162 if (tmpStr == "x") 956
1163 hide = true; 957 if (tmpStr == "y")
1164 958 hide = true;
1165 if (tmpStr == "y") 959
1166 hide = true; 960 if (tmpStr == "z")
1167 961 hide = true;
1168 if (tmpStr == "z") 962 }
1169 hide = true; 963
1170 } 964 }
1171 965 if ( hide ) {
966 if ( currentRow() == row )
967 setCurrentCell( -1, 0 );
968 if ( rowHeight(row) > 0 )
969 hideRow( row );
970 } else {
971 if ( rowHeight(row) == 0 ) {
972 showRow( row );
973 adjustRow( row );
974 }
975 visible++;
976 }
1172 } 977 }
1173 if ( hide ) { 978 if ( !visible )
1174 if ( currentRow() == row )
1175 setCurrentCell( -1, 0 ); 979 setCurrentCell( -1, 0 );
1176 if ( rowHeight(row) > 0 ) 980
1177 hideRow( row ); 981 setPaintingEnabled( TRUE );
1178 } else {
1179 if ( rowHeight(row) == 0 ) {
1180 showRow( row );
1181 adjustRow( row );
1182 }
1183 visible++;
1184 }
1185 }
1186 if ( !visible )
1187 setCurrentCell( -1, 0 );
1188
1189 setPaintingEnabled( TRUE );
1190} 982}
1191 983
1192 984
1193void AbTable::setPaintingEnabled( bool e ) 985void AbTable::setPaintingEnabled( bool e )
1194{ 986{
1195 if ( e != enablePainting ) { 987 if ( e != enablePainting ) {
1196 if ( !enablePainting ) { 988 if ( !enablePainting ) {
1197 enablePainting = true; 989 enablePainting = true;
1198 rowHeightChanged( 0 ); 990 rowHeightChanged( 0 );
1199 viewport()->update(); 991 viewport()->update();
1200 } else { 992 } else {
1201 enablePainting = false; 993 enablePainting = false;
994 }
1202 } 995 }
1203 }
1204} 996}
1205 997
1206void AbTable::rowHeightChanged( int row ) 998void AbTable::rowHeightChanged( int row )
1207{ 999{
1208 if ( enablePainting ) 1000 if ( enablePainting )
1209 QTable::rowHeightChanged( row ); 1001 QTable::rowHeightChanged( row );
1210} 1002}
diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h
index d5ff279..84aef1e 100644
--- a/core/pim/addressbook/abtable.h
+++ b/core/pim/addressbook/abtable.h
@@ -22,13 +22,15 @@
22#define ABTABLE_H 22#define ABTABLE_H
23 23
24#include <qpe/categories.h> 24#include <qpe/categories.h>
25#include <qpe/contact.h> 25#include <opie/ocontact.h>
26 26
27#include <qmap.h> 27#include <qmap.h>
28#include <qtable.h> 28#include <qtable.h>
29#include <qstringlist.h> 29#include <qstringlist.h>
30#include <qcombobox.h> 30#include <qcombobox.h>
31 31
32#include <opie/ocontactaccess.h>
33
32class AbTableItem : public QTableItem 34class AbTableItem : public QTableItem
33{ 35{
34public: 36public:
@@ -64,9 +66,9 @@ public:
64 AbTable( const QValueList<int> *ordered, QWidget *parent, const char *name=0 ); 66 AbTable( const QValueList<int> *ordered, QWidget *parent, const char *name=0 );
65 ~AbTable(); 67 ~AbTable();
66 // NEW 68 // NEW
67 void addEntry( const Contact &newContact ); 69 void addEntry( const OContact &newContact );
68 Contact currentEntry(); 70 OContact currentEntry();
69 void replaceCurrentEntry( const Contact &newContact ); 71 void replaceCurrentEntry( const OContact &newContact );
70 72
71 void init(); 73 void init();
72 74
@@ -83,15 +85,18 @@ public:
83 QStringList choiceNames() const; 85 QStringList choiceNames() const;
84 void setChoiceSelection(int index, const QStringList& list); 86 void setChoiceSelection(int index, const QStringList& list);
85 QStringList choiceSelection(int index) const; 87 QStringList choiceSelection(int index) const;
86 void setShowCategory( const QString &c ); 88 void setShowCategory( const QString &b, const QString &c );
87 void setShowByLetter( char c ); 89 void setShowByLetter( char c );
88 QString showCategory() const; 90 QString showCategory() const;
89 QStringList categories(); 91 QStringList categories();
90 void resizeRows( int size ); 92
93 void resizeRows();
91 94
92 void show(); 95 void show();
93 void setPaintingEnabled( bool e ); 96 void setPaintingEnabled( bool e );
94 97
98 QString showBook() const;
99
95public slots: 100public slots:
96 void slotDoFind( const QString &str, bool caseSensitive, bool backwards, 101 void slotDoFind( const QString &str, bool caseSensitive, bool backwards,
97 int category ); 102 int category );
@@ -119,25 +124,30 @@ private:
119 void loadFile( const QString &strFile, bool journalFile ); 124 void loadFile( const QString &strFile, bool journalFile );
120 void fitColumns(); 125 void fitColumns();
121 void resort(); 126 void resort();
122 void updateJournal( const Contact &contact, Contact::journal_action action, 127 void updateJournal( const OContact &contact, OContact::journal_action action,
123 int row = -1 ); 128 int row = -1 );
124 void insertIntoTable( const Contact &contact, int row ); 129 void insertIntoTable( const OContact &contact, int row );
125 void internalAddEntries( QList<Contact> &list ); 130 QString findContactName( const OContact &entry );
126 QString findContactName( const Contact &entry ); 131 QString findContactContact( const OContact &entry, int row );
127 QString findContactContact( const Contact &entry ); 132 void journalFreeReplace( const OContact &cnt, int row );
128 void journalFreeReplace( const Contact &cnt, int row );
129 void journalFreeRemove( int row ); 133 void journalFreeRemove( int row );
130 void realignTable( int ); 134 void realignTable( int );
131 void updateVisible(); 135 void updateVisible();
132 int lastSortCol; 136 int lastSortCol;
133 bool asc; 137 bool asc;
134 char showChar; 138 char showChar;
135 QMap<AbTableItem*, Contact> contactList; 139 QMap<AbTableItem*, OContact> contactList;
136 const QValueList<int> *intFields; 140 const QValueList<int> *intFields;
137 int currFindRow; 141 int currFindRow;
138 QString showCat; 142 QString showCat;
139 QStringList choicenames; 143 QStringList choicenames;
140 bool enablePainting; 144 bool enablePainting;
141 Categories mCat; 145 Categories mCat;
146
147 QString showBk;
148 bool columnVisible;
149
150 OContactAccess m_contactdb;
151
142}; 152};
143#endif // ABTABLE_H 153#endif // ABTABLE_H
diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp
index 3255269..cf2eddf 100644
--- a/core/pim/addressbook/addressbook.cpp
+++ b/core/pim/addressbook/addressbook.cpp
@@ -13,7 +13,7 @@
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** OContact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
@@ -69,238 +69,245 @@
69#include "picker.h" 69#include "picker.h"
70static QString addressbookOldXMLFilename() 70static QString addressbookOldXMLFilename()
71{ 71{
72 QString filename = QPEApplication::documentDir() + "addressbook.xml"; 72 QString filename = QPEApplication::documentDir() + "addressbook.xml";
73 return filename; 73 return filename;
74} 74}
75 75
76static QString addressbookXMLFilename() 76static QString addressbookXMLFilename()
77{ 77{
78 QString filename = Global::applicationFileName("addressbook", 78 QString filename = Global::applicationFileName("addressbook",
79 "addressbook.xml"); 79 "addressbook.xml");
80 return filename; 80 return filename;
81} 81}
82 82
83static QString addressbookPersonalVCardName() 83static QString addressbookPersonalVCardName()
84{ 84{
85 QString filename = Global::applicationFileName("addressbook", 85 QString filename = Global::applicationFileName("addressbook",
86 "businesscard.vcf"); 86 "businesscard.vcf");
87 return filename; 87 return filename;
88} 88}
89 89
90 90
91AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, 91AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name,
92 WFlags f ) 92 WFlags f )
93 : QMainWindow( parent, name, f ), 93 : QMainWindow( parent, name, f ),
94 abEditor(0), 94 abEditor(0),
95 bAbEditFirstTime(TRUE), 95 bAbEditFirstTime(TRUE),
96 syncing(FALSE) 96 syncing(FALSE)
97{ 97{
98 initFields(); 98 isLoading = true;
99 99
100 setCaption( tr("Contacts") ); 100 initFields();
101 setIcon( Resource::loadPixmap( "AddressBook" ) ); 101
102 102 setCaption( tr("Contacts") );
103 setToolBarsMovable( FALSE ); 103 setIcon( Resource::loadPixmap( "AddressBook" ) );
104 104
105 // Create Toolbars 105 setToolBarsMovable( FALSE );
106 106
107 QPEToolBar *bar = new QPEToolBar( this ); 107 // Create Toolbars
108 bar->setHorizontalStretchable( TRUE ); 108
109 109 QPEToolBar *bar = new QPEToolBar( this );
110 QPEMenuBar *mbList = new QPEMenuBar( bar ); 110 bar->setHorizontalStretchable( TRUE );
111 mbList->setMargin( 0 ); 111
112 112 QPEMenuBar *mbList = new QPEMenuBar( bar );
113 QPopupMenu *edit = new QPopupMenu( this ); 113 mbList->setMargin( 0 );
114 mbList->insertItem( tr( "Contact" ), edit ); 114
115 115 QPopupMenu *edit = new QPopupMenu( this );
116 listTools = new QPEToolBar( this, "list operations" ); 116 mbList->insertItem( tr( "Contact" ), edit );
117 117
118 118 listTools = new QPEToolBar( this, "list operations" );
119 QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 119
120 0, this, 0 ); 120
121 actionNew = a; 121 QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null,
122 connect( a, SIGNAL( activated() ), this, SLOT( slotListNew() ) ); 122 0, this, 0 );
123 a->addTo( edit ); 123 actionNew = a;
124 a->addTo( listTools ); 124 connect( a, SIGNAL( activated() ), this, SLOT( slotListNew() ) );
125 125 a->addTo( edit );
126 a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ), QString::null, 126 a->addTo( listTools );
127 0, this, 0 ); 127
128 actionEdit = a; 128 a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ), QString::null,
129 connect( a, SIGNAL( activated() ), this, SLOT( slotViewEdit() ) ); 129 0, this, 0 );
130 a->addTo( edit ); 130 actionEdit = a;
131 a->addTo( listTools ); 131 connect( a, SIGNAL( activated() ), this, SLOT( slotViewEdit() ) );
132 132 a->addTo( edit );
133 a = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 133 a->addTo( listTools );
134 0, this, 0 ); 134
135 actionTrash = a; 135 a = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null,
136 connect( a, SIGNAL( activated() ), this, SLOT( slotListDelete() ) ); 136 0, this, 0 );
137 a->addTo( edit ); 137 actionTrash = a;
138 a->addTo( listTools ); 138 connect( a, SIGNAL( activated() ), this, SLOT( slotListDelete() ) );
139 139 a->addTo( edit );
140 140 a->addTo( listTools );
141 // make it possible to go directly to businesscard via qcop call 141
142
143 // make it possible to go directly to businesscard via qcop call
142#if defined(Q_WS_QWS) 144#if defined(Q_WS_QWS)
143#if !defined(QT_NO_COP) 145#if !defined(QT_NO_COP)
144 QCopChannel *addressChannel = new QCopChannel("QPE/Addressbook" , this ); 146 QCopChannel *addressChannel = new QCopChannel("QPE/Addressbook" , this );
145 connect (addressChannel, SIGNAL( received(const QCString &, const QByteArray &)), 147 connect (addressChannel, SIGNAL( received(const QCString &, const QByteArray &)),
146 this, SLOT ( appMessage(const QCString &, const QByteArray &) ) ); 148 this, SLOT ( appMessage(const QCString &, const QByteArray &) ) );
147#endif 149#endif
148#endif 150#endif
149 151
150 152
151 153
152 154
153 155
154#ifndef MAKE_FOR_SHARP_ROM 156#ifndef MAKE_FOR_SHARP_ROM
155 a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), 157 a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ),
156 QString::null, 0, this, 0 ); 158 QString::null, 0, this, 0 );
157 actionFind = a; 159 actionFind = a;
158 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); 160 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) );
159 a->addTo( edit ); 161 a->addTo( edit );
160 a->addTo( listTools ); 162 a->addTo( listTools );
161#endif 163#endif
162 164
163 165
164 a = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "qtmail/reply" ), 166 a = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "qtmail/reply" ),
165 QString::null, 0, this, 0 ); 167 QString::null, 0, this, 0 );
166 //a->setEnabled( FALSE ); we got support for it now :) zecke 168 //a->setEnabled( FALSE ); we got support for it now :) zecke
167 actionMail = a; 169 actionMail = a;
168 connect( a, SIGNAL( activated() ), this, SLOT( writeMail() ) ); 170 connect( a, SIGNAL( activated() ), this, SLOT( writeMail() ) );
169 a->addTo( edit ); 171 a->addTo( edit );
170 a->addTo( listTools ); 172 a->addTo( listTools );
171 173
172 174
173 175
174 if ( Ir::supported() ) { 176 if ( Ir::supported() ) {
175 a = new QAction( tr ("Beam Entry" ), Resource::loadPixmap( "beam" ), QString::null, 177 a = new QAction( tr ("Beam Entry" ), Resource::loadPixmap( "beam" ), QString::null,
176 0, this, 0 ); 178 0, this, 0 );
177 actionBeam = a; 179 actionBeam = a;
178 connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); 180 connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) );
179 a->addTo( edit ); 181 a->addTo( edit );
180 a->addTo( listTools ); 182 a->addTo( listTools );
181 } 183 }
182 184
183 edit->insertSeparator(); 185 edit->insertSeparator();
184 186
185 a = new QAction( tr("Import vCard"), QString::null, 0, 0, 0, TRUE ); 187 a = new QAction( tr("Import vCard"), QString::null, 0, 0, 0, TRUE );
186 actionPersonal = a; 188 actionPersonal = a;
187 connect( a, SIGNAL( activated() ), this, SLOT( importvCard() ) ); 189 connect( a, SIGNAL( activated() ), this, SLOT( importvCard() ) );
188 a->addTo( edit ); 190 a->addTo( edit );
189 191
190 192 edit->insertSeparator();
191 edit->insertSeparator(); 193
192 194 a = new QAction( tr("My Personal Details"), QString::null, 0, 0, 0, TRUE );
193 a = new QAction( tr("My Personal Details"), QString::null, 0, 0, 0, TRUE ); 195 actionPersonal = a;
194 actionPersonal = a; 196 connect( a, SIGNAL( activated() ), this, SLOT( slotPersonalView() ) );
195 connect( a, SIGNAL( activated() ), this, SLOT( slotPersonalView() ) ); 197 a->addTo( edit );
196 a->addTo( edit ); 198
197 199
198 200 a = new QAction( tr( "Arrange Edit Fields"), QString::null, 0, 0 );
199 a = new QAction( tr( "Arrange Edit Fields"), QString::null, 0, 0 ); 201 connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) );
200 connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); 202 a->addTo( edit );
201 a->addTo( edit ); 203
202 204 // Create Views
203 // Create Views 205
204 206 // This is safe to call without checking to see if it exists...
205 // This is safe to call without checking to see if it exists... 207 // not to mention it also does the necessary stuff for the
206 // not to mention it also does the necessary stuff for the 208 // journaling...
207 // journaling... 209 QString str = addressbookXMLFilename();
208 QString str = addressbookXMLFilename(); 210 if ( str.isNull() ) {
209 if ( str.isNull() ) { 211 QMessageBox::warning(
210 QMessageBox::warning( this, tr("Out of Space"), 212 this,
211 tr("There is not enough space to create\n" 213 tr("Out of Space"),
212 "neccessary startup files.\n" 214 tr("There is not enough space to create\n"
213 "\nFree up some space before\nentering data!") 215 "neccessary startup files.\n"
214 ); 216 "\nFree up some space before\nentering data!")
215 } 217 );
216 218 }
217 listContainer = new QWidget( this ); 219
218 220 listContainer = new QWidget( this );
219 QVBoxLayout *vb = new QVBoxLayout( listContainer ); 221
220 222 QVBoxLayout *vb = new QVBoxLayout( listContainer );
221 abList = new AbTable( &orderedFields, listContainer, "table" ); 223
222 vb->addWidget(abList); 224 abList = new AbTable( &orderedFields, listContainer, "table" );
223 abList->setHScrollBarMode( QScrollView::AlwaysOff ); 225 vb->addWidget(abList);
224 connect( abList, SIGNAL( empty( bool ) ), 226 // abList->setHScrollBarMode( QScrollView::AlwaysOff );
225 this, SLOT( listIsEmpty( bool ) ) ); 227 connect( abList, SIGNAL( empty( bool ) ), this, SLOT( listIsEmpty( bool ) ) );
226 connect( abList, SIGNAL( details() ), 228 connect( abList, SIGNAL( details() ), this, SLOT( slotListView() ) );
227 this, SLOT( slotListView() ) ); 229 connect( abList, SIGNAL(currentChanged(int,int)), this, SLOT(slotUpdateToolbar()) );
228 connect( abList, SIGNAL(currentChanged(int,int)), 230
229 this, SLOT(slotUpdateToolbar()) ); 231 mView = 0;
230 232
231 mView = 0; 233 abList->load( addressbookXMLFilename() );
232 234 if ( QFile::exists(addressbookOldXMLFilename()) ) {
233 abList->load( addressbookXMLFilename() ); 235 abList->load( addressbookOldXMLFilename() );
234 if ( QFile::exists(addressbookOldXMLFilename()) ) { 236 QFile::remove(addressbookOldXMLFilename());
235 abList->load( addressbookOldXMLFilename() ); 237 }
236 QFile::remove(addressbookOldXMLFilename()); 238
237 } 239 pLabel = new LetterPicker( listContainer );
238 240 connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char)));
239 pLabel = new LetterPicker( listContainer ); 241 vb->addWidget(pLabel);
240 connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); 242 catMenu = new QPopupMenu( this );
241 vb->addWidget(pLabel); 243 catMenu->setCheckable( TRUE );
242 catMenu = new QPopupMenu( this ); 244 connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) );
243 catMenu->setCheckable( TRUE ); 245 populateCategories();
244 connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) ); 246
245 populateCategories(); 247 mbList->insertItem( tr("View"), catMenu );
246 248 // setCentralWidget( listContainer );
247 mbList->insertItem( tr("View"), catMenu ); 249
248 setCentralWidget( listContainer ); 250 fontMenu = new QPopupMenu(this);
249 251 fontMenu->setCheckable( true );
250 fontMenu = new QPopupMenu(this); 252 connect( fontMenu, SIGNAL(activated(int)), this, SLOT(slotSetFont(int)));
251 fontMenu->setCheckable( true ); 253
252 connect( fontMenu, SIGNAL(activated(int)), this, SLOT(slotSetFont(int))); 254 fontMenu->insertItem(tr( "Small" ), 0);
253 255 fontMenu->insertItem(tr( "Normal" ), 1);
254 fontMenu->insertItem(tr( "Small" ), 0); 256 fontMenu->insertItem(tr( "Large" ), 2);
255 fontMenu->insertItem(tr( "Normal" ), 1); 257
256 fontMenu->insertItem(tr( "Large" ), 2); 258 defaultFont = new QFont( abList->font() );
257 259
258 defaultFont = new QFont( abList->font() ); 260 slotSetFont(startFontSize);
259 261
260 slotSetFont(startFontSize); 262 mbList->insertItem( tr("Font"), fontMenu);
261 263 setCentralWidget(listContainer);
262 mbList->insertItem( tr("Font"), fontMenu); 264
263 setCentralWidget(listContainer); 265 // qDebug("adressbook contrsuction: t=%d", t.elapsed() );
264 266
265 // qDebug("adressbook contrsuction: t=%d", t.elapsed() ); 267 abList->setCurrentCell( 0, 0 );
268
269 isLoading = false;
266} 270}
267 271
268 272
269void AddressbookWindow::slotSetFont( int size ) { 273void AddressbookWindow::slotSetFont( int size ) {
270 274
271 if (size > 2 || size < 0) 275 if (size > 2 || size < 0)
272 size = 1; 276 size = 1;
273 277
274 startFontSize = size; 278 startFontSize = size;
275 279
276 QFont *currentFont; 280 QFont *currentFont;
277 281
278 switch (size) { 282 switch (size) {
279 case 0: 283 case 0:
280 fontMenu->setItemChecked(0, true); 284 fontMenu->setItemChecked(0, true);
281 fontMenu->setItemChecked(1, false); 285 fontMenu->setItemChecked(1, false);
282 fontMenu->setItemChecked(2, false); 286 fontMenu->setItemChecked(2, false);
283 abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) ); 287 abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) );
284 currentFont = new QFont (abList->font()); 288 currentFont = new QFont (abList->font());
285 abList->resizeRows(currentFont->pixelSize() + 7); 289 // abList->resizeRows(currentFont->pixelSize() + 7);
286 break; 290 abList->resizeRows();
287 case 1: 291 break;
288 fontMenu->setItemChecked(0, false); 292 case 1:
289 fontMenu->setItemChecked(1, true); 293 fontMenu->setItemChecked(0, false);
290 fontMenu->setItemChecked(2, false); 294 fontMenu->setItemChecked(1, true);
291 abList->setFont( *defaultFont ); 295 fontMenu->setItemChecked(2, false);
292 currentFont = new QFont (abList->font()); 296 abList->setFont( *defaultFont );
293 abList->resizeRows(currentFont->pixelSize() + 7); 297 currentFont = new QFont (abList->font());
294 break; 298 // abList->resizeRows(currentFont->pixelSize() + 7);
295 case 2: 299 abList->resizeRows();
296 fontMenu->setItemChecked(0, false); 300 break;
297 fontMenu->setItemChecked(1, false); 301 case 2:
298 fontMenu->setItemChecked(2, true); 302 fontMenu->setItemChecked(0, false);
299 abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) ); 303 fontMenu->setItemChecked(1, false);
300 currentFont = new QFont (abList->font()); 304 fontMenu->setItemChecked(2, true);
301 abList->resizeRows(currentFont->pixelSize() + 7); 305 abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) );
302 break; 306 currentFont = new QFont (abList->font());
303 } 307 //abList->resizeRows(currentFont->pixelSize() + 7);
308 abList->resizeRows();
309 break;
310 }
304} 311}
305 312
306 313
@@ -308,652 +315,716 @@ void AddressbookWindow::slotSetFont( int size ) {
308void AddressbookWindow::importvCard() { 315void AddressbookWindow::importvCard() {
309 QString str = OFileDialog::getOpenFileName( 1,"/");//,"", "*", this ); 316 QString str = OFileDialog::getOpenFileName( 1,"/");//,"", "*", this );
310 if(!str.isEmpty() ) 317 if(!str.isEmpty() )
311 setDocument((const QString&) str ); 318 setDocument((const QString&) str );
312 319
313} 320}
314 321
315void AddressbookWindow::setDocument( const QString &filename ) 322void AddressbookWindow::setDocument( const QString &filename )
316{ 323{
317 if ( filename.find(".vcf") != int(filename.length()) - 4 ) return; 324 if ( filename.find(".vcf") != int(filename.length()) - 4 )
318 325 return;
319 QValueList<Contact> cl = Contact::readVCard( filename ); 326
320 for( QValueList<Contact>::Iterator it = cl.begin(); it != cl.end(); ++it ) { 327 QValueList<OContact> cl = OContact::readVCard( filename );
321// QString msg = tr("You received a vCard for\n%1.\nDo You want to add it to your\naddressbook?") 328 for( QValueList<OContact>::Iterator it = cl.begin(); it != cl.end(); ++it ) {
322// .arg( (*it).fullName() ); 329 // QString msg = tr("You received a vCard for\n%1.\nDo You want to add it to your\naddressbook?")
323// if ( QMessageBox::information( this, tr("received contact"), msg, QMessageBox::Ok, QMessageBox::Cancel ) == 330 // .arg( (*it).fullName() );
324// QMessageBox::Ok ) { 331 // if ( QMessageBox::information( this, tr("received contact"), msg, QMessageBox::Ok, QMessageBox::Cancel ) ==
325 abList->addEntry( *it ); 332 // QMessageBox::Ok ) {
326// } 333 abList->addEntry( *it );
327 } 334 // }
328 335 }
336
329} 337}
330 338
331void AddressbookWindow::resizeEvent( QResizeEvent *e ) 339void AddressbookWindow::resizeEvent( QResizeEvent *e )
332{ 340{
333 QMainWindow::resizeEvent( e ); 341 QMainWindow::resizeEvent( e );
334 342
335 if ( centralWidget() == listContainer ) 343 if ( centralWidget() == listContainer )
336 showList(); 344 showList();
337 else if ( centralWidget() == mView ) 345 else if ( centralWidget() == mView )
338 showView(); 346 showView();
339} 347}
340 348
341AddressbookWindow::~AddressbookWindow() 349AddressbookWindow::~AddressbookWindow()
342{ 350{
343 Config cfg("AddressBook"); 351 Config cfg("AddressBook");
344 cfg.setGroup("Font"); 352 cfg.setGroup("Font");
345 cfg.writeEntry("fontSize", startFontSize); 353 cfg.writeEntry("fontSize", startFontSize);
346} 354}
347 355
348void AddressbookWindow::slotUpdateToolbar() 356void AddressbookWindow::slotUpdateToolbar()
349{ 357{
350 Contact ce = abList->currentEntry(); 358 OContact ce = abList->currentEntry();
351 actionMail->setEnabled( !ce.defaultEmail().isEmpty() ); 359 actionMail->setEnabled( !ce.defaultEmail().isEmpty() );
352} 360}
353 361
354void AddressbookWindow::showList() 362void AddressbookWindow::showList()
355{ 363{
356 if ( mView ) mView->hide(); 364 bool visiblemView;
357 setCentralWidget( listContainer ); 365
358 listContainer->show(); 366 visiblemView = false;
359 // update our focues... (or use a stack widget!); 367 if ( mView ) {
360 abList->setFocus(); 368 mView->hide();
369 visiblemView = true;
370 }
371 setCentralWidget( listContainer );
372 listContainer->show();
373 // update our focues... (or use a stack widget!);
374 abList->setFocus();
375
376 // This makes sure we are scrolled all the way to the left
377 abList->setContentsPos( 0, abList->contentsY() );
378
379 //if ( visiblemView && abList->showBook() == "Cards" )
380 //abList->setShowCategory( abList->showBook(), abList->showCategory() );
381
361} 382}
362 383
363void AddressbookWindow::showView() 384void AddressbookWindow::showView()
364{ 385{
365 if ( abList->numRows() > 0 ) { 386 if ( abList->numRows() > 0 ) {
366 listContainer->hide(); 387 listContainer->hide();
367 setCentralWidget( abView() ); 388 setCentralWidget( abView() );
368 mView->show(); 389 mView->show();
369 mView->setFocus(); 390 mView->setFocus();
370 } 391 }
371} 392}
372 393
373void AddressbookWindow::slotListNew() 394void AddressbookWindow::slotListNew()
374{ 395{
375 Contact cnt; 396 OContact cnt;
376 if( !syncing ) { 397 if( !syncing ) {
377 if ( abEditor ) 398 if ( abEditor )
378 abEditor->setEntry( cnt ); 399 abEditor->setEntry( cnt );
379 abView()->init( cnt ); 400 abView()->init( cnt );
380 editEntry( NewEntry ); 401 editEntry( NewEntry );
381 } else { 402 } else {
382 QMessageBox::warning(this, tr("Contacts"), 403 QMessageBox::warning(this, tr("OContacts"),
383 tr("Can not edit data, currently syncing")); 404 tr("Can not edit data, currently syncing"));
384 } 405 }
385} 406}
386 407
387void AddressbookWindow::slotListView() 408void AddressbookWindow::slotListView()
388{ 409{
389 abView()->init( abList->currentEntry() ); 410 abView()->init( abList->currentEntry() );
390 mView->sync(); 411 mView->sync();
391 showView(); 412 showView();
392} 413}
393 414
394void AddressbookWindow::slotListDelete() 415void AddressbookWindow::slotListDelete()
395{ 416{
396 if(!syncing) { 417 if(!syncing) {
397 Contact tmpEntry = abList->currentEntry(); 418 OContact tmpEntry = abList->currentEntry();
398 419
399 // get a name, do the best we can... 420 // get a name, do the best we can...
400 QString strName = tmpEntry.fullName(); 421 QString strName = tmpEntry.fullName();
401 if ( strName.isEmpty() ) { 422 if ( strName.isEmpty() ) {
402 strName = tmpEntry.company(); 423 strName = tmpEntry.company();
403 if ( strName.isEmpty() ) 424 if ( strName.isEmpty() )
404 strName = "No Name"; 425 strName = "No Name";
405 } 426 }
406 427
407 428
408 if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ), 429 if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ),
409 strName ) ) { 430 strName ) ) {
410 abList->deleteCurrentEntry(); 431 abList->deleteCurrentEntry();
411 showList(); 432 showList();
412 } 433 }
413 } else { 434 } else {
414 QMessageBox::warning( this, tr("Contacts"), 435 QMessageBox::warning( this, tr("Contacts"),
415 tr("Can not edit data, currently syncing") ); 436 tr("Can not edit data, currently syncing") );
416 } 437 }
417} 438}
418 439
419void AddressbookWindow::slotViewBack() 440void AddressbookWindow::slotViewBack()
420{ 441{
421 showList(); 442 showList();
422} 443}
423 444
424void AddressbookWindow::slotViewEdit() 445void AddressbookWindow::slotViewEdit()
425{ 446{
426 if(!syncing) { 447 if(!syncing) {
427 if (actionPersonal->isOn()) { 448 if (actionPersonal->isOn()) {
428 editPersonal(); 449 editPersonal();
429 } else { 450 } else {
430 if ( !bAbEditFirstTime ) 451 if ( !bAbEditFirstTime )
431 abEditor->setEntry( abList->currentEntry() ); 452 abEditor->setEntry( abList->currentEntry() );
432 editEntry( EditEntry ); 453 editEntry( EditEntry );
433 } 454 }
434 } else { 455 } else {
435 QMessageBox::warning( this, tr("Contacts"), 456 QMessageBox::warning( this, tr("Contacts"),
436 tr("Can not edit data, currently syncing") ); 457 tr("Can not edit data, currently syncing") );
437 } 458 }
438} 459}
439 460
440 461
441 462
442void AddressbookWindow::writeMail() 463void AddressbookWindow::writeMail()
443{ 464{
444 Contact c = abList->currentEntry(); 465 OContact c = abList->currentEntry();
445 QString name = c.fileAs(); 466 QString name = c.fileAs();
446 QString email = c.defaultEmail(); 467 QString email = c.defaultEmail();
447 QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)"); 468 QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)");
448 e << name << email; 469 e << name << email;
449} 470}
450 471
451
452
453
454static const char * beamfile = "/tmp/obex/contact.vcf"; 472static const char * beamfile = "/tmp/obex/contact.vcf";
455 473
456void AddressbookWindow::slotBeam() 474void AddressbookWindow::slotBeam()
457{ 475{
458 QString filename; 476 QString filename;
459 Contact c; 477 OContact c;
460 if ( actionPersonal->isOn() ) { 478 if ( actionPersonal->isOn() ) {
461 filename = addressbookPersonalVCardName(); 479 filename = addressbookPersonalVCardName();
462 if (!QFile::exists(filename)) 480 if (!QFile::exists(filename))
463 return; // can't beam a non-existent file 481 return; // can't beam a non-existent file
464 c = Contact::readVCard( filename )[0]; 482 c = OContact::readVCard( filename )[0];
465 } else { 483 } else {
466 unlink( beamfile ); // delete if exists 484 unlink( beamfile ); // delete if exists
467 c = abList->currentEntry(); 485 c = abList->currentEntry();
468 mkdir("/tmp/obex/", 0755); 486 mkdir("/tmp/obex/", 0755);
469 Contact::writeVCard( beamfile, c ); 487 OContact::writeVCard( beamfile, c );
470 filename = beamfile; 488 filename = beamfile;
471 } 489 }
472 Ir *ir = new Ir( this ); 490 Ir *ir = new Ir( this );
473 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 491 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
474 QString description = c.fullName(); 492 QString description = c.fullName();
475 ir->send( filename, description, "text/x-vCard" ); 493 ir->send( filename, description, "text/x-vCard" );
476} 494}
477 495
478void AddressbookWindow::beamDone( Ir *ir ) 496void AddressbookWindow::beamDone( Ir *ir )
479{ 497{
480 delete ir; 498 delete ir;
481 unlink( beamfile ); 499 unlink( beamfile );
482} 500}
483 501
484 502
485static void parseName( const QString& name, QString *first, QString *middle, 503static void parseName( const QString& name, QString *first, QString *middle,
486 QString * last ) 504 QString * last )
487{ 505{
488 506
489 int comma = name.find ( "," ); 507 int comma = name.find ( "," );
490 QString rest; 508 QString rest;
491 if ( comma > 0 ) { 509 if ( comma > 0 ) {
492 *last = name.left( comma ); 510 *last = name.left( comma );
493 comma++; 511 comma++;
494 while ( comma < int(name.length()) && name[comma] == ' ' ) 512 while ( comma < int(name.length()) && name[comma] == ' ' )
495 comma++; 513 comma++;
496 rest = name.mid( comma ); 514 rest = name.mid( comma );
497 } else { 515 } else {
498 int space = name.findRev( ' ' ); 516 int space = name.findRev( ' ' );
499 *last = name.mid( space+1 ); 517 *last = name.mid( space+1 );
500 rest = name.left( space ); 518 rest = name.left( space );
501 } 519 }
502 int space = rest.find( ' ' ); 520 int space = rest.find( ' ' );
503 if ( space <= 0 ) { 521 if ( space <= 0 ) {
504 *first = rest; 522 *first = rest;
505 } else { 523 } else {
506 *first = rest.left( space ); 524 *first = rest.left( space );
507 *middle = rest.mid( space+1 ); 525 *middle = rest.mid( space+1 );
508 } 526 }
509 527
510} 528}
511 529
512 530
513void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data) 531void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data)
514{ 532{
515 if (msg == "editPersonal()") { 533 if (msg == "editPersonal()") {
516 editPersonal(); 534 editPersonal();
517 } else if (msg == "editPersonalAndClose()") { 535 } else if (msg == "editPersonalAndClose()") {
518 editPersonal(); 536 editPersonal();
519 close(); 537 close();
520 } else if ( msg == "addContact(QString,QString)" ) { 538 } else if ( msg == "addContact(QString,QString)" ) {
521 QDataStream stream(data,IO_ReadOnly); 539 QDataStream stream(data,IO_ReadOnly);
522 QString name, email; 540 QString name, email;
523 stream >> name >> email; 541 stream >> name >> email;
524 542
525 Contact cnt; 543 OContact cnt;
526 QString fn, mn, ln; 544 QString fn, mn, ln;
527 parseName( name, &fn, &mn, &ln ); 545 parseName( name, &fn, &mn, &ln );
528 // qDebug( " %s - %s - %s", fn.latin1(), mn.latin1(), ln.latin1() ); 546 // qDebug( " %s - %s - %s", fn.latin1(), mn.latin1(), ln.latin1() );
529 cnt.setFirstName( fn ); 547 cnt.setFirstName( fn );
530 cnt.setMiddleName( mn ); 548 cnt.setMiddleName( mn );
531 cnt.setLastName( ln ); 549 cnt.setLastName( ln );
532 cnt.insertEmails( email ); 550 cnt.insertEmails( email );
533 cnt.setDefaultEmail( email ); 551 cnt.setDefaultEmail( email );
534 cnt.setFileAs(); 552 cnt.setFileAs();
535 553
536 if ( bAbEditFirstTime ) { 554 if ( bAbEditFirstTime ) {
537 abEditor = new ContactEditor( cnt, &orderedFields, &slOrderedFields, 555 abEditor = new ContactEditor( cnt, &orderedFields, &slOrderedFields,
538 this, "editor" ); 556 this, "editor" );
539 bAbEditFirstTime = FALSE; 557 bAbEditFirstTime = FALSE;
540 } else { 558 } else {
541 abEditor->setEntry( cnt ); 559 abEditor->setEntry( cnt );
542 } 560 }
543 abView()->init( cnt ); 561 abView()->init( cnt );
544 editEntry( NewEntry ); 562 editEntry( NewEntry );
545 563
546 564
547 565
548 } 566 }
549#if 0 567#if 0
550 else if (msg == "pickAddresses(QCString,QCString,QStringList,...)" ) { 568 else if (msg == "pickAddresses(QCString,QCString,QStringList,...)" ) {
551 QDataStream stream(data,IO_ReadOnly); 569 QDataStream stream(data,IO_ReadOnly);
552 QCString ch,m; 570 QCString ch,m;
553 QStringList types; 571 QStringList types;
554 stream >> ch >> m >> types; 572 stream >> ch >> m >> types;
555 AddressPicker picker(abList,this,0,TRUE); 573 AddressPicker picker(abList,this,0,TRUE);
556 picker.showMaximized(); 574 picker.showMaximized();
557 picker.setChoiceNames(types); 575 picker.setChoiceNames(types);
558 int i=0; 576 int i=0;
559 for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) { 577 for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) {
560 QStringList sel; 578 QStringList sel;
561 stream >> sel; 579 stream >> sel;
562 picker.setSelection(i++,sel); 580 picker.setSelection(i++,sel);
563 } 581 }
564 picker.showMaximized(); 582 picker.showMaximized();
565 picker.exec(); 583 picker.exec();
566 584
567 // ###### note: contacts may have been added - save here! 585 // ###### note: contacts may have been added - save here!
568 586
569 setCentralWidget(abList); 587 setCentralWidget(abList);
570 QCopEnvelope e(ch,m); 588 QCopEnvelope e(ch,m);
571 i=0; 589 i=0;
572 for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) { 590 for (QStringList::ConstIterator it = types.begin(); it!=types.end(); ++it) {
573 QStringList sel = picker.selection(i++); 591 QStringList sel = picker.selection(i++);
574 e << sel; 592 e << sel;
575 } 593 }
576 } 594 }
577#endif 595#endif
578 596
579} 597}
580 598
581void AddressbookWindow::editPersonal() 599void AddressbookWindow::editPersonal()
582{ 600{
583 QString filename = addressbookPersonalVCardName(); 601 QString filename = addressbookPersonalVCardName();
584 Contact me; 602 OContact me;
585 if (QFile::exists(filename)) 603 if (QFile::exists(filename))
586 me = Contact::readVCard( filename )[0]; 604 me = OContact::readVCard( filename )[0];
587 if (bAbEditFirstTime) { 605 if (bAbEditFirstTime) {
588 abEditor = new ContactEditor( me, &orderedFields, &slOrderedFields, 606 abEditor = new ContactEditor( me, &orderedFields, &slOrderedFields,
589 this, "editor" ); 607 this, "editor" );
590 // don't create a new editor every time 608 // don't create a new editor every time
591 bAbEditFirstTime = FALSE; 609 bAbEditFirstTime = FALSE;
592 } else 610 } else
593 abEditor->setEntry( me ); 611 abEditor->setEntry( me );
594 612
595 abEditor->setCaption(tr("Edit My Personal Details")); 613 abEditor->setCaption(tr("Edit My Personal Details"));
596 abEditor->showMaximized(); 614 abEditor->showMaximized();
597 615
598 // fix the foxus... 616 // fix the foxus...
599 abEditor->setNameFocus(); 617 abEditor->setNameFocus();
600 if ( abEditor->exec() ) { 618 if ( abEditor->exec() ) {
601 setFocus(); 619 setFocus();
602 Contact new_personal = abEditor->entry(); 620 OContact new_personal = abEditor->entry();
603 QString fname = addressbookPersonalVCardName(); 621 QString fname = addressbookPersonalVCardName();
604 Contact::writeVCard( fname, new_personal ); 622 OContact::writeVCard( fname, new_personal );
605 abView()->init(new_personal); 623 abView()->init(new_personal);
606 abView()->sync(); 624 abView()->sync();
607 } 625 }
608 abEditor->setCaption( tr("Edit Address") ); 626 abEditor->setCaption( tr("Edit Address") );
609} 627}
610 628
611void AddressbookWindow::slotPersonalView() 629void AddressbookWindow::slotPersonalView()
612{ 630{
613 if (!actionPersonal->isOn()) { 631 if (!actionPersonal->isOn()) {
614 // we just turned it off 632 // we just turned it off
615 setCaption( tr("Contacts") ); 633 setCaption( tr("Contacts") );
616 actionNew->setEnabled(TRUE); 634 actionNew->setEnabled(TRUE);
617 actionTrash->setEnabled(TRUE); 635 actionTrash->setEnabled(TRUE);
618#ifndef MAKE_FOR_SHARP_ROM 636#ifndef MAKE_FOR_SHARP_ROM
619 actionFind->setEnabled(TRUE); 637 actionFind->setEnabled(TRUE);
620#endif 638#endif
621 slotUpdateToolbar(); // maybe some of the above could be moved there 639 slotUpdateToolbar(); // maybe some of the above could be moved there
622 showList(); 640 showList();
623 return; 641 return;
624 } 642 }
625 643
626 // XXX need to disable some QActions. 644 // XXX need to disable some QActions.
627 actionNew->setEnabled(FALSE); 645 actionNew->setEnabled(FALSE);
628 actionTrash->setEnabled(FALSE); 646 actionTrash->setEnabled(FALSE);
629#ifndef MAKE_FOR_SHARP_ROM 647#ifndef MAKE_FOR_SHARP_ROM
630 actionFind->setEnabled(FALSE); 648 actionFind->setEnabled(FALSE);
631#endif 649#endif
632 actionMail->setEnabled(FALSE); 650 actionMail->setEnabled(FALSE);
633 651
634 setCaption( tr("Contacts - My Personal Details") ); 652 setCaption( tr("Contacts - My Personal Details") );
635 QString filename = addressbookPersonalVCardName(); 653 QString filename = addressbookPersonalVCardName();
636 Contact me; 654 OContact me;
637 if (QFile::exists(filename)) 655 if (QFile::exists(filename))
638 me = Contact::readVCard( filename )[0]; 656 me = OContact::readVCard( filename )[0];
639 657
640 abView()->init( me ); 658 abView()->init( me );
641 abView()->sync(); 659 abView()->sync();
642 listContainer->hide(); 660 listContainer->hide();
643 setCentralWidget( abView() ); 661 setCentralWidget( abView() );
644 mView->show(); 662 mView->show();
645 mView->setFocus(); 663 mView->setFocus();
646} 664}
647 665
648void AddressbookWindow::editEntry( EntryMode entryMode ) 666void AddressbookWindow::editEntry( EntryMode entryMode )
649{ 667{
650 Contact entry; 668 OContact entry;
651 if ( bAbEditFirstTime ) { 669 if ( bAbEditFirstTime ) {
652 abEditor = new ContactEditor( entry, &orderedFields, &slOrderedFields, 670 abEditor = new ContactEditor( entry, &orderedFields, &slOrderedFields,
653 this, "editor" ); 671 this, "editor" );
654 bAbEditFirstTime = FALSE; 672 bAbEditFirstTime = FALSE;
655 if ( entryMode == EditEntry ) 673 if ( entryMode == EditEntry )
656 abEditor->setEntry( abList->currentEntry() ); 674 abEditor->setEntry( abList->currentEntry() );
657 } 675 }
658 // other things may chane the caption. 676 // other things may chane the caption.
659 abEditor->setCaption( tr("Edit Address") ); 677 abEditor->setCaption( tr("Edit Address") );
660 678
661#if defined(Q_WS_QWS) || defined(_WS_QWS_) 679#if defined(Q_WS_QWS) || defined(_WS_QWS_)
662 abEditor->showMaximized(); 680 abEditor->showMaximized();
663#endif 681#endif
664 // fix the foxus... 682 // fix the foxus...
665 abEditor->setNameFocus(); 683 abEditor->setNameFocus();
666 if ( abEditor->exec() ) { 684 if ( abEditor->exec() ) {
667 setFocus(); 685 setFocus();
668 if ( entryMode == NewEntry ) { 686 if ( entryMode == NewEntry ) {
669 Contact insertEntry = abEditor->entry(); 687 OContact insertEntry = abEditor->entry();
670 insertEntry.assignUid(); 688 insertEntry.assignUid();
671 abList->addEntry( insertEntry ); 689 abList->addEntry( insertEntry );
672 } else { 690 } else {
673 Contact replaceEntry = abEditor->entry(); 691 OContact replaceEntry = abEditor->entry();
674 if ( !replaceEntry.isValidUid() ) 692 if ( !replaceEntry.isValidUid() )
675 replaceEntry.assignUid(); 693 replaceEntry.assignUid();
676 abList->replaceCurrentEntry( replaceEntry ); 694 abList->replaceCurrentEntry( replaceEntry );
677 } 695 }
678 } 696 }
679 populateCategories(); 697 populateCategories();
680 showList(); 698 showList();
681} 699}
682 700
683void AddressbookWindow::listIsEmpty( bool empty ) 701void AddressbookWindow::listIsEmpty( bool empty )
684{ 702{
685 if ( !empty ) { 703 if ( !empty ) {
686 deleteButton->setEnabled( TRUE ); 704 deleteButton->setEnabled( TRUE );
687 } 705 }
688} 706}
689 707
690void AddressbookWindow::reload() 708void AddressbookWindow::reload()
691{ 709{
692 syncing = FALSE; 710 syncing = FALSE;
693 abList->clear(); 711 abList->clear();
694 abList->load( addressbookXMLFilename() ); 712 abList->load( addressbookXMLFilename() );
695} 713}
696 714
697void AddressbookWindow::flush() 715void AddressbookWindow::flush()
698{ 716{
699 syncing = TRUE; 717 syncing = TRUE;
700 abList->save( addressbookXMLFilename() ); 718 abList->save( addressbookXMLFilename() );
701} 719}
702 720
703 721
704void AddressbookWindow::closeEvent( QCloseEvent *e ) 722void AddressbookWindow::closeEvent( QCloseEvent *e )
705{ 723{
706 if ( centralWidget() == mView ) { 724 if ( centralWidget() == mView ) {
707 if (actionPersonal->isOn()) { 725 if (actionPersonal->isOn()) {
708 // pretend we clicked it off 726 // pretend we clicked it off
709 actionPersonal->setOn(FALSE); 727 actionPersonal->setOn(FALSE);
710 slotPersonalView(); 728 slotPersonalView();
711 } else { 729 } else {
712 showList(); 730 showList();
713 } 731 }
714 e->ignore(); 732 e->ignore();
715 return; 733 return;
716 } 734 }
717 735
718 if(syncing) { 736 if(syncing) {
719 /* shouldn't we save, I hear you say? well its already been set 737 /* shouldn't we save, I hear you say? well its already been set
720 so that an edit can not occur during a sync, and we flushed 738 so that an edit can not occur during a sync, and we flushed
721 at the start of the sync, so there is no need to save 739 at the start of the sync, so there is no need to save
722 Saving however itself would cause problems. */ 740 Saving however itself would cause problems. */
723 e->accept(); 741 e->accept();
724 return; 742 return;
725 } 743 }
726//################## shouldn't always save 744 //################## shouldn't always save
727 if ( save() ) 745 // True, but the database handles this automatically ! (se)
728 e->accept(); 746 if ( save() )
729 else 747 e->accept();
730 e->ignore(); 748 else
749 e->ignore();
731} 750}
732 751
733/* 752/*
734 Returns TRUE if it is OK to exit 753 Returns TRUE if it is OK to exit
735 */ 754*/
736 755
737bool AddressbookWindow::save() 756bool AddressbookWindow::save()
738{ 757{
739 QString str = addressbookXMLFilename(); 758 QString str = addressbookXMLFilename();
740 if ( str.isNull() ) { 759 if ( str.isNull() ) {
741 if ( QMessageBox::critical( 0, tr("Out of space"), 760 if ( QMessageBox::critical( 0, tr("Out of space"),
742 tr("Unable to save information.\n" 761 tr("Unable to save information.\n"
743 "Free up some space\n" 762 "Free up some space\n"
744 "and try again.\n" 763 "and try again.\n"
745 "\nQuit anyway?"), 764 "\nQuit anyway?"),
746 QMessageBox::Yes|QMessageBox::Escape, 765 QMessageBox::Yes|QMessageBox::Escape,
747 QMessageBox::No|QMessageBox::Default ) 766 QMessageBox::No|QMessageBox::Default )
748 != QMessageBox::No ) 767 != QMessageBox::No )
749 return TRUE; 768 return TRUE;
750 else 769 else
751 return FALSE; 770 return FALSE;
752 } else { 771 } else {
753 if ( !abList->save( str ) ) { 772 if ( !abList->save( str ) ) {
754 if ( QMessageBox::critical( 0, tr( "Out of space" ), 773 if ( QMessageBox::critical( 0, tr( "Out of space" ),
755 tr("Unable to save information.\n" 774 tr("Unable to save information.\n"
756 "Free up some space\n" 775 "Free up some space\n"
757 "and try again.\n" 776 "and try again.\n"
758 "\nQuit anyway?"), 777 "\nQuit anyway?"),
759 QMessageBox::Yes|QMessageBox::Escape, 778 QMessageBox::Yes|QMessageBox::Escape,
760 QMessageBox::No|QMessageBox::Default ) 779 QMessageBox::No|QMessageBox::Default )
761 != QMessageBox::No ) 780 != QMessageBox::No )
762 return TRUE; 781 return TRUE;
763 else 782 else
764 return FALSE; 783 return FALSE;
765 } 784 }
766 } 785 }
767 return TRUE; 786 return TRUE;
768} 787}
769 788
770void AddressbookWindow::slotSettings() 789void AddressbookWindow::slotSettings()
771{ 790{
772 AddressSettings frmSettings( this ); 791 AddressSettings frmSettings( this );
773#if defined(Q_WS_QWS) || defined(_WS_QWS_) 792#if defined(Q_WS_QWS) || defined(_WS_QWS_)
774 frmSettings.showMaximized(); 793 frmSettings.showMaximized();
775#endif 794#endif
776 795
777 if ( frmSettings.exec() ) { 796 if ( frmSettings.exec() ) {
778 allFields.clear(); 797 allFields.clear();
779 orderedFields.clear(); 798 orderedFields.clear();
780 slOrderedFields.clear(); 799 slOrderedFields.clear();
781 initFields(); 800 initFields();
782 if ( abEditor ) 801 if ( abEditor )
783 abEditor->loadFields(); 802 abEditor->loadFields();
784 abList->refresh(); 803 abList->refresh();
785 } 804 }
786} 805}
787 806
788 807
789void AddressbookWindow::initFields() 808void AddressbookWindow::initFields()
790{ 809{
791 // we really don't need the things from the configuration, anymore 810 // we really don't need the things from the configuration, anymore
792 // only thing that is important are the important categories. So, 811 // only thing that is important are the important categories. So,
793 // Call the contact functions that correspond to these old functions... 812 // Call the contact functions that correspond to these old functions...
794 813
795 QStringList xmlFields = Contact::fields(); 814 QStringList xmlFields = OContact::fields();
796 QStringList visibleFields = Contact::trfields(); 815 QStringList visibleFields = OContact::trfields();
797 xmlFields.remove( "Title" ); 816 xmlFields.remove( "Title" );
798 visibleFields.remove( tr("Name Title") ); 817 visibleFields.remove( tr("Name Title") );
799 visibleFields.remove( tr("Notes") ); 818 visibleFields.remove( tr("Notes") );
800 819
801 int i, 820 int i, version;
802 version; 821 Config cfg( "AddressBook" );
803 Config cfg( "AddressBook" ); 822 QString zn;
804 QString zn; 823
805 824 // ### Write a function to keep this from happening again...
806 // ### Write a function to keep this from happening again... 825 QStringList::ConstIterator it;
807 QStringList::ConstIterator it; 826 for ( i = 0, it = xmlFields.begin(); it != xmlFields.end(); ++it, i++ ) {
808 for ( i = 0, it = xmlFields.begin(); it != xmlFields.end(); ++it, i++ ) { 827 allFields.append( i + 3 );
809 allFields.append( i + 3 ); 828 }
810 } 829
811 830 cfg.setGroup( "Version" );
812 cfg.setGroup( "Version" ); 831 version = cfg.readNumEntry( "version" );
813 version = cfg.readNumEntry( "version" ); 832 i = 0;
814 i = 0; 833 startFontSize = 1;
815 startFontSize = 1; 834
816 835 if ( version >= ADDRESSVERSION ) {
817 if ( version >= ADDRESSVERSION ) { 836
818 837 cfg.setGroup( "ImportantCategory" );
819 cfg.setGroup( "ImportantCategory" ); 838
820 839 zn = cfg.readEntry( "Category" + QString::number(i), QString::null );
821 zn = cfg.readEntry( "Category" + QString::number(i), QString::null ); 840 while ( !zn.isNull() ) {
822 while ( !zn.isNull() ) { 841 if ( zn.contains( tr("Work") ) || zn.contains( tr("Mb") ) ) {
823 if ( zn.contains( tr("Work") ) || zn.contains( tr("Mb") ) ) { 842 slOrderedFields.clear();
824 slOrderedFields.clear(); 843 break;
825 break; 844 }
826 } 845 slOrderedFields.append( zn );
827 slOrderedFields.append( zn ); 846 zn = cfg.readEntry( "Category" + QString::number(++i), QString::null );
828 zn = cfg.readEntry( "Category" + QString::number(++i), QString::null ); 847 }
829 } 848 cfg.setGroup( "Font" );
830 cfg.setGroup( "Font" ); 849 startFontSize = cfg.readNumEntry( "fontSize", 1 );
831 startFontSize = cfg.readNumEntry( "fontSize", 1 ); 850
832 851
833 852 } else {
834 } else { 853 QString str;
835 QString str; 854 str = getenv("HOME");
836 str = getenv("HOME"); 855 str += "/Settings/AddressBook.conf";
837 str += "/Settings/AddressBook.conf"; 856 QFile::remove( str );
838 QFile::remove( str ); 857 }
839 } 858 if ( slOrderedFields.count() > 0 ) {
840 if ( slOrderedFields.count() > 0 ) { 859 for( QStringList::ConstIterator it = slOrderedFields.begin();
841 for( QStringList::ConstIterator it = slOrderedFields.begin(); 860 it != slOrderedFields.end(); ++it ) {
842 it != slOrderedFields.end(); ++it ) { 861 QValueList<int>::ConstIterator itVl;
843 QValueList<int>::ConstIterator itVl; 862 QStringList::ConstIterator itVis;
844 QStringList::ConstIterator itVis; 863 itVl = allFields.begin();
845 itVl = allFields.begin(); 864 for ( itVis = visibleFields.begin();
846 for ( itVis = visibleFields.begin(); 865 itVis != visibleFields.end() && itVl != allFields.end();
847 itVis != visibleFields.end() && itVl != allFields.end(); 866 ++itVis, ++itVl ) {
848 ++itVis, ++itVl ) { 867 if ( *it == *itVis && itVl != allFields.end() ) {
849 if ( *it == *itVis && itVl != allFields.end() ) { 868 orderedFields.append( *itVl );
850 orderedFields.append( *itVl ); 869 }
851 } 870 }
852 } 871 }
853 } 872 } else {
854 } else { 873 QValueList<int>::ConstIterator it;
855 QValueList<int>::ConstIterator it; 874 for ( it = allFields.begin(); it != allFields.end(); ++it )
856 for ( it = allFields.begin(); it != allFields.end(); ++it ) 875 orderedFields.append( *it );
857 orderedFields.append( *it ); 876
858 877 slOrderedFields = visibleFields;
859 slOrderedFields = visibleFields; 878 orderedFields.remove( Qtopia::AddressUid );
860 orderedFields.remove( Qtopia::AddressUid ); 879 orderedFields.remove( Qtopia::Title );
861 orderedFields.remove( Qtopia::Title ); 880 orderedFields.remove( Qtopia::Groups );
862 orderedFields.remove( Qtopia::Groups ); 881 orderedFields.remove( Qtopia::AddressCategory );
863 orderedFields.remove( Qtopia::AddressCategory ); 882 orderedFields.remove( Qtopia::FirstName );
864 orderedFields.remove( Qtopia::FirstName ); 883 orderedFields.remove( Qtopia::LastName );
865 orderedFields.remove( Qtopia::LastName ); 884 orderedFields.remove( Qtopia::DefaultEmail );
866 orderedFields.remove( Qtopia::DefaultEmail ); 885 orderedFields.remove( Qtopia::FileAs );
867 orderedFields.remove( Qtopia::FileAs ); 886 orderedFields.remove( Qtopia::Notes );
868 orderedFields.remove( Qtopia::Notes ); 887 orderedFields.remove( Qtopia::Gender );
869 orderedFields.remove( Qtopia::Gender ); 888 slOrderedFields.remove( tr("Name Title") );
870 slOrderedFields.remove( tr("Name Title") ); 889 slOrderedFields.remove( tr("First Name") );
871 slOrderedFields.remove( tr("First Name") ); 890 slOrderedFields.remove( tr("Last Name") );
872 slOrderedFields.remove( tr("Last Name") ); 891 slOrderedFields.remove( tr("File As") );
873 slOrderedFields.remove( tr("File As") ); 892 slOrderedFields.remove( tr("Default Email") );
874 slOrderedFields.remove( tr("Default Email") ); 893 slOrderedFields.remove( tr("Notes") );
875 slOrderedFields.remove( tr("Notes") ); 894 slOrderedFields.remove( tr("Gender") );
876 slOrderedFields.remove( tr("Gender") ); 895
877 896 }
878 }
879} 897}
880 898
881 899
882AbLabel *AddressbookWindow::abView() 900AbLabel *AddressbookWindow::abView()
883{ 901{
884 if ( !mView ) { 902 if ( !mView ) {
885 mView = new AbLabel( this, "viewer" ); 903 mView = new AbLabel( this, "viewer" );
886 mView->init( Contact() ); 904 mView->init( OContact() );
887 connect( mView, SIGNAL( okPressed() ), this, SLOT( slotListView() ) ); 905 connect( mView, SIGNAL( okPressed() ), this, SLOT( slotListView() ) );
888 } 906 }
889 return mView; 907 return mView;
890} 908}
891 909
892void AddressbookWindow::slotFind() 910void AddressbookWindow::slotFind()
893{ 911{
894#ifndef MAKE_FOR_SHARP_ROM 912#ifndef MAKE_FOR_SHARP_ROM
895 if ( centralWidget() == abView() ) 913 if ( centralWidget() == abView() )
896 showList(); 914 showList();
897 915
898 FindDialog frmFind( "Contacts", this ); 916 FindDialog frmFind( "Contacts", this );
899 QObject::connect( &frmFind, SIGNAL(signalFindClicked(const QString &, bool, bool, int)), abList, SLOT(slotDoFind( const QString&,bool,bool,int))); 917 QObject::connect( &frmFind, SIGNAL(signalFindClicked(const QString &, bool, bool, int)), abList, SLOT(slotDoFind( const QString&,bool,bool,int)));
900 QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); 918 QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) );
901 QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); 919 QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) );
902 920
903 frmFind.exec(); 921 frmFind.exec();
904 922
905 if ( abList->numSelections() ) 923 if ( abList->numSelections() )
906 abList->clearSelection(); 924 abList->clearSelection();
907 925
908 abList->clearFindRow(); 926 abList->clearFindRow();
909#endif 927#endif
910} 928}
911 929
912void AddressbookWindow::slotSetCategory( int c ) 930void AddressbookWindow::slotSetCategory( int c )
913{ 931{
914 if ( c <= 0 ) 932
915 return; 933 QString cat, book;
916 for ( unsigned int i = 1; i < catMenu->count(); i++ ) 934
917 catMenu->setItemChecked( i, c == (int)i ); 935 if ( c <= 0 )
918 if ( c == 1 ) { 936 return;
919 abList->setShowCategory( QString::null ); 937
920 setCaption( tr("Contacts") + " - " + tr ( "All" ) ); 938 // Checkmark Book Menu Item Selected
921 } else if ( c == (int)catMenu->count() ) { 939 if ( c < 6 )
922 abList->setShowCategory( tr( "Unfiled" ) ); 940 for ( unsigned int i = 1; i < 6; i++ )
923 setCaption( tr("Contacts") + " - " + tr( "Unfiled" ) ); 941 catMenu->setItemChecked( i, c == (int)i );
924 } else { 942
925 QString cat = abList->categories()[c - 2]; 943 // Checkmark Category Menu Item Selected
926 abList->setShowCategory( cat ); 944 else
927 setCaption( tr("Contacts") + " - " + cat ); 945 for ( unsigned int i = 6; i < catMenu->count(); i++ )
928 } 946 catMenu->setItemChecked( i, c == (int)i );
947
948 for ( unsigned int i = 1; i < catMenu->count(); i++ ) {
949 if (catMenu->isItemChecked( i )) {
950 if ( i == 1 ) // default List view
951 book = QString::null;
952 else if ( i == 2 )
953 book = "Phone";
954 else if ( i == 3 )
955 book = "Company";
956 else if ( i == 4 )
957 book = "Email";
958 else if ( i == 5 )
959 book = "Cards";
960 else if ( i == 6 ) // default All Categories
961 cat = QString::null;
962 else if ( i == (unsigned int)catMenu->count() ) // last menu option will be Unfiled
963 cat = "Unfiled";
964 else
965 cat = abList->categories()[i - 7];
966 }
967 }
968
969 abList->setShowCategory( book, cat );
970
971 if ( book.isEmpty() )
972 book = "List";
973 if ( cat.isEmpty() )
974 cat = "All";
975
976 setCaption( tr( "Contacts" ) + " - " + tr( book ) + " - " + tr( cat ) );
929} 977}
930 978
931void AddressbookWindow::slotSetLetter( char c ) { 979void AddressbookWindow::slotSetLetter( char c ) {
932 980
933 abList->setShowByLetter( c ); 981 abList->setShowByLetter( c );
934 982
935} 983}
936 984
937void AddressbookWindow::populateCategories() 985void AddressbookWindow::populateCategories()
938{ 986{
939 catMenu->clear(); 987 catMenu->clear();
940 988
941 int id, 989 int id, rememberId;
942 rememberId; 990 id = 1;
943 id = 1; 991 rememberId = 0;
944 rememberId = 0; 992
945 catMenu->insertItem( tr( "All" ), id++ ); 993 catMenu->insertItem( tr( "List" ), id++ );
946 QStringList categories = abList->categories(); 994 catMenu->insertItem( tr( "Phone Book" ), id++ );
947 categories.append( tr( "Unfiled" ) ); 995 catMenu->insertItem( tr( "Company Book" ), id++ );
948 for ( QStringList::Iterator it = categories.begin(); 996 catMenu->insertItem( tr( "Email Book" ), id++ );
949 it != categories.end(); ++it ) { 997 catMenu->insertItem( tr( "Cards" ), id++ );
950 catMenu->insertItem( *it, id ); 998 catMenu->insertSeparator();
951 if ( *it == abList->showCategory() ) 999
952 rememberId = id; 1000 catMenu->insertItem( tr( "All" ), id++ );
953 ++id; 1001 QStringList categories = abList->categories();
954 } 1002 categories.append( tr( "Unfiled" ) );
955 if ( abList->showCategory().isEmpty() ) 1003 for ( QStringList::Iterator it = categories.begin();
956 slotSetCategory( 1 ); 1004 it != categories.end(); ++it ) {
957 else 1005 catMenu->insertItem( *it, id );
958 slotSetCategory( rememberId ); 1006 if ( *it == abList->showCategory() )
1007 rememberId = id;
1008 ++id;
1009 }
1010
1011 if ( abList->showBook().isEmpty() ) {
1012 catMenu->setItemChecked( 1, true );
1013 } else if ( abList->showBook() == "Phone" ) {
1014 catMenu->setItemChecked( 2, true );
1015 } else if ( abList->showBook() == "Company" ) {
1016 catMenu->setItemChecked( 3, true );
1017 } else if ( abList->showBook() == "Email" ) {
1018 catMenu->setItemChecked( 4, true );
1019 } else if ( abList->showBook() == "Cards" ) {
1020 catMenu->setItemChecked( 5, true );
1021 }
1022
1023 if ( abList->showCategory().isEmpty() ) {
1024 slotSetCategory( 6 );
1025 }
1026 else {
1027 slotSetCategory( rememberId );
1028 }
959} 1029}
1030
diff --git a/core/pim/addressbook/addressbook.h b/core/pim/addressbook/addressbook.h
index 34ca85d..bf36407 100644
--- a/core/pim/addressbook/addressbook.h
+++ b/core/pim/addressbook/addressbook.h
@@ -37,72 +37,73 @@ class LetterPicker;
37 37
38class AddressbookWindow: public QMainWindow 38class AddressbookWindow: public QMainWindow
39{ 39{
40 Q_OBJECT 40 Q_OBJECT
41public: 41public:
42 AddressbookWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); 42 AddressbookWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
43 ~AddressbookWindow(); 43 ~AddressbookWindow();
44 44
45protected: 45protected:
46 void resizeEvent( QResizeEvent * e ); 46 void resizeEvent( QResizeEvent * e );
47 void showList(); 47 void showList();
48 void showView(); 48 void showView();
49 enum EntryMode { NewEntry=0, EditEntry }; 49 enum EntryMode { NewEntry=0, EditEntry };
50 void editPersonal(); 50 void editPersonal();
51 void editEntry( EntryMode ); 51 void editEntry( EntryMode );
52 void closeEvent( QCloseEvent *e ); 52 void closeEvent( QCloseEvent *e );
53 bool save(); 53 bool save();
54 54
55public slots: 55public slots:
56 void flush(); 56 void flush();
57 void reload(); 57 void reload();
58 void appMessage(const QCString &, const QByteArray &); 58 void appMessage(const QCString &, const QByteArray &);
59 void setDocument( const QString & ); 59 void setDocument( const QString & );
60 60
61private slots: 61private slots:
62 void importvCard(); 62 void importvCard();
63 void slotListNew(); 63 void slotListNew();
64 void slotListView(); 64 void slotListView();
65 void slotListDelete(); 65 void slotListDelete();
66 void slotViewBack(); 66 void slotViewBack();
67 void slotViewEdit(); 67 void slotViewEdit();
68 void slotPersonalView(); 68 void slotPersonalView();
69 void listIsEmpty( bool ); 69 void listIsEmpty( bool );
70 void slotSettings(); 70 void slotSettings();
71 void writeMail(); 71 void writeMail();
72 void slotBeam(); 72 void slotBeam();
73 void beamDone( Ir * ); 73 void beamDone( Ir * );
74 void slotFind(); 74 void slotFind();
75 void slotSetCategory( int ); 75 void slotSetCategory( int );
76 void slotSetLetter( char ); 76 void slotSetLetter( char );
77 void slotUpdateToolbar(); 77 void slotUpdateToolbar();
78 void slotSetFont(int); 78 void slotSetFont(int);
79
79private: 80private:
80 void initFields(); // inititialize our fields... 81 void initFields(); // inititialize our fields...
81 AbLabel *abView(); 82 AbLabel *abView();
82 void populateCategories(); 83 void populateCategories();
84
85 QPopupMenu *catMenu, *fontMenu;
86 QPEToolBar *listTools;
87 QToolButton *deleteButton;
88 QValueList<int> allFields, orderedFields;
89 QStringList slOrderedFields;
90 enum Panes { paneList=0, paneView, paneEdit };
91 ContactEditor *abEditor;
92 AbLabel *mView;
93 LetterPicker *pLabel;
94 AbTable *abList;
95 QWidget *listContainer;
83 96
84 QPopupMenu *catMenu, *fontMenu; 97 QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, *actionPersonal, *actionMail;
85 QPEToolBar *listTools;
86 QToolButton *deleteButton;
87 QValueList<int> allFields,
88 orderedFields;
89 QStringList slOrderedFields;
90 enum Panes { paneList=0, paneView, paneEdit };
91 ContactEditor *abEditor;
92 AbLabel *mView;
93 LetterPicker *pLabel;
94 AbTable *abList;
95 QWidget *listContainer;
96 98
97 QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, 99 bool bAbEditFirstTime;
98 *actionPersonal, *actionMail; 100 int viewMargin;
99 101
100 bool bAbEditFirstTime; 102 bool syncing;
101 int viewMargin; 103 QFont *defaultFont;
104 int startFontSize;
102 105
103 bool syncing; 106 bool isLoading;
104 QFont *defaultFont;
105 int startFontSize;
106}; 107};
107 108
108#endif 109#endif
diff --git a/core/pim/addressbook/contacteditor.cpp b/core/pim/addressbook/contacteditor.cpp
index ae86ed0..fd7f009 100644
--- a/core/pim/addressbook/contacteditor.cpp
+++ b/core/pim/addressbook/contacteditor.cpp
@@ -49,7 +49,7 @@ void parseEmailFrom( const QString &txt, QString &strDefaultEmail,
49void parseEmailTo( const QString &strDefaultEmail, 49void parseEmailTo( const QString &strDefaultEmail,
50 const QString &strOtherEmail, QString &strBack ); 50 const QString &strOtherEmail, QString &strBack );
51 51
52 ContactEditor::ContactEditor(const Contact &entry, 52 ContactEditor::ContactEditor(const OContact &entry,
53 const QValueList<int> *newOrderedValues, 53 const QValueList<int> *newOrderedValues,
54 QStringList *slNewOrdered, 54 QStringList *slNewOrdered,
55 QWidget *parent, 55 QWidget *parent,
@@ -1292,7 +1292,7 @@ void ContactEditor::cleanupFields() {
1292 1292
1293} 1293}
1294 1294
1295void ContactEditor::setEntry( const Contact &entry ) { 1295void ContactEditor::setEntry( const OContact &entry ) {
1296 1296
1297 cleanupFields(); 1297 cleanupFields();
1298 1298
diff --git a/core/pim/addressbook/contacteditor.h b/core/pim/addressbook/contacteditor.h
index 4f3b56e..8ed8553 100644
--- a/core/pim/addressbook/contacteditor.h
+++ b/core/pim/addressbook/contacteditor.h
@@ -21,7 +21,7 @@
21#ifndef CONTACTEDITOR_H 21#ifndef CONTACTEDITOR_H
22#define CONTACTEDITOR_H 22#define CONTACTEDITOR_H
23 23
24#include <qpe/contact.h> 24#include <opie/ocontact.h>
25 25
26#include <qdialog.h> 26#include <qdialog.h>
27#include <qlist.h> 27#include <qlist.h>
@@ -52,7 +52,7 @@ class ContactEditor : public QDialog {
52 Q_OBJECT 52 Q_OBJECT
53 53
54 public: 54 public:
55 ContactEditor(const Contact &entry, 55 ContactEditor(const OContact &entry,
56 const QValueList<int> *newOrderedValues, 56 const QValueList<int> *newOrderedValues,
57 QStringList *slNewOrdered, 57 QStringList *slNewOrdered,
58 QWidget *parent = 0, 58 QWidget *parent = 0,
@@ -61,12 +61,12 @@ class ContactEditor : public QDialog {
61 ~ContactEditor(); 61 ~ContactEditor();
62 void loadFields(); 62 void loadFields();
63 void setNameFocus(); 63 void setNameFocus();
64 Contact entry() const { return ent; } 64 OContact entry() const { return ent; }
65 65
66 public slots: 66 public slots:
67 void slotNote(); 67 void slotNote();
68 void slotName(); 68 void slotName();
69 void setEntry(const Contact &entry); 69 void setEntry(const OContact &entry);
70 70
71 protected slots: 71 protected slots:
72 void accept(); 72 void accept();
@@ -101,7 +101,7 @@ class ContactEditor : public QDialog {
101 private: 101 private:
102 bool useFullName, hasGender, hasTitle, hasCompany, hasNotes, hasStreet, hasStreet2, hasPOBox, hasCity, hasState, hasZip, hasCountry; 102 bool useFullName, hasGender, hasTitle, hasCompany, hasNotes, hasStreet, hasStreet2, hasPOBox, hasCity, hasState, hasZip, hasCountry;
103 103
104 Contact ent; 104 OContact ent;
105 105
106 QDialog *dlgNote; 106 QDialog *dlgNote;
107 QDialog *dlgName; 107 QDialog *dlgName;