00001 #include <qmessagebox.h>
00002 #include <qheader.h>
00003 #include <sqlite3.h>
00004
00005 #include "budgetdisplay.h"
00006 #include "budget.h"
00007 #include "datepicker.h"
00008 #include "transaction.h"
00009
00010 extern Preferences *preferences;
00011 extern Budget *budget;
00012 extern Transaction *transaction;
00013
00014 BudgetDisplay::BudgetDisplay ( QWidget *parent ) : QWidget ( parent )
00015 {
00016 QFont font = this->font();
00017 font.setWeight ( QFont::Bold );
00018
00019
00020 newDate = QDate::currentDate ();
00021 year = newDate.year();
00022 month = newDate.month();
00023 day = newDate.day();
00024 datelabel = preferences->getDate ( year, month );
00025
00026 setCaption ( "Budget" );
00027
00028 firstline = new QHBox ( this );
00029 firstline->setSpacing ( 2 );
00030 secondline = new QHBox ( this );
00031 secondline->setSpacing ( 10 );
00032
00033 menu = new QMenuBar ( this );
00034 menu->setFrameStyle ( QFrame::Box | QFrame::Sunken );
00035 budgetmenu = new QPopupMenu ( this );
00036 lineitemsmenu = new QPopupMenu ( this );
00037 datemenu = new QPopupMenu ( this );
00038 menu->insertItem ( "Budget", budgetmenu );
00039 menu->insertItem ( "Line Item", lineitemsmenu );
00040 menu->insertItem ( "Date", datemenu );
00041 budgetmenu->insertItem ( "New", this, SLOT ( newBudget() ), 0, 1 );
00042 budgetmenu->insertItem ( "Edit", this, SLOT ( editBudget() ), 0, 2 );
00043 budgetmenu->insertItem ( "Delete", this, SLOT ( deleteBudget() ), 0, 3 );
00044 lineitemsmenu->insertItem ( "New", this, SLOT ( newLineItem() ), 0, 1 );
00045 lineitemsmenu->insertItem ( "Edit", this, SLOT ( editLineItem() ), 0, 2 );
00046 lineitemsmenu->insertItem ( "Delete", this, SLOT ( deleteLineItem() ), 0, 3 );
00047 datemenu->insertItem ( "Change", this, SLOT ( showCalendar() ) );
00048
00049 budgetbox = new QComboBox ( firstline );
00050 connect ( budgetbox, SIGNAL ( activated(int) ), this, SLOT ( setCurrentBudget(int) ) );
00051
00052 budgetview = new QComboBox ( firstline );
00053 budgetview->insertItem ( "Month" );
00054 budgetview->insertItem ( "Year" );
00055 connect ( budgetview, SIGNAL ( activated(int) ), this, SLOT ( setCurrentView(int) ) );
00056
00057 budgeted = new QLabel ( secondline );
00058 budgeted->setFont ( font );
00059 actual = new QLabel ( secondline );
00060 actual->setFont ( font );
00061 date = new QLabel ( secondline );
00062 date->setFont ( font );
00063
00064 listview = new QListView ( this );
00065 listview->setAllColumnsShowFocus ( TRUE );
00066 listview->setShowSortIndicator ( TRUE );
00067 listview->setRootIsDecorated ( TRUE );
00068 listview->setMultiSelection ( FALSE );
00069 listview->addColumn ( "Line Item", preferences->getColumnPreference ( 13 ) );
00070 listview->addColumn ( "Budget", preferences->getColumnPreference ( 14 ) );
00071 listview->addColumn ( "Actual", preferences->getColumnPreference ( 15 ) );
00072 listview->addColumn ( "", 0 );
00073 listview->setColumnWidthMode ( 0, QListView::Manual );
00074 listview->setColumnWidthMode ( 1, QListView::Manual );
00075 listview->setColumnWidthMode ( 2, QListView::Manual );
00076 listview->setColumnAlignment ( 1, Qt::AlignRight );
00077 listview->setColumnAlignment ( 2, Qt::AlignRight );
00078 listview->setColumnWidthMode ( 3, QListView::Manual );
00079
00080 listview->header()->setTracking ( FALSE );
00081 connect ( listview->header(), SIGNAL ( sizeChange(int,int,int) ), this, SLOT ( saveColumnSize(int,int,int) ) );
00082 connect ( listview->header(), SIGNAL ( clicked(int) ), this, SLOT ( saveSortingPreference(int) ) );
00083
00084
00085 int column = 0;
00086 int direction = 0;
00087 preferences->getSortingPreference ( 3, &column, &direction );
00088 listview->setSorting ( column, direction );
00089
00090 displayBudgetNames();
00091
00092 layout = new QVBoxLayout ( this, 2, 2 );
00093 layout->setMenuBar ( menu );
00094 layout->addWidget ( firstline );
00095 layout->addWidget ( secondline );
00096 layout->addWidget ( listview );
00097 }
00098
00099 void BudgetDisplay::deleteBudget ()
00100 {
00101 listview->clear();
00102 transaction->clearBudgetIDs ( currentbudget );
00103 budget->deleteBudget ( currentbudget );
00104 if ( budgetbox->count() != 0 )
00105 displayBudgetNames();
00106 checkBudgets();
00107 }
00108
00109 void BudgetDisplay::saveColumnSize ( int column, int oldsize, int newsize )
00110 {
00111 switch ( column )
00112 {
00113 case 0:
00114 preferences->changeColumnPreference ( 13, newsize );
00115 break;
00116 case 1:
00117 preferences->changeColumnPreference ( 14, newsize );
00118 break;
00119 case 2:
00120 preferences->changeColumnPreference ( 15, newsize );
00121 break;
00122 }
00123 }
00124
00125 void BudgetDisplay::saveSortingPreference ( int column )
00126 {
00127 preferences->changeSortingPreference ( 3, column );
00128 }
00129
00130 int BudgetDisplay::getIDColumn ()
00131 {
00132 int counter;
00133 int columns = listview->columns();
00134 for ( counter = 0; counter <= columns; counter++ )
00135 if ( listview->header()->label ( counter ).length() == 0 )
00136 return counter;
00137 }
00138
00139 void BudgetDisplay::newBudget ()
00140 {
00141 constructBudgetWindow();
00142 int response = nb->exec();
00143 if ( response == 1 )
00144 {
00145
00146 int addedbudget = budget->addBudget ( budgetname->text(), 0, description->text(), currencybox->currencybox->currentText(), day, month, year, day, month, year, 0 );
00147 transaction->clearBudgetIDs ( addedbudget );
00148 displayBudgetNames();
00149 }
00150 checkBudgets();
00151 }
00152
00153 void BudgetDisplay::constructBudgetWindow ()
00154 {
00155
00156 nb = new QDialog ( this, 0, TRUE );
00157 nb->setCaption ( "Budget" );
00158 QLabel *namelabel = new QLabel ( "Budget Name", nb );
00159 budgetname = new QLineEdit ( nb );
00160 QLabel *descriptionlabel = new QLabel ( "Description", nb );
00161 description = new QLineEdit ( nb );
00162 currencybox = new Currency ( nb );
00163 QBoxLayout *layout = new QVBoxLayout ( nb, 2, 2 );
00164 layout->addWidget ( namelabel );
00165 layout->addWidget ( budgetname );
00166 layout->addWidget ( descriptionlabel );
00167 layout->addWidget ( description );
00168 layout->addWidget ( currencybox );
00169 }
00170
00171 void BudgetDisplay::displayBudgetNames ()
00172 {
00173 budgetbox->clear();
00174 if ( budget->getNumberOfBudgets() != 0 )
00175 {
00176 ids = budget->getBudgetIDs();
00177 for ( QStringList::Iterator it = ids->begin(); it != ids->end(); ++it )
00178 {
00179 QString flag = "/opt/QtPalmtop/pics/flags/";
00180 flag.append ( budget->getCurrency ( (*it).toInt() ) );
00181 flag.append ( ".png" );
00182 budgetbox->insertItem ( QPixmap ( flag ), budget->getBudgetName ( (*it).toInt() ) );
00183 }
00184 setCurrentBudget ( 0 );
00185 }
00186 else
00187 checkBudgets();
00188 }
00189
00190 void BudgetDisplay::setCurrentBudget ( int index )
00191 {
00192 currentbudget = ( ids->operator[] ( index ).toInt() );
00193 displayLineItems();
00194 }
00195
00196 void BudgetDisplay::setCurrentView ( int index )
00197 {
00198 displayLineItems();
00199 }
00200
00201 void BudgetDisplay::showCalendar ()
00202 {
00203
00204 DatePicker *dp = new DatePicker ( QDate ( year, month, day ) );
00205 dp->daylabel->hide();
00206 dp->daybox->hide();
00207 if ( budgetview->currentItem() == 1 )
00208 {
00209 dp->monthlabel->hide();
00210 dp->monthbox->hide();
00211 }
00212 dp->setMaximumWidth ( ( int ) ( this->size().width() * 0.9 ) );
00213
00214 int response = dp->exec();
00215 if ( response == 1 )
00216 {
00217
00218 year = dp->getYear();
00219 if ( budgetview->currentItem() == 0 )
00220 month = dp->getMonth();
00221 else
00222 month = newDate.month();
00223 datelabel = preferences->getDate ( year, month );
00224 displayLineItems();
00225 }
00226 }
00227
00228 void BudgetDisplay::newLineItem ()
00229 {
00230
00231 constructLineItemWindow ();
00232
00233 int response = newlineitem->exec();
00234 if ( response == 1 )
00235 {
00236 float amount;
00237 if ( lineitemtime->currentItem() == 0 )
00238 amount = lineitemamount->text().toFloat();
00239 else if ( lineitemtime->currentItem() == 1 )
00240 amount = lineitemamount->text().toFloat() * 12;
00241 else
00242 amount = lineitemamount->text().toFloat() * 52;
00243 int lineitemadded = budget->addLineItem ( currentbudget, lineitemname->text(), amount, lineitemtime->currentItem() );
00244 transaction->clearBudgetIDs ( currentbudget, lineitemadded );
00245 displayLineItems();
00246 }
00247 checkBudgets();
00248 }
00249
00250 void BudgetDisplay::constructLineItemWindow ()
00251 {
00252
00253 newlineitem = new QDialog ( this, 0, TRUE );
00254 newlineitem->setCaption ( "Line Item" );
00255 QLabel *namelabel = new QLabel ( "Line Item Name", newlineitem );
00256 lineitemname = new QLineEdit ( newlineitem );
00257 QLabel *budgetamountlabel = new QLabel ( "Budget Amount", newlineitem );
00258 lineitemamount = new QLineEdit ( newlineitem );
00259 QLabel *lineitemtimelabel = new QLabel ( "Per:", newlineitem );
00260 lineitemtime = new QComboBox ( newlineitem );
00261 lineitemtime->insertItem ( "Year" );
00262 lineitemtime->insertItem ( "Month" );
00263 lineitemtime->insertItem ( "Week" );
00264 QBoxLayout *layout = new QVBoxLayout ( newlineitem, 2, 2 );
00265 layout->addWidget ( namelabel );
00266 layout->addWidget ( lineitemname );
00267 layout->addWidget ( budgetamountlabel );
00268 layout->addWidget ( lineitemamount );
00269 layout->addWidget ( lineitemtimelabel );
00270 layout->addWidget ( lineitemtime );
00271 }
00272
00273 void BudgetDisplay::deleteLineItem ()
00274 {
00275 if ( listview->selectedItem() != 0 )
00276 {
00277 int lineitemid = listview->selectedItem()->text ( getIDColumn() ).toInt();
00278 transaction->clearBudgetIDs ( currentbudget, lineitemid );
00279 budget->deleteLineItem ( currentbudget, lineitemid );
00280 displayBudgetNames();
00281 }
00282 else
00283 QMessageBox::warning ( this, "QashMoney", "Please select a line item to delete." );
00284 checkBudgets();
00285 }
00286
00287 void BudgetDisplay::displayLineItems ()
00288 {
00289 listview->clear();
00290 if ( budget->getNumberOfBudgets() != 0 )
00291 {
00292 QString budgettable = budgetbox->currentText();
00293 budgettable.append ( QString::number ( currentbudget ) );
00294 budget->displayLineItems ( currentbudget, listview, month, year, budgetview->currentItem() );
00295 totalactual = transaction->getActualTotal ( currentbudget, year, month, budgetview->currentItem() );
00296 totalbudget = budget->getBudgetTotal ( currentbudget, budgetview->currentItem() );
00297 updateBudgetInformation();
00298 }
00299 }
00300
00301 void BudgetDisplay::checkBudgets ()
00302 {
00303 if ( budget->getNumberOfBudgets() == 0 )
00304 {
00305 budgetview->setEnabled ( FALSE );
00306 budgetmenu->setItemEnabled ( 2, FALSE );
00307 budgetmenu->setItemEnabled ( 3, FALSE );
00308 lineitemsmenu->setItemEnabled ( 1, FALSE );
00309 lineitemsmenu->setItemEnabled ( 2, FALSE );
00310 lineitemsmenu->setItemEnabled ( 3, FALSE );
00311 }
00312 else
00313 {
00314 budgetview->setEnabled ( TRUE );
00315 budgetmenu->setItemEnabled ( 2, TRUE );
00316 budgetmenu->setItemEnabled ( 3, TRUE );
00317 lineitemsmenu->setItemEnabled ( 1, TRUE );
00318 lineitemsmenu->setItemEnabled ( 2, FALSE );
00319 lineitemsmenu->setItemEnabled ( 3, FALSE );
00320
00321 if ( budget->getNumberOfLineItems ( currentbudget ) != 0 )
00322 {
00323 lineitemsmenu->setItemEnabled ( 2, TRUE );
00324 lineitemsmenu->setItemEnabled ( 3, TRUE );
00325 }
00326 }
00327 }
00328
00329 void BudgetDisplay::updateBudgetInformation ()
00330 {
00331 if ( budgetview->currentItem() == 0 )
00332 {
00333 datelabel = preferences->getDate ( year, month );
00334 datelabel.prepend ( "Date: " );
00335 date->setText ( datelabel );
00336 }
00337 else
00338 date->setText ( QString::number ( year ) );
00339
00340 QString budget = "Budget: ";
00341 budget.append ( totalbudget );
00342 budgeted->setText ( budget );
00343
00344 QString actualamount = "Actual: ";
00345 actualamount.append ( totalactual );
00346 actual->setText ( actualamount );
00347 }
00348
00349 void BudgetDisplay::editBudget ()
00350 {
00351 constructBudgetWindow();
00352
00353
00354 budgetname->setText ( budget->getBudgetName ( currentbudget ) );
00355
00356 description->setText ( budget->getBudgetDescription ( currentbudget ) );
00357
00358
00359
00360 int count = currencybox->currencybox->count();
00361 QString code = budget->getCurrency ( currentbudget );
00362 for ( int counter = 0; count - 1; counter++ )
00363 {
00364 if ( QString::compare (currencybox->currencybox->text ( counter ), code ) == 0 )
00365 {
00366 currencybox->currencybox->setCurrentItem ( counter );
00367 break;
00368 }
00369 }
00370 int response = nb->exec();
00371 if ( response == 1 )
00372 {
00373 budget->updateBudget ( budgetname->text(), description->text(), currencybox->currencybox->currentText(), currentbudget );
00374 displayBudgetNames();
00375 }
00376 }
00377
00378 void BudgetDisplay::editLineItem ()
00379 {
00380 if ( listview->selectedItem() != 0 )
00381 {
00382 constructLineItemWindow();
00383
00384
00385 lineitemname->setText ( listview->selectedItem()->text( 0 ) );
00386
00387
00388 int lineitemtype = budget->getLineItemTime ( currentbudget, listview->selectedItem()->text ( 3 ).toInt() );
00389 lineitemtime->setCurrentItem ( lineitemtype );
00390
00391
00392 float amount = budget->getLineItemAmount ( currentbudget, listview->selectedItem()->text ( 3 ).toInt() );
00393 if ( lineitemtype == 1 )
00394 amount = amount / 12;
00395 else if ( lineitemtype == 2 )
00396 amount = amount / 52;
00397 lineitemamount->setText ( QString::number ( amount ) );
00398
00399 int response = newlineitem->exec();
00400 if ( response == 1 )
00401 {
00402 float amount;
00403 if ( lineitemtime->currentItem() == 0 )
00404 amount = lineitemamount->text().toFloat();
00405 else if ( lineitemtime->currentItem() == 1 )
00406 amount = lineitemamount->text().toFloat() * 12;
00407 else
00408 amount = lineitemamount->text().toFloat() * 52;
00409 budget->updateLineItem ( lineitemname->text(), amount, lineitemtime->currentItem(), currentbudget, listview->selectedItem()->text ( 3 ).toInt() );
00410 displayLineItems();
00411 }
00412 }
00413 else
00414 QMessageBox::warning ( this, "QashMoney", "Please select a line item to edit." );
00415 }
00416
00417