88 lines
3.1 KiB
C++
88 lines
3.1 KiB
C++
#include <common/stdio.hpp>
|
|
#include <cashflow/calcthrd.hpp>
|
|
#include <cashflow/calcdlg.hpp>
|
|
#include <cashflow/cashflow.hpp>
|
|
#include <cashflow/cashdefs.hpp>
|
|
#include <cashflow/ppydlg.hpp>
|
|
#include <cashflow/graphwnd.hpp>
|
|
#include <fpsheet/fpsheet.hpp>
|
|
#include <common/stdio.hpp>
|
|
#include <common/crsctrl.hpp>
|
|
|
|
DWORD CalcThread::threadHandler(ThreadMessage &someThreadMessage)
|
|
{
|
|
switch(someThreadMessage.message())
|
|
{
|
|
case ThreadMessage::TM_CREATE :
|
|
break;
|
|
case ThreadMessage::TM_DESTROY :
|
|
break;
|
|
case ThreadMessage::TM_USER :
|
|
if(someThreadMessage.userDataOne()==CalcStart)
|
|
{
|
|
mCalcMutex.requestMutex();
|
|
performCalc(*(CalcDlg*)someThreadMessage.userDataTwo());
|
|
mCalcMutex.releaseMutex();
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void CalcThread::startCalc(CalcDlg &calcDlg)
|
|
{
|
|
mIsInReset=TRUE;
|
|
mCalcMutex.requestMutex();
|
|
mIsInReset=FALSE;
|
|
ThreadMessage startMessage(ThreadMessage::TM_USER,CalcThread::CalcStart,(DWORD)&calcDlg);
|
|
postMessage(startMessage);
|
|
mCalcMutex.releaseMutex();
|
|
}
|
|
|
|
void CalcThread::performCalc(CalcDlg &calcDlg)
|
|
{
|
|
Block<PureCashFlow> cashFlows;
|
|
PurePassThru passThru;
|
|
CashFlow cashFlow;
|
|
String trmString;
|
|
String prnString;
|
|
String cpnString;
|
|
size_t numFlows;
|
|
|
|
calcDlg.getText(CALC_TERM,trmString);
|
|
calcDlg.getText(CALC_PRINCIPAL,prnString);
|
|
calcDlg.getText(CALC_COUPON,cpnString);
|
|
if(trmString.isNull()||prnString.isNull()||cpnString.isNull()){::MessageBeep(0);return;}
|
|
passThru.issBal(::atof((LPSTR)prnString));
|
|
passThru.wac(::atof((LPSTR)cpnString));
|
|
passThru.coupon(::atof((LPSTR)cpnString));
|
|
passThru.wam(::atol((LPSTR)trmString));
|
|
passThru.origTerm(::atol((LPSTR)trmString));
|
|
passThru.psa(0.00);
|
|
if(calcDlg.mPrePay.amount())cashFlow.generateCashFlows(passThru,cashFlows,calcDlg.mPrePay);
|
|
else cashFlow.generateCashFlows(passThru,cashFlows);
|
|
calcDlg.mlpGraphWindow->showFlows(cashFlows,::atol((LPSTR)trmString));
|
|
numFlows=cashFlows.size();
|
|
calcDlg.mlpCalcSheet->clearData();
|
|
calcDlg.mlpCalcSheet->setCurrentCell(1,1);
|
|
for(short itemIndex=0;itemIndex<numFlows;itemIndex++)
|
|
{
|
|
Block<String> itemStrings;
|
|
if(mIsInReset)break;
|
|
cashFlows[itemIndex].itemStrings(itemStrings);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::IssBal,itemStrings[CalcDlg::IssBal]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::SMM,itemStrings[CalcDlg::SMM]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::MtgPay,itemStrings[CalcDlg::MtgPay]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::NetIntPay,itemStrings[CalcDlg::NetIntPay]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::GrossInt,itemStrings[CalcDlg::GrossInt]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::SchPrn,itemStrings[CalcDlg::SchPrn]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Prepay,itemStrings[CalcDlg::Prepay]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::TotPrin,itemStrings[CalcDlg::TotPrin]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Cashflow,itemStrings[CalcDlg::Cashflow]);
|
|
calcDlg.mlpCalcSheet->setCellData(itemIndex,CalcDlg::Factor,itemStrings[CalcDlg::Factor]);
|
|
}
|
|
::SetFocus(calcDlg.mlpCalcSheet->getHandle());
|
|
return;
|
|
}
|
|
|