From cb900d9560b0025fbb021bdbe3afb4d69ee92eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 28 Sep 2018 10:35:56 +0200 Subject: [PATCH] [shared] Factorize code between ExpressionFieldDelegateApp and TextFieldDelegateApp --- apps/shared/expression_field_delegate_app.cpp | 28 +++--- apps/shared/expression_field_delegate_app.h | 1 + apps/shared/text_field_delegate_app.cpp | 97 +++++++++++-------- apps/shared/text_field_delegate_app.h | 5 + 4 files changed, 78 insertions(+), 53 deletions(-) diff --git a/apps/shared/expression_field_delegate_app.cpp b/apps/shared/expression_field_delegate_app.cpp index 6e4b377e1..77c8c1c4b 100644 --- a/apps/shared/expression_field_delegate_app.cpp +++ b/apps/shared/expression_field_delegate_app.cpp @@ -22,7 +22,7 @@ char ExpressionFieldDelegateApp::privateXNT(LayoutField * layoutField) { } bool ExpressionFieldDelegateApp::layoutFieldShouldFinishEditing(LayoutField * layoutField, Ion::Events::Event event) { - return event == Ion::Events::OK || event == Ion::Events::EXE; + return isFinishingEvent(event); } bool ExpressionFieldDelegateApp::layoutFieldDidReceiveEvent(LayoutField * layoutField, Ion::Events::Event event) { @@ -34,32 +34,22 @@ bool ExpressionFieldDelegateApp::layoutFieldDidReceiveEvent(LayoutField * layout char buffer[TextField::maxBufferSize()]; int bufferSize = TextField::maxBufferSize(); int length = layoutField->serialize(buffer, bufferSize); - Expression exp = Expression::parse(buffer); if (length >= bufferSize-1) { /* If the buffer is totally full, it is VERY likely that writeTextInBuffer * escaped before printing utterly the expression. */ displayWarning(I18n::Message::SyntaxError); return true; } - if (exp.isUninitialized()) { - layoutField->app()->displayWarning(I18n::Message::SyntaxError); + if (unparsableText(buffer, layoutField)) { return true; } } if (event == Ion::Events::Var) { - if (!layoutField->isEditing()) { - layoutField->setEditing(true); - } - AppsContainer * appsContainer = (AppsContainer *)layoutField->app()->container(); - VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setSender(layoutField); - layoutField->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); - return true; + forceEdition(layoutField); + return displayVariableBoxController(layoutField); } if (event == Ion::Events::XNT) { - if (!layoutField->isEditing()) { - layoutField->setEditing(true); - } + forceEdition(layoutField); const char xnt[2] = {privateXNT(layoutField), 0}; return layoutField->handleEventWithText(xnt); } @@ -72,4 +62,12 @@ Toolbox * ExpressionFieldDelegateApp::toolboxForLayoutField(LayoutField * layout return toolbox; } +/* Private */ + +void ExpressionFieldDelegateApp::forceEdition(LayoutField * layoutField) { + if (!layoutField->isEditing()) { + layoutField->setEditing(true); + } +} + } diff --git a/apps/shared/expression_field_delegate_app.h b/apps/shared/expression_field_delegate_app.h index 6fa2ef03e..08da43f0b 100644 --- a/apps/shared/expression_field_delegate_app.h +++ b/apps/shared/expression_field_delegate_app.h @@ -13,6 +13,7 @@ public: virtual bool layoutFieldDidReceiveEvent(LayoutField * layoutField, Ion::Events::Event event) override; Toolbox * toolboxForLayoutField(LayoutField * layoutField) override; protected: + void forceEdition(LayoutField * layoutField); char privateXNT(LayoutField * layoutField); ExpressionFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); }; diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index 2a9d3896f..88a3ea30e 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -25,6 +25,65 @@ const char * TextFieldDelegateApp::XNT() { return "X"; } +bool TextFieldDelegateApp::textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) { + return isFinishingEvent(event); +} + +bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { + if (textField->isEditing() && textField->textFieldShouldFinishEditing(event)) { + if (unparsableText(textField->text(), textField)) { + return true; + } + } + if (event == Ion::Events::Var) { + forceEdition(textField); + return displayVariableBoxController(textField); + } + if (event == Ion::Events::XNT) { + forceEdition(textField); + const char * xnt = privateXNT(textField); + return textField->handleEventWithText(xnt); + } + return false; +} + +Toolbox * TextFieldDelegateApp::toolboxForTextInput(TextInput * textInput) { + Toolbox * toolbox = container()->mathToolbox(); + toolbox->setSender(textInput); + return toolbox; +} + +/* Protected */ + +void TextFieldDelegateApp::forceEdition(TextField * textField) { + if (!textField->isEditing()) { + textField->setEditing(true); + } +} + +bool TextFieldDelegateApp::isFinishingEvent(Ion::Events::Event event) { + return event == Ion::Events::OK || event == Ion::Events::EXE; +} + +bool TextFieldDelegateApp::unparsableText(const char * text, Responder * responder) { + Expression exp = Expression::parse(text); + if (exp.isUninitialized()) { + responder->app()->displayWarning(I18n::Message::SyntaxError); + return true; + } + return false; +} + +bool TextFieldDelegateApp::displayVariableBoxController(Responder * sender) { + AppsContainer * appsContainer = (AppsContainer *)sender->app()->container(); + VariableBoxController * variableBoxController = appsContainer->variableBoxController(); + variableBoxController->setSender(sender); + sender->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); + return true; +} + +/* Private */ + const char * TextFieldDelegateApp::privateXNT(TextField * textField) { static constexpr struct { const char *name, *xnt; } sFunctions[] = { { "diff", "x" }, { "int", "x" }, @@ -72,42 +131,4 @@ const char * TextFieldDelegateApp::privateXNT(TextField * textField) { return XNT(); } -bool TextFieldDelegateApp::textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) { - return event == Ion::Events::OK || event == Ion::Events::EXE; -} - -bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - if (textField->isEditing() && textField->textFieldShouldFinishEditing(event)) { - Expression exp = Expression::parse(textField->text()); - if (exp.isUninitialized()) { - textField->app()->displayWarning(I18n::Message::SyntaxError); - return true; - } - } - if (event == Ion::Events::Var) { - if (!textField->isEditing()) { - textField->setEditing(true); - } - AppsContainer * appsContainer = (AppsContainer *)textField->app()->container(); - VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setSender(textField); - textField->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); - return true; - } - if (event == Ion::Events::XNT) { - if (!textField->isEditing()) { - textField->setEditing(true); - } - const char * xnt = privateXNT(textField); - return textField->handleEventWithText(xnt); - } - return false; -} - -Toolbox * TextFieldDelegateApp::toolboxForTextInput(TextInput * textInput) { - Toolbox * toolbox = container()->mathToolbox(); - toolbox->setSender(textInput); - return toolbox; -} - } diff --git a/apps/shared/text_field_delegate_app.h b/apps/shared/text_field_delegate_app.h index def5d9a6c..3c7534804 100644 --- a/apps/shared/text_field_delegate_app.h +++ b/apps/shared/text_field_delegate_app.h @@ -20,6 +20,11 @@ public: Toolbox * toolboxForTextInput(TextInput * textInput) override; protected: TextFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); +protected: + void forceEdition(TextField * textField); + bool isFinishingEvent(Ion::Events::Event event); + bool unparsableText(const char * text, Responder * responder); + bool displayVariableBoxController(Responder * sender); private: const char * privateXNT(TextField * textField); };