author | mickeyl <mickeyl> | 2003-10-30 13:18:08 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-10-30 13:18:08 (UTC) |
commit | 37414f207b147af4cf6778b323a0aa23127901bd (patch) (side-by-side diff) | |
tree | b08c10043ab689b0a40425d268cd72226799b0cf | |
parent | d53637f46cf217fc760d7aac58b4596843a73803 (diff) | |
download | opie-37414f207b147af4cf6778b323a0aa23127901bd.zip opie-37414f207b147af4cf6778b323a0aa23127901bd.tar.gz opie-37414f207b147af4cf6778b323a0aa23127901bd.tar.bz2 |
apply patch to HEAD
-rw-r--r-- | noncore/apps/checkbook/cfg.cpp | 15 | ||||
-rw-r--r-- | noncore/apps/checkbook/cfg.h | 16 | ||||
-rw-r--r-- | noncore/apps/checkbook/checkbook.cpp | 85 | ||||
-rw-r--r-- | noncore/apps/checkbook/checkbook.h | 6 | ||||
-rw-r--r-- | noncore/apps/checkbook/configuration.cpp | 16 | ||||
-rw-r--r-- | noncore/apps/checkbook/configuration.h | 2 | ||||
-rw-r--r-- | noncore/apps/checkbook/listedit.cpp | 4 | ||||
-rw-r--r-- | noncore/apps/checkbook/mainwindow.cpp | 7 | ||||
-rw-r--r-- | noncore/apps/checkbook/traninfo.cpp | 23 | ||||
-rw-r--r-- | noncore/apps/checkbook/traninfo.h | 5 | ||||
-rw-r--r-- | noncore/apps/checkbook/transaction.cpp | 84 | ||||
-rw-r--r-- | noncore/apps/checkbook/transaction.h | 10 |
12 files changed, 239 insertions, 34 deletions
diff --git a/noncore/apps/checkbook/cfg.cpp b/noncore/apps/checkbook/cfg.cpp index 1e0ec5c..0d5d9ed 100644 --- a/noncore/apps/checkbook/cfg.cpp +++ b/noncore/apps/checkbook/cfg.cpp @@ -38,27 +38,26 @@ // --- Cfg -------------------------------------------------------------------- Cfg::Cfg() { _currencySymbol="$"; _showLocks=FALSE; _showBalances=FALSE; _pCategories=new CategoryList(); + _bDirty=false; } // --- readStringList --------------------------------------------------------- // Reads the entries for the control from a configuration file and returns // them in a StringList. Later this list can be used to create the control. It // is assumed, that the group is already set. Key is used to enumerate the // entries. void Cfg::readStringList(Config &cfg, const char *sKey, QStringList &lst) { -qDebug( "%s", sKey ); - QString sEntry; int iCount; // read count of elements sEntry.sprintf("%s_Count", sKey); iCount=cfg.readNumEntry(sEntry, 0); // read entries @@ -81,30 +80,34 @@ void Cfg::readConfig(Config &config) // read scalars _currencySymbol = config.readEntry( "CurrencySymbol", "$" ); _showLocks = config.readBoolEntry( "ShowLocks", FALSE ); _showBalances = config.readBoolEntry( "ShowBalances", FALSE ); _openLastBook = config.readBoolEntry( "OpenLastBook", FALSE ); _sLastBook = config.readEntry("LastBook", ""); _showLastTab = config.readBoolEntry( "ShowLastTab", FALSE ); + _bSavePayees = config.readBoolEntry( "SavePayees", FALSE ); // Account types readStringList(config, "AccType", _AccountTypes); if( _AccountTypes.isEmpty() ) { _AccountTypes+= (const char *)QWidget::tr("Savings"); _AccountTypes+= (const char *)QWidget::tr("Checking"); _AccountTypes+= (const char *)QWidget::tr("CD"); _AccountTypes+= (const char *)QWidget::tr("Money market"); _AccountTypes+= (const char *)QWidget::tr("Mutual fund"); _AccountTypes+= (const char *)QWidget::tr("Other"); writeStringList(config, "AccType", _AccountTypes); config.write(); } + // Payees + readStringList(config, "Payee", _Payees); + // Read Categories QStringList lst; readStringList(config, "Category", lst); if( lst.isEmpty() ) { QString type=QWidget::tr("Expense"); lst += QWidget::tr( "Automobile" )+";"+type; lst += QWidget::tr( "Bills" )+";"+type; lst += QWidget::tr( "CDs" )+";"+type; @@ -126,16 +129,19 @@ void Cfg::readConfig(Config &config) lst += QWidget::tr( "Misc. Credit" )+";"+type; setCategories(lst); writeStringList(config, "Category", lst); config.write(); } else { setCategories(lst); } + + // not dirty + _bDirty=false; } // --- writeStringList -------------------------------------------------------- // Writes the entries in the control in a configuration file. It is assumed, // that the group is already set. Key is used to enumerate the entries void Cfg::writeStringList(Config &cfg, const char *sKey, QStringList &lst) { @@ -161,26 +167,31 @@ void Cfg::writeConfig(Config &config) // write scalars config.writeEntry( "CurrencySymbol", _currencySymbol ); config.writeEntry( "ShowLocks", _showLocks ); config.writeEntry( "ShowBalances", _showBalances ); config.writeEntry( "OpenLastBook", _openLastBook ); config.writeEntry( "LastBook", _sLastBook ); config.writeEntry( "ShowLastTab", _showLastTab ); + config.writeEntry( "SavePayees", _bSavePayees ); // write account types writeStringList(config, "AccType", _AccountTypes); + // write payees + writeStringList(config, "Payee", _Payees); + // write categories QStringList lst=getCategories(); writeStringList(config, "Category", lst ); // commit write config.write(); + _bDirty=false; } // --- getCategories ---------------------------------------------------------- QStringList Cfg::getCategories() { QStringList ret; for(Category *itr=_pCategories->first(); itr; itr=_pCategories->next() ) { diff --git a/noncore/apps/checkbook/cfg.h b/noncore/apps/checkbook/cfg.h index 2b69368..20692b4 100644 --- a/noncore/apps/checkbook/cfg.h +++ b/noncore/apps/checkbook/cfg.h @@ -72,16 +72,21 @@ class Cfg void setShowLocks(bool n) { _showLocks=n; } bool getShowBalances() { return(_showBalances); } void setShowBalances(bool n) { _showBalances=n; } QString &getCurrencySymbol() { return(_currencySymbol); } void setCurrencySymbol(QString n) {_currencySymbol= n; } void setCurrencySymbol(const char *n) { _currencySymbol=n; } QStringList &getAccountTypes() { return(_AccountTypes); } + // --- Payees + QStringList &getPayees() { return(_Payees); } + bool getSavePayees() { return(_bSavePayees); } + void setSavePayees(bool bSave) { _bSavePayees=bSave; } + // --- Categories QStringList getCategories(); void setCategories(QStringList &lst); CategoryList *getCategoryList() { return(_pCategories); } // --- last book void setOpenLastBook(bool openLastBook) { _openLastBook=openLastBook; } bool isOpenLastBook() { return(_openLastBook); } @@ -93,28 +98,35 @@ class Cfg bool isShowLastTab() { return(_showLastTab); } // --- reads data from config file void readConfig(Config &cfg); // --- writes data to config file void writeConfig(Config &cfg); + // --- dirty flag + bool isDirty() { return(_bDirty); } + void setDirty(bool bDirty) { _bDirty=bDirty; } + + protected: // --- reads list from config file static void readStringList(Config &cfg, const char *sKey, QStringList &lst); // --- writes list in configuration file static void writeStringList(Config &cfg, const char *sKey, QStringList &lst); - - private: QString _currencySymbol; bool _showLocks; bool _showBalances; bool _openLastBook; bool _showLastTab; + bool _bDirty; + bool _bSavePayees; QString _sLastBook; QStringList _AccountTypes; CategoryList *_pCategories; + QStringList _Payees; + }; #endif diff --git a/noncore/apps/checkbook/checkbook.cpp b/noncore/apps/checkbook/checkbook.cpp index c53e889..a42c824 100644 --- a/noncore/apps/checkbook/checkbook.cpp +++ b/noncore/apps/checkbook/checkbook.cpp @@ -44,23 +44,25 @@ #include <qcheckbox.h> #include <qcombobox.h> #include <qlabel.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qpushbutton.h> #include <qwhatsthis.h> +#include <qpopupmenu.h> #define COL_ID 0 -#define COL_NUM 1 -#define COL_DATE 2 -#define COL_DESC 3 -#define COL_AMOUNT 4 -#define COL_BAL 5 +#define COL_SORTDATE 1 +#define COL_NUM 2 +#define COL_DATE 3 +#define COL_DESC 4 +#define COL_AMOUNT 5 +#define COL_BAL 6 // --- Checkbook -------------------------------------------------------------- Checkbook::Checkbook( QWidget *parent, CBInfo *i, Cfg *cfg ) : QDialog( parent, 0, TRUE, WStyle_ContextHelp ) { info = i; _pCfg=cfg; @@ -219,29 +221,34 @@ QWidget *Checkbook::initTransactions() tranTable = new QListView( control ); QFont fnt(QPEApplication::font()); fnt.setPointSize( fnt.pointSize()-1 ); tranTable->setFont( fnt ); QWhatsThis::add( tranTable, tr( "This is a listing of all transactions entered for this checkbook.\n\nTo sort entries by a specific field, click on the column name." ) ); tranTable->addColumn( tr( "Id" ) ); tranTable->setColumnWidthMode( COL_ID, QListView::Manual ); tranTable->setColumnWidth( COL_ID, 0); + tranTable->addColumn( tr( "SortDate" ) ); + tranTable->setColumnWidthMode( COL_SORTDATE, QListView::Manual ); + tranTable->setColumnWidth( COL_SORTDATE, 0); tranTable->addColumn( tr( "Num" ) ); tranTable->addColumn( tr( "Date" ) ); //tranTable->addColumn( tr( "Cleared" ) ); tranTable->addColumn( tr( "Description" ) ); int column = tranTable->addColumn( tr( "Amount" ) ); tranTable->setColumnAlignment( column, Qt::AlignRight ); column=tranTable->addColumn( tr("Balance") ); tranTable->setColumnAlignment( column, Qt::AlignRight ); tranTable->setAllColumnsShowFocus( TRUE ); tranTable->setSorting( -1 ); layout->addMultiCellWidget( tranTable, 1, 1, 0, 2 ); QPEApplication::setStylusOperation( tranTable->viewport(), QPEApplication::RightOnHold ); connect( tranTable, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ), + this, SLOT( slotMenuTran(QListViewItem *, const QPoint &) ) ); + connect( tranTable, SIGNAL( doubleClicked( QListViewItem * ) ), this, SLOT( slotEditTran() ) ); _sortCol=COL_ID; // Buttons QPushButton *btn = new QPushButton( Resource::loadPixmap( "new" ), tr( "New" ), control ); QWhatsThis::add( btn, tr( "Click here to add a new transaction." ) ); connect( btn, SIGNAL( clicked() ), this, SLOT( slotNewTran() ) ); layout->addWidget( btn, 2, 0 ); @@ -331,17 +338,17 @@ void Checkbook::loadCheckbook() for ( TranInfo *tran = tranList->first(); tran; tran = tranList->next() ) { amount = tran->amount(); if ( tran->withdrawal() ) { amount *= -1; } stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount ); - ( void ) new CBListItem( tran, tranTable, tran->getIdStr(), tran->number(), tran->datestr(), tran->desc(), stramount ); + ( void ) new CBListItem( tran, tranTable, tran->getIdStr(), tran->datestr(false), tran->number(), tran->datestr(true), tran->desc(), stramount ); } // set sort order bool bOk=false; for(int i=0; i<_cbSortType->count(); i++) { if( _cbSortType->text(i)==info->getSortOrder() ) { _cbSortType->setCurrentItem(i); slotSortChanged( info->getSortOrder() ); @@ -353,16 +360,17 @@ void Checkbook::loadCheckbook() _cbSortType->setCurrentItem(0); slotSortChanged( _cbSortType->currentText() ); } // calc running balance adjustBalance(); } + // --- adjustBalance ---------------------------------------------------------- void Checkbook::adjustBalance() { // update running balance in register QString sRunning; float bal=info->startingBalance(); for(CBListItem *item=(CBListItem *)tranTable->firstChild(); item; item=(CBListItem *)item->nextSibling() ) { TranInfo *tran=item->getTranInfo(); @@ -391,16 +399,17 @@ void Checkbook::accept() info->setPin( pinNumEdit->text() ); bool ok; info->setStartingBalance( balanceEdit->text().toFloat( &ok ) ); info->setNotes( notesEdit->text() ); QDialog::accept(); } +// --- slotPasswordClicked ---------------------------------------------------- void Checkbook::slotPasswordClicked() { if ( info->password().isNull() && passwordCB->isChecked() ) { Password *pw = new Password( this, tr( "Enter password" ), tr( "Please enter your password:" ) ); if ( pw->exec() != QDialog::Accepted ) { passwordCB->setChecked( FALSE ); @@ -459,84 +468,132 @@ void Checkbook::slotNameChanged( const QString &newname ) void Checkbook::slotStartingBalanceChanged( const QString &newbalance ) { bool ok; info->setStartingBalance( newbalance.toFloat( &ok ) ); adjustBalance(); } +// --- slotNewTran ------------------------------------------------------------ void Checkbook::slotNewTran() { TranInfo *traninfo = new TranInfo( info->getNextNumber() ); if( !_dLastNew.isNull() ) traninfo->setDate(_dLastNew); - Transaction *currtran = new Transaction( this, info->name(), + Transaction *currtran = new Transaction( this, true, info->name(), traninfo, _pCfg ); currtran->showMaximized(); if ( currtran->exec() == QDialog::Accepted ) { // Add to transaction list info->addTransaction( traninfo ); // Add to transaction table float amount; QString stramount; amount = (traninfo->withdrawal() ? -1 : 1)*traninfo->amount(); stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount ); - ( void ) new CBListItem( traninfo, tranTable, traninfo->getIdStr(), - traninfo->number(), traninfo->datestr(), traninfo->desc(), + ( void ) new CBListItem( traninfo, tranTable, traninfo->getIdStr(), traninfo->datestr(false), + traninfo->number(), traninfo->datestr(true), traninfo->desc(), stramount ); resort(); adjustBalance(); // save last date _dLastNew = traninfo->date(); + + // save description in list of payees, if not in there + QStringList *pLst=&_pCfg->getPayees(); + if( _pCfg->getSavePayees() && pLst->contains(traninfo->desc())==0 ) { + pLst->append( traninfo->desc() ); + pLst->sort(); + _pCfg->setDirty(true); + } } else { delete traninfo; } } + +// --- slotEditTran ----------------------------------------------------------- void Checkbook::slotEditTran() { QListViewItem *curritem = tranTable->currentItem(); if ( !curritem ) return; TranInfo *traninfo=info->findTransaction( curritem->text(COL_ID) ); - Transaction *currtran = new Transaction( this, info->name(), + Transaction *currtran = new Transaction( this, false, info->name(), traninfo, _pCfg ); currtran->showMaximized(); if ( currtran->exec() == QDialog::Accepted ) { curritem->setText( COL_NUM, traninfo->number() ); - curritem->setText( COL_DATE, traninfo->datestr() ); + curritem->setText( COL_SORTDATE, traninfo->datestr(false) ); + curritem->setText( COL_DATE, traninfo->datestr(true) ); curritem->setText( COL_DESC, traninfo->desc() ); float amount = traninfo->amount(); if ( traninfo->withdrawal() ) { amount *= -1; } QString stramount; stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount ); curritem->setText( COL_AMOUNT, stramount ); resort(); adjustBalance(); + + // save description in list of payees, if not in there + QStringList *pLst=&_pCfg->getPayees(); + if( _pCfg->getSavePayees() && pLst->contains(traninfo->desc())==0 ) { + pLst->append( traninfo->desc() ); + pLst->sort(); + _pCfg->setDirty(true); + } } delete currtran; } +// --- slotMenuTran ----------------------------------------------------------- +void Checkbook::slotMenuTran(QListViewItem *item, const QPoint &pnt) +{ + // active item? + if( !item ) + return; + + // Display menu + QPopupMenu m; + m.insertItem( QWidget::tr( "Edit" ), 1 ); + m.insertItem( QWidget::tr( "New" ), 2 ); + m.insertItem( QWidget::tr( "Delete" ), 3 ); + int r = m.exec( pnt ); + switch(r) { + case 1: + slotEditTran(); + break; + case 2: + slotNewTran(); + break; + case 3: + slotDeleteTran(); + break; + } +} + + +// --- slotDeleteTran --------------------------------------------------------- void Checkbook::slotDeleteTran() { QListViewItem *curritem = tranTable->currentItem(); if ( !curritem ) return; TranInfo *traninfo = info->findTransaction( curritem->text(COL_ID) ); @@ -586,17 +643,17 @@ void Checkbook::drawBalanceChart() amount = tran->amount(); if ( tran->withdrawal() ) { amount *= -1; } balance += amount; if ( i == 1 || i == count / 2 || i == count ) { - label = tran->datestr(); + label = tran->datestr(true); } else { label = ""; } list->append( new DataPointInfo( label, balance ) ); } @@ -661,16 +718,17 @@ void CBListItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); } else if ( isAltBackground() ) _cg.setColor(QColorGroup::Base, cg.background() ); QListViewItem::paintCell(p, _cg, column, width, align); } +// --- CBListItem::isAltBackground -------------------------------------------- bool CBListItem::isAltBackground() { QListView *lv = static_cast<QListView *>( listView() ); if ( lv ) { CBListItem *above = 0; above = (CBListItem *)( itemAbove() ); m_known = above ? above->m_known : true; @@ -718,13 +776,14 @@ void Checkbook::slotTab(QWidget *tab) // --- slotSortChanged --------------------------------------------------------- void Checkbook::slotSortChanged( const QString &selc ) { if( selc==tr("Entry Order") ) { _sortCol=COL_ID; } else if( selc==tr("Number") ) { _sortCol=COL_NUM; } else if( selc==tr("Date") ) { - _sortCol=COL_DATE; + _sortCol=COL_SORTDATE; } info->setSortOrder( selc ); resort(); } + diff --git a/noncore/apps/checkbook/checkbook.h b/noncore/apps/checkbook/checkbook.h index 1b6a2d3..e18f00c 100644 --- a/noncore/apps/checkbook/checkbook.h +++ b/noncore/apps/checkbook/checkbook.h @@ -43,30 +43,34 @@ class QComboBox; class QLabel; class QLineEdit; class QListView; class QMultiLineEdit; class QString; class TranInfo; class TranInfoList; class Cfg; +class QMouseEvent; // --- Checkbook -------------------------------------------------------------- class Checkbook : public QDialog { Q_OBJECT public: Checkbook( QWidget *, CBInfo *, Cfg *cfg ); ~Checkbook(); // resort void resort(); + // members + TranInfoList *getTranList() { return(tranList); } + private: CBInfo *info; TranInfoList *tranList; Cfg *_pCfg; OTabWidget *mainWidget; void loadCheckbook(); void adjustBalance(); @@ -104,21 +108,23 @@ class Checkbook : public QDialog void slotTab(QWidget *tab); private slots: void slotPasswordClicked(); void slotNameChanged( const QString & ); void slotStartingBalanceChanged( const QString & ); void slotNewTran(); void slotEditTran(); + void slotMenuTran(QListViewItem *, const QPoint &); void slotDeleteTran(); void slotDrawGraph(); void slotSortChanged( const QString & ); }; + // --- CBListItem ------------------------------------------------------------- class CBListItem : public QListViewItem { //Q_OBJECT public: CBListItem( TranInfo *, QListView *, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, diff --git a/noncore/apps/checkbook/configuration.cpp b/noncore/apps/checkbook/configuration.cpp index 3f5662d..dfae446 100644 --- a/noncore/apps/checkbook/configuration.cpp +++ b/noncore/apps/checkbook/configuration.cpp @@ -71,16 +71,22 @@ Configuration::Configuration( QWidget *parent, Cfg &cfg ) _listEditCategories->addColumnDef( new ColumnDef( tr("Category"), (ColumnDef::ColumnType)(ColumnDef::typeString | ColumnDef::typeUnique), tr("New Category")) ); d=new ColumnDef( tr("Type"), ColumnDef::typeList, tr("Expense") ); d->addColumnValue( tr("Expense") ); d->addColumnValue( tr("Income") ); _listEditCategories->addColumnDef( d ); QStringList lst=cfg.getCategories(); _listEditCategories->addData( lst ); _mainWidget->addTab( _listEditCategories, tr( "&Categories" ) ); + + // Payees tab + _listEditPayees=new ListEdit(_mainWidget, "PAYEES"); + _listEditPayees->addColumnDef( new ColumnDef( tr("Payee"), (ColumnDef::ColumnType)(ColumnDef::typeString | ColumnDef::typeUnique), tr("New Payee")) ); + _listEditPayees->addData( cfg.getPayees() ); + _mainWidget->addTab( _listEditPayees, tr("&Payees") ); } Configuration::~Configuration() { } // ---- initSettings ---------------------------------------------------------- QWidget *Configuration::initSettings(Cfg &cfg) @@ -133,29 +139,39 @@ QWidget *Configuration::initSettings(Cfg &cfg) layout->addMultiCellWidget( openLastBookCB, 3, 3, 0, 1 ); lastTabCB = new QCheckBox( tr("Show last checkbook tab" ), container ); QWhatsThis::add( lastTabCB, tr("Click here to select whether the last tab in a checkbook should be displayed.") ); lastTabCB->setMaximumHeight(fh+5); lastTabCB->setChecked( cfg.isShowLastTab() ); layout->addMultiCellWidget( lastTabCB, 4, 4, 0, 1 ); + savePayees = new QCheckBox( tr("Save new description as payee"), container ); + QWhatsThis::add( savePayees, tr("Click here to save new descriptions in the list of payess.") ); + savePayees->setMaximumHeight(fh+5); + savePayees->setChecked( cfg.getSavePayees() ); + layout->addMultiCellWidget( savePayees, 5, 5, 0, 1 ); + return(control); } // --- saveConfig ------------------------------------------------------------- void Configuration::saveConfig(Cfg &cfg) { // Settings cfg.setCurrencySymbol( symbolEdit->text() ); cfg.setShowLocks( lockCB->isChecked() ); cfg.setShowBalances( balCB->isChecked() ); cfg.setOpenLastBook( openLastBookCB->isChecked() ); cfg.setShowLastTab( lastTabCB->isChecked() ); + cfg.setSavePayees( savePayees->isChecked() ); // Typelist _listEditTypes->storeInList( cfg.getAccountTypes() ); // Category list QStringList lst; _listEditCategories->storeInList( lst ); cfg.setCategories( lst ); + + // Payees + _listEditPayees->storeInList( cfg.getPayees() ); } diff --git a/noncore/apps/checkbook/configuration.h b/noncore/apps/checkbook/configuration.h index 5893502..663514d 100644 --- a/noncore/apps/checkbook/configuration.h +++ b/noncore/apps/checkbook/configuration.h @@ -47,19 +47,21 @@ class Configuration : public QDialog Configuration( QWidget *, Cfg &cfg); ~Configuration(); QLineEdit *symbolEdit; QCheckBox *lockCB; QCheckBox *balCB; QCheckBox *openLastBookCB; QCheckBox *lastTabCB; + QCheckBox *savePayees; QTabWidget *_mainWidget; ListEdit *_listEditTypes; ListEdit *_listEditCategories; + ListEdit *_listEditPayees; // saves settings in config struct void saveConfig(Cfg &cfg); protected: // creates settings tap from configuration QWidget *initSettings(Cfg &cfg); }; diff --git a/noncore/apps/checkbook/listedit.cpp b/noncore/apps/checkbook/listedit.cpp index 99a6531..37f05f0 100644 --- a/noncore/apps/checkbook/listedit.cpp +++ b/noncore/apps/checkbook/listedit.cpp @@ -111,16 +111,20 @@ void ListEdit::slotAdd() // fix uniques fixTypes(); // display col 0 of new value QPoint pnt; slotClick(_currentItem, pnt, 0); _typeTable->setSelected( _currentItem, true ); + + // make it selected + _typeEdit->setCursorPosition(0); + _typeEdit->setSelection(0, _typeEdit->text().length() ); } // --- slotDel ------------------------------------------------------------- void ListEdit::slotDel() { if( !_currentItem ) return; delete _currentItem; _currentItem=NULL; diff --git a/noncore/apps/checkbook/mainwindow.cpp b/noncore/apps/checkbook/mainwindow.cpp index 8d64cad..bf00102 100644 --- a/noncore/apps/checkbook/mainwindow.cpp +++ b/noncore/apps/checkbook/mainwindow.cpp @@ -53,17 +53,16 @@ MainWindow::MainWindow( QWidget* parent, const char* name, WFlags fl ) { setCaption( tr( "Checkbook" ) ); cbDir = Global::applicationFileName( "checkbook", "" ); lockIcon = Resource::loadPixmap( "locked" ); // Load configuration options Config config( "checkbook" ); -qDebug( "Reading config" ); _cfg.readConfig( config ); // Build menu and tool bars setToolBarsMovable( FALSE ); QPEToolBar *bar = new QPEToolBar( this ); bar->setHorizontalStretchable( TRUE ); @@ -309,16 +308,22 @@ void MainWindow::openBook(QListViewItem *curritem) // Update balance if changed if ( _cfg.getShowBalances() && cb->balance() != currbalance ) { QString tempstr; tempstr.sprintf( "%s%.2f", _cfg.getCurrencySymbol().latin1(), cb->balance() ); curritem->setText( posName + 1, tempstr ); } + + // write config, if needed + if( _cfg.isDirty() ) { + Config config("checkbook"); + _cfg.writeConfig( config ); + } } delete currcb; } // --- slotDelete ------------------------------------------------------------- void MainWindow::slotDelete() { QString currname = cbList->currentItem()->text( posName ); diff --git a/noncore/apps/checkbook/traninfo.cpp b/noncore/apps/checkbook/traninfo.cpp index d880bb4..506f567 100644 --- a/noncore/apps/checkbook/traninfo.cpp +++ b/noncore/apps/checkbook/traninfo.cpp @@ -24,16 +24,17 @@ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "traninfo.h" #include <qpe/config.h> +#include <qpe/timestring.h> QString tempstr; TranInfo::TranInfo( int id, const QString &desc, const QDate &date, bool withdrawal, const QString &type, const QString &category, float amount, float fee, const QString &number, const QString ¬es, int next ) { i = id; @@ -119,24 +120,27 @@ TranInfo::TranInfo( Config config, int entry ) n = config.readEntry( "Comments", "" ); // next _next = config.readNumEntry("Next", -1); } } // --- datestr ---------------------------------------------------------------- -const QString &TranInfo::datestr() +const QString &TranInfo::datestr(bool bDisplayDate) { - int y=td.year(); - y= y>=2000 && y<=2099 ? y-2000 : y; - tempstr.sprintf( "%02d/%02d/%02d", y ,td.month(), td.day() ); + if( bDisplayDate ) { + tempstr=TimeString::numberDateString( td ); + } else { + tempstr.sprintf( "%04d-%02d-%02d", td.year() ,td.month(), td.day() ); + } return( tempstr ); } + // --- getIdStr --------------------------------------------------------------- const QString &TranInfo::getIdStr() { tempstr.sprintf("%04d", i); return( tempstr ); } // --- write ------------------------------------------------------------------ @@ -205,8 +209,19 @@ QString TranInfo::toString() (const char *)datestr(), (const char *)number(), (const char *)desc(), (withdrawal() ? -1 : 1) * amount(), fee() ); return(ret); } + + +// --- findMostRecentByDesc --------------------------------------------------- +TranInfo *TranInfoList::findMostRecentByDesc( const QString &desc ) +{ + for(TranInfo *cur=last(); cur; cur=prev()) { + if( cur->desc()==desc ) + return( cur ); + } + return(NULL); +}
\ No newline at end of file diff --git a/noncore/apps/checkbook/traninfo.h b/noncore/apps/checkbook/traninfo.h index 0abdc61..cbe0238 100644 --- a/noncore/apps/checkbook/traninfo.h +++ b/noncore/apps/checkbook/traninfo.h @@ -44,17 +44,17 @@ class TranInfo TranInfo( Config, int ); // getters int id() const { return i; } const QString &getIdStr(); const QString &desc() const { return d; } const QDate &date() const { return td; } - const QString &datestr(); + const QString &datestr(bool = false); bool withdrawal() const { return w; } const QString &type() const { return t; } const QString &category() const { return c; } float amount() const { return a; } float fee() const { return f; } const QString &number() const { return cn; } const QString ¬es() const { return n; } int getNext() { return(_next); } @@ -88,13 +88,16 @@ class TranInfo float f; QString cn; QString n; int _next; }; class TranInfoList : public QList<TranInfo> { + public: + TranInfo *findMostRecentByDesc( const QString &desc ); + protected: int compareItems( QCollection::Item, QCollection::Item ); }; #endif diff --git a/noncore/apps/checkbook/transaction.cpp b/noncore/apps/checkbook/transaction.cpp index 138d0e6..9379da0 100644 --- a/noncore/apps/checkbook/transaction.cpp +++ b/noncore/apps/checkbook/transaction.cpp @@ -24,36 +24,39 @@ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "transaction.h" #include "traninfo.h" #include "cfg.h" +#include "checkbook.h" #include <qpe/datebookmonth.h> +#include <qpe/resource.h> #include <qbuttongroup.h> #include <qcombobox.h> #include <qlabel.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qradiobutton.h> #include <qwhatsthis.h> -Transaction::Transaction( QWidget *parent, const QString &acctname, TranInfo *info, - Cfg *pCfg ) +Transaction::Transaction( QWidget *parent, bool bNew, const QString &acctname, + TranInfo *info, Cfg *pCfg ) : QDialog( parent, 0, TRUE, WStyle_ContextHelp ) { QString tempstr = tr( "Transaction for " ); tempstr.append( acctname ); setCaption( tempstr ); + _bNew=bNew; tran = info; _pCfg=pCfg; QVBoxLayout *vb = new QVBoxLayout( this ); QScrollView *sv = new QScrollView( this ); vb->addWidget( sv, 0, 0 ); sv->setResizePolicy( QScrollView::AutoOneFit ); @@ -109,19 +112,22 @@ Transaction::Transaction( QWidget *parent, const QString &acctname, TranInfo *in QWhatsThis::add( numEdit, tr( "Enter check number here." ) ); numEdit->setMaximumWidth( 40 ); layout->addWidget( numEdit, 1, 3 ); // Description label = new QLabel( tr( "Description:" ), container ); QWhatsThis::add( label, tr( "Enter description of transaction here." ) ); layout->addWidget( label, 2, 0 ); - descEdit = new QLineEdit( container ); - QWhatsThis::add( descEdit, tr( "Enter description of transaction here." ) ); - layout->addMultiCellWidget( descEdit, 2, 2, 1, 3 ); + _cbDesc=new QComboBox( true, container ); + _cbDesc->insertStringList( _pCfg->getPayees() ); + QWhatsThis::add( _cbDesc, tr( "Enter description of transaction here." ) ); + layout->addMultiCellWidget( _cbDesc, 2, 2, 1, 3 ); + connect( _cbDesc, SIGNAL( activated(const QString &) ), this, SLOT( slotActivated(const QString &) ) ); + // Category label = new QLabel( tr( "Category:" ), container ); QWhatsThis::add( label, tr( "Select transaction category here." ) ); layout->addWidget( label, 3, 0 ); catList = new QComboBox( container ); QWhatsThis::add( catList, tr( "Select transaction category here." ) ); layout->addMultiCellWidget( catList, 3, 3, 1, 3 ); @@ -129,16 +135,17 @@ Transaction::Transaction( QWidget *parent, const QString &acctname, TranInfo *in // Type label = new QLabel( tr( "Type:" ), container ); QWhatsThis::add( label, tr( "Select transaction type here.\n\nThe options available vary based on whether the transaction is a deposit or withdrawal." ) ); layout->addWidget( label, 4, 0 ); typeList = new QComboBox( container ); QWhatsThis::add( typeList, tr( "Select transaction type here.\n\nThe options available vary based on whether the transaction is a deposit or withdrawal." ) ); layout->addMultiCellWidget( typeList, 4, 4, 1, 3 ); + // Amount label = new QLabel( tr( "Amount:" ), container ); QWhatsThis::add( label, tr( "Enter the amount of transaction here.\n\nThe value entered should always be positive." ) ); layout->addWidget( label, 5, 0 ); amtEdit = new QLineEdit( container ); QWhatsThis::add( amtEdit, tr( "Enter the amount of transaction here.\n\nThe value entered should always be positive." ) ); layout->addMultiCellWidget( amtEdit, 5, 5, 1, 3 ); @@ -153,36 +160,66 @@ Transaction::Transaction( QWidget *parent, const QString &acctname, TranInfo *in // Notes label = new QLabel( tr( "Notes:" ), container ); QWhatsThis::add( label, tr( "Enter any additional information for this transaction here." ) ); layout->addWidget( label, 7, 0 ); noteEdit = new QMultiLineEdit( container ); QWhatsThis::add( noteEdit, tr( "Enter any additional information for this transaction here." ) ); layout->addMultiCellWidget( noteEdit, 8, 8, 0, 3 ); + // init date + initFromInfo( info ); + + // not new handlers + connect( withBtn, SIGNAL( toggled(bool) ), this, SLOT( slotNotNew() ) ); + connect( depBtn, SIGNAL( toggled(bool) ), this, SLOT( slotNotNew() ) ); + connect( catList, SIGNAL(activated(const QString &)), this, SLOT( slotNotNew() ) ); + connect( typeList, SIGNAL(activated(const QString &)), this, SLOT( slotNotNew() ) ); + connect( amtEdit, SIGNAL(textChanged(const QString &)), this, SLOT( slotNotNew() ) ); + connect( feeEdit, SIGNAL(textChanged(const QString &)), this, SLOT( slotNotNew() ) ); + connect( noteEdit, SIGNAL(textChanged()), this, SLOT( slotNotNew() ) ); +} + +// --- initFromInfo ----------------------------------------------------------- +void Transaction::initFromInfo(TranInfo *info, bool bPopulateOld) +{ // Populate current values if provided if ( info ) { if ( info->withdrawal() ) { withBtn->setChecked( TRUE ); slotWithdrawalClicked(); } else { depBtn->setChecked( TRUE ); slotDepositClicked(); } + + if( !bPopulateOld ) { QDate dt = info->date(); slotDateChanged( dt.year(), dt.month(), dt.day() ); datePicker->setDate( dt ); numEdit->setText( info->number() ); - descEdit->setText( info->desc() ); + } QString temptext = info->category(); - int i = catList->count(); + + // set description field + int i; + for(i=_cbDesc->count()-1; i>=0; i--) { + if( _cbDesc->text(i)==info->desc() ) { + _cbDesc->setCurrentItem(i); + break; + } + } + if( i<=0 ) + _cbDesc->setEditText( info->desc() ); + + i = catList->count(); while ( i > 0 ) { i--; catList->setCurrentItem( i ); if ( catList->currentText() == temptext ) { break; } @@ -203,23 +240,26 @@ Transaction::Transaction( QWidget *parent, const QString &acctname, TranInfo *in noteEdit->setText( info->notes() ); } else { withBtn->setChecked( TRUE ); } } + +// --- ~Transaction ----------------------------------------------------------- Transaction::~Transaction() { } +// --- accept ----------------------------------------------------------------- void Transaction::accept() { - tran->setDesc( descEdit->text() ); + tran->setDesc( _cbDesc->currentText() ); tran->setDate( datePicker->selectedDate() ); tran->setWithdrawal( withBtn->isChecked() ); tran->setType( typeList->currentText() ); tran->setCategory( catList->currentText() ); bool ok; tran->setAmount( amtEdit->text().toFloat( &ok ) ); tran->setFee( feeEdit->text().toFloat( &ok ) ); tran->setNumber( numEdit->text() ); @@ -257,14 +297,42 @@ void Transaction::slotDepositClicked() typeList->clear(); typeList->insertItem( tr( "Written Check" ) ); typeList->insertItem( tr( "Automatic Payment" ) ); typeList->insertItem( tr( "Transfer" ) ); typeList->insertItem( tr( "Cash" ) ); } +// --- slotDateChanged -------------------------------------------------------- void Transaction::slotDateChanged( int y, int m, int d ) { QDate date; date.setYMD( y, m, d ); dateBtn->setText( TimeString::shortDate( date ) ); } + + + +// --- slotActivated ---------------------------------------------------------- +// Search for the most recent transaction with this description/payee and +// fill amount etc here, as long the new flag is set +void Transaction::slotActivated(const QString &arg ) +{ + if( !_bNew ) return; + TranInfoList *pTl=((Checkbook *)parentWidget())->getTranList(); + if( pTl ) { + TranInfo *pTi=pTl->findMostRecentByDesc( arg ); + if( pTi ) { + initFromInfo( pTi, true ); + amtEdit->setFocus(); + amtEdit->setSelection(0, amtEdit->text().length() ); + amtEdit->setCursorPosition(0); + } + } +} + +// slotNotNew ----------------------------------------------------------------- +void Transaction::slotNotNew() +{ + qDebug("Not new"); + _bNew=false; +} diff --git a/noncore/apps/checkbook/transaction.h b/noncore/apps/checkbook/transaction.h index fbe9cd3..130d769 100644 --- a/noncore/apps/checkbook/transaction.h +++ b/noncore/apps/checkbook/transaction.h @@ -42,38 +42,42 @@ class QWidget; class TranInfo; class Cfg; class Transaction : public QDialog { Q_OBJECT public: - Transaction( QWidget *, const QString &, TranInfo *, Cfg *); + Transaction( QWidget *, bool, const QString &, TranInfo *, Cfg *); ~Transaction(); + void initFromInfo(TranInfo *, bool=false); + private: TranInfo *tran; - + bool _bNew; Cfg *_pCfg; QRadioButton *withBtn; QRadioButton *depBtn; QPushButton *dateBtn; DateBookMonth *datePicker; QLineEdit *numEdit; - QLineEdit *descEdit; + QComboBox *_cbDesc; QComboBox *catList; QComboBox *typeList; QLineEdit *amtEdit; QLineEdit *feeEdit; QMultiLineEdit *noteEdit; protected slots: void accept(); private slots: void slotWithdrawalClicked(); void slotDepositClicked(); void slotDateChanged( int, int, int ); + void slotActivated(const QString & ); + void slotNotNew(); }; #endif |