summaryrefslogtreecommitdiff
authordwmw2 <dwmw2>2002-05-09 10:59:41 (UTC)
committer dwmw2 <dwmw2>2002-05-09 10:59:41 (UTC)
commitc094cc02af3a6b3f1aaec5ee8de6d377da9b8fe1 (patch) (unidiff)
tree175282ff017c4a7f3503d78268eddd1d7b7349ca
parenta6c915bbd6d77e9c10da9358e381ce03ac9fe5fc (diff)
downloadopie-c094cc02af3a6b3f1aaec5ee8de6d377da9b8fe1.zip
opie-c094cc02af3a6b3f1aaec5ee8de6d377da9b8fe1.tar.gz
opie-c094cc02af3a6b3f1aaec5ee8de6d377da9b8fe1.tar.bz2
#include <qregexp.h>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/abtable.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp
index 124ff6c..e9e6a0b 100644
--- a/core/pim/addressbook/abtable.cpp
+++ b/core/pim/addressbook/abtable.cpp
@@ -1,414 +1,415 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
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** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_CONTACT_MRE 21#define QTOPIA_INTERNAL_CONTACT_MRE
22 22
23#include <qpe/categoryselect.h> 23#include <qpe/categoryselect.h>
24#include <qpe/config.h> 24#include <qpe/config.h>
25#include <qpe/stringutil.h> 25#include <qpe/stringutil.h>
26#include <qpe/qcopenvelope_qws.h> 26#include <qpe/qcopenvelope_qws.h>
27 27
28#include <qasciidict.h> 28#include <qasciidict.h>
29#include <qdatetime.h> 29#include <qdatetime.h>
30#include <qfile.h> 30#include <qfile.h>
31#include <qregexp.h>
31 32
32#include "abtable.h" 33#include "abtable.h"
33 34
34#include <errno.h> 35#include <errno.h>
35#include <fcntl.h> 36#include <fcntl.h>
36#include <unistd.h> 37#include <unistd.h>
37#include <stdlib.h> 38#include <stdlib.h>
38 39
39#include <ctype.h> //toupper() for key hack 40#include <ctype.h> //toupper() for key hack
40 41
41static bool contactCompare( const Contact &cnt, const QRegExp &r, int category ); 42static bool contactCompare( const Contact &cnt, const QRegExp &r, int category );
42 43
43//### qtmail/addresslist.cpp hardcodes this filename as well 44//### qtmail/addresslist.cpp hardcodes this filename as well
44static QString journalFileName() 45static QString journalFileName()
45{ 46{
46 QString str = getenv("HOME"); 47 QString str = getenv("HOME");
47 str +="/.abjournal"; 48 str +="/.abjournal";
48 return str; 49 return str;
49} 50}
50 51
51 52
52 53
53/*! 54/*!
54 \class AbTableItem abtable.h 55 \class AbTableItem abtable.h
55 56
56 \brief QTableItem based class for showing a field of an entry 57 \brief QTableItem based class for showing a field of an entry
57*/ 58*/
58 59
59AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s, 60AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s,
60 const QString &secondSortKey) 61 const QString &secondSortKey)
61 : QTableItem( t, et, s ) 62 : QTableItem( t, et, s )
62{ 63{
63 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower(); 64 // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower();
64 sortKey = Qtopia::buildSortKey( s, secondSortKey ); 65 sortKey = Qtopia::buildSortKey( s, secondSortKey );
65} 66}
66 67
67int AbTableItem::alignment() const 68int AbTableItem::alignment() const
68{ 69{
69 return AlignLeft|AlignVCenter; 70 return AlignLeft|AlignVCenter;
70} 71}
71 72
72QString AbTableItem::key() const 73QString AbTableItem::key() const
73{ 74{
74 return sortKey; 75 return sortKey;
75} 76}
76 77
77// A way to reset the item, without out doing a delete or a new... 78// A way to reset the item, without out doing a delete or a new...
78void AbTableItem::setItem( const QString &txt, const QString &secondKey ) 79void AbTableItem::setItem( const QString &txt, const QString &secondKey )
79{ 80{
80 setText( txt ); 81 setText( txt );
81 sortKey = Qtopia::buildSortKey( txt, secondKey ); 82 sortKey = Qtopia::buildSortKey( txt, secondKey );
82 83
83 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower(); 84 // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower();
84} 85}
85 86
86/*! 87/*!
87 \class AbPickItem abtable.h 88 \class AbPickItem abtable.h
88 89
89 \brief QTableItem based class for showing slection of an entry 90 \brief QTableItem based class for showing slection of an entry
90*/ 91*/
91 92
92AbPickItem::AbPickItem( QTable *t ) : 93AbPickItem::AbPickItem( QTable *t ) :
93 QTableItem(t, WhenCurrent, "?") 94 QTableItem(t, WhenCurrent, "?")
94{ 95{
95} 96}
96 97
97QWidget *AbPickItem::createEditor() const 98QWidget *AbPickItem::createEditor() const
98{ 99{
99 QComboBox* combo = new QComboBox( table()->viewport() ); 100 QComboBox* combo = new QComboBox( table()->viewport() );
100 ( (AbPickItem*)this )->cb = combo; 101 ( (AbPickItem*)this )->cb = combo;
101 AbTable* t = static_cast<AbTable*>(table()); 102 AbTable* t = static_cast<AbTable*>(table());
102 QStringList c = t->choiceNames(); 103 QStringList c = t->choiceNames();
103 int cur = 0; 104 int cur = 0;
104 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) { 105 for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) {
105 if ( *it == text() ) 106 if ( *it == text() )
106 cur = combo->count(); 107 cur = combo->count();
107 combo->insertItem(*it); 108 combo->insertItem(*it);
108 } 109 }
109 combo->setCurrentItem(cur); 110 combo->setCurrentItem(cur);
110 return combo; 111 return combo;
111} 112}
112 113
113void AbPickItem::setContentFromEditor( QWidget *w ) 114void AbPickItem::setContentFromEditor( QWidget *w )
114{ 115{
115 if ( w->inherits("QComboBox") ) 116 if ( w->inherits("QComboBox") )
116 setText( ( (QComboBox*)w )->currentText() ); 117 setText( ( (QComboBox*)w )->currentText() );
117 else 118 else
118 QTableItem::setContentFromEditor( w ); 119 QTableItem::setContentFromEditor( w );
119} 120}
120 121
121/*! 122/*!
122 \class AbTable abtable.h 123 \class AbTable abtable.h
123 124
124 \brief QTable based class for showing a list of entries 125 \brief QTable based class for showing a list of entries
125*/ 126*/
126 127
127AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *name ) 128AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *name )
128// #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR 129// #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR
129// : QTable( 0, 0, parent, name, TRUE ), 130// : QTable( 0, 0, parent, name, TRUE ),
130// #else 131// #else
131 : QTable( parent, name ), 132 : QTable( parent, name ),
132// #endif 133// #endif
133 lastSortCol( -1 ), 134 lastSortCol( -1 ),
134 asc( TRUE ), 135 asc( TRUE ),
135 intFields( order ), 136 intFields( order ),
136 currFindRow( -2 ), 137 currFindRow( -2 ),
137 mCat( 0 ) 138 mCat( 0 )
138{ 139{
139 mCat.load( categoryFileName() ); 140 mCat.load( categoryFileName() );
140 setSelectionMode( NoSelection ); 141 setSelectionMode( NoSelection );
141 init(); 142 init();
142 setSorting( TRUE ); 143 setSorting( TRUE );
143 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), 144 connect( this, SIGNAL(clicked(int,int,int,const QPoint &)),
144 this, SLOT(itemClicked(int,int)) ); 145 this, SLOT(itemClicked(int,int)) );
145} 146}
146 147
147AbTable::~AbTable() 148AbTable::~AbTable()
148{ 149{
149} 150}
150 151
151void AbTable::init() 152void AbTable::init()
152{ 153{
153 showChar = '\0'; 154 showChar = '\0';
154 setNumRows( 0 ); 155 setNumRows( 0 );
155 setNumCols( 2 ); 156 setNumCols( 2 );
156 157
157 horizontalHeader()->setLabel( 0, tr( "Full Name" )); 158 horizontalHeader()->setLabel( 0, tr( "Full Name" ));
158 horizontalHeader()->setLabel( 1, tr( "Contact" )); 159 horizontalHeader()->setLabel( 1, tr( "Contact" ));
159 setLeftMargin( 0 ); 160 setLeftMargin( 0 );
160 verticalHeader()->hide(); 161 verticalHeader()->hide();
161} 162}
162 163
163void AbTable::columnClicked( int col ) 164void AbTable::columnClicked( int col )
164{ 165{
165 if ( !sorting() ) 166 if ( !sorting() )
166 return; 167 return;
167 168
168 if ( lastSortCol == -1 ) 169 if ( lastSortCol == -1 )
169 lastSortCol = col; 170 lastSortCol = col;
170 171
171 if ( col == lastSortCol ) { 172 if ( col == lastSortCol ) {
172 asc = !asc; 173 asc = !asc;
173 } else { 174 } else {
174 lastSortCol = col; 175 lastSortCol = col;
175 asc = TRUE; 176 asc = TRUE;
176 } 177 }
177 resort(); 178 resort();
178} 179}
179 180
180void AbTable::resort() 181void AbTable::resort()
181{ 182{
182 if ( sorting() ) { 183 if ( sorting() ) {
183 if ( lastSortCol == -1 ) 184 if ( lastSortCol == -1 )
184 lastSortCol = 0; 185 lastSortCol = 0;
185 sortColumn( lastSortCol, asc, TRUE ); 186 sortColumn( lastSortCol, asc, TRUE );
186 updateVisible(); 187 updateVisible();
187 } 188 }
188} 189}
189 190
190Contact AbTable::currentEntry() 191Contact AbTable::currentEntry()
191{ 192{
192 Contact cnt; 193 Contact cnt;
193 AbTableItem *abItem; 194 AbTableItem *abItem;
194 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 )); 195 abItem = static_cast<AbTableItem*>(item( currentRow(), 0 ));
195 if ( abItem ) { 196 if ( abItem ) {
196 cnt = contactList[abItem]; 197 cnt = contactList[abItem];
197 } 198 }
198 return cnt; 199 return cnt;
199} 200}
200 201
201void AbTable::replaceCurrentEntry( const Contact &newContact ) 202void AbTable::replaceCurrentEntry( const Contact &newContact )
202{ 203{
203 int row = currentRow(); 204 int row = currentRow();
204 updateJournal( newContact, Contact::ACTION_REPLACE, row ); 205 updateJournal( newContact, Contact::ACTION_REPLACE, row );
205 updateVisible(); 206 updateVisible();
206 207
207 journalFreeReplace( newContact, row ); 208 journalFreeReplace( newContact, row );
208} 209}
209 210
210void AbTable::deleteCurrentEntry() 211void AbTable::deleteCurrentEntry()
211{ 212{
212 int row = currentRow(); 213 int row = currentRow();
213 AbTableItem *abItem; 214 AbTableItem *abItem;
214 abItem = static_cast<AbTableItem*>(item( row, 0 )); 215 abItem = static_cast<AbTableItem*>(item( row, 0 ));
215 Contact oldContact; 216 Contact oldContact;
216 oldContact = contactList[abItem]; 217 oldContact = contactList[abItem];
217 updateJournal( oldContact, Contact::ACTION_REMOVE, row ); 218 updateJournal( oldContact, Contact::ACTION_REMOVE, row );
218 219
219 // a little wasteful, but it ensure's there is only one place 220 // a little wasteful, but it ensure's there is only one place
220 // where we delete. 221 // where we delete.
221 journalFreeRemove( row ); 222 journalFreeRemove( row );
222 updateVisible(); 223 updateVisible();
223 224
224 if ( numRows() == 0 ) 225 if ( numRows() == 0 )
225 emit empty( TRUE ); 226 emit empty( TRUE );
226} 227}
227 228
228void AbTable::clear() 229void AbTable::clear()
229{ 230{
230 contactList.clear(); 231 contactList.clear();
231 for ( int r = 0; r < numRows(); ++r ) { 232 for ( int r = 0; r < numRows(); ++r ) {
232 for ( int c = 0; c < numCols(); ++c ) { 233 for ( int c = 0; c < numCols(); ++c ) {
233 if ( cellWidget( r, c ) ) 234 if ( cellWidget( r, c ) )
234 clearCellWidget( r, c ); 235 clearCellWidget( r, c );
235 clearCell( r, c ); 236 clearCell( r, c );
236 } 237 }
237 } 238 }
238 setNumRows( 0 ); 239 setNumRows( 0 );
239} 240}
240 241
241void AbTable::refresh() 242void AbTable::refresh()
242{ 243{
243 int rows = numRows(); 244 int rows = numRows();
244 QString value; 245 QString value;
245 AbTableItem *abi; 246 AbTableItem *abi;
246 for ( int r = 0; r < rows; ++r ) { 247 for ( int r = 0; r < rows; ++r ) {
247 abi = static_cast<AbTableItem*>( item(r, 0) ); 248 abi = static_cast<AbTableItem*>( item(r, 0) );
248 value = findContactContact( contactList[abi] ); 249 value = findContactContact( contactList[abi] );
249 static_cast<AbTableItem*>( item(r, 1) )->setItem( value, abi->text() ); 250 static_cast<AbTableItem*>( item(r, 1) )->setItem( value, abi->text() );
250 } 251 }
251 resort(); 252 resort();
252} 253}
253 254
254void AbTable::keyPressEvent( QKeyEvent *e ) 255void AbTable::keyPressEvent( QKeyEvent *e )
255{ 256{
256 char key = toupper( e->ascii() ); 257 char key = toupper( e->ascii() );
257 258
258 if ( key >= 'A' && key <= 'Z' ) 259 if ( key >= 'A' && key <= 'Z' )
259 moveTo( key ); 260 moveTo( key );
260 261
261 switch( e->key() ) { 262 switch( e->key() ) {
262 case Qt::Key_Space: 263 case Qt::Key_Space:
263 case Qt::Key_Return: 264 case Qt::Key_Return:
264 case Qt::Key_Enter: 265 case Qt::Key_Enter:
265 emit details(); 266 emit details();
266 break; 267 break;
267 default: 268 default:
268 QTable::keyPressEvent( e ); 269 QTable::keyPressEvent( e );
269 } 270 }
270} 271}
271 272
272void AbTable::moveTo( char c ) 273void AbTable::moveTo( char c )
273{ 274{
274 275
275 int rows = numRows(); 276 int rows = numRows();
276 QString value; 277 QString value;
277 AbTableItem *abi; 278 AbTableItem *abi;
278 int r; 279 int r;
279 if ( asc ) { 280 if ( asc ) {
280 r = 0; 281 r = 0;
281 while ( r < rows-1) { 282 while ( r < rows-1) {
282 abi = static_cast<AbTableItem*>( item(r, 0) ); 283 abi = static_cast<AbTableItem*>( item(r, 0) );
283 QChar first = abi->key()[0]; 284 QChar first = abi->key()[0];
284 //### is there a bug in QChar to char comparison??? 285 //### is there a bug in QChar to char comparison???
285 if ( first.row() || first.cell() >= c ) 286 if ( first.row() || first.cell() >= c )
286 break; 287 break;
287 r++; 288 r++;
288 } 289 }
289 } else { 290 } else {
290 //### should probably disable reverse sorting instead 291 //### should probably disable reverse sorting instead
291 r = rows - 1; 292 r = rows - 1;
292 while ( r > 0 ) { 293 while ( r > 0 ) {
293 abi = static_cast<AbTableItem*>( item(r, 0) ); 294 abi = static_cast<AbTableItem*>( item(r, 0) );
294 QChar first = abi->key()[0]; 295 QChar first = abi->key()[0];
295 //### is there a bug in QChar to char comparison??? 296 //### is there a bug in QChar to char comparison???
296 if ( first.row() || first.cell() >= c ) 297 if ( first.row() || first.cell() >= c )
297 break; 298 break;
298 r--; 299 r--;
299 } 300 }
300 } 301 }
301 setCurrentCell( r, currentColumn() ); 302 setCurrentCell( r, currentColumn() );
302} 303}
303 304
304 305
305QString AbTable::findContactName( const Contact &entry ) 306QString AbTable::findContactName( const Contact &entry )
306{ 307{
307 // We use the fileAs, then company, defaultEmail 308 // We use the fileAs, then company, defaultEmail
308 QString str; 309 QString str;
309 str = entry.fileAs(); 310 str = entry.fileAs();
310 if ( str.isEmpty() ) { 311 if ( str.isEmpty() ) {
311 str = entry.company(); 312 str = entry.company();
312 if ( str.isEmpty() ) { 313 if ( str.isEmpty() ) {
313 str = entry.defaultEmail(); 314 str = entry.defaultEmail();
314 } 315 }
315 } 316 }
316 return str; 317 return str;
317} 318}
318 319
319QString AbTable::findContactContact( const Contact &entry ) 320QString AbTable::findContactContact( const Contact &entry )
320{ 321{
321 QString value; 322 QString value;
322 value = ""; 323 value = "";
323 for ( QValueList<int>::ConstIterator it = intFields->begin(); 324 for ( QValueList<int>::ConstIterator it = intFields->begin();
324 it != intFields->end(); ++it ) { 325 it != intFields->end(); ++it ) {
325 switch ( *it ) { 326 switch ( *it ) {
326 default: 327 default:
327 break; 328 break;
328 case Qtopia::Title: 329 case Qtopia::Title:
329 value = entry.title(); 330 value = entry.title();
330 break; 331 break;
331 case Qtopia::Suffix: 332 case Qtopia::Suffix:
332 value = entry.suffix(); 333 value = entry.suffix();
333 break; 334 break;
334 case Qtopia::FileAs: 335 case Qtopia::FileAs:
335 value = entry.fileAs(); 336 value = entry.fileAs();
336 break; 337 break;
337 case Qtopia::DefaultEmail: 338 case Qtopia::DefaultEmail:
338 value = entry.defaultEmail(); 339 value = entry.defaultEmail();
339 case Qtopia::Emails: 340 case Qtopia::Emails:
340 value = entry.emails(); 341 value = entry.emails();
341 break; 342 break;
342 case Qtopia::HomeStreet: 343 case Qtopia::HomeStreet:
343 value = entry.homeStreet(); 344 value = entry.homeStreet();
344 break; 345 break;
345 case Qtopia::HomeCity: 346 case Qtopia::HomeCity:
346 value = entry.homeCity(); 347 value = entry.homeCity();
347 break; 348 break;
348 case Qtopia::HomeState: 349 case Qtopia::HomeState:
349 value = entry.homeState(); 350 value = entry.homeState();
350 break; 351 break;
351 case Qtopia::HomeZip: 352 case Qtopia::HomeZip:
352 value = entry.homeZip(); 353 value = entry.homeZip();
353 break; 354 break;
354 case Qtopia::HomeCountry: 355 case Qtopia::HomeCountry:
355 value = entry.homeCountry(); 356 value = entry.homeCountry();
356 break; 357 break;
357 case Qtopia::HomePhone: 358 case Qtopia::HomePhone:
358 value = entry.homePhone(); 359 value = entry.homePhone();
359 break; 360 break;
360 case Qtopia::HomeFax: 361 case Qtopia::HomeFax:
361 value = entry.homeFax(); 362 value = entry.homeFax();
362 break; 363 break;
363 case Qtopia::HomeMobile: 364 case Qtopia::HomeMobile:
364 value = entry.homeMobile(); 365 value = entry.homeMobile();
365 break; 366 break;
366 case Qtopia::HomeWebPage: 367 case Qtopia::HomeWebPage:
367 value = entry.homeWebpage(); 368 value = entry.homeWebpage();
368 break; 369 break;
369 case Qtopia::Company: 370 case Qtopia::Company:
370 value = entry.company(); 371 value = entry.company();
371 break; 372 break;
372 case Qtopia::BusinessCity: 373 case Qtopia::BusinessCity:
373 value = entry.businessCity(); 374 value = entry.businessCity();
374 break; 375 break;
375 case Qtopia::BusinessStreet: 376 case Qtopia::BusinessStreet:
376 value = entry.businessStreet(); 377 value = entry.businessStreet();
377 break; 378 break;
378 case Qtopia::BusinessZip: 379 case Qtopia::BusinessZip:
379 value = entry.businessZip(); 380 value = entry.businessZip();
380 break; 381 break;
381 case Qtopia::BusinessCountry: 382 case Qtopia::BusinessCountry:
382 value = entry.businessCountry(); 383 value = entry.businessCountry();
383 break; 384 break;
384 case Qtopia::BusinessWebPage: 385 case Qtopia::BusinessWebPage:
385 value = entry.businessWebpage(); 386 value = entry.businessWebpage();
386 break; 387 break;
387 case Qtopia::JobTitle: 388 case Qtopia::JobTitle:
388 value = entry.jobTitle(); 389 value = entry.jobTitle();
389 break; 390 break;
390 case Qtopia::Department: 391 case Qtopia::Department:
391 value = entry.department(); 392 value = entry.department();
392 break; 393 break;
393 case Qtopia::Office: 394 case Qtopia::Office:
394 value = entry.office(); 395 value = entry.office();
395 break; 396 break;
396 case Qtopia::BusinessPhone: 397 case Qtopia::BusinessPhone:
397 value = entry.businessPhone(); 398 value = entry.businessPhone();
398 break; 399 break;
399 case Qtopia::BusinessFax: 400 case Qtopia::BusinessFax:
400 value = entry.businessFax(); 401 value = entry.businessFax();
401 break; 402 break;
402 case Qtopia::BusinessMobile: 403 case Qtopia::BusinessMobile:
403 value = entry.businessMobile(); 404 value = entry.businessMobile();
404 break; 405 break;
405 case Qtopia::BusinessPager: 406 case Qtopia::BusinessPager:
406 value = entry.businessPager(); 407 value = entry.businessPager();
407 break; 408 break;
408 case Qtopia::Profession: 409 case Qtopia::Profession:
409 value = entry.profession(); 410 value = entry.profession();
410 break; 411 break;
411 case Qtopia::Assistant: 412 case Qtopia::Assistant:
412 value = entry.assistant(); 413 value = entry.assistant();
413 break; 414 break;
414 case Qtopia::Manager: 415 case Qtopia::Manager: