00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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
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
00095 XMLFileParser *parser = new XMLFileParser();
00096 parser->parsingTheXmlFile(stockmarketVectorFilename, stockMarketVector);
00097 }
00098
00099 for (int i = 0; i < stockMarketVector->getNumberOfStockMarkets(); i++) {
00100 StockMarket *stockMarket = stockMarketVector->getStockMarket(i);
00101 stockMarket->attach(this);
00102 }
00103
00104
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
00116 XMLFileParser *parser = new XMLFileParser();
00117 parser->parsingTheXmlFile(preferencesFilename, preferences);
00118 }
00119
00120
00121 stockMarketVector->attach(this);
00122 this->update(stockMarketVector);
00123
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
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
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
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
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
00195 vbox->pack_start(m_MenuBar, Gtk::PACK_SHRINK, 0);
00196 }
00197
00201 void GStockCalc::fillPopUpMenu() {
00202
00203 Gtk::Image *imageShowSummary;
00204
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
00227
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;
00290 file = fopen(stockmarketVectorFilename, "w");
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
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);
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;
00347 file = fopen(preferencesFilename, "w");
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);
00357 }
00358
00359
00364 int GStockCalc::createFile(char *filename) {
00365
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;
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
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
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
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
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;
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
00647
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
00658 vboxParentStockMarket[0] = vboxHelpParent;
00659 vboxHelpChild = manage(new Gtk::VBox(false, 0));
00660
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
00671 tableStockMarket[0] = table;
00672
00673
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
00683 vboxParentStockMarket[i+1] = vboxHelpParent;
00684 vboxHelpChild = manage(new Gtk::VBox(false, 0));
00685
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
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
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
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
00734 tableHelp = tableStockMarket[stockMarketNumber+1];
00735 delete tableHelp;
00736 tableStockMarket[stockMarketNumber+1] = tableNew;
00737 fillTable(stockMarketNumber+1);
00738 }
00739
00743 void GStockCalc::updateStockMarketAllNotebookPage() {
00744
00745
00746
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
00768 tableHelp = tableStockMarket[0];
00769 delete tableHelp;
00770 tableStockMarket[0] = tableNew;
00771 this->fillTable(0);
00772 }