Main Page   Class Hierarchy   Data Structures   File List   Data Fields  

gstockcalc.cpp

00001 /***************************************************************************
00002                           GStockCalc.cpp  -  description
00003                              -------------------
00004     begin                : Fri Oct 18 2002
00005     copyright            : (C) 2002 by Michael Otto
00006     email                : Michael.Otto@saskathex.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include "gstockcalc.h"
00019 
00020 #include "stockmarketvector.h"
00021 #include "stockmarket.h"
00022 #include "stockcontainer.h"
00023 #include "stock.h"
00024 #include "stockgui.h"
00025 #include "preferencesdialog.h"
00026 #include "addnewstock.h"
00027 #include "removestock.h"
00028 #include "movestock.h"
00029 #include "addmarket.h"
00030 #include "removemarket.h"
00031 #include "editstockmarketnames.h"
00032 #include "aboutdialog.h"
00033 #include "xmlfileparser.h"
00034 #include "preferences.h"
00035 #include "summarydialog.h"
00036 #include "changepageorder.h"
00037 
00038 #include <gtkmm/stock.h>
00039 
00040 #include <unistd.h>
00041 #include <sys/types.h>
00042 #include <sys/stat.h>
00043 #include <fcntl.h>
00044 #include <errno.h>
00045 #include <time.h>
00046 
00050 GStockCalc *GStockCalc::gStockCalcStatic = NULL;
00051 
00052 
00056 GStockCalc::GStockCalc() {
00057 
00058   gStockCalcStatic = this;
00059 
00060   stockMarketVector = new StockMarketVector();
00061   preferences = new Preferences();
00062 
00063   // setting up window attributes
00064   set_title("gstockcalc");
00065   set_border_width(5);
00066   set_resizable(false);
00067   vbox = manage(new Gtk::VBox(false, 0));
00068   vbox->set_spacing(5);
00069   add(*vbox);
00070   fillMenu();
00071 
00072   // add an event box that can catch button_press events:
00073   vbox->pack_start(m_EventBox);
00074   m_EventBox.signal_button_press_event().connect( SigC::slot(*this, &GStockCalc::on_button_press_event) );
00075   fillPopUpMenu();
00076 
00077   vboxNotebookParent = manage(new Gtk::VBox(false, 0));
00078   vboxNotebookChild = manage(new Gtk::VBox(false, 0));
00079   m_EventBox.add(*vboxNotebookParent);
00080   vboxNotebookParent->pack_start(*vboxNotebookChild, Gtk::PACK_SHRINK, 0);
00081 
00082   // Loading the StockMarketVector from the save file, if it exists
00083   int i = strlen (getenv ("HOME"));
00084   strncpy(stockmarketVectorFilename, getenv ("HOME"), i);
00085   stockmarketVectorFilename[i] = '\0';
00086   i = strlen ("/.gstockcalc_stocks.xml");
00087   strncat(stockmarketVectorFilename, "/.gstockcalc_stocks.xml", i);
00088   if (fileNotExists(stockmarketVectorFilename)) {
00089     printf("~/.gstockcalc_stocks.xml does not exist; will create a new one!\n");
00090     createFile(stockmarketVectorFilename);
00091     stockMarketVector->createInitialMarkets();
00092     saveStockMarketVectorToFile();
00093   } else {
00094     // reading the stocks from a file
00095     XMLFileParser *parser = new XMLFileParser();
00096     parser->parsingTheXmlFile(stockmarketVectorFilename, stockMarketVector);
00097   }
00098   // Attaching the Observer "this" to all stockmarkets
00099   for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00100     StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00101     stockMarket->attach(this);
00102   }
00103 
00104   // Loading the Preferences from the save file, if it exists
00105   i = strlen (getenv ("HOME"));
00106   strncpy(preferencesFilename, getenv ("HOME"), i);
00107   preferencesFilename[i] = '\0';
00108   i = strlen("/.gstockcalc");
00109   strncat(preferencesFilename, "/.gstockcalc", i);
00110   if (fileNotExists(preferencesFilename)) {
00111     printf("~/.gstockcalc does not exist; will create a new one!\n");
00112     createFile(preferencesFilename);
00113     savePreferencesToFile();
00114   } else {
00115     // reading the preferences from the file
00116     XMLFileParser *parser = new XMLFileParser();
00117     parser->parsingTheXmlFile(preferencesFilename, preferences);
00118   }
00119 
00120   // Attaching the Observer "this" to the stockmarketvector
00121   stockMarketVector->attach(this);
00122   this->update(stockMarketVector);
00123   // displaying all
00124   show_all();
00125 
00126 }
00127 
00131 void GStockCalc::fillMenu() {
00132   Gtk::Image *imageSave, *imageQuit, *imageAddStock, *imageRemoveStock, *imageMoveStock, *imageAddMarket, *imageRemoveMarket,
00133   *imagePreferences, *imageAbout, *imageEditStockMarketNames, *imageShowSummary, *imageChangePageOrder;
00134 
00135   //File menu:
00136   {
00137     Gtk::Menu::MenuList& menulist = m_Menu_File.items();
00138     imageSave = new Gtk::Image(Gtk::Stock::SAVE, Gtk::ICON_SIZE_MENU);
00139     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Save", Gtk::Menu::AccelKey("<control>s"), *imageSave,
00140                        SigC::slot(*this, &GStockCalc::eventButtonSaveToFile)));
00141     menulist.push_back(Gtk::Menu_Helpers::SeparatorElem());
00142     imagePreferences = new Gtk::Image(Gtk::Stock::PREFERENCES, Gtk::ICON_SIZE_MENU);
00143     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("Pr_eferences", *imagePreferences,
00144                        SigC::slot(*this, &GStockCalc::eventPreferences)));
00145     menulist.push_back(Gtk::Menu_Helpers::SeparatorElem());
00146     imageQuit = new Gtk::Image(Gtk::Stock::QUIT, Gtk::ICON_SIZE_MENU);
00147     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Quit",  Gtk::Menu::AccelKey("<control>q"), *imageQuit,
00148                        SigC::slot(*this, &GStockCalc::beforeQuit)));
00149   }
00150   //Manage menu:
00151   {
00152     Gtk::Menu::MenuList& menulist = m_Menu_Manage.items();
00153     imageAddStock = new Gtk::Image(Gtk::Stock::YES, Gtk::ICON_SIZE_MENU);
00154     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Add Stock",  Gtk::Menu::AccelKey("<control><alt>s"), *imageAddStock,
00155                        SigC::slot(*this, &GStockCalc::eventAddNewStock)));
00156     imageRemoveStock = new Gtk::Image(Gtk::Stock::NO, Gtk::ICON_SIZE_MENU);
00157     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Remove Stock", *imageRemoveStock,
00158                        SigC::slot(*this, &GStockCalc::eventRemoveStock)));
00159     imageMoveStock = new Gtk::Image(Gtk::Stock::CONVERT, Gtk::ICON_SIZE_MENU);
00160     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Move Stock", *imageMoveStock,
00161                        SigC::slot(*this, &GStockCalc::eventMoveStock)));
00162     menulist.push_back(Gtk::Menu_Helpers::SeparatorElem());
00163     imageAddMarket = new Gtk::Image(Gtk::Stock::YES, Gtk::ICON_SIZE_MENU);
00164     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("A_dd Market",  Gtk::Menu::AccelKey("<control><alt>m"), *imageAddMarket,
00165                        SigC::slot(*this, &GStockCalc::eventAddMarket)));
00166     imageRemoveMarket = new Gtk::Image(Gtk::Stock::NO, Gtk::ICON_SIZE_MENU);
00167     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("R_emove Market", *imageRemoveMarket,
00168                        SigC::slot(*this, &GStockCalc::eventRemoveMarket)));
00169     menulist.push_back(Gtk::Menu_Helpers::SeparatorElem());
00170     imageShowSummary = manage(new Gtk::Image(Gtk::Stock::JUMP_TO, Gtk::ICON_SIZE_MENU));
00171     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Show summary on selected Stockmarket",  Gtk::Menu::AccelKey("<control>u"), *imageShowSummary,
00172                        SigC::slot(*this, &GStockCalc::eventShowSummary)));
00173     imageEditStockMarketNames = new Gtk::Image(Gtk::Stock::PREFERENCES, Gtk::ICON_SIZE_MENU);
00174     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("Ed_it Market names", *imageEditStockMarketNames,
00175                        SigC::slot(*this, &GStockCalc::eventEditStockMarketNames)));
00176     imageChangePageOrder = new Gtk::Image(Gtk::Stock::CONVERT, Gtk::ICON_SIZE_MENU);
00177     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Change page order", *imageChangePageOrder,
00178                        SigC::slot(*this, &GStockCalc::eventChangePageOrder)));
00179 
00180   }
00181   //Help menu:
00182   {
00183     Gtk::Menu::MenuList& menulist = m_Menu_Help.items();
00184     imageAbout = new Gtk::Image(Gtk::Stock::DIALOG_INFO, Gtk::ICON_SIZE_MENU);
00185     menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_About", *imageAbout,
00186                        SigC::slot(*this, &GStockCalc::eventAboutDialog) ) );
00187   }
00188 
00189   //Add the menus to the MenuBar:
00190   m_MenuBar.items().push_back(Gtk::Menu_Helpers::MenuElem("_File", m_Menu_File) );
00191   m_MenuBar.items().push_back(Gtk::Menu_Helpers::MenuElem("_Manage", m_Menu_Manage) );
00192   m_MenuBar.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::HELP, m_Menu_Help) );
00193 
00194   //Add the MenuBar to the window:
00195   vbox->pack_start(m_MenuBar, Gtk::PACK_SHRINK, 0);
00196 }
00197 
00201 void GStockCalc::fillPopUpMenu() {
00202 
00203   Gtk::Image *imageShowSummary;
00204   // fill popup menu:
00205   Gtk::Menu::MenuList& menulist = m_Menu_Popup.items();
00206 
00207   imageShowSummary = manage(new Gtk::Image(Gtk::Stock::JUMP_TO, Gtk::ICON_SIZE_MENU));
00208   menulist.push_back(Gtk::Menu_Helpers::ImageMenuElem("_Show summary",  Gtk::Menu::AccelKey("<control>u"), *imageShowSummary,
00209                        SigC::slot(*this, &GStockCalc::eventShowSummary)));
00210 
00211   m_Menu_Popup.accelerate(*this);
00212 }
00213 
00214 
00218 GStockCalc::~GStockCalc() {
00219   delete preferences;
00220   Gtk::Table *table;
00221   for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00222     table = tableStockMarket[i];
00223     delete table;
00224     tableStockMarket[i] = NULL;
00225   }
00226   // deleting the stockMarketVector causes a seg fault; reason: Observer - Subject problem
00227   //delete stockMarketVector;
00228 }
00229 
00233 void GStockCalc::beforeQuit() {
00234   if (preferences->getAutoSaveOnExit()) {
00235     quitAndSave();
00236   }
00237   if (preferences->getSaveDialogOnExit()) {
00238     Gtk::Window *win = new Gtk::Window();
00239     win->set_title("Message");
00240     win->set_modal(true);
00241     win->set_border_width(5);
00242     Gtk::VBox *box;
00243     Gtk::HButtonBox *buttonBox;
00244     Gtk::Button *buttonNo, *buttonYes;
00245     box = manage(new Gtk::VBox(false, 0));
00246     box->set_spacing(5);
00247     win->add(*box);
00248     Gtk::Label *label = manage(new Gtk::Label("Do you want to save the Stockmarket(s)/Stock(s)/..?"));
00249     box->pack_start(*label, Gtk::PACK_SHRINK, 0);
00250     Gtk::HSeparator *sep = manage(new Gtk::HSeparator());
00251     box->pack_start(*sep, Gtk::PACK_SHRINK, 0);
00252     buttonBox = manage( new Gtk::HButtonBox());
00253     buttonBox->set_spacing(5);
00254     box->pack_start(*buttonBox, Gtk::PACK_SHRINK, 0);
00255     buttonNo = manage( new Gtk::Button(Gtk::Stock::NO));
00256     buttonNo->signal_clicked().connect(slot(*this,&GStockCalc::quit));
00257     buttonBox->pack_start(*buttonNo, Gtk::PACK_SHRINK, 0);
00258     buttonYes = manage( new Gtk::Button(Gtk::Stock::YES));
00259     buttonYes->signal_clicked().connect(slot(*this,&GStockCalc::quitAndSave));
00260     buttonBox->pack_start(*buttonYes, Gtk::PACK_SHRINK, 0);
00261     win->show_all();
00262   } else {
00263     quit();
00264   }
00265 }
00266 
00270 void GStockCalc::quitAndSave() {
00271   saveStockMarketVectorToFile();
00272   quit();
00273 }
00274 
00278 void GStockCalc::quit() {
00279   savePreferencesToFile();
00280   Gtk::Main::quit();
00281 }
00282 
00283 
00287 void GStockCalc::saveStockMarketVectorToFile() {
00288   Stock *s;
00289   FILE *file;      // FILE pointer
00290   file = fopen(stockmarketVectorFilename, "w"); // create a file for writing
00291   if  (file == NULL) {
00292     printf("An error has occurred.\n");
00293   }
00294   fprintf(file,"<?xml version=\"1.0\"?>\n");
00295   fprintf(file,"<stocks>\n");
00296   //last save
00297   time_t t1;
00298   (void) time(&t1);
00299   tm *t;
00300   t = localtime(&t1);
00301   fprintf(file,"  <lastSave>%d/%d</lastSave>\n",t->tm_mon,t->tm_mday);
00302 
00303   for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00304     StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00305     fprintf(file,"  <stockmarket>\n",stockMarket->getMarketName().c_str());
00306     fprintf(file,"    <name>%s</name>\n",stockMarket->getMarketName().c_str());
00307     for (int j = 0; j < stockMarket->getNumberOfStockContainer(); j++) {
00308       StockContainer *stockContainer = stockMarket->getStockContainer(j);
00309       Stock *stock = stockContainer->getStock();
00310       writeOneStockToFile(file, stock);
00311     }
00312     fprintf(file,"  </stockmarket>\n");
00313   }
00314   fprintf(file,"</stocks>\n");
00315   fclose(file); // now close the file
00316 }
00317 
00318 
00323 void GStockCalc::writeOneStockToFile(FILE *file, Stock *s) {
00324   fprintf(file,"    <stock>\n");
00325   fprintf(file,"      <name>%s</name>\n",(s->getName()).c_str());
00326   fprintf(file,"      <wkn>%s</wkn>\n",(s->getWkn()).c_str());
00327   fprintf(file,"      <buyingDate>%s</buyingDate>\n",(s->getBuyingDate()).c_str());
00328   fprintf(file,"      <amount>%d</amount>\n",s->getAmount());
00329   fprintf(file,"      <buyingRate>%.2f</buyingRate>\n",s->getBuyingRate());
00330   fprintf(file,"      <purchaseCost>%.2f</purchaseCost>\n",s->getPurchaseCost());
00331   fprintf(file,"      <currentMarketPrice>%.2f</currentMarketPrice>\n",s->getCurrentMarketPrice());
00332   fprintf(file,"      <values>\n");
00333   vector <float> values = s->getValuesVector();
00334   for (int i=0; i < values.size(); i++) {
00335     fprintf(file,"        <v>%.2f</v>\n",values[i]);
00336   }
00337   fprintf(file,"      </values>\n");
00338   fprintf(file,"    </stock>\n");
00339 }
00340 
00341 
00345 void GStockCalc::savePreferencesToFile() {
00346   FILE *file;      // FILE pointer
00347   file = fopen(preferencesFilename, "w"); // create a file for writing
00348   if  (file == NULL) {
00349     printf("An error has occurred.\n");
00350   }
00351   fprintf(file,"<?xml version=\"1.0\"?>\n");
00352   fprintf(file,"<preferences>\n");
00353   fprintf(file,"  <autoSaveOnExit>%i</autoSaveOnExit>\n",(int) preferences->getAutoSaveOnExit());
00354   fprintf(file,"  <saveDialogOnExit>%i</saveDialogOnExit>\n",(int) preferences->getSaveDialogOnExit());
00355   fprintf(file,"</preferences>\n");
00356   fclose(file); // now close the file
00357 }
00358 
00359 
00364 int GStockCalc::createFile(char *filename) {
00365   // creating file
00366   mode_t oldumask;
00367   int ret;
00368   oldumask = umask (0);
00369   ret = creat (filename, (S_IRUSR | S_IWUSR));
00370   umask (oldumask);
00371   return ret;
00372 }
00373 
00378 int GStockCalc::fileNotExists (char *filename) {
00379   struct stat naamstat;
00380   if ((stat (filename, &naamstat) == -1) && (errno == ENOENT)) return 1;
00381   else return 0;
00382 }
00383 
00384 
00388 void GStockCalc::eventButtonSaveToFile() {
00389   saveStockMarketVectorToFile();
00390 }
00391 
00395 void GStockCalc::eventPreferences() {
00396   new class PreferencesDialog(stockMarketVector, preferences);
00397 }
00398 
00402 void GStockCalc::eventAddNewStock() {
00403   new class AddNewStock(stockMarketVector);
00404 }
00405 
00409 void GStockCalc::eventRemoveStock() {
00410   new class RemoveStock(stockMarketVector);
00411 }
00412 
00416 void GStockCalc::eventMoveStock() {
00417   new class MoveStock(stockMarketVector);
00418 }
00419 
00423 void GStockCalc::eventAddMarket() {
00424   new class AddMarket(stockMarketVector);
00425 }
00426 
00430 void GStockCalc::eventRemoveMarket() {
00431   new class RemoveMarket(stockMarketVector);
00432 }
00433 
00437 void GStockCalc::eventEditStockMarketNames() {
00438   new class EditStockMarketNames(stockMarketVector);
00439 }
00440 
00444 void GStockCalc::eventAboutDialog() {
00445   new class AboutDialog();
00446 }
00447 
00451 void GStockCalc::eventShowSummary() {
00452   new class SummaryDialog(stockMarketVector, notebook->get_current_page());
00453 }
00454 
00458 void GStockCalc::eventChangePageOrder() {
00459   new class ChangePageOrder(stockMarketVector);
00460 }
00461 
00466 gint GStockCalc::delete_event_impl(GdkEventAny *event) {
00467   beforeQuit();
00468   return 0;
00469 }
00470 
00476 bool GStockCalc::on_button_press_event(GdkEventButton* event) {
00477   if ((event->type == GDK_BUTTON_PRESS) && ((event->button == 1) || (event->button == 3))) {
00478     m_Menu_Popup.popup(event->button, event->time);
00479     return true; //It has been handled.
00480   } else {
00481     return false;
00482   }
00483 }
00484 
00485 
00489 void GStockCalc::fillTable(int tableStockMarketNumber) {
00490   Gtk::Label *label;
00491   Gtk::SpinButton *spinButton;
00492   Gtk::Button *button;
00493 
00494   Gtk::Table *table = tableStockMarket[tableStockMarketNumber];
00495   this->fillTableWithLabels(table);
00496 
00497   // Market == "All"
00498   if (tableStockMarketNumber == 0 ) {
00499     int offset = 0;
00500     for (int j = 0; j < stockMarketVector->getNumberOfStockMarkets(); j++) {
00501       StockMarket *stockMarket = stockMarketVector->getStockMarket(j);
00502       for (int i = 0; i < stockMarket->getNumberOfStockContainer(); i++) {
00503         StockContainer *stockContainer = stockMarket->getStockContainer(i);
00504         // refreshing the gui elements
00505         Stock *s = stockContainer->getStock();
00506         StockGui *sg = manage(new StockGui(s));
00507 
00508         table->attach(*sg, 0, 1, i+2+offset, i+3+offset);
00509         label = sg->getLabelWkn();
00510         table->attach(*label, 1, 2, i+2+offset, i+3+offset);
00511         label = sg->getLabelBuyingDate();
00512         table->attach(*label, 2, 3, i+2+offset, i+3+offset);
00513         spinButton = sg->getSpinButtonAmount();
00514         table->attach(*spinButton, 3, 4, i+2+offset, i+3+offset);
00515         spinButton = sg->getSpinButtonBuyingRate();
00516         table->attach(*spinButton, 4, 5, i+2+offset, i+3+offset);
00517         label = sg->getLabelPurchaseValue();
00518         table->attach(*label, 5, 6, i+2+offset, i+3+offset);
00519         vSep = manage(new Gtk::VSeparator());
00520         table->attach(*vSep, 6, 7, i+2+offset, i+3+offset);
00521         spinButton = sg->getSpinButtonCurrentMarketPrice();
00522         table->attach(*spinButton, 7, 8, i+2+offset, i+3+offset);
00523         label = sg->getLabelDayPerformance();
00524         table->attach(*label, 8, 9, i+2+offset, i+3+offset);
00525         label = sg->getLabelTotalMarketValue();
00526         table->attach(*label, 9, 10, i+2+offset, i+3+offset);
00527         label = sg->getLabelOverallPerformance();
00528         table->attach(*label, 10, 11, i+2+offset, i+3+offset);
00529         button = sg->getButtonInfo();
00530         table->attach(*button, 11, 12, i+2+offset, i+3+offset);
00531         button = sg->getButtonChart();
00532         table->attach(*button, 12, 13, i+2+offset, i+3+offset);
00533       }
00534       offset += stockMarket->getNumberOfStockContainer();
00535     }
00536     // other markets, not "All"
00537   } else {
00538     StockMarket *stockMarket = stockMarketVector->getStockMarket(tableStockMarketNumber - 1);
00539     for (int i = 0; i < stockMarket->getNumberOfStockContainer(); i++) {
00540       StockContainer *stockContainer = stockMarket->getStockContainer(i);
00541       // refreshing the gui elements
00542       Stock *s = stockContainer->getStock();
00543       StockGui *sg = manage(new StockGui(s));
00544 
00545       table->attach(*sg, 0, 1, i+2, i+3);
00546       label = sg->getLabelWkn();
00547       table->attach(*label, 1, 2, i+2, i+3);
00548       label = sg->getLabelBuyingDate();
00549       table->attach(*label, 2, 3, i+2, i+3);
00550       spinButton = sg->getSpinButtonAmount();
00551       table->attach(*spinButton, 3, 4, i+2, i+3);
00552       spinButton = sg->getSpinButtonBuyingRate();
00553       table->attach(*spinButton, 4, 5, i+2, i+3);
00554       label = sg->getLabelPurchaseValue();
00555       table->attach(*label, 5, 6, i+2, i+3);
00556       vSep = manage(new Gtk::VSeparator());
00557       table->attach(*vSep, 6, 7, i+2, i+3);
00558       spinButton = sg->getSpinButtonCurrentMarketPrice();
00559       table->attach(*spinButton, 7, 8, i+2, i+3);
00560       label = sg->getLabelDayPerformance();
00561       table->attach(*label, 8, 9, i+2, i+3);
00562       label = sg->getLabelTotalMarketValue();
00563       table->attach(*label, 9, 10, i+2, i+3);
00564       label = sg->getLabelOverallPerformance();
00565       table->attach(*label, 10, 11, i+2, i+3);
00566       button = sg->getButtonInfo();
00567       table->attach(*button, 11, 12, i+2, i+3);
00568       button = sg->getButtonChart();
00569       table->attach(*button, 12, 13, i+2, i+3);
00570     }
00571   }
00572 }
00573 
00574 
00578 void GStockCalc::fillTableWithLabels(Gtk::Table *table) {
00579   Gtk::Label *label;
00580   label = manage (new Gtk::Label("Name", 0));
00581   table->attach(*label, 0, 1, 0, 1);
00582   label = manage (new Gtk::Label("ID/WKN", 0));
00583   table->attach(*label, 1, 2, 0, 1);
00584   label = manage (new Gtk::Label("Purchase Date", 0));
00585   table->attach(*label, 2, 3, 0, 1);
00586   label = manage (new Gtk::Label("Amount", 0));
00587   table->attach(*label, 3, 4, 0, 1);
00588   label = manage (new Gtk::Label("Buying rate", 0));
00589   table->attach(*label, 4, 5, 0, 1);
00590   label = manage (new Gtk::Label("Purchase value", 0));
00591   table->attach(*label, 5, 6, 0, 1);
00592   vSep = manage(new Gtk::VSeparator());
00593   table->attach(*vSep, 6, 7, 0, 1);
00594 
00595   label = manage (new Gtk::Label("current price", 0));
00596   table->attach(*label, 7, 8, 0, 1);
00597   label = manage (new Gtk::Label("Day perf.", 0));
00598   table->attach(*label, 8, 9, 0, 1);
00599   label = manage (new Gtk::Label("total market value", 0));
00600   table->attach(*label, 9, 10, 0, 1);
00601   label = manage (new Gtk::Label("Overall perf.", 0));
00602   table->attach(*label, 10, 11, 0, 1);
00603 
00604   hSep = manage(new Gtk::HSeparator());
00605   table->attach(*hSep, 0, 13, 1, 2);
00606 }
00607 
00608 
00609 
00613 void GStockCalc::update(const Subject *const subject) {
00614 
00615   Gtk::VBox *vboxHelpChild, *vboxHelpParent;
00616   Gtk::Table *tableHelp;//, *tableNew;
00617 
00618 #ifdef DEBUG
00619   printf("GStockCalc::update()\n");
00620 #endif
00621   for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00622     StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00623     if (stockMarket == subject) {
00624       updateStockMarketNotebookPage(stockMarket, i);
00625     }
00626   }
00627 
00628   if (stockMarketVector == subject) {
00629 #ifdef DEBUG
00630     printf("  stockMarketVector has changed\n");
00631     int size = stockMarketVector->getNumberOfStockMarkets();
00632     printf("  size: %d\n",size);
00633     for (int i = 0; i < size; i++) {
00634       StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00635       printf("  %d. market: %s\n", i, stockMarket->getMarketName().c_str());
00636     }
00637 #endif
00638     delete vboxNotebookChild;
00639     vboxNotebookChild = manage(new Gtk::VBox(false, 0));
00640     vboxNotebookParent->pack_start(*vboxNotebookChild, Gtk::PACK_SHRINK, 0);
00641     notebook = manage(new Gtk::Notebook());
00642     vboxNotebookChild->pack_start(*notebook, Gtk::PACK_SHRINK, 0);
00643 
00644     Gtk::Table *table;
00645 
00646     // creating the GUI elements for the StockMarket "All"
00647     // sum up number of stocks over all StockMarkets
00648     int sum = 0;
00649     for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00650       StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00651       sum += stockMarket->getNumberOfStockContainer();
00652     }
00653     vboxHelpParent = manage(new Gtk::VBox(false, 0));
00654     vboxHelpParent->set_spacing(5);
00655     vboxHelpParent->set_border_width(5);
00656     notebook->append_page(*vboxHelpParent ,"All", "", true);
00657     // save the object to an array
00658     vboxParentStockMarket[0] = vboxHelpParent;
00659     vboxHelpChild = manage(new Gtk::VBox(false, 0));
00660     // save the object to an array
00661     vboxChildStockMarket[0] = vboxHelpChild;
00662     vboxHelpParent->pack_start(*vboxHelpChild, Gtk::PACK_EXPAND_WIDGET, 0);
00663     if (sum > 0) {
00664       table = manage(new Gtk::Table(sum, 13, false));
00665     } else {
00666       table = manage(new Gtk::Table(1, 13, false));
00667     }
00668     table->set_spacings(10);
00669     vboxHelpChild->pack_start(*table, Gtk::PACK_SHRINK, 0);
00670     // save the object to an array
00671     tableStockMarket[0] = table;
00672 
00673     // creating the GUI elements for each StockMarket
00674     for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00675       StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00676       int tableSize = stockMarket->getNumberOfStockContainer();
00677 
00678       vboxHelpParent = manage(new Gtk::VBox(false, 0));
00679       vboxHelpParent->set_spacing(5);
00680       vboxHelpParent->set_border_width(5);
00681       notebook->append_page(*vboxHelpParent ,stockMarket->getMarketName(), "", true);
00682       // save the object to an array
00683       vboxParentStockMarket[i+1] = vboxHelpParent;
00684       vboxHelpChild = manage(new Gtk::VBox(false, 0));
00685       // save the object to an array
00686       vboxChildStockMarket[i+1] = vboxHelpChild;
00687       vboxHelpParent->pack_start(*vboxHelpChild, Gtk::PACK_EXPAND_WIDGET, 0);
00688       if (tableSize > 0) {
00689         table = manage(new Gtk::Table(tableSize, 13, false));
00690       } else {
00691         table = manage(new Gtk::Table(1, 13, false));
00692       }
00693       table->set_spacings(10);
00694       vboxHelpChild->pack_start(*table, Gtk::PACK_SHRINK, 0);
00695       // save the object to an array
00696       tableStockMarket[i+1] = table;
00697       updateStockMarketNotebookPage(stockMarket,i);
00698     }
00699   }
00700   updateStockMarketAllNotebookPage();
00701   for (int i = notebook->get_n_pages()-1; i >= 0; i--) {
00702     notebook->set_current_page(i);
00703   }
00704   set_size_request(-1,-1);
00705   show_all();
00706 }
00707 
00712 void GStockCalc::updateStockMarketNotebookPage(StockMarket *stockMarket, int stockMarketNumber) {
00713   Gtk::VBox *vboxHelpChild, *vboxHelpParent;
00714   Gtk::Table *tableHelp, *tableNew;
00715 
00716   // update label: stockmarket name
00717   Widget* widget = notebook->get_nth_page(stockMarketNumber+1);
00718   notebook->set_tab_label_text(*widget, stockMarket->getMarketName());
00719 
00720 #ifdef DEBUG
00721   printf("StockMarket %s has changed.\n",stockMarket->getMarketName().c_str());
00722 #endif
00723   vboxHelpChild = vboxChildStockMarket[stockMarketNumber+1];
00724   // update tableStockMarket[i+1]
00725   int tableSize = stockMarket->getNumberOfStockContainer();
00726   if (tableSize > 0) {
00727     tableNew = manage(new Gtk::Table(tableSize, 13, false));
00728   } else {
00729     tableNew = manage(new Gtk::Table(1, 13, false));
00730   }
00731   tableNew->set_spacings(10);
00732   vboxHelpChild->pack_start(*tableNew, Gtk::PACK_SHRINK, 0);
00733   // creating vector tableStockMarketNew
00734   tableHelp = tableStockMarket[stockMarketNumber+1];
00735   delete tableHelp;
00736   tableStockMarket[stockMarketNumber+1] = tableNew;
00737   fillTable(stockMarketNumber+1);
00738 }
00739 
00743 void GStockCalc::updateStockMarketAllNotebookPage() {
00744   // update tableStockMarket[0] == "All"
00745   // creating the GUI elements for the StockMarket "All"
00746   // sum up number of stocks over all StockMarkets
00747 
00748   Gtk::VBox *vboxHelpChild;
00749   Gtk::Table *tableHelp, *tableNew;
00750 
00751 #ifdef DEBUG
00752   printf("All has changed.\n");
00753 #endif
00754   vboxHelpChild = vboxChildStockMarket[0];
00755   int sum = 0;
00756   for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00757     StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00758     sum += stockMarket->getNumberOfStockContainer();
00759   }
00760   if (sum > 0) {
00761     tableNew = manage(new Gtk::Table(sum, 13, false));
00762   } else {
00763     tableNew = manage(new Gtk::Table(1, 13, false));
00764   }
00765   tableNew->set_spacings(10);
00766   vboxHelpChild->pack_start(*tableNew, Gtk::PACK_SHRINK, 0);
00767   // creating vector tableStockMarketNew
00768   tableHelp = tableStockMarket[0];
00769   delete tableHelp;
00770   tableStockMarket[0] = tableNew;
00771   this->fillTable(0);
00772 }

Generated on Tue May 27 21:24:02 2003 for gstockcalc by doxygen1.3-rc3