-rw-r--r-- | core/pim/addressbook/TODO | 4 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.cpp | 18 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.h | 2 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 75 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.h | 6 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.pro | 9 | ||||
-rw-r--r-- | core/pim/addressbook/configdlg.cpp | 45 | ||||
-rw-r--r-- | core/pim/addressbook/configdlg.h | 25 | ||||
-rw-r--r-- | core/pim/addressbook/configdlg_base.ui | 232 | ||||
-rw-r--r-- | core/pim/addressbook/ofloatbar.h | 2 |
10 files changed, 381 insertions, 37 deletions
diff --git a/core/pim/addressbook/TODO b/core/pim/addressbook/TODO index d8720b3..0accd87 100644 --- a/core/pim/addressbook/TODO +++ b/core/pim/addressbook/TODO @@ -1,29 +1,31 @@ Stuff todo: Urgent: - Font menu is invisible using german translation Important: - Finishing of new View functions (List, Phonebook...) - Reload if contacts were changed externally - "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 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): - "Nonenglish" translation bug has to be fixed. Fixed: - Syncing: abtable not reloaded after sync. diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp index 9297d6a..97f4a8f 100644 --- a/core/pim/addressbook/abtable.cpp +++ b/core/pim/addressbook/abtable.cpp @@ -67,129 +67,129 @@ int AbTableItem::alignment() const 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 ); } /*! \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 ) // #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR // : QTable( 0, 0, parent, name, TRUE ), // #else : QTable( parent, name ), // #endif lastSortCol( -1 ), asc( TRUE ), intFields( order ), - currFindRow( -2 ), + currFindRow( -1 ), mCat( 0 ), m_contactdb ("addressbook", 0l, 0l, false) // Handle syncing myself.. ! { mCat.load( categoryFileName() ); setSelectionMode( NoSelection ); init(); setSorting( TRUE ); connect( this, SIGNAL(clicked(int,int,int,const QPoint &)), this, SLOT(itemClicked(int,int)) ); } AbTable::~AbTable() { } void AbTable::init() { 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::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() { if ( sorting() ) { if ( lastSortCol == -1 ) lastSortCol = 0; sortColumn( lastSortCol, asc, TRUE ); //QMessageBox::information( this, "resort", "resort" ); updateVisible(); } } OContact AbTable::currentEntry() { OContact cnt; AbTableItem *abItem; abItem = static_cast<AbTableItem*>(item( currentRow(), 0 )); if ( abItem ) { cnt = contactList[abItem]; @@ -577,191 +577,193 @@ void AbTable::journalFreeReplace( const OContact &cnt, int row ) 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, bool backwards, QString cat /* int category */ ) { int category = 0; + + // Use the current Category if nothing else selected if ( cat.isEmpty() ) - category = -2; // mCat.id("Contacts", "All"); - else + category = mCat.id( "Contacts", showCat ); + else{ category = mCat.id("Contacts", cat ); + } qWarning ("Found in Category %d", category); if ( currFindRow < -1 ) - currFindRow = currentRow() - 1; + currFindRow = - 1; + clearSelection( TRUE ); int rows, row; AbTableItem *ati; QRegExp r( findString ); r.setCaseSensitive( caseSensitive ); 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 ) ) - //if ( contactCompare( contactList[row], r, category ) ) break; } } else { for ( row = currFindRow - 1; row > -1; row-- ) { ati = static_cast<AbTableItem*>( item(row, 0) ); if ( contactCompare( contactList[ati], r, category ) ) - //if ( contactCompare( contactList[row], 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, numCols() - 1 ); + 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 ( (category == -1 && cats.count() == 0) || category == -2 ) + 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(); } } diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h index a603e17..1039e66 100644 --- a/core/pim/addressbook/abtable.h +++ b/core/pim/addressbook/abtable.h @@ -13,129 +13,129 @@ ** ** 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 = -2; } + 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, 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; diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index 8335d8b..84e66fb 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -1,406 +1,440 @@ /********************************************************************** ** 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. ** ** OContact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #define QTOPIA_INTERNAL_FD #include "contacteditor.h" #include "ablabel.h" #include "abtable.h" #include "addresssettings.h" #include "addressbook.h" #include <opie/ofileselector.h> #include <opie/ofiledialog.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <opie/ocontact.h> -#ifndef MAKE_FOR_SHARP_ROM -#include <qpe/finddialog.h> -#endif - #include <qpe/global.h> #include <qpe/resource.h> #include <qpe/ir.h> #include <qpe/qpemessagebox.h> #include <qpe/qcopenvelope_qws.h> #include <qaction.h> #include <qdialog.h> #include <qdir.h> #include <qfile.h> #include <qimage.h> #include <qlayout.h> #include <qpe/qpemenubar.h> #include <qmessagebox.h> #include <qpixmap.h> #include <qpopupmenu.h> #include <qpe/qpetoolbar.h> #include <qstringlist.h> #include <qtoolbutton.h> #include <qwhatsthis.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <qdatetime.h> #include "picker.h" +#include "configdlg.h" static QString addressbookPersonalVCardName() { QString filename = Global::applicationFileName("addressbook", "businesscard.vcf"); return filename; } AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, WFlags f ) : QMainWindow( parent, name, f ), abEditor(0), + useRegExp(false), + DoSignalWrapAround(false), + caseSensitive(false), bAbEditFirstTime(TRUE), syncing(FALSE) { isLoading = true; initFields(); setCaption( tr("Contacts") ); setIcon( Resource::loadPixmap( "AddressBook" ) ); setToolBarsMovable( FALSE ); // Create Toolbars QPEToolBar *bar = new QPEToolBar( this ); bar->setHorizontalStretchable( TRUE ); QPEMenuBar *mbList = new QPEMenuBar( bar ); mbList->setMargin( 0 ); QPopupMenu *edit = new QPopupMenu( this ); mbList->insertItem( tr( "Contact" ), edit ); listTools = new QPEToolBar( this, "list operations" ); QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 0, this, 0 ); actionNew = a; connect( a, SIGNAL( activated() ), this, SLOT( slotListNew() ) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ), QString::null, 0, this, 0 ); actionEdit = a; connect( a, SIGNAL( activated() ), this, SLOT( slotViewEdit() ) ); a->addTo( edit ); a->addTo( listTools ); a = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); actionTrash = a; connect( a, SIGNAL( activated() ), this, SLOT( slotListDelete() ) ); a->addTo( edit ); a->addTo( listTools ); // make it possible to go directly to businesscard via qcop call #if defined(Q_WS_QWS) #if !defined(QT_NO_COP) QCopChannel *addressChannel = new QCopChannel("QPE/Addressbook" , this ); connect (addressChannel, SIGNAL( received(const QCString &, const QByteArray &)), this, SLOT ( appMessage(const QCString &, const QByteArray &) ) ); #endif #endif a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, this, 0 ); actionFind = a; connect( a, SIGNAL(activated()), this, SLOT( slotFindOpen()) ); a->addTo( edit ); a->addTo( listTools ); // Much better search widget, taken from QTReader.. (se) searchBar = new OFloatBar( "Search", this, QMainWindow::Top, TRUE ); searchBar->setHorizontalStretchable( TRUE ); searchBar->hide(); searchEdit = new QLineEdit( searchBar, "searchEdit" ); // QFont f("unifont", 16 /*, QFont::Bold*/); // searchEdit->setFont( f ); searchBar->setStretchableWidget( searchEdit ); connect( searchEdit, SIGNAL( returnPressed( ) ), this, SLOT( slotFind( ) ) ); a = new QAction( tr( "Find Next" ), Resource::loadPixmap( "next" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotFindNext() ) ); a->addTo( searchBar ); a = new QAction( tr( "Close Find" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotFindClose() ) ); a->addTo( searchBar ); a = new QAction( tr( "Write Mail To" ), Resource::loadPixmap( "qtmail/reply" ), QString::null, 0, this, 0 ); //a->setEnabled( FALSE ); we got support for it now :) zecke actionMail = a; connect( a, SIGNAL( activated() ), this, SLOT( writeMail() ) ); a->addTo( edit ); a->addTo( listTools ); if ( Ir::supported() ) { a = new QAction( tr ("Beam Entry" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 ); actionBeam = a; connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); a->addTo( edit ); a->addTo( listTools ); } edit->insertSeparator(); a = new QAction( tr("Import vCard"), QString::null, 0, 0, 0, TRUE ); actionPersonal = a; connect( a, SIGNAL( activated() ), this, SLOT( importvCard() ) ); a->addTo( edit ); edit->insertSeparator(); a = new QAction( tr("My Personal Details"), QString::null, 0, 0, 0, TRUE ); actionPersonal = a; connect( a, SIGNAL( activated() ), this, SLOT( slotPersonalView() ) ); a->addTo( edit ); // Do we need this function ? (se) // a = new QAction( tr( "Arrange Edit Fields"), QString::null, 0, 0 ); // connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); // a->addTo( edit ); #ifdef __DEBUG_RELEASE // Remove this function for public Release ! This is only // for debug purposes .. a = new QAction( tr( "Save all Data"), QString::null, 0, 0 ); connect( a, SIGNAL( activated() ), this , SLOT( slotSave() ) ); a->addTo( edit ); #endif - + a = new QAction( tr( "Config" ), Resource::loadPixmap( "today/config" ), QString::null, + 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( slotConfig() ) ); + a->addTo( edit ); + // Create Views listContainer = new QWidget( this ); QVBoxLayout *vb = new QVBoxLayout( listContainer ); abList = new AbTable( &orderedFields, listContainer, "table" ); vb->addWidget(abList); // abList->setHScrollBarMode( QScrollView::AlwaysOff ); connect( abList, SIGNAL( empty( bool ) ), this, SLOT( listIsEmpty( bool ) ) ); connect( abList, SIGNAL( details() ), this, SLOT( slotListView() ) ); connect( abList, SIGNAL(currentChanged(int,int)), this, SLOT(slotUpdateToolbar()) ); mView = 0; abList->load(); pLabel = new LetterPicker( listContainer ); connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); vb->addWidget(pLabel); catMenu = new QPopupMenu( this ); catMenu->setCheckable( TRUE ); connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) ); populateCategories(); mbList->insertItem( tr("View"), catMenu ); // setCentralWidget( listContainer ); fontMenu = new QPopupMenu(this); fontMenu->setCheckable( true ); connect( fontMenu, SIGNAL(activated(int)), this, SLOT(slotSetFont(int))); fontMenu->insertItem(tr( "Small" ), 0); fontMenu->insertItem(tr( "Normal" ), 1); fontMenu->insertItem(tr( "Large" ), 2); defaultFont = new QFont( abList->font() ); slotSetFont(startFontSize); mbList->insertItem( tr("Font"), fontMenu); setCentralWidget(listContainer); // qDebug("adressbook contrsuction: t=%d", t.elapsed() ); abList->setCurrentCell( 0, 0 ); + + // Read Config settings + Config cfg("AddressBook"); + cfg.setGroup("Search"); + useRegExp = cfg.readBoolEntry( "useRegExp" ); + caseSensitive = cfg.readBoolEntry( "caseSensitive" ); + DoSignalWrapAround = cfg.readBoolEntry( "signalWrapAround" ); isLoading = false; } +void AddressbookWindow::slotConfig() +{ + ConfigDlg* dlg = new ConfigDlg( this, "Config" ); + dlg -> setUseRegExp ( useRegExp ); + dlg -> setBeCaseSensitive( caseSensitive ); + dlg -> setSignalWrapAround( DoSignalWrapAround ); + dlg -> showMaximized(); + if ( dlg -> exec() ) { + qWarning ("Config Dialog accepted !"); + useRegExp = dlg -> useRegExp(); + caseSensitive = dlg -> beCaseSensitive(); + DoSignalWrapAround = dlg -> signalWrapAround(); + } + + delete dlg; +} + + void AddressbookWindow::slotSetFont( int size ) { if (size > 2 || size < 0) size = 1; startFontSize = size; QFont *currentFont; switch (size) { case 0: fontMenu->setItemChecked(0, true); fontMenu->setItemChecked(1, false); fontMenu->setItemChecked(2, false); abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() - 2 ) ); currentFont = new QFont (abList->font()); // abList->resizeRows(currentFont->pixelSize() + 7); abList->resizeRows(); break; case 1: fontMenu->setItemChecked(0, false); fontMenu->setItemChecked(1, true); fontMenu->setItemChecked(2, false); abList->setFont( *defaultFont ); currentFont = new QFont (abList->font()); // abList->resizeRows(currentFont->pixelSize() + 7); abList->resizeRows(); break; case 2: fontMenu->setItemChecked(0, false); fontMenu->setItemChecked(1, false); fontMenu->setItemChecked(2, true); abList->setFont( QFont( defaultFont->family(), defaultFont->pointSize() + 2 ) ); currentFont = new QFont (abList->font()); //abList->resizeRows(currentFont->pixelSize() + 7); abList->resizeRows(); break; } } void AddressbookWindow::importvCard() { QString str = OFileDialog::getOpenFileName( 1,"/");//,"", "*", this ); if(!str.isEmpty() ) setDocument((const QString&) str ); } void AddressbookWindow::setDocument( const QString &filename ) { if ( filename.find(".vcf") != int(filename.length()) - 4 ) return; QValueList<OContact> cl = OContact::readVCard( filename ); for( QValueList<OContact>::Iterator it = cl.begin(); it != cl.end(); ++it ) { // QString msg = tr("You received a vCard for\n%1.\nDo You want to add it to your\naddressbook?") // .arg( (*it).fullName() ); // if ( QMessageBox::information( this, tr("received contact"), msg, QMessageBox::Ok, QMessageBox::Cancel ) == // QMessageBox::Ok ) { abList->addEntry( *it ); // } } } void AddressbookWindow::resizeEvent( QResizeEvent *e ) { QMainWindow::resizeEvent( e ); if ( centralWidget() == listContainer ) showList(); else if ( centralWidget() == mView ) showView(); } AddressbookWindow::~AddressbookWindow() { Config cfg("AddressBook"); cfg.setGroup("Font"); cfg.writeEntry("fontSize", startFontSize); + + cfg.setGroup("Search"); + cfg.writeEntry("useRegExp", useRegExp); + cfg.writeEntry("caseSensitive", caseSensitive); + cfg.writeEntry("signalWrapAround", DoSignalWrapAround); } void AddressbookWindow::slotUpdateToolbar() { OContact ce = abList->currentEntry(); actionMail->setEnabled( !ce.defaultEmail().isEmpty() ); } void AddressbookWindow::showList() { bool visiblemView; visiblemView = false; if ( mView ) { mView->hide(); visiblemView = true; } setCentralWidget( listContainer ); listContainer->show(); // update our focues... (or use a stack widget!); abList->setFocus(); // This makes sure we are scrolled all the way to the left abList->setContentsPos( 0, abList->contentsY() ); //if ( visiblemView && abList->showBook() == "Cards" ) // abList->setShowCategory( abList->showBook(), abList->showCategory() ); } void AddressbookWindow::showView() { if ( abList->numRows() > 0 ) { listContainer->hide(); setCentralWidget( abView() ); mView->show(); mView->setFocus(); } } void AddressbookWindow::slotListNew() { OContact cnt; if( !syncing ) { if ( abEditor ) abEditor->setEntry( cnt ); abView()->init( cnt ); editEntry( NewEntry ); } else { QMessageBox::warning(this, tr("OContacts"), tr("Can not edit data, currently syncing")); } } void AddressbookWindow::slotListView() { abView()->init( abList->currentEntry() ); mView->sync(); showView(); } void AddressbookWindow::slotListDelete() { if(!syncing) { @@ -833,175 +867,170 @@ void AddressbookWindow::initFields() } 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() { -} - -void AddressbookWindow::slotFind() -{ if ( centralWidget() == abView() ) showList(); - -// FindDialog frmFind( "Contacts", this ); + + // Maybe we should react on Wraparound and notfound ? // QObject::connect( abList, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); // QObject::connect( abList, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); -// frmFind.exec(); - // QStringList categories = abList->categories(); - // abList->setShowCategory( book, cat ); abList->slotDoFind( searchEdit->text(), false, false); if ( abList->numSelections() ) abList->clearSelection(); + +} + +void AddressbookWindow::slotFind() +{ abList->clearFindRow(); + slotFindNext(); } void AddressbookWindow::slotSetCategory( int c ) { QString cat, book; if ( c <= 0 ) return; - // Checkmark Book Menu Item Selected - if ( c < 6 ) - for ( unsigned int i = 1; i < 6; i++ ) - catMenu->setItemChecked( i, c == (int)i ); - - // Checkmark Category Menu Item Selected - else - for ( unsigned int i = 6; i < catMenu->count(); i++ ) - catMenu->setItemChecked( i, c == (int)i ); + // 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; } diff --git a/core/pim/addressbook/addressbook.h b/core/pim/addressbook/addressbook.h index b7cf355..18b083f 100644 --- a/core/pim/addressbook/addressbook.h +++ b/core/pim/addressbook/addressbook.h @@ -28,97 +28,103 @@ #include <qstringlist.h> #include <qlineedit.h> #include "ofloatbar.h" class ContactEditor; class AbLabel; class AbTable; class QPEToolBar; class QPopupMenu; class QToolButton; class QDialog; class Ir; class QAction; class LetterPicker; class AddressbookWindow: public QMainWindow { Q_OBJECT public: AddressbookWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); ~AddressbookWindow(); protected: void resizeEvent( QResizeEvent * e ); void showList(); void showView(); enum EntryMode { NewEntry=0, EditEntry }; void editPersonal(); void editEntry( EntryMode ); void closeEvent( QCloseEvent *e ); bool save(); public slots: void flush(); void reload(); void appMessage(const QCString &, const QByteArray &); void setDocument( const QString & ); #ifdef __DEBUG_RELEASE void slotSave(); #endif private slots: void importvCard(); void slotListNew(); void slotListView(); void slotListDelete(); void slotViewBack(); void slotViewEdit(); void slotPersonalView(); void listIsEmpty( bool ); void slotSettings(); void writeMail(); void slotBeam(); void beamDone( Ir * ); void slotSetCategory( int ); void slotSetLetter( char ); void slotUpdateToolbar(); void slotSetFont(int); void slotFindOpen(); void slotFindClose(); void slotFind(); void slotFindNext(); + void slotConfig(); + private: void initFields(); // inititialize our fields... AbLabel *abView(); void populateCategories(); QPopupMenu *catMenu, *fontMenu; QPEToolBar *listTools; QToolButton *deleteButton; QValueList<int> allFields, orderedFields; QStringList slOrderedFields; enum Panes { paneList=0, paneView, paneEdit }; ContactEditor *abEditor; AbLabel *mView; LetterPicker *pLabel; AbTable *abList; QWidget *listContainer; + // Searching stuff OFloatBar* searchBar; QLineEdit* searchEdit; + bool useRegExp; + bool DoSignalWrapAround; + bool caseSensitive; QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, *actionPersonal, *actionMail; bool bAbEditFirstTime; int viewMargin; bool syncing; QFont *defaultFont; int startFontSize; bool isLoading; }; #endif diff --git a/core/pim/addressbook/addressbook.pro b/core/pim/addressbook/addressbook.pro index 05aa5ec..9ed2f68 100644 --- a/core/pim/addressbook/addressbook.pro +++ b/core/pim/addressbook/addressbook.pro @@ -1,38 +1,41 @@ TEMPLATE = app CONFIG = qt warn_on release DESTDIR = $(OPIEDIR)/bin HEADERS = addressbook.h \ contacteditor.h \ ablabel.h \ abtable.h \ addresssettings.h \ picker.h \ - ofloatbar.h + ofloatbar.h \ + configdlg.h SOURCES = main.cpp \ addressbook.cpp \ contacteditor.cpp \ ablabel.cpp \ abtable.cpp \ addresssettings.cpp \ - picker.cpp -INTERFACES = addresssettingsbase.ui + picker.cpp \ + configdlg.cpp + +INTERFACES = addresssettingsbase.ui configdlg_base.ui TARGET = addressbook INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie TRANSLATIONS = ../../../i18n/de/addressbook.ts \ ../../../i18n/en/addressbook.ts \ ../../../i18n/es/addressbook.ts \ ../../../i18n/fr/addressbook.ts \ ../../../i18n/hu/addressbook.ts \ ../../../i18n/ja/addressbook.ts \ ../../../i18n/ko/addressbook.ts \ ../../../i18n/no/addressbook.ts \ ../../../i18n/pl/addressbook.ts \ ../../../i18n/pt/addressbook.ts \ ../../../i18n/pt_BR/addressbook.ts \ ../../../i18n/sl/addressbook.ts \ ../../../i18n/zh_CN/addressbook.ts \ ../../../i18n/it/addressbook.ts \ ../../../i18n/zh_TW/addressbook.ts diff --git a/core/pim/addressbook/configdlg.cpp b/core/pim/addressbook/configdlg.cpp new file mode 100644 index 0000000..b7c3b77 --- a/dev/null +++ b/core/pim/addressbook/configdlg.cpp @@ -0,0 +1,45 @@ +#include "configdlg.h" +#include <qcheckbox.h> +#include <qradiobutton.h> + +ConfigDlg::ConfigDlg( QWidget *parent = 0, const char *name = 0 ): + ConfigDlg_Base(parent, name, true ) +{} + + +bool ConfigDlg::useRegExp() const +{ + return m_useRegExp->isOn(); +} +bool ConfigDlg::useWildCards() const +{ + return m_useWildCard->isOn(); +} +bool ConfigDlg::beCaseSensitive() const +{ + return m_useCaseSensitive->isChecked(); +} +bool ConfigDlg::signalWrapAround() const +{ + return m_signalWrapAround->isChecked(); +} +void ConfigDlg::setUseRegExp( bool v ) +{ + m_useRegExp->setChecked( v ); +} +void ConfigDlg::setUseWildCards( bool v ) +{ + m_useWildCard->setChecked( v ); +} +void ConfigDlg::setBeCaseSensitive( bool v ) +{ + m_useCaseSensitive->setChecked( v ); +} +void ConfigDlg::setSignalWrapAround( bool v ) +{ + m_signalWrapAround->setChecked( v ); +} + + + + diff --git a/core/pim/addressbook/configdlg.h b/core/pim/addressbook/configdlg.h new file mode 100644 index 0000000..8be469b --- a/dev/null +++ b/core/pim/addressbook/configdlg.h @@ -0,0 +1,25 @@ +#ifndef _CONFIGDLG_H_ +#define _CONFIGDLG_H_ + +#include "configdlg_base.h" + +class ConfigDlg: public ConfigDlg_Base +{ + Q_OBJECT +public: + ConfigDlg( QWidget *parent = 0, const char *name = 0 ); + + // Search Settings + bool useRegExp() const; + bool useWildCards() const; + bool beCaseSensitive() const; + bool signalWrapAround() const; + + void setUseRegExp( bool v ); + void setUseWildCards( bool v ); + void setBeCaseSensitive( bool v ); + void setSignalWrapAround( bool v ); +}; + + +#endif diff --git a/core/pim/addressbook/configdlg_base.ui b/core/pim/addressbook/configdlg_base.ui new file mode 100644 index 0000000..e082702 --- a/dev/null +++ b/core/pim/addressbook/configdlg_base.ui @@ -0,0 +1,232 @@ +<!DOCTYPE UI><UI> +<class>ConfigDlg_Base</class> +<author>Stefan Eilers</author> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>Configuration</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>227</width> + <height>287</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>MyDialog1</string> + </property> + <property stdset="1"> + <name>sizeGripEnabled</name> + <bool>true</bool> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QTabWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>configDlg_base</cstring> + </property> + <property> + <name>layoutMargin</name> + </property> + <widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Widget5</cstring> + </property> + <attribute> + <name>title</name> + <string>Search</string> + </attribute> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QButtonGroup</class> + <property stdset="1"> + <name>name</name> + <cstring>ButtonGroup1</cstring> + </property> + <property stdset="1"> + <name>title</name> + <string>Query Style</string> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QRadioButton</class> + <property stdset="1"> + <name>name</name> + <cstring>m_useRegExp</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Use Regular Expressions</string> + </property> + </widget> + <widget> + <class>QRadioButton</class> + <property stdset="1"> + <name>name</name> + <cstring>m_useWildCard</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Use Wildcards (*,?)</string> + </property> + <property stdset="1"> + <name>checked</name> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>m_useCaseSensitive</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Case Sensitive</string> + </property> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>m_signalWrapAround</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Signal Wrap Around</string> + </property> + </widget> + <spacer> + <property> + <name>name</name> + <cstring>Spacer3</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Vertical</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout1</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>buttonOk</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&OK</string> + </property> + <property stdset="1"> + <name>autoDefault</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>default</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>buttonCancel</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Cancel</string> + </property> + <property stdset="1"> + <name>autoDefault</name> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>Configuration</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>Configuration</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>configDlg_base</tabstop> + <tabstop>m_useWildCard</tabstop> + <tabstop>m_useCaseSensitive</tabstop> + <tabstop>m_signalWrapAround</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> +</tabstops> +</UI> diff --git a/core/pim/addressbook/ofloatbar.h b/core/pim/addressbook/ofloatbar.h index 85a0c4f..f9c49d6 100644 --- a/core/pim/addressbook/ofloatbar.h +++ b/core/pim/addressbook/ofloatbar.h @@ -1,20 +1,20 @@ #ifndef __OFLOATBAR_H #define __OFLOATBAR_H #include <qtoolbar.h> #include <qevent.h> class OFloatBar : public QToolBar { Q_OBJECT - virtual void hideEvent(QHideEvent* e) + virtual void hideEvent(QHideEvent* /* e */) { /*if (e->spontaneous())*/ emit OnHide(); } public: OFloatBar(char* t, QMainWindow* mw, QMainWindow::ToolBarDock td, bool f) : QToolBar(t, mw, td, f) {} signals: void OnHide(); }; #endif |