home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / DEV.Z / calcdial.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-16  |  3.4 KB  |  150 lines

  1. // calcdial.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "MyCalc.h"
  6. #include "calcdial.h"
  7. #include "integrate.h"
  8.  
  9. #define NO FALSE
  10. #define YES TRUE
  11.  
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char BASED_CODE THIS_FILE[] = __FILE__;
  15. #endif
  16.  
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CCalcDialog dialog
  19.  
  20.  
  21. CCalcDialog::CCalcDialog(CWnd* pParent /*=NULL*/)
  22.     : CDialog(CCalcDialog::IDD, pParent)
  23. {
  24.     //{{AFX_DATA_INIT(CCalcDialog)
  25.     m_Display = _T("");
  26.     //}}AFX_DATA_INIT
  27.     
  28.     m_enteredValue = 0.0;
  29.     m_wasValueEntered = NO;
  30.     m_decimalEntered = NO;
  31.     m_lastKeyWasOperator = NO;
  32.  
  33.     calcObj = createCalcObject();
  34. }
  35.  
  36. CCalcDialog::~CCalcDialog()
  37. {
  38.     destroyCalcObject(calcObj);    
  39. }
  40.  
  41.  
  42. void CCalcDialog::DoDataExchange(CDataExchange* pDX)
  43. {
  44.     CDialog::DoDataExchange(pDX);
  45.     //{{AFX_DATA_MAP(CCalcDialog)
  46.     DDX_Text(pDX, IDC_Display, m_Display);
  47.     //}}AFX_DATA_MAP
  48. }
  49.  
  50.  
  51. BEGIN_MESSAGE_MAP(CCalcDialog, CDialog)
  52.     //{{AFX_MSG_MAP(CCalcDialog)
  53.     ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnDigit)
  54.     ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON11, IDC_BUTTON14, OnFunction)
  55.     ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON16, IDC_BUTTON17, OnClear)
  56.     ON_BN_CLICKED(IDC_BUTTON18, OnEquals)
  57.     ON_BN_CLICKED(IDC_BUTTON19, OnDecimal)
  58.     ON_BN_CLICKED(IDC_BUTTON20, OnChangeSign)
  59.     //}}AFX_MSG_MAP
  60. END_MESSAGE_MAP()
  61.  
  62.  
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CCalcDialog message handlers
  65.  
  66. void CCalcDialog::OnDigit(UINT nID) 
  67. {
  68.     int tag = nID - IDC_BUTTON1 + 1;
  69.  
  70.     if (tag == 10) tag = 0;
  71.     if(m_decimalEntered){
  72.         m_fractionMultiplier /= 10.0;
  73.         m_enteredValue += tag * m_fractionMultiplier;
  74.     } else
  75.         m_enteredValue = m_enteredValue * 10 + tag;
  76.     CCalcDialog::DisplayValue(m_enteredValue);
  77.     m_wasValueEntered = YES;
  78.     m_lastKeyWasOperator = NO;    
  79. }
  80.  
  81. void CCalcDialog::OnFunction(UINT nID) 
  82. {
  83.     double operand;
  84.     int tag = nID - IDC_BUTTON11 + 10;    // +10 puts it into the right range
  85.     
  86.     if(m_lastKeyWasOperator)
  87.         changePendingOperation(calcObj, tag);
  88.     else {
  89.         operand = m_wasValueEntered ? m_enteredValue : m_result;
  90.         m_result = setOperationForValue(calcObj, tag, operand);
  91.         CCalcDialog::DisplayValue(m_result);
  92.         
  93.         m_enteredValue = 0.0;
  94.         m_wasValueEntered = NO;
  95.         m_decimalEntered = NO;
  96.     }
  97.     m_lastKeyWasOperator = YES;    
  98. }
  99.  
  100. void CCalcDialog::OnClear(UINT nID) 
  101. {
  102.     m_enteredValue = 0.0;
  103.     m_result = 0.0;
  104.     m_wasValueEntered = NO;
  105.     if(nID == IDC_BUTTON16)    // BUTTON_16 is CLEAR ALL
  106.         clearAll(calcObj);
  107.     m_decimalEntered = NO;
  108.  
  109.     CCalcDialog::DisplayValue(m_enteredValue);                   
  110.     m_lastKeyWasOperator = NO;
  111. }
  112.  
  113. void CCalcDialog::OnEquals() 
  114. {
  115.     m_result = performOperationWith(calcObj, m_enteredValue);
  116.     CCalcDialog::DisplayValue(m_result);
  117.  
  118.     m_enteredValue = 0.0;
  119.     m_wasValueEntered = NO;
  120.     m_decimalEntered = NO;
  121.     m_lastKeyWasOperator = NO;
  122. }
  123.  
  124. void CCalcDialog::OnChangeSign() 
  125. {
  126.     m_enteredValue = m_wasValueEntered ? -m_enteredValue : -m_result;
  127.     CCalcDialog::DisplayValue(m_enteredValue);
  128.     m_wasValueEntered = YES;
  129.     m_lastKeyWasOperator = NO;
  130. }
  131.  
  132. void CCalcDialog::OnDecimal() 
  133. {
  134.     if(!m_decimalEntered){
  135.         m_fractionMultiplier = 1.0;
  136.         m_decimalEntered = YES;
  137.     }
  138.     m_wasValueEntered = YES;
  139.     m_lastKeyWasOperator = NO;
  140. }
  141.  
  142. void CCalcDialog::DisplayValue(double value)
  143. {
  144.     char buf[256];
  145.  
  146.     sprintf(buf, "%15.10g", value);
  147.     m_Display = buf;
  148.     CCalcDialog::UpdateData(FALSE);
  149. }
  150.