// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "pch.h" #include "MathRichEditBox.h" using namespace Platform; using namespace CalculatorApp; using namespace CalculatorApp::Common; using namespace CalculatorApp::Controls; using namespace std; using namespace Windows::ApplicationModel; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::Foundation::Collections; using namespace Windows::System; DEPENDENCY_PROPERTY_INITIALIZATION(MathRichEditBox, MathText); // TODO remove when Windows 10 version 2004 SDK is adopted namespace Windows_2004_Prerelease { enum RichEditMathMode : int { NoMath, MathOnly, }; MIDL_INTERFACE("619c20f2-cb3b-4521-981f-2865b1b93f04") ITextDocument4 : public IInspectable { public: virtual HRESULT STDMETHODCALLTYPE SetMath(HSTRING value) = 0; virtual HRESULT STDMETHODCALLTYPE GetMath(HSTRING * value) = 0; virtual HRESULT STDMETHODCALLTYPE SetMathMode(RichEditMathMode mathMode) = 0; }; } MathRichEditBox::MathRichEditBox() { static LimitedAccessFeatureStatus m_lafResultStatus; String ^ packageName = Package::Current->Id->Name; if (packageName == L"Microsoft.WindowsCalculator.Dev") { m_lafResultStatus = LimitedAccessFeatures::TryUnlockFeature( "com.microsoft.windows.richeditmath", "BeDD/jxKhz/yfVNA11t4uA==", // Microsoft.WindowsCalculator.Dev "8wekyb3d8bbwe has registered their use of com.microsoft.windows.richeditmath with Microsoft and agrees to the terms of use.") ->Status; } else if (packageName == L"Microsoft.WindowsCalculator") { m_lafResultStatus = LimitedAccessFeatures::TryUnlockFeature( "com.microsoft.windows.richeditmath", "pfanNuxnzo+mAkBQ3N/rGQ==", // Microsoft.WindowsCalculator "8wekyb3d8bbwe has registered their use of com.microsoft.windows.richeditmath with Microsoft and agrees to the terms of use.") ->Status; } else if (packageName == L"Microsoft.WindowsCalculator.Graphing") { m_lafResultStatus = LimitedAccessFeatures::TryUnlockFeature( "com.microsoft.windows.richeditmath", "H6wflFFz3gkOsAHtG/D9Tg==", // Microsoft.WindowsCalculator.Graphing "8wekyb3d8bbwe has registered their use of com.microsoft.windows.richeditmath with Microsoft and agrees to the terms of use.") ->Status; } // TODO when Windows 10 version 2004 SDK is adopted, replace with: // TextDocument->SetMathMode(Windows::UI::Text::RichEditMathMode::MathOnly); Microsoft::WRL::ComPtr textDocument4; reinterpret_cast(this->TextDocument)->QueryInterface(IID_PPV_ARGS(&textDocument4)); auto hr = textDocument4->SetMathMode(Windows_2004_Prerelease::RichEditMathMode::MathOnly); if (FAILED(hr)) { throw Exception::CreateException(hr); } this->LosingFocus += ref new Windows::Foundation::TypedEventHandler( this, &CalculatorApp::Controls::MathRichEditBox::OnLosingFocus); this->KeyUp += ref new Windows::UI::Xaml::Input::KeyEventHandler(this, &CalculatorApp::Controls::MathRichEditBox::OnKeyUp); } String ^ MathRichEditBox::GetMathTextProperty() { // TODO when Windows 10 version 2004 SDK is adopted, replace with: // String ^ text; // this->TextDocument->GetMath(&text); // return text; Microsoft::WRL::ComPtr textDocument4; reinterpret_cast(this->TextDocument)->QueryInterface(IID_PPV_ARGS(&textDocument4)); HSTRING math; auto hr = textDocument4->GetMath(&math); if (FAILED(hr)) { throw Exception::CreateException(hr); } return reinterpret_cast(math); } void MathRichEditBox::SetMathTextProperty(String ^ newValue) { bool readOnlyState = this->IsReadOnly; this->IsReadOnly = false; // TODO when Windows 10 version 2004 SDK is adopted, replace with: // TextDocument->SetMath(newValue); Microsoft::WRL::ComPtr textDocument4; reinterpret_cast(this->TextDocument)->QueryInterface(IID_PPV_ARGS(&textDocument4)); auto hr = textDocument4->SetMath(reinterpret_cast(newValue)); if (FAILED(hr)) { throw Exception::CreateException(hr); } this->IsReadOnly = readOnlyState; SetValue(MathTextProperty, newValue); } void CalculatorApp::Controls::MathRichEditBox::OnLosingFocus(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::Input::LosingFocusEventArgs ^ args) { auto newVal = GetMathTextProperty(); if (MathText != newVal) { SetValue(MathTextProperty, newVal); EquationSubmitted(this, ref new MathRichEditBoxSubmission(true, EquationSubmissionSource::FOCUS_LOST)); } else { EquationSubmitted(this, ref new MathRichEditBoxSubmission(false, EquationSubmissionSource::FOCUS_LOST)); } } void CalculatorApp::Controls::MathRichEditBox::OnKeyUp(Platform::Object ^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs ^ e) { if (e->Key == VirtualKey::Enter) { auto newVal = GetMathTextProperty(); if (MathText != newVal) { SetValue(MathTextProperty, newVal); EquationSubmitted(this, ref new MathRichEditBoxSubmission(true, EquationSubmissionSource::ENTER_KEY)); } else { EquationSubmitted(this, ref new MathRichEditBoxSubmission(true, EquationSubmissionSource::ENTER_KEY)); } } } void MathRichEditBox::OnMathTextPropertyChanged(Platform::String ^ oldValue, Platform::String ^ newValue) { SetMathTextProperty(newValue); }