#include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(Application &mainApp) : Window(mainApp), mCurrentRow(0) { initHandlers(); createControls(); initControls(); } MainWindow::~MainWindow() { } void MainWindow::initHandlers(void) { mCancelHandler.setCallback(this,&cancelHandler); mCalcHandler.setCallback(this,&calcHandler); mAddHandler.setCallback(this,&addHandler); mDelHandler.setCallback(this,&delHandler); mSetHandler.setCallback(this,&setHandler); mSaveHandler.setCallback(this,&saveHandler); mLoadHandler.setCallback(this,&loadHandler); mSelectRowHandler.setCallback(this,&selectRowHandler); mSaveFileSelectHandler.setCallback(this,&saveFileSelectHandler); mLoadFileSelectHandler.setCallback(this,&loadFileSelectHandler); } void MainWindow::createControls(void) { create(); size(InitialWidth,InitialHeight); setCaption("Portfolio v1.0.0"); position(CenterPosition); show(); mPixmap.create(*this,220,120); mPixmap.clear(); mLabelBond.create("Bond:"); mLabelCoupon.create("Coupon:"); mLabelYTM.create("YTM:");; mLabelPar.create("Par:"); mLabelPrice.create("Price:"); mLabelYield.create("Yield:"); mLabelYieldValue.create(); mEntryBond.create(); mEntryCoupon.create(); mEntryYTM.create(); mEntryPar.create(); mEntryPrice.create(); mCancelButton.setHandler(&mCancelHandler); mCancelButton.create("Quit"); mCalcButton.setHandler(&mCalcHandler); mCalcButton.create("Yield"); mAddButton.setHandler(&mAddHandler); mAddButton.create("Add"); mDelButton.setHandler(&mDelHandler); mDelButton.create("Remove"); mSaveButton.setHandler(&mSaveHandler); mSaveButton.create("Save"); mLoadButton.setHandler(&mLoadHandler); mLoadButton.create("Load"); mSetButton.setHandler(&mSetHandler); mSetButton.create("Set"); mStatusBar.create(); Block strColTitles; strColTitles.insert(String("Bond")); strColTitles.insert(String("CPN")); strColTitles.insert(String("YTM")); strColTitles.insert(String("Par")); strColTitles.insert(String("Price")); mPortfolioList.create(strColTitles); mPortfolioList.setSelectRowHandler(&mSelectRowHandler); mPortfolioList.setColumnWidth(0,50); mPortfolioList.setColumnWidth(1,50); mPortfolioList.setColumnWidth(2,50); mPortfolioList.setColumnWidth(3,100); mPortfolioList.setColumnWidth(4,100); mWinGrid.create(14,6); mWinGrid.setColSpacing(52); mWinGrid.setRowSpacing(3); mWinGrid.attach(mCancelButton,4,6,0,1); mWinGrid.attach(mCalcButton,4,6,1,2); mWinGrid.attach(mAddButton,4,6,7,8); mWinGrid.attach(mDelButton,4,6,8,9); mWinGrid.attach(mSetButton,4,6,9,10); mWinGrid.attach(mSaveButton,4,6,2,3); mWinGrid.attach(mLoadButton,4,6,3,4); mWinGrid.attach(mStatusBar,0,6,13,14); mWinGrid.attach(mPortfolioList,0,5,0,6); mWinGrid.attach(mLabelBond,3,4,6,7); mWinGrid.attach(mLabelCoupon,3,4,7,8); mWinGrid.attach(mLabelYTM,3,4,8,9); mWinGrid.attach(mLabelPar,3,4,9,10); mWinGrid.attach(mLabelPrice,3,4,10,11); mWinGrid.attach(mLabelYield,3,4,11,12); mWinGrid.attach(mLabelYieldValue,4,5,11,12); mWinGrid.attach(mEntryBond,4,5,6,7); mWinGrid.attach(mEntryCoupon,4,5,7,8); mWinGrid.attach(mEntryYTM,4,5,8,9); mWinGrid.attach(mEntryPar,4,5,9,10); mWinGrid.attach(mEntryPrice,4,5,10,11); mWinGrid.attach(mPixmap,0,4,6,11); *this+=mWinGrid; mWinGrid.show(); mPixmap.show(); mCancelButton.show(); mCalcButton.show(); mAddButton.show(); mDelButton.show(); mSaveButton.show(); mLoadButton.show(); mSetButton.show(); mStatusBar.show(); mPortfolioList.show(); mLabelBond.show(); mLabelCoupon.show(); mLabelYTM.show(); mLabelPar.show(); mLabelPrice.show(); mLabelYield.show(); mLabelYieldValue.show(); mEntryBond.show(); mEntryCoupon.show(); mEntryYTM.show(); mEntryPar.show(); mEntryPrice.show(); } void MainWindow::initControls(void) { mStatusBar.setText("Ready."); } // callbacks int MainWindow::cancelHandler(CallbackData &someCallbackData) { CallbackData cbData(someCallbackData); quit(); return 0; } int MainWindow::calcHandler(CallbackData &someCallbackData) { calcYield(); return 0; } void MainWindow::calcYield(void) { Portfolio portfolio; String strYield; getPortfolio(portfolio); if(!portfolio.size())return; Rate yield(portfolio.yield()); ::sprintf(strYield,"%5.3lf",yield.decimalRate()*100.00); mLabelYieldValue.setLabel(strYield); } int MainWindow::addHandler(CallbackData &someCallbackData) { String strEntry; String strFormat; int row; mPortfolioList.addRow(); row=mPortfolioList.getRowCount(); mEntryBond.getText(strEntry); mPortfolioList.setCellData(row-1,0,strEntry); mEntryCoupon.getText(strEntry); ::sprintf(strFormat,"%5.3lf",::atof(strEntry)); mPortfolioList.setCellData(row-1,1,strFormat); mEntryYTM.getText(strEntry); ::sprintf(strFormat,"%d",::atoi(strEntry)); mPortfolioList.setCellData(row-1,2,strFormat); mEntryPar.getText(strEntry); mPortfolioList.setCellData(row-1,3,(String)Money(::atof(strEntry))); mEntryPrice.getText(strEntry); mPortfolioList.setCellData(row-1,4,(String)Money(::atof(strEntry))); calcYield(); graphCashflows(); return 0; } int MainWindow::delHandler(CallbackData &someCallbackData) { if(!mPortfolioList.getRowCount())return 0; mPortfolioList.removeRow(currentRow()); calcYield(); graphCashflows(); return 0; } int MainWindow::saveHandler(CallbackData &someCallbackData) { if(!mOpenDialog.create("Save Portfolio"))return 0; mOpenDialog.setSelectHandler(&mSaveFileSelectHandler); } int MainWindow::loadHandler(CallbackData &someCallbackData) { if(!mOpenDialog.create("Load Portfolio"))return 0; mOpenDialog.setSelectHandler(&mLoadFileSelectHandler); } int MainWindow::setHandler(CallbackData &someCallbackData) { String strEntry; String strFormat; if(!mPortfolioList.getRowCount())return 0; mEntryBond.getText(strEntry); mPortfolioList.setCellData(currentRow(),0,strEntry); mEntryCoupon.getText(strEntry); ::sprintf(strFormat,"%5.3lf",::atof(strEntry)); mPortfolioList.setCellData(currentRow(),1,strFormat); mEntryYTM.getText(strEntry); ::sprintf(strFormat,"%d",::atoi(strEntry)); mPortfolioList.setCellData(currentRow(),2,strFormat); mEntryPar.getText(strEntry); mPortfolioList.setCellData(currentRow(),3,(String)Money(::atof(strEntry))); mEntryPrice.getText(strEntry); mPortfolioList.setCellData(currentRow(),4,(String)Money(::atof(strEntry))); calcYield(); graphCashflows(); return 0; } int MainWindow::saveFileSelectHandler(CallbackData &someCallbackData) { String strPathFileName(*(String*)someCallbackData.data()); Block listLines; File saveFile; if(strPathFileName.isNull())return 0; if(!getLines(listLines))return 0; saveFile.open(strPathFileName,"wb"); for(int index=0;index strLines; String strLine; File inFile; char *ptrLine; int rows; inFile.open(strPathFileName,"rb"); if(!inFile.isOkay())return 0; mPortfolioList.clear(); while(!inFile.eof()) { inFile.getLine(strLine); if(strLine.isNull())continue; mPortfolioList.addRow(); rows=mPortfolioList.getRowCount(); ptrLine=(char*)strLine; ptrLine=::strtok(ptrLine,","); if(!ptrLine)continue; mPortfolioList.setCellData(rows-1,0,ptrLine); ptrLine=::strtok(0,","); if(!ptrLine)continue; mPortfolioList.setCellData(rows-1,1,ptrLine); ptrLine=::strtok(0,","); if(!ptrLine)continue; mPortfolioList.setCellData(rows-1,2,ptrLine); ptrLine=::strtok(0,","); if(!ptrLine)continue; mPortfolioList.setCellData(rows-1,3,(String)Money(::atof(ptrLine))); ptrLine=::strtok(0,",\0"); if(!ptrLine)continue; mPortfolioList.setCellData(rows-1,4,(String)Money(::atof(ptrLine))); } calcYield(); graphCashflows(); return 0; } void MainWindow::graphCashflows(void) { GlobalData cashflows; GlobalData srcPairs; GlobalData dstPairs; CatmullRom splineGen; Portfolio portfolio; double maxFlow; double clampFactor; int recLen; mPixmap.clear(); getPortfolio(portfolio); portfolio.getCashflows(cashflows); recLen=mPixmap.width()/cashflows.size(); if(!cashflows.size())return; for(int index=0;indexmaxFlow)maxFlow=cashflows[index]; } clampFactor=(float)mPixmap.height()/(float)maxFlow; for(int index=0;index cashflows; GlobalData srcPairs; GlobalData dstPairs; CatmullRom splineGen; Portfolio portfolio; double maxFlow; double clampFactor; mPixmap.clear(); getPortfolio(portfolio); portfolio.getCashflows(cashflows); if(!cashflows.size())return; for(int index=0;indexmaxFlow)maxFlow=cashflows[index]; } clampFactor=(float)mPixmap.height()/(float)maxFlow; for(int index=0;index &listLines) { String strEntry; String strLine; int rows; listLines.remove(); rows=mPortfolioList.getRowCount(); for(int row=0;row