From 397c180d52608ac01a4eee627660f3acf7e432c4 Mon Sep 17 00:00:00 2001 From: Pepe Rivera Date: Fri, 10 Jan 2020 15:17:36 -0800 Subject: [PATCH] Format MathML equations before submission to the GraphControl (#926) * Format richedit input * fix spelling error --- src/Calculator/Controls/EquationTextBox.cpp | 6 ++++++ src/Calculator/Controls/EquationTextBox.h | 2 ++ src/Calculator/Controls/MathRichEditBox.cpp | 9 +++++++++ src/Calculator/Controls/MathRichEditBox.h | 15 +++++++++++++++ .../GraphingCalculator/EquationInputArea.xaml | 1 + .../GraphingCalculator/EquationInputArea.xaml.cpp | 6 +++++- .../GraphingCalculator/EquationInputArea.xaml.h | 2 ++ .../GraphingCalculator/GraphingCalculator.xaml | 1 + .../GraphingCalculator.xaml.cpp | 12 ++++++++++-- .../GraphingCalculator/GraphingCalculator.xaml.h | 1 + src/GraphControl/Control/Grapher.cpp | 7 +++++++ src/GraphControl/Control/Grapher.h | 1 + 12 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/Calculator/Controls/EquationTextBox.cpp b/src/Calculator/Controls/EquationTextBox.cpp index cc873ca..e97ae56 100644 --- a/src/Calculator/Controls/EquationTextBox.cpp +++ b/src/Calculator/Controls/EquationTextBox.cpp @@ -54,6 +54,7 @@ void EquationTextBox::OnApplyTemplate() m_richEditBox->SelectionFlyout = nullptr; m_richEditBox->EquationSubmitted += ref new EventHandler(this, &EquationTextBox::OnEquationSubmitted); + m_richEditBox->FormatRequest += ref new EventHandler(this, &EquationTextBox::OnEquationFormatRequested); } if (m_equationButton != nullptr) @@ -381,3 +382,8 @@ void EquationTextBox::OnEquationSubmitted(Platform::Object ^ sender, MathRichEdi EquationSubmitted(this, args); } + +void EquationTextBox::OnEquationFormatRequested(Object ^ sender, MathRichEditBoxFormatRequest ^ args) +{ + EquationFormatRequested(this, args); +} diff --git a/src/Calculator/Controls/EquationTextBox.h b/src/Calculator/Controls/EquationTextBox.h index 3686025..ed71b50 100644 --- a/src/Calculator/Controls/EquationTextBox.h +++ b/src/Calculator/Controls/EquationTextBox.h @@ -30,6 +30,7 @@ namespace CalculatorApp event Windows::UI::Xaml::RoutedEventHandler ^ RemoveButtonClicked; event Windows::UI::Xaml::RoutedEventHandler ^ KeyGraphFeaturesButtonClicked; event Windows::Foundation::EventHandler ^ EquationSubmitted; + event Windows::Foundation::EventHandler ^ EquationFormatRequested; event Windows::UI::Xaml::RoutedEventHandler ^ EquationButtonClicked; Platform::String ^ GetEquationText(); @@ -79,6 +80,7 @@ namespace CalculatorApp bool m_isPointerOver; bool m_isColorChooserFlyoutOpen; void OnEquationSubmitted(Platform::Object ^ sender, CalculatorApp::Controls::MathRichEditBoxSubmission ^ args); + void OnEquationFormatRequested(Platform::Object ^ sender, CalculatorApp::Controls::MathRichEditBoxFormatRequest ^ args); }; } } diff --git a/src/Calculator/Controls/MathRichEditBox.cpp b/src/Calculator/Controls/MathRichEditBox.cpp index b19471a..15ef5d6 100644 --- a/src/Calculator/Controls/MathRichEditBox.cpp +++ b/src/Calculator/Controls/MathRichEditBox.cpp @@ -190,6 +190,15 @@ void MathRichEditBox::SubmitEquation(EquationSubmissionSource source) auto newVal = GetMathTextProperty(); if (MathText != newVal) { + // Request the final formatting of the text + auto formatRequest = ref new MathRichEditBoxFormatRequest(newVal); + FormatRequest(this, formatRequest); + + if (!formatRequest->FormattedText->IsEmpty()) + { + newVal = formatRequest->FormattedText; + } + SetValue(MathTextProperty, newVal); EquationSubmitted(this, ref new MathRichEditBoxSubmission(true, source)); } diff --git a/src/Calculator/Controls/MathRichEditBox.h b/src/Calculator/Controls/MathRichEditBox.h index c4b6d48..d28cd0f 100644 --- a/src/Calculator/Controls/MathRichEditBox.h +++ b/src/Calculator/Controls/MathRichEditBox.h @@ -30,6 +30,20 @@ namespace CalculatorApp } }; + public + ref class MathRichEditBoxFormatRequest sealed + { + public: + PROPERTY_R(Platform::String^, OriginalText); + PROPERTY_RW(Platform::String ^, FormattedText); + + public: + MathRichEditBoxFormatRequest(Platform::String^ originalText) + { + m_OriginalText = originalText; + } + }; + public ref class MathRichEditBox sealed : Windows::UI::Xaml::Controls::RichEditBox { @@ -39,6 +53,7 @@ namespace CalculatorApp DEPENDENCY_PROPERTY_OWNER(MathRichEditBox); DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(Platform::String ^, MathText, L""); + event Windows::Foundation::EventHandler ^ FormatRequest; event Windows::Foundation::EventHandler ^ EquationSubmitted; void OnMathTextPropertyChanged(Platform::String ^ oldValue, Platform::String ^ newValue); void InsertText(Platform::String ^ text, int cursorOffSet, int selectionLength); diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml index e6c1a2a..50132d6 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml @@ -778,6 +778,7 @@ EquationButtonClicked="EquationTextBox_EquationButtonClicked" EquationButtonContentIndex="{x:Bind FunctionLabelIndex, Mode=OneWay}" EquationColor="{x:Bind local:EquationInputArea.ToSolidColorBrush(LineColor), Mode=OneWay}" + EquationFormatRequested="EquationTextBox_EquationFormatRequested" EquationSubmitted="EquationTextBox_Submitted" GotFocus="EquationTextBox_GotFocus" HasError="{x:Bind GraphEquation.HasGraphError, Mode=OneWay}" diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp index be0181b..4892d2f 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp @@ -76,7 +76,6 @@ void EquationInputArea::AddNewEquation() return; } - m_lastLineColorIndex = (m_lastLineColorIndex + 1) % AvailableColors->Size; int colorIndex; @@ -376,3 +375,8 @@ double EquationInputArea::validateDouble(String ^ value, double defaultValue) { return numberOfVariables == 0 ? ::Visibility::Collapsed : ::Visibility::Visible; } + +void EquationInputArea::EquationTextBox_EquationFormatRequested(Object ^ sender, MathRichEditBoxFormatRequest ^ e) +{ + EquationFormatRequested(sender, e); +} diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h index 17b5889..1b5c3e4 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h @@ -25,6 +25,7 @@ namespace CalculatorApp OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector ^, Variables); OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector ^, AvailableColors); event Windows::Foundation::EventHandler^ KeyGraphFeaturesRequested; + event Windows::Foundation::EventHandler ^ EquationFormatRequested; public: static Windows::UI::Xaml::Visibility ManageEditVariablesButtonVisibility(unsigned int numberOfVariables); @@ -63,5 +64,6 @@ namespace CalculatorApp int m_lastLineColorIndex; int m_lastFunctionLabelIndex; ViewModel::EquationViewModel ^ m_equationToFocus; + void EquationTextBox_EquationFormatRequested(Platform::Object ^ sender, CalculatorApp::Controls::MathRichEditBoxFormatRequest ^ e); }; } diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml index 8857616..8a885fd 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml @@ -614,6 +614,7 @@ Data() << L"," << color.G.ToString()->Data() << L"," << color.B.ToString()->Data() << L");"; - equationHtml << L"
"; + equationHtml << L"
"; equationHtml << EscapeHtmlSpecialCharacters(expression)->Data(); equationHtml << L"
"; } @@ -543,3 +543,11 @@ void GraphingCalculator::OnSettingsFlyout_Closing(FlyoutBase ^ sender, FlyoutBas auto graphingSetting = static_cast(flyout->Content); args->Cancel = graphingSetting->CanBeClose(); } + +void GraphingCalculator::OnEquationFormatRequested(Object ^ sender, MathRichEditBoxFormatRequest ^ e) +{ + if (!e->OriginalText->IsEmpty()) + { + e->FormattedText = GraphingControl->FormatMathML(e->OriginalText); + } +} diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h index 64956de..c1b4134 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h @@ -84,6 +84,7 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo CalculatorApp::ViewModel::GraphingCalculatorViewModel ^ m_viewModel; void OnSettingsFlyout_Closing(Windows::UI::Xaml::Controls::Primitives::FlyoutBase ^ sender, Windows::UI::Xaml::Controls::Primitives::FlyoutBaseClosingEventArgs ^ args); + void OnEquationFormatRequested(Platform::Object ^ sender, CalculatorApp::Controls::MathRichEditBoxFormatRequest ^ e); }; } diff --git a/src/GraphControl/Control/Grapher.cpp b/src/GraphControl/Control/Grapher.cpp index 0546d7e..16ec5d8 100644 --- a/src/GraphControl/Control/Grapher.cpp +++ b/src/GraphControl/Control/Grapher.cpp @@ -859,6 +859,13 @@ String ^ Grapher::ConvertToLinear(String ^ mmlString) return ref new String(linearExpression.c_str()); } +String ^ Grapher::FormatMathML(String ^ mmlString) +{ + auto expression = m_solver->ParseInput(mmlString->Data()); + auto formattedExpression = m_solver->Serialize(expression.get()); + return ref new String(formattedExpression.c_str()); +} + void Grapher::OnAxesColorPropertyChanged(Windows::UI::Color /*oldValue*/, Windows::UI::Color newValue) { if (m_graph) diff --git a/src/GraphControl/Control/Grapher.h b/src/GraphControl/Control/Grapher.h index 2b63383..4f902c6 100644 --- a/src/GraphControl/Control/Grapher.h +++ b/src/GraphControl/Control/Grapher.h @@ -104,6 +104,7 @@ public event Windows::Foundation::EventHandler ^> ^ VariablesUpdated; void SetVariable(Platform::String ^ variableName, double newValue); Platform::String ^ ConvertToLinear(Platform::String ^ mmlString); + Platform::String ^ FormatMathML(Platform::String ^ mmlString); /// /// Draw the graph. Call this method if you add or modify an equation.