From b91c8bc19de324167d9ae04de771a2cff3dc70c8 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Wed, 14 Nov 2012 23:44:11 +0400 Subject: [PATCH] functions --- .../CalculatorFunctionsMathRegistry.java | 3 +- .../android/calculator/CalculatorImpl.java | 15 ++ .../android/calculator/FunctionCategory.java | 3 - .../function/FunctionEditorSaver.java | 9 +- .../function/FunctionParamsView.java | 5 +- .../edit/CalculatorFunctionsFragment.java | 165 ++++++++---------- 6 files changed, 99 insertions(+), 101 deletions(-) diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java index f17af318..06ff82b0 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorFunctionsMathRegistry.java @@ -6,6 +6,7 @@ package org.solovyev.android.calculator; +import jscl.CustomFunctionCalculationException; import jscl.math.function.CustomFunction; import jscl.math.function.Function; import org.jetbrains.annotations.NotNull; @@ -52,7 +53,7 @@ public class CalculatorFunctionsMathRegistry extends AbstractCalculatorMathRegis public static void saveFunction(@NotNull CalculatorMathRegistry registry, @NotNull MathEntityBuilder builder, @Nullable Function editedInstance, - @NotNull Object source, boolean save) { + @NotNull Object source, boolean save) throws CustomFunctionCalculationException { final Function addedFunction = registry.add(builder); if (save) { diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java index dc3e088f..79325e0a 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/CalculatorImpl.java @@ -411,6 +411,21 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener { onDisplayStateChanged((CalculatorDisplayChangeEventData) data); break; + case constant_changed: + final IConstant newConstant = ((Change)data) .getNewValue(); + if (!newConstant.getName().equals(CalculatorVarsRegistry.ANS)) { + evaluate(); + } + break; + + case constant_added: + case constant_removed: + case function_added: + case function_changed: + case function_removed: + evaluate(); + break; + case engine_preferences_changed: evaluate(calculatorEventData.getSequenceId()); break; diff --git a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java index f3bfcd5c..3b469810 100644 --- a/calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java +++ b/calculatorpp-core/src/main/java/org/solovyev/android/calculator/FunctionCategory.java @@ -84,9 +84,6 @@ public enum FunctionCategory { } }); - // todo serso: current solution (as creating functions is not implemented yet) - result.remove(my); - return result; } } diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java b/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java index d6931af4..4a3ff4db 100644 --- a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java +++ b/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionEditorSaver.java @@ -2,6 +2,7 @@ package org.solovyev.android.calculator.function; import android.view.View; import android.widget.EditText; +import jscl.CustomFunctionCalculationException; import jscl.math.function.CustomFunction; import jscl.math.function.Function; import jscl.math.function.IFunction; @@ -106,8 +107,12 @@ public class FunctionEditorSaver implements View.OnClickListener { if (error != null) { CalculatorLocatorImpl.getInstance().getNotifier().showMessage(error, MessageType.error); } else { - CalculatorFunctionsMathRegistry.saveFunction(mathRegistry, new BuilderAdapter(builder), editedInstance, source, true); - } + try { + CalculatorFunctionsMathRegistry.saveFunction(mathRegistry, new BuilderAdapter(builder), editedInstance, source, true); + } catch (CustomFunctionCalculationException e) { + CalculatorLocatorImpl.getInstance().getNotifier().showMessage(e); + } + } } private boolean validateParameters(@NotNull List parameterNames) { diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java b/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java index e65f5fd7..04112ac2 100644 --- a/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java +++ b/calculatorpp/src/main/java/org/solovyev/android/calculator/function/FunctionParamsView.java @@ -76,7 +76,10 @@ public class FunctionParamsView extends LinearLayout { editParamView.setTag(getParamTag(id)); - final View removeParamButton = editParamView.findViewById(R.id.function_remove_param_button); + final EditText paramNameEditText = (EditText) editParamView.findViewById(R.id.function_param_edit_text); + paramNameEditText.setText(name); + + final View removeParamButton = editParamView.findViewById(R.id.function_remove_param_button); removeParamButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { diff --git a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java b/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java index b594c2e0..2636b151 100644 --- a/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java +++ b/calculatorpp/src/main/java/org/solovyev/android/calculator/math/edit/CalculatorFunctionsFragment.java @@ -14,14 +14,11 @@ import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; -import jscl.math.function.CustomFunction; import jscl.math.function.Function; import jscl.math.function.IFunction; import org.jetbrains.annotations.NotNull; -import org.solovyev.android.calculator.CalculatorEventType; -import org.solovyev.android.calculator.CalculatorLocatorImpl; -import org.solovyev.android.calculator.CalculatorMathRegistry; -import org.solovyev.android.calculator.R; +import org.jetbrains.annotations.Nullable; +import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.about.CalculatorFragmentType; import org.solovyev.android.calculator.function.FunctionEditDialogFragment; import org.solovyev.android.menu.AMenuItem; @@ -95,99 +92,13 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment< } final Function function = functionsRegistry.get(item.getName()); - if (!(function instanceof CustomFunction)) { + if (function == null || function.isSystem()) { result.remove(LongClickMenuItem.edit); + result.remove(LongClickMenuItem.remove); } return result; } - -/* private static void createEditVariableDialog(@NotNull final AbstractMathEntityListActivity activity, - @Nullable final CustomFunction function, - @Nullable final String name, - @Nullable final String expression, - @Nullable final String[] parameterNames, - @Nullable final String description) { - if (function == null || !function.isSystem()) { - - final LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(LAYOUT_INFLATER_SERVICE); - final View editView = layoutInflater.inflate(R.layout.var_edit, null); - - final String errorMsg = activity.getString(R.string.c_char_is_not_accepted); - - final EditText editName = (EditText) editView.findViewById(R.id.var_edit_name); - editName.setText(name); - editName.addTextChangedListener(new TextWatcher() { - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (!acceptableChars.contains(c)) { - s.delete(i, i + 1); - Toast.makeText(activity, String.format(errorMsg, c), Toast.LENGTH_SHORT).show(); - } - } - } - }); - - final EditText editValue = (EditText) editView.findViewById(R.id.var_edit_value); - if (!StringUtils.isEmpty(expression)) { - editValue.setText(expression); - } - - final EditText editDescription = (EditText) editView.findViewById(R.id.var_edit_description); - editDescription.setText(description); - - final CustomFunction.Builder functionBuilder; - if (function != null) { - functionBuilder = new CustomFunction.Builder(function); - } else { - functionBuilder = new CustomFunction.Builder(); - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(activity) - .setCancelable(true) - .setNegativeButton(R.string.c_cancel, null) - .setPositiveButton(R.string.c_save, new FunctionEditorSaver(functionBuilder, function, editView, activity, CalculatorEngine.instance.getFunctionsRegistry(), new FunctionEditorSaver.EditorCreator() { - - @Override - public void showEditor(@NotNull AbstractMathEntityListActivity activity, @Nullable CustomFunction editedInstance, @Nullable String name, @Nullable String value, @Nullable String[] parameterNames, @Nullable String description) { - createEditVariableDialog(activity, editedInstance, name, value, parameterNames, description); - } - })) - .setView(editView); - - if (function != null) { - // EDIT mode - - builder.setTitle(R.string.c_var_edit_var); - builder.setNeutralButton(R.string.c_remove, new MathEntityRemover(function, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - createEditVariableDialog(activity, function, name, expression, parameterNames, description); - } - }, CalculatorEngine.instance.getFunctionsRegistry(), activity)); - } else { - // CREATE mode - - builder.setTitle(R.string.c_var_create_var); - } - - builder.create().show(); - } else { - Toast.makeText(activity, activity.getString(R.string.c_sys_var_cannot_be_changed), Toast.LENGTH_LONG).show(); - } - }*/ - @NotNull @Override protected MathEntityDescriptionGetter getDescriptionGetter() { @@ -205,7 +116,66 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment< return CalculatorLocatorImpl.getInstance().getEngine().getFunctionsRegistry().getCategory(function); } - /* + @Override + public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, @NotNull CalculatorEventType calculatorEventType, @Nullable Object data) { + super.onCalculatorEvent(calculatorEventData, calculatorEventType, data); + + switch (calculatorEventType) { + case function_added: + processFunctionAdded((Function) data); + break; + + case function_changed: + processFunctionChanged((Change) data); + break; + + case function_removed: + processFunctionRemoved((Function) data); + break; + } + } + + + private void processFunctionRemoved(@NotNull final Function function) { + if (this.isInCategory(function)) { + getUiHandler().post(new Runnable() { + @Override + public void run() { + removeFromAdapter(function); + notifyAdapter(); + } + }); + } + } + + private void processFunctionChanged(@NotNull final Change change) { + final Function newFunction = change.getNewValue(); + if (this.isInCategory(newFunction)) { + getUiHandler().post(new Runnable() { + @Override + public void run() { + removeFromAdapter(change.getOldValue()); + addToAdapter(newFunction); + sort(); + } + }); + } + } + + private void processFunctionAdded(@NotNull final Function function) { + if (this.isInCategory(function)) { + getUiHandler().post(new Runnable() { + @Override + public void run() { + addToAdapter(function); + sort(); + } + }); + } + } + + + /* ********************************************************************** * * MENU @@ -259,6 +229,13 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment< } }, + remove(R.string.c_remove) { + @Override + public void onClick(@NotNull Function function, @NotNull Context context) { + MathEntityRemover.newFunctionRemover(function, null, context, context).showConfirmationDialog(); + } + }, + copy_description(R.string.c_copy_description) { @Override public void onClick(@NotNull Function function, @NotNull Context context) {