Modify the declaration of some properties of StandardCalculatorViewModel to make them read-only and use macros (#799)
This commit is contained in:
		@@ -78,7 +78,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
 | 
				
			|||||||
    , m_IsShiftProgrammerChecked(false)
 | 
					    , m_IsShiftProgrammerChecked(false)
 | 
				
			||||||
    , m_valueBitLength(BitLength::BitLengthQWord)
 | 
					    , m_valueBitLength(BitLength::BitLengthQWord)
 | 
				
			||||||
    , m_isBitFlipChecked(false)
 | 
					    , m_isBitFlipChecked(false)
 | 
				
			||||||
    , m_isBinaryBitFlippingEnabled(false)
 | 
					    , m_IsBinaryBitFlippingEnabled(false)
 | 
				
			||||||
    , m_CurrentRadixType(NumberBase::DecBase)
 | 
					    , m_CurrentRadixType(NumberBase::DecBase)
 | 
				
			||||||
    , m_CurrentAngleType(NumbersAndOperatorsEnum::Degree)
 | 
					    , m_CurrentAngleType(NumbersAndOperatorsEnum::Degree)
 | 
				
			||||||
    , m_Announcement(nullptr)
 | 
					    , m_Announcement(nullptr)
 | 
				
			||||||
@@ -93,6 +93,8 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
 | 
				
			|||||||
    , m_localizedMemoryCleared(nullptr)
 | 
					    , m_localizedMemoryCleared(nullptr)
 | 
				
			||||||
    , m_localizedOpenParenthesisCountChangedAutomationFormat(nullptr)
 | 
					    , m_localizedOpenParenthesisCountChangedAutomationFormat(nullptr)
 | 
				
			||||||
    , m_localizedNoRightParenthesisAddedFormat(nullptr)
 | 
					    , m_localizedNoRightParenthesisAddedFormat(nullptr)
 | 
				
			||||||
 | 
					    , m_TokenPosition(-1)
 | 
				
			||||||
 | 
					    , m_isLastOperationHistoryLoad(false)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    WeakReference calculatorViewModel(this);
 | 
					    WeakReference calculatorViewModel(this);
 | 
				
			||||||
    auto appResourceProvider = AppResourceProvider::GetInstance();
 | 
					    auto appResourceProvider = AppResourceProvider::GetInstance();
 | 
				
			||||||
@@ -130,9 +132,6 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
 | 
				
			|||||||
    IsDecimalEnabled = true;
 | 
					    IsDecimalEnabled = true;
 | 
				
			||||||
    AreHistoryShortcutsEnabled = true;
 | 
					    AreHistoryShortcutsEnabled = true;
 | 
				
			||||||
    AreProgrammerRadixOperatorsEnabled = false;
 | 
					    AreProgrammerRadixOperatorsEnabled = false;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    m_tokenPosition = -1;
 | 
					 | 
				
			||||||
    m_isLastOperationHistoryLoad = false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue, _In_ bool isError)
 | 
					String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue, _In_ bool isError)
 | 
				
			||||||
@@ -455,7 +454,7 @@ void StandardCalculatorViewModel::FtoEButtonToggled()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
 | 
					void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DisplayExpressionToken ^ displayExpressionToken = ExpressionTokens->GetAt(m_tokenPosition);
 | 
					    DisplayExpressionToken ^ displayExpressionToken = ExpressionTokens->GetAt(m_TokenPosition);
 | 
				
			||||||
    if (displayExpressionToken == nullptr)
 | 
					    if (displayExpressionToken == nullptr)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -583,7 +582,7 @@ void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    String ^ updatedData = ref new String(temp);
 | 
					    String ^ updatedData = ref new String(temp);
 | 
				
			||||||
    UpdateOperand(m_tokenPosition, updatedData);
 | 
					    UpdateOperand(m_TokenPosition, updatedData);
 | 
				
			||||||
    displayExpressionToken->Token = updatedData;
 | 
					    displayExpressionToken->Token = updatedData;
 | 
				
			||||||
    IsOperandUpdatedUsingViewModel = true;
 | 
					    IsOperandUpdatedUsingViewModel = true;
 | 
				
			||||||
    displayExpressionToken->CommandIndex = commandIndex;
 | 
					    displayExpressionToken->CommandIndex = commandIndex;
 | 
				
			||||||
