diff --git a/apps/shared.de.i18n b/apps/shared.de.i18n index c714d8a1b..ddacaf43f 100644 --- a/apps/shared.de.i18n +++ b/apps/shared.de.i18n @@ -52,6 +52,7 @@ StandardDeviation = "Standardabweichung" Step = "Schrittwert" StorageMemoryFull1 = "Der Speicher ist voll. Löschen Sie" StorageMemoryFull2 = "von Daten und versuchen Sie es erneut." +StoreExpressionNotAcceptedAsFunction = "The function cannot be a Store" SyntaxError = "Syntaxfehler" ToZoom = "Zoom: " Trigonometric = "Trigonometrisch" diff --git a/apps/shared.en.i18n b/apps/shared.en.i18n index 09dc23ff8..e76f52206 100644 --- a/apps/shared.en.i18n +++ b/apps/shared.en.i18n @@ -48,6 +48,7 @@ RoundAbscissa = "Integer" Sci = "sci/" SquareSum = "Sum of squares" StandardDeviation = "Standard deviation" +StoreExpressionNotAcceptedAsFunction = "The function cannot be a Store" StatTab = "Stats" Step = "Step" StorageMemoryFull1 = "The memory is full." diff --git a/apps/shared.es.i18n b/apps/shared.es.i18n index f67f7748f..b16c6dc81 100644 --- a/apps/shared.es.i18n +++ b/apps/shared.es.i18n @@ -52,6 +52,7 @@ StatTab = "Medidas" Step = "Incremento" StorageMemoryFull1 = "La memoria esta llena." StorageMemoryFull2 = "Borre datos e intente de nuevo." +StoreExpressionNotAcceptedAsFunction = "The function cannot be a Store" SyntaxError = "Error sintactico" ToZoom = "Zoom : " Trigonometric = "Trigonometrico" diff --git a/apps/shared.fr.i18n b/apps/shared.fr.i18n index a529c590a..c3b50e37e 100644 --- a/apps/shared.fr.i18n +++ b/apps/shared.fr.i18n @@ -52,6 +52,7 @@ StatTab = "Stats" Step = "Pas" StorageMemoryFull1 = "La mémoire est pleine." StorageMemoryFull2 = "Effacez des données et réessayez." +StoreExpressionNotAcceptedAsFunction = "The function cannot be a Store" SyntaxError = "Attention a la syntaxe" ToZoom = "Zoomer : " Trigonometric = "Trigonometrique" diff --git a/apps/shared.pt.i18n b/apps/shared.pt.i18n index f9268bb03..8b18b58ba 100644 --- a/apps/shared.pt.i18n +++ b/apps/shared.pt.i18n @@ -52,6 +52,7 @@ StatTab = "Estat" Step = "Passo" StorageMemoryFull1 = "A memoria esta chéia." StorageMemoryFull2 = "Apage dados e tente novamente." +StoreExpressionNotAcceptedAsFunction = "The function cannot be a Store" SyntaxError = "Erro de sintaxe" ToZoom = "Zoom : " Trigonometric = "Trigonometrico" diff --git a/apps/shared/expression_field_delegate_app.cpp b/apps/shared/expression_field_delegate_app.cpp index 035f8e289..d9d952c2b 100644 --- a/apps/shared/expression_field_delegate_app.cpp +++ b/apps/shared/expression_field_delegate_app.cpp @@ -32,7 +32,7 @@ bool ExpressionFieldDelegateApp::layoutFieldDidReceiveEvent(LayoutField * layout displayWarning(I18n::Message::SyntaxError); return true; } - if (unparsableText(buffer, layoutField)) { + if (!isAcceptableText(buffer, layoutField)) { return true; } } diff --git a/apps/shared/storage_function_app.cpp b/apps/shared/storage_function_app.cpp index 6e5ec3590..1eb267edd 100644 --- a/apps/shared/storage_function_app.cpp +++ b/apps/shared/storage_function_app.cpp @@ -67,4 +67,18 @@ void StorageFunctionApp::willBecomeInactive() { ::App::willBecomeInactive(); } + +bool StorageFunctionApp::isAcceptableExpression(const Expression exp, Responder * responder) { + if (TextFieldDelegateApp::isAcceptableExpression(exp, responder)) { + assert(!exp.isUninitialized()); + if (exp.type() == ExpressionNode::Type::Store) { + // We do not want to allow a function to be "3->a" or "5->f(x)" + responder->app()->displayWarning(I18n::Message::StoreExpressionNotAcceptedAsFunction); + return false; + } + return true; + } + return false; +} + } diff --git a/apps/shared/storage_function_app.h b/apps/shared/storage_function_app.h index 3f46b81b1..7aa0b63d2 100644 --- a/apps/shared/storage_function_app.h +++ b/apps/shared/storage_function_app.h @@ -37,6 +37,7 @@ public: void willBecomeInactive() override; protected: StorageFunctionApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); + bool isAcceptableExpression(const Poincare::Expression expression, Responder * responder) override; }; } diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index fd52d0789..3272220e1 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -27,7 +27,7 @@ bool TextFieldDelegateApp::textFieldShouldFinishEditing(TextField * textField, I bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { if (textField->isEditing() && textField->shouldFinishEditing(event)) { - if (unparsableText(textField->text(), textField)) { + if (!isAcceptableText(textField->text(), textField)) { return true; } } @@ -54,13 +54,17 @@ bool TextFieldDelegateApp::isFinishingEvent(Ion::Events::Event event) { return event == Ion::Events::OK || event == Ion::Events::EXE; } -bool TextFieldDelegateApp::unparsableText(const char * text, Responder * responder) { +bool TextFieldDelegateApp::isAcceptableText(const char * text, Responder * responder) { Expression exp = Expression::parse(text); + return isAcceptableExpression(exp, responder); +} + +bool TextFieldDelegateApp::isAcceptableExpression(const Expression exp, Responder * responder) { if (exp.isUninitialized()) { responder->app()->displayWarning(I18n::Message::SyntaxError); - return true; + return false; } - return false; + return true; } } diff --git a/apps/shared/text_field_delegate_app.h b/apps/shared/text_field_delegate_app.h index 91e76a651..a25f48fec 100644 --- a/apps/shared/text_field_delegate_app.h +++ b/apps/shared/text_field_delegate_app.h @@ -19,10 +19,10 @@ public: virtual bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; protected: TextFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); -protected: bool fieldDidReceiveEvent(EditableField * field, Responder * responder, Ion::Events::Event event); bool isFinishingEvent(Ion::Events::Event event); - bool unparsableText(const char * text, Responder * responder); + bool isAcceptableText(const char * text, Responder * responder); + virtual bool isAcceptableExpression(const Poincare::Expression expression, Responder * responder); }; }