-rw-r--r-- | core/pim/addressbook/abtable.cpp | 26 | ||||
-rw-r--r-- | core/pim/addressbook/abtable.h | 2 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.cpp | 12 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.h | 3 | ||||
-rw-r--r-- | core/pim/addressbook/addressbook.pro | 6 | ||||
-rw-r--r-- | core/pim/addressbook/picker.cpp | 234 | ||||
-rw-r--r-- | core/pim/addressbook/picker.h | 65 |
7 files changed, 344 insertions, 4 deletions
diff --git a/core/pim/addressbook/abtable.cpp b/core/pim/addressbook/abtable.cpp index 17277b4..759cb48 100644 --- a/core/pim/addressbook/abtable.cpp +++ b/core/pim/addressbook/abtable.cpp @@ -141,24 +141,25 @@ AbTable::AbTable( const QValueList<int> *order, QWidget *parent, const char *nam 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(); } void AbTable::columnClicked( int col ) { if ( !sorting() ) @@ -443,30 +444,31 @@ QString AbTable::findContactContact( const Contact &entry ) void AbTable::addEntry( const Contact &newCnt ) { int row = numRows(); setNumRows( row + 1 ); updateJournal( newCnt, Contact::ACTION_ADD ); insertIntoTable( newCnt, row ); setCurrentCell( row, 0 ); updateVisible(); } void AbTable::resizeRows( int size ) { - +/* if (numRows()) { for (int i = 0; i < numRows(); i++) { setRowHeight( i, size ); } - } + }*/ + updateVisible(); } void AbTable::updateJournal( const Contact &cnt, Contact::journal_action action, int row ) { QFile f( journalFileName() ); if ( !f.open(IO_WriteOnly|IO_Append) ) return; QString buf; QCString str; buf = "<Contact "; cnt.save( buf ); @@ -999,78 +1001,98 @@ QStringList AbTable::choiceSelection(int /*index*/) const } */ return r; } void AbTable::setShowCategory( const QString &c ) { showCat = c; updateVisible(); } +void AbTable::setShowByLetter( char c ) +{ + showChar = tolower(c); + qDebug( "AbTable::setShowByLetter %c", showChar); + updateVisible(); +} + QString AbTable::showCategory() const { return showCat; } QStringList AbTable::categories() { mCat.load( categoryFileName() ); QStringList categoryList = mCat.labels( "Contacts" ); return categoryList; } void AbTable::updateVisible() { int visible, totalRows, id, totalCats, it, row; bool hide; AbTableItem *ati; Contact *cnt; + QString fileAsName; + QString tmpStr; visible = 0; setPaintingEnabled( FALSE ); totalRows = numRows(); id = mCat.id( "Contacts", showCat ); QArray<int> cats; for ( row = 0; row < totalRows; row++ ) { ati = static_cast<AbTableItem*>( item(row, 0) ); cnt = &contactList[ati]; cats = cnt->categories(); + fileAsName = cnt->fileAs(); hide = false; if ( !showCat.isEmpty() ) { if ( showCat == tr( "Unfiled" ) ) { if ( cats.count() > 0 ) hide = true; } else { // do some comparing if ( !hide ) { hide = true; totalCats = int(cats.count()); for ( it = 0; it < totalCats; it++ ) { if ( cats[it] == id ) { hide = false; break; } } } } } + if ( showChar != '\0' ) { + tmpStr = fileAsName.left(1); + tmpStr = tmpStr.lower(); + qDebug( "updateVisible "); + qDebug( tmpStr ); + qDebug( "updateVisible2 %c", showChar ); + if ( tmpStr != QString(QChar(showChar)) ) { + hide = true; + } + } if ( hide ) { if ( currentRow() == row ) setCurrentCell( -1, 0 ); if ( rowHeight(row) > 0 ) hideRow( row ); } else { if ( rowHeight(row) == 0 ) { showRow( row ); adjustRow( row ); } visible++; } diff --git a/core/pim/addressbook/abtable.h b/core/pim/addressbook/abtable.h index 53635ee..d5ff279 100644 --- a/core/pim/addressbook/abtable.h +++ b/core/pim/addressbook/abtable.h @@ -75,24 +75,25 @@ public: void clearFindRow() { currFindRow = -2; } void loadFields(); void refresh(); bool save( const QString &fn ); void load( const QString &fn ); // 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 &c ); + void setShowByLetter( char c ); QString showCategory() const; QStringList categories(); void resizeRows( int size ); void show(); void setPaintingEnabled( bool e ); public slots: void slotDoFind( const QString &str, bool caseSensitive, bool backwards, int category ); signals: void empty( bool ); @@ -121,21 +122,22 @@ private: void updateJournal( const Contact &contact, Contact::journal_action action, int row = -1 ); void insertIntoTable( const Contact &contact, int row ); void internalAddEntries( QList<Contact> &list ); QString findContactName( const Contact &entry ); QString findContactContact( const Contact &entry ); void journalFreeReplace( const Contact &cnt, int row ); void journalFreeRemove( int row ); void realignTable( int ); void updateVisible(); int lastSortCol; bool asc; + char showChar; QMap<AbTableItem*, Contact> contactList; const QValueList<int> *intFields; int currFindRow; QString showCat; QStringList choicenames; bool enablePainting; Categories mCat; }; #endif // ABTABLE_H diff --git a/core/pim/addressbook/addressbook.cpp b/core/pim/addressbook/addressbook.cpp index 360aa7e..e502cf6 100644 --- a/core/pim/addressbook/addressbook.cpp +++ b/core/pim/addressbook/addressbook.cpp @@ -54,24 +54,25 @@ #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" static QString addressbookOldXMLFilename() { QString filename = QPEApplication::documentDir() + "addressbook.xml"; return filename; } static QString addressbookXMLFilename() { QString filename = Global::applicationFileName("addressbook", "addressbook.xml"); return filename; } @@ -89,24 +90,25 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, : QMainWindow( parent, name, f ), abEditor(0), bAbEditFirstTime(TRUE), syncing(FALSE) { initFields(); setCaption( tr("Contacts") ); setIcon( Resource::loadPixmap( "AddressBook" ) ); setToolBarsMovable( FALSE ); + QBoxLayout *vb = new QVBoxLayout( this, 0, 0 ); // 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" ); @@ -180,40 +182,44 @@ AddressbookWindow::AddressbookWindow( QWidget *parent, const char *name, // not to mention it also does the necessary stuff for the // journaling... QString str = addressbookXMLFilename(); if ( str.isNull() ) { QMessageBox::warning( this, tr("Out of Space"), tr("There is not enough space to create\n" "neccessary startup files.\n" "\nFree up some space before\nentering data!") ); } abList = new AbTable( &orderedFields, this, "table" ); + vb->insertWidget(0,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( addressbookXMLFilename() ); if ( QFile::exists(addressbookOldXMLFilename()) ) { abList->load( addressbookOldXMLFilename() ); QFile::remove(addressbookOldXMLFilename()); } + pLabel = new LetterPicker( abList ); + connect(pLabel, SIGNAL(letterClicked(char)), this, SLOT(slotSetLetter(char))); + vb->insertWidget(1,pLabel); catMenu = new QPopupMenu( this ); catMenu->setCheckable( TRUE ); connect( catMenu, SIGNAL(activated(int)), this, SLOT(slotSetCategory(int)) ); populateCategories(); mbList->insertItem( tr("View"), catMenu ); setCentralWidget( abList ); fontMenu = new QPopupMenu(this); fontMenu->setCheckable( true ); connect( fontMenu, SIGNAL(activated(int)), this, SLOT(slotSetFont(int))); @@ -875,24 +881,30 @@ void AddressbookWindow::slotSetCategory( int c ) abList->setShowCategory( QString::null ); setCaption( tr("Contacts") + " - " + tr ( "All" ) ); } else if ( c == (int)catMenu->count() ) { abList->setShowCategory( tr( "Unfiled" ) ); setCaption( tr("Contacts") + " - " + tr( "Unfiled" ) ); } else { QString cat = abList->categories()[c - 2]; abList->setShowCategory( cat ); setCaption( tr("Contacts") + " - " + cat ); } } +void AddressbookWindow::slotSetLetter( char c ) { + + abList->setShowByLetter( c ); + +} + void AddressbookWindow::populateCategories() { catMenu->clear(); int id, rememberId; id = 1; catMenu->insertItem( tr( "All" ), id++ ); QStringList categories = abList->categories(); categories.append( tr( "Unfiled" ) ); for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) { diff --git a/core/pim/addressbook/addressbook.h b/core/pim/addressbook/addressbook.h index e2a7100..31c4660 100644 --- a/core/pim/addressbook/addressbook.h +++ b/core/pim/addressbook/addressbook.h @@ -22,24 +22,25 @@ #include <qmainwindow.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(); @@ -60,40 +61,42 @@ private slots: void slotListView(); void slotListDelete(); void slotViewBack(); void slotViewEdit(); void slotPersonalView(); void listIsEmpty( bool ); void slotSettings(); void writeMail(); void slotBeam(); void beamDone( Ir * ); void slotFind(); void slotSetCategory( int ); + void slotSetLetter( char ); void slotUpdateToolbar(); void slotSetFont(int); 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; QAction *actionNew, *actionEdit, *actionTrash, *actionFind, *actionBeam, *actionPersonal, *actionMail; bool bAbEditFirstTime; int viewMargin; bool syncing; QFont *defaultFont; int startFontSize; }; diff --git a/core/pim/addressbook/addressbook.pro b/core/pim/addressbook/addressbook.pro index 53cf030..0d65c74 100644 --- a/core/pim/addressbook/addressbook.pro +++ b/core/pim/addressbook/addressbook.pro @@ -1,26 +1,28 @@ TEMPLATE = app CONFIG = qt warn_on release DESTDIR = $(OPIEDIR)/bin HEADERS = addressbook.h \ contacteditor.h \ ablabel.h \ abtable.h \ - addresssettings.h + addresssettings.h \ + picker.h SOURCES = main.cpp \ addressbook.cpp \ contacteditor.cpp \ ablabel.cpp \ abtable.cpp \ - addresssettings.cpp + addresssettings.cpp \ + picker.cpp INTERFACES = addresssettingsbase.ui TARGET = addressbook INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe TRANSLATIONS = ../../i18n/pt_BR/addressbook.ts TRANSLATIONS += ../../i18n/de/addressbook.ts TRANSLATIONS += ../../i18n/en/addressbook.ts TRANSLATIONS += ../../i18n/hu/addressbook.ts TRANSLATIONS += ../../i18n/sl/addressbook.ts diff --git a/core/pim/addressbook/picker.cpp b/core/pim/addressbook/picker.cpp new file mode 100644 index 0000000..06dcc7d --- a/dev/null +++ b/core/pim/addressbook/picker.cpp @@ -0,0 +1,234 @@ +#include "picker.h" + +#include <qfont.h> +#include <qstring.h> +#include <qtimer.h> +#include <qlayout.h> + +char PickerLabel::lastLetter = '\0'; + +PickerLabel::PickerLabel( QWidget *parent, const char *name ) + : QLabel ( parent, name ) +{ + currentLetter = 0; + //lastLetter = 0; + + letter1 = '\0'; + letter2 = '\0'; + letter3 = '\0'; + + setFont( QFont( "smallsmooth", 9 ) ); + setTextFormat( Qt::RichText ); + +} + +PickerLabel::~PickerLabel() +{ + +} + +void PickerLabel::setLetters( char ch1, char ch2, char ch3 ) +{ + QString tmpStr; + + if (ch1 != '\0') + letter1 = ch1; + else + letter1 = ' '; + + if (ch2 != '\0') + letter2 = ch2; + else + letter2 = ' '; + + if (ch3 != '\0') + letter3 = ch3; + else + letter3 = ' '; + + tmpStr = "<qt>"; + tmpStr += letter1; + tmpStr += letter2; + tmpStr += letter3; + tmpStr += "</qt>"; + + setText(tmpStr); + + currentLetter = 0; + +} + +void PickerLabel::clearLetter() +{ + + QString tmpStr; + + tmpStr = "<qt>"; + tmpStr += letter1; + tmpStr += letter2; + tmpStr += letter3; + tmpStr += "</qt>"; + + setText(tmpStr); + + currentLetter = 0; + +} + +void PickerLabel::mouseReleaseEvent( QMouseEvent *e ) +{ + QString tmpStr; + + if (lastLetter != letter1 && lastLetter != letter2 && lastLetter != letter3) + QTimer::singleShot( 0, this, SLOT(emitClearSignal()) ); + + qDebug( "a" ); + switch (currentLetter) { + case 0: + tmpStr = "<qt><font color=\"#7F0000\">"; + tmpStr += letter1; + tmpStr += "</font>"; + tmpStr += letter2; + tmpStr += letter3; + tmpStr += "</qt>"; + + setText(tmpStr); + + currentLetter++; + lastLetter = letter1; + emit selectedLetter( letter1 ); + qDebug( "PickerLabel::mouseReleaseEvent %c", letter1 ); + break; + + case 1: + tmpStr = "<qt>"; + tmpStr += letter1; + tmpStr += "<font color=\"#7F0000\">"; + tmpStr += letter2; + tmpStr += "</font>"; + tmpStr += letter3; + tmpStr += "</qt>"; + + setText(tmpStr); + + currentLetter++; + lastLetter = letter2; + emit selectedLetter( letter2 ); + qDebug( "PickerLabel::mouseReleaseEvent %c", letter2 ); + break; + + case 2: + tmpStr = "<qt>"; + tmpStr += letter1; + tmpStr += letter2; + tmpStr += "<font color=\"#7F0000\">"; + tmpStr += letter3; + tmpStr += "</font></qt>"; + + setText(tmpStr); + + currentLetter++; + lastLetter = letter3; + emit selectedLetter( letter3 ); + qDebug( "PickerLabel::mouseReleaseEvent %c", letter3 ); + break; + + default: + clearLetter(); + lastLetter = '\0'; + emit selectedLetter( '\0' ); + + + } +} + +void PickerLabel::emitClearSignal() { + emit clearAll(); +} + +LetterPicker::LetterPicker( QWidget *parent, const char *name ) + : QFrame( parent, name ) +{ + QHBoxLayout *l = new QHBoxLayout(this); + + lblABC = new PickerLabel( this ); + l->addWidget( lblABC ); + + lblDEF = new PickerLabel( this ); + l->addWidget( lblDEF ); + + lblGHI = new PickerLabel( this ); + l->addWidget( lblGHI ); + + lblJKL = new PickerLabel( this ); + l->addWidget( lblJKL ); + + lblMNO = new PickerLabel( this ); + l->addWidget( lblMNO ); + + lblPQR = new PickerLabel( this ); + l->addWidget( lblPQR ); + + lblSTU = new PickerLabel( this ); + l->addWidget( lblSTU ); + + lblVWX = new PickerLabel( this ); + l->addWidget( lblVWX ); + + lblYZ = new PickerLabel( this ); + l->addWidget( lblYZ ); + + lblABC->setLetters( 'A', 'B', 'C' ); + lblDEF->setLetters( 'D', 'E', 'F' ); + lblGHI->setLetters( 'G', 'H', 'I' ); + lblJKL->setLetters( 'J', 'K', 'L' ); + lblMNO->setLetters( 'M', 'N', 'O' ); + lblPQR->setLetters( 'P', 'Q', 'R' ); + lblSTU->setLetters( 'S', 'T', 'U' ); + lblVWX->setLetters( 'V', 'W', 'X' ); + lblYZ->setLetters( 'Y', 'Z', '#' ); + + connect(lblABC, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblDEF, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblGHI, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblJKL, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblMNO, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblPQR, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblSTU, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblVWX, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblYZ, SIGNAL(selectedLetter(char)), this, SLOT(newLetter(char))); + connect(lblABC, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblDEF, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblGHI, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblJKL, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblMNO, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblPQR, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblSTU, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblVWX, SIGNAL(clearAll()), this, SLOT(clear())); + connect(lblYZ, SIGNAL(clearAll()), this, SLOT(clear())); + +} + +LetterPicker::~LetterPicker() +{ +} + +void LetterPicker::clear() +{ + lblABC->clearLetter(); + lblDEF->clearLetter(); + lblGHI->clearLetter(); + lblJKL->clearLetter(); + lblMNO->clearLetter(); + lblPQR->clearLetter(); + lblSTU->clearLetter(); + lblVWX->clearLetter(); + lblYZ->clearLetter(); +} + +void LetterPicker::newLetter( char letter ) +{ + qDebug( "LetterPicker::newLetter %c", letter ); + emit letterClicked( letter ); + +} diff --git a/core/pim/addressbook/picker.h b/core/pim/addressbook/picker.h new file mode 100644 index 0000000..de5bd9d --- a/dev/null +++ b/core/pim/addressbook/picker.h @@ -0,0 +1,65 @@ +/* + * Letter Chooser Widget. + * + * (c) 2002 Mike Crawford + * + * This file is FREE SOFTWARE covered under the GUN General Public License. + * + * +*/ +#ifndef PICKER_H +#define PICKER_H + +#include <qlabel.h> +#include <qframe.h> +#include <qevent.h> + +class PickerLabel: public QLabel { +Q_OBJECT + public: + PickerLabel( QWidget *parent = 0, const char *name = 0 ); + ~PickerLabel(); + + void setLetters( char ch1, char ch2, char ch3 ); + void clearLetter(); + + signals: + + void selectedLetter( char ); + void clearAll(); + + protected: + + void mouseReleaseEvent( QMouseEvent *e ); + + private: + + int currentLetter; + static char lastLetter; + char letter1, letter2, letter3; + + private slots: + + void emitClearSignal(); + +}; +class LetterPicker: public QFrame { +Q_OBJECT + public: + LetterPicker( QWidget *parent = 0, const char *name = 0 ); + ~LetterPicker(); + + public slots: + void clear(); + + signals: + void letterClicked( char ); + + private: + PickerLabel *lblABC, *lblDEF, *lblGHI, *lblJKL, *lblMNO, *lblPQR, *lblSTU, *lblVWX, *lblYZ; + + private slots: + void newLetter( char letter ); +}; + +#endif |