@@ -622,7 +621,7 @@ void StandardCalculatorViewModel::OnButtonPressed(Object ^ parameter)
 | 
				
			|||||||
        && numOpEnum != NumbersAndOperatorsEnum::IsProgrammerMode && numOpEnum != NumbersAndOperatorsEnum::FToE
 | 
					        && numOpEnum != NumbersAndOperatorsEnum::IsProgrammerMode && numOpEnum != NumbersAndOperatorsEnum::FToE
 | 
				
			||||||
        && (numOpEnum != NumbersAndOperatorsEnum::Degree) && (numOpEnum != NumbersAndOperatorsEnum::Radians) && (numOpEnum != NumbersAndOperatorsEnum::Grads))
 | 
					        && (numOpEnum != NumbersAndOperatorsEnum::Degree) && (numOpEnum != NumbersAndOperatorsEnum::Radians) && (numOpEnum != NumbersAndOperatorsEnum::Grads))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (!m_keyPressed)
 | 
					        if (!m_KeyPressed)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            SaveEditedCommand(m_selectedExpressionToken->TokenPosition, cmdenum);
 | 
					            SaveEditedCommand(m_selectedExpressionToken->TokenPosition, cmdenum);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -765,9 +764,10 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString)
 | 
				
			|||||||
    while (it != pastedString->End())
 | 
					    while (it != pastedString->End())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        bool sendCommand = true;
 | 
					        bool sendCommand = true;
 | 
				
			||||||
        bool canSendNegate = false;
 | 
					        auto buttonInfo = MapCharacterToButtonId(*it);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NumbersAndOperatorsEnum mappedNumOp = MapCharacterToButtonId(*it, canSendNegate);
 | 
					        NumbersAndOperatorsEnum mappedNumOp = buttonInfo.buttonId;
 | 
				
			||||||
 | 
					        bool canSendNegate = buttonInfo.canSendNegate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (mappedNumOp == NumbersAndOperatorsEnum::None)
 | 
					        if (mappedNumOp == NumbersAndOperatorsEnum::None)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -869,7 +869,7 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString)
 | 
				
			|||||||
        if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
 | 
					        if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Check the following item
 | 
					            // Check the following item
 | 
				
			||||||
            switch (MapCharacterToButtonId(*(it + 1), canSendNegate))
 | 
					            switch (MapCharacterToButtonId(*(it + 1)).buttonId)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
            case NumbersAndOperatorsEnum::Subtract:
 | 
					            case NumbersAndOperatorsEnum::Subtract:
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -919,10 +919,11 @@ void StandardCalculatorViewModel::SetViewPinnedState(bool pinned)
 | 
				
			|||||||
    IsCurrentViewPinned = pinned;
 | 
					    IsCurrentViewPinned = pinned;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NumbersAndOperatorsEnum StandardCalculatorViewModel::MapCharacterToButtonId(const wchar_t ch, bool& canSendNegate)
 | 
					ButtonInfo StandardCalculatorViewModel::MapCharacterToButtonId(char16 ch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    NumbersAndOperatorsEnum mappedValue = NumbersAndOperatorsEnum::None;
 | 
					    ButtonInfo result;
 | 
				
			||||||
    canSendNegate = false;
 | 
					    result.buttonId = NumbersAndOperatorsEnum::None;
 | 
				
			||||||
 | 
					    result.canSendNegate = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (ch)
 | 
					    switch (ch)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -936,112 +937,111 @@ NumbersAndOperatorsEnum StandardCalculatorViewModel::MapCharacterToButtonId(cons
 | 
				
			|||||||
    case '7':
 | 
					    case '7':
 | 
				
			||||||
    case '8':
 | 
					    case '8':
 | 
				
			||||||
    case '9':
 | 
					    case '9':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - L'0');
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - L'0');
 | 
				
			||||||
        canSendNegate = true;
 | 
					        result.canSendNegate = true;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '*':
 | 
					    case '*':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Multiply;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Multiply;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '+':
 | 
					    case '+':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Add;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Add;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '-':
 | 
					    case '-':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Subtract;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Subtract;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '/':
 | 
					    case '/':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Divide;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Divide;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '^':
 | 
					    case '^':
 | 
				
			||||||
        if (IsScientific)
 | 
					        if (IsScientific)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue = NumbersAndOperatorsEnum::XPowerY;
 | 
					            result.buttonId = NumbersAndOperatorsEnum::XPowerY;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '%':
 | 
					    case '%':
 | 
				
			||||||
        if (IsScientific || IsProgrammer)
 | 
					        if (IsScientific || IsProgrammer)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue = NumbersAndOperatorsEnum::Mod;
 | 
					            result.buttonId = NumbersAndOperatorsEnum::Mod;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '=':
 | 
					    case '=':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::Equals;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::Equals;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case '(':
 | 
					    case '(':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::OpenParenthesis;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::OpenParenthesis;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case ')':
 | 
					    case ')':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::CloseParenthesis;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::CloseParenthesis;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 'a':
 | 
					    case 'a':
 | 
				
			||||||
    case 'A':
 | 
					    case 'A':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::A;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::A;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 'b':
 | 
					    case 'b':
 | 
				
			||||||
    case 'B':
 | 
					    case 'B':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::B;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::B;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 'c':
 | 
					    case 'c':
 | 
				
			||||||
    case 'C':
 | 
					    case 'C':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::C;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::C;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 'd':
 | 
					    case 'd':
 | 
				
			||||||
    case 'D':
 | 
					    case 'D':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::D;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::D;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 'e':
 | 
					    case 'e':
 | 
				
			||||||
    case 'E':
 | 
					    case 'E':
 | 
				
			||||||
        // Only allow scientific notation in scientific mode
 | 
					        // Only allow scientific notation in scientific mode
 | 
				
			||||||
        if (IsProgrammer)
 | 
					        if (IsProgrammer)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue = NumbersAndOperatorsEnum::E;
 | 
					            result.buttonId = NumbersAndOperatorsEnum::E;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue = NumbersAndOperatorsEnum::Exp;
 | 
					            result.buttonId = NumbersAndOperatorsEnum::Exp;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 'f':
 | 
					    case 'f':
 | 
				
			||||||
    case 'F':
 | 
					    case 'F':
 | 
				
			||||||
        mappedValue = NumbersAndOperatorsEnum::F;
 | 
					        result.buttonId = NumbersAndOperatorsEnum::F;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        // For the decimalSeparator, we need to respect the user setting.
 | 
					        // For the decimalSeparator, we need to respect the user setting.
 | 
				
			||||||
        if (ch == m_decimalSeparator)
 | 
					        if (ch == m_decimalSeparator)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue = NumbersAndOperatorsEnum::Decimal;
 | 
					            result.buttonId = NumbersAndOperatorsEnum::Decimal;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mappedValue == NumbersAndOperatorsEnum::None)
 | 
					    if (result.buttonId == NumbersAndOperatorsEnum::None)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch))
 | 
					        if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            mappedValue =
 | 
					            result.buttonId = NumbersAndOperatorsEnum::Zero
 | 
				
			||||||
                NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit('0'));
 | 
					                              + static_cast<NumbersAndOperatorsEnum>(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit('0'));
 | 
				
			||||||
            canSendNegate = true;
 | 
					            result.canSendNegate = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Negate cannot be sent for leading zeroes
 | 
					    // Negate cannot be sent for leading zeroes
 | 
				
			||||||
    if (NumbersAndOperatorsEnum::Zero == mappedValue)
 | 
					    if (NumbersAndOperatorsEnum::Zero == result.buttonId)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        canSendNegate = false;
 | 
					        result.canSendNegate = false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return mappedValue;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
