-rw-r--r-- | core/pim/addressbook/abtable.cpp | 1 | ||||
-rw-r--r-- | core/pim/addressbook/abview.cpp | 36 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 7 |
3 files changed, 21 insertions, 23 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,840 +1,839 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de) ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <opie2/odebug.h> #include <opie2/opimrecordlist.h> #include <qpe/timestring.h> #include <qpe/resource.h> #include "abtable.h" #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <ctype.h> //toupper() for key hack #if 0 /*! \class AbTableItem abtable.h \brief QTableItem based class for showing a field of an entry */ AbTableItem::AbTableItem( QTable *t, EditType et, const QString &s, const QString &secondSortKey) : QTableItem( t, et, s ) { // sortKey = s.lower() + QChar( '\0' ) + secondSortKey.lower(); sortKey = Qtopia::buildSortKey( s, secondSortKey ); } int AbTableItem::alignment() const { return AlignLeft|AlignVCenter; } QString AbTableItem::key() const { return sortKey; } // A way to reset the item, without out doing a delete or a new... void AbTableItem::setItem( const QString &txt, const QString &secondKey ) { setText( txt ); sortKey = Qtopia::buildSortKey( txt, secondKey ); // sortKey = txt.lower() + QChar( '\0' ) + secondKey.lower(); } /*! \class AbPickItem abtable.h \brief QTableItem based class for showing slection of an entry */ AbPickItem::AbPickItem( QTable *t ) : QTableItem(t, WhenCurrent, "?") { } QWidget *AbPickItem::createEditor() const { QComboBox* combo = new QComboBox( table()->viewport() ); ( (AbPickItem*)this )->cb = combo; AbTable* t = static_cast<AbTable*>(table()); QStringList c = t->choiceNames(); int cur = 0; for (QStringList::ConstIterator it = c.begin(); it!=c.end(); ++it) { if ( *it == text() ) cur = combo->count(); combo->insertItem(*it); } combo->setCurrentItem(cur); return combo; } void AbPickItem::setContentFromEditor( QWidget *w ) { if ( w->inherits("QComboBox") ) setText( ( (QComboBox*)w )->currentText() ); else QTableItem::setContentFromEditor( w ); } #endif /*! \class AbTable abtable.h \brief QTable based class for showing a list of entries */ AbTable::AbTable( const QValueList<int> order, QWidget *parent, const char *name ) : QTable( parent, name ), lastSortCol( -1 ), asc( TRUE ), intFields( order ), enablePainting( true ), columnVisible( true ), countNested( 0 ) { // odebug << "C'tor start" << oendl; setSelectionMode( NoSelection ); init(); setSorting( TRUE ); connect( this, SIGNAL(clicked(int,int,int,const QPoint&)), this, SLOT(itemClicked(int,int)) ); // contactList.clear(); // odebug << "C'tor end" << oendl; } AbTable::~AbTable() { } void AbTable::init() { // :SX showChar = '\0'; setNumRows( 0 ); setNumCols( 2 ); horizontalHeader()->setLabel( 0, tr( "Full Name" )); horizontalHeader()->setLabel( 1, tr( "Contact" )); setLeftMargin( 0 ); verticalHeader()->hide(); columnVisible = true; } void AbTable::setContacts( const Opie::OPimContactAccess::List& viewList ) { odebug << "AbTable::setContacts()" << oendl; clear(); m_viewList = viewList; setSorting( false ); setPaintingEnabled( FALSE ); - Opie::OPimContactAccess::List::Iterator it; setNumRows( m_viewList.count() ); // int row = 0; // for ( it = m_viewList.begin(); it != m_viewList.end(); ++it ) // insertIntoTable( *it, row++ ); // setSorting( true ); // resort(); updateVisible(); setPaintingEnabled( TRUE ); } void AbTable::setOrderedList( const QValueList<int> ordered ) { intFields = ordered; } bool AbTable::selectContact( int UID ) { odebug << "AbTable::selectContact( " << UID << " )" << oendl; int rows = numRows(); bool found = false; setPaintingEnabled( FALSE ); odebug << "Search start" << oendl; for ( int r = 0; r < rows; ++r ) { if ( m_viewList.uidAt( r ) == UID ){ ensureCellVisible( r, 0 ); setCurrentCell( r, 0 ); found = true; break; } } odebug << "Search end" << oendl; if ( !found ){ ensureCellVisible( 0,0 ); setCurrentCell( 0, 0 ); } setPaintingEnabled( TRUE ); return true; } #if 0 void AbTable::insertIntoTable( const Opie::OPimContact& cnt, int row ) { odebug << "void AbTable::insertIntoTable( const Opie::OPimContact& cnt, " << row << " )" << oendl; QString strName; ContactItem contactItem; strName = findContactName( cnt ); contactItem = findContactContact( cnt, row ); AbTableItem *ati; ati = new AbTableItem( this, QTableItem::Never, strName, contactItem.value ); contactList.insert( ati, cnt ); setItem( row, 0, ati ); ati = new AbTableItem( this, QTableItem::Never, contactItem.value, strName); if ( !contactItem.icon.isNull() ) ati->setPixmap( contactItem.icon ); setItem( row, 1, ati ); //### cannot do this; table only has two columns at this point // setItem( row, 2, new AbPickItem( this ) ); } #endif void AbTable::columnClicked( int col ) { if ( !sorting() ) return; if ( lastSortCol == -1 ) lastSortCol = col; if ( col == lastSortCol ) { asc = !asc; } else { lastSortCol = col; asc = TRUE; } //QMessageBox::information( this, "resort", "columnClicked" ); resort(); } void AbTable::resort() { owarn << "void AbTable::resort() NOT POSSIBLE !!" << oendl; #if 0 setPaintingEnabled( FALSE ); if ( sorting() ) { if ( lastSortCol == -1 ) lastSortCol = 0; sortColumn( lastSortCol, asc, TRUE ); //QMessageBox::information( this, "resort", "resort" ); updateVisible(); } setPaintingEnabled( TRUE ); #endif } Opie::OPimContact AbTable::currentEntry() { return m_viewList[currentRow()]; } int AbTable::currentEntry_UID() { return ( currentEntry().uid() ); } void AbTable::clear() { odebug << "void AbTable::clear()" << oendl; // contactList.clear(); setPaintingEnabled( FALSE ); for ( int r = 0; r < numRows(); ++r ) { for ( int c = 0; c < numCols(); ++c ) { if ( cellWidget( r, c ) ) clearCellWidget( r, c ); clearCell( r, c ); } } setNumRows( 0 ); setPaintingEnabled( TRUE ); } // Refresh updates column 2 if the contactsettings changed void AbTable::refresh() { owarn << "void AbTable::refresh() NOT IMPLEMENTED !!" << oendl; #if 0 int rows = numRows(); AbTableItem *abi; ContactItem contactItem; setPaintingEnabled( FALSE ); for ( int r = 0; r < rows; ++r ) { abi = static_cast<AbTableItem*>( item(r, 0) ); contactItem = findContactContact( contactList[abi], r ); static_cast<AbTableItem*>( item(r, 1) )->setItem( contactItem.value, abi->text() ); if ( !contactItem.icon.isNull() ){ static_cast<AbTableItem*>( item(r, 1) )-> setPixmap( contactItem.icon ); }else{ static_cast<AbTableItem*>( item(r, 1) )-> setPixmap( QPixmap() ); } } resort(); setPaintingEnabled( TRUE ); #endif } void AbTable::keyPressEvent( QKeyEvent *e ) { char key = toupper( e->ascii() ); if ( key >= 'A' && key <= 'Z' ) moveTo( key ); // odebug << "Received key .." << oendl; switch( e->key() ) { case Qt::Key_Space: case Qt::Key_Return: case Qt::Key_Enter: emit signalSwitch(); break; // case Qt::Key_Up: // odebug << "a" << oendl; // emit signalKeyUp(); // break; // case Qt::Key_Down: // odebug << "b" << oendl; // emit signalKeyDown(); // break; default: QTable::keyPressEvent( e ); } } void AbTable::moveTo( char /*c*/ ) { odebug << "void AbTable::moveTo( char c ) NOT IMPLEMENTED !!" << oendl; #if 0 int rows = numRows(); QString value; AbTableItem *abi; int r; if ( asc ) { r = 0; while ( r < rows-1) { abi = static_cast<AbTableItem*>( item(r, 0) ); QChar first = abi->key()[0]; //### is there a bug in QChar to char comparison??? if ( first.row() || first.cell() >= c ) break; r++; } } else { //### should probably disable reverse sorting instead r = rows - 1; while ( r > 0 ) { abi = static_cast<AbTableItem*>( item(r, 0) ); QChar first = abi->key()[0]; //### is there a bug in QChar to char comparison??? if ( first.row() || first.cell() >= c ) break; r--; } } setCurrentCell( r, currentColumn() ); #endif } #if 0 // Useless.. Nobody uses it .. (se) QString AbTable::findContactName( const Opie::OPimContact &entry ) { // We use the fileAs, then company, defaultEmail QString str; str = entry.fileAs(); if ( str.isEmpty() ) { str = entry.company(); if ( str.isEmpty() ) { str = entry.defaultEmail(); } } return str; } #endif void AbTable::resizeRows() { /* if (numRows()) { for (int i = 0; i < numRows(); i++) { setRowHeight( i, size ); } } updateVisible(); */ } void AbTable::realignTable() { // odebug << "void AbTable::realignTable()" << oendl; setPaintingEnabled( FALSE ); resizeRows(); fitColumns(); setPaintingEnabled( TRUE ); } #if QT_VERSION <= 230 #ifndef SINGLE_APP void QTable::paintEmptyArea( QPainter *p, int cx, int cy, int cw, int ch ) { // Region of the rect we should draw QRegion reg( QRect( cx, cy, cw, ch ) ); // Subtract the table from it reg = reg.subtract( QRect( QPoint( 0, 0 ), tableSize() ) ); // And draw the rectangles (transformed as needed) QArray<QRect> r = reg.rects(); for (unsigned int i=0; i<r.count(); i++) p->fillRect( r[i], colorGroup().brush( QColorGroup::Base ) ); } #endif #endif // int AbTable::rowHeight( int ) const // { // return 18; // } // int AbTable::rowPos( int row ) const // { // return 18*row; // } // int AbTable::rowAt( int pos ) const // { // return QMIN( pos/18, numRows()-1 ); // } void AbTable::fitColumns() { odebug << "void AbTable::fitColumns()" << oendl; int contentsWidth = visibleWidth() / 2; // Fix to better value // contentsWidth = 130; setPaintingEnabled( FALSE ); if ( columnVisible == false ){ showColumn(0); columnVisible = true; } // odebug << "Width: " << contentsWidth << oendl; setColumnWidth( 0, contentsWidth ); adjustColumn(1); if ( columnWidth(1) < contentsWidth ) setColumnWidth( 1, contentsWidth ); setPaintingEnabled( TRUE ); } void AbTable::show() { // odebug << "void AbTable::show()" << oendl; realignTable(); QTable::show(); } #if 0 void AbTable::setChoiceNames( const QStringList& list) { choicenames = list; if ( choicenames.isEmpty() ) { // hide pick column setNumCols( 2 ); } else { // show pick column setNumCols( 3 ); setColumnWidth( 2, fontMetrics().width(tr( "Pick" ))+8 ); horizontalHeader()->setLabel( 2, tr( "Pick" )); } fitColumns(); } #endif void AbTable::itemClicked(int,int col) { // odebug << "AbTable::itemClicked(int, col: " << col << ")" << oendl; if ( col == 2 ) { return; } else { // odebug << "Emitting signalSwitch()" << oendl; emit signalSwitch(); } } #if 0 QStringList AbTable::choiceNames() const { return choicenames; } #endif void AbTable::setChoiceSelection( const QValueList<int>& list ) { intFields = list; } QStringList AbTable::choiceSelection(int /*index*/) const { QStringList r; /* ###### QString selname = choicenames.at(index); for (each row) { Opie::OPimContact *c = contactForRow(row); if ( text(row,2) == selname ) { r.append(c->email); } } */ return r; } void AbTable::updateVisible() { // odebug << "void AbTable::updateVisible()" << oendl; int visible, totalRows, row, selectedRow = 0; visible = 0; setPaintingEnabled( FALSE ); realignTable(); totalRows = numRows(); for ( row = 0; row < totalRows; row++ ) { if ( rowHeight(row) == 0 ) { showRow( row ); adjustRow( row ); if ( isSelected( row,0 ) || isSelected( row,1 ) ) selectedRow = row; } visible++; } if ( selectedRow ) setCurrentCell( selectedRow, 0 ); if ( !visible ) setCurrentCell( -1, 0 ); setPaintingEnabled( TRUE ); } void AbTable::setPaintingEnabled( bool e ) { // odebug << "IN void AbTable::setPaintingEnabled( " << e << " )->Nested: " // << countNested << oendl; if ( e ) { if ( countNested > 0 ) --countNested; if ( ! countNested ){ setUpdatesEnabled( true ); enablePainting = true; rowHeightChanged( 0 ); viewport()->update(); } } else { ++countNested; enablePainting = false; setUpdatesEnabled( false ); } // odebug << "OUT void AbTable::setPaintingEnabled( " << e << " )->Nested: " // << countNested << oendl; } void AbTable::viewportPaintEvent( QPaintEvent* e ) { // odebug << "void AbTable::viewportPaintEvent( QPaintEvent* e ) -> " // << enablePainting << oendl; if ( enablePainting ) QTable::viewportPaintEvent( e ); } void AbTable::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) { const QColorGroup &cg = colorGroup(); p->save(); // odebug << "Paint row: " << row << oendl; Opie::OPimContact act_contact = m_viewList[row]; // Paint alternating background bars if ( (row % 2 ) == 0 ) { p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); p->setPen( QPen( cg.text() ) ); } else { p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Background ) ); p->setPen( QPen( cg.buttonText() ) ); } QFont f = p->font(); QFontMetrics fm(f); int marg = 2; int x = 0; int y = ( cr.height() - 14 ) / 2; QString nameText = act_contact.fileAs(); switch( col ){ case 0: p->drawText( x + marg,2 + fm.ascent(), nameText ); break; case 1:{ ContactItem contactItem = findContactContact( act_contact, 0 ); QPixmap contactPic = contactItem.icon; /* pixmap( row, col ); */ QString contactText = contactItem.value; if ( !contactPic.isNull() ) { p->drawPixmap( x + marg, y, contactPic ); p->drawText( x + marg + contactPic.width() + 4,2 + fm.ascent(), contactText ); } else { p->drawText( x + marg,2 + fm.ascent(), contactText ); } } break; } p->restore(); } void AbTable::rowHeightChanged( int row ) { if ( enablePainting ) QTable::rowHeightChanged( row ); } ContactItem AbTable::findContactContact( const Opie::OPimContact &entry, int /* row */ ) { ContactItem item; item.value = ""; for ( QValueList<int>::ConstIterator it = intFields.begin(); it != intFields.end(); ++it ) { switch ( *it ) { default: break; case Qtopia::Title: item.value = entry.title(); break; case Qtopia::Suffix: item.value = entry.suffix(); break; case Qtopia::FileAs: item.value = entry.fileAs(); break; case Qtopia::DefaultEmail: item.value = entry.defaultEmail(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/email" ); break; case Qtopia::Emails: item.value = entry.emails(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/email" ); break; case Qtopia::HomeStreet: item.value = entry.homeStreet(); break; case Qtopia::HomeCity: item.value = entry.homeCity(); break; case Qtopia::HomeState: item.value = entry.homeState(); break; case Qtopia::HomeZip: item.value = entry.homeZip(); break; case Qtopia::HomeCountry: item.value = entry.homeCountry(); break; case Qtopia::HomePhone: item.value = entry.homePhone(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/phonehome" ); break; case Qtopia::HomeFax: item.value = entry.homeFax(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/faxhome" ); break; case Qtopia::HomeMobile: item.value = entry.homeMobile(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/mobilehome" ); break; case Qtopia::HomeWebPage: item.value = entry.homeWebpage(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/webpagehome" ); break; case Qtopia::Company: item.value = entry.company(); break; case Qtopia::BusinessCity: item.value = entry.businessCity(); break; case Qtopia::BusinessStreet: item.value = entry.businessStreet(); break; case Qtopia::BusinessZip: item.value = entry.businessZip(); break; case Qtopia::BusinessCountry: item.value = entry.businessCountry(); break; case Qtopia::BusinessWebPage: item.value = entry.businessWebpage(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/webpagework" ); break; case Qtopia::JobTitle: item.value = entry.jobTitle(); break; case Qtopia::Department: item.value = entry.department(); break; case Qtopia::Office: item.value = entry.office(); break; case Qtopia::BusinessPhone: item.value = entry.businessPhone(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/phonework" ); break; case Qtopia::BusinessFax: item.value = entry.businessFax(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/faxwork" ); break; case Qtopia::BusinessMobile: item.value = entry.businessMobile(); if ( !item.value.isEmpty() ) item.icon = Resource::loadPixmap( "addressbook/mobilework" ); break; case Qtopia::BusinessPager: item.value = entry.businessPager(); break; case Qtopia::Profession: item.value = entry.profession(); break; case Qtopia::Assistant: item.value = entry.assistant(); break; case Qtopia::Manager: item.value = entry.manager(); break; case Qtopia::Spouse: item.value = entry.spouse(); break; case Qtopia::Gender: item.value = entry.gender(); break; case Qtopia::Birthday: if ( ! entry.birthday().isNull() ){ item.value = TimeString::numberDateString( entry.birthday() ); } break; case Qtopia::Anniversary: if ( ! entry.anniversary().isNull() ){ item.value = TimeString::numberDateString( entry.anniversary() ); } break; case Qtopia::Nickname: item.value = entry.nickname(); break; case Qtopia::Children: item.value = entry.children(); break; case Qtopia::Notes: item.value = entry.notes(); break; } if ( !item.value.isEmpty() ) break; } return item; } 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 @@ /********************************************************************** ** Copyright (c) 2002 Stefan Eilers (eilers.stefan@epost.de) ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** **********************************************************************/ #include "abview.h" #include <opie2/ocontactaccessbackend_vcard.h> #include <opie2/odebug.h> #include <qpe/global.h> #include <qlayout.h> #include <assert.h> // Is defined in LibQPE extern QString categoryFileName(); QString addressbookPersonalVCardName() { QString filename = Global::applicationFileName("addressbook", "businesscard.vcf"); return filename; } AbView::AbView ( QWidget* parent, const QValueList<int>& ordered ): QWidget(parent), mCat(0), m_inSearch( false ), m_inPersonal( false ), - m_curr_category( -1 ), + m_curr_category( 0 ), m_curr_View( TableView ), m_prev_View( TableView ), m_curr_Contact ( 0 ), m_contactdb ( 0l ), m_storedDB ( 0l ), m_viewStack( 0l ), m_abTable( 0l ), m_orderedFields( ordered ) { odebug << "AbView::c'tor" << oendl; // Load default database and handle syncing myself.. ! m_contactdb = new Opie::OPimContactAccess ( "addressbook", 0l, 0l, false ); m_contactdb -> setReadAhead( 16 ); // Use ReadAhead-Cache if available mCat.load( categoryFileName() ); // Create Layout and put WidgetStack into it. QVBoxLayout *vb = new QVBoxLayout( this ); m_viewStack = new QWidgetStack( this ); vb->addWidget( m_viewStack ); // Creat TableView QVBox* tableBox = new QVBox( m_viewStack ); m_abTable = new AbTable( m_orderedFields, tableBox, "table" ); m_abTable->setCurrentCell( 0, 0 ); m_abTable->setFocus(); // Add TableView to WidgetStack and raise it m_viewStack -> addWidget( tableBox , TableView ); // Create CardView and add it to WidgetStack QVBox* cardBox = new QVBox( m_viewStack ); m_ablabel = new AbLabel( cardBox, "CardView"); m_viewStack -> addWidget( cardBox , CardView ); // Connect views to me connect ( m_abTable, SIGNAL( signalSwitch(void) ), this, SLOT( slotSwitch(void) ) ); connect ( m_ablabel, SIGNAL( signalOkPressed(void) ), this, SLOT( slotSwitch(void) ) ); load(); } AbView::~AbView() { m_contactdb -> save(); delete m_contactdb; if ( m_storedDB ){ m_storedDB -> save(); delete m_storedDB; } } void AbView::setView( Views view ) { odebug << "AbView::setView( Views view )" << oendl; m_curr_View = view; load(); } void AbView::addEntry( const Opie::OPimContact &newContact ) { odebug << "AbView::AddContact" << oendl; m_contactdb->add ( newContact ); load(); } void AbView::removeEntry( const int UID ) { odebug << "AbView;:RemoveContact" << oendl; m_contactdb->remove( UID ); load(); } void AbView::replaceEntry( const Opie::OPimContact &contact ) { odebug << "AbView::ReplaceContact" << oendl; m_contactdb->replace( contact ); load(); } Opie::OPimContact AbView::currentEntry() { Opie::OPimContact currentContact; switch ( (int) m_curr_View ) { case TableView: currentContact = m_abTable -> currentEntry(); break; case CardView: currentContact = m_ablabel -> currentEntry(); break; } m_curr_Contact = currentContact.uid(); return currentContact; } bool AbView::save() { // odebug << "AbView::Save data" << oendl; return m_contactdb->save(); } void AbView::load() { odebug << "AbView::Load data" << oendl; // Letter Search is stopped at this place emit signalClearLetterPicker(); - if ( m_curr_category == 0 ) { - // Show unfiled m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName, - Opie::OPimContactAccess::DoNotShowWithCategory, 0 ); - } else if ( m_curr_category != -1 ){ - // Just show selected category - m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName, - Opie::OPimBase::FilterCategory, m_curr_category ); - } else { - // Show all categories - m_list = m_contactdb->sorted( true, Opie::OPimContactAccess::SortFileAsName, - Opie::OPimBase::FilterOff, 0 ); - } + Opie::OPimContactAccess::FilterCategory, m_curr_category ); // if ( m_curr_category != -1 ) // clearForCategory(); odebug << "Number of contacts: " << m_list.count() << oendl; updateView( true ); } void AbView::reload() { odebug << "AbView::::reload()" << oendl; m_contactdb->reload(); load(); } void AbView::clear() { // :SX } void AbView::setShowByCategory( const QString& cat ) { odebug << "AbView::setShowCategory( const QString& cat )" << oendl; int intCat = 0; - // All (cat == NULL) will be stored as -1 - if ( cat.isNull() ) + // Unfiled will be stored as -1 + if ( cat == tr( "Unfiled" ) ) intCat = -1; + else if ( cat.isNull() ) + intCat = 0; else intCat = mCat.id("Contacts", cat ); // Just do anything if we really change the category if ( intCat != m_curr_category ){ // odebug << "Categories: Selected " << cat << ".. Number: " // << m_curr_category << oendl; m_curr_category = intCat; emit signalClearLetterPicker(); - load(); } + m_curr_category = intCat; } void AbView::setShowToView( Views view ) { odebug << "void AbView::setShowToView( View " << view << " )" << oendl; if ( m_curr_View != view ){ odebug << "Change the View (Category is: " << m_curr_category << ")" << oendl; m_prev_View = m_curr_View; m_curr_View = view; updateView(); } } void AbView::setShowByLetter( char c, AbConfig::LPSearchMode mode ) { odebug << "void AbView::setShowByLetter( " << c << ", " << mode << " )" << oendl; assert( mode < AbConfig::LASTELEMENT ); Opie::OPimContact query; if ( c == 0 ){ load(); return; }else{ // If the current Backend is unable to solve the query, we will // ignore the request .. if ( ! m_contactdb->hasQuerySettings( Opie::OPimContactAccess::WildCards | Opie::OPimContactAccess::IgnoreCase ) ){ owarn << "Tried to access queryByExample which is not supported by the current backend!!" << oendl; owarn << "I have to ignore this access!" << oendl; return; } switch( mode ){ case AbConfig::LastName: query.setLastName( QString("%1*").arg(c) ); break; case AbConfig::FileAs: query.setFileAs( QString("%1*").arg(c) ); break; default: owarn << "Unknown Searchmode for AbView::setShowByLetter ! -> " << mode << oendl << "I will ignore it.." << oendl; return; } m_list = m_contactdb->queryByExample( query, Opie::OPimContactAccess::WildCards | Opie::OPimContactAccess::IgnoreCase ); - if ( m_curr_category != -1 ) + + if ( m_curr_category != 0 ) clearForCategory(); + + // Sort filtered results + m_list = m_contactdb->sorted( m_list, true, Opie::OPimContactAccess::SortFileAsName, + Opie::OPimContactAccess::FilterCategory, m_curr_category ); m_curr_Contact = 0; } updateView( true ); } void AbView::setListOrder( const QValueList<int>& ordered ) { m_orderedFields = ordered; if ( m_abTable ){ m_abTable->setOrderedList( ordered ); m_abTable->refresh(); } updateView(); } QString AbView::showCategory() const { return mCat.label( "Contacts", m_curr_category ); } void AbView::showPersonal( bool personal ) { odebug << "void AbView::showPersonal( " << personal << " )" << oendl; if ( personal ){ if ( m_inPersonal ) return; // Now switch to vCard Backend and load data. // The current default backend will be stored // to avoid unneeded load/stores. m_storedDB = m_contactdb; Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, addressbookPersonalVCardName() ); m_contactdb = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); m_inPersonal = true; m_curr_View = CardView; }else{ if ( !m_inPersonal ) return; // Remove vCard Backend and restore default m_contactdb->save(); delete m_contactdb; m_contactdb = m_storedDB; m_storedDB = 0l; m_curr_View = TableView; m_inPersonal = false; } load(); } void AbView::setCurrentUid( int uid ){ m_curr_Contact = uid; updateView( true ); //true: Don't modificate the UID ! } QStringList AbView::categories() { mCat.load( categoryFileName() ); QStringList categoryList = mCat.labels( "Contacts" ); return categoryList; } // BEGIN: Slots void AbView::slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, bool , QString cat ) { // owarn << "void AbView::slotDoFind" << oendl; // We reloading the data: Deselect Letterpicker emit signalClearLetterPicker(); // Use the current Category if nothing else selected int category = 0; if ( cat.isEmpty() ) category = m_curr_category; else{ category = mCat.id("Contacts", cat ); } // odebug << "Find in Category " << category << oendl; QRegExp r( str ); r.setCaseSensitive( caseSensitive ); r.setWildcard( !useRegExp ); // Get all matching entries out of the database m_list = m_contactdb->matchRegexp( r ); // odebug << "Found: " << m_list.count() << oendl; if ( m_list.count() == 0 ){ emit signalNotFound(); return; } // Now remove all contacts with wrong category (if any selected) // This algorithm is a litte bit ineffective, but // we will not have a lot of matching entries.. - if ( m_curr_category != -1 ) + if ( m_curr_category != 0 ) clearForCategory(); // Now show all found entries updateView( true ); } void AbView::offSearch() { m_inSearch = false; load(); } void AbView::slotSwitch(){ // odebug << "AbView::slotSwitch()" << oendl; m_prev_View = m_curr_View; switch ( (int) m_curr_View ){ case TableView: odebug << "Switching to CardView" << oendl; m_curr_View = CardView; break; case CardView: odebug << "Switching to TableView" << oendl; m_curr_View = TableView; break; } updateView(); } // END: Slots void AbView::clearForCategory() { Opie::OPimContactAccess::List::Iterator it; // Now remove all contacts with wrong category if any category selected Opie::OPimContactAccess::List allList = m_list; - if ( m_curr_category != -1 ){ + if ( m_curr_category != 0 ){ for ( it = allList.begin(); it != allList.end(); ++it ){ if ( !contactCompare( *it, m_curr_category ) ){ //odebug << "Removing " << (*it).uid() << oendl; m_list.remove( (*it).uid() ); } } } } bool AbView::contactCompare( const Opie::OPimContact &cnt, int category ) { // odebug << "bool AbView::contactCompare( const Opie::OPimContact &cnt, " // << category << " )" << oendl; bool returnMe; QArray<int> cats; cats = cnt.categories(); // odebug << "Number of categories: " << cats.count() << oendl; returnMe = false; - if ( cats.count() == 0 && category == 0 ) + if ( cats.count() == 0 && category == -1 ) // Contacts with no category will just shown on "All" and "Unfiled" returnMe = true; else { int i; for ( i = 0; i < int(cats.count()); i++ ) { //odebug << "Comparing " << cats[i] << " with " << category << oendl; if ( cats[i] == category ) { returnMe = true; break; } } } // odebug << "Return: " << returnMe << oendl; return returnMe; } // In Some rare cases we have to update all lists.. void AbView::updateListinViews() { m_abTable -> setContacts( m_list ); m_ablabel -> setContacts( m_list ); } void AbView::updateView( bool newdata ) { // odebug << "AbView::updateView()" << oendl; if ( m_viewStack -> visibleWidget() ){ m_viewStack -> visibleWidget() -> clearFocus(); } // If we switching the view, we have to store some information if ( !newdata ){ if ( m_list.count() ){ switch ( (int) m_prev_View ) { case TableView: m_curr_Contact = m_abTable -> currentEntry_UID(); break; case CardView: m_curr_Contact = m_ablabel -> currentEntry_UID(); break; } }else m_curr_Contact = 0; } // Feed all views with new lists if ( newdata ) updateListinViews(); // Tell the world that the view is changed if ( m_curr_View != m_prev_View ) emit signalViewSwitched ( (int) m_curr_View ); m_prev_View = m_curr_View; // Switch to new View switch ( (int) m_curr_View ) { case TableView: m_abTable -> setChoiceSelection( m_orderedFields ); if ( m_curr_Contact != 0 ) m_abTable -> selectContact ( m_curr_Contact ); m_abTable -> setFocus(); break; case CardView: if ( m_curr_Contact != 0 ) m_ablabel -> selectContact( m_curr_Contact ); m_ablabel -> setFocus(); break; } // Raise the current View m_viewStack -> raiseWidget( m_curr_View ); } 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 @@ -1,886 +1,889 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** Copyright (C) 2003 Stefan Eilers (eilers.stefan@epost.de) ** ** This file is part of the Open Palmtop Environment (see www.opie.info). ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** **********************************************************************/ #define QTOPIA_INTERNAL_FD // #include "addresssettings.h" #include "addressbook.h" #include <opie2/odebug.h> #include <opie2/ofileselector.h> #include <opie2/ofiledialog.h> #include <opie2/opimcontact.h> #include <opie2/ocontactaccessbackend_vcard.h> #include <qpe/resource.h> #include <qpe/ir.h> #include <qpe/qpemessagebox.h> #include <qmenubar.h> // #include <qtoolbar.h> // #include <qmenubar.h> #include <qpe/qpeapplication.h> #include <qaction.h> #include <qlayout.h> #include <qmessagebox.h> #include <qtoolbutton.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include "picker.h" #include "configdlg.h" extern QString addressbookPersonalVCardName(); AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, WFlags /*f*/ ) : Opie::OPimMainWindow( "Addressbook", "Contacts", tr( "Contact" ), "AddressBook", parent, name, WType_TopLevel | WStyle_ContextHelp ), abEditor(0l), syncing(false) { setCaption( tr( "Contacts" ) ); isLoading = true; m_config.load(); // Create Views m_listContainer = new QWidget( this ); QVBoxLayout *vb = new QVBoxLayout( m_listContainer ); m_abView = new AbView( m_listContainer, m_config.orderList() ); vb->addWidget( m_abView ); connect( m_abView, SIGNAL(signalViewSwitched(int)), this, SLOT(slotViewSwitched(int)) ); QObject::connect( m_abView, SIGNAL(signalNotFound()), this, SLOT(slotNotFound()) ); // Letter Picker pLabel = new LetterPicker( m_listContainer ); connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); connect(m_abView, SIGNAL(signalClearLetterPicker()), pLabel, SLOT(clear()) ); vb->addWidget( pLabel ); // Quick search bar m_searchBar = new OFloatBar( "Search", this, QMainWindow::Top, true ); m_searchBar->setHorizontalStretchable( true ); m_searchBar->hide(); m_searchEdit = new QLineEdit( m_searchBar, "m_searchEdit" ); m_searchBar->setStretchableWidget( m_searchEdit ); connect( m_searchEdit, SIGNAL(returnPressed()), this, SLOT(slotFind()) ); QAction *a = new QAction( tr( "Start Search" ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 ); connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); a->addTo( m_searchBar ); // Insert Contact menu items QActionGroup *items = new QActionGroup( this, QString::null, false ); m_actionMail = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "addressbook/sendmail" ), QString::null, 0, items, 0 ); connect( m_actionMail, SIGNAL(activated()), this, SLOT(writeMail()) ); a = new QAction( tr("Import vCard"), Resource::loadPixmap( "addressbook/fileimport"), QString::null, 0, items, 0 ); connect( a, SIGNAL(activated()), this, SLOT(importvCard()) ); a = new QAction( tr("Export vCard"), Resource::loadPixmap( "addressbook/fileexport"), QString::null, 0, items, 0 ); connect( a, SIGNAL(activated()), this, SLOT(exportvCard()) ); m_actionPersonal = new QAction( tr("My Personal Details"), Resource::loadPixmap( "addressbook/identity" ), QString::null, 0, items, 0 , true ); connect( m_actionPersonal, SIGNAL(activated()), this, SLOT(slotPersonalView()) ); insertItemMenuItems( items ); // Insert View menu items items = new QActionGroup( this, QString::null, false ); a = new QAction( tr("Show quick search bar"),QString::null, 0, items, 0, true ); connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowFind(bool)) ); insertViewMenuItems( items ); // Fontsize defaultFont = new QFont( m_abView->font() ); slotSetFont(m_config.fontSize()); m_curFontSize = m_config.fontSize(); setCentralWidget(m_listContainer); // odebug << "adressbook contrsuction: t=" << t.elapsed() << oendl; connect( qApp, SIGNAL(flush()), this, SLOT(flush()) ); connect( qApp, SIGNAL(reload()), this, SLOT(reload()) ); connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), this, SLOT(appMessage(const QCString&,const QByteArray&)) ); isLoading = false; // Handle category selection setViewCategory( m_config.category() ); m_abView->setShowByCategory( m_config.category() ); connect( this, SIGNAL(categorySelected(const QString&)), this, SLOT(slotSetCategory(const QString&)) ); } void AddressbookWindow::slotSetFont( int size ) { odebug << "void AddressbookWindow::slotSetFont( " << size << " )" << oendl; if (size > 2 || size < 0) size = 1; m_config.setFontSize( size ); QFont *currentFont; switch (size) { case 0: m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) ); currentFont = new QFont (m_abView->font()); // abList->resizeRows(currentFont->pixelSize() + 7); :SX // abList->resizeRows(); break; case 1: m_abView->setFont( *defaultFont ); currentFont = new QFont (m_abView->font()); // // abList->resizeRows(currentFont->pixelSize() + 7); // abList->resizeRows(); break; case 2: m_abView->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) ); currentFont = new QFont (m_abView->font()); // //abList->resizeRows(currentFont->pixelSize() + 7); // abList->resizeRows(); break; } } void AddressbookWindow::importvCard() { QString str = Opie::Ui::OFileDialog::getOpenFileName( 1,"/");//,"", "*", this ); if(!str.isEmpty() ){ setDocument((const QString&) str ); } } void AddressbookWindow::exportvCard() { odebug << "void AddressbookWindow::exportvCard()" << oendl; QString filename = Opie::Ui::OFileDialog::getSaveFileName( 1,"/home/"); //,"", "*", this ); if( !filename.isEmpty() && ( filename[filename.length()-1] != '/' ) ){ odebug << " Save to file " << filename << ", (" << filename.length()-1 << ")" << oendl; Opie::OPimContact curCont = m_abView->currentEntry(); if ( !curCont.isEmpty() ){ Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, filename ); Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook_exp", QString::null , vcard_backend, true ); if ( access ){ access->add( curCont ); access->save(); } delete access; }else QMessageBox::critical( 0, "Export VCard", QString( tr( "You have to select a contact !") ) ); }else QMessageBox::critical( 0, "Export VCard", QString( tr( "You have to set a filename !") ) ); } void AddressbookWindow::setDocument( const QString &filename ) { odebug << "void AddressbookWindow::setDocument( " << filename << " )" << oendl; // Switch to default backend. This should avoid to import into // the personal database accidently. if ( m_actionPersonal->isOn() ){ m_actionPersonal->setOn( false ); slotPersonalView(); } if ( filename.find(".vcf") != int(filename.length()) - 4 ){ switch( QMessageBox::information( this, tr ( "Right file type ?" ), tr( "The selected file \n does not end with \".vcf\".\n Do you really want to open it?" ), tr( "&Yes" ), tr( "&No" ), QString::null, 0, // Enter == button 0 2 ) ) { // Escape == button 2 case 0: odebug << "YES clicked" << oendl; break; case 1: odebug << "NO clicked" << oendl; return; break; } } Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, filename ); Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); Opie::OPimContactAccess::List allList = access->allRecords(); odebug << "Found number of contacts in File: " << allList.count() << oendl; if ( !allList.count() ) { QMessageBox::information( this, "Import VCard", "It was impossible to import\nthe VCard.\n" "The VCard may be corrupted!" ); } bool doAsk = true; Opie::OPimContactAccess::List::Iterator it; for ( it = allList.begin(); it != allList.end(); ++it ){ odebug << "Adding Contact from: " << (*it).fullName() << oendl; if ( doAsk ){ switch( QMessageBox::information( this, tr ( "Add Contact?" ), tr( "Do you really want add contact for \n%1?" ) .arg( (*it).fullName().latin1() ), tr( "&Yes" ), tr( "&No" ), tr( "&All Yes"), 0, // Enter == button 0 2 ) ) { // Escape == button 2 case 0: odebug << "YES clicked" << oendl; m_abView->addEntry( *it ); break; case 1: odebug << "NO clicked" << oendl; break; case 2: odebug << "YesAll clicked" << oendl; doAsk = false; break; } }else m_abView->addEntry( *it ); } delete access; } void AddressbookWindow::resizeEvent( QResizeEvent *e ) { QMainWindow::resizeEvent( e ); } AddressbookWindow::~AddressbookWindow() { ToolBarDock dock; int dummy; bool bDummy; getLocation ( listTools, dock, dummy, bDummy, dummy ); m_config.setToolBarDock( dock ); m_config.save(); } int AddressbookWindow::create() { return 0; } bool AddressbookWindow::remove( int /*uid*/ ) { return false; } void AddressbookWindow::beam( int /*uid*/ ) { } void AddressbookWindow::show( int /*uid*/ ) { } void AddressbookWindow::edit( int /*uid*/ ) { } void AddressbookWindow::add( const Opie::OPimRecord& ) { } void AddressbookWindow::slotItemNew() { Opie::OPimContact cnt; if( !syncing ) { editEntry( NewEntry ); } else { QMessageBox::warning(this, tr("Contacts"), tr("Can not edit data, currently syncing")); } } void AddressbookWindow::slotItemEdit() { if(!syncing) { if (m_actionPersonal->isOn()) { editPersonal(); } else { editEntry( EditEntry ); } } else { QMessageBox::warning( this, tr("Contacts"), tr("Can not edit data, currently syncing") ); } } void AddressbookWindow::slotItemDuplicate() { if(!syncing) { Opie::OPimContact entry = m_abView->currentEntry(); entry.assignUid(); m_abView->addEntry( entry ); m_abView->setCurrentUid( entry.uid() ); } else { QMessageBox::warning( this, tr("Contacts"), tr("Can not edit data, currently syncing") ); } } void AddressbookWindow::slotItemDelete() { if(!syncing) { Opie::OPimContact tmpEntry = m_abView ->currentEntry(); // get a name, do the best we can... QString strName = tmpEntry.fullName(); if ( strName.isEmpty() ) { strName = tmpEntry.company(); if ( strName.isEmpty() ) strName = "No Name"; } if ( QPEMessageBox::confirmDelete( this, tr( "Contacts" ), strName ) ) { m_abView->removeEntry( tmpEntry.uid() ); } } else { QMessageBox::warning( this, tr("Contacts"), tr("Can not edit data, currently syncing") ); } } static const char * beamfile = "/tmp/obex/contact.vcf"; void AddressbookWindow::slotItemBeam() { QString beamFilename; Opie::OPimContact c; if ( m_actionPersonal->isOn() ) { beamFilename = addressbookPersonalVCardName(); if ( !QFile::exists( beamFilename ) ) return; // can't beam a non-existent file Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, beamFilename ); Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); Opie::OPimContactAccess::List allList = access->allRecords(); Opie::OPimContactAccess::List::Iterator it = allList.begin(); // Just take first c = *it; delete access; } else { unlink( beamfile ); // delete if exists mkdir("/tmp/obex/", 0755); c = m_abView -> currentEntry(); Opie::OPimContactAccessBackend* vcard_backend = new Opie::OPimContactAccessBackend_VCard( QString::null, beamfile ); Opie::OPimContactAccess* access = new Opie::OPimContactAccess ( "addressbook", QString::null , vcard_backend, true ); access->add( c ); access->save(); delete access; beamFilename = beamfile; } odebug << "Beaming: " << beamFilename << oendl; Ir *ir = new Ir( this ); connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); QString description = c.fullName(); ir->send( beamFilename, description, "text/x-vCard" ); } void AddressbookWindow::slotItemFind() { } void AddressbookWindow::slotConfigure() { ConfigDlg* dlg = new ConfigDlg( this, "Config" ); dlg -> setConfig( m_config ); if ( QPEApplication::execDialog( dlg ) ) { odebug << "Config Dialog accepted!" << oendl; m_config = dlg -> getConfig(); if ( m_curFontSize != m_config.fontSize() ){ odebug << "Font was changed!" << oendl; m_curFontSize = m_config.fontSize(); emit slotSetFont( m_curFontSize ); } m_abView -> setListOrder( m_config.orderList() ); } delete dlg; } void AddressbookWindow::slotShowFind( bool show ) { if ( show ) { // Display search bar m_searchBar->show(); m_abView -> inSearch(); m_searchEdit->setFocus(); } else { // Hide search bar m_searchBar->hide(); m_abView -> offSearch(); } } void AddressbookWindow::slotFind() { m_abView->slotDoFind( m_searchEdit->text(), m_config.beCaseSensitive(), m_config.useRegExp(), false); m_searchEdit->clearFocus(); // m_abView->setFocus(); } void AddressbookWindow::slotViewBack() { // :SX showList(); } void AddressbookWindow::writeMail() { Opie::OPimContact c = m_abView -> currentEntry(); QString name = c.fileAs(); QString email = c.defaultEmail(); // I prefer the OPIE-Environment variable before the // QPE-one.. QString basepath = QString::fromLatin1( getenv("OPIEDIR") ); if ( basepath.isEmpty() ) basepath = QString::fromLatin1( getenv("QPEDIR") ); // Try to access the preferred. If not possible, try to // switch to the other one.. if ( m_config.useQtMail() ){ odebug << "Accessing: " << (basepath + "/bin/qtmail") << oendl; if ( QFile::exists( basepath + "/bin/qtmail" ) ){ odebug << "QCop" << oendl; QCopEnvelope e("QPE/Application/qtmail", "writeMail(QString,QString)"); e << name << email; return; } else m_config.setUseOpieMail( true ); } if ( m_config.useOpieMail() ){ odebug << "Accessing: " << (basepath + "/bin/opiemail") << oendl; if ( QFile::exists( basepath + "/bin/opiemail" ) ){ odebug << "QCop" << oendl; QCopEnvelope e("QPE/Application/opiemail", "writeMail(QString,QString)"); e << name << email; return; } else m_config.setUseQtMail( true ); } } void AddressbookWindow::beamDone( Ir *ir ) { delete ir; unlink( beamfile ); } static void parseName( const QString& name, QString *first, QString *middle, QString * last ) { int comma = name.find ( "," ); QString rest; if ( comma > 0 ) { *last = name.left( comma ); comma++; while ( comma < int(name.length()) && name[comma] == ' ' ) comma++; rest = name.mid( comma ); } else { int space = name.findRev( ' ' ); *last = name.mid( space+1 ); rest = name.left( space ); } int space = rest.find( ' ' ); if ( space <= 0 ) { *first = rest; } else { *first = rest.left( space ); *middle = rest.mid( space+1 ); } } void AddressbookWindow::appMessage(const QCString &msg, const QByteArray &data) { bool needShow = false; odebug << "Receiving QCop-Call with message " << msg << oendl; if (msg == "editPersonal()") { editPersonal(); // Categories might have changed, so reload reloadCategories(); } else if (msg == "editPersonalAndClose()") { editPersonal(); close(); } else if ( msg == "addContact(QString,QString)" ) { QDataStream stream(data,IO_ReadOnly); QString name, email; stream >> name >> email; Opie::OPimContact cnt; QString fn, mn, ln; parseName( name, &fn, &mn, &ln ); // odebug << " " << fn << " - " << mn " - " << ln << oendl; cnt.setFirstName( fn ); cnt.setMiddleName( mn ); cnt.setLastName( ln ); cnt.insertEmails( email ); cnt.setDefaultEmail( email ); cnt.setFileAs(); m_abView -> addEntry( cnt ); // :SXm_abView()->init( cnt ); editEntry( EditEntry ); // Categories might have changed, so reload reloadCategories(); } else if ( msg == "beamBusinessCard()" ) { QString beamFilename = addressbookPersonalVCardName(); if ( !QFile::exists( beamFilename ) ) return; // can't beam a non-existent file Ir *ir = new Ir( this ); connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); QString description = "mycard.vcf"; ir->send( beamFilename, description, "text/x-vCard" ); } else if ( msg == "show(int)" ) { raise(); QDataStream stream(data,IO_ReadOnly); int uid; stream >> uid; odebug << "Showing uid: " << uid << oendl; // Deactivate Personal View.. if ( m_actionPersonal->isOn() ){ m_actionPersonal->setOn( false ); slotPersonalView(); } // Reset category and show as card.. m_abView -> setShowByCategory( QString::null ); m_abView -> setCurrentUid( uid ); slotViewSwitched ( AbView::CardView ); needShow = true; } else if ( msg == "edit(int)" ) { QDataStream stream(data,IO_ReadOnly); int uid; stream >> uid; // Deactivate Personal View.. if ( m_actionPersonal->isOn() ){ m_actionPersonal->setOn( false ); slotPersonalView(); } // Reset category and edit.. m_abView -> setShowByCategory( QString::null ); m_abView -> setCurrentUid( uid ); slotItemEdit(); // Categories might have changed, so reload reloadCategories(); } if (needShow) QPEApplication::setKeepRunning(); } void AddressbookWindow::editEntry( EntryMode entryMode ) { Opie::OPimContact entry; if ( !abEditor ) { abEditor = new ContactEditor( entry, this, "editor" ); } if ( entryMode == EditEntry ) abEditor->setEntry( m_abView -> currentEntry() ); else if ( entryMode == NewEntry ) abEditor->setEntry( entry ); // Set the dialog caption if ( m_actionPersonal->isOn() ) abEditor->setCaption( tr( "Edit My Personal Details" ) ); else abEditor->setCaption( tr( "Edit Contact" ) ); // fix the focus... abEditor->setNameFocus(); if ( QPEApplication::execDialog( abEditor ) == QDialog::Accepted ) { setFocus(); if ( entryMode == NewEntry ) { Opie::OPimContact insertEntry = abEditor->entry(); insertEntry.assignUid(); m_abView -> addEntry( insertEntry ); m_abView -> setCurrentUid( insertEntry.uid() ); } else { Opie::OPimContact replEntry = abEditor->entry(); if ( !replEntry.isValidUid() ) replEntry.assignUid(); m_abView -> replaceEntry( replEntry ); } // Categories might have changed, so reload reloadCategories(); } } void AddressbookWindow::editPersonal() { Opie::OPimContact entry; // Switch to personal view if not selected // but take care of the menu, too if ( ! m_actionPersonal->isOn() ){ odebug << "*** ++++" << oendl; m_actionPersonal->setOn( true ); slotPersonalView(); } if ( !abEditor ) { abEditor = new ContactEditor( entry, this, "editor" ); } abEditor->setPersonalView( true ); editEntry( EditEntry ); abEditor->setPersonalView( false ); } void AddressbookWindow::slotPersonalView() { odebug << "slotPersonalView()" << oendl; bool personal = m_actionPersonal->isOn(); // Disable actions when showing personal details setItemNewEnabled( !personal ); setItemDuplicateEnabled( !personal ); setItemDeleteEnabled( !personal ); m_actionMail->setEnabled( !personal ); setShowCategories( !personal ); // Display appropriate view m_abView->showPersonal( personal ); if ( personal ) { setCaption( tr( "Contacts - My Personal Details") ); // Set category to 'All' to make sure personal details is visible setViewCategory( "All" ); m_abView->setShowByCategory( "All" ); // Temporarily disable letter picker pLabel->hide(); } else { setCaption( tr( "Contacts") ); // Re-enable letter picker pLabel->show(); } } void AddressbookWindow::reload() { syncing = false; m_abView->clear(); m_abView->reload(); } void AddressbookWindow::flush() { syncing = true; m_abView->save(); } void AddressbookWindow::closeEvent( QCloseEvent *e ) { if ( active_view == AbView::CardView ) { if ( !m_actionPersonal->isOn() ) { // Switch to table view only if not editing personal details slotViewSwitched( AbView::TableView ); } else { // If currently editing personal details, switch off personal view m_actionPersonal->setOn( false ); slotPersonalView(); } e->ignore(); return; } if(syncing) { /* shouldn't we save, I hear you say? well its already been set so that an edit can not occur during a sync, and we flushed at the start of the sync, so there is no need to save Saving however itself would cause problems. */ e->accept(); return; } //################## shouldn't always save // True, but the database handles this automatically ! (se) if ( save() ) e->accept(); else e->ignore(); } /* Returns true if it is OK to exit */ bool AddressbookWindow::save() { if ( !m_abView->save() ) { if ( QMessageBox::critical( 0, tr( "Out of space" ), tr("Unable to save information.\n" "Free up some space\n" "and try again.\n" "\nQuit anyway?"), QMessageBox::Yes|QMessageBox::Escape, QMessageBox::No|QMessageBox::Default ) != QMessageBox::No ) return true; else return false; } return true; } #ifdef __DEBUG_RELEASE void AddressbookWindow::slotSave() { save(); } #endif void AddressbookWindow::slotNotFound() { odebug << "Got not found signal!" << oendl; QMessageBox::information( this, tr( "Not Found" ), "<qt>" + tr( "Unable to find a contact for this search pattern!" ) + "</qt>" ); } void AddressbookWindow::slotWrapAround() { odebug << "Got wrap signal!" << oendl; // if ( doNotifyWrapAround ) // QMessageBox::information( this, tr( "End of list" ), // tr( "End of list. Wrap around now...!" ) + "\n" ); } void AddressbookWindow::slotSetCategory( const QString &category ) { odebug << "void AddressbookWindow::slotSetCategory( " << category << " )" << oendl; // Tell the view about the selected category - m_config.setCategory( category ); - m_abView -> setShowByCategory( category ); + QString cat = category; + if ( cat == tr( "All" ) ) + cat = QString::null; + m_config.setCategory( cat ); + m_abView -> setShowByCategory( cat ); } void AddressbookWindow::slotViewSwitched( int view ) { odebug << "void AddressbookWindow::slotViewSwitched( " << view << " )" << oendl; // Tell the view about the selected view m_abView -> setShowToView ( (AbView::Views) view ); active_view = view; } void AddressbookWindow::slotListView() { slotViewSwitched( AbView::TableView ); } void AddressbookWindow::slotCardView() { slotViewSwitched( AbView::CardView ); } void AddressbookWindow::slotSetLetter( char c ) { m_abView->setShowByLetter( c, m_config.letterPickerSearch() ); } |