summaryrefslogtreecommitdiff
authordrw <drw>2005-03-16 17:45:28 (UTC)
committer drw <drw>2005-03-16 17:45:28 (UTC)
commit44209002d51056e0d198b63463ebc686b41e8cd8 (patch) (unidiff)
treed61069f16d8382959065cf7fe43d4e68ad448daf
parentd16a2a4e0617f21cba0e399dbe5ffa17d76886b9 (diff)
downloadopie-44209002d51056e0d198b63463ebc686b41e8cd8.zip
opie-44209002d51056e0d198b63463ebc686b41e8cd8.tar.gz
opie-44209002d51056e0d198b63463ebc686b41e8cd8.tar.bz2
Fixed: 1. Category handling - all other apps and libopie2 use -1 for unfiled and 0 for all, addressbook flipped them, 2. Letter picker record selection, 3. sort resulting records after letter picker selected them
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/abtable.cpp1
-rw-r--r--core/pim/addressbook/abview.cpp44
-rw-r--r--core/pim/addressbook/addressbook.cpp7
3 files changed, 25 insertions, 27 deletions
diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp
index 0be7d1a..49e66ad 100644
--- a/core/pim/addressbook/abtable.cpp
+++ b/core/pim/addressbook/abtable.cpp
@@ -1,354 +1,353 @@
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#include <opie2/odebug.h> 22#include <opie2/odebug.h>
23#include <opie2/opimrecordlist.h> 23#include <opie2/opimrecordlist.h>
24 24
25#include <qpe/timestring.h> 25#include <qpe/timestring.h>
26#include <qpe/resource.h> 26#include <qpe/resource.h>
27 27
28#include "abtable.h" 28#include "abtable.h"
29 29
30#include <errno.h> 30#include <errno.h>
31#include <fcntl.h> 31#include <fcntl.h>
32#include <unistd.h> 32#include <unistd.h>
33#include <stdlib.h> 33#include <stdlib.h>
34 34
35#include <ctype.h> //toupper() for key hack 35#include <ctype.h> //toupper() for key hack
36 36
37#if 0 37#if 0
38 38
39/*! 39/*!
40 \class AbTableItem abtable.h 40 \class AbTableItem abtable.h
41 41
42 \brief QTableItem based class for showing a field of an entry 42 \brief QTableItem based class for showing a field of an entry
43*/ 43*/
44 44
45AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s, 45AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s,
46 const QString &secondSortKey) 46 const QString &secondSortKey)
47 : QTableItem( t, et, s ) 47 : QTableItem( t, et, s )
48{ 48{
49 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower(); 49 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower();
50 sortKey = Qtopia::buildSortKey( s, secondSortKey ); 50 sortKey = Qtopia::buildSortKey( s, secondSortKey );
51} 51}
52 52
53int AbTableItem::alignment() const 53int AbTableItem::alignment() const
54{ 54{
55 return AlignLeft|AlignVCenter; 55 return AlignLeft|AlignVCenter;
56} 56}
57 57
58QString AbTableItem::key() const 58QString AbTableItem::key() const
59{ 59{
60 return sortKey; 60 return sortKey;
61} 61}
62 62
63// A way to reset the item, without out doing a delete or a new... 63// A way to reset the item, without out doing a delete or a new...
64void AbTableItem::setItem( const QString &txt, const QString &secondKey ) 64void AbTableItem::setItem( const QString &txt, const QString &secondKey )
65{ 65{
66 setText( txt ); 66 setText( txt );
67 sortKey = Qtopia::buildSortKey( txt, secondKey ); 67 sortKey = Qtopia::buildSortKey( txt, secondKey );
68 68
69 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower(); 69 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower();
70} 70}
71 71
72/*! 72/*!
73 \class AbPickItem abtable.h 73 \class AbPickItem abtable.h
74 74
75 \brief QTableItem based class for showing slection of an entry 75 \brief QTableItem based class for showing slection of an entry
76*/ 76*/
77 77
78AbPickItem::AbPickItem( QTable *t ) : 78AbPickItem::AbPickItem( QTable *t ) :
79 QTableItem(t, WhenCurrent, "?") 79 QTableItem(t, WhenCurrent, "?")
80{ 80{
81} 81}
82 82
83QWidget *AbPickItem::createEditor() const 83QWidget *AbPickItem::createEditor() const
84{ 84{
85 QComboBox* combo = new QComboBox( table()->viewport() ); 85 QComboBox* combo = new QComboBox( table()->viewport() );
86 ( (AbPickItem*)this )->cb = combo; 86 ( (AbPickItem*)this )->cb = combo;
87 AbTable* t = static_cast<AbTable*>(table()); 87 AbTable* t = static_cast<AbTable*>(table());
88 QStringList c = t->choiceNames(); 88 QStringList c = t->choiceNames();
89 int cur = 0; 89 int cur = 0;
90 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) { 90 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) {
91 if ( *it == text() ) 91 if ( *it == text() )
92 cur = combo->count(); 92 cur = combo->count();
93 combo->insertItem(*it); 93 combo->insertItem(*it);
94 } 94 }
95 combo->setCurrentItem(cur); 95 combo->setCurrentItem(cur);
96 return combo; 96 return combo;
97} 97}
98 98
99void AbPickItem::setContentFromEditor( QWidget *w ) 99void AbPickItem::setContentFromEditor( QWidget *w )
100{ 100{
101 if ( w->inherits("QComboBox") ) 101 if ( w->inherits("QComboBox") )
102 setText( ( (QComboBox*)w )->currentText() ); 102 setText( ( (QComboBox*)w )->currentText() );
103 else 103 else
104 QTableItem::setContentFromEditor( w ); 104 QTableItem::setContentFromEditor( w );
105} 105}
106 106
107#endif 107#endif
108 108
109/*! 109/*!
110 \class AbTable abtable.h 110 \class AbTable abtable.h
111 111
112 \brief QTable based class for showing a list of entries 112 \brief QTable based class for showing a list of entries
113*/ 113*/
114 114
115AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name ) 115AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name )
116 : QTable( parent, name ), 116 : QTable( parent, name ),
117 lastSortCol( -1 ), 117 lastSortCol( -1 ),
118 asc( TRUE ), 118 asc( TRUE ),
119 intFields( order ), 119 intFields( order ),
120 enablePainting( true ), 120 enablePainting( true ),
121 columnVisible( true ), 121 columnVisible( true ),
122 countNested( 0 ) 122 countNested( 0 )
123{ 123{
124 //odebug << "C'tor start" << oendl; 124 //odebug << "C'tor start" << oendl;
125 setSelectionMode( NoSelection ); 125 setSelectionMode( NoSelection );
126 init(); 126 init();
127 setSorting( TRUE ); 127 setSorting( TRUE );
128 connect( this, SIGNAL(clicked(int,int,int,const QPoint&)), 128 connect( this, SIGNAL(clicked(int,int,int,const QPoint&)),
129 this, SLOT(itemClicked(int,int)) ); 129 this, SLOT(itemClicked(int,int)) );
130 130
131 // contactList.clear(); 131 // contactList.clear();
132 //odebug << "C'tor end" << oendl; 132 //odebug << "C'tor end" << oendl;
133} 133}
134 134
135AbTable::~AbTable() 135AbTable::~AbTable()
136{ 136{
137} 137}
138 138
139void AbTable::init() 139void AbTable::init()
140{ 140{
141 // :SX showChar = '\0'; 141 // :SX showChar = '\0';
142 setNumRows( 0 ); 142 setNumRows( 0 );
143 setNumCols( 2 ); 143 setNumCols( 2 );
144 144
145 horizontalHeader()->setLabel( 0, tr( "Full Name" )); 145 horizontalHeader()->setLabel( 0, tr( "Full Name" ));
146 horizontalHeader()->setLabel( 1, tr( "Contact" )); 146 horizontalHeader()->setLabel( 1, tr( "Contact" ));
147 setLeftMargin( 0 ); 147 setLeftMargin( 0 );
148 verticalHeader()->hide(); 148 verticalHeader()->hide();
149 columnVisible = true; 149 columnVisible = true;
150} 150}
151 151
152void AbTable::setContacts( const Opie::OPimContactAccess::List& viewList ) 152void AbTable::setContacts( const Opie::OPimContactAccess::List& viewList )
153{ 153{
154 odebug << "AbTable::setContacts()" << oendl; 154 odebug << "AbTable::setContacts()" << oendl;
155 155
156 clear(); 156 clear();
157 m_viewList = viewList; 157 m_viewList = viewList;
158 158
159 setSorting( false ); 159 setSorting( false );
160 setPaintingEnabled( FALSE ); 160 setPaintingEnabled( FALSE );
161 161
162 Opie::OPimContactAccess::List::Iterator it;
163 setNumRows( m_viewList.count() ); 162 setNumRows( m_viewList.count() );
164 //int row = 0; 163 //int row = 0;
165 // for ( it = m_viewList.begin(); it != m_viewList.end(); ++it ) 164 // for ( it = m_viewList.begin(); it != m_viewList.end(); ++it )
166 // insertIntoTable( *it, row++ ); 165 // insertIntoTable( *it, row++ );
167 166
168 // setSorting( true ); 167 // setSorting( true );
169 168
170 // resort(); 169 // resort();
171 170
172 updateVisible(); 171 updateVisible();
173 172
174 setPaintingEnabled( TRUE ); 173 setPaintingEnabled( TRUE );
175 174
176} 175}
177 176
178void AbTable::setOrderedList( const QValueList<int> ordered ) 177void AbTable::setOrderedList( const QValueList<int> ordered )
179{ 178{
180 intFields = ordered; 179 intFields = ordered;
181} 180}
182 181
183 182
184bool AbTable::selectContact( int UID ) 183bool AbTable::selectContact( int UID )
185{ 184{
186 odebug << "AbTable::selectContact( " << UID << " )" << oendl; 185 odebug << "AbTable::selectContact( " << UID << " )" << oendl;
187 int rows = numRows(); 186 int rows = numRows();
188 bool found = false; 187 bool found = false;
189 188
190 setPaintingEnabled( FALSE ); 189 setPaintingEnabled( FALSE );
191 odebug << "Search start" << oendl; 190 odebug << "Search start" << oendl;
192 for ( int r = 0; r < rows; ++r ) { 191 for ( int r = 0; r < rows; ++r ) {
193 if ( m_viewList.uidAt( r ) == UID ){ 192 if ( m_viewList.uidAt( r ) == UID ){
194 ensureCellVisible( r, 0 ); 193 ensureCellVisible( r, 0 );
195 setCurrentCell( r, 0 ); 194 setCurrentCell( r, 0 );
196 found = true; 195 found = true;
197 break; 196 break;
198 } 197 }
199 } 198 }
200 odebug << "Search end" << oendl; 199 odebug << "Search end" << oendl;
201 200
202 if ( !found ){ 201 if ( !found ){
203 ensureCellVisible( 0,0 ); 202 ensureCellVisible( 0,0 );
204 setCurrentCell( 0, 0 ); 203 setCurrentCell( 0, 0 );
205 } 204 }
206 205
207 setPaintingEnabled( TRUE ); 206 setPaintingEnabled( TRUE );
208 207
209 return true; 208 return true;
210} 209}
211 210
212#if 0 211#if 0
213void AbTable::insertIntoTable( const Opie::OPimContact& cnt, int row ) 212void AbTable::insertIntoTable( const Opie::OPimContact& cnt, int row )
214{ 213{
215 odebug << "void AbTable::insertIntoTable( const Opie::OPimContact& cnt, " 214 odebug << "void AbTable::insertIntoTable( const Opie::OPimContact& cnt, "
216 << row << " )" << oendl; 215 << row << " )" << oendl;
217 QString strName; 216 QString strName;
218 ContactItem contactItem; 217 ContactItem contactItem;
219 218
220 strName = findContactName( cnt ); 219 strName = findContactName( cnt );
221 contactItem = findContactContact( cnt, row ); 220 contactItem = findContactContact( cnt, row );
222 221
223 AbTableItem *ati; 222 AbTableItem *ati;
224 ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value ); 223 ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value );
225 contactList.insert( ati, cnt ); 224 contactList.insert( ati, cnt );
226 setItem( row, 0, ati ); 225 setItem( row, 0, ati );
227 ati = new AbTableItem( this, QTableItem::Never, contactItem.value, strName); 226 ati = new AbTableItem( this, QTableItem::Never, contactItem.value, strName);
228 if ( !contactItem.icon.isNull() ) 227 if ( !contactItem.icon.isNull() )
229 ati->setPixmap( contactItem.icon ); 228 ati->setPixmap( contactItem.icon );
230 setItem( row, 1, ati ); 229 setItem( row, 1, ati );
231 230
232 //### cannot do this; table only has two columns at this point 231 //### cannot do this; table only has two columns at this point
233 // setItem( row, 2, new AbPickItem( this ) ); 232 // setItem( row, 2, new AbPickItem( this ) );
234 233
235} 234}
236#endif 235#endif
237 236
238 237
239void AbTable::columnClicked( int col ) 238void AbTable::columnClicked( int col )
240{ 239{
241 if ( !sorting() ) 240 if ( !sorting() )
242 return; 241 return;
243 242
244 if ( lastSortCol == -1 ) 243 if ( lastSortCol == -1 )
245 lastSortCol = col; 244 lastSortCol = col;
246 245
247 if ( col == lastSortCol ) { 246 if ( col == lastSortCol ) {
248 asc = !asc; 247 asc = !asc;
249 } else { 248 } else {
250 lastSortCol = col; 249 lastSortCol = col;
251 asc = TRUE; 250 asc = TRUE;
252 } 251 }
253 //QMessageBox::information( this, "resort", "columnClicked" ); 252 //QMessageBox::information( this, "resort", "columnClicked" );
254 resort(); 253 resort();
255} 254}
256 255
257void AbTable::resort() 256void AbTable::resort()
258{ 257{
259 owarn << "void AbTable::resort() NOT POSSIBLE !!" << oendl; 258 owarn << "void AbTable::resort() NOT POSSIBLE !!" << oendl;
260#if 0 259#if 0
261 setPaintingEnabled( FALSE ); 260 setPaintingEnabled( FALSE );
262 if ( sorting() ) { 261 if ( sorting() ) {
263 if ( lastSortCol == -1 ) 262 if ( lastSortCol == -1 )
264 lastSortCol = 0; 263 lastSortCol = 0;
265 sortColumn( lastSortCol, asc, TRUE ); 264 sortColumn( lastSortCol, asc, TRUE );
266 //QMessageBox::information( this, "resort", "resort" ); 265 //QMessageBox::information( this, "resort", "resort" );
267 updateVisible(); 266 updateVisible();
268 } 267 }
269 setPaintingEnabled( TRUE ); 268 setPaintingEnabled( TRUE );
270#endif 269#endif
271} 270}
272 271
273Opie::OPimContact AbTable::currentEntry() 272Opie::OPimContact AbTable::currentEntry()
274{ 273{
275 return m_viewList[currentRow()]; 274 return m_viewList[currentRow()];
276} 275}
277 276
278int AbTable::currentEntry_UID() 277int AbTable::currentEntry_UID()
279{ 278{
280 return ( currentEntry().uid() ); 279 return ( currentEntry().uid() );
281} 280}
282 281
283void AbTable::clear() 282void AbTable::clear()
284{ 283{
285 odebug << "void AbTable::clear()" << oendl; 284 odebug << "void AbTable::clear()" << oendl;
286 // contactList.clear(); 285 // contactList.clear();
287 286
288 setPaintingEnabled( FALSE ); 287 setPaintingEnabled( FALSE );
289 for ( int r = 0; r < numRows(); ++r ) { 288 for ( int r = 0; r < numRows(); ++r ) {
290 for ( int c = 0; c < numCols(); ++c ) { 289 for ( int c = 0; c < numCols(); ++c ) {
291 if ( cellWidget( r, c ) ) 290 if ( cellWidget( r, c ) )
292 clearCellWidget( r, c ); 291 clearCellWidget( r, c );
293 clearCell( r, c ); 292 clearCell( r, c );
294 } 293 }
295 } 294 }
296 setNumRows( 0 ); 295 setNumRows( 0 );
297 setPaintingEnabled( TRUE ); 296 setPaintingEnabled( TRUE );
298} 297}
299 298
300// Refresh updates column 2 if the contactsettings changed 299// Refresh updates column 2 if the contactsettings changed
301void AbTable::refresh() 300void AbTable::refresh()
302{ 301{
303 owarn << "void AbTable::refresh() NOT IMPLEMENTED !!" << oendl; 302 owarn << "void AbTable::refresh() NOT IMPLEMENTED !!" << oendl;
304 303
305#if 0 304#if 0
306 int rows = numRows(); 305 int rows = numRows();
307 AbTableItem *abi; 306 AbTableItem *abi;
308 ContactItem contactItem; 307 ContactItem contactItem;
309 308
310 setPaintingEnabled( FALSE ); 309 setPaintingEnabled( FALSE );
311 for ( int r = 0; r < rows; ++r ) { 310 for ( int r = 0; r < rows; ++r ) {
312 abi = static_cast<AbTableItem*>( item(r, 0) ); 311 abi = static_cast<AbTableItem*>( item(r, 0) );
313 contactItem = findContactContact( contactList[abi], r ); 312 contactItem = findContactContact( contactList[abi], r );
314 static_cast<AbTableItem*>( item(r, 1) )->setItem( contactItem.value, abi->text() ); 313 static_cast<AbTableItem*>( item(r, 1) )->setItem( contactItem.value, abi->text() );
315 if ( !contactItem.icon.isNull() ){ 314 if ( !contactItem.icon.isNull() ){
316 static_cast<AbTableItem*>( item(r, 1) )-> 315 static_cast<AbTableItem*>( item(r, 1) )->
317 setPixmap( contactItem.icon ); 316 setPixmap( contactItem.icon );
318 }else{ 317 }else{
319 static_cast<AbTableItem*>( item(r, 1) )-> 318 static_cast<AbTableItem*>( item(r, 1) )->
320 setPixmap( QPixmap() ); 319 setPixmap( QPixmap() );
321 } 320 }
322 } 321 }
323 resort(); 322 resort();
324 setPaintingEnabled( TRUE ); 323 setPaintingEnabled( TRUE );
325 324
326#endif 325#endif
327} 326}
328 327
329void AbTable::keyPressEvent( QKeyEvent *e ) 328void AbTable::keyPressEvent( QKeyEvent *e )
330{ 329{
331 char key = toupper( e->ascii() ); 330 char key = toupper( e->ascii() );
332 331
333 if ( key >= 'A' && key <= 'Z' ) 332 if ( key >= 'A' && key <= 'Z' )
334 moveTo( key ); 333 moveTo( key );
335 334
336 // odebug << "Received key .." << oendl; 335 // odebug << "Received key .." << oendl;
337 switch( e->key() ) { 336 switch( e->key() ) {
338 case Qt::Key_Space: 337 case Qt::Key_Space:
339 case Qt::Key_Return: 338 case Qt::Key_Return:
340 case Qt::Key_Enter: 339 case Qt::Key_Enter:
341 emit signalSwitch(); 340 emit signalSwitch();
342 break; 341 break;
343 // case Qt::Key_Up: 342 // case Qt::Key_Up:
344 // odebug << "a" << oendl; 343 // odebug << "a" << oendl;
345 // emit signalKeyUp(); 344 // emit signalKeyUp();
346 // break; 345 // break;
347 // case Qt::Key_Down: 346 // case Qt::Key_Down:
348 // odebug << "b" << oendl; 347 // odebug << "b" << oendl;
349 // emit signalKeyDown(); 348 // emit signalKeyDown();
350 // break; 349 // break;
351 default: 350 default:
352 QTable::keyPressEvent( e ); 351 QTable::keyPressEvent( e );
353 } 352 }
354 353
diff --git a/core/pim/addressbook/abview.cpp b/core/pim/addressbook/abview.cpp
index 6be19f8..34035fd 100644
--- a/core/pim/addressbook/abview.cpp
+++ b/core/pim/addressbook/abview.cpp
@@ -1,520 +1,516 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de) 2** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de)
3** 3**
4** This file is part of Qt Palmtop Environment. 4** This file is part of Qt Palmtop Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** 14**
15**********************************************************************/ 15**********************************************************************/
16 16
17#include "abview.h" 17#include "abview.h"
18 18
19#include <opie2/ocontactaccessbackend_vcard.h> 19#include <opie2/ocontactaccessbackend_vcard.h>
20#include <opie2/odebug.h> 20#include <opie2/odebug.h>
21 21
22#include <qpe/global.h> 22#include <qpe/global.h>
23 23
24#include <qlayout.h> 24#include <qlayout.h>
25 25
26#include <assert.h> 26#include <assert.h>
27 27
28 28
29// Is defined in LibQPE 29// Is defined in LibQPE
30extern QString categoryFileName(); 30extern QString categoryFileName();
31 31
32QString addressbookPersonalVCardName() 32QString addressbookPersonalVCardName()
33{ 33{
34 QString filename = Global::applicationFileName("addressbook", 34 QString filename = Global::applicationFileName("addressbook",
35 "businesscard.vcf"); 35 "businesscard.vcf");
36 return filename; 36 return filename;
37} 37}
38 38
39 39
40AbView::AbView ( QWidget* parent, const QValueList<int>& ordered ): 40AbView::AbView ( QWidget* parent, const QValueList<int>& ordered ):
41 QWidget(parent), 41 QWidget(parent),
42 mCat(0), 42 mCat(0),
43 m_inSearch( false ), 43 m_inSearch( false ),
44 m_inPersonal( false ), 44 m_inPersonal( false ),
45 m_curr_category( -1 ), 45 m_curr_category( 0 ),
46 m_curr_View( TableView ), 46 m_curr_View( TableView ),
47 m_prev_View( TableView ), 47 m_prev_View( TableView ),
48 m_curr_Contact ( 0 ), 48 m_curr_Contact ( 0 ),
49 m_contactdb ( 0l ), 49 m_contactdb ( 0l ),
50 m_storedDB ( 0l ), 50 m_storedDB ( 0l ),
51 m_viewStack( 0l ), 51 m_viewStack( 0l ),
52 m_abTable( 0l ), 52 m_abTable( 0l ),
53 m_orderedFields( ordered ) 53 m_orderedFields( ordered )
54{ 54{
55 odebug << "AbView::c'tor" << oendl; 55 odebug << "AbView::c'tor" << oendl;
56 // Load default database and handle syncing myself.. ! 56 // Load default database and handle syncing myself.. !
57 m_contactdb = new Opie::OPimContactAccess ( "addressbook", 0l, 0l, false ); 57 m_contactdb = new Opie::OPimContactAccess ( "addressbook", 0l, 0l, false );
58 m_contactdb -> setReadAhead( 16 ); // Use ReadAhead-Cache if available 58 m_contactdb -> setReadAhead( 16 ); // Use ReadAhead-Cache if available
59 mCat.load( categoryFileName() ); 59 mCat.load( categoryFileName() );
60 60
61 // Create Layout and put WidgetStack into it. 61 // Create Layout and put WidgetStack into it.
62 QVBoxLayout *vb = new QVBoxLayout( this ); 62 QVBoxLayout *vb = new QVBoxLayout( this );
63 m_viewStack = new QWidgetStack( this ); 63 m_viewStack = new QWidgetStack( this );
64 vb->addWidget( m_viewStack ); 64 vb->addWidget( m_viewStack );
65 65
66 // Creat TableView 66 // Creat TableView
67 QVBox* tableBox = new QVBox( m_viewStack ); 67 QVBox* tableBox = new QVBox( m_viewStack );
68 m_abTable = new AbTable( m_orderedFields, tableBox, "table" ); 68 m_abTable = new AbTable( m_orderedFields, tableBox, "table" );
69 m_abTable->setCurrentCell( 0, 0 ); 69 m_abTable->setCurrentCell( 0, 0 );
70 m_abTable->setFocus(); 70 m_abTable->setFocus();
71 71
72 // Add TableView to WidgetStack and raise it 72 // Add TableView to WidgetStack and raise it
73 m_viewStack -> addWidget( tableBox , TableView ); 73 m_viewStack -> addWidget( tableBox , TableView );
74 74
75 // Create CardView and add it to WidgetStack 75 // Create CardView and add it to WidgetStack
76 QVBox* cardBox = new QVBox( m_viewStack ); 76 QVBox* cardBox = new QVBox( m_viewStack );
77 m_ablabel = new AbLabel( cardBox, "CardView"); 77 m_ablabel = new AbLabel( cardBox, "CardView");
78 m_viewStack -> addWidget( cardBox , CardView ); 78 m_viewStack -> addWidget( cardBox , CardView );
79 79
80 // Connect views to me 80 // Connect views to me
81 connect ( m_abTable, SIGNAL( signalSwitch(void) ), 81 connect ( m_abTable, SIGNAL( signalSwitch(void) ),
82 this, SLOT( slotSwitch(void) ) ); 82 this, SLOT( slotSwitch(void) ) );
83 connect ( m_ablabel, SIGNAL( signalOkPressed(void) ), 83 connect ( m_ablabel, SIGNAL( signalOkPressed(void) ),
84 this, SLOT( slotSwitch(void) ) ); 84 this, SLOT( slotSwitch(void) ) );
85 85
86 load(); 86 load();
87} 87}
88 88
89AbView::~AbView() 89AbView::~AbView()
90{ 90{
91 m_contactdb -> save(); 91 m_contactdb -> save();
92 delete m_contactdb; 92 delete m_contactdb;
93 93
94 if ( m_storedDB ){ 94 if ( m_storedDB ){
95 m_storedDB -> save(); 95 m_storedDB -> save();
96 delete m_storedDB; 96 delete m_storedDB;
97 } 97 }
98} 98}
99 99
100 100
101void AbView::setView( Views view ) 101void AbView::setView( Views view )
102{ 102{
103 odebug << "AbView::setView( Views view )" << oendl; 103 odebug << "AbView::setView( Views view )" << oendl;
104 m_curr_View = view; 104 m_curr_View = view;
105 load(); 105 load();
106} 106}
107 107
108void AbView::addEntry( const Opie::OPimContact &newContact ) 108void AbView::addEntry( const Opie::OPimContact &newContact )
109{ 109{
110 odebug << "AbView::AddContact" << oendl; 110 odebug << "AbView::AddContact" << oendl;
111 m_contactdb->add ( newContact ); 111 m_contactdb->add ( newContact );
112 load(); 112 load();
113 113
114} 114}
115void AbView::removeEntry( const int UID ) 115void AbView::removeEntry( const int UID )
116{ 116{
117 odebug << "AbView;:RemoveContact" << oendl; 117 odebug << "AbView;:RemoveContact" << oendl;
118 m_contactdb->remove( UID ); 118 m_contactdb->remove( UID );
119 load(); 119 load();
120} 120}
121 121
122void AbView::replaceEntry( const Opie::OPimContact &contact ) 122void AbView::replaceEntry( const Opie::OPimContact &contact )
123{ 123{
124 odebug << "AbView::ReplaceContact" << oendl; 124 odebug << "AbView::ReplaceContact" << oendl;
125 m_contactdb->replace( contact ); 125 m_contactdb->replace( contact );
126 load(); 126 load();
127 127
128} 128}
129 129
130Opie::OPimContact AbView::currentEntry() 130Opie::OPimContact AbView::currentEntry()
131{ 131{
132 Opie::OPimContact currentContact; 132 Opie::OPimContact currentContact;
133 133
134 switch ( (int) m_curr_View ) { 134 switch ( (int) m_curr_View ) {
135 case TableView: 135 case TableView:
136 currentContact = m_abTable -> currentEntry(); 136 currentContact = m_abTable -> currentEntry();
137 break; 137 break;
138 case CardView: 138 case CardView:
139 currentContact = m_ablabel -> currentEntry(); 139 currentContact = m_ablabel -> currentEntry();
140 break; 140 break;
141 } 141 }
142 m_curr_Contact = currentContact.uid(); 142 m_curr_Contact = currentContact.uid();
143 return currentContact; 143 return currentContact;
144} 144}
145 145
146bool AbView::save() 146bool AbView::save()
147{ 147{
148 //odebug << "AbView::Save data" << oendl; 148 //odebug << "AbView::Save data" << oendl;
149 149
150 return m_contactdb->save(); 150 return m_contactdb->save();
151} 151}
152 152
153void AbView::load() 153void AbView::load()
154{ 154{
155 odebug << "AbView::Load data" << oendl; 155 odebug << "AbView::Load data" << oendl;
156 156
157 // Letter Search is stopped at this place 157 // Letter Search is stopped at this place
158 emit signalClearLetterPicker(); 158 emit signalClearLetterPicker();
159 159
160 if ( m_curr_category == 0 ) { 160 m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName,
161 // Show unfiled 161 Opie::OPimContactAccess::FilterCategory, m_curr_category );
162 m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName, 162
163 Opie::OPimContactAccess::DoNotShowWithCategory, 0 );
164 } elseif ( m_curr_category != -1 ){
165 // Just show selected category
166 m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName,
167 Opie::OPimBase::FilterCategory, m_curr_category );
168 } else {
169 // Show all categories
170 m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName,
171 Opie::OPimBase::FilterOff, 0 );
172 }
173
174 // if ( m_curr_category != -1 ) 163 // if ( m_curr_category != -1 )
175 // clearForCategory(); 164 // clearForCategory();
176 165
177 odebug << "Number of contacts: " << m_list.count() << oendl; 166 odebug << "Number of contacts: " << m_list.count() << oendl;
178 167
179 updateView( true ); 168 updateView( true );
180 169
181} 170}
182 171
183void AbView::reload() 172void AbView::reload()
184{ 173{
185 odebug << "AbView::::reload()" << oendl; 174 odebug << "AbView::::reload()" << oendl;
186 175
187 m_contactdb->reload(); 176 m_contactdb->reload();
188 load(); 177 load();
189} 178}
190 179
191void AbView::clear() 180void AbView::clear()
192{ 181{
193 // :SX 182 // :SX
194} 183}
195 184
196void AbView::setShowByCategory( const QString& cat ) 185void AbView::setShowByCategory( const QString& cat )
197{ 186{
198 odebug << "AbView::setShowCategory( const QString& cat )" << oendl; 187 odebug << "AbView::setShowCategory( const QString& cat )" << oendl;
199 188
200 int intCat = 0; 189 int intCat = 0;
201 190
202 // All (cat == NULL) will be stored as -1 191 // Unfiled will be stored as -1
203 if ( cat.isNull() ) 192 if ( cat == tr( "Unfiled" ) )
204 intCat = -1; 193 intCat = -1;
194 else if ( cat.isNull() )
195 intCat = 0;
205 else 196 else
206 intCat = mCat.id("Contacts", cat ); 197 intCat = mCat.id("Contacts", cat );
207 198
208 // Just do anything if we really change the category 199 // Just do anything if we really change the category
209 if ( intCat != m_curr_category ){ 200 if ( intCat != m_curr_category ){
210 // odebug << "Categories: Selected " << cat << ".. Number: " 201 // odebug << "Categories: Selected " << cat << ".. Number: "
211 // << m_curr_category << oendl; 202 // << m_curr_category << oendl;
212 203
213 m_curr_category = intCat; 204 m_curr_category = intCat;
214 emit signalClearLetterPicker(); 205 emit signalClearLetterPicker();
215
216 load(); 206 load();
217 } 207 }
208 m_curr_category = intCat;
218 209
219} 210}
220 211
221void AbView::setShowToView( Views view ) 212void AbView::setShowToView( Views view )
222{ 213{
223 odebug << "void AbView::setShowToView( View " << view << " )" << oendl; 214 odebug << "void AbView::setShowToView( View " << view << " )" << oendl;
224 215
225 if ( m_curr_View != view ){ 216 if ( m_curr_View != view ){
226 odebug << "Change the View (Category is: " << m_curr_category << ")" << oendl; 217 odebug << "Change the View (Category is: " << m_curr_category << ")" << oendl;
227 m_prev_View = m_curr_View; 218 m_prev_View = m_curr_View;
228 m_curr_View = view; 219 m_curr_View = view;
229 220
230 updateView(); 221 updateView();
231 } 222 }
232 223
233} 224}
234 225
235void AbView::setShowByLetter( char c, AbConfig::LPSearchMode mode ) 226void AbView::setShowByLetter( char c, AbConfig::LPSearchMode mode )
236{ 227{
237 odebug << "void AbView::setShowByLetter( " << c << ", " << mode << " )" << oendl; 228 odebug << "void AbView::setShowByLetter( " << c << ", " << mode << " )" << oendl;
238 229
239 assert( mode < AbConfig::LASTELEMENT ); 230 assert( mode < AbConfig::LASTELEMENT );
240 231
241 Opie::OPimContact query; 232 Opie::OPimContact query;
242 if ( c == 0 ){ 233 if ( c == 0 ){
243 load(); 234 load();
244 return; 235 return;
245 }else{ 236 }else{
246 // If the current Backend is unable to solve the query, we will 237 // If the current Backend is unable to solve the query, we will
247 // ignore the request .. 238 // ignore the request ..
248 if ( ! m_contactdb->hasQuerySettings( Opie::OPimContactAccess::WildCards | 239 if ( ! m_contactdb->hasQuerySettings( Opie::OPimContactAccess::WildCards |
249 Opie::OPimContactAccess::IgnoreCase ) ){ 240 Opie::OPimContactAccess::IgnoreCase ) ){
250 owarn << "Tried to access queryByExample which is not supported by the current backend!!" << oendl; 241 owarn << "Tried to access queryByExample which is not supported by the current backend!!" << oendl;
251 owarn << "I have to ignore this access!" << oendl; 242 owarn << "I have to ignore this access!" << oendl;
252 return; 243 return;
253 } 244 }
254 245
255 switch( mode ){ 246 switch( mode ){
256 case AbConfig::LastName: 247 case AbConfig::LastName:
257 query.setLastName( QString("%1*").arg(c) ); 248 query.setLastName( QString("%1*").arg(c) );
258 break; 249 break;
259 case AbConfig::FileAs: 250 case AbConfig::FileAs:
260 query.setFileAs( QString("%1*").arg(c) ); 251 query.setFileAs( QString("%1*").arg(c) );
261 break; 252 break;
262 default: 253 default:
263 owarn << "Unknown Searchmode for AbView::setShowByLetter ! -> " << mode << oendl 254 owarn << "Unknown Searchmode for AbView::setShowByLetter ! -> " << mode << oendl
264 << "I will ignore it.." << oendl; 255 << "I will ignore it.." << oendl;
265 return; 256 return;
266 } 257 }
267 m_list = m_contactdb->queryByExample( query, Opie::OPimContactAccess::WildCards | Opie::OPimContactAccess::IgnoreCase ); 258 m_list = m_contactdb->queryByExample( query, Opie::OPimContactAccess::WildCards | Opie::OPimContactAccess::IgnoreCase );
268 if ( m_curr_category != -1 ) 259
260 if ( m_curr_category != 0 )
269 clearForCategory(); 261 clearForCategory();
262
263 // Sort filtered results
264 m_list = m_contactdb->sorted( m_list, true, Opie::OPimContactAccess::SortFileAsName,
265 Opie::OPimContactAccess::FilterCategory, m_curr_category );
270 m_curr_Contact = 0; 266 m_curr_Contact = 0;
271 } 267 }
272 updateView( true ); 268 updateView( true );
273} 269}
274 270
275void AbView::setListOrder( const QValueList<int>& ordered ) 271void AbView::setListOrder( const QValueList<int>& ordered )
276{ 272{
277 m_orderedFields = ordered; 273 m_orderedFields = ordered;
278 if ( m_abTable ){ 274 if ( m_abTable ){
279 m_abTable->setOrderedList( ordered ); 275 m_abTable->setOrderedList( ordered );
280 m_abTable->refresh(); 276 m_abTable->refresh();
281 } 277 }
282 updateView(); 278 updateView();
283} 279}
284 280
285 281
286QString AbView::showCategory() const 282QString AbView::showCategory() const
287{ 283{
288 return mCat.label( "Contacts", m_curr_category ); 284 return mCat.label( "Contacts", m_curr_category );
289} 285}
290 286
291void AbView::showPersonal( bool personal ) 287void AbView::showPersonal( bool personal )
292{ 288{
293 odebug << "void AbView::showPersonal( " << personal << " )" << oendl; 289 odebug << "void AbView::showPersonal( " << personal << " )" << oendl;
294 290
295 if ( personal ){ 291 if ( personal ){
296 292
297 if ( m_inPersonal ) 293 if ( m_inPersonal )
298 return; 294 return;
299 295
300 // Now switch to vCard Backend and load data. 296 // Now switch to vCard Backend and load data.
301 // The current default backend will be stored 297 // The current default backend will be stored
302 // to avoid unneeded load/stores. 298 // to avoid unneeded load/stores.
303 m_storedDB = m_contactdb; 299 m_storedDB = m_contactdb;
304 300
305 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, 301 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null,
306 addressbookPersonalVCardName() ); 302 addressbookPersonalVCardName() );
307 m_contactdb = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); 303 m_contactdb = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true );
308 304
309 m_inPersonal = true; 305 m_inPersonal = true;
310 m_curr_View = CardView; 306 m_curr_View = CardView;
311 307
312 }else{ 308 }else{
313 309
314 if ( !m_inPersonal ) 310 if ( !m_inPersonal )
315 return; 311 return;
316 312
317 // Remove vCard Backend and restore default 313 // Remove vCard Backend and restore default
318 m_contactdb->save(); 314 m_contactdb->save();
319 delete m_contactdb; 315 delete m_contactdb;
320 316
321 m_contactdb = m_storedDB; 317 m_contactdb = m_storedDB;
322 m_storedDB = 0l; 318 m_storedDB = 0l;
323 319
324 m_curr_View = TableView; 320 m_curr_View = TableView;
325 m_inPersonal = false; 321 m_inPersonal = false;
326 322
327 } 323 }
328 load(); 324 load();
329} 325}
330 326
331void AbView::setCurrentUid( int uid ){ 327void AbView::setCurrentUid( int uid ){
332 328
333 m_curr_Contact = uid; 329 m_curr_Contact = uid;
334 updateView( true ); //true: Don't modificate the UID ! 330 updateView( true ); //true: Don't modificate the UID !
335} 331}
336 332
337 333
338QStringList AbView::categories() 334QStringList AbView::categories()
339{ 335{
340 mCat.load( categoryFileName() ); 336 mCat.load( categoryFileName() );
341 QStringList categoryList = mCat.labels( "Contacts" ); 337 QStringList categoryList = mCat.labels( "Contacts" );
342 return categoryList; 338 return categoryList;
343} 339}
344 340
345// BEGIN: Slots 341// BEGIN: Slots
346void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, 342void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp,
347 bool , QString cat ) 343 bool , QString cat )
348{ 344{
349 //owarn << "void AbView::slotDoFind" << oendl; 345 //owarn << "void AbView::slotDoFind" << oendl;
350 346
351 // We reloading the data: Deselect Letterpicker 347 // We reloading the data: Deselect Letterpicker
352 emit signalClearLetterPicker(); 348 emit signalClearLetterPicker();
353 349
354 // Use the current Category if nothing else selected 350 // Use the current Category if nothing else selected
355 int category = 0; 351 int category = 0;
356 352
357 if ( cat.isEmpty() ) 353 if ( cat.isEmpty() )
358 category = m_curr_category; 354 category = m_curr_category;
359 else{ 355 else{
360 category = mCat.id("Contacts", cat ); 356 category = mCat.id("Contacts", cat );
361 } 357 }
362 358
363 //odebug << "Find in Category " << category << oendl; 359 //odebug << "Find in Category " << category << oendl;
364 360
365 QRegExp r( str ); 361 QRegExp r( str );
366 r.setCaseSensitive( caseSensitive ); 362 r.setCaseSensitive( caseSensitive );
367 r.setWildcard( !useRegExp ); 363 r.setWildcard( !useRegExp );
368 364
369 // Get all matching entries out of the database 365 // Get all matching entries out of the database
370 m_list = m_contactdb->matchRegexp( r ); 366 m_list = m_contactdb->matchRegexp( r );
371 367
372 //odebug << "Found: " << m_list.count() << oendl; 368 //odebug << "Found: " << m_list.count() << oendl;
373 if ( m_list.count() == 0 ){ 369 if ( m_list.count() == 0 ){
374 emit signalNotFound(); 370 emit signalNotFound();
375 return; 371 return;
376 } 372 }
377 373
378 // Now remove all contacts with wrong category (if any selected) 374 // Now remove all contacts with wrong category (if any selected)
379 // This algorithm is a litte bit ineffective, but 375 // This algorithm is a litte bit ineffective, but
380 // we will not have a lot of matching entries.. 376 // we will not have a lot of matching entries..
381 if ( m_curr_category != -1 ) 377 if ( m_curr_category != 0 )
382 clearForCategory(); 378 clearForCategory();
383 379
384 // Now show all found entries 380 // Now show all found entries
385 updateView( true ); 381 updateView( true );
386} 382}
387 383
388void AbView::offSearch() 384void AbView::offSearch()
389{ 385{
390 m_inSearch = false; 386 m_inSearch = false;
391 387
392 load(); 388 load();
393} 389}
394 390
395void AbView::slotSwitch(){ 391void AbView::slotSwitch(){
396 //odebug << "AbView::slotSwitch()" << oendl; 392 //odebug << "AbView::slotSwitch()" << oendl;
397 393
398 m_prev_View = m_curr_View; 394 m_prev_View = m_curr_View;
399 switch ( (int) m_curr_View ){ 395 switch ( (int) m_curr_View ){
400 case TableView: 396 case TableView:
401 odebug << "Switching to CardView" << oendl; 397 odebug << "Switching to CardView" << oendl;
402 m_curr_View = CardView; 398 m_curr_View = CardView;
403 break; 399 break;
404 case CardView: 400 case CardView:
405 odebug << "Switching to TableView" << oendl; 401 odebug << "Switching to TableView" << oendl;
406 m_curr_View = TableView; 402 m_curr_View = TableView;
407 break; 403 break;
408 } 404 }
409 updateView(); 405 updateView();
410 406
411} 407}
412 408
413// END: Slots 409// END: Slots
414 410
415void AbView::clearForCategory() 411void AbView::clearForCategory()
416{ 412{
417 Opie::OPimContactAccess::List::Iterator it; 413 Opie::OPimContactAccess::List::Iterator it;
418 // Now remove all contacts with wrong category if any category selected 414 // Now remove all contacts with wrong category if any category selected
419 415
420 Opie::OPimContactAccess::List allList = m_list; 416 Opie::OPimContactAccess::List allList = m_list;
421 if ( m_curr_category != -1 ){ 417 if ( m_curr_category != 0 ){
422 for ( it = allList.begin(); it != allList.end(); ++it ){ 418 for ( it = allList.begin(); it != allList.end(); ++it ){
423 if ( !contactCompare( *it, m_curr_category ) ){ 419 if ( !contactCompare( *it, m_curr_category ) ){
424 //odebug << "Removing " << (*it).uid() << oendl; 420 //odebug << "Removing " << (*it).uid() << oendl;
425 m_list.remove( (*it).uid() ); 421 m_list.remove( (*it).uid() );
426 } 422 }
427 } 423 }
428 } 424 }
429 425
430} 426}
431 427
432bool AbView::contactCompare( const Opie::OPimContact &cnt, int category ) 428bool AbView::contactCompare( const Opie::OPimContact &cnt, int category )
433{ 429{
434 //odebug << "bool AbView::contactCompare( const Opie::OPimContact &cnt, " 430 //odebug << "bool AbView::contactCompare( const Opie::OPimContact &cnt, "
435 // << category << " )" << oendl; 431 // << category << " )" << oendl;
436 432
437 bool returnMe; 433 bool returnMe;
438 QArray<int> cats; 434 QArray<int> cats;
439 cats = cnt.categories(); 435 cats = cnt.categories();
440 436
441 //odebug << "Number of categories: " << cats.count() << oendl; 437 //odebug << "Number of categories: " << cats.count() << oendl;
442 438
443 returnMe = false; 439 returnMe = false;
444 if ( cats.count() == 0 && category == 0 ) 440 if ( cats.count() == 0 && category == -1 )
445 // Contacts with no category will just shown on "All" and "Unfiled" 441 // Contacts with no category will just shown on "All" and "Unfiled"
446 returnMe = true; 442 returnMe = true;
447 else { 443 else {
448 int i; 444 int i;
449 for ( i = 0; i < int(cats.count()); i++ ) { 445 for ( i = 0; i < int(cats.count()); i++ ) {
450 //odebug << "Comparing " << cats[i] << " with " << category << oendl; 446 //odebug << "Comparing " << cats[i] << " with " << category << oendl;
451 if ( cats[i] == category ) { 447 if ( cats[i] == category ) {
452 returnMe = true; 448 returnMe = true;
453 break; 449 break;
454 } 450 }
455 } 451 }
456 } 452 }
457 //odebug << "Return: " << returnMe << oendl; 453 //odebug << "Return: " << returnMe << oendl;
458 return returnMe; 454 return returnMe;
459} 455}
460 456
461// In Some rare cases we have to update all lists.. 457// In Some rare cases we have to update all lists..
462void AbView::updateListinViews() 458void AbView::updateListinViews()
463{ 459{
464 m_abTable -> setContacts( m_list ); 460 m_abTable -> setContacts( m_list );
465 m_ablabel -> setContacts( m_list ); 461 m_ablabel -> setContacts( m_list );
466} 462}
467 463
468void AbView::updateView( bool newdata ) 464void AbView::updateView( bool newdata )
469{ 465{
470 //odebug << "AbView::updateView()" << oendl; 466 //odebug << "AbView::updateView()" << oendl;
471 467
472 if ( m_viewStack -> visibleWidget() ){ 468 if ( m_viewStack -> visibleWidget() ){
473 m_viewStack -> visibleWidget() -> clearFocus(); 469 m_viewStack -> visibleWidget() -> clearFocus();
474 } 470 }
475 471
476 // If we switching the view, we have to store some information 472 // If we switching the view, we have to store some information
477 if ( !newdata ){ 473 if ( !newdata ){
478 if ( m_list.count() ){ 474 if ( m_list.count() ){
479 switch ( (int) m_prev_View ) { 475 switch ( (int) m_prev_View ) {
480 case TableView: 476 case TableView:
481 m_curr_Contact = m_abTable -> currentEntry_UID(); 477 m_curr_Contact = m_abTable -> currentEntry_UID();
482 break; 478 break;
483 case CardView: 479 case CardView:
484 m_curr_Contact = m_ablabel -> currentEntry_UID(); 480 m_curr_Contact = m_ablabel -> currentEntry_UID();
485 break; 481 break;
486 } 482 }
487 }else 483 }else
488 m_curr_Contact = 0; 484 m_curr_Contact = 0;
489 } 485 }
490 486
491 // Feed all views with new lists 487 // Feed all views with new lists
492 if ( newdata ) 488 if ( newdata )
493 updateListinViews(); 489 updateListinViews();
494 490
495 // Tell the world that the view is changed 491 // Tell the world that the view is changed
496 if ( m_curr_View != m_prev_View ) 492 if ( m_curr_View != m_prev_View )
497 emit signalViewSwitched ( (int) m_curr_View ); 493 emit signalViewSwitched ( (int) m_curr_View );
498 494
499 m_prev_View = m_curr_View; 495 m_prev_View = m_curr_View;
500 496
501 // Switch to new View 497 // Switch to new View
502 switch ( (int) m_curr_View ) { 498 switch ( (int) m_curr_View ) {
503 case TableView: 499 case TableView:
504 m_abTable -> setChoiceSelection( m_orderedFields ); 500 m_abTable -> setChoiceSelection( m_orderedFields );
505 if ( m_curr_Contact != 0 ) 501 if ( m_curr_Contact != 0 )
506 m_abTable -> selectContact ( m_curr_Contact ); 502 m_abTable -> selectContact ( m_curr_Contact );
507 m_abTable -> setFocus(); 503 m_abTable -> setFocus();
508 break; 504 break;
509 case CardView: 505 case CardView:
510 if ( m_curr_Contact != 0 ) 506 if ( m_curr_Contact != 0 )
511 m_ablabel -> selectContact( m_curr_Contact ); 507 m_ablabel -> selectContact( m_curr_Contact );
512 m_ablabel -> setFocus(); 508 m_ablabel -> setFocus();
513 break; 509 break;
514 } 510 }
515 511
516 // Raise the current View 512 // Raise the current View
517 m_viewStack -> raiseWidget( m_curr_View ); 513 m_viewStack -> raiseWidget( m_curr_View );
518} 514}
519 515
520 516
diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp
index 6984501..faae0a9 100644
--- a/core/pim/addressbook/addressbook.cpp
+++ b/core/pim/addressbook/addressbook.cpp
@@ -665,222 +665,225 @@ void AddressbookWindow::editEntry( EntryMode entryMode )
665 else if ( entryMode == NewEntry ) 665 else if ( entryMode == NewEntry )
666 abEditor->setEntry( entry ); 666 abEditor->setEntry( entry );
667 667
668 // Set the dialog caption 668 // Set the dialog caption
669 if ( m_actionPersonal->isOn() ) 669 if ( m_actionPersonal->isOn() )
670 abEditor->setCaption( tr( "Edit My Personal Details" ) ); 670 abEditor->setCaption( tr( "Edit My Personal Details" ) );
671 else 671 else
672 abEditor->setCaption( tr( "Edit Contact" ) ); 672 abEditor->setCaption( tr( "Edit Contact" ) );
673 673
674 // fix the focus... 674 // fix the focus...
675 abEditor->setNameFocus(); 675 abEditor->setNameFocus();
676 if ( QPEApplication::execDialog( abEditor ) == QDialog::Accepted ) { 676 if ( QPEApplication::execDialog( abEditor ) == QDialog::Accepted ) {
677 setFocus(); 677 setFocus();
678 if ( entryMode == NewEntry ) { 678 if ( entryMode == NewEntry ) {
679 Opie::OPimContact insertEntry = abEditor->entry(); 679 Opie::OPimContact insertEntry = abEditor->entry();
680 insertEntry.assignUid(); 680 insertEntry.assignUid();
681 m_abView -> addEntry( insertEntry ); 681 m_abView -> addEntry( insertEntry );
682 m_abView -> setCurrentUid( insertEntry.uid() ); 682 m_abView -> setCurrentUid( insertEntry.uid() );
683 } else { 683 } else {
684 Opie::OPimContact replEntry = abEditor->entry(); 684 Opie::OPimContact replEntry = abEditor->entry();
685 685
686 if ( !replEntry.isValidUid() ) 686 if ( !replEntry.isValidUid() )
687 replEntry.assignUid(); 687 replEntry.assignUid();
688 688
689 m_abView -> replaceEntry( replEntry ); 689 m_abView -> replaceEntry( replEntry );
690 } 690 }
691 691
692 // Categories might have changed, so reload 692 // Categories might have changed, so reload
693 reloadCategories(); 693 reloadCategories();
694 } 694 }
695} 695}
696 696
697void AddressbookWindow::editPersonal() 697void AddressbookWindow::editPersonal()
698{ 698{
699 Opie::OPimContact entry; 699 Opie::OPimContact entry;
700 700
701 // Switch to personal view if not selected 701 // Switch to personal view if not selected
702 // but take care of the menu, too 702 // but take care of the menu, too
703 if ( ! m_actionPersonal->isOn() ){ 703 if ( ! m_actionPersonal->isOn() ){
704 odebug << "*** ++++" << oendl; 704 odebug << "*** ++++" << oendl;
705 m_actionPersonal->setOn( true ); 705 m_actionPersonal->setOn( true );
706 slotPersonalView(); 706 slotPersonalView();
707 } 707 }
708 708
709 if ( !abEditor ) { 709 if ( !abEditor ) {
710 abEditor = new ContactEditor( entry, this, "editor" ); 710 abEditor = new ContactEditor( entry, this, "editor" );
711 } 711 }
712 712
713 abEditor->setPersonalView( true ); 713 abEditor->setPersonalView( true );
714 editEntry( EditEntry ); 714 editEntry( EditEntry );
715 abEditor->setPersonalView( false ); 715 abEditor->setPersonalView( false );
716 716
717} 717}
718 718
719 719
720void AddressbookWindow::slotPersonalView() 720void AddressbookWindow::slotPersonalView()
721{ 721{
722 odebug << "slotPersonalView()" << oendl; 722 odebug << "slotPersonalView()" << oendl;
723 723
724 bool personal = m_actionPersonal->isOn(); 724 bool personal = m_actionPersonal->isOn();
725 725
726 // Disable actions when showing personal details 726 // Disable actions when showing personal details
727 setItemNewEnabled( !personal ); 727 setItemNewEnabled( !personal );
728 setItemDuplicateEnabled( !personal ); 728 setItemDuplicateEnabled( !personal );
729 setItemDeleteEnabled( !personal ); 729 setItemDeleteEnabled( !personal );
730 m_actionMail->setEnabled( !personal ); 730 m_actionMail->setEnabled( !personal );
731 setShowCategories( !personal ); 731 setShowCategories( !personal );
732 732
733 // Display appropriate view 733 // Display appropriate view
734 m_abView->showPersonal( personal ); 734 m_abView->showPersonal( personal );
735 735
736 if ( personal ) 736 if ( personal )
737 { 737 {
738 setCaption( tr( "Contacts - My Personal Details") ); 738 setCaption( tr( "Contacts - My Personal Details") );
739 739
740 // Set category to 'All' to make sure personal details is visible 740 // Set category to 'All' to make sure personal details is visible
741 setViewCategory( "All" ); 741 setViewCategory( "All" );
742 m_abView->setShowByCategory( "All" ); 742 m_abView->setShowByCategory( "All" );
743 743
744 // Temporarily disable letter picker 744 // Temporarily disable letter picker
745 pLabel->hide(); 745 pLabel->hide();
746 } 746 }
747 else 747 else
748 { 748 {
749 setCaption( tr( "Contacts") ); 749 setCaption( tr( "Contacts") );
750 750
751 // Re-enable letter picker 751 // Re-enable letter picker
752 pLabel->show(); 752 pLabel->show();
753 } 753 }
754} 754}
755 755
756void AddressbookWindow::reload() 756void AddressbookWindow::reload()
757{ 757{
758 syncing = false; 758 syncing = false;
759 m_abView->clear(); 759 m_abView->clear();
760 m_abView->reload(); 760 m_abView->reload();
761} 761}
762 762
763void AddressbookWindow::flush() 763void AddressbookWindow::flush()
764{ 764{
765 syncing = true; 765 syncing = true;
766 m_abView->save(); 766 m_abView->save();
767} 767}
768 768
769 769
770void AddressbookWindow::closeEvent( QCloseEvent *e ) 770void AddressbookWindow::closeEvent( QCloseEvent *e )
771{ 771{
772 if ( active_view == AbView::CardView ) 772 if ( active_view == AbView::CardView )
773 { 773 {
774 if ( !m_actionPersonal->isOn() ) 774 if ( !m_actionPersonal->isOn() )
775 { 775 {
776 // Switch to table view only if not editing personal details 776 // Switch to table view only if not editing personal details
777 slotViewSwitched( AbView::TableView ); 777 slotViewSwitched( AbView::TableView );
778 } 778 }
779 else 779 else
780 { 780 {
781 // If currently editing personal details, switch off personal view 781 // If currently editing personal details, switch off personal view
782 m_actionPersonal->setOn( false ); 782 m_actionPersonal->setOn( false );
783 slotPersonalView(); 783 slotPersonalView();
784 } 784 }
785 785
786 e->ignore(); 786 e->ignore();
787 return; 787 return;
788 } 788 }
789 if(syncing) { 789 if(syncing) {
790 /* shouldn't we save, I hear you say? well its already been set 790 /* shouldn't we save, I hear you say? well its already been set
791 so that an edit can not occur during a sync, and we flushed 791 so that an edit can not occur during a sync, and we flushed
792 at the start of the sync, so there is no need to save 792 at the start of the sync, so there is no need to save
793 Saving however itself would cause problems. */ 793 Saving however itself would cause problems. */
794 e->accept(); 794 e->accept();
795 return; 795 return;
796 } 796 }
797 //################## shouldn't always save 797 //################## shouldn't always save
798 // True, but the database handles this automatically ! (se) 798 // True, but the database handles this automatically ! (se)
799 if ( save() ) 799 if ( save() )
800 e->accept(); 800 e->accept();
801 else 801 else
802 e->ignore(); 802 e->ignore();
803} 803}
804 804
805/* 805/*
806 Returns true if it is OK to exit 806 Returns true if it is OK to exit
807*/ 807*/
808 808
809bool AddressbookWindow::save() 809bool AddressbookWindow::save()
810{ 810{
811 if ( !m_abView->save() ) { 811 if ( !m_abView->save() ) {
812 if ( QMessageBox::critical( 0, tr( "Out of space" ), 812 if ( QMessageBox::critical( 0, tr( "Out of space" ),
813 tr("Unable to save information.\n" 813 tr("Unable to save information.\n"
814 "Free up some space\n" 814 "Free up some space\n"
815 "and try again.\n" 815 "and try again.\n"
816 "\nQuit anyway?"), 816 "\nQuit anyway?"),
817 QMessageBox::Yes|QMessageBox::Escape, 817 QMessageBox::Yes|QMessageBox::Escape,
818 QMessageBox::No|QMessageBox::Default ) 818 QMessageBox::No|QMessageBox::Default )
819 != QMessageBox::No ) 819 != QMessageBox::No )
820 return true; 820 return true;
821 else 821 else
822 return false; 822 return false;
823 } 823 }
824 return true; 824 return true;
825} 825}
826 826
827#ifdef __DEBUG_RELEASE 827#ifdef __DEBUG_RELEASE
828void AddressbookWindow::slotSave() 828void AddressbookWindow::slotSave()
829{ 829{
830 save(); 830 save();
831} 831}
832#endif 832#endif
833 833
834 834
835void AddressbookWindow::slotNotFound() 835void AddressbookWindow::slotNotFound()
836{ 836{
837 odebug << "Got not found signal!" << oendl; 837 odebug << "Got not found signal!" << oendl;
838 QMessageBox::information( this, tr( "Not Found" ), 838 QMessageBox::information( this, tr( "Not Found" ),
839 "<qt>" + tr( "Unable to find a contact for this search pattern!" ) + "</qt>" ); 839 "<qt>" + tr( "Unable to find a contact for this search pattern!" ) + "</qt>" );
840 840
841 841
842} 842}
843void AddressbookWindow::slotWrapAround() 843void AddressbookWindow::slotWrapAround()
844{ 844{
845 odebug << "Got wrap signal!" << oendl; 845 odebug << "Got wrap signal!" << oendl;
846 // if ( doNotifyWrapAround ) 846 // if ( doNotifyWrapAround )
847 // QMessageBox::information( this, tr( "End of list" ), 847 // QMessageBox::information( this, tr( "End of list" ),
848 // tr( "End of list. Wrap around now...!" ) + "\n" ); 848 // tr( "End of list. Wrap around now...!" ) + "\n" );
849 849
850} 850}
851 851
852void AddressbookWindow::slotSetCategory( const QString &category ) 852void AddressbookWindow::slotSetCategory( const QString &category )
853{ 853{
854 odebug << "void AddressbookWindow::slotSetCategory( " << category << " )" << oendl; 854 odebug << "void AddressbookWindow::slotSetCategory( " << category << " )" << oendl;
855 855
856 // Tell the view about the selected category 856 // Tell the view about the selected category
857 m_config.setCategory( category ); 857 QString cat = category;
858 m_abView -> setShowByCategory( category ); 858 if ( cat == tr( "All" ) )
859 cat = QString::null;
860 m_config.setCategory( cat );
861 m_abView -> setShowByCategory( cat );
859} 862}
860 863
861void AddressbookWindow::slotViewSwitched( int view ) 864void AddressbookWindow::slotViewSwitched( int view )
862{ 865{
863 odebug << "void AddressbookWindow::slotViewSwitched( " << view << " )" << oendl; 866 odebug << "void AddressbookWindow::slotViewSwitched( " << view << " )" << oendl;
864 867
865 // Tell the view about the selected view 868 // Tell the view about the selected view
866 m_abView -> setShowToView ( (AbView::Views) view ); 869 m_abView -> setShowToView ( (AbView::Views) view );
867 active_view = view; 870 active_view = view;
868} 871}
869 872
870 873
871void AddressbookWindow::slotListView() 874void AddressbookWindow::slotListView()
872{ 875{
873 slotViewSwitched( AbView::TableView ); 876 slotViewSwitched( AbView::TableView );
874} 877}
875 878
876void AddressbookWindow::slotCardView() 879void AddressbookWindow::slotCardView()
877{ 880{
878 slotViewSwitched( AbView::CardView ); 881 slotViewSwitched( AbView::CardView );
879} 882}
880 883
881void AddressbookWindow::slotSetLetter( char c ) { 884void AddressbookWindow::slotSetLetter( char c ) {
882 885
883 m_abView->setShowByLetter( c, m_config.letterPickerSearch() ); 886 m_abView->setShowByLetter( c, m_config.letterPickerSearch() );
884 887
885} 888}
886 889