summaryrefslogtreecommitdiff
path: root/noncore/apps/checkbook/checkbook.cpp
Unidiff
Diffstat (limited to 'noncore/apps/checkbook/checkbook.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/checkbook/checkbook.cpp228
1 files changed, 152 insertions, 76 deletions
diff --git a/noncore/apps/checkbook/checkbook.cpp b/noncore/apps/checkbook/checkbook.cpp
index 653ee4a..c53e889 100644
--- a/noncore/apps/checkbook/checkbook.cpp
+++ b/noncore/apps/checkbook/checkbook.cpp
@@ -33,6 +33,8 @@
33#include "graph.h" 33#include "graph.h"
34#include "graphinfo.h" 34#include "graphinfo.h"
35#include "password.h" 35#include "password.h"
36#include "mainwindow.h"
37#include "cfg.h"
36 38
37#include <opie/otabwidget.h> 39#include <opie/otabwidget.h>
38#include <qpe/qpeapplication.h> 40#include <qpe/qpeapplication.h>
@@ -48,12 +50,21 @@
48#include <qpushbutton.h> 50#include <qpushbutton.h>
49#include <qwhatsthis.h> 51#include <qwhatsthis.h>
50 52
51Checkbook::Checkbook( QWidget *parent, CBInfo *i, const QString &symbol ) 53#define COL_ID 0
54#define COL_NUM 1
55#define COL_DATE 2
56#define COL_DESC 3
57#define COL_AMOUNT 4
58#define COL_BAL 5
59
60// --- Checkbook --------------------------------------------------------------
61Checkbook::Checkbook( QWidget *parent, CBInfo *i, Cfg *cfg )
52 : QDialog( parent, 0, TRUE, WStyle_ContextHelp ) 62 : QDialog( parent, 0, TRUE, WStyle_ContextHelp )
53{ 63{
54 info = i; 64 info = i;
55 currencySymbol = symbol; 65 _pCfg=cfg;
56 66
67 // Title bar
57 if ( info->name() != "" ) 68 if ( info->name() != "" )
58 { 69 {
59 QString tempstr = info->name(); 70 QString tempstr = info->name();
@@ -66,6 +77,7 @@ Checkbook::Checkbook( QWidget *parent, CBInfo *i, const QString &symbol )
66 setCaption( tr( "New checkbook" ) ); 77 setCaption( tr( "New checkbook" ) );
67 } 78 }
68 79
80
69 // Setup layout to make everything pretty 81 // Setup layout to make everything pretty
70 QVBoxLayout *layout = new QVBoxLayout( this ); 82 QVBoxLayout *layout = new QVBoxLayout( this );
71 layout->setMargin( 2 ); 83 layout->setMargin( 2 );
@@ -74,11 +86,14 @@ Checkbook::Checkbook( QWidget *parent, CBInfo *i, const QString &symbol )
74 // Setup tabs for all info 86 // Setup tabs for all info
75 mainWidget = new OTabWidget( this ); 87 mainWidget = new OTabWidget( this );
76 layout->addWidget( mainWidget ); 88 layout->addWidget( mainWidget );
77
78 mainWidget->addTab( initInfo(), "checkbook/infotab", tr( "Info" ) ); 89 mainWidget->addTab( initInfo(), "checkbook/infotab", tr( "Info" ) );
79 mainWidget->addTab( initTransactions(), "checkbook/trantab", tr( "Transactions" ) ); 90 mainWidget->addTab( initTransactions(), "checkbook/trantab", tr( "Transactions" ) );
80 mainWidget->addTab( initCharts(), "checkbook/charttab", tr( "Charts" ) ); 91 mainWidget->addTab( initCharts(), "checkbook/charttab", tr( "Charts" ) );
81 mainWidget->setCurrentTab( tr( "Info" ) ); 92 if( _pCfg->isShowLastTab() )
93 mainWidget->setCurrentTab( info->getLastTab() );
94 else
95 mainWidget->setCurrentTab( tr( "Info" ) );
96 connect( mainWidget, SIGNAL( currentChanged(QWidget *) ), this, SLOT( slotTab(QWidget *) ) );
82 97
83 // Load checkbook information 98 // Load checkbook information
84 loadCheckbook(); 99 loadCheckbook();
@@ -88,9 +103,10 @@ Checkbook::~Checkbook()
88{ 103{
89} 104}
90 105
106// --- initInfo ---------------------------------------------------------------
91QWidget *Checkbook::initInfo() 107QWidget *Checkbook::initInfo()
92{ 108{
93 QWidget *control = new QWidget( mainWidget ); 109 QWidget *control = new QWidget( mainWidget, tr("Info") );
94 110
95 QVBoxLayout *vb = new QVBoxLayout( control ); 111 QVBoxLayout *vb = new QVBoxLayout( control );
96 112
@@ -128,13 +144,8 @@ QWidget *Checkbook::initInfo()
128 layout->addWidget( label, 2, 0 ); 144 layout->addWidget( label, 2, 0 );
129 typeList = new QComboBox( container ); 145 typeList = new QComboBox( container );
130 QWhatsThis::add( typeList, tr( "Select type of checkbook here." ) ); 146 QWhatsThis::add( typeList, tr( "Select type of checkbook here." ) );
131 typeList->insertItem( tr( "Savings" ) ); // 0 147 typeList->insertStringList( _pCfg->getAccountTypes() );
132 typeList->insertItem( tr( "Checking" ) ); // 1 148 layout->addWidget( typeList, 2, 1 );
133 typeList->insertItem( tr( "CD" ) ); // 2
134 typeList->insertItem( tr( "Money market" ) );// 3
135 typeList->insertItem( tr( "Mutual fund" ) );// 4
136 typeList->insertItem( tr( "Other" ) ); // 5
137 layout->addWidget( typeList, 2, 1 );
138 149
139 // Bank/institution name 150 // Bank/institution name
140 label = new QLabel( tr( "Bank:" ), container ); 151 label = new QLabel( tr( "Bank:" ), container );
@@ -183,34 +194,53 @@ QWidget *Checkbook::initInfo()
183 return control; 194 return control;
184} 195}
185 196
197
198// --- initTransactions -------------------------------------------------------
186QWidget *Checkbook::initTransactions() 199QWidget *Checkbook::initTransactions()
187{ 200{
188 QWidget *control = new QWidget( mainWidget ); 201 QWidget *control = new QWidget( mainWidget, tr("Transactions") );
189 202
190 QGridLayout *layout = new QGridLayout( control ); 203 QGridLayout *layout = new QGridLayout( control );
191 layout->setSpacing( 2 ); 204 layout->setSpacing( 2 );
192 layout->setMargin( 4 ); 205 layout->setMargin( 4 );
193 206
194 balanceLabel = new QLabel( tr( "Current balance: %10.00" ).arg( currencySymbol ), 207 // Sort selector
195 control ); 208 QLabel *label = new QLabel( tr( "Sort by:" ), control );
196 QWhatsThis::add( balanceLabel, tr( "This area shows the current balance in this checkbook." ) ); 209 QWhatsThis::add( label, tr( "Select checkbook sorting here." ) );
197 layout->addMultiCellWidget( balanceLabel, 0, 0, 0, 2 ); 210 layout->addMultiCellWidget( label, 0, 0, 0, 1 );
198 211 _cbSortType=new QComboBox( control );
199 tranTable = new QListView( control ); 212 _cbSortType->insertItem( tr("Entry Order") );
213 _cbSortType->insertItem( tr("Date") );
214 _cbSortType->insertItem( tr("Number") );
215 layout->addMultiCellWidget( _cbSortType, 0, 0, 1, 2 );
216 connect( _cbSortType, SIGNAL( activated(const QString &) ), this, SLOT( slotSortChanged( const QString & ) ) );
217
218 // Table
219 tranTable = new QListView( control );
220 QFont fnt(QPEApplication::font());
221 fnt.setPointSize( fnt.pointSize()-1 );
222 tranTable->setFont( fnt );
200 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." ) ); 223 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." ) );
201 tranTable->addColumn( tr( "Num" ) ); 224 tranTable->addColumn( tr( "Id" ) );
225 tranTable->setColumnWidthMode( COL_ID, QListView::Manual );
226 tranTable->setColumnWidth( COL_ID, 0);
227 tranTable->addColumn( tr( "Num" ) );
202 tranTable->addColumn( tr( "Date" ) ); 228 tranTable->addColumn( tr( "Date" ) );
203 //tranTable->addColumn( tr( "Cleared" ) ); 229 //tranTable->addColumn( tr( "Cleared" ) );
204 tranTable->addColumn( tr( "Description" ) ); 230 tranTable->addColumn( tr( "Description" ) );
205 int colnum = tranTable->addColumn( tr( "Amount" ) ); 231 int column = tranTable->addColumn( tr( "Amount" ) );
206 tranTable->setColumnAlignment( colnum, Qt::AlignRight ); 232 tranTable->setColumnAlignment( column, Qt::AlignRight );
233 column=tranTable->addColumn( tr("Balance") );
234 tranTable->setColumnAlignment( column, Qt::AlignRight );
207 tranTable->setAllColumnsShowFocus( TRUE ); 235 tranTable->setAllColumnsShowFocus( TRUE );
208 tranTable->setSorting( 1 ); 236 tranTable->setSorting( -1 );
209 layout->addMultiCellWidget( tranTable, 1, 1, 0, 2 ); 237 layout->addMultiCellWidget( tranTable, 1, 1, 0, 2 );
210 QPEApplication::setStylusOperation( tranTable->viewport(), QPEApplication::RightOnHold ); 238 QPEApplication::setStylusOperation( tranTable->viewport(), QPEApplication::RightOnHold );
211 connect( tranTable, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ), 239 connect( tranTable, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ),
212 this, SLOT( slotEditTran() ) ); 240 this, SLOT( slotEditTran() ) );
241 _sortCol=COL_ID;
213 242
243 // Buttons
214 QPushButton *btn = new QPushButton( Resource::loadPixmap( "new" ), tr( "New" ), control ); 244 QPushButton *btn = new QPushButton( Resource::loadPixmap( "new" ), tr( "New" ), control );
215 QWhatsThis::add( btn, tr( "Click here to add a new transaction." ) ); 245 QWhatsThis::add( btn, tr( "Click here to add a new transaction." ) );
216 connect( btn, SIGNAL( clicked() ), this, SLOT( slotNewTran() ) ); 246 connect( btn, SIGNAL( clicked() ), this, SLOT( slotNewTran() ) );
@@ -229,11 +259,13 @@ QWidget *Checkbook::initTransactions()
229 return( control ); 259 return( control );
230} 260}
231 261
262
263// --- initCharts -------------------------------------------------------------
232QWidget *Checkbook::initCharts() 264QWidget *Checkbook::initCharts()
233{ 265{
234 graphInfo = 0x0; 266 graphInfo = 0x0;
235 267
236 QWidget *control = new QWidget( mainWidget ); 268 QWidget *control = new QWidget( mainWidget, tr("Charts") );
237 269
238 QGridLayout *layout = new QGridLayout( control ); 270 QGridLayout *layout = new QGridLayout( control );
239 layout->setSpacing( 2 ); 271 layout->setSpacing( 2 );
@@ -259,6 +291,7 @@ QWidget *Checkbook::initCharts()
259 return control; 291 return control;
260} 292}
261 293
294// --- loadCheckbook ----------------------------------------------------------
262void Checkbook::loadCheckbook() 295void Checkbook::loadCheckbook()
263{ 296{
264 if ( !info ) 297 if ( !info )
@@ -281,6 +314,10 @@ void Checkbook::loadCheckbook()
281 break; 314 break;
282 } 315 }
283 } 316 }
317 if( i<=0 ) {
318 typeList->insertItem( temptext, 0 );
319 typeList->setCurrentItem(0);
320 }
284 bankEdit->setText( info->bank() ); 321 bankEdit->setText( info->bank() );
285 acctNumEdit->setText( info->account() ); 322 acctNumEdit->setText( info->account() );
286 pinNumEdit->setText( info->pin() ); 323 pinNumEdit->setText( info->pin() );
@@ -290,42 +327,61 @@ void Checkbook::loadCheckbook()
290 327
291 // Load transactions 328 // Load transactions
292 float amount; 329 float amount;
293 QString stramount; 330 QString stramount;
294 331 for ( TranInfo *tran = tranList->first(); tran; tran = tranList->next() )
295 for ( TranInfo *tran = tranList->first(); tran; tran = tranList->next() )
296 { 332 {
297 amount = tran->amount(); 333 amount = tran->amount();
298 if ( tran->withdrawal() ) 334 if ( tran->withdrawal() )
299 { 335 {
300 amount *= -1; 336 amount *= -1;
301 } 337 }
302 stramount.sprintf( "%s%.2f", currencySymbol.latin1(), amount ); 338 stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount );
303 ( void ) new CBListItem( tranTable, tran->number(), tran->datestr(), tran->desc(), stramount ); 339 ( void ) new CBListItem( tran, tranTable, tran->getIdStr(), tran->number(), tran->datestr(), tran->desc(), stramount );
304 } 340 }
305 341
306 balanceLabel->setText( tr( "Current balance: %1%2" ).arg( currencySymbol ).arg( info->balance(), 0, 'f', 2 ) ); 342 // set sort order
307 343 bool bOk=false;
308 highTranNum = tranList->count(); 344 for(int i=0; i<_cbSortType->count(); i++) {
345 if( _cbSortType->text(i)==info->getSortOrder() ) {
346 _cbSortType->setCurrentItem(i);
347 slotSortChanged( info->getSortOrder() );
348 bOk=true;
349 break;
350 }
351 }
352 if( !bOk ) {
353 _cbSortType->setCurrentItem(0);
354 slotSortChanged( _cbSortType->currentText() );
355 }
356
357 // calc running balance
358 adjustBalance();
309} 359}
310 360
361// --- adjustBalance ----------------------------------------------------------
311void Checkbook::adjustBalance() 362void Checkbook::adjustBalance()
312{ 363{
313 balanceLabel->setText( tr( "Current balance: %1%2" ).arg( currencySymbol ).arg( info->balance(), 0, 'f', 2 ) ); 364 // update running balance in register
365 QString sRunning;
366 float bal=info->startingBalance();
367 for(CBListItem *item=(CBListItem *)tranTable->firstChild(); item; item=(CBListItem *)item->nextSibling() ) {
368 TranInfo *tran=item->getTranInfo();
369 bal=bal + (tran->withdrawal() ? -1 : 1)*tran->amount() - tran->fee();
370 sRunning.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), bal );
371 item->setText( COL_BAL, sRunning);
372 }
314} 373}
315 374
316TranInfo *Checkbook::findTran( const QString &checknum, const QString &date, const QString &desc ) 375// --- resort -----------------------------------------------------------------
376void Checkbook::resort()
317{ 377{
318 TranInfo *traninfo = tranList->first(); 378 tranTable->setSorting(_sortCol);
319 while ( traninfo ) 379 tranTable->sort();
320 { 380 tranTable->setSorting(-1);
321 if ( traninfo->number() == checknum && traninfo->datestr() == date &&
322 traninfo->desc() == desc )
323 break;
324 traninfo = tranList->next();
325 }
326 return( traninfo );
327} 381}
328 382
383
384// --- accept -----------------------------------------------------------------
329void Checkbook::accept() 385void Checkbook::accept()
330{ 386{
331 info->setName( nameEdit->text() ); 387 info->setName( nameEdit->text() );
@@ -398,6 +454,8 @@ void Checkbook::slotNameChanged( const QString &newname )
398 setCaption( namestr ); 454 setCaption( namestr );
399} 455}
400 456
457
458// ---slotStartingBalanceChanged ----------------------------------------------
401void Checkbook::slotStartingBalanceChanged( const QString &newbalance ) 459void Checkbook::slotStartingBalanceChanged( const QString &newbalance )
402{ 460{
403 bool ok; 461 bool ok;
@@ -405,14 +463,16 @@ void Checkbook::slotStartingBalanceChanged( const QString &newbalance )
405 adjustBalance(); 463 adjustBalance();
406} 464}
407 465
466
408void Checkbook::slotNewTran() 467void Checkbook::slotNewTran()
409{ 468{
410 highTranNum++; 469 TranInfo *traninfo = new TranInfo( info->getNextNumber() );
411 TranInfo *traninfo = new TranInfo( highTranNum ); 470 if( !_dLastNew.isNull() )
471 traninfo->setDate(_dLastNew);
412 472
413 Transaction *currtran = new Transaction( this, info->name(), 473 Transaction *currtran = new Transaction( this, info->name(),
414 traninfo, 474 traninfo,
415 currencySymbol ); 475 _pCfg );
416 currtran->showMaximized(); 476 currtran->showMaximized();
417 if ( currtran->exec() == QDialog::Accepted ) 477 if ( currtran->exec() == QDialog::Accepted )
418 { 478 {
@@ -422,22 +482,19 @@ void Checkbook::slotNewTran()
422 // Add to transaction table 482 // Add to transaction table
423 float amount; 483 float amount;
424 QString stramount; 484 QString stramount;
425 485 amount = (traninfo->withdrawal() ? -1 : 1)*traninfo->amount();
426 amount = traninfo->amount(); 486 stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount );
427 if ( traninfo->withdrawal() ) 487 ( void ) new CBListItem( traninfo, tranTable, traninfo->getIdStr(),
428 { 488 traninfo->number(), traninfo->datestr(), traninfo->desc(),
429 amount *= -1; 489 stramount );
430 } 490 resort();
431 stramount.sprintf( "%s%.2f", currencySymbol.latin1(), amount );
432
433 ( void ) new CBListItem( tranTable, traninfo->number(), traninfo->datestr(), traninfo->desc(),
434 stramount );
435
436 adjustBalance(); 491 adjustBalance();
492
493 // save last date
494 _dLastNew = traninfo->date();
437 } 495 }
438 else 496 else
439 { 497 {
440 highTranNum--;
441 delete traninfo; 498 delete traninfo;
442 } 499 }
443} 500}
@@ -446,22 +503,19 @@ void Checkbook::slotEditTran()
446{ 503{
447 QListViewItem *curritem = tranTable->currentItem(); 504 QListViewItem *curritem = tranTable->currentItem();
448 if ( !curritem ) 505 if ( !curritem )
449 {
450 return; 506 return;
451 } 507
452 508 TranInfo *traninfo=info->findTransaction( curritem->text(COL_ID) );
453 TranInfo *traninfo = info->findTransaction( curritem->text( 0 ), curritem->text( 1 ),
454 curritem->text( 2 ) );
455 509
456 Transaction *currtran = new Transaction( this, info->name(), 510 Transaction *currtran = new Transaction( this, info->name(),
457 traninfo, 511 traninfo,
458 currencySymbol ); 512 _pCfg );
459 currtran->showMaximized(); 513 currtran->showMaximized();
460 if ( currtran->exec() == QDialog::Accepted ) 514 if ( currtran->exec() == QDialog::Accepted )
461 { 515 {
462 curritem->setText( 0, traninfo->number() ); 516 curritem->setText( COL_NUM, traninfo->number() );
463 curritem->setText( 1, traninfo->datestr() ); 517 curritem->setText( COL_DATE, traninfo->datestr() );
464 curritem->setText( 2, traninfo->desc() ); 518 curritem->setText( COL_DESC, traninfo->desc() );
465 519
466 float amount = traninfo->amount(); 520 float amount = traninfo->amount();
467 if ( traninfo->withdrawal() ) 521 if ( traninfo->withdrawal() )
@@ -469,10 +523,10 @@ void Checkbook::slotEditTran()
469 amount *= -1; 523 amount *= -1;
470 } 524 }
471 QString stramount; 525 QString stramount;
472 stramount.sprintf( "%s%.2f", currencySymbol.latin1(), amount ); 526 stramount.sprintf( "%s%.2f", _pCfg->getCurrencySymbol().latin1(), amount );
473 curritem->setText( 3, stramount ); 527 curritem->setText( COL_AMOUNT, stramount );
474 528 resort();
475 adjustBalance(); 529 adjustBalance();
476 } 530 }
477 531
478 delete currtran; 532 delete currtran;
@@ -482,17 +536,15 @@ void Checkbook::slotDeleteTran()
482{ 536{
483 QListViewItem *curritem = tranTable->currentItem(); 537 QListViewItem *curritem = tranTable->currentItem();
484 if ( !curritem ) 538 if ( !curritem )
485 {
486 return; 539 return;
487 }
488 540
489 TranInfo *traninfo = findTran( curritem->text( 0 ), curritem->text( 1 ), curritem->text( 2 ) ); 541 TranInfo *traninfo = info->findTransaction( curritem->text(COL_ID) );
490 542
491 if ( QPEMessageBox::confirmDelete ( this, tr( "Delete transaction" ), traninfo->desc() ) ) 543 if ( QPEMessageBox::confirmDelete ( this, tr( "Delete transaction" ), traninfo->desc() ) )
492 { 544 {
493 info->removeTransaction( traninfo ); 545 info->removeTransaction( traninfo );
494 delete curritem; 546 delete curritem;
495 adjustBalance(); 547 adjustBalance();
496 } 548 }
497} 549}
498 550
@@ -589,11 +641,12 @@ void Checkbook::drawCategoryChart( bool withdrawals )
589 graphInfo = new GraphInfo( GraphInfo::PieChart, list ); 641 graphInfo = new GraphInfo( GraphInfo::PieChart, list );
590} 642}
591 643
592CBListItem::CBListItem( QListView *parent, QString label1, QString label2, 644CBListItem::CBListItem( TranInfo *pTran, QListView *parent, QString label1, QString label2,
593 QString label3, QString label4, QString label5, QString label6, QString label7, 645 QString label3, QString label4, QString label5, QString label6, QString label7,
594 QString label8 ) 646 QString label8 )
595 : QListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 ) 647 : QListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 )
596{ 648{
649 _pTran=pTran;
597 m_known = FALSE; 650 m_known = FALSE;
598 owner = parent; 651 owner = parent;
599} 652}
@@ -652,3 +705,26 @@ bool CBListItem::isAltBackground()
652 } 705 }
653 return false; 706 return false;
654} 707}
708
709
710// --- slotTab ----------------------------------------------------------------
711void Checkbook::slotTab(QWidget *tab)
712{
713 if( !tab || !info ) return;
714 info->setLastTab( tab->name() );
715}
716
717
718// --- slotSortChanged ---------------------------------------------------------
719void Checkbook::slotSortChanged( const QString &selc )
720{
721 if( selc==tr("Entry Order") ) {
722 _sortCol=COL_ID;
723 } else if( selc==tr("Number") ) {
724 _sortCol=COL_NUM;
725 } else if( selc==tr("Date") ) {
726 _sortCol=COL_DATE;
727 }
728 info->setSortOrder( selc );
729 resort();
730}