summaryrefslogtreecommitdiff
authordrw <drw>2005-02-07 20:57:24 (UTC)
committer drw <drw>2005-02-07 20:57:24 (UTC)
commit7631c91d6c495a6c60e87a9ab131280f31ee4c87 (patch) (unidiff)
treee28891ee563e7d33fd057e8afac477b0a16cf084
parent9f7017a1a571991763ed53066b64988cefdff07b (diff)
downloadopie-7631c91d6c495a6c60e87a9ab131280f31ee4c87.zip
opie-7631c91d6c495a6c60e87a9ab131280f31ee4c87.tar.gz
opie-7631c91d6c495a6c60e87a9ab131280f31ee4c87.tar.bz2
Implement contact duplication
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/addressbook/addressbook.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp
index 7c52ef2..75e539a 100644
--- a/core/pim/addressbook/addressbook.cpp
+++ b/core/pim/addressbook/addressbook.cpp
@@ -1,871 +1,883 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** Copyright (C) 2003 Stefan Eilers (eilers.stefan@epost.de) 3** Copyright (C) 2003 Stefan Eilers (eilers.stefan@epost.de)
4** 4**
5** This file is part of the Open Palmtop Environment (see www.opie.info). 5** This file is part of the Open Palmtop Environment (see www.opie.info).
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** 17**
18**********************************************************************/ 18**********************************************************************/
19 19
20#define QTOPIA_INTERNAL_FD 20#define QTOPIA_INTERNAL_FD
21 21
22// #include "addresssettings.h" 22// #include "addresssettings.h"
23#include "addressbook.h" 23#include "addressbook.h"
24 24
25#include <opie2/odebug.h> 25#include <opie2/odebug.h>
26#include <opie2/ofileselector.h> 26#include <opie2/ofileselector.h>
27#include <opie2/ofiledialog.h> 27#include <opie2/ofiledialog.h>
28#include <opie2/opimcontact.h> 28#include <opie2/opimcontact.h>
29#include <opie2/ocontactaccessbackend_vcard.h> 29#include <opie2/ocontactaccessbackend_vcard.h>
30 30
31#include <qpe/resource.h> 31#include <qpe/resource.h>
32#include <qpe/ir.h> 32#include <qpe/ir.h>
33#include <qpe/qpemessagebox.h> 33#include <qpe/qpemessagebox.h>
34#include <qmenubar.h> 34#include <qmenubar.h>
35// #include <qtoolbar.h> 35// #include <qtoolbar.h>
36// #include <qmenubar.h> 36// #include <qmenubar.h>
37#include <qpe/qpeapplication.h> 37#include <qpe/qpeapplication.h>
38 38
39#include <qaction.h> 39#include <qaction.h>
40#include <qlayout.h> 40#include <qlayout.h>
41#include <qmessagebox.h> 41#include <qmessagebox.h>
42#include <qtoolbutton.h> 42#include <qtoolbutton.h>
43 43
44#include <stdlib.h> 44#include <stdlib.h>
45#include <sys/stat.h> 45#include <sys/stat.h>
46#include <sys/types.h> 46#include <sys/types.h>
47#include <fcntl.h> 47#include <fcntl.h>
48#include <unistd.h> 48#include <unistd.h>
49 49
50 50
51#include "picker.h" 51#include "picker.h"
52#include "configdlg.h" 52#include "configdlg.h"
53 53
54extern QString addressbookPersonalVCardName(); 54extern QString addressbookPersonalVCardName();
55 55
56AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, 56AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name,
57 WFlags /*f*/ ) 57 WFlags /*f*/ )
58 : Opie::OPimMainWindow( "Addressbook", "Contacts", tr( "Contact" ), "AddressBook", 58 : Opie::OPimMainWindow( "Addressbook", "Contacts", tr( "Contact" ), "AddressBook",
59 parent, name, WType_TopLevel | WStyle_ContextHelp ), 59 parent, name, WType_TopLevel | WStyle_ContextHelp ),
60 abEditor(0l), 60 abEditor(0l),
61 syncing(false) 61 syncing(false)
62{ 62{
63 setCaption( tr( "Contacts" ) ); 63 setCaption( tr( "Contacts" ) );
64 64
65 isLoading = true; 65 isLoading = true;
66 66
67 m_config.load(); 67 m_config.load();
68 68
69 // Create Views 69 // Create Views
70 m_listContainer = new QWidget( this ); 70 m_listContainer = new QWidget( this );
71 QVBoxLayout *vb = new QVBoxLayout( m_listContainer ); 71 QVBoxLayout *vb = new QVBoxLayout( m_listContainer );
72 72
73 m_abView = new AbView( m_listContainer, m_config.orderList() ); 73 m_abView = new AbView( m_listContainer, m_config.orderList() );
74 vb->addWidget( m_abView ); 74 vb->addWidget( m_abView );
75 connect( m_abView, SIGNAL(signalViewSwitched(int)), 75 connect( m_abView, SIGNAL(signalViewSwitched(int)),
76 this, SLOT(slotViewSwitched(int)) ); 76 this, SLOT(slotViewSwitched(int)) );
77 77
78 QObject::connect( m_abView, SIGNAL(signalNotFound()), this, SLOT(slotNotFound()) ); 78 QObject::connect( m_abView, SIGNAL(signalNotFound()), this, SLOT(slotNotFound()) );
79 79
80 // Letter Picker 80 // Letter Picker
81 pLabel = new LetterPicker( m_listContainer ); 81 pLabel = new LetterPicker( m_listContainer );
82 connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); 82 connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char)));
83 connect(m_abView, SIGNAL(signalClearLetterPicker()), pLabel, SLOT(clear()) ); 83 connect(m_abView, SIGNAL(signalClearLetterPicker()), pLabel, SLOT(clear()) );
84 84
85 vb->addWidget( pLabel ); 85 vb->addWidget( pLabel );
86 86
87 // Quick search bar 87 // Quick search bar
88 m_searchBar = new OFloatBar( "Search", this, QMainWindow::Top, true ); 88 m_searchBar = new OFloatBar( "Search", this, QMainWindow::Top, true );
89 m_searchBar->setHorizontalStretchable( true ); 89 m_searchBar->setHorizontalStretchable( true );
90 m_searchBar->hide(); 90 m_searchBar->hide();
91 m_searchEdit = new QLineEdit( m_searchBar, "m_searchEdit" ); 91 m_searchEdit = new QLineEdit( m_searchBar, "m_searchEdit" );
92 92
93 m_searchBar->setStretchableWidget( m_searchEdit ); 93 m_searchBar->setStretchableWidget( m_searchEdit );
94 connect( m_searchEdit, SIGNAL(returnPressed()), this, SLOT(slotFind()) ); 94 connect( m_searchEdit, SIGNAL(returnPressed()), this, SLOT(slotFind()) );
95 95
96 QAction *a = new QAction( tr( "Start Search" ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 ); 96 QAction *a = new QAction( tr( "Start Search" ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 );
97 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); 97 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) );
98 a->addTo( m_searchBar ); 98 a->addTo( m_searchBar );
99 99
100 // Insert Contact menu items 100 // Insert Contact menu items
101 QActionGroup *items = new QActionGroup( this, QString::null, false ); 101 QActionGroup *items = new QActionGroup( this, QString::null, false );
102 102
103 m_actionMail = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "addressbook/sendmail" ), 103 m_actionMail = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "addressbook/sendmail" ),
104 QString::null, 0, items, 0 ); 104 QString::null, 0, items, 0 );
105 connect( m_actionMail, SIGNAL(activated()), this, SLOT(writeMail()) ); 105 connect( m_actionMail, SIGNAL(activated()), this, SLOT(writeMail()) );
106 106
107 a = new QAction( tr("Import vCard"), Resource::loadPixmap( "addressbook/fileimport"), 107 a = new QAction( tr("Import vCard"), Resource::loadPixmap( "addressbook/fileimport"),
108 QString::null, 0, items, 0 ); 108 QString::null, 0, items, 0 );
109 connect( a, SIGNAL(activated()), this, SLOT(importvCard()) ); 109 connect( a, SIGNAL(activated()), this, SLOT(importvCard()) );
110 110
111 a = new QAction( tr("Export vCard"), Resource::loadPixmap( "addressbook/fileexport"), 111 a = new QAction( tr("Export vCard"), Resource::loadPixmap( "addressbook/fileexport"),
112 QString::null, 0, items, 0 ); 112 QString::null, 0, items, 0 );
113 connect( a, SIGNAL(activated()), this, SLOT(exportvCard()) ); 113 connect( a, SIGNAL(activated()), this, SLOT(exportvCard()) );
114 114
115 m_actionPersonal = new QAction( tr("My Personal Details"), Resource::loadPixmap( "addressbook/identity" ), 115 m_actionPersonal = new QAction( tr("My Personal Details"), Resource::loadPixmap( "addressbook/identity" ),
116 QString::null, 0, items, 0 , true ); 116 QString::null, 0, items, 0 , true );
117 connect( m_actionPersonal, SIGNAL(activated()), this, SLOT(slotPersonalView()) ); 117 connect( m_actionPersonal, SIGNAL(activated()), this, SLOT(slotPersonalView()) );
118 118
119 insertItemMenuItems( items ); 119 insertItemMenuItems( items );
120 120
121 // Insert View menu items 121 // Insert View menu items
122 items = new QActionGroup( this, QString::null, false ); 122 items = new QActionGroup( this, QString::null, false );
123 123
124 a = new QAction( tr("Show quick search bar"),QString::null, 0, items, 0, true ); 124 a = new QAction( tr("Show quick search bar"),QString::null, 0, items, 0, true );
125 connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowFind(bool)) ); 125 connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowFind(bool)) );
126 126
127 insertViewMenuItems( items ); 127 insertViewMenuItems( items );
128 128
129 // Fontsize 129 // Fontsize
130 defaultFont = new QFont( m_abView->font() ); 130 defaultFont = new QFont( m_abView->font() );
131 slotSetFont(m_config.fontSize()); 131 slotSetFont(m_config.fontSize());
132 m_curFontSize = m_config.fontSize(); 132 m_curFontSize = m_config.fontSize();
133 133
134 setCentralWidget(m_listContainer); 134 setCentralWidget(m_listContainer);
135 135
136 //odebug << "adressbook contrsuction: t=" << t.elapsed() << oendl; 136 //odebug << "adressbook contrsuction: t=" << t.elapsed() << oendl;
137 connect( qApp, SIGNAL(flush()), this, SLOT(flush()) ); 137 connect( qApp, SIGNAL(flush()), this, SLOT(flush()) );
138 connect( qApp, SIGNAL(reload()), this, SLOT(reload()) ); 138 connect( qApp, SIGNAL(reload()), this, SLOT(reload()) );
139 connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), 139 connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)),
140 this, SLOT(appMessage(const QCString&,const QByteArray&)) ); 140 this, SLOT(appMessage(const QCString&,const QByteArray&)) );
141 141
142 isLoading = false; 142 isLoading = false;
143 143
144 // Handle category selection 144 // Handle category selection
145 setViewCategory( m_config.category() ); 145 setViewCategory( m_config.category() );
146 m_abView->setShowByCategory( m_config.category() ); 146 m_abView->setShowByCategory( m_config.category() );
147 connect( this, SIGNAL(categorySelected(const QString&)), 147 connect( this, SIGNAL(categorySelected(const QString&)),
148 this, SLOT(slotSetCategory(const QString&)) ); 148 this, SLOT(slotSetCategory(const QString&)) );
149} 149}
150 150
151void AddressbookWindow::slotSetFont( int size ) 151void AddressbookWindow::slotSetFont( int size )
152{ 152{
153 odebug << "void AddressbookWindow::slotSetFont( " << size << " )" << oendl; 153 odebug << "void AddressbookWindow::slotSetFont( " << size << " )" << oendl;
154 154
155 if (size > 2 || size < 0) 155 if (size > 2 || size < 0)
156 size = 1; 156 size = 1;
157 157
158 m_config.setFontSize( size ); 158 m_config.setFontSize( size );
159 159
160 QFont *currentFont; 160 QFont *currentFont;
161 161
162 switch (size) { 162 switch (size) {
163 case 0: 163 case 0:
164 m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) ); 164 m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) );
165 currentFont = new QFont (m_abView->font()); 165 currentFont = new QFont (m_abView->font());
166 // abList->resizeRows(currentFont->pixelSize() + 7); :SX 166 // abList->resizeRows(currentFont->pixelSize() + 7); :SX
167 // abList->resizeRows(); 167 // abList->resizeRows();
168 break; 168 break;
169 case 1: 169 case 1:
170 m_abView->setFont( *defaultFont ); 170 m_abView->setFont( *defaultFont );
171 currentFont = new QFont (m_abView->font()); 171 currentFont = new QFont (m_abView->font());
172 // // abList->resizeRows(currentFont->pixelSize() + 7); 172 // // abList->resizeRows(currentFont->pixelSize() + 7);
173 // abList->resizeRows(); 173 // abList->resizeRows();
174 break; 174 break;
175 case 2: 175 case 2:
176 m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) ); 176 m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) );
177 currentFont = new QFont (m_abView->font()); 177 currentFont = new QFont (m_abView->font());
178 // //abList->resizeRows(currentFont->pixelSize() + 7); 178 // //abList->resizeRows(currentFont->pixelSize() + 7);
179 // abList->resizeRows(); 179 // abList->resizeRows();
180 break; 180 break;
181 } 181 }
182} 182}
183 183
184 184
185 185
186void AddressbookWindow::importvCard() { 186void AddressbookWindow::importvCard() {
187 QString str = Opie::Ui::OFileDialog::getOpenFileName( 1,"/");//,"", "*", this ); 187 QString str = Opie::Ui::OFileDialog::getOpenFileName( 1,"/");//,"", "*", this );
188 if(!str.isEmpty() ){ 188 if(!str.isEmpty() ){
189 setDocument((const QString&) str ); 189 setDocument((const QString&) str );
190 } 190 }
191 191
192} 192}
193void AddressbookWindow::exportvCard() 193void AddressbookWindow::exportvCard()
194{ 194{
195 odebug << "void AddressbookWindow::exportvCard()" << oendl; 195 odebug << "void AddressbookWindow::exportvCard()" << oendl;
196 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 1,"/home/"); //,"", "*", this ); 196 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 1,"/home/"); //,"", "*", this );
197 if( !filename.isEmpty() && ( filename[filename.length()-1] != '/' ) ){ 197 if( !filename.isEmpty() && ( filename[filename.length()-1] != '/' ) ){
198 odebug << " Save to file " << filename << ", (" << filename.length()-1 << ")" << oendl; 198 odebug << " Save to file " << filename << ", (" << filename.length()-1 << ")" << oendl;
199 Opie::OPimContact curCont = m_abView->currentEntry(); 199 Opie::OPimContact curCont = m_abView->currentEntry();
200 if ( !curCont.isEmpty() ){ 200 if ( !curCont.isEmpty() ){
201 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, 201 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null,
202 filename ); 202 filename );
203 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook_exp", QString::null , vcard_backend, true ); 203 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook_exp", QString::null , vcard_backend, true );
204 if ( access ){ 204 if ( access ){
205 access->add( curCont ); 205 access->add( curCont );
206 access->save(); 206 access->save();
207 } 207 }
208 delete access; 208 delete access;
209 }else 209 }else
210 QMessageBox::critical( 0, "Export VCard", 210 QMessageBox::critical( 0, "Export VCard",
211 QString( tr( "You have to select a contact !") ) ); 211 QString( tr( "You have to select a contact !") ) );
212 212
213 }else 213 }else
214 QMessageBox::critical( 0, "Export VCard", 214 QMessageBox::critical( 0, "Export VCard",
215 QString( tr( "You have to set a filename !") ) ); 215 QString( tr( "You have to set a filename !") ) );
216} 216}
217 217
218void AddressbookWindow::setDocument( const QString &filename ) 218void AddressbookWindow::setDocument( const QString &filename )
219{ 219{
220 odebug << "void AddressbookWindow::setDocument( " << filename << " )" << oendl; 220 odebug << "void AddressbookWindow::setDocument( " << filename << " )" << oendl;
221 221
222 // Switch to default backend. This should avoid to import into 222 // Switch to default backend. This should avoid to import into
223 // the personal database accidently. 223 // the personal database accidently.
224 if ( m_actionPersonal->isOn() ){ 224 if ( m_actionPersonal->isOn() ){
225 m_actionPersonal->setOn( false ); 225 m_actionPersonal->setOn( false );
226 slotPersonalView(); 226 slotPersonalView();
227 } 227 }
228 228
229 if ( filename.find(".vcf") != int(filename.length()) - 4 ){ 229 if ( filename.find(".vcf") != int(filename.length()) - 4 ){
230 230
231 231
232 232
233 switch( QMessageBox::information( this, tr ( "Right file type ?" ), 233 switch( QMessageBox::information( this, tr ( "Right file type ?" ),
234 tr( "The selected file \n does not end with \".vcf\".\n Do you really want to open it?" ), 234 tr( "The selected file \n does not end with \".vcf\".\n Do you really want to open it?" ),
235 tr( "&Yes" ), tr( "&No" ), QString::null, 235 tr( "&Yes" ), tr( "&No" ), QString::null,
236 0, // Enter == button 0 236 0, // Enter == button 0
237 2 ) ) { // Escape == button 2 237 2 ) ) { // Escape == button 2
238 case 0: 238 case 0:
239 odebug << "YES clicked" << oendl; 239 odebug << "YES clicked" << oendl;
240 break; 240 break;
241 case 1: 241 case 1:
242 odebug << "NO clicked" << oendl; 242 odebug << "NO clicked" << oendl;
243 return; 243 return;
244 break; 244 break;
245 } 245 }
246 } 246 }
247 247
248 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, 248 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null,
249 filename ); 249 filename );
250 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); 250 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true );
251 Opie::OPimContactAccess::List allList = access->allRecords(); 251 Opie::OPimContactAccess::List allList = access->allRecords();
252 odebug << "Found number of contacts in File: " << allList.count() << oendl; 252 odebug << "Found number of contacts in File: " << allList.count() << oendl;
253 253
254 if ( !allList.count() ) { 254 if ( !allList.count() ) {
255 QMessageBox::information( this, "Import VCard", 255 QMessageBox::information( this, "Import VCard",
256 "It was impossible to import\nthe VCard.\n" 256 "It was impossible to import\nthe VCard.\n"
257 "The VCard may be corrupted!" ); 257 "The VCard may be corrupted!" );
258 } 258 }
259 259
260 bool doAsk = true; 260 bool doAsk = true;
261 Opie::OPimContactAccess::List::Iterator it; 261 Opie::OPimContactAccess::List::Iterator it;
262 for ( it = allList.begin(); it != allList.end(); ++it ){ 262 for ( it = allList.begin(); it != allList.end(); ++it ){
263 odebug << "Adding Contact from: " << (*it).fullName() << oendl; 263 odebug << "Adding Contact from: " << (*it).fullName() << oendl;
264 if ( doAsk ){ 264 if ( doAsk ){
265 switch( QMessageBox::information( this, tr ( "Add Contact?" ), 265 switch( QMessageBox::information( this, tr ( "Add Contact?" ),
266 tr( "Do you really want add contact for \n%1?" ) 266 tr( "Do you really want add contact for \n%1?" )
267 .arg( (*it).fullName().latin1() ), 267 .arg( (*it).fullName().latin1() ),
268 tr( "&Yes" ), tr( "&No" ), tr( "&All Yes"), 268 tr( "&Yes" ), tr( "&No" ), tr( "&All Yes"),
269 0, // Enter == button 0 269 0, // Enter == button 0
270 2 ) ) { // Escape == button 2 270 2 ) ) { // Escape == button 2
271 case 0: 271 case 0:
272 odebug << "YES clicked" << oendl; 272 odebug << "YES clicked" << oendl;
273 m_abView->addEntry( *it ); 273 m_abView->addEntry( *it );
274 break; 274 break;
275 case 1: 275 case 1:
276 odebug << "NO clicked" << oendl; 276 odebug << "NO clicked" << oendl;
277 break; 277 break;
278 case 2: 278 case 2:
279 odebug << "YesAll clicked" << oendl; 279 odebug << "YesAll clicked" << oendl;
280 doAsk = false; 280 doAsk = false;
281 break; 281 break;
282 } 282 }
283 }else 283 }else
284 m_abView->addEntry( *it ); 284 m_abView->addEntry( *it );
285 285
286 } 286 }
287 287
288 delete access; 288 delete access;
289} 289}
290 290
291void AddressbookWindow::resizeEvent( QResizeEvent *e ) 291void AddressbookWindow::resizeEvent( QResizeEvent *e )
292{ 292{
293 QMainWindow::resizeEvent( e ); 293 QMainWindow::resizeEvent( e );
294 294
295 295
296} 296}
297 297
298AddressbookWindow::~AddressbookWindow() 298AddressbookWindow::~AddressbookWindow()
299{ 299{
300 ToolBarDock dock; 300 ToolBarDock dock;
301 int dummy; 301 int dummy;
302 bool bDummy; 302 bool bDummy;
303 getLocation ( listTools, dock, dummy, bDummy, dummy ); 303 getLocation ( listTools, dock, dummy, bDummy, dummy );
304 m_config.setToolBarDock( dock ); 304 m_config.setToolBarDock( dock );
305 m_config.save(); 305 m_config.save();
306} 306}
307 307
308int AddressbookWindow::create() 308int AddressbookWindow::create()
309{ 309{
310 return 0; 310 return 0;
311} 311}
312 312
313bool AddressbookWindow::remove( int /*uid*/ ) 313bool AddressbookWindow::remove( int /*uid*/ )
314{ 314{
315 return false; 315 return false;
316} 316}
317 317
318void AddressbookWindow::beam( int /*uid*/ ) 318void AddressbookWindow::beam( int /*uid*/ )
319{ 319{
320} 320}
321 321
322void AddressbookWindow::show( int /*uid*/ ) 322void AddressbookWindow::show( int /*uid*/ )
323{ 323{
324} 324}
325 325
326void AddressbookWindow::edit( int /*uid*/ ) 326void AddressbookWindow::edit( int /*uid*/ )
327{ 327{
328} 328}
329 329
330void AddressbookWindow::add( const Opie::OPimRecord& ) 330void AddressbookWindow::add( const Opie::OPimRecord& )
331{ 331{
332} 332}
333 333
334void AddressbookWindow::slotItemNew() 334void AddressbookWindow::slotItemNew()
335{ 335{
336 Opie::OPimContact cnt; 336 Opie::OPimContact cnt;
337 if( !syncing ) { 337 if( !syncing ) {
338 editEntry( NewEntry ); 338 editEntry( NewEntry );
339 } else { 339 } else {
340 QMessageBox::warning(this, tr("Contacts"), 340 QMessageBox::warning(this, tr("Contacts"),
341 tr("Can not edit data, currently syncing")); 341 tr("Can not edit data, currently syncing"));
342 } 342 }
343} 343}
344 344
345void AddressbookWindow::slotItemEdit() 345void AddressbookWindow::slotItemEdit()
346{ 346{
347 if(!syncing) { 347 if(!syncing) {
348 if (m_actionPersonal->isOn()) { 348 if (m_actionPersonal->isOn()) {
349 editPersonal(); 349 editPersonal();
350 } else { 350 } else {
351 editEntry( EditEntry ); 351 editEntry( EditEntry );
352 } 352 }
353 } else { 353 } else {
354 QMessageBox::warning( this, tr("Contacts"), 354 QMessageBox::warning( this, tr("Contacts"),
355 tr("Can not edit data, currently syncing") ); 355 tr("Can not edit data, currently syncing") );
356 } 356 }
357} 357}
358 358
359void AddressbookWindow::slotItemDuplicate() 359void AddressbookWindow::slotItemDuplicate()
360{ 360{
361 if(!syncing)
362 {
363 Opie::OPimContact entry = m_abView->currentEntry();
364 entry.assignUid();
365 m_abView->addEntry( entry );
366 m_abView->setCurrentUid( entry.uid() );
367 }
368 else
369 {
370 QMessageBox::warning( this, tr("Contacts"),
371 tr("Can not edit data, currently syncing") );
372 }
361} 373}
362 374
363void AddressbookWindow::slotItemDelete() 375void AddressbookWindow::slotItemDelete()
364{ 376{
365 if(!syncing) { 377 if(!syncing) {
366 Opie::OPimContact tmpEntry = m_abView ->currentEntry(); 378 Opie::OPimContact tmpEntry = m_abView ->currentEntry();
367 379
368 // get a name, do the best we can... 380 // get a name, do the best we can...
369 QString strName = tmpEntry.fullName(); 381 QString strName = tmpEntry.fullName();
370 if ( strName.isEmpty() ) { 382 if ( strName.isEmpty() ) {
371 strName = tmpEntry.company(); 383 strName = tmpEntry.company();
372 if ( strName.isEmpty() ) 384 if ( strName.isEmpty() )
373 strName = "No Name"; 385 strName = "No Name";
374 } 386 }
375 387
376 388
377 if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ), 389 if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ),
378 strName ) ) { 390 strName ) ) {
379 m_abView->removeEntry( tmpEntry.uid() ); 391 m_abView->removeEntry( tmpEntry.uid() );
380 } 392 }
381 } else { 393 } else {
382 QMessageBox::warning( this, tr("Contacts"), 394 QMessageBox::warning( this, tr("Contacts"),
383 tr("Can not edit data, currently syncing") ); 395 tr("Can not edit data, currently syncing") );
384 } 396 }
385} 397}
386 398
387static const char * beamfile = "/tmp/obex/contact.vcf"; 399static const char * beamfile = "/tmp/obex/contact.vcf";
388 400
389void AddressbookWindow::slotItemBeam() 401void AddressbookWindow::slotItemBeam()
390{ 402{
391 QString beamFilename; 403 QString beamFilename;
392 Opie::OPimContact c; 404 Opie::OPimContact c;
393 if ( m_actionPersonal->isOn() ) { 405 if ( m_actionPersonal->isOn() ) {
394 beamFilename = addressbookPersonalVCardName(); 406 beamFilename = addressbookPersonalVCardName();
395 if ( !QFile::exists( beamFilename ) ) 407 if ( !QFile::exists( beamFilename ) )
396 return; // can't beam a non-existent file 408 return; // can't beam a non-existent file
397 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, 409 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null,
398 beamFilename ); 410 beamFilename );
399 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); 411 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true );
400 Opie::OPimContactAccess::List allList = access->allRecords(); 412 Opie::OPimContactAccess::List allList = access->allRecords();
401 Opie::OPimContactAccess::List::Iterator it = allList.begin(); // Just take first 413 Opie::OPimContactAccess::List::Iterator it = allList.begin(); // Just take first
402 c = *it; 414 c = *it;
403 415
404 delete access; 416 delete access;
405 } else { 417 } else {
406 unlink( beamfile ); // delete if exists 418 unlink( beamfile ); // delete if exists
407 mkdir("/tmp/obex/", 0755); 419 mkdir("/tmp/obex/", 0755);
408 c = m_abView -> currentEntry(); 420 c = m_abView -> currentEntry();
409 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, 421 Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null,
410 beamfile ); 422 beamfile );
411 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); 423 Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true );
412 access->add( c ); 424 access->add( c );
413 access->save(); 425 access->save();
414 delete access; 426 delete access;
415 427
416 beamFilename = beamfile; 428 beamFilename = beamfile;
417 } 429 }
418 430
419 odebug << "Beaming: " << beamFilename << oendl; 431 odebug << "Beaming: " << beamFilename << oendl;
420 432
421 Ir *ir = new Ir( this ); 433 Ir *ir = new Ir( this );
422 connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); 434 connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) );
423 QString description = c.fullName(); 435 QString description = c.fullName();
424 ir->send( beamFilename, description, "text/x-vCard" ); 436 ir->send( beamFilename, description, "text/x-vCard" );
425} 437}
426 438
427void AddressbookWindow::slotItemFind() 439void AddressbookWindow::slotItemFind()
428{ 440{
429} 441}
430 442
431void AddressbookWindow::slotConfigure() 443void AddressbookWindow::slotConfigure()
432{ 444{
433 ConfigDlg* dlg = new ConfigDlg( this, "Config" ); 445 ConfigDlg* dlg = new ConfigDlg( this, "Config" );
434 dlg -> setConfig( m_config ); 446 dlg -> setConfig( m_config );
435 if ( QPEApplication::execDialog( dlg ) ) { 447 if ( QPEApplication::execDialog( dlg ) ) {
436 odebug << "Config Dialog accepted!" << oendl; 448 odebug << "Config Dialog accepted!" << oendl;
437 m_config = dlg -> getConfig(); 449 m_config = dlg -> getConfig();
438 if ( m_curFontSize != m_config.fontSize() ){ 450 if ( m_curFontSize != m_config.fontSize() ){
439 odebug << "Font was changed!" << oendl; 451 odebug << "Font was changed!" << oendl;
440 m_curFontSize = m_config.fontSize(); 452 m_curFontSize = m_config.fontSize();
441 emit slotSetFont( m_curFontSize ); 453 emit slotSetFont( m_curFontSize );
442 } 454 }
443 m_abView -> setListOrder( m_config.orderList() ); 455 m_abView -> setListOrder( m_config.orderList() );
444 } 456 }
445 457
446 delete dlg; 458 delete dlg;
447} 459}
448 460
449void AddressbookWindow::slotShowFind( bool show ) 461void AddressbookWindow::slotShowFind( bool show )
450{ 462{
451 if ( show ) 463 if ( show )
452 { 464 {
453 // Display search bar 465 // Display search bar
454 m_searchBar->show(); 466 m_searchBar->show();
455 m_abView -> inSearch(); 467 m_abView -> inSearch();
456 m_searchEdit->setFocus(); 468 m_searchEdit->setFocus();
457 } 469 }
458 else 470 else
459 { 471 {
460 // Hide search bar 472 // Hide search bar
461 m_searchBar->hide(); 473 m_searchBar->hide();
462 m_abView -> offSearch(); 474 m_abView -> offSearch();
463 } 475 }
464} 476}
465 477
466void AddressbookWindow::slotFind() 478void AddressbookWindow::slotFind()
467{ 479{
468 m_abView->slotDoFind( m_searchEdit->text(), m_config.beCaseSensitive(), m_config.useRegExp(), false); 480 m_abView->slotDoFind( m_searchEdit->text(), m_config.beCaseSensitive(), m_config.useRegExp(), false);
469 481
470 m_searchEdit->clearFocus(); 482 m_searchEdit->clearFocus();
471 // m_abView->setFocus(); 483 // m_abView->setFocus();
472 484
473} 485}
474 486
475void AddressbookWindow::slotViewBack() 487void AddressbookWindow::slotViewBack()
476{ 488{
477 // :SX showList(); 489 // :SX showList();
478} 490}
479 491
480void AddressbookWindow::writeMail() 492void AddressbookWindow::writeMail()
481{ 493{
482 Opie::OPimContact c = m_abView -> currentEntry(); 494 Opie::OPimContact c = m_abView -> currentEntry();
483 QString name = c.fileAs(); 495 QString name = c.fileAs();
484 QString email = c.defaultEmail(); 496 QString email = c.defaultEmail();
485 497
486 // I prefer the OPIE-Environment variable before the 498 // I prefer the OPIE-Environment variable before the
487 // QPE-one.. 499 // QPE-one..
488 QString basepath = QString::fromLatin1( getenv("OPIEDIR") ); 500 QString basepath = QString::fromLatin1( getenv("OPIEDIR") );
489 if ( basepath.isEmpty() ) 501 if ( basepath.isEmpty() )
490 basepath = QString::fromLatin1( getenv("QPEDIR") ); 502 basepath = QString::fromLatin1( getenv("QPEDIR") );
491 503
492 // Try to access the preferred. If not possible, try to 504 // Try to access the preferred. If not possible, try to
493 // switch to the other one.. 505 // switch to the other one..
494 if ( m_config.useQtMail() ){ 506 if ( m_config.useQtMail() ){
495 odebug << "Accessing: " << (basepath + "/bin/qtmail") << oendl; 507 odebug << "Accessing: " << (basepath + "/bin/qtmail") << oendl;
496 if ( QFile::exists( basepath + "/bin/qtmail" ) ){ 508 if ( QFile::exists( basepath + "/bin/qtmail" ) ){
497 odebug << "QCop" << oendl; 509 odebug << "QCop" << oendl;
498 QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)"); 510 QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)");
499 e << name << email; 511 e << name << email;
500 return; 512 return;
501 } else 513 } else
502 m_config.setUseOpieMail( true ); 514 m_config.setUseOpieMail( true );
503 } 515 }
504 if ( m_config.useOpieMail() ){ 516 if ( m_config.useOpieMail() ){
505 odebug << "Accessing: " << (basepath + "/bin/opiemail") << oendl; 517 odebug << "Accessing: " << (basepath + "/bin/opiemail") << oendl;
506 if ( QFile::exists( basepath + "/bin/opiemail" ) ){ 518 if ( QFile::exists( basepath + "/bin/opiemail" ) ){
507 odebug << "QCop" << oendl; 519 odebug << "QCop" << oendl;
508 QCopEnvelope e("QPE/Application/opiemail", "writeMail(QString,QString)"); 520 QCopEnvelope e("QPE/Application/opiemail", "writeMail(QString,QString)");
509 e << name << email; 521 e << name << email;
510 return; 522 return;
511 } else 523 } else
512 m_config.setUseQtMail( true ); 524 m_config.setUseQtMail( true );
513 } 525 }
514 526
515} 527}
516 528
517void AddressbookWindow::beamDone( Ir *ir ) 529void AddressbookWindow::beamDone( Ir *ir )
518{ 530{
519 531
520 delete ir; 532 delete ir;
521 unlink( beamfile ); 533 unlink( beamfile );
522} 534}
523 535
524 536
525static void parseName( const QString& name, QString *first, QString *middle, 537static void parseName( const QString& name, QString *first, QString *middle,
526 QString * last ) 538 QString * last )
527{ 539{
528 540
529 int comma = name.find ( "," ); 541 int comma = name.find ( "," );
530 QString rest; 542 QString rest;
531 if ( comma > 0 ) { 543 if ( comma > 0 ) {
532 *last = name.left( comma ); 544 *last = name.left( comma );
533 comma++; 545 comma++;
534 while ( comma < int(name.length()) && name[comma] == ' ' ) 546 while ( comma < int(name.length()) && name[comma] == ' ' )
535 comma++; 547 comma++;
536 rest = name.mid( comma ); 548 rest = name.mid( comma );
537 } else { 549 } else {
538 int space = name.findRev( ' ' ); 550 int space = name.findRev( ' ' );
539 *last = name.mid( space+1 ); 551 *last = name.mid( space+1 );
540 rest = name.left( space ); 552 rest = name.left( space );
541 } 553 }
542 int space = rest.find( ' ' ); 554 int space = rest.find( ' ' );
543 if ( space <= 0 ) { 555 if ( space <= 0 ) {
544 *first = rest; 556 *first = rest;
545 } else { 557 } else {
546 *first = rest.left( space ); 558 *first = rest.left( space );
547 *middle = rest.mid( space+1 ); 559 *middle = rest.mid( space+1 );
548 } 560 }
549 561
550} 562}
551 563
552 564
553void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data) 565void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data)
554{ 566{
555 bool needShow = false; 567 bool needShow = false;
556 odebug << "Receiving QCop-Call with message " << msg << oendl; 568 odebug << "Receiving QCop-Call with message " << msg << oendl;
557 569
558 570
559 if (msg == "editPersonal()") { 571 if (msg == "editPersonal()") {
560 editPersonal(); 572 editPersonal();
561 573
562 // Categories might have changed, so reload 574 // Categories might have changed, so reload
563 reloadCategories(); 575 reloadCategories();
564 } else if (msg == "editPersonalAndClose()") { 576 } else if (msg == "editPersonalAndClose()") {
565 editPersonal(); 577 editPersonal();
566 close(); 578 close();
567 } else if ( msg == "addContact(QString,QString)" ) { 579 } else if ( msg == "addContact(QString,QString)" ) {
568 QDataStream stream(data,IO_ReadOnly); 580 QDataStream stream(data,IO_ReadOnly);
569 QString name, email; 581 QString name, email;
570 stream >> name >> email; 582 stream >> name >> email;
571 583
572 Opie::OPimContact cnt; 584 Opie::OPimContact cnt;
573 QString fn, mn, ln; 585 QString fn, mn, ln;
574 parseName( name, &fn, &mn, &ln ); 586 parseName( name, &fn, &mn, &ln );
575 //odebug << " " << fn << " - " << mn " - " << ln << oendl; 587 //odebug << " " << fn << " - " << mn " - " << ln << oendl;
576 cnt.setFirstName( fn ); 588 cnt.setFirstName( fn );
577 cnt.setMiddleName( mn ); 589 cnt.setMiddleName( mn );
578 cnt.setLastName( ln ); 590 cnt.setLastName( ln );
579 cnt.insertEmails( email ); 591 cnt.insertEmails( email );
580 cnt.setDefaultEmail( email ); 592 cnt.setDefaultEmail( email );
581 cnt.setFileAs(); 593 cnt.setFileAs();
582 594
583 m_abView -> addEntry( cnt ); 595 m_abView -> addEntry( cnt );
584 596
585 // :SXm_abView()->init( cnt ); 597 // :SXm_abView()->init( cnt );
586 editEntry( EditEntry ); 598 editEntry( EditEntry );
587 599
588 // Categories might have changed, so reload 600 // Categories might have changed, so reload
589 reloadCategories(); 601 reloadCategories();
590 } else if ( msg == "beamBusinessCard()" ) { 602 } else if ( msg == "beamBusinessCard()" ) {
591 QString beamFilename = addressbookPersonalVCardName(); 603 QString beamFilename = addressbookPersonalVCardName();
592 if ( !QFile::exists( beamFilename ) ) 604 if ( !QFile::exists( beamFilename ) )
593 return; // can't beam a non-existent file 605 return; // can't beam a non-existent file
594 606
595 Ir *ir = new Ir( this ); 607 Ir *ir = new Ir( this );
596 connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); 608 connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) );
597 QString description = "mycard.vcf"; 609 QString description = "mycard.vcf";
598 ir->send( beamFilename, description, "text/x-vCard" ); 610 ir->send( beamFilename, description, "text/x-vCard" );
599 } else if ( msg == "show(int)" ) { 611 } else if ( msg == "show(int)" ) {
600 raise(); 612 raise();
601 QDataStream stream(data,IO_ReadOnly); 613 QDataStream stream(data,IO_ReadOnly);
602 int uid; 614 int uid;
603 stream >> uid; 615 stream >> uid;
604 616
605 odebug << "Showing uid: " << uid << oendl; 617 odebug << "Showing uid: " << uid << oendl;
606 618
607 // Deactivate Personal View.. 619 // Deactivate Personal View..
608 if ( m_actionPersonal->isOn() ){ 620 if ( m_actionPersonal->isOn() ){
609 m_actionPersonal->setOn( false ); 621 m_actionPersonal->setOn( false );
610 slotPersonalView(); 622 slotPersonalView();
611 } 623 }
612 624
613 // Reset category and show as card.. 625 // Reset category and show as card..
614 m_abView -> setShowByCategory( QString::null ); 626 m_abView -> setShowByCategory( QString::null );
615 m_abView -> setCurrentUid( uid ); 627 m_abView -> setCurrentUid( uid );
616 slotViewSwitched ( AbView::CardView ); 628 slotViewSwitched ( AbView::CardView );
617 629
618 needShow = true; 630 needShow = true;
619 631
620 632
621 } else if ( msg == "edit(int)" ) { 633 } else if ( msg == "edit(int)" ) {
622 QDataStream stream(data,IO_ReadOnly); 634 QDataStream stream(data,IO_ReadOnly);
623 int uid; 635 int uid;
624 stream >> uid; 636 stream >> uid;
625 637
626 // Deactivate Personal View.. 638 // Deactivate Personal View..
627 if ( m_actionPersonal->isOn() ){ 639 if ( m_actionPersonal->isOn() ){
628 m_actionPersonal->setOn( false ); 640 m_actionPersonal->setOn( false );
629 slotPersonalView(); 641 slotPersonalView();
630 } 642 }
631 643
632 // Reset category and edit.. 644 // Reset category and edit..
633 m_abView -> setShowByCategory( QString::null ); 645 m_abView -> setShowByCategory( QString::null );
634 m_abView -> setCurrentUid( uid ); 646 m_abView -> setCurrentUid( uid );
635 slotItemEdit(); 647 slotItemEdit();
636 648
637 // Categories might have changed, so reload 649 // Categories might have changed, so reload
638 reloadCategories(); 650 reloadCategories();
639 } 651 }
640 652
641 if (needShow) 653 if (needShow)
642 QPEApplication::setKeepRunning(); 654 QPEApplication::setKeepRunning();
643} 655}
644 656
645void AddressbookWindow::editEntry( EntryMode entryMode ) 657void AddressbookWindow::editEntry( EntryMode entryMode )
646{ 658{
647 Opie::OPimContact entry; 659 Opie::OPimContact entry;
648 if ( !abEditor ) { 660 if ( !abEditor ) {
649 abEditor = new ContactEditor( entry, this, "editor" ); 661 abEditor = new ContactEditor( entry, this, "editor" );
650 } 662 }
651 if ( entryMode == EditEntry ) 663 if ( entryMode == EditEntry )
652 abEditor->setEntry( m_abView -> currentEntry() ); 664 abEditor->setEntry( m_abView -> currentEntry() );
653 else if ( entryMode == NewEntry ) 665 else if ( entryMode == NewEntry )
654 abEditor->setEntry( entry ); 666 abEditor->setEntry( entry );
655 // other things may change the caption. 667 // other things may change the caption.
656 abEditor->setCaption( tr("Edit Address") ); 668 abEditor->setCaption( tr("Edit Address") );
657 669
658 // fix the focus... 670 // fix the focus...
659 abEditor->setNameFocus(); 671 abEditor->setNameFocus();
660 if ( QPEApplication::execDialog( abEditor ) == QDialog::Accepted ) { 672 if ( QPEApplication::execDialog( abEditor ) == QDialog::Accepted ) {
661 setFocus(); 673 setFocus();
662 if ( entryMode == NewEntry ) { 674 if ( entryMode == NewEntry ) {
663 Opie::OPimContact insertEntry = abEditor->entry(); 675 Opie::OPimContact insertEntry = abEditor->entry();
664 insertEntry.assignUid(); 676 insertEntry.assignUid();
665 m_abView -> addEntry( insertEntry ); 677 m_abView -> addEntry( insertEntry );
666 m_abView -> setCurrentUid( insertEntry.uid() ); 678 m_abView -> setCurrentUid( insertEntry.uid() );
667 } else { 679 } else {
668 Opie::OPimContact replEntry = abEditor->entry(); 680 Opie::OPimContact replEntry = abEditor->entry();
669 681
670 if ( !replEntry.isValidUid() ) 682 if ( !replEntry.isValidUid() )
671 replEntry.assignUid(); 683 replEntry.assignUid();
672 684
673 m_abView -> replaceEntry( replEntry ); 685 m_abView -> replaceEntry( replEntry );
674 } 686 }
675 687
676 // Categories might have changed, so reload 688 // Categories might have changed, so reload
677 reloadCategories(); 689 reloadCategories();
678 } 690 }
679} 691}
680 692
681void AddressbookWindow::editPersonal() 693void AddressbookWindow::editPersonal()
682{ 694{
683 Opie::OPimContact entry; 695 Opie::OPimContact entry;
684 696
685 // Switch to personal view if not selected 697 // Switch to personal view if not selected
686 // but take care of the menu, too 698 // but take care of the menu, too
687 if ( ! m_actionPersonal->isOn() ){ 699 if ( ! m_actionPersonal->isOn() ){
688 odebug << "*** ++++" << oendl; 700 odebug << "*** ++++" << oendl;
689 m_actionPersonal->setOn( true ); 701 m_actionPersonal->setOn( true );
690 slotPersonalView(); 702 slotPersonalView();
691 } 703 }
692 704
693 if ( !abEditor ) { 705 if ( !abEditor ) {
694 abEditor = new ContactEditor( entry, this, "editor" ); 706 abEditor = new ContactEditor( entry, this, "editor" );
695 } 707 }
696 708
697 abEditor->setCaption(tr("Edit My Personal Details")); 709 abEditor->setCaption(tr("Edit My Personal Details"));
698 abEditor->setPersonalView( true ); 710 abEditor->setPersonalView( true );
699 editEntry( EditEntry ); 711 editEntry( EditEntry );
700 abEditor->setPersonalView( false ); 712 abEditor->setPersonalView( false );
701 713
702} 714}
703 715
704 716
705void AddressbookWindow::slotPersonalView() 717void AddressbookWindow::slotPersonalView()
706{ 718{
707 odebug << "slotPersonalView()" << oendl; 719 odebug << "slotPersonalView()" << oendl;
708 720
709 bool personal = m_actionPersonal->isOn(); 721 bool personal = m_actionPersonal->isOn();
710 722
711 // Disable actions when showing personal details 723 // Disable actions when showing personal details
712 setItemNewEnabled( !personal ); 724 setItemNewEnabled( !personal );
713 setItemDuplicateEnabled( !personal ); 725 setItemDuplicateEnabled( !personal );
714 setItemDeleteEnabled( !personal ); 726 setItemDeleteEnabled( !personal );
715 m_actionMail->setEnabled( !personal ); 727 m_actionMail->setEnabled( !personal );
716 setShowCategories( !personal ); 728 setShowCategories( !personal );
717 729
718 // Display appropriate view 730 // Display appropriate view
719 m_abView->showPersonal( personal ); 731 m_abView->showPersonal( personal );
720 732
721 if ( personal ) 733 if ( personal )
722 { 734 {
723 setCaption( tr( "Contacts - My Personal Details") ); 735 setCaption( tr( "Contacts - My Personal Details") );
724 736
725 // Set category to 'All' to make sure personal details is visible 737 // Set category to 'All' to make sure personal details is visible
726 setViewCategory( "All" ); 738 setViewCategory( "All" );
727 m_abView->setShowByCategory( "All" ); 739 m_abView->setShowByCategory( "All" );
728 740
729 // Temporarily disable letter picker 741 // Temporarily disable letter picker
730 pLabel->hide(); 742 pLabel->hide();
731 } 743 }
732 else 744 else
733 { 745 {
734 setCaption( tr( "Contacts") ); 746 setCaption( tr( "Contacts") );
735 747
736 // Re-enable letter picker 748 // Re-enable letter picker
737 pLabel->show(); 749 pLabel->show();
738 } 750 }
739} 751}
740 752
741void AddressbookWindow::reload() 753void AddressbookWindow::reload()
742{ 754{
743 syncing = false; 755 syncing = false;
744 m_abView->clear(); 756 m_abView->clear();
745 m_abView->reload(); 757 m_abView->reload();
746} 758}
747 759
748void AddressbookWindow::flush() 760void AddressbookWindow::flush()
749{ 761{
750 syncing = true; 762 syncing = true;
751 m_abView->save(); 763 m_abView->save();
752} 764}
753 765
754 766
755void AddressbookWindow::closeEvent( QCloseEvent *e ) 767void AddressbookWindow::closeEvent( QCloseEvent *e )
756{ 768{
757 if ( active_view == AbView::CardView ) 769 if ( active_view == AbView::CardView )
758 { 770 {
759 if ( !m_actionPersonal->isOn() ) 771 if ( !m_actionPersonal->isOn() )
760 { 772 {
761 // Switch to table view only if not editing personal details 773 // Switch to table view only if not editing personal details
762 slotViewSwitched( AbView::TableView ); 774 slotViewSwitched( AbView::TableView );
763 } 775 }
764 else 776 else
765 { 777 {
766 // If currently editing personal details, switch off personal view 778 // If currently editing personal details, switch off personal view
767 m_actionPersonal->setOn( false ); 779 m_actionPersonal->setOn( false );
768 slotPersonalView(); 780 slotPersonalView();
769 } 781 }
770 782
771 e->ignore(); 783 e->ignore();
772 return; 784 return;
773 } 785 }
774 if(syncing) { 786 if(syncing) {
775 /* shouldn't we save, I hear you say? well its already been set 787 /* shouldn't we save, I hear you say? well its already been set
776 so that an edit can not occur during a sync, and we flushed 788 so that an edit can not occur during a sync, and we flushed
777 at the start of the sync, so there is no need to save 789 at the start of the sync, so there is no need to save
778 Saving however itself would cause problems. */ 790 Saving however itself would cause problems. */
779 e->accept(); 791 e->accept();
780 return; 792 return;
781 } 793 }
782 //################## shouldn't always save 794 //################## shouldn't always save
783 // True, but the database handles this automatically ! (se) 795 // True, but the database handles this automatically ! (se)
784 if ( save() ) 796 if ( save() )
785 e->accept(); 797 e->accept();
786 else 798 else
787 e->ignore(); 799 e->ignore();
788} 800}
789 801
790/* 802/*
791 Returns true if it is OK to exit 803 Returns true if it is OK to exit
792*/ 804*/
793 805
794bool AddressbookWindow::save() 806bool AddressbookWindow::save()
795{ 807{
796 if ( !m_abView->save() ) { 808 if ( !m_abView->save() ) {
797 if ( QMessageBox::critical( 0, tr( "Out of space" ), 809 if ( QMessageBox::critical( 0, tr( "Out of space" ),
798 tr("Unable to save information.\n" 810 tr("Unable to save information.\n"
799 "Free up some space\n" 811 "Free up some space\n"
800 "and try again.\n" 812 "and try again.\n"
801 "\nQuit anyway?"), 813 "\nQuit anyway?"),
802 QMessageBox::Yes|QMessageBox::Escape, 814 QMessageBox::Yes|QMessageBox::Escape,
803 QMessageBox::No|QMessageBox::Default ) 815 QMessageBox::No|QMessageBox::Default )
804 != QMessageBox::No ) 816 != QMessageBox::No )
805 return true; 817 return true;
806 else 818 else
807 return false; 819 return false;
808 } 820 }
809 return true; 821 return true;
810} 822}
811 823
812#ifdef __DEBUG_RELEASE 824#ifdef __DEBUG_RELEASE
813void AddressbookWindow::slotSave() 825void AddressbookWindow::slotSave()
814{ 826{
815 save(); 827 save();
816} 828}
817#endif 829#endif
818 830
819 831
820void AddressbookWindow::slotNotFound() 832void AddressbookWindow::slotNotFound()
821{ 833{
822 odebug << "Got not found signal!" << oendl; 834 odebug << "Got not found signal!" << oendl;
823 QMessageBox::information( this, tr( "Not Found" ), 835 QMessageBox::information( this, tr( "Not Found" ),
824 "<qt>" + tr( "Unable to find a contact for this search pattern!" ) + "</qt>" ); 836 "<qt>" + tr( "Unable to find a contact for this search pattern!" ) + "</qt>" );
825 837
826 838
827} 839}
828void AddressbookWindow::slotWrapAround() 840void AddressbookWindow::slotWrapAround()
829{ 841{
830 odebug << "Got wrap signal!" << oendl; 842 odebug << "Got wrap signal!" << oendl;
831 // if ( doNotifyWrapAround ) 843 // if ( doNotifyWrapAround )
832 // QMessageBox::information( this, tr( "End of list" ), 844 // QMessageBox::information( this, tr( "End of list" ),
833 // tr( "End of list. Wrap around now...!" ) + "\n" ); 845 // tr( "End of list. Wrap around now...!" ) + "\n" );
834 846
835} 847}
836 848
837void AddressbookWindow::slotSetCategory( const QString &category ) 849void AddressbookWindow::slotSetCategory( const QString &category )
838{ 850{
839 odebug << "void AddressbookWindow::slotSetCategory( " << category << " )" << oendl; 851 odebug << "void AddressbookWindow::slotSetCategory( " << category << " )" << oendl;
840 852
841 // Tell the view about the selected category 853 // Tell the view about the selected category
842 m_config.setCategory( category ); 854 m_config.setCategory( category );
843 m_abView -> setShowByCategory( category ); 855 m_abView -> setShowByCategory( category );
844} 856}
845 857
846void AddressbookWindow::slotViewSwitched( int view ) 858void AddressbookWindow::slotViewSwitched( int view )
847{ 859{
848 odebug << "void AddressbookWindow::slotViewSwitched( " << view << " )" << oendl; 860 odebug << "void AddressbookWindow::slotViewSwitched( " << view << " )" << oendl;
849 861
850 // Tell the view about the selected view 862 // Tell the view about the selected view
851 m_abView -> setShowToView ( (AbView::Views) view ); 863 m_abView -> setShowToView ( (AbView::Views) view );
852 active_view = view; 864 active_view = view;
853} 865}
854 866
855 867
856void AddressbookWindow::slotListView() 868void AddressbookWindow::slotListView()
857{ 869{
858 slotViewSwitched( AbView::TableView ); 870 slotViewSwitched( AbView::TableView );
859} 871}
860 872
861void AddressbookWindow::slotCardView() 873void AddressbookWindow::slotCardView()
862{ 874{
863 slotViewSwitched( AbView::CardView ); 875 slotViewSwitched( AbView::CardView );
864} 876}
865 877
866void AddressbookWindow::slotSetLetter( char c ) { 878void AddressbookWindow::slotSetLetter( char c ) {
867 879
868 m_abView->setShowByLetter( c, m_config.letterPickerSearch() ); 880 m_abView->setShowByLetter( c, m_config.letterPickerSearch() );
869 881
870} 882}
871 883