Files
Work/cashflow/CALCTHRD.CPP
2024-08-07 09:12:07 -04:00

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;
}