141 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (c) Microsoft Corporation. All rights reserved.
 | 
						|
// Licensed under the MIT License.
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "CalculatorHistory.h"
 | 
						|
#include "Header Files/CalcEngine.h"
 | 
						|
#include "Header Files/Rational.h"
 | 
						|
#include "Header Files/ICalcDisplay.h"
 | 
						|
 | 
						|
namespace CalculationManager
 | 
						|
{
 | 
						|
    enum class Command;
 | 
						|
    struct HISTORYITEM;
 | 
						|
 | 
						|
    enum class CalculatorMode
 | 
						|
    {
 | 
						|
        StandardMode,
 | 
						|
        ScientificMode,
 | 
						|
        ProgrammerMode,
 | 
						|
    };
 | 
						|
 | 
						|
    enum class CalculatorPrecision
 | 
						|
    {
 | 
						|
        StandardModePrecision = 16,
 | 
						|
        ScientificModePrecision = 32,
 | 
						|
        ProgrammerModePrecision = 64
 | 
						|
    };
 | 
						|
 | 
						|
    // Numbering continues from the Enum Command from Command.h
 | 
						|
    // with some gap to ensure there is no overlap of these ids
 | 
						|
    // when static_cast<unsigned char> is performed on these ids
 | 
						|
    // they shouldn't fall in any number range greater than 80. So never
 | 
						|
    // make the memory command ids go below 330
 | 
						|
    enum class MemoryCommand
 | 
						|
    {
 | 
						|
        MemorizeNumber = 330,
 | 
						|
        MemorizedNumberLoad = 331,
 | 
						|
        MemorizedNumberAdd = 332,
 | 
						|
        MemorizedNumberSubtract = 333,
 | 
						|
        MemorizedNumberClearAll = 334,
 | 
						|
        MemorizedNumberClear = 335
 | 
						|
    };
 | 
						|
 | 
						|
    class CalculatorManager final : public ICalcDisplay
 | 
						|
    {
 | 
						|
    private:
 | 
						|
        ICalcDisplay* const m_displayCallback;
 | 
						|
        CCalcEngine* m_currentCalculatorEngine;
 | 
						|
        std::unique_ptr<CCalcEngine> m_scientificCalculatorEngine;
 | 
						|
        std::unique_ptr<CCalcEngine> m_standardCalculatorEngine;
 | 
						|
        std::unique_ptr<CCalcEngine> m_programmerCalculatorEngine;
 | 
						|
        IResourceProvider* const m_resourceProvider;
 | 
						|
        bool m_inHistoryItemLoadMode;
 | 
						|
 | 
						|
        std::vector<CalcEngine::Rational> m_memorizedNumbers;
 | 
						|
        CalcEngine::Rational m_persistedPrimaryValue;
 | 
						|
 | 
						|
        bool m_isExponentialFormat;
 | 
						|
 | 
						|
        static const unsigned int m_maximumMemorySize = 100;
 | 
						|
 | 
						|
        // For persistence
 | 
						|
        std::vector<unsigned char> m_savedCommands;
 | 
						|
        std::vector<long> m_savedPrimaryValue;
 | 
						|
        std::vector<long> m_currentSerializedMemory;
 | 
						|
        Command m_currentDegreeMode;
 | 
						|
        Command m_savedDegreeMode;
 | 
						|
        unsigned char MapCommandForSerialize(Command command);
 | 
						|
        unsigned int MapCommandForDeSerialize(unsigned char command);
 | 
						|
 | 
						|
        void SaveMemoryCommand(_In_ MemoryCommand command, _In_ unsigned int indexOfMemory);
 | 
						|
 | 
						|
        void MemorizedNumberSelect(_In_ unsigned int);
 | 
						|
        void MemorizedNumberChanged(_In_ unsigned int);
 | 
						|
 | 
						|
        void LoadPersistedPrimaryValue();
 | 
						|
 | 
						|
        std::shared_ptr<CalculatorHistory> m_pStdHistory;
 | 
						|
        std::shared_ptr<CalculatorHistory> m_pSciHistory;
 | 
						|
        CalculatorHistory* m_pHistory;
 | 
						|
 | 
						|
    public:
 | 
						|
        // ICalcDisplay
 | 
						|
        void SetPrimaryDisplay(_In_ const std::wstring& displayString, _In_ bool isError) override;
 | 
						|
        void SetIsInError(bool isError) override;
 | 
						|
        void SetExpressionDisplay(
 | 
						|
            _Inout_ std::shared_ptr<std::vector<std::pair<std::wstring, int>>> const& tokens,
 | 
						|
            _Inout_ std::shared_ptr<std::vector<std::shared_ptr<IExpressionCommand>>> const& commands) override;
 | 
						|
        void SetMemorizedNumbers(_In_ const std::vector<std::wstring>& memorizedNumbers) override;
 | 
						|
        void OnHistoryItemAdded(_In_ unsigned int addedItemIndex) override;
 | 
						|
        void SetParenthesisNumber(_In_ unsigned int parenthesisCount) override;
 | 
						|
        void OnNoRightParenAdded() override;
 | 
						|
        void DisplayPasteError();
 | 
						|
        void MaxDigitsReached() override;
 | 
						|
        void BinaryOperatorReceived() override;
 | 
						|
        void MemoryItemChanged(unsigned int indexOfMemory) override;
 | 
						|
        void InputChanged() override;
 | 
						|
        CalculatorManager(_In_ ICalcDisplay* displayCallback, _In_ IResourceProvider* resourceProvider);
 | 
						|
 | 
						|
        void Reset(bool clearMemory = true);
 | 
						|
        void SetStandardMode();
 | 
						|
        void SetScientificMode();
 | 
						|
        void SetProgrammerMode();
 | 
						|
        void SendCommand(_In_ Command command);
 | 
						|
 | 
						|
        void MemorizeNumber();
 | 
						|
        void MemorizedNumberLoad(_In_ unsigned int);
 | 
						|
        void MemorizedNumberAdd(_In_ unsigned int);
 | 
						|
        void MemorizedNumberSubtract(_In_ unsigned int);
 | 
						|
        void MemorizedNumberClear(_In_ unsigned int);
 | 
						|
        void MemorizedNumberClearAll();
 | 
						|
 | 
						|
        bool IsEngineRecording();
 | 
						|
        bool IsInputEmpty();
 | 
						|
        const std::vector<unsigned char>& GetSavedCommands() const
 | 
						|
        {
 | 
						|
            return m_savedCommands;
 | 
						|
        }
 | 
						|
        void SetRadix(RADIX_TYPE iRadixType);
 | 
						|
        void SetMemorizedNumbersString();
 | 
						|
        std::wstring GetResultForRadix(uint32_t radix, int32_t precision, bool groupDigitsPerRadix);
 | 
						|
        void SetPrecision(int32_t precision);
 | 
						|
        void UpdateMaxIntDigits();
 | 
						|
        wchar_t DecimalSeparator();
 | 
						|
 | 
						|
        std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems();
 | 
						|
        std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems(_In_ CalculationManager::CALCULATOR_MODE mode);
 | 
						|
        std::shared_ptr<HISTORYITEM> const& GetHistoryItem(_In_ unsigned int uIdx);
 | 
						|
        bool RemoveHistoryItem(_In_ unsigned int uIdx);
 | 
						|
        void ClearHistory();
 | 
						|
        size_t MaxHistorySize() const
 | 
						|
        {
 | 
						|
            return m_pHistory->MaxHistorySize();
 | 
						|
        }
 | 
						|
        CalculationManager::Command GetCurrentDegreeMode();
 | 
						|
        void SetHistory(_In_ CALCULATOR_MODE eMode, _In_ std::vector<std::shared_ptr<HISTORYITEM>> const& history);
 | 
						|
        void SetInHistoryItemLoadMode(_In_ bool isHistoryItemLoadMode);
 | 
						|
    };
 | 
						|
}
 |