author | eilers <eilers> | 2002-10-20 12:24:37 (UTC) |
---|---|---|
committer | eilers <eilers> | 2002-10-20 12:24:37 (UTC) |
commit | 4b27ac49b4027ffd59d2606f1aceea313446aede (patch) (side-by-side diff) | |
tree | c03c578b727fbb95ffd0e2f2b8a2b6275ca781d5 | |
parent | 82689364fd558ccd28253961204e6b3eb9e32b03 (diff) | |
download | opie-4b27ac49b4027ffd59d2606f1aceea313446aede.zip opie-4b27ac49b4027ffd59d2606f1aceea313446aede.tar.gz opie-4b27ac49b4027ffd59d2606f1aceea313446aede.tar.bz2 |
Connected configuration to search engine
-rw-r--r-- | core/pim/addressbook/TODO | 18 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.cpp | 3 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.h | 2 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 2 |
4 files changed, 14 insertions, 11 deletions
diff --git a/core/pim/addressbook/TODO b/core/pim/addressbook/TODO index 0accd87..4daa2a8 100644 --- a/core/pim/addressbook/TODO +++ b/core/pim/addressbook/TODO @@ -1,31 +1,33 @@ -Stuff todo: +Stuff todo until OPIE 1.0 : Urgent: - Font menu is invisible using german translation Important: -- Finishing of new View functions (List, Phonebook...) -- Reload if contacts were changed externally +- Picker: Activated letter schould be more visible - "What's this" should be added -- The names of the countries are sorted by there english names, only.. - Even if they are translated.. :S - Store last settings of combo-boxes - Mail-Icon is missing +- Finishing of new View functions (List, Phonebook...) +- The names of the countries are sorted by there english names, only.. + Even if they are translated.. :S +- Reload if contacts were changed externally Less important: -- Find widget should be replaced by something like - qpdf has. - The picker (alphabetical sort widget) should be placed verticaly or horizontally (configurable) - Use advanced database functions in abtable to decrease memory footprint and to make everything more easy ! (abtable should store Iterator for selected Category) -Should be Fixed (not absolute sure, need validation): +Should be Fixed (not absolute sure, need further validation): - "Nonenglish" translation bug has to be fixed. Fixed: - Syncing: abtable not reloaded after sync. +- Find widget should be replaced by something like + qpdf has. +- Adding a configuration dialog
\ No newline at end of file diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp index 97f4a8f..d4dcf7b 100644 --- a/core/pim/addressbook/abtable.cpp +++ b/core/pim/addressbook/abtable.cpp @@ -445,406 +445,407 @@ QString AbTable::findContactContact( const OContact &entry, int /* row */ ) } void AbTable::addEntry( const OContact &newCnt ) { int row = numRows(); setNumRows( row + 1 ); insertIntoTable( newCnt, row ); qWarning("abtable:AddContact"); m_contactdb.add ( newCnt ); setCurrentCell( row, 0 ); // updateVisible(); } void AbTable::resizeRows() { /* if (numRows()) { for (int i = 0; i < numRows(); i++) { setRowHeight( i, size ); } } updateVisible(); */ } bool AbTable::save() { // QTime t; // t.start(); qWarning("abtable:Save data"); return m_contactdb.save(); } void AbTable::load() { setSorting( false ); setUpdatesEnabled( FALSE ); qWarning("abtable:Load data"); OContactAccess::List list = m_contactdb.allRecords(); OContactAccess::List::Iterator it; setNumRows( list.count() ); int row = 0; for ( it = list.begin(); it != list.end(); ++it ) insertIntoTable( *it, row++ ); setUpdatesEnabled( TRUE ); setSorting( true ); resort(); } void AbTable::reload() { m_contactdb.reload(); load(); } void AbTable::realignTable( int row ) { QTableItem *ti1, *ti2; int totalRows = numRows(); for ( int curr = row; curr < totalRows - 1; curr++ ) { // the same info from the todo list still applies, but I // don't think it is _too_ bad. ti1 = item( curr + 1, 0 ); ti2 = item( curr + 1, 1 ); takeItem( ti1 ); takeItem( ti2 ); setItem( curr, 0, ti1 ); setItem( curr, 1, ti2 ); } setNumRows( totalRows - 1 ); resort(); } // Add contact into table. void AbTable::insertIntoTable( const OContact &cnt, int row ) { QString strName, strContact; strName = findContactName( cnt ); strContact = findContactContact( cnt, row ); AbTableItem *ati; ati = new AbTableItem( this, QTableItem::Never, strName, strContact); contactList.insert( ati, cnt ); setItem( row, 0, ati ); ati = new AbTableItem( this, QTableItem::Never, strContact, strName); setItem( row, 1, ati ); //### cannot do this; table only has two columns at this point // setItem( row, 2, new AbPickItem( this ) ); // resort at some point? } // Replace or add an entry void AbTable::journalFreeReplace( const OContact &cnt, int row ) { QString strName, strContact; AbTableItem *ati = 0l; strName = findContactName( cnt ); strContact = findContactContact( cnt, row ); ati = static_cast<AbTableItem*>(item(row, 0)); // Replace element if found in row "row" // or add this element if not. if ( ati != 0 ) { // replace // :SX db access -> replace qWarning ("Replace Contact in DB ! UID: %d", contactList[ati].uid() ); m_contactdb.replace ( cnt ); contactList.remove( ati ); ati->setItem( strName, strContact ); contactList.insert( ati, cnt ); ati = static_cast<AbTableItem*>(item(row, 1)); ati->setItem( strContact, strName ); }else{ // add int myrows = numRows(); setNumRows( myrows + 1 ); insertIntoTable( cnt, myrows ); // gets deleted when returning -- Why ? (se) // :SX db access -> add qWarning ("Are you sure to add to database ? -> Currently disabled !!"); // m_contactdb.add( cnt ); } } // Remove entry void AbTable::journalFreeRemove( int row ) { AbTableItem *ati; ati = static_cast<AbTableItem*>(item(row, 0)); if ( !ati ) return; // :SX db access -> remove qWarning ("Remove Contact from DB ! UID: %d",contactList[ati].uid() ); m_contactdb.remove( contactList[ati].uid() ); contactList.remove( ati ); realignTable( row ); } #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::slotDoFind( const QString &findString, bool caseSensitive, +void AbTable::slotDoFind( const QString &findString, bool caseSensitive, bool useRegExp, bool backwards, QString cat /* int category */ ) { int category = 0; // Use the current Category if nothing else selected if ( cat.isEmpty() ) category = mCat.id( "Contacts", showCat ); else{ category = mCat.id("Contacts", cat ); } qWarning ("Found in Category %d", category); if ( currFindRow < -1 ) currFindRow = - 1; clearSelection( TRUE ); int rows, row; AbTableItem *ati; QRegExp r( findString ); r.setCaseSensitive( caseSensitive ); + r.setWildcard( !useRegExp ); rows = numRows(); static bool wrapAround = true; if ( !backwards ) { for ( row = currFindRow + 1; row < rows; row++ ) { ati = static_cast<AbTableItem*>( item(row, 0) ); if ( contactCompare( contactList[ati], r, category ) ) break; } } else { for ( row = currFindRow - 1; row > -1; row-- ) { ati = static_cast<AbTableItem*>( item(row, 0) ); if ( contactCompare( contactList[ati], r, category ) ) break; } } if ( row >= rows || row < 0 ) { if ( row < 0 ) currFindRow = rows; else currFindRow = -1; if ( wrapAround ) emit signalWrapAround(); else emit signalNotFound(); wrapAround = !wrapAround; } else { currFindRow = row; QTableSelection foundSelection; foundSelection.init( currFindRow, 0 ); foundSelection.expandTo( currFindRow, numCols() - 1 ); addSelection( foundSelection ); setCurrentCell( currFindRow, 0 /* numCols() - 1 */ ); wrapAround = true; } } static bool contactCompare( const OContact &cnt, const QRegExp &r, int category ) { bool returnMe; QArray<int> cats; cats = cnt.categories(); returnMe = false; if ( (cats.count() == 0) || (category == 0) ) returnMe = cnt.match( r ); else { int i; for ( i = 0; i < int(cats.count()); i++ ) { if ( cats[i] == category ) { returnMe = cnt.match( r ); break; } } } return returnMe; } void AbTable::fitColumns() { int contentsWidth = visibleWidth() / 2; if ( showBk == "Cards" ) { showColumn(1); //adjustColumn(1); setColumnWidth( 1, visibleWidth() ); columnVisible = false; } else { if ( columnVisible == false ){ showColumn(0); columnVisible = true; } setColumnWidth( 0, contentsWidth ); adjustColumn(1); if ( columnWidth(1) < contentsWidth ) setColumnWidth( 1, contentsWidth ); } } void AbTable::show() { fitColumns(); QTable::show(); } 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(); } void AbTable::itemClicked(int,int col) { if ( col == 2 ) { return; } else { emit details(); } } QStringList AbTable::choiceNames() const { return choicenames; } void AbTable::setChoiceSelection(int /*index*/, const QStringList& /*list*/) { /* ###### QString selname = choicenames.at(index); for (each row) { OContact *c = contactForRow(row); if ( list.contains(c->email) ) { list.remove(c->email); setText(row, 2, selname); } } for (remaining list items) { OContact *c = new contact(item); setText(newrow, 2, selname); } */ } QStringList AbTable::choiceSelection(int /*index*/) const { QStringList r; /* ###### QString selname = choicenames.at(index); for (each row) { OContact *c = contactForRow(row); if ( text(row,2) == selname ) { r.append(c->email); } } */ return r; } void AbTable::setShowCategory( const QString &b, const QString &c ) { showBk = b; showCat = c; //QMessageBox::information( this, "setShowCategory", "setShowCategory" ); //updateVisible(); refresh(); ensureCellVisible( currentRow(), 0 ); updateVisible(); // :SX } void AbTable::setShowByLetter( char c ) { showChar = tolower(c); updateVisible(); } QString AbTable::showCategory() const { return showCat; } QString AbTable::showBook() const { return showBk; } QStringList AbTable::categories() { mCat.load( categoryFileName() ); QStringList categoryList = mCat.labels( "Contacts" ); return categoryList; } void AbTable::updateVisible() { int visible, totalRows, diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h index 1039e66..b445874 100644 --- a/core/pim/addressbook/abtable.h +++ b/core/pim/addressbook/abtable.h @@ -1,154 +1,154 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** 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. ** **********************************************************************/ #ifndef ABTABLE_H #define ABTABLE_H #include <qpe/categories.h> #include <opie/ocontact.h> #include <qmap.h> #include <qtable.h> #include <qstringlist.h> #include <qcombobox.h> #include <opie/ocontactaccess.h> class AbTableItem : public QTableItem { public: AbTableItem( QTable *t, EditType et, const QString &s, const QString &secondSortKey); QString entryKey() const; void setEntryKey( const QString & k ); virtual int alignment() const; virtual QString key() const; void setItem( const QString &txt, const QString &secondKey ); private: QString sortKey; }; class AbPickItem : public QTableItem { public: AbPickItem( QTable *t ); QWidget *createEditor() const; void setContentFromEditor( QWidget *w ); private: QGuardedPtr<QComboBox> cb; }; class AbTable : public QTable { Q_OBJECT public: AbTable( const QValueList<int> *ordered, QWidget *parent, const char *name=0 ); ~AbTable(); // NEW void addEntry( const OContact &newContact ); OContact currentEntry(); void replaceCurrentEntry( const OContact &newContact ); void init(); void deleteCurrentEntry(); void clear(); void clearFindRow() { currFindRow = -1; } void loadFields(); void refresh(); bool save(); void load(); void reload(); // addresspicker mode void setChoiceNames( const QStringList& list); QStringList choiceNames() const; void setChoiceSelection(int index, const QStringList& list); QStringList choiceSelection(int index) const; void setShowCategory( const QString &b, const QString &c ); void setShowByLetter( char c ); QString showCategory() const; QStringList categories(); void resizeRows(); void show(); void setPaintingEnabled( bool e ); QString showBook() const; public slots: - void slotDoFind( const QString &str, bool caseSensitive, bool backwards, + void slotDoFind( const QString &str, bool caseSensitive, bool useRegExp, bool backwards, QString category = QString::null ); signals: void empty( bool ); void details(); void signalNotFound(); void signalWrapAround(); protected: virtual void keyPressEvent( QKeyEvent *e ); // int rowHeight( int ) const; // int rowPos( int row ) const; // virtual int rowAt( int pos ) const; protected slots: void moveTo( char ); virtual void columnClicked( int col ); void itemClicked(int,int col); void rowHeightChanged( int row ); private: void loadFile( const QString &strFile, bool journalFile ); void fitColumns(); void resort(); void updateJournal( const OContact &contact, OContact::journal_action action, int row = -1 ); void insertIntoTable( const OContact &contact, int row ); QString findContactName( const OContact &entry ); QString findContactContact( const OContact &entry, int row ); void journalFreeReplace( const OContact &cnt, int row ); void journalFreeRemove( int row ); void realignTable( int ); void updateVisible(); int lastSortCol; bool asc; char showChar; QMap<AbTableItem*, OContact> contactList; const QValueList<int> *intFields; int currFindRow; QString showCat; QStringList choicenames; bool enablePainting; Categories mCat; QString showBk; bool columnVisible; OContactAccess m_contactdb; }; #endif // ABTABLE_H diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index 84e66fb..f7e4c95 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -755,302 +755,302 @@ void AddressbookWindow::closeEvent( QCloseEvent *e ) 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 ( !abList->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::slotSettings() { AddressSettings frmSettings( this ); #if defined(Q_WS_QWS) || defined(_WS_QWS_) frmSettings.showMaximized(); #endif if ( frmSettings.exec() ) { allFields.clear(); orderedFields.clear(); slOrderedFields.clear(); initFields(); if ( abEditor ) abEditor->loadFields(); abList->refresh(); } } void AddressbookWindow::initFields() { // we really don't need the things from the configuration, anymore // only thing that is important are the important categories. So, // Call the contact functions that correspond to these old functions... QStringList xmlFields = OContact::fields(); QStringList visibleFields = OContact::untrfields(); // QStringList trFields = OContact::trfields(); xmlFields.remove( "Title" ); visibleFields.remove( "Name Title" ); visibleFields.remove( "Notes" ); int i, version; Config cfg( "AddressBook" ); QString zn; // ### Write a function to keep this from happening again... QStringList::ConstIterator it; for ( i = 0, it = xmlFields.begin(); it != xmlFields.end(); ++it, i++ ) { allFields.append( i + 3 ); } cfg.setGroup( "Version" ); version = cfg.readNumEntry( "version" ); i = 0; startFontSize = 1; if ( version >= ADDRESSVERSION ) { cfg.setGroup( "ImportantCategory" ); zn = cfg.readEntry( "Category" + QString::number(i), QString::null ); while ( !zn.isNull() ) { if ( zn.contains( "Work" ) || zn.contains( "Mb" ) ) { slOrderedFields.clear(); break; } slOrderedFields.append( zn ); zn = cfg.readEntry( "Category" + QString::number(++i), QString::null ); } cfg.setGroup( "Font" ); startFontSize = cfg.readNumEntry( "fontSize", 1 ); } else { QString str; str = getenv("HOME"); str += "/Settings/AddressBook.conf"; QFile::remove( str ); } if ( slOrderedFields.count() > 0 ) { for( QStringList::ConstIterator it = slOrderedFields.begin(); it != slOrderedFields.end(); ++it ) { QValueList<int>::ConstIterator itVl; QStringList::ConstIterator itVis; itVl = allFields.begin(); for ( itVis = visibleFields.begin(); itVis != visibleFields.end() && itVl != allFields.end(); ++itVis, ++itVl ) { if ( *it == *itVis && itVl != allFields.end() ) { orderedFields.append( *itVl ); } } } } else { QValueList<int>::ConstIterator it; for ( it = allFields.begin(); it != allFields.end(); ++it ) orderedFields.append( *it ); slOrderedFields = visibleFields; orderedFields.remove( Qtopia::AddressUid ); orderedFields.remove( Qtopia::Title ); orderedFields.remove( Qtopia::Groups ); orderedFields.remove( Qtopia::AddressCategory ); orderedFields.remove( Qtopia::FirstName ); orderedFields.remove( Qtopia::LastName ); orderedFields.remove( Qtopia::DefaultEmail ); orderedFields.remove( Qtopia::FileAs ); orderedFields.remove( Qtopia::Notes ); orderedFields.remove( Qtopia::Gender ); slOrderedFields.remove( "Name Title" ); slOrderedFields.remove( "First Name" ); slOrderedFields.remove( "Last Name" ); slOrderedFields.remove( "File As" ); slOrderedFields.remove( "Default Email" ); slOrderedFields.remove( "Notes" ); slOrderedFields.remove( "Gender" ); } } AbLabel *AddressbookWindow::abView() { if ( !mView ) { mView = new AbLabel( this, "viewer" ); mView->init( OContact() ); connect( mView, SIGNAL( okPressed() ), this, SLOT( slotListView() ) ); } return mView; } void AddressbookWindow::slotFindOpen() { searchBar->show(); searchEdit->setFocus(); } void AddressbookWindow::slotFindClose() { searchBar->hide(); abList->setFocus(); } void AddressbookWindow::slotFindNext() { if ( centralWidget() == abView() ) showList(); // Maybe we should react on Wraparound and notfound ? // QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); // QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); - abList->slotDoFind( searchEdit->text(), false, false); + abList->slotDoFind( searchEdit->text(), caseSensitive, useRegExp, false); if ( abList->numSelections() ) abList->clearSelection(); } void AddressbookWindow::slotFind() { abList->clearFindRow(); slotFindNext(); } void AddressbookWindow::slotSetCategory( int c ) { QString cat, book; if ( c <= 0 ) return; // Set checkItem for selected one for ( unsigned int i = 1; i < catMenu->count(); i++ ) catMenu->setItemChecked( i, c == (int)i ); for ( unsigned int i = 1; i < catMenu->count(); i++ ) { if (catMenu->isItemChecked( i )) { if ( i == 1 ) // default List view book = QString::null; else if ( i == 2 ) book = "Phone"; else if ( i == 3 ) book = "Company"; else if ( i == 4 ) book = "Email"; else if ( i == 5 ) book = "Cards"; else if ( i == 6 ) // default All Categories cat = QString::null; else if ( i == (unsigned int)catMenu->count() ) // last menu option will be Unfiled cat = "Unfiled"; else cat = abList->categories()[i - 7]; } } abList->setShowCategory( book, cat ); if ( book.isEmpty() ) book = "List"; if ( cat.isEmpty() ) cat = "All"; setCaption( tr( "Contacts" ) + " - " + tr( book ) + " - " + tr( cat ) ); } void AddressbookWindow::slotSetLetter( char c ) { abList->setShowByLetter( c ); } void AddressbookWindow::populateCategories() { catMenu->clear(); int id, rememberId; id = 1; rememberId = 0; catMenu->insertItem( tr( "List" ), id++ ); catMenu->insertItem( tr( "Phone Book" ), id++ ); catMenu->insertItem( tr( "Company Book" ), id++ ); catMenu->insertItem( tr( "Email Book" ), id++ ); catMenu->insertItem( tr( "Cards" ), id++ ); catMenu->insertSeparator(); catMenu->insertItem( tr( "All" ), id++ ); QStringList categories = abList->categories(); categories.append( tr( "Unfiled" ) ); for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) { catMenu->insertItem( *it, id ); if ( *it == abList->showCategory() ) rememberId = id; ++id; } if ( abList->showBook().isEmpty() ) { catMenu->setItemChecked( 1, true ); } else if ( abList->showBook() == "Phone" ) { catMenu->setItemChecked( 2, true ); } else if ( abList->showBook() == "Company" ) { catMenu->setItemChecked( 3, true ); } else if ( abList->showBook() == "Email" ) { catMenu->setItemChecked( 4, true ); } else if ( abList->showBook() == "Cards" ) { catMenu->setItemChecked( 5, true ); } if ( abList->showCategory().isEmpty() ) { slotSetCategory( 6 ); } else { slotSetCategory( rememberId ); } } |