summaryrefslogtreecommitdiff
authoreilers <eilers>2003-03-09 16:59:29 (UTC)
committer eilers <eilers>2003-03-09 16:59:29 (UTC)
commit06d6fd6ae517d560616d0864db29c7d8ae7a0a32 (patch) (unidiff)
tree36e4672fcded6fc2009a5af6a111d1d8d4dc6bb5
parent77c55432622d2821023ac73f47d3215d04cc4f58 (diff)
downloadopie-06d6fd6ae517d560616d0864db29c7d8ae7a0a32.zip
opie-06d6fd6ae517d560616d0864db29c7d8ae7a0a32.tar.gz
opie-06d6fd6ae517d560616d0864db29c7d8ae7a0a32.tar.bz2
Fixed missing table refresh after changing the primary contact order
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/abtable.cpp13
-rw-r--r--core/pim/addressbook/abtable.h4
-rw-r--r--core/pim/addressbook/abview.cpp4
3 files changed, 19 insertions, 2 deletions
diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp
index a829dc2..a2617fa 100644
--- a/core/pim/addressbook/abtable.cpp
+++ b/core/pim/addressbook/abtable.cpp
@@ -57,395 +57,404 @@ AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s,
57 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower(); 57 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower();
58 sortKey = Qtopia::buildSortKey( s, secondSortKey ); 58 sortKey = Qtopia::buildSortKey( s, secondSortKey );
59} 59}
60 60
61int AbTableItem::alignment() const 61int AbTableItem::alignment() const
62{ 62{
63 return AlignLeft|AlignVCenter; 63 return AlignLeft|AlignVCenter;
64} 64}
65 65
66QString AbTableItem::key() const 66QString AbTableItem::key() const
67{ 67{
68 return sortKey; 68 return sortKey;
69} 69}
70 70
71// A way to reset the item, without out doing a delete or a new... 71// A way to reset the item, without out doing a delete or a new...
72void AbTableItem::setItem( const QString &txt, const QString &secondKey ) 72void AbTableItem::setItem( const QString &txt, const QString &secondKey )
73{ 73{
74 setText( txt ); 74 setText( txt );
75 sortKey = Qtopia::buildSortKey( txt, secondKey ); 75 sortKey = Qtopia::buildSortKey( txt, secondKey );
76 76
77 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower(); 77 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower();
78} 78}
79 79
80/*! 80/*!
81 \class AbPickItem abtable.h 81 \class AbPickItem abtable.h
82 82
83 \brief QTableItem based class for showing slection of an entry 83 \brief QTableItem based class for showing slection of an entry
84*/ 84*/
85 85
86AbPickItem::AbPickItem( QTable *t ) : 86AbPickItem::AbPickItem( QTable *t ) :
87 QTableItem(t, WhenCurrent, "?") 87 QTableItem(t, WhenCurrent, "?")
88{ 88{
89} 89}
90 90
91QWidget *AbPickItem::createEditor() const 91QWidget *AbPickItem::createEditor() const
92{ 92{
93 QComboBox* combo = new QComboBox( table()->viewport() ); 93 QComboBox* combo = new QComboBox( table()->viewport() );
94 ( (AbPickItem*)this )->cb = combo; 94 ( (AbPickItem*)this )->cb = combo;
95 AbTable* t = static_cast<AbTable*>(table()); 95 AbTable* t = static_cast<AbTable*>(table());
96 QStringList c = t->choiceNames(); 96 QStringList c = t->choiceNames();
97 int cur = 0; 97 int cur = 0;
98 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) { 98 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) {
99 if ( *it == text() ) 99 if ( *it == text() )
100 cur = combo->count(); 100 cur = combo->count();
101 combo->insertItem(*it); 101 combo->insertItem(*it);
102 } 102 }
103 combo->setCurrentItem(cur); 103 combo->setCurrentItem(cur);
104 return combo; 104 return combo;
105} 105}
106 106
107void AbPickItem::setContentFromEditor( QWidget *w ) 107void AbPickItem::setContentFromEditor( QWidget *w )
108{ 108{
109 if ( w->inherits("QComboBox") ) 109 if ( w->inherits("QComboBox") )
110 setText( ( (QComboBox*)w )->currentText() ); 110 setText( ( (QComboBox*)w )->currentText() );
111 else 111 else
112 QTableItem::setContentFromEditor( w ); 112 QTableItem::setContentFromEditor( w );
113} 113}
114 114
115/*! 115/*!
116 \class AbTable abtable.h 116 \class AbTable abtable.h
117 117
118 \brief QTable based class for showing a list of entries 118 \brief QTable based class for showing a list of entries
119*/ 119*/
120 120
121AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name ) 121AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name )
122 : QTable( parent, name ), 122 : QTable( parent, name ),
123 lastSortCol( -1 ), 123 lastSortCol( -1 ),
124 asc( TRUE ), 124 asc( TRUE ),
125 intFields( order ), 125 intFields( order ),
126 enablePainting( true ), 126 enablePainting( true ),
127 columnVisible( true ), 127 columnVisible( true ),
128 countNested( 0 ) 128 countNested( 0 )
129{ 129{
130 //qWarning("C'tor start"); 130 //qWarning("C'tor start");
131 131
132 setSelectionMode( NoSelection ); 132 setSelectionMode( NoSelection );
133 init(); 133 init();
134 setSorting( TRUE ); 134 setSorting( TRUE );
135 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), 135 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)),
136 this, SLOT(itemClicked(int,int)) ); 136 this, SLOT(itemClicked(int,int)) );
137 137
138 contactList.clear(); 138 contactList.clear();
139 //qWarning("C'tor end"); 139 //qWarning("C'tor end");
140} 140}
141 141
142AbTable::~AbTable() 142AbTable::~AbTable()
143{ 143{
144} 144}
145 145
146void AbTable::init() 146void AbTable::init()
147{ 147{
148 // :SX showChar = '\0'; 148 // :SX showChar = '\0';
149 setNumRows( 0 ); 149 setNumRows( 0 );
150 setNumCols( 2 ); 150 setNumCols( 2 );
151 151
152 horizontalHeader()->setLabel( 0, tr( "Full Name" )); 152 horizontalHeader()->setLabel( 0, tr( "Full Name" ));
153 horizontalHeader()->setLabel( 1, tr( "Contact" )); 153 horizontalHeader()->setLabel( 1, tr( "Contact" ));
154 setLeftMargin( 0 ); 154 setLeftMargin( 0 );
155 verticalHeader()->hide(); 155 verticalHeader()->hide();
156 columnVisible = true; 156 columnVisible = true;
157} 157}
158 158
159void AbTable::setContacts( const OContactAccess::List& viewList ) 159void AbTable::setContacts( const OContactAccess::List& viewList )
160{ 160{
161 //qWarning("AbTable::setContacts()"); 161 //qWarning("AbTable::setContacts()");
162 162
163 clear(); 163 clear();
164 m_viewList = viewList; 164 m_viewList = viewList;
165 165
166 setSorting( false ); 166 setSorting( false );
167 setPaintingEnabled( FALSE ); 167 setPaintingEnabled( FALSE );
168 168
169 OContactAccess::List::Iterator it; 169 OContactAccess::List::Iterator it;
170 setNumRows( m_viewList.count() ); 170 setNumRows( m_viewList.count() );
171 int row = 0; 171 int row = 0;
172 for ( it = m_viewList.begin(); it != m_viewList.end(); ++it ) 172 for ( it = m_viewList.begin(); it != m_viewList.end(); ++it )
173 insertIntoTable( *it, row++ ); 173 insertIntoTable( *it, row++ );
174 174
175 setSorting( true ); 175 setSorting( true );
176 176
177 resort(); 177 resort();
178 178
179 updateVisible(); 179 updateVisible();
180 180
181 setPaintingEnabled( TRUE ); 181 setPaintingEnabled( TRUE );
182 182
183} 183}
184 184
185void AbTable::setOrderedList( const QValueList<int> ordered )
186{
187 intFields = ordered;
188}
189
190
185bool AbTable::selectContact( int UID ) 191bool AbTable::selectContact( int UID )
186{ 192{
187 //qWarning( "AbTable::selectContact( %d )", UID ); 193 //qWarning( "AbTable::selectContact( %d )", UID );
188 int rows = numRows(); 194 int rows = numRows();
189 AbTableItem *abi; 195 AbTableItem *abi;
190 OContact* foundContact = 0l; 196 OContact* foundContact = 0l;
191 bool found = false; 197 bool found = false;
192 198
193 setPaintingEnabled( FALSE ); 199 setPaintingEnabled( FALSE );
194 for ( int r = 0; r < rows; ++r ) { 200 for ( int r = 0; r < rows; ++r ) {
195 abi = static_cast<AbTableItem*>( item(r, 0) ); 201 abi = static_cast<AbTableItem*>( item(r, 0) );
196 foundContact = &contactList[abi]; 202 foundContact = &contactList[abi];
197 if ( foundContact -> uid() == UID ){ 203 if ( foundContact -> uid() == UID ){
198 ensureCellVisible( r, 0 ); 204 ensureCellVisible( r, 0 );
199 setCurrentCell( r, 0 ); 205 setCurrentCell( r, 0 );
200 found = true; 206 found = true;
201 break; 207 break;
202 } 208 }
203 } 209 }
204 210
205 if ( !found ){ 211 if ( !found ){
206 ensureCellVisible( 0,0 ); 212 ensureCellVisible( 0,0 );
207 setCurrentCell( 0, 0 ); 213 setCurrentCell( 0, 0 );
208 } 214 }
209 215
210 setPaintingEnabled( TRUE ); 216 setPaintingEnabled( TRUE );
211 217
212 return true; 218 return true;
213} 219}
214 220
215void AbTable::insertIntoTable( const OContact& cnt, int row ) 221void AbTable::insertIntoTable( const OContact& cnt, int row )
216{ 222{
217 //qWarning( "void AbTable::insertIntoTable( const OContact& cnt, %d )", row ); 223 //qWarning( "void AbTable::insertIntoTable( const OContact& cnt, %d )", row );
218 QString strName; 224 QString strName;
219 ContactItem contactItem; 225 ContactItem contactItem;
220 226
221 strName = findContactName( cnt ); 227 strName = findContactName( cnt );
222 contactItem = findContactContact( cnt, row ); 228 contactItem = findContactContact( cnt, row );
223 229
224 AbTableItem *ati; 230 AbTableItem *ati;
225 ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value ); 231 ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value );
226 contactList.insert( ati, cnt ); 232 contactList.insert( ati, cnt );
227 setItem( row, 0, ati ); 233 setItem( row, 0, ati );
228 ati = new AbTableItem( this, QTableItem::Never, contactItem.value, strName); 234 ati = new AbTableItem( this, QTableItem::Never, contactItem.value, strName);
229 if ( !contactItem.icon.isNull() ) 235 if ( !contactItem.icon.isNull() )
230 ati->setPixmap( contactItem.icon ); 236 ati->setPixmap( contactItem.icon );
231 setItem( row, 1, ati ); 237 setItem( row, 1, ati );
232 238
233 //### cannot do this; table only has two columns at this point 239 //### cannot do this; table only has two columns at this point
234 // setItem( row, 2, new AbPickItem( this ) ); 240 // setItem( row, 2, new AbPickItem( this ) );
235 241
236} 242}
237 243
238 244
239 245
240void AbTable::columnClicked( int col ) 246void AbTable::columnClicked( int col )
241{ 247{
242 if ( !sorting() ) 248 if ( !sorting() )
243 return; 249 return;
244 250
245 if ( lastSortCol == -1 ) 251 if ( lastSortCol == -1 )
246 lastSortCol = col; 252 lastSortCol = col;
247 253
248 if ( col == lastSortCol ) { 254 if ( col == lastSortCol ) {
249 asc = !asc; 255 asc = !asc;
250 } else { 256 } else {
251 lastSortCol = col; 257 lastSortCol = col;
252 asc = TRUE; 258 asc = TRUE;
253 } 259 }
254 //QMessageBox::information( this, "resort", "columnClicked" ); 260 //QMessageBox::information( this, "resort", "columnClicked" );
255 resort(); 261 resort();
256} 262}
257 263
258void AbTable::resort() 264void AbTable::resort()
259{ 265{
260 //qWarning( "void AbTable::resort()" ); 266 //qWarning( "void AbTable::resort()" );
261 setPaintingEnabled( FALSE ); 267 setPaintingEnabled( FALSE );
262 if ( sorting() ) { 268 if ( sorting() ) {
263 if ( lastSortCol == -1 ) 269 if ( lastSortCol == -1 )
264 lastSortCol = 0; 270 lastSortCol = 0;
265 sortColumn( lastSortCol, asc, TRUE ); 271 sortColumn( lastSortCol, asc, TRUE );
266 //QMessageBox::information( this, "resort", "resort" ); 272 //QMessageBox::information( this, "resort", "resort" );
267 updateVisible(); 273 updateVisible();
268 } 274 }
269 setPaintingEnabled( TRUE ); 275 setPaintingEnabled( TRUE );
270} 276}
271 277
272OContact AbTable::currentEntry() 278OContact AbTable::currentEntry()
273{ 279{
274 //qWarning( "OContact AbTable::currentEntry()" ); 280 //qWarning( "OContact AbTable::currentEntry()" );
275 OContact cnt; 281 OContact cnt;
276 AbTableItem *abItem; 282 AbTableItem *abItem;
277 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 )); 283 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 ));
278 if ( abItem ) { 284 if ( abItem ) {
279 cnt = contactList[abItem]; 285 cnt = contactList[abItem];
280 //cnt = contactList[currentRow()]; 286 //cnt = contactList[currentRow()];
281 } 287 }
282 return cnt; 288 return cnt;
283} 289}
284 290
285int AbTable::currentEntry_UID() 291int AbTable::currentEntry_UID()
286{ 292{
287 return ( currentEntry().uid() ); 293 return ( currentEntry().uid() );
288} 294}
289 295
290void AbTable::clear() 296void AbTable::clear()
291{ 297{
292 //qWarning( "void AbTable::clear()" ); 298 //qWarning( "void AbTable::clear()" );
293 contactList.clear(); 299 contactList.clear();
294 300
295 setPaintingEnabled( FALSE ); 301 setPaintingEnabled( FALSE );
296 for ( int r = 0; r < numRows(); ++r ) { 302 for ( int r = 0; r < numRows(); ++r ) {
297 for ( int c = 0; c < numCols(); ++c ) { 303 for ( int c = 0; c < numCols(); ++c ) {
298 if ( cellWidget( r, c ) ) 304 if ( cellWidget( r, c ) )
299 clearCellWidget( r, c ); 305 clearCellWidget( r, c );
300 clearCell( r, c ); 306 clearCell( r, c );
301 } 307 }
302 } 308 }
303 setNumRows( 0 ); 309 setNumRows( 0 );
304 setPaintingEnabled( TRUE ); 310 setPaintingEnabled( TRUE );
305} 311}
306 312
307// Refresh updates column 2 if the contactsettings changed 313// Refresh updates column 2 if the contactsettings changed
308void AbTable::refresh() 314void AbTable::refresh()
309{ 315{
310 //qWarning( "void AbTable::refresh()" ); 316 //qWarning( "void AbTable::refresh()" );
311 int rows = numRows(); 317 int rows = numRows();
312 AbTableItem *abi; 318 AbTableItem *abi;
313 ContactItem contactItem; 319 ContactItem contactItem;
314 320
315 setPaintingEnabled( FALSE ); 321 setPaintingEnabled( FALSE );
316 for ( int r = 0; r < rows; ++r ) { 322 for ( int r = 0; r < rows; ++r ) {
317 abi = static_cast<AbTableItem*>( item(r, 0) ); 323 abi = static_cast<AbTableItem*>( item(r, 0) );
318 contactItem = findContactContact( contactList[abi], r ); 324 contactItem = findContactContact( contactList[abi], r );
319 static_cast<AbTableItem*>( item(r, 1) )->setItem( contactItem.value, abi->text() ); 325 static_cast<AbTableItem*>( item(r, 1) )->setItem( contactItem.value, abi->text() );
320 if ( !contactItem.icon.isNull() ) 326 if ( !contactItem.icon.isNull() ){
321 static_cast<AbTableItem*>( item(r, 1) )-> 327 static_cast<AbTableItem*>( item(r, 1) )->
322 setPixmap( contactItem.icon ); 328 setPixmap( contactItem.icon );
323 329 }else{
330 static_cast<AbTableItem*>( item(r, 1) )->
331 setPixmap( QPixmap() );
332 }
324 } 333 }
325 resort(); 334 resort();
326 setPaintingEnabled( TRUE ); 335 setPaintingEnabled( TRUE );
327} 336}
328 337
329void AbTable::keyPressEvent( QKeyEvent *e ) 338void AbTable::keyPressEvent( QKeyEvent *e )
330{ 339{
331 char key = toupper( e->ascii() ); 340 char key = toupper( e->ascii() );
332 341
333 if ( key >= 'A' && key <= 'Z' ) 342 if ( key >= 'A' && key <= 'Z' )
334 moveTo( key ); 343 moveTo( key );
335 344
336 //qWarning("Received key .."); 345 //qWarning("Received key ..");
337 switch( e->key() ) { 346 switch( e->key() ) {
338 case Qt::Key_Space: 347 case Qt::Key_Space:
339 case Qt::Key_Return: 348 case Qt::Key_Return:
340 case Qt::Key_Enter: 349 case Qt::Key_Enter:
341 emit signalSwitch(); 350 emit signalSwitch();
342 break; 351 break;
343 // case Qt::Key_Up: 352 // case Qt::Key_Up:
344 // qWarning("a"); 353 // qWarning("a");
345 // emit signalKeyUp(); 354 // emit signalKeyUp();
346 // break; 355 // break;
347 // case Qt::Key_Down: 356 // case Qt::Key_Down:
348 // qWarning("b"); 357 // qWarning("b");
349 // emit signalKeyDown(); 358 // emit signalKeyDown();
350 // break; 359 // break;
351 default: 360 default:
352 QTable::keyPressEvent( e ); 361 QTable::keyPressEvent( e );
353 } 362 }
354 363
355} 364}
356 365
357void AbTable::moveTo( char c ) 366void AbTable::moveTo( char c )
358{ 367{
359 qWarning( "void AbTable::moveTo( char c )" ); 368 qWarning( "void AbTable::moveTo( char c )" );
360 369
361 int rows = numRows(); 370 int rows = numRows();
362 QString value; 371 QString value;
363 AbTableItem *abi; 372 AbTableItem *abi;
364 int r; 373 int r;
365 if ( asc ) { 374 if ( asc ) {
366 r = 0; 375 r = 0;
367 while ( r < rows-1) { 376 while ( r < rows-1) {
368 abi = static_cast<AbTableItem*>( item(r, 0) ); 377 abi = static_cast<AbTableItem*>( item(r, 0) );
369 QChar first = abi->key()[0]; 378 QChar first = abi->key()[0];
370 //### is there a bug in QChar to char comparison??? 379 //### is there a bug in QChar to char comparison???
371 if ( first.row() || first.cell() >= c ) 380 if ( first.row() || first.cell() >= c )
372 break; 381 break;
373 r++; 382 r++;
374 } 383 }
375 } else { 384 } else {
376 //### should probably disable reverse sorting instead 385 //### should probably disable reverse sorting instead
377 r = rows - 1; 386 r = rows - 1;
378 while ( r > 0 ) { 387 while ( r > 0 ) {
379 abi = static_cast<AbTableItem*>( item(r, 0) ); 388 abi = static_cast<AbTableItem*>( item(r, 0) );
380 QChar first = abi->key()[0]; 389 QChar first = abi->key()[0];
381 //### is there a bug in QChar to char comparison??? 390 //### is there a bug in QChar to char comparison???
382 if ( first.row() || first.cell() >= c ) 391 if ( first.row() || first.cell() >= c )
383 break; 392 break;
384 r--; 393 r--;
385 } 394 }
386 } 395 }
387 setCurrentCell( r, currentColumn() ); 396 setCurrentCell( r, currentColumn() );
388} 397}
389 398
390 399
391QString AbTable::findContactName( const OContact &entry ) 400QString AbTable::findContactName( const OContact &entry )
392{ 401{
393 // We use the fileAs, then company, defaultEmail 402 // We use the fileAs, then company, defaultEmail
394 QString str; 403 QString str;
395 str = entry.fileAs(); 404 str = entry.fileAs();
396 if ( str.isEmpty() ) { 405 if ( str.isEmpty() ) {
397 str = entry.company(); 406 str = entry.company();
398 if ( str.isEmpty() ) { 407 if ( str.isEmpty() ) {
399 str = entry.defaultEmail(); 408 str = entry.defaultEmail();
400 } 409 }
401 } 410 }
402 return str; 411 return str;
403} 412}
404 413
405 414
406 415
407void AbTable::resizeRows() { 416void AbTable::resizeRows() {
408 /* 417 /*
409 if (numRows()) { 418 if (numRows()) {
410 for (int i = 0; i < numRows(); i++) { 419 for (int i = 0; i < numRows(); i++) {
411 setRowHeight( i, size ); 420 setRowHeight( i, size );
412 } 421 }
413 } 422 }
414 updateVisible(); 423 updateVisible();
415 */ 424 */
416} 425}
417 426
418 427
419void AbTable::realignTable() 428void AbTable::realignTable()
420{ 429{
421 //qWarning( "void AbTable::realignTable()" ); 430 //qWarning( "void AbTable::realignTable()" );
422 431
423 setPaintingEnabled( FALSE ); 432 setPaintingEnabled( FALSE );
424 433
425 resizeRows(); 434 resizeRows();
426 fitColumns(); 435 fitColumns();
427 436
428 setPaintingEnabled( TRUE ); 437 setPaintingEnabled( TRUE );
429 438
430} 439}
431 440
432 441
433 442
434 443
435#if QT_VERSION <= 230 444#if QT_VERSION <= 230
436#ifndef SINGLE_APP 445#ifndef SINGLE_APP
437void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch ) 446void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch )
438{ 447{
439 // Region of the rect we should draw 448 // Region of the rect we should draw
440 QRegion reg( QRect( cx, cy, cw, ch ) ); 449 QRegion reg( QRect( cx, cy, cw, ch ) );
441 // Subtract the table from it 450 // Subtract the table from it
442 reg = reg.subtract( QRect( QPoint( 0, 0 ), tableSize() ) ); 451 reg = reg.subtract( QRect( QPoint( 0, 0 ), tableSize() ) );
443 // And draw the rectangles (transformed as needed) 452 // And draw the rectangles (transformed as needed)
444 QArray<QRect> r = reg.rects(); 453 QArray<QRect> r = reg.rects();
445 for (unsigned int i=0; i<r.count(); i++) 454 for (unsigned int i=0; i<r.count(); i++)
446 p->fillRect( r[i], colorGroup().brush( QColorGroup::Base ) ); 455 p->fillRect( r[i], colorGroup().brush( QColorGroup::Base ) );
447} 456}
448#endif 457#endif
449#endif 458#endif
450 459
451 460
diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h
index 4e6b294..0f7bc29 100644
--- a/core/pim/addressbook/abtable.h
+++ b/core/pim/addressbook/abtable.h
@@ -1,148 +1,152 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de) 3** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de)
4** 4**
5** This file is part of Qt Palmtop Environment. 5** This file is part of Qt Palmtop Environment.
6** 6**
7** This file may be distributed and/or modified under the terms of the 7** This file may be distributed and/or modified under the terms of the
8** GNU General Public License version 2 as published by the Free Software 8** GNU General Public License version 2 as published by the Free Software
9** Foundation and appearing in the file LICENSE.GPL included in the 9** Foundation and appearing in the file LICENSE.GPL included in the
10** packaging of this file. 10** packaging of this file.
11** 11**
12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14** 14**
15** See http://www.trolltech.com/gpl/ for GPL licensing information. 15** See http://www.trolltech.com/gpl/ for GPL licensing information.
16** 16**
17** Contact info@trolltech.com if any conditions of this licensing are 17** Contact info@trolltech.com if any conditions of this licensing are
18** not clear to you. 18** not clear to you.
19** 19**
20**********************************************************************/ 20**********************************************************************/
21 21
22#ifndef ABTABLE_H 22#ifndef ABTABLE_H
23#define ABTABLE_H 23#define ABTABLE_H
24 24
25#include <qpe/categories.h> 25#include <qpe/categories.h>
26#include <opie/ocontact.h> 26#include <opie/ocontact.h>
27#include <opie/ocontactaccess.h> 27#include <opie/ocontactaccess.h>
28 28
29#include <qmap.h> 29#include <qmap.h>
30#include <qtable.h> 30#include <qtable.h>
31#include <qstringlist.h> 31#include <qstringlist.h>
32#include <qcombobox.h> 32#include <qcombobox.h>
33#include <qpixmap.h> 33#include <qpixmap.h>
34 34
35class AbTableItem : public QTableItem 35class AbTableItem : public QTableItem
36{ 36{
37public: 37public:
38 AbTableItem( QTable *t, EditType et, const QString &s, 38 AbTableItem( QTable *t, EditType et, const QString &s,
39 const QString &secondSortKey); 39 const QString &secondSortKey);
40 QString entryKey() const; 40 QString entryKey() const;
41 void setEntryKey( const QString & k ); 41 void setEntryKey( const QString & k );
42 virtual int alignment() const; 42 virtual int alignment() const;
43 virtual QString key() const; 43 virtual QString key() const;
44 void setItem( const QString &txt, const QString &secondKey ); 44 void setItem( const QString &txt, const QString &secondKey );
45 45
46private: 46private:
47 QString sortKey; 47 QString sortKey;
48}; 48};
49 49
50// This is a simple container, storing all contact 50// This is a simple container, storing all contact
51// information 51// information
52class ContactItem 52class ContactItem
53{ 53{
54 public: 54 public:
55 QPixmap icon; 55 QPixmap icon;
56 QString value; 56 QString value;
57}; 57};
58 58
59class AbPickItem : public QTableItem 59class AbPickItem : public QTableItem
60{ 60{
61public: 61public:
62 AbPickItem( QTable *t ); 62 AbPickItem( QTable *t );
63 63
64 QWidget *createEditor() const; 64 QWidget *createEditor() const;
65 void setContentFromEditor( QWidget *w ); 65 void setContentFromEditor( QWidget *w );
66 66
67private: 67private:
68 QGuardedPtr<QComboBox> cb; 68 QGuardedPtr<QComboBox> cb;
69}; 69};
70 70
71class AbTable : public QTable 71class AbTable : public QTable
72{ 72{
73 Q_OBJECT 73 Q_OBJECT
74 74
75public: 75public:
76 AbTable( const QValueList<int> ordered, QWidget *parent, const char *name=0 ); 76 AbTable( const QValueList<int> ordered, QWidget *parent, const char *name=0 );
77 ~AbTable(); 77 ~AbTable();
78 78
79 // Set the contacts shown in the table 79 // Set the contacts shown in the table
80 void setContacts( const OContactAccess::List& viewList ); 80 void setContacts( const OContactAccess::List& viewList );
81
82 // Set the list for primary contacts
83 void setOrderedList( const QValueList<int> ordered );
84
81 // Selects a contact of a specific UID 85 // Selects a contact of a specific UID
82 bool selectContact( int UID ); 86 bool selectContact( int UID );
83 87
84 // Get the current selected entry 88 // Get the current selected entry
85 OContact currentEntry(); 89 OContact currentEntry();
86 90
87 // Get the UID of the current selected Entry 91 // Get the UID of the current selected Entry
88 int currentEntry_UID(); 92 int currentEntry_UID();
89 93
90 QString findContactName( const OContact &entry ); 94 QString findContactName( const OContact &entry );
91 95
92 void init(); 96 void init();
93 void clear(); 97 void clear();
94 void refresh(); 98 void refresh();
95 99
96 void show(); 100 void show();
97 void setPaintingEnabled( bool e ); 101 void setPaintingEnabled( bool e );
98 void viewportPaintEvent( QPaintEvent* e); 102 void viewportPaintEvent( QPaintEvent* e);
99 void paintCell(QPainter* p, int row, int col, const QRect&, bool ); 103 void paintCell(QPainter* p, int row, int col, const QRect&, bool );
100 104
101 // addresspicker mode (What's that ? se) 105 // addresspicker mode (What's that ? se)
102 void setChoiceNames( const QStringList& list); 106 void setChoiceNames( const QStringList& list);
103 QStringList choiceNames() const; 107 QStringList choiceNames() const;
104 void setChoiceSelection( const QValueList<int>& list ); 108 void setChoiceSelection( const QValueList<int>& list );
105 QStringList choiceSelection(int index) const; 109 QStringList choiceSelection(int index) const;
106 110
107signals: 111signals:
108 void signalSwitch(); 112 void signalSwitch();
109 void signalEditor(); 113 void signalEditor();
110 void signalKeyDown(); 114 void signalKeyDown();
111 void signalKeyUp(); 115 void signalKeyUp();
112 116
113protected: 117protected:
114 virtual void keyPressEvent( QKeyEvent *e ); 118 virtual void keyPressEvent( QKeyEvent *e );
115 119
116// int rowHeight( int ) const; 120// int rowHeight( int ) const;
117// int rowPos( int row ) const; 121// int rowPos( int row ) const;
118// virtual int rowAt( int pos ) const; 122// virtual int rowAt( int pos ) const;
119 123
120 124
121protected slots: 125protected slots:
122 void moveTo( char ); 126 void moveTo( char );
123 virtual void columnClicked( int col ); 127 virtual void columnClicked( int col );
124 void itemClicked(int,int col); 128 void itemClicked(int,int col);
125 void rowHeightChanged( int row ); 129 void rowHeightChanged( int row );
126 130
127private: 131private:
128 void insertIntoTable( const OContact &cnt, int row ); 132 void insertIntoTable( const OContact &cnt, int row );
129 ContactItem findContactContact( const OContact &entry, int row ); 133 ContactItem findContactContact( const OContact &entry, int row );
130 void fitColumns(); 134 void fitColumns();
131 void resizeRows(); 135 void resizeRows();
132 void realignTable(); 136 void realignTable();
133 void resort(); 137 void resort();
134 void updateVisible(); 138 void updateVisible();
135 139
136 int lastSortCol; 140 int lastSortCol;
137 bool asc; 141 bool asc;
138 QMap<AbTableItem*, OContact> contactList; 142 QMap<AbTableItem*, OContact> contactList;
139 QValueList<int> intFields; 143 QValueList<int> intFields;
140 QStringList choicenames; 144 QStringList choicenames;
141 bool enablePainting; 145 bool enablePainting;
142 bool columnVisible; 146 bool columnVisible;
143 int countNested; 147 int countNested;
144 148
145 OContactAccess::List m_viewList; 149 OContactAccess::List m_viewList;
146 150
147}; 151};
148#endif // ABTABLE_H 152#endif // ABTABLE_H
diff --git a/core/pim/addressbook/abview.cpp b/core/pim/addressbook/abview.cpp
index 7da0992..b89b794 100644
--- a/core/pim/addressbook/abview.cpp
+++ b/core/pim/addressbook/abview.cpp
@@ -118,256 +118,260 @@ void AbView::replaceEntry( const OContact &contact )
118{ 118{
119 //qWarning("abview:ReplaceContact"); 119 //qWarning("abview:ReplaceContact");
120 m_contactdb->replace( contact ); 120 m_contactdb->replace( contact );
121 load(); 121 load();
122 122
123} 123}
124 124
125OContact AbView::currentEntry() 125OContact AbView::currentEntry()
126{ 126{
127 OContact currentContact; 127 OContact currentContact;
128 128
129 switch ( (int) m_curr_View ) { 129 switch ( (int) m_curr_View ) {
130 case TableView: 130 case TableView:
131 currentContact = m_abTable -> currentEntry(); 131 currentContact = m_abTable -> currentEntry();
132 break; 132 break;
133 case CardView: 133 case CardView:
134 currentContact = m_ablabel -> currentEntry(); 134 currentContact = m_ablabel -> currentEntry();
135 break; 135 break;
136 } 136 }
137 m_curr_Contact = currentContact.uid(); 137 m_curr_Contact = currentContact.uid();
138 return currentContact; 138 return currentContact;
139} 139}
140 140
141bool AbView::save() 141bool AbView::save()
142{ 142{
143 //qWarning("abView:Save data"); 143 //qWarning("abView:Save data");
144 144
145 return m_contactdb->save(); 145 return m_contactdb->save();
146} 146}
147 147
148void AbView::load() 148void AbView::load()
149{ 149{
150 //qWarning("abView:Load data"); 150 //qWarning("abView:Load data");
151 151
152 // Letter Search is stopped at this place 152 // Letter Search is stopped at this place
153 emit signalClearLetterPicker(); 153 emit signalClearLetterPicker();
154 154
155 if ( m_inPersonal ) 155 if ( m_inPersonal )
156 // VCard Backend does not sort.. 156 // VCard Backend does not sort..
157 m_list = m_contactdb->allRecords(); 157 m_list = m_contactdb->allRecords();
158 else{ 158 else{
159 m_list = m_contactdb->sorted( true, 0, 0, 0 ); 159 m_list = m_contactdb->sorted( true, 0, 0, 0 );
160 clearForCategory(); 160 clearForCategory();
161 } 161 }
162 162
163 //qWarning ("Number of contacts: %d", m_list.count()); 163 //qWarning ("Number of contacts: %d", m_list.count());
164 164
165 updateView( true ); 165 updateView( true );
166 166
167} 167}
168 168
169void AbView::reload() 169void AbView::reload()
170{ 170{
171 //qWarning( "void AbView::reload()" ); 171 //qWarning( "void AbView::reload()" );
172 172
173 m_contactdb->reload(); 173 m_contactdb->reload();
174 load(); 174 load();
175} 175}
176 176
177void AbView::clear() 177void AbView::clear()
178{ 178{
179 // :SX 179 // :SX
180} 180}
181 181
182void AbView::setShowByCategory( const QString& cat ) 182void AbView::setShowByCategory( const QString& cat )
183{ 183{
184 //qWarning("AbView::setShowCategory( const QString& cat )"); 184 //qWarning("AbView::setShowCategory( const QString& cat )");
185 185
186 int intCat = 0; 186 int intCat = 0;
187 187
188 // All (cat == NULL) will be stored as -1 188 // All (cat == NULL) will be stored as -1
189 if ( cat.isNull() ) 189 if ( cat.isNull() )
190 intCat = -1; 190 intCat = -1;
191 else 191 else
192 intCat = mCat.id("Contacts", cat ); 192 intCat = mCat.id("Contacts", cat );
193 193
194 // Just do anything if we really change the category 194 // Just do anything if we really change the category
195 if ( intCat != m_curr_category ){ 195 if ( intCat != m_curr_category ){
196 // qWarning ("Categories: Selected %s.. Number: %d", cat.latin1(), m_curr_category); 196 // qWarning ("Categories: Selected %s.. Number: %d", cat.latin1(), m_curr_category);
197 197
198 m_curr_category = intCat; 198 m_curr_category = intCat;
199 emit signalClearLetterPicker(); 199 emit signalClearLetterPicker();
200 200
201 load(); 201 load();
202 } 202 }
203 203
204} 204}
205 205
206void AbView::setShowToView( Views view ) 206void AbView::setShowToView( Views view )
207{ 207{
208 //qWarning("void AbView::setShowToView( View %d )", view); 208 //qWarning("void AbView::setShowToView( View %d )", view);
209 209
210 //qWarning ("Change the View (Category is: %d)", m_curr_category); 210 //qWarning ("Change the View (Category is: %d)", m_curr_category);
211 211
212 if ( m_curr_View != view ){ 212 if ( m_curr_View != view ){
213 m_prev_View = m_curr_View; 213 m_prev_View = m_curr_View;
214 m_curr_View = view; 214 m_curr_View = view;
215 215
216 updateView(); 216 updateView();
217 } 217 }
218 218
219} 219}
220 220
221void AbView::setShowByLetter( char c ) 221void AbView::setShowByLetter( char c )
222{ 222{
223 //qWarning("void AbView::setShowByLetter( %c )", c ); 223 //qWarning("void AbView::setShowByLetter( %c )", c );
224 OContact query; 224 OContact query;
225 if ( c == 0 ){ 225 if ( c == 0 ){
226 load(); 226 load();
227 return; 227 return;
228 }else{ 228 }else{
229 // If the current Backend is unable to solve the query, we will 229 // If the current Backend is unable to solve the query, we will
230 // ignore the request .. 230 // ignore the request ..
231 if ( ! m_contactdb->hasQuerySettings( OContactAccess::WildCards | OContactAccess::IgnoreCase ) ){ 231 if ( ! m_contactdb->hasQuerySettings( OContactAccess::WildCards | OContactAccess::IgnoreCase ) ){
232 return; 232 return;
233 } 233 }
234 234
235 query.setLastName( QString("%1*").arg(c) ); 235 query.setLastName( QString("%1*").arg(c) );
236 m_list = m_contactdb->queryByExample( query, OContactAccess::WildCards | OContactAccess::IgnoreCase ); 236 m_list = m_contactdb->queryByExample( query, OContactAccess::WildCards | OContactAccess::IgnoreCase );
237 clearForCategory(); 237 clearForCategory();
238 m_curr_Contact = 0; 238 m_curr_Contact = 0;
239 } 239 }
240 updateView( true ); 240 updateView( true );
241} 241}
242 242
243void AbView::setListOrder( const QValueList<int>& ordered ) 243void AbView::setListOrder( const QValueList<int>& ordered )
244{ 244{
245 m_orderedFields = ordered; 245 m_orderedFields = ordered;
246 if ( m_abTable ){
247 m_abTable->setOrderedList( ordered );
248 m_abTable->refresh();
249 }
246 updateView(); 250 updateView();
247} 251}
248 252
249 253
250QString AbView::showCategory() const 254QString AbView::showCategory() const
251{ 255{
252 return mCat.label( "Contacts", m_curr_category ); 256 return mCat.label( "Contacts", m_curr_category );
253} 257}
254 258
255void AbView::showPersonal( bool personal ) 259void AbView::showPersonal( bool personal )
256{ 260{
257 //qWarning ("void AbView::showPersonal( %d )", personal); 261 //qWarning ("void AbView::showPersonal( %d )", personal);
258 262
259 if ( personal ){ 263 if ( personal ){
260 264
261 if ( m_inPersonal ) 265 if ( m_inPersonal )
262 return; 266 return;
263 267
264 // Now switch to vCard Backend and load data. 268 // Now switch to vCard Backend and load data.
265 // The current default backend will be stored 269 // The current default backend will be stored
266 // to avoid unneeded load/stores. 270 // to avoid unneeded load/stores.
267 m_storedDB = m_contactdb; 271 m_storedDB = m_contactdb;
268 272
269 OContactAccessBackend* vcard_backend = new OContactAccessBackend_VCard( QString::null, 273 OContactAccessBackend* vcard_backend = new OContactAccessBackend_VCard( QString::null,
270 addressbookPersonalVCardName() ); 274 addressbookPersonalVCardName() );
271 m_contactdb = new OContactAccess ( "addressbook", QString::null , vcard_backend, true ); 275 m_contactdb = new OContactAccess ( "addressbook", QString::null , vcard_backend, true );
272 276
273 m_inPersonal = true; 277 m_inPersonal = true;
274 m_curr_View = CardView; 278 m_curr_View = CardView;
275 279
276 }else{ 280 }else{
277 281
278 if ( !m_inPersonal ) 282 if ( !m_inPersonal )
279 return; 283 return;
280 284
281 // Remove vCard Backend and restore default 285 // Remove vCard Backend and restore default
282 m_contactdb->save(); 286 m_contactdb->save();
283 delete m_contactdb; 287 delete m_contactdb;
284 288
285 m_contactdb = m_storedDB; 289 m_contactdb = m_storedDB;
286 m_storedDB = 0l; 290 m_storedDB = 0l;
287 291
288 m_curr_View = TableView; 292 m_curr_View = TableView;
289 m_inPersonal = false; 293 m_inPersonal = false;
290 294
291 } 295 }
292 load(); 296 load();
293} 297}
294 298
295QStringList AbView::categories() 299QStringList AbView::categories()
296{ 300{
297 mCat.load( categoryFileName() ); 301 mCat.load( categoryFileName() );
298 QStringList categoryList = mCat.labels( "Contacts" ); 302 QStringList categoryList = mCat.labels( "Contacts" );
299 return categoryList; 303 return categoryList;
300} 304}
301 305
302// BEGIN: Slots 306// BEGIN: Slots
303void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, 307void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp,
304 bool , QString cat ) 308 bool , QString cat )
305{ 309{
306 //qWarning( "void AbView::slotDoFind" ); 310 //qWarning( "void AbView::slotDoFind" );
307 311
308 // We reloading the data: Deselect Letterpicker 312 // We reloading the data: Deselect Letterpicker
309 emit signalClearLetterPicker(); 313 emit signalClearLetterPicker();
310 314
311 // Use the current Category if nothing else selected 315 // Use the current Category if nothing else selected
312 int category = 0; 316 int category = 0;
313 317
314 if ( cat.isEmpty() ) 318 if ( cat.isEmpty() )
315 category = m_curr_category; 319 category = m_curr_category;
316 else{ 320 else{
317 category = mCat.id("Contacts", cat ); 321 category = mCat.id("Contacts", cat );
318 } 322 }
319 323
320 //qWarning ("Find in Category %d", category); 324 //qWarning ("Find in Category %d", category);
321 325
322 QRegExp r( str ); 326 QRegExp r( str );
323 r.setCaseSensitive( caseSensitive ); 327 r.setCaseSensitive( caseSensitive );
324 r.setWildcard( !useRegExp ); 328 r.setWildcard( !useRegExp );
325 329
326 // Get all matching entries out of the database 330 // Get all matching entries out of the database
327 m_list = m_contactdb->matchRegexp( r ); 331 m_list = m_contactdb->matchRegexp( r );
328 332
329 //qWarning( "found: %d", m_list.count() ); 333 //qWarning( "found: %d", m_list.count() );
330 if ( m_list.count() == 0 ){ 334 if ( m_list.count() == 0 ){
331 emit signalNotFound(); 335 emit signalNotFound();
332 return; 336 return;
333 } 337 }
334 338
335 // Now remove all contacts with wrong category (if any selected) 339 // Now remove all contacts with wrong category (if any selected)
336 // This algorithm is a litte bit ineffective, but 340 // This algorithm is a litte bit ineffective, but
337 // we will not have a lot of matching entries.. 341 // we will not have a lot of matching entries..
338 clearForCategory(); 342 clearForCategory();
339 343
340 // Now show all found entries 344 // Now show all found entries
341 updateView( true ); 345 updateView( true );
342} 346}
343 347
344void AbView::offSearch() 348void AbView::offSearch()
345{ 349{
346 m_inSearch = false; 350 m_inSearch = false;
347 351
348 load(); 352 load();
349} 353}
350 354
351void AbView::slotSwitch(){ 355void AbView::slotSwitch(){
352 //qWarning("AbView::slotSwitch()"); 356 //qWarning("AbView::slotSwitch()");
353 357
354 m_prev_View = m_curr_View; 358 m_prev_View = m_curr_View;
355 switch ( (int) m_curr_View ){ 359 switch ( (int) m_curr_View ){
356 case TableView: 360 case TableView:
357 qWarning("Switching to CardView"); 361 qWarning("Switching to CardView");
358 m_curr_View = CardView; 362 m_curr_View = CardView;
359 break; 363 break;
360 case CardView: 364 case CardView:
361 qWarning("Switching to TableView"); 365 qWarning("Switching to TableView");
362 m_curr_View = TableView; 366 m_curr_View = TableView;
363 break; 367 break;
364 } 368 }
365 updateView(); 369 updateView();
366 370
367} 371}
368 372
369// END: Slots 373// END: Slots
370 374
371void AbView::clearForCategory() 375void AbView::clearForCategory()
372{ 376{
373 OContactAccess::List::Iterator it; 377 OContactAccess::List::Iterator it;