Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

budgetdisplay.cpp

Go to the documentation of this file.
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     //set the default date to today
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 ) ); // column id 13
00070     listview->addColumn ( "Budget", preferences->getColumnPreference ( 14 ) ); // column id 14
00071     listview->addColumn ( "Actual", preferences->getColumnPreference ( 15 ) ); // column id 15
00072     listview->addColumn ( "", 0 ); // line item ids
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     // pull the column sorting preference from the preferences table, and configure the listview accordingly
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        // open a new budget object
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     //construct and format the new budget window
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     // create new calendar object and show it
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         // Set date integers
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     //construct and format the new line item window
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     //construct and format the new budget window
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" ); // type 0
00262     lineitemtime->insertItem ( "Month" ); // type 1
00263     lineitemtime->insertItem ( "Week" ); // type 2
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     //set the title
00354     budgetname->setText ( budget->getBudgetName ( currentbudget ) );
00355     //set the description
00356     description->setText ( budget->getBudgetDescription ( currentbudget ) );
00357     // retrieve the two character currency code then
00358     // go through the currencty box and find the code
00359     //set the currency box to that index number
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         // set the line item name
00385         lineitemname->setText ( listview->selectedItem()->text( 0 ) );
00386 
00387         // set the line item time combobox
00388         int lineitemtype = budget->getLineItemTime ( currentbudget, listview->selectedItem()->text ( 3 ).toInt() );
00389         lineitemtime->setCurrentItem ( lineitemtype );
00390 
00391         // set the line item amount
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 

Generated on Sat Nov 5 16:18:11 2005 for OPIE by  doxygen 1.4.2