void StandardCalculatorViewModel::OnInputChanged()
 | 
					void StandardCalculatorViewModel::OnInputChanged()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IsInputEmpty = m_standardCalculatorManager.IsInputEmpty();
 | 
					    IsInputEmpty = m_standardCalculatorManager.IsInputEmpty();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ namespace CalculatorFunctionalTests
 | 
				
			|||||||
namespace CalculatorUnitTests
 | 
					namespace CalculatorUnitTests
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    class MultiWindowUnitTests;
 | 
					    class MultiWindowUnitTests;
 | 
				
			||||||
    class TimerTests;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace CalculatorApp
 | 
					namespace CalculatorApp
 | 
				
			||||||
@@ -31,8 +30,13 @@ namespace CalculatorApp
 | 
				
			|||||||
    namespace ViewModel
 | 
					    namespace ViewModel
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#define ASCII_0 48
 | 
					#define ASCII_0 48
 | 
				
			||||||
    public
 | 
					        public delegate void HideMemoryClickedHandler();
 | 
				
			||||||
        delegate void HideMemoryClickedHandler();
 | 
					
 | 
				
			||||||
 | 
					        public value struct ButtonInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NumbersAndOperatorsEnum buttonId;
 | 
				
			||||||
 | 
					            bool canSendNegate;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Windows::UI::Xaml::Data::Bindable] public ref class StandardCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
 | 
					        [Windows::UI::Xaml::Data::Bindable] public ref class StandardCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -43,40 +47,47 @@ namespace CalculatorApp
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
 | 
					            OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayValue);
 | 
					            OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayValue);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(HistoryViewModel ^, HistoryVM);
 | 
					            OBSERVABLE_PROPERTY_R(HistoryViewModel ^, HistoryVM);
 | 
				
			||||||
            OBSERVABLE_NAMED_PROPERTY_RW(bool, IsInError);
 | 
					            OBSERVABLE_PROPERTY_RW(bool, IsAlwaysOnTop);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsOperatorCommand);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsBinaryBitFlippingEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayStringExpression);
 | 
					            PROPERTY_R(bool, IsOperandUpdatedUsingViewModel);
 | 
				
			||||||
 | 
					            PROPERTY_R(int, TokenPosition);
 | 
				
			||||||
 | 
					            PROPERTY_R(bool, IsOperandTextCompletelySelected);
 | 
				
			||||||
 | 
					            PROPERTY_R(bool, KeyPressed);
 | 
				
			||||||
 | 
					            PROPERTY_R(Platform::String ^, SelectedExpressionLastData);
 | 
				
			||||||
 | 
					            OBSERVABLE_NAMED_PROPERTY_R(bool, IsInError);
 | 
				
			||||||
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsOperatorCommand);
 | 
				
			||||||
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, DisplayStringExpression);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector<Common::DisplayExpressionToken ^> ^, ExpressionTokens);
 | 
					            OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector<Common::DisplayExpressionToken ^> ^, ExpressionTokens);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, DecimalDisplayValue);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, DecimalDisplayValue);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, HexDisplayValue);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, HexDisplayValue);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, OctalDisplayValue);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, OctalDisplayValue);
 | 
				
			||||||
            OBSERVABLE_NAMED_PROPERTY_RW(Platform::String ^, BinaryDisplayValue);
 | 
					            OBSERVABLE_NAMED_PROPERTY_R(Platform::String ^, BinaryDisplayValue);
 | 
				
			||||||
            OBSERVABLE_NAMED_PROPERTY_R(Windows::Foundation::Collections::IVector<bool> ^, BinaryDigits);
 | 
					            OBSERVABLE_NAMED_PROPERTY_R(Windows::Foundation::Collections::IVector<bool> ^, BinaryDigits);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, HexDisplayValue_AutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, HexDisplayValue_AutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, DecDisplayValue_AutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, DecDisplayValue_AutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, OctDisplayValue_AutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, OctDisplayValue_AutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, BinDisplayValue_AutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, BinDisplayValue_AutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsBinaryOperatorEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsBinaryOperatorEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsUnaryOperatorEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsUnaryOperatorEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsNegateEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsNegateEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsDecimalEnabled);
 | 
					            OBSERVABLE_PROPERTY_RW(bool, IsDecimalEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsCurrentViewPinned);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsCurrentViewPinned);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IVector<MemoryItemViewModel ^> ^, MemorizedNumbers);
 | 
					            OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IVector<MemoryItemViewModel ^> ^, MemorizedNumbers);
 | 
				
			||||||
            OBSERVABLE_NAMED_PROPERTY_RW(bool, IsMemoryEmpty);
 | 
					            OBSERVABLE_NAMED_PROPERTY_RW(bool, IsMemoryEmpty);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsFToEChecked);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsFToEChecked);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_R(bool, IsFToEEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsFToEEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, AreHEXButtonsEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, AreHEXButtonsEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, CalculationResultAutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, CalculationResultAutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(Platform::String ^, CalculationExpressionAutomationName);
 | 
					            OBSERVABLE_PROPERTY_R(Platform::String ^, CalculationExpressionAutomationName);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsShiftProgrammerChecked);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsShiftProgrammerChecked);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(CalculatorApp::Common::NumberBase, CurrentRadixType);
 | 
					            OBSERVABLE_PROPERTY_R(CalculatorApp::Common::NumberBase, CurrentRadixType);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, AreTokensUpdated);
 | 
					            OBSERVABLE_PROPERTY_R(bool, AreTokensUpdated);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, AreAlwaysOnTopResultsUpdated);
 | 
					            OBSERVABLE_PROPERTY_R(bool, AreAlwaysOnTopResultsUpdated);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, AreHistoryShortcutsEnabled);
 | 
					            OBSERVABLE_PROPERTY_RW(bool, AreHistoryShortcutsEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, AreProgrammerRadixOperatorsEnabled);
 | 
					            OBSERVABLE_PROPERTY_R(bool, AreProgrammerRadixOperatorsEnabled);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(bool, IsInputEmpty);
 | 
					            OBSERVABLE_PROPERTY_R(bool, IsInputEmpty);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_RW(CalculatorApp::Common::Automation::NarratorAnnouncement ^, Announcement);
 | 
					            OBSERVABLE_PROPERTY_R(CalculatorApp::Common::Automation::NarratorAnnouncement ^, Announcement);
 | 
				
			||||||
            OBSERVABLE_PROPERTY_R(unsigned int, OpenParenthesisCount);
 | 
					            OBSERVABLE_PROPERTY_R(unsigned int, OpenParenthesisCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            COMMAND_FOR_METHOD(CopyCommand, StandardCalculatorViewModel::OnCopyCommand);
 | 
					            COMMAND_FOR_METHOD(CopyCommand, StandardCalculatorViewModel::OnCopyCommand);
 | 
				
			||||||
@@ -109,22 +120,6 @@ namespace CalculatorApp
 | 
				
			|||||||
            static property Platform::String
 | 
					            static property Platform::String
 | 
				
			||||||
                ^ IsBitFlipCheckedPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsBitFlipChecked"); } }
 | 
					                ^ IsBitFlipCheckedPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsBitFlipChecked"); } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            property bool IsBinaryBitFlippingEnabled
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_isBinaryBitFlippingEnabled;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(bool value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    if (m_isBinaryBitFlippingEnabled != value)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        m_isBinaryBitFlippingEnabled = value;
 | 
					 | 
				
			||||||
                        RaisePropertyChanged(L"IsBinaryBitFlippingEnabled");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property CalculatorApp::Common::BitLength ValueBitLength
 | 
					            property CalculatorApp::Common::BitLength ValueBitLength
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                CalculatorApp::Common::BitLength get()
 | 
					                CalculatorApp::Common::BitLength get()
 | 
				
			||||||
@@ -205,22 +200,6 @@ namespace CalculatorApp
 | 
				
			|||||||
            static property Platform::String
 | 
					            static property Platform::String
 | 
				
			||||||
                ^ IsProgrammerPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsProgrammer"); } }
 | 
					                ^ IsProgrammerPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsProgrammer"); } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            property bool IsAlwaysOnTop
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_isAlwaysOnTop;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(bool value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    if (m_isAlwaysOnTop != value)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        m_isAlwaysOnTop = value;
 | 
					 | 
				
			||||||
                        RaisePropertyChanged(L"IsAlwaysOnTop");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property bool IsEditingEnabled
 | 
					            property bool IsEditingEnabled
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                bool get()
 | 
					                bool get()
 | 
				
			||||||
@@ -271,65 +250,12 @@ namespace CalculatorApp
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            property int TokenPosition
 | 
					        internal :
 | 
				
			||||||
            {
 | 
					            void OnPaste(Platform::String ^ pastedString);
 | 
				
			||||||
                int get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_tokenPosition;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(int value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    m_tokenPosition = value;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property Platform::String^ SelectedExpressionLastData
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                Platform::String^ get() { return m_selectedExpressionLastData; }
 | 
					 | 
				
			||||||
                void set(Platform::String^ value) { m_selectedExpressionLastData = value; }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property bool KeyPressed
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_keyPressed;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(bool value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    m_keyPressed = value;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property bool IsOperandUpdatedUsingViewModel
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_operandUpdated;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(bool value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    m_operandUpdated = value;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            property bool IsOperandTextCompletelySelected
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool get()
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return m_completeTextSelection;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                void set(bool value)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    m_completeTextSelection = value;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            internal : void OnPaste(Platform::String ^ pastedString);
 | 
					 | 
				
			||||||
            void OnCopyCommand(Platform::Object ^ parameter);
 | 
					            void OnCopyCommand(Platform::Object ^ parameter);
 | 
				
			||||||
            void OnPasteCommand(Platform::Object ^ parameter);
 | 
					            void OnPasteCommand(Platform::Object ^ parameter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            NumbersAndOperatorsEnum MapCharacterToButtonId(const wchar_t ch, bool& canSendNegate);
 | 
					            ButtonInfo MapCharacterToButtonId(char16 ch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Memory feature related methods. They are internal because they need to called from the MainPage code-behind
 | 
					            // Memory feature related methods. They are internal because they need to called from the MainPage code-behind
 | 
				
			||||||
            void OnMemoryButtonPressed();
 | 
					            void OnMemoryButtonPressed();
 | 
				
			||||||
@@ -413,14 +339,9 @@ namespace CalculatorApp
 | 
				
			|||||||
            bool m_isStandard;
 | 
					            bool m_isStandard;
 | 
				
			||||||
            bool m_isScientific;
 | 
					            bool m_isScientific;
 | 
				
			||||||
            bool m_isProgrammer;
 | 
					            bool m_isProgrammer;
 | 
				
			||||||
            bool m_isAlwaysOnTop;
 | 
					 | 
				
			||||||
            bool m_isBinaryBitFlippingEnabled;
 | 
					 | 
				
			||||||
            bool m_isBitFlipChecked;
 | 
					            bool m_isBitFlipChecked;
 | 
				
			||||||
            bool m_isRtlLanguage;
 | 
					            bool m_isRtlLanguage;
 | 
				
			||||||
            int m_tokenPosition;
 | 
					 | 
				
			||||||
            bool m_keyPressed;
 | 
					 | 
				
			||||||
            bool m_operandUpdated;
 | 
					            bool m_operandUpdated;
 | 
				
			||||||
            bool m_completeTextSelection;
 | 
					 | 
				
			||||||
            bool m_isLastOperationHistoryLoad;
 | 
					            bool m_isLastOperationHistoryLoad;
 | 
				
			||||||
            CalculatorApp::Common::BitLength m_valueBitLength;
 | 
					            CalculatorApp::Common::BitLength m_valueBitLength;
 | 
				
			||||||
            Platform::String ^ m_selectedExpressionLastData;
 | 
					            Platform::String ^ m_selectedExpressionLastData;
 | 
				
			||||||
@@ -463,7 +384,6 @@ namespace CalculatorApp
 | 
				
			|||||||
            friend class CalculatorDisplay;
 | 
					            friend class CalculatorDisplay;
 | 
				
			||||||
            friend class CalculatorFunctionalTests::HistoryTests;
 | 
					            friend class CalculatorFunctionalTests::HistoryTests;
 | 
				
			||||||
            friend class CalculatorUnitTests::MultiWindowUnitTests;
 | 
					            friend class CalculatorUnitTests::MultiWindowUnitTests;
 | 
				
			||||||
            friend class CalculatorUnitTests::TimerTests;
 | 
					 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -373,27 +373,25 @@ namespace CalculatorUnitTests
 | 
				
			|||||||
        /// Low-level test of character mapping
 | 
					        /// Low-level test of character mapping
 | 
				
			||||||
        TEST_METHOD(VerifyCorrectCharacterMapping)
 | 
					        TEST_METHOD(VerifyCorrectCharacterMapping)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            bool canSendNegate = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Valid numbers
 | 
					            // Valid numbers
 | 
				
			||||||
            NumbersAndOperatorsEnum n = m_viewModel->MapCharacterToButtonId(L'0', canSendNegate);
 | 
					            NumbersAndOperatorsEnum n = m_viewModel->MapCharacterToButtonId(L'0').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Zero);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Zero);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            n = m_viewModel->MapCharacterToButtonId(L'1', canSendNegate);
 | 
					            n = m_viewModel->MapCharacterToButtonId(L'1').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::One);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::One);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Valid operators
 | 
					            // Valid operators
 | 
				
			||||||
            n = m_viewModel->MapCharacterToButtonId(L'+', canSendNegate);
 | 
					            n = m_viewModel->MapCharacterToButtonId(L'+').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Add);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Add);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            n = m_viewModel->MapCharacterToButtonId(L'=', canSendNegate);
 | 
					            n = m_viewModel->MapCharacterToButtonId(L'=').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Equals);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Equals);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            n = m_viewModel->MapCharacterToButtonId(L'a', canSendNegate);
 | 
					            n = m_viewModel->MapCharacterToButtonId(L'a').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::A);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::A);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Invalid character
 | 
					            // Invalid character
 | 
				
			||||||
            n = m_viewModel->MapCharacterToButtonId(L'$', canSendNegate);
 | 
					            n = m_viewModel->MapCharacterToButtonId(L'$').buttonId;
 | 
				
			||||||
            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::None);
 | 
					            ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::None);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user