diff --git a/src/CalcViewModel/CalcViewModel.vcxproj b/src/CalcViewModel/CalcViewModel.vcxproj index c2a69b5c..dbab218f 100644 --- a/src/CalcViewModel/CalcViewModel.vcxproj +++ b/src/CalcViewModel/CalcViewModel.vcxproj @@ -35,9 +35,9 @@ - {90e9761d-9262-4773-942d-caeae75d7140} - StaticLibrary - CalcViewModel + {812d1a7b-b8ac-49e4-8e6d-af5d59500d56} + WindowsRuntimeComponent + CalculatorApp en-US 14.0 true @@ -48,45 +48,45 @@ - StaticLibrary + DynamicLibrary true v142 - StaticLibrary + DynamicLibrary true v142 - StaticLibrary + DynamicLibrary true v142 - StaticLibrary + DynamicLibrary true v142 - StaticLibrary + DynamicLibrary false true v142 - StaticLibrary + DynamicLibrary false true v142 - StaticLibrary + DynamicLibrary false true v142 - StaticLibrary + DynamicLibrary false true v142 @@ -105,13 +105,13 @@ - - - - + + + + @@ -122,169 +122,165 @@ - + + false + + + false + + + false + + + false + + + false + + + false + + + false + + false - true Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - - + Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - - + Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 + + + Console + false + + + + + Use + _WINRT_DLL;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 + + + Console + false + + + + + Use + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + pch.h + $(IntDir)pch.pch + $(SolutionDir);%(AdditionalIncludeDirectories) + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + /bigobj /await %(AdditionalOptions) + 28204;4453 + stdcpp17 Console false - false - - /ignore:4264 %(AdditionalOptions) - - - - - Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true - - - Console - false - false - - - /ignore:4264 %(AdditionalOptions) - - - - - Use - true - true - $(SolutionDir)..\src\;%(AdditionalIncludeDirectories) - 4453 - /bigobj /await /std:c++17 /utf-8 %(AdditionalOptions) - Level4 - true - - - Console - false - false - - - /ignore:4264 %(AdditionalOptions) - @@ -314,6 +310,7 @@ + @@ -350,6 +347,7 @@ + @@ -365,10 +363,10 @@ Create Create - Create Create - Create Create + Create + Create Create Create @@ -389,6 +387,7 @@ /DUSE_MOCK_DATA %(AdditionalOptions) + _WINRT_DLL;%(PreprocessorDefinitions) @@ -407,5 +406,6 @@ - + + \ No newline at end of file diff --git a/src/CalcViewModel/CalcViewModel.vcxproj.filters b/src/CalcViewModel/CalcViewModel.vcxproj.filters index b219806e..1571ac45 100644 --- a/src/CalcViewModel/CalcViewModel.vcxproj.filters +++ b/src/CalcViewModel/CalcViewModel.vcxproj.filters @@ -1,28 +1,25 @@  + + 5f4c8558-c780-41a5-b937-f9d79ad434a0 + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms + - {1daab7c4-63f6-4266-a259-f34acad66d09} + {05fb7833-4679-4430-bf21-808354e815bf} - {8d4edf06-c312-4312-978a-b6c2beb8295a} + {8f1ef587-e5ce-4fc2-b9b7-73326d5e779a} - {0184f727-b8aa-4af8-a699-63f1b56e7853} + {70216695-3d7b-451a-98e4-cacbea3ba0a6} - {cf7dca32-9727-4f98-83c3-1c0ca7dd1e0c} + {9b94309f-6b9b-4cbb-8584-4273061cc432} - - - - - - - Common @@ -56,12 +53,18 @@ Common + + Common + Common Common + + Common\Automation + Common\Automation @@ -80,26 +83,25 @@ GraphingCalculator - - Common\Automation - GraphingCalculator + + + + + + + - - - - - - - - Common + + Common + Common @@ -115,6 +117,9 @@ Common + + Common + Common @@ -145,12 +150,21 @@ Common + + Common + + + Common + Common Common + + Common\Automation + Common\Automation @@ -160,6 +174,9 @@ DataLoaders + + DataLoaders + DataLoaders @@ -169,43 +186,31 @@ DataLoaders - - DataLoaders - - - Common\Automation - - - Common - - - Common - GraphingCalculator GraphingCalculator - - Common + + GraphingCalculator GraphingCalculator - - GraphingCalculator - - - Common - + + + + + + + + + DataLoaders - - - \ No newline at end of file diff --git a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h index a19de86f..385fea44 100644 --- a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h +++ b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h @@ -28,25 +28,23 @@ public static bool IsValid(NarratorAnnouncement ^ announcement); private: - // Make CalculatorAnnouncement a friend class so it is the only - // class that can access the private constructor. - friend class CalculatorAnnouncement; + Platform::String ^ m_announcement; + Platform::String ^ m_activityId; + Windows::UI::Xaml::Automation::Peers::AutomationNotificationKind m_kind; + Windows::UI::Xaml::Automation::Peers::AutomationNotificationProcessing m_processing; + internal: NarratorAnnouncement( Platform::String ^ announcement, Platform::String ^ activityId, Windows::UI::Xaml::Automation::Peers::AutomationNotificationKind kind, Windows::UI::Xaml::Automation::Peers::AutomationNotificationProcessing processing); - - Platform::String ^ m_announcement; - Platform::String ^ m_activityId; - Windows::UI::Xaml::Automation::Peers::AutomationNotificationKind m_kind; - Windows::UI::Xaml::Automation::Peers::AutomationNotificationProcessing m_processing; }; // CalculatorAnnouncement is intended to contain only static methods // that return announcements made for the Calculator app. - class CalculatorAnnouncement +public + ref class CalculatorAnnouncement sealed { public: static NarratorAnnouncement ^ GetDisplayUpdatedAnnouncement(Platform::String ^ announcement); diff --git a/src/CalcViewModel/Common/CopyPasteManager.cpp b/src/CalcViewModel/Common/CopyPasteManager.cpp index 8f84eead..19326006 100644 --- a/src/CalcViewModel/Common/CopyPasteManager.cpp +++ b/src/CalcViewModel/Common/CopyPasteManager.cpp @@ -116,7 +116,7 @@ String } // Get english translated expression - String ^ englishString = LocalizationSettings::GetInstance().GetEnglishValueFromLocalizedDigits(pastedText); + String ^ englishString = LocalizationSettings::GetInstance()->GetEnglishValueFromLocalizedDigits(pastedText); // Removing the spaces, comma separator from the pasteExpression to allow pasting of expressions like 1 + 2+1,333 auto pasteExpression = wstring(RemoveUnwantedCharsFromString(englishString)->Data()); @@ -614,7 +614,7 @@ ULONG32 CopyPasteManager::ProgrammerOperandLength(Platform::String ^ operand, Nu Platform::String ^ CopyPasteManager::RemoveUnwantedCharsFromString(Platform::String ^ input) { constexpr wchar_t unWantedChars[] = { L' ', L',', L'"', 165, 164, 8373, 36, 8353, 8361, 8362, 8358, 8377, 163, 8364, 8234, 8235, 8236, 8237, 160 }; - input = CalculatorApp::Common::LocalizationSettings::GetInstance().RemoveGroupSeparators(input); + input = CalculatorApp::Common::LocalizationSettings::GetInstance()->RemoveGroupSeparators(input); return ref new String(Utils::RemoveUnwantedCharsFromString(input->Data(), unWantedChars).c_str()); } diff --git a/src/CalcViewModel/Common/DisplayExpressionToken.h b/src/CalcViewModel/Common/DisplayExpressionToken.h index aaaaf37c..45b23c0d 100644 --- a/src/CalcViewModel/Common/DisplayExpressionToken.h +++ b/src/CalcViewModel/Common/DisplayExpressionToken.h @@ -50,7 +50,10 @@ public m_InEditMode = val; } } - internal : OBSERVABLE_PROPERTY_RW(TokenType, Type); + + // CSHARP_MIGRATION: TODO: this property has been changed from Internal to Public + // double check if this change is reasonable + OBSERVABLE_PROPERTY_RW(TokenType, Type); private: bool m_InEditMode; diff --git a/src/CalcViewModel/Common/EngineResourceProvider.cpp b/src/CalcViewModel/Common/EngineResourceProvider.cpp index 05faff9f..2ad77835 100644 --- a/src/CalcViewModel/Common/EngineResourceProvider.cpp +++ b/src/CalcViewModel/Common/EngineResourceProvider.cpp @@ -19,16 +19,16 @@ namespace CalculatorApp wstring EngineResourceProvider::GetCEngineString(wstring_view id) { - const auto& localizationSettings = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizationSettings = LocalizationSettings::GetInstance(); if (id.compare(L"sDecimal") == 0) { - return localizationSettings.GetDecimalSeparatorStr(); + return localizationSettings->GetDecimalSeparatorStr(); } if (id.compare(L"sThousand") == 0) { - return localizationSettings.GetNumberGroupingSeparatorStr(); + return localizationSettings->GetNumberGroupingSeparatorStr(); } if (id.compare(L"sGrouping") == 0) @@ -39,7 +39,7 @@ namespace CalculatorApp // 3;2;0 0x023 - group 1st 3 and then every 2 digits // 4;0 0x004 - group every 4 digits // 5;3;2;0 0x235 - group 5, then 3, then every 2 - wstring numberGroupingString = localizationSettings.GetNumberGroupingStr(); + wstring numberGroupingString = localizationSettings->GetNumberGroupingStr(); return numberGroupingString; } diff --git a/src/CalcViewModel/Common/LocalizationService.cpp b/src/CalcViewModel/Common/LocalizationService.cpp index c7fb9e0c..27bdfb1d 100644 --- a/src/CalcViewModel/Common/LocalizationService.cpp +++ b/src/CalcViewModel/Common/LocalizationService.cpp @@ -371,7 +371,7 @@ void LocalizationService::UpdateFontFamilyAndSize(DependencyObject ^ target) // If successful, returns a formatter that respects the user's regional format settings, // as configured by running intl.cpl. -DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter() const +DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter() { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers != nullptr) @@ -386,7 +386,7 @@ DecimalFormatter ^ LocalizationService::GetRegionalSettingsAwareDecimalFormatter // as configured by running intl.cpl. // // This helper function creates a DateTimeFormatter with a TwentyFour hour clock -DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format) const +DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format) { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers == nullptr) @@ -399,7 +399,7 @@ DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatt // If successful, returns a formatter that respects the user's regional format settings, // as configured by running intl.cpl. -DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format, _In_ String ^ calendarIdentifier, _In_ String ^ clockIdentifier) const +DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(_In_ String ^ format, _In_ String ^ calendarIdentifier, _In_ String ^ clockIdentifier) { IIterable ^ languageIdentifiers = LocalizationService::GetLanguageIdentifiers(); if (languageIdentifiers == nullptr) @@ -410,7 +410,7 @@ DateTimeFormatter ^ LocalizationService::GetRegionalSettingsAwareDateTimeFormatt return ref new DateTimeFormatter(format, languageIdentifiers, GlobalizationPreferences::HomeGeographicRegion, calendarIdentifier, clockIdentifier); } -CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatter() const +CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatter() { String ^ userCurrency = (GlobalizationPreferences::Currencies->Size > 0) ? GlobalizationPreferences::Currencies->GetAt(0) : StringReference(DefaultCurrencyCode.data()); @@ -423,7 +423,7 @@ CurrencyFormatter ^ LocalizationService::GetRegionalSettingsAwareCurrencyFormatt auto currencyFormatter = ref new CurrencyFormatter(userCurrency, languageIdentifiers, GlobalizationPreferences::HomeGeographicRegion); - int fractionDigits = LocalizationSettings::GetInstance().GetCurrencyTrailingDigits(); + int fractionDigits = LocalizationSettings::GetInstance()->GetCurrencyTrailingDigits(); currencyFormatter->FractionDigits = fractionDigits; return currencyFormatter; diff --git a/src/CalcViewModel/Common/LocalizationService.h b/src/CalcViewModel/Common/LocalizationService.h index d6921371..4641acaf 100644 --- a/src/CalcViewModel/Common/LocalizationService.h +++ b/src/CalcViewModel/Common/LocalizationService.h @@ -30,10 +30,7 @@ namespace CalculatorApp DEPENDENCY_PROPERTY_ATTACHED_WITH_DEFAULT_AND_CALLBACK(LanguageFontType, FontType, LanguageFontType::UIText); DEPENDENCY_PROPERTY_ATTACHED_WITH_CALLBACK(double, FontSize); - internal: static LocalizationService ^ GetInstance(); - static void OverrideWithLanguage(_In_ const wchar_t* const language); - Windows::UI::Xaml::FlowDirection GetFlowDirection(); bool IsRtlLayout(); bool GetOverrideFontApiValues(); @@ -42,7 +39,17 @@ namespace CalculatorApp Platform::String ^ GetFontFamilyOverride(); Windows::UI::Text::FontWeight GetFontWeightOverride(); double GetFontScaleFactorOverride(LanguageFontType fontType); + Windows::Globalization::NumberFormatting::DecimalFormatter ^ GetRegionalSettingsAwareDecimalFormatter(); + Windows::Globalization::DateTimeFormatting::DateTimeFormatter ^ GetRegionalSettingsAwareDateTimeFormatter(_In_ Platform::String ^ format); + Windows::Globalization::DateTimeFormatting::DateTimeFormatter + ^ GetRegionalSettingsAwareDateTimeFormatter( + _In_ Platform::String ^ format, + _In_ Platform::String ^ calendarIdentifier, + _In_ Platform::String ^ clockIdentifier); + Windows::Globalization::NumberFormatting::CurrencyFormatter ^ GetRegionalSettingsAwareCurrencyFormatter(); + internal: + static void OverrideWithLanguage(_In_ const wchar_t* const language); void Sort(std::vector& source); template @@ -56,16 +63,6 @@ namespace CalculatorApp }); } - Windows::Globalization::NumberFormatting::DecimalFormatter ^ GetRegionalSettingsAwareDecimalFormatter() const; - Windows::Globalization::DateTimeFormatting::DateTimeFormatter ^ GetRegionalSettingsAwareDateTimeFormatter(_In_ Platform::String ^ format) const; - Windows::Globalization::DateTimeFormatting::DateTimeFormatter - ^ GetRegionalSettingsAwareDateTimeFormatter( - _In_ Platform::String ^ format, - _In_ Platform::String ^ calendarIdentifier, - _In_ Platform::String ^ clockIdentifier) const; - - Windows::Globalization::NumberFormatting::CurrencyFormatter ^ GetRegionalSettingsAwareCurrencyFormatter() const; - static Platform::String ^ GetNarratorReadableToken(Platform::String ^ rawToken); static Platform::String ^ GetNarratorReadableString(Platform::String ^ rawString); diff --git a/src/CalcViewModel/Common/LocalizationSettings.h b/src/CalcViewModel/Common/LocalizationSettings.h index 86d45ab2..fe0625d2 100644 --- a/src/CalcViewModel/Common/LocalizationSettings.h +++ b/src/CalcViewModel/Common/LocalizationSettings.h @@ -10,13 +10,14 @@ namespace CalculatorApp { namespace Common { - class LocalizationSettings + public ref class LocalizationSettings sealed { private: LocalizationSettings() // Use DecimalFormatter as it respects the locale and the user setting - : LocalizationSettings(LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter()) + //: LocalizationSettings(LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter()) { + LocalizationSettings(LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter()); } public: @@ -126,48 +127,33 @@ namespace CalculatorApp } // A LocalizationSettings object is not copyable. - LocalizationSettings(const LocalizationSettings&) = delete; - LocalizationSettings& operator=(const LocalizationSettings&) = delete; + // CSHARP_MIGRATION: TODO: deleted and defaulted functions are not supported in managed/WinRT classes + //LocalizationSettings(const LocalizationSettings^) = delete; + //LocalizationSettings^ operator=(const LocalizationSettings^) = delete; // A LocalizationSettings object is not moveable. - LocalizationSettings(LocalizationSettings&&) = delete; - LocalizationSettings& operator=(LocalizationSettings&&) = delete; + // CSHARP_MIGRATION: TODO: Double check how should we hanlde move constrcutor and move assignment + //LocalizationSettings(LocalizationSettings&&) = delete; + //LocalizationSettings& operator=(LocalizationSettings&&) = delete; // Provider of the singleton LocalizationSettings instance. - static const LocalizationSettings& GetInstance() + static LocalizationSettings^ GetInstance() { - static const LocalizationSettings localizationSettings; - + static LocalizationSettings^ localizationSettings = ref new LocalizationSettings(); return localizationSettings; } - Platform::String ^ GetLocaleName() const + Platform::String ^ GetLocaleName() { return m_resolvedName; } - bool IsDigitEnUsSetting() const + bool IsDigitEnUsSetting() { return (this->GetDigitSymbolFromEnUsDigit('0') == L'0'); } - void LocalizeDisplayValue(_Inout_ std::wstring* stringToLocalize) const - { - if (IsDigitEnUsSetting()) - { - return; - } - - for (wchar_t& ch : *stringToLocalize) - { - if (IsEnUsDigit(ch)) - { - ch = GetDigitSymbolFromEnUsDigit(ch); - } - } - } - - Platform::String ^ GetEnglishValueFromLocalizedDigits(Platform::String ^ localizedString) const + Platform::String ^ GetEnglishValueFromLocalizedDigits(Platform::String ^ localizedString) { if (m_resolvedName == L"en-US") { @@ -199,17 +185,63 @@ namespace CalculatorApp return ref new Platform::String(englishString.c_str()); } - bool IsEnUsDigit(const wchar_t digit) const + Platform::String ^ RemoveGroupSeparators(Platform::String ^ source) + { + std::wstring destination; + std::copy_if( + begin(source), end(source), std::back_inserter(destination), [this](auto const c) { return c != L' ' && c != m_numberGroupSeparator; }); + + return ref new Platform::String(destination.c_str()); + } + + Platform::String ^ GetCalendarIdentifier() + { + return m_calendarIdentifier; + } + + Windows::Globalization::DayOfWeek GetFirstDayOfWeek() + { + return m_firstDayOfWeek; + } + + int GetCurrencyTrailingDigits() + { + return m_currencyTrailingDigits; + } + + int GetCurrencySymbolPrecedence() + { + return m_currencySymbolPrecedence; + } + + wchar_t GetDecimalSeparator() + { + return m_decimalSeparator; + } + + wchar_t GetDigitSymbolFromEnUsDigit(wchar_t digitSymbol) + { + assert(digitSymbol >= L'0' && digitSymbol <= L'9'); + int digit = digitSymbol - L'0'; + return m_digitSymbols.at(digit); // throws on out of range + } + + wchar_t GetNumberGroupSeparator() + { + return m_numberGroupSeparator; + } + + bool IsEnUsDigit(wchar_t digit) { return (digit >= L'0' && digit <= L'9'); } - bool IsLocalizedDigit(const wchar_t digit) const + bool IsLocalizedDigit(wchar_t digit) { return std::find(m_digitSymbols.begin(), m_digitSymbols.end(), digit) != m_digitSymbols.end(); } - bool IsLocalizedHexDigit(const wchar_t digit) const + bool IsLocalizedHexDigit(wchar_t digit) { if (IsLocalizedDigit(digit)) { @@ -219,71 +251,53 @@ namespace CalculatorApp return std::find(s_hexSymbols.begin(), s_hexSymbols.end(), digit) != s_hexSymbols.end(); } - wchar_t GetDigitSymbolFromEnUsDigit(wchar_t digitSymbol) const + Platform::String ^ GetListSeparatorWinRT() { - assert(digitSymbol >= L'0' && digitSymbol <= L'9'); - int digit = digitSymbol - L'0'; - return m_digitSymbols.at(digit); // throws on out of range + return ref new Platform::String(GetListSeparator().c_str()); } - wchar_t GetDecimalSeparator() const + Platform::String ^ GetDecimalSeparatorStrWinRT() { - return m_decimalSeparator; + return ref new Platform::String(GetDecimalSeparatorStr().c_str()); } - wchar_t GetNumberGroupSeparator() const + internal: + void LocalizeDisplayValue(_Inout_ std::wstring* stringToLocalize) { - return m_numberGroupSeparator; + if (IsDigitEnUsSetting()) + { + return; + } + + for (wchar_t& ch : *stringToLocalize) + { + if (IsEnUsDigit(ch)) + { + ch = GetDigitSymbolFromEnUsDigit(ch); + } + } } - std::wstring GetDecimalSeparatorStr() const + std::wstring GetDecimalSeparatorStr() { return std::wstring(1, m_decimalSeparator); } - std::wstring GetNumberGroupingSeparatorStr() const + std::wstring GetNumberGroupingSeparatorStr() { return std::wstring(1, m_numberGroupSeparator); } - std::wstring GetNumberGroupingStr() const + std::wstring GetNumberGroupingStr() { return m_numberGrouping; } - Platform::String ^ RemoveGroupSeparators(Platform::String ^ source) const - { - std::wstring destination; - std::copy_if( - begin(source), end(source), std::back_inserter(destination), [this](auto const c) { return c != L' ' && c != m_numberGroupSeparator; }); - - return ref new Platform::String(destination.c_str()); - } - - Platform::String ^ GetCalendarIdentifier() const - { - return m_calendarIdentifier; - } - - std::wstring GetListSeparator() const + std::wstring GetListSeparator() { return m_listSeparator; } - Windows::Globalization::DayOfWeek GetFirstDayOfWeek() const - { - return m_firstDayOfWeek; - } - - int GetCurrencyTrailingDigits() const - { - return m_currencyTrailingDigits; - } - - int GetCurrencySymbolPrecedence() const - { - return m_currencySymbolPrecedence; - } private: static Platform::String^ GetCalendarIdentifierFromCalid(CALID calId) diff --git a/src/CalcViewModel/Common/NavCategory.cpp b/src/CalcViewModel/Common/NavCategory.cpp index 6af89959..f23f46e1 100644 --- a/src/CalcViewModel/Common/NavCategory.cpp +++ b/src/CalcViewModel/Common/NavCategory.cpp @@ -73,10 +73,22 @@ bool IsGraphingModeEnabled() } User ^ firstUser; - create_task(User::FindAllAsync(UserType::LocalUser)).then([&firstUser](IVectorView ^ users) { - firstUser = users->GetAt(0); }).wait(); - auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser(firstUser, L"Education", L"AllowGraphingCalculator"); - _isGraphingModeEnabledCached = namedPolicyData->GetBoolean() == true; + std::atomic_flag finished = ATOMIC_FLAG_INIT; + + finished.test_and_set(std::memory_order_acquire); // acquire + + create_task(User::FindAllAsync(UserType::LocalUser)).then([&firstUser, &finished](IVectorView ^ users) { + firstUser = users->GetAt(0); + finished.clear(std::memory_order_release); // release + }, task_continuation_context::use_arbitrary()); + + while (finished.test_and_set(std::memory_order_acquire)) // aquire + ; // spin + + finished.clear(std::memory_order_release); // release + + auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser(firstUser, L"Education", L"AllowGraphingCalculator"); + _isGraphingModeEnabledCached = namedPolicyData->GetBoolean() == true; return _isGraphingModeEnabledCached->Value; } @@ -528,3 +540,4 @@ NavCategoryGroup ^ NavCategoryGroup::CreateConverterCategory() return ref new NavCategoryGroup( NavCategoryGroupInitializer{ CategoryGroupType::Converter, L"ConverterModeTextCaps", L"ConverterModeText", L"ConverterModePluralText" }); } + diff --git a/src/CalcViewModel/Common/RadixType.cpp b/src/CalcViewModel/Common/RadixType.cpp new file mode 100644 index 00000000..12b45371 --- /dev/null +++ b/src/CalcViewModel/Common/RadixType.cpp @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "pch.h" +#include "RadixType.h" + +// export enum RadixType + diff --git a/src/CalcViewModel/Common/RadixType.h b/src/CalcViewModel/Common/RadixType.h new file mode 100644 index 00000000..e9b05414 --- /dev/null +++ b/src/CalcViewModel/Common/RadixType.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +namespace CalculatorApp +{ + namespace Common + { + // This is expected to be in same order as IDM_HEX, IDM_DEC, IDM_OCT, IDM_BIN + public enum class RadixType + { + Hex, + Decimal, + Octal, + Binary + }; + } +} diff --git a/src/CalcViewModel/Common/TraceLogger.cpp b/src/CalcViewModel/Common/TraceLogger.cpp index f58513de..53a8ec15 100644 --- a/src/CalcViewModel/Common/TraceLogger.cpp +++ b/src/CalcViewModel/Common/TraceLogger.cpp @@ -147,11 +147,11 @@ namespace CalculatorApp TraceLoggingCommon::GetInstance()->LogLevel2Event(StringReference(EVENT_NAME_EXCEPTION), fields); } - void TraceLogger::LogPlatformException(ViewMode mode, wstring_view functionName, Platform::Exception ^ e) + void TraceLogger::LogPlatformException(ViewMode mode, Platform::String ^ functionName, Platform::Exception ^ e) { auto fields = ref new LoggingFields(); fields->AddString(StringReference(CALC_MODE), NavCategory::GetFriendlyName(mode)); - fields->AddString(StringReference(L"FunctionName"), StringReference(functionName.data())); + fields->AddString(StringReference(L"FunctionName"), functionName); fields->AddString(StringReference(L"Message"), e->Message); fields->AddInt32(StringReference(L"HRESULT"), e->HResult); TraceLoggingCommon::GetInstance()->LogLevel2Event(StringReference(EVENT_NAME_EXCEPTION), fields); diff --git a/src/CalcViewModel/Common/TraceLogger.h b/src/CalcViewModel/Common/TraceLogger.h index cef592e8..9f3ca663 100644 --- a/src/CalcViewModel/Common/TraceLogger.h +++ b/src/CalcViewModel/Common/TraceLogger.h @@ -83,9 +83,11 @@ namespace CalculatorApp void LogVariableSettingsChanged(Platform::String ^ setting); void LogGraphSettingsChanged(GraphSettingsType settingsType, Platform::String ^ settingValue); void LogGraphTheme(Platform::String ^ graphTheme); + // CSHARP_MIGRATION: TODO: + void LogPlatformException(CalculatorApp::Common::ViewMode mode, Platform::String ^ functionName, Platform::Exception ^ e); + internal: void LogStandardException(CalculatorApp::Common::ViewMode mode, std::wstring_view functionName, _In_ const std::exception& e); - void LogPlatformException(CalculatorApp::Common::ViewMode mode, std::wstring_view functionName, _In_ Platform::Exception ^ e); void LogInputPasted(CalculatorApp::Common::ViewMode mode); private: diff --git a/src/CalcViewModel/Common/Utils.cpp b/src/CalcViewModel/Common/Utils.cpp index 6bcc527d..9fa35f16 100644 --- a/src/CalcViewModel/Common/Utils.cpp +++ b/src/CalcViewModel/Common/Utils.cpp @@ -10,6 +10,7 @@ #include "Common/AppResourceProvider.h" #include "Common/ExpressionCommandSerializer.h" #include "Common/ExpressionCommandDeserializer.h" +#include "CalcManager/NumberFormattingUtils.h" using namespace CalculatorApp; using namespace CalculatorApp::Common; @@ -168,18 +169,20 @@ void Utils::TrimBack(wstring& value) }).base(), value.end()); } -String^ Utils::EscapeHtmlSpecialCharacters(String^ originalString, shared_ptr> specialCharacters) +bool operator==(const Color& color1, const Color& color2) +{ + return equal_to()(color1, color2); +} + +bool operator!=(const Color& color1, const Color& color2) +{ + return !(color1 == color2); +} + +String^ CalculatorApp::Utilities::EscapeHtmlSpecialCharacters(String^ originalString) { // Construct a default special characters if not provided. - if (specialCharacters == nullptr) - { - specialCharacters = make_shared>(); - specialCharacters->push_back(L'&'); - specialCharacters->push_back(L'\"'); - specialCharacters->push_back(L'\''); - specialCharacters->push_back(L'<'); - specialCharacters->push_back(L'>'); - } + const std::vector specialCharacters {L'&', L'\"', L'\'', L'<', L'>'}; bool replaceCharacters = false; const wchar_t* pCh; @@ -189,7 +192,7 @@ String^ Utils::EscapeHtmlSpecialCharacters(String^ originalString, shared_ptrData(); *pCh; pCh++) { - if (std::find(specialCharacters->begin(), specialCharacters->end(), *pCh) != specialCharacters->end()) + if (std::find(specialCharacters.begin(), specialCharacters.end(), *pCh) != specialCharacters.end()) { replaceCharacters = true; break; @@ -233,20 +236,22 @@ String^ Utils::EscapeHtmlSpecialCharacters(String^ originalString, shared_ptr()(color1, color2); + std::wstring tmp(input->Data()); + CalcManager::NumberFormattingUtils::TrimTrailingZeros(tmp); + return ref new Platform::String(tmp.c_str()); } -bool operator!=(const Color& color1, const Color& color2) +bool CalculatorApp::Utilities::AreColorsEqual(Windows::UI::Color color1, Windows::UI::Color color2) { - return !(color1 == color2); + return Utils::AreColorsEqual(color1, color2); } // This method calculates the luminance ratio between White and the given background color. // The luminance is calculate using the RGB values and does not use the A value. // White or Black is returned -SolidColorBrush ^ Utils::GetContrastColor(Color backgroundColor) +SolidColorBrush ^ CalculatorApp::Utilities::GetContrastColor(Color backgroundColor) { auto luminance = 0.2126 * backgroundColor.R + 0.7152 * backgroundColor.G + 0.0722 * backgroundColor.B; @@ -257,3 +262,9 @@ SolidColorBrush ^ Utils::GetContrastColor(Color backgroundColor) return static_cast(Application::Current->Resources->Lookup(L"BlackBrush")); } + +int CalculatorApp::Utilities::GetWindowId() +{ + return Utils::GetWindowId(); +} + diff --git a/src/CalcViewModel/Common/Utils.h b/src/CalcViewModel/Common/Utils.h index 553e43f3..fe13e763 100644 --- a/src/CalcViewModel/Common/Utils.h +++ b/src/CalcViewModel/Common/Utils.h @@ -399,10 +399,6 @@ namespace Utils void Trim(std::wstring& value); void TrimFront(std::wstring& value); void TrimBack(std::wstring& value); - - Platform::String ^ EscapeHtmlSpecialCharacters(Platform::String ^ originalString, std::shared_ptr> specialCharacters = nullptr); - - Windows::UI::Xaml::Media::SolidColorBrush ^ GetContrastColor(Windows::UI::Color backgroundColor); } // This goes into the header to define the property, in the public: section of the class @@ -698,6 +694,18 @@ namespace CalculatorApp return to; } + + // CSHARP_MIGRATION: TODO: Review below utils +public + ref class Utilities sealed + { + public: + static Platform::String ^ EscapeHtmlSpecialCharacters(Platform::String ^ originalString); + static Platform::String^ TrimTrailingZeros(Platform::String^ input); + static bool AreColorsEqual(Windows::UI::Color color1, Windows::UI::Color color2); + static Windows::UI::Xaml::Media::SolidColorBrush ^ GetContrastColor(Windows::UI::Color backgroundColor); + static int GetWindowId(); + }; } // There's no standard definition of equality for Windows::UI::Color structs. diff --git a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp index fc91a920..f45972e9 100644 --- a/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp +++ b/src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp @@ -300,7 +300,7 @@ pair CurrencyDataLoader::GetCurrencyRatioEquality(_In_ const U double ratio = (iter2->second).ratio; double rounded = RoundCurrencyRatio(ratio); - auto digit = LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit(L'1'); + auto digit = LocalizationSettings::GetInstance()->GetDigitSymbolFromEnUsDigit(L'1'); auto digitSymbol = ref new String(&digit, 1); auto roundedFormat = m_ratioFormatter->Format(rounded); diff --git a/src/CalcViewModel/DateCalculatorViewModel.cpp b/src/CalcViewModel/DateCalculatorViewModel.cpp index a34c1288..fb8eec09 100644 --- a/src/CalcViewModel/DateCalculatorViewModel.cpp +++ b/src/CalcViewModel/DateCalculatorViewModel.cpp @@ -45,13 +45,13 @@ DateCalculatorViewModel::DateCalculatorViewModel() , m_StrDateResult(L"") , m_StrDateResultAutomationName(L"") { - const auto & localizationSettings = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizationSettings = LocalizationSettings::GetInstance(); // Initialize Date Output format instances - InitializeDateOutputFormats(localizationSettings.GetCalendarIdentifier()); + InitializeDateOutputFormats(localizationSettings->GetCalendarIdentifier()); // Initialize Date Calc engine - m_dateCalcEngine = ref new DateCalculationEngine(localizationSettings.GetCalendarIdentifier()); + m_dateCalcEngine = ref new DateCalculationEngine(localizationSettings->GetCalendarIdentifier()); // Initialize dates of DatePicker controls to today's date auto calendar = ref new Calendar(); // We force the timezone to UTC, in order to avoid being affected by Daylight Saving Time @@ -68,7 +68,7 @@ DateCalculatorViewModel::DateCalculatorViewModel() // Initialize the list separator delimiter appended with a space at the end, e.g. ", " // This will be used for date difference formatting: Y years, M months, W weeks, D days - m_listSeparator = localizationSettings.GetListSeparator() + L" "; + m_listSeparator = localizationSettings->GetListSeparator() + L" "; // Initialize the output results UpdateDisplayResult(); @@ -77,7 +77,7 @@ DateCalculatorViewModel::DateCalculatorViewModel() for (int i = 0; i <= c_maxOffsetValue; i++) { wstring numberStr(to_wstring(i)); - localizationSettings.LocalizeDisplayValue(&numberStr); + localizationSettings->LocalizeDisplayValue(&numberStr); m_offsetValues->Append(ref new String(numberStr.c_str())); } @@ -378,7 +378,7 @@ void DateCalculatorViewModel::OnCopyCommand(Platform::Object ^ parameter) String ^ DateCalculatorViewModel::GetLocalizedNumberString(int value) const { wstring numberStr(to_wstring(value)); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&numberStr); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&numberStr); return ref new String(numberStr.c_str()); } diff --git a/src/CalcViewModel/GraphingCalculator/EquationViewModel.cpp b/src/CalcViewModel/GraphingCalculator/EquationViewModel.cpp index 50592aa4..b869776a 100644 --- a/src/CalcViewModel/GraphingCalculator/EquationViewModel.cpp +++ b/src/CalcViewModel/GraphingCalculator/EquationViewModel.cpp @@ -245,7 +245,7 @@ namespace CalculatorApp::ViewModel return; } - Platform::String ^ separator = ref new String(LocalizationSettings::GetInstance().GetListSeparator().c_str()); + Platform::String ^ separator = ref new String(LocalizationSettings::GetInstance()->GetListSeparator().c_str()); wstring error; if ((graphEquation->TooComplexFeatures & KeyGraphFeaturesFlag::Domain) == KeyGraphFeaturesFlag::Domain) diff --git a/src/CalcViewModel/HistoryViewModel.cpp b/src/CalcViewModel/HistoryViewModel.cpp index 8235c93a..29152e3b 100644 --- a/src/CalcViewModel/HistoryViewModel.cpp +++ b/src/CalcViewModel/HistoryViewModel.cpp @@ -57,15 +57,15 @@ void HistoryViewModel::ReloadHistory(_In_ ViewMode currentMode) auto historyListModel = m_calculatorManager->GetHistoryItems(m_currentMode); auto historyListVM = ref new Platform::Collections::Vector(); - const auto& localizer = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizer = LocalizationSettings::GetInstance(); if (historyListModel.size() > 0) { for (auto ritr = historyListModel.rbegin(); ritr != historyListModel.rend(); ++ritr) { wstring expression = (*ritr)->historyItemVector.expression; wstring result = (*ritr)->historyItemVector.result; - localizer.LocalizeDisplayValue(&expression); - localizer.LocalizeDisplayValue(&result); + localizer->LocalizeDisplayValue(&expression); + localizer->LocalizeDisplayValue(&result); auto item = ref new HistoryItemViewModel( ref new Platform::String(expression.c_str()), @@ -83,11 +83,11 @@ void HistoryViewModel::ReloadHistory(_In_ ViewMode currentMode) void HistoryViewModel::OnHistoryItemAdded(_In_ unsigned int addedItemIndex) { auto newItem = m_calculatorManager->GetHistoryItem(addedItemIndex); - const auto& localizer = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizer = LocalizationSettings::GetInstance(); wstring expression = newItem->historyItemVector.expression; wstring result = newItem->historyItemVector.result; - localizer.LocalizeDisplayValue(&expression); - localizer.LocalizeDisplayValue(&result); + localizer->LocalizeDisplayValue(&expression); + localizer->LocalizeDisplayValue(&result); auto item = ref new HistoryItemViewModel( ref new Platform::String(expression.c_str()), ref new Platform::String(result.c_str()), @@ -133,7 +133,7 @@ void HistoryViewModel::DeleteItem(_In_ HistoryItemViewModel ^ e) } // Adding 1 to the history item index to provide 1-based numbering on announcements. wstring localizedIndex = to_wstring(itemIndex + 1); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&localizedIndex); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&localizedIndex); m_localizedHistorySlotCleared = AppResourceProvider::GetInstance()->GetResourceString(HistoryResourceKeys::HistorySlotCleared); String ^ announcement = LocalizationStringUtil::GetLocalizedString(m_localizedHistorySlotCleared, StringReference(localizedIndex.c_str())); HistoryAnnouncement = CalculatorAnnouncement::GetHistorySlotClearedAnnouncement(announcement); diff --git a/src/CalcViewModel/HistoryViewModel.h b/src/CalcViewModel/HistoryViewModel.h index d7c7874e..f340c58d 100644 --- a/src/CalcViewModel/HistoryViewModel.h +++ b/src/CalcViewModel/HistoryViewModel.h @@ -48,13 +48,13 @@ namespace CalculatorApp event HideHistoryClickedHandler ^ HideHistoryClicked; event HistoryItemClickedHandler ^ HistoryItemClicked; void ShowItem(_In_ CalculatorApp::ViewModel::HistoryItemViewModel ^ e); + void DeleteItem(_In_ CalculatorApp::ViewModel::HistoryItemViewModel ^ e); internal : HistoryViewModel(_In_ CalculationManager::CalculatorManager* calculatorManager); void SetCalculatorDisplay(CalculatorDisplay& calculatorDisplay); void ReloadHistory(_In_ CalculatorApp::Common::ViewMode currentMode); unsigned long long GetMaxItemSize(); - void DeleteItem(_In_ CalculatorApp::ViewModel::HistoryItemViewModel ^ e); private: CalculationManager::CalculatorManager* const m_calculatorManager; diff --git a/src/CalcViewModel/StandardCalculatorViewModel.cpp b/src/CalcViewModel/StandardCalculatorViewModel.cpp index 56f2bda4..2521ec47 100644 --- a/src/CalcViewModel/StandardCalculatorViewModel.cpp +++ b/src/CalcViewModel/StandardCalculatorViewModel.cpp @@ -25,7 +25,6 @@ using namespace Windows::UI::Core; using namespace Windows::UI::Popups; using namespace Windows::Storage::Streams; using namespace Windows::Foundation::Collections; -using namespace Utils; using namespace concurrency; constexpr int StandardModePrecision = 16; @@ -118,7 +117,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() m_HistoryVM = ref new HistoryViewModel(&m_standardCalculatorManager); m_HistoryVM->SetCalculatorDisplay(m_calculatorDisplay); - m_decimalSeparator = LocalizationSettings::GetInstance().GetDecimalSeparator(); + m_decimalSeparator = LocalizationSettings::GetInstance()->GetDecimalSeparator(); if (CoreWindow::GetForCurrentThread() != nullptr) { @@ -138,7 +137,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue) { wstring result(displayValue); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&result); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&result); return ref new Platform::String(result.c_str()); } @@ -170,13 +169,13 @@ String ^ StandardCalculatorViewModel::CalculateNarratorDisplayValue(_In_ wstring String ^ StandardCalculatorViewModel::GetNarratorStringReadRawNumbers(_In_ String ^ localizedDisplayValue) { wstring ws; - const auto& locSettings = LocalizationSettings::GetInstance(); + LocalizationSettings^ locSettings = LocalizationSettings::GetInstance(); // Insert a space after each digit in the string, to force Narrator to read them as separate numbers. for (const wchar_t& c : localizedDisplayValue) { ws += c; - if (locSettings.IsLocalizedHexDigit(c)) + if (locSettings->IsLocalizedHexDigit(c)) { ws += L' '; } @@ -230,7 +229,7 @@ void StandardCalculatorViewModel::SetParenthesisCount(_In_ unsigned int parenthe void StandardCalculatorViewModel::SetOpenParenthesisCountNarratorAnnouncement() { wstring localizedParenthesisCount = to_wstring(m_OpenParenthesisCount).c_str(); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&localizedParenthesisCount); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&localizedParenthesisCount); if (m_localizedOpenParenthesisCountChangedAutomationFormat == nullptr) { @@ -329,7 +328,7 @@ void StandardCalculatorViewModel::SetTokens(_Inout_ shared_ptrLocalizeDisplayValue(&(currentToken.first)); if (!isEditable) { @@ -392,7 +391,7 @@ String ^ StandardCalculatorViewModel::GetCalculatorExpressionAutomationName() void StandardCalculatorViewModel::SetMemorizedNumbers(const vector& newMemorizedNumbers) { - const auto& localizer = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizer = LocalizationSettings::GetInstance(); if (newMemorizedNumbers.size() == 0) // Memory has been cleared { MemorizedNumbers->Clear(); @@ -408,7 +407,7 @@ void StandardCalculatorViewModel::SetMemorizedNumbers(const vector& new MemoryItemViewModel ^ memorySlot = ref new MemoryItemViewModel(this); memorySlot->Position = 0; - localizer.LocalizeDisplayValue(&stringValue); + localizer->LocalizeDisplayValue(&stringValue); memorySlot->Value = ref new String(stringValue.c_str()); MemorizedNumbers->InsertAt(0, memorySlot); @@ -426,7 +425,7 @@ void StandardCalculatorViewModel::SetMemorizedNumbers(const vector& new for (unsigned int i = 0; i < MemorizedNumbers->Size; i++) { auto newStringValue = newMemorizedNumbers.at(i); - localizer.LocalizeDisplayValue(&newStringValue); + localizer->LocalizeDisplayValue(&newStringValue); // If the value is different, update the value if (MemorizedNumbers->GetAt(i)->Value != StringReference(newStringValue.c_str())) @@ -1001,10 +1000,10 @@ ButtonInfo StandardCalculatorViewModel::MapCharacterToButtonId(char16 ch) if (result.buttonId == NumbersAndOperatorsEnum::None) { - if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch)) + if (LocalizationSettings::GetInstance()->IsLocalizedDigit(ch)) { result.buttonId = - NumbersAndOperatorsEnum::Zero + static_cast(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit('0')); + NumbersAndOperatorsEnum::Zero + static_cast(ch - LocalizationSettings::GetInstance()->GetDigitSymbolFromEnUsDigit('0')); result.canSendNegate = true; } } @@ -1044,7 +1043,7 @@ void StandardCalculatorViewModel::OnMemoryItemChanged(unsigned int indexOfMemory String ^ localizedValue = memSlot->Value; wstring localizedIndex = to_wstring(indexOfMemory + 1); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&localizedIndex); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&localizedIndex); if (m_localizedMemoryItemChangedAutomationFormat == nullptr) { @@ -1116,7 +1115,7 @@ void StandardCalculatorViewModel::OnMemoryClear(_In_ Object ^ memoryItemPosition TraceLogger::GetInstance()->UpdateButtonUsage(NumbersAndOperatorsEnum::MemoryClear, GetCalculatorMode()); wstring localizedIndex = to_wstring(boxedPosition->Value + 1); - LocalizationSettings::GetInstance().LocalizeDisplayValue(&localizedIndex); + LocalizationSettings::GetInstance()->LocalizeDisplayValue(&localizedIndex); if (m_localizedMemoryItemClearedAutomationFormat == nullptr) { @@ -1216,7 +1215,7 @@ String ^ StandardCalculatorViewModel::GetRawDisplayValue() } else { - return LocalizationSettings::GetInstance().RemoveGroupSeparators(DisplayValue); + return LocalizationSettings::GetInstance()->RemoveGroupSeparators(DisplayValue); } } @@ -1535,7 +1534,7 @@ size_t StandardCalculatorViewModel::LengthWithoutPadding(wstring str) wstring StandardCalculatorViewModel::AddPadding(wstring binaryString) { - if (LocalizationSettings::GetInstance().GetEnglishValueFromLocalizedDigits(StringReference(binaryString.c_str())) == L"0") + if (LocalizationSettings::GetInstance()->GetEnglishValueFromLocalizedDigits(StringReference(binaryString.c_str())) == L"0") { return binaryString; } @@ -1571,13 +1570,13 @@ void StandardCalculatorViewModel::UpdateProgrammerPanelDisplay() binaryDisplayString = m_standardCalculatorManager.GetResultForRadix(2, precision, true); } } - const auto& localizer = LocalizationSettings::GetInstance(); + LocalizationSettings^ localizer = LocalizationSettings::GetInstance(); binaryDisplayString = AddPadding(binaryDisplayString); - localizer.LocalizeDisplayValue(&hexDisplayString); - localizer.LocalizeDisplayValue(&decimalDisplayString); - localizer.LocalizeDisplayValue(&octalDisplayString); - localizer.LocalizeDisplayValue(&binaryDisplayString); + localizer->LocalizeDisplayValue(&hexDisplayString); + localizer->LocalizeDisplayValue(&decimalDisplayString); + localizer->LocalizeDisplayValue(&octalDisplayString); + localizer->LocalizeDisplayValue(&binaryDisplayString); HexDisplayValue = ref new Platform::String(hexDisplayString.c_str()); DecimalDisplayValue = ref new Platform::String(decimalDisplayString.c_str()); @@ -1609,7 +1608,7 @@ void StandardCalculatorViewModel::UpdateOperand(int pos, String ^ text) { pair p = m_tokens->at(pos); - String ^ englishString = LocalizationSettings::GetInstance().GetEnglishValueFromLocalizedDigits(text); + String ^ englishString = LocalizationSettings::GetInstance()->GetEnglishValueFromLocalizedDigits(text); p.first = englishString->Data(); int commandPos = p.second; diff --git a/src/CalcViewModel/StandardCalculatorViewModel.h b/src/CalcViewModel/StandardCalculatorViewModel.h index d60122bf..de5fb049 100644 --- a/src/CalcViewModel/StandardCalculatorViewModel.h +++ b/src/CalcViewModel/StandardCalculatorViewModel.h @@ -244,6 +244,21 @@ namespace CalculatorApp void ResetCalcManager(bool clearMemory); void SendCommandToCalcManager(int command); + public: + // CSHARP_MIGRATION: TODO: check if these still need to be internal + // Memory feature related methods. They are internal because they need to called from the MainPage code-behind + void OnMemoryButtonPressed(); + void OnMemoryItemPressed(Platform::Object ^ memoryItemPosition); + void OnMemoryAdd(Platform::Object ^ memoryItemPosition); + void OnMemorySubtract(Platform::Object ^ memoryItemPosition); + void OnMemoryClear(_In_ Platform::Object ^ memoryItemPosition); + void SelectHistoryItem(HistoryItemViewModel ^ item); + void SwitchProgrammerModeBase(CalculatorApp::Common::NumberBase calculatorBase); + void SetBitshiftRadioButtonCheckedAnnouncement(Platform::String ^ announcement); + void SetOpenParenthesisCountNarratorAnnouncement(); + void SwitchAngleType(NumbersAndOperatorsEnum num); + void FtoEButtonToggled(); + internal: void OnPaste(Platform::String ^ pastedString); void OnCopyCommand(Platform::Object ^ parameter); @@ -251,23 +266,14 @@ namespace CalculatorApp ButtonInfo MapCharacterToButtonId(char16 ch); - // Memory feature related methods. They are internal because they need to called from the MainPage code-behind - void OnMemoryButtonPressed(); - void OnMemoryItemPressed(Platform::Object ^ memoryItemPosition); - void OnMemoryAdd(Platform::Object ^ memoryItemPosition); - void OnMemorySubtract(Platform::Object ^ memoryItemPosition); - void OnMemoryClear(_In_ Platform::Object ^ memoryItemPosition); - void OnInputChanged(); void DisplayPasteError(); void SetParenthesisCount(_In_ unsigned int parenthesisCount); - void SetOpenParenthesisCountNarratorAnnouncement(); void OnNoRightParenAdded(); void SetNoParenAddedNarratorAnnouncement(); void OnMaxDigitsReached(); void OnBinaryOperatorReceived(); void OnMemoryItemChanged(unsigned int indexOfMemory); - void SetBitshiftRadioButtonCheckedAnnouncement(Platform::String ^ announcement); Platform::String ^ GetLocalizedStringFormat(Platform::String ^ format, Platform::String ^ displayValue); void OnPropertyChanged(Platform::String ^ propertyname); @@ -276,10 +282,7 @@ namespace CalculatorApp Platform::String ^ GetRawDisplayValue(); void Recalculate(bool fromHistory = false); bool IsOperator(CalculationManager::Command cmdenum); - void FtoEButtonToggled(); - void SwitchProgrammerModeBase(CalculatorApp::Common::NumberBase calculatorBase); - void SetMemorizedNumbersString(); - void SwitchAngleType(NumbersAndOperatorsEnum num); + void SetMemorizedNumbersString(); void ResetDisplay(); void SetPrecision(int32_t precision); @@ -291,7 +294,7 @@ namespace CalculatorApp { return m_CurrentAngleType; } - void SelectHistoryItem(HistoryItemViewModel ^ item); + private: void SetMemorizedNumbers(const std::vector& memorizedNumbers); void UpdateProgrammerPanelDisplay(); diff --git a/src/CalcViewModel/UnitConverterViewModel.cpp b/src/CalcViewModel/UnitConverterViewModel.cpp index 90960eb8..7bedece5 100644 --- a/src/CalcViewModel/UnitConverterViewModel.cpp +++ b/src/CalcViewModel/UnitConverterViewModel.cpp @@ -128,7 +128,7 @@ UnitConverterViewModel::UnitConverterViewModel(const shared_ptrGetRegionalSettingsAwareDecimalFormatter(); m_decimalFormatter->FractionDigits = 0; m_decimalFormatter->IsGrouped = true; - m_decimalSeparator = LocalizationSettings::GetInstance().GetDecimalSeparator(); + m_decimalSeparator = LocalizationSettings::GetInstance()->GetDecimalSeparator(); m_currencyFormatter = localizationService->GetRegionalSettingsAwareCurrencyFormatter(); m_currencyFormatter->IsGrouped = true; @@ -922,10 +922,10 @@ NumbersAndOperatorsEnum UnitConverterViewModel::MapCharacterToButtonId(const wch if (mappedValue == NumbersAndOperatorsEnum::None) { - if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch)) + if (LocalizationSettings::GetInstance()->IsLocalizedDigit(ch)) { mappedValue = NumbersAndOperatorsEnum::Zero - + static_cast(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit(L'0')); + + static_cast(ch - LocalizationSettings::GetInstance()->GetDigitSymbolFromEnUsDigit(L'0')); canSendNegate = true; } } diff --git a/src/CalcViewModel/UnitConverterViewModel.h b/src/CalcViewModel/UnitConverterViewModel.h index b48c1c3b..fd62940d 100644 --- a/src/CalcViewModel/UnitConverterViewModel.h +++ b/src/CalcViewModel/UnitConverterViewModel.h @@ -70,6 +70,18 @@ namespace CalculatorApp return AccessibleName; } + // CSHARP_MIGRATION: TODO: + public: + bool IsModelUnitWhimsical() + { + return m_original.isWhimsical; + } + + int ModelUnitID() + { + return m_original.id; + } + internal : const UnitConversionManager::Unit& GetModelUnit() const { return m_original; @@ -87,11 +99,14 @@ namespace CalculatorApp { } - bool IsWhimsical() const + // CSHARP_MIGRATION: TODO: double check below method's accessor + public: + bool IsWhimsical() { return m_Unit->GetModelUnit().isWhimsical; } + public: Platform::String ^ GetLocalizedAutomationName(); public: