summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/pim/addressbook/TODO18
-rw-r--r--core/pim/addressbook/abtable.cpp3
-rw-r--r--core/pim/addressbook/abtable.h2
-rw-r--r--core/pim/addressbook/addressbook.cpp2
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
@@ -541,214 +541,215 @@ void AbTable::insertIntoTable( const OContact &cnt, int row )
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
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
@@ -6,149 +6,149 @@
** 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
@@ -851,193 +851,193 @@ void AddressbookWindow::initFields()
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" ) {