substitutes = getSubstitutes();
+ final String substitute = substitutes.get(mathEntityName);
+ if (substitute == null) {
+ stringName = prefix + mathEntityName;
+ } else {
+ stringName = prefix + substitute;
+ }
+
+ return ResourceCache.instance.getCaption(stringName);
+ }
+
+ public synchronized void load(@Nullable Context context, @Nullable SharedPreferences preferences) {
+
+ if (context != null && preferences != null) {
+ final Integer preferenceStringId = getPreferenceStringId();
+ if (preferenceStringId != null) {
+ final String value = preferences.getString(context.getString(preferenceStringId), null);
+ if (value != null) {
+ final Serializer serializer = new Persister();
+ try {
+ final MathEntityPersistenceContainer persistenceContainer = serializer.read(getPersistenceContainerClass(), value);
+ for (P entity : persistenceContainer.getEntities()) {
+ if (!contains(entity.getName())) {
+ add(createBuilder(entity));
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ /*Log.d(AndroidVarsRegistry.class.getName(), vars.size() + " variables registered!");
+ for (Var var : vars) {
+ Log.d(AndroidVarsRegistry.class.getName(), var.toString());
+ }*/
+ }
+
+ @NotNull
+ protected abstract IBuilder extends T> createBuilder(@NotNull P entity);
+
+ @NotNull
+ protected abstract Class extends MathEntityPersistenceContainer
> getPersistenceContainerClass();
+
+ @Nullable
+ protected abstract Integer getPreferenceStringId();
+
+
+ @Override
+ public synchronized void save(@NotNull Context context) {
+ final Integer preferenceStringId = getPreferenceStringId();
+
+ if (preferenceStringId != null) {
+ final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
+ final SharedPreferences.Editor editor = settings.edit();
+
+ final MathEntityPersistenceContainer
container = createPersistenceContainer();
+ for (T entity : this.getEntities()) {
+ if (!entity.isSystem()) {
+ final P persistenceEntity = transform(entity);
+ if (persistenceEntity != null) {
+ container.getEntities().add(persistenceEntity);
+ }
+ }
+ }
+
+ final StringWriter sw = new StringWriter();
+ final Serializer serializer = new Persister();
+ try {
+ serializer.write(container, sw);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ editor.putString(context.getString(preferenceStringId), sw.toString());
+
+ editor.commit();
+ }
+ }
+
+ @Nullable
+ protected abstract P transform(@NotNull T entity);
+
+ @NotNull
+ protected abstract MathEntityPersistenceContainer
createPersistenceContainer();
+
+ @NotNull
+ @Override
+ public List getEntities() {
+ return mathRegistry.getEntities();
+ }
+
+ @NotNull
+ @Override
+ public List getSystemEntities() {
+ return mathRegistry.getSystemEntities();
+ }
+
+ @Override
+ public T add(@NotNull IBuilder extends T> IBuilder) {
+ return mathRegistry.add(IBuilder);
+ }
+
+ @Override
+ public void remove(@NotNull T var) {
+ mathRegistry.remove(var);
+ }
+
+ @NotNull
+ @Override
+ public List getNames() {
+ return mathRegistry.getNames();
+ }
+
+ @Override
+ public boolean contains(@NotNull String name) {
+ return mathRegistry.contains(name);
+ }
+
+ @Override
+ public T get(@NotNull String name) {
+ return mathRegistry.get(name);
+ }
+
+ @Override
+ public T getById(@NotNull Integer id) {
+ return mathRegistry.getById(id);
+ }
+}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsMathRegistry.java b/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsMathRegistry.java
index c5204baa..c6af473a 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsMathRegistry.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsMathRegistry.java
@@ -6,12 +6,13 @@
package org.solovyev.android.calculator.model;
-import jscl.math.function.ArcTrigonometric;
-import jscl.math.function.Comparison;
-import jscl.math.function.Function;
-import jscl.math.function.Trigonometric;
+import android.content.Context;
+import android.content.SharedPreferences;
+import jscl.math.function.*;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.solovyev.android.calculator.R;
+import org.solovyev.common.definitions.IBuilder;
import org.solovyev.common.math.MathRegistry;
import org.solovyev.common.utils.CollectionsUtils;
@@ -22,7 +23,7 @@ import java.util.*;
* Date: 11/17/11
* Time: 11:28 PM
*/
-public class AndroidFunctionsMathRegistry extends AndroidMathRegistryImpl {
+public class AndroidFunctionsMathRegistry extends AbstractAndroidMathRegistry {
public static enum Category {
@@ -124,4 +125,40 @@ public class AndroidFunctionsMathRegistry extends AndroidMathRegistryImpl createBuilder(@NotNull AFunction entity) {
+ return new CustomFunction.Builder(entity.getName(), entity.getParameterNamesAsArray(), entity.getContent());
+ }
+
+ @NotNull
+ @Override
+ protected Class extends MathEntityPersistenceContainer> getPersistenceContainerClass() {
+ return Functions.class;
+ }
+
+ @Override
+ protected Integer getPreferenceStringId() {
+ return R.string.p_calc_functions;
+ }
+
+ @Override
+ protected AFunction transform(@NotNull Function entity) {
+ if (entity instanceof CustomFunction) {
+ final AFunction result = new AFunction();
+ result.setName(entity.getName());
+ result.setContent(((CustomFunction) entity).getContent());
+ result.setParameterNames(((CustomFunction) entity).getParameterNames());
+ return result;
+ } else {
+ return null;
+ }
+ }
+
+ @NotNull
+ @Override
+ protected MathEntityPersistenceContainer createPersistenceContainer() {
+ return new Functions();
+ }
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistry.java b/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistry.java
index 8d898582..4f174a7c 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistry.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistry.java
@@ -7,6 +7,7 @@
package org.solovyev.android.calculator.model;
import android.content.Context;
+import android.content.SharedPreferences;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.common.math.MathEntity;
@@ -24,4 +25,8 @@ public interface AndroidMathRegistry extends MathRegistry<
@Nullable
String getCategory(@NotNull T mathEntity);
+
+ void load(@Nullable Context context, @Nullable SharedPreferences preferences);
+
+ void save(@NotNull Context context);
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java b/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java
deleted file mode 100644
index ae7135e6..00000000
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.calculator.model;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.view.prefs.ResourceCache;
-import org.solovyev.common.definitions.IBuilder;
-import org.solovyev.common.math.MathEntity;
-import org.solovyev.common.math.MathRegistry;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: serso
- * Date: 10/30/11
- * Time: 1:03 AM
- */
-public abstract class AndroidMathRegistryImpl implements AndroidMathRegistry {
-
- @NotNull
- private final MathRegistry functionsRegistry;
-
- @NotNull
- private final String prefix;
-
- protected AndroidMathRegistryImpl(@NotNull MathRegistry functionsRegistry, @NotNull String prefix) {
- this.functionsRegistry = functionsRegistry;
- this.prefix = prefix;
- }
-
- @NotNull
- protected abstract Map getSubstitutes();
-
- @Nullable
- @Override
- public String getDescription(@NotNull Context context, @NotNull String mathEntityName) {
- final String stringName;
-
- final Map substitutes = getSubstitutes();
- final String substitute = substitutes.get(mathEntityName);
- if (substitute == null) {
- stringName = prefix + mathEntityName;
- } else {
- stringName = prefix + substitute;
- }
-
- return ResourceCache.instance.getCaption(stringName);
- }
-
- @NotNull
- @Override
- public List getEntities() {
- return functionsRegistry.getEntities();
- }
-
- @NotNull
- @Override
- public List getSystemEntities() {
- return functionsRegistry.getSystemEntities();
- }
-
- @Override
- public T add(@NotNull IBuilder extends T> IBuilder) {
- return functionsRegistry.add(IBuilder);
- }
-
- @Override
- public void remove(@NotNull T var) {
- functionsRegistry.remove(var);
- }
-
- @NotNull
- @Override
- public List getNames() {
- return functionsRegistry.getNames();
- }
-
- @Override
- public boolean contains(@NotNull String name) {
- return functionsRegistry.contains(name);
- }
-
- @Override
- public T get(@NotNull String name) {
- return functionsRegistry.get(name);
- }
-
- @Override
- public T getById(@NotNull Integer id) {
- return functionsRegistry.getById(id);
- }
-}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidOperatorsMathRegistry.java b/src/main/java/org/solovyev/android/calculator/model/AndroidOperatorsMathRegistry.java
index 79b37cf2..a4fb8050 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidOperatorsMathRegistry.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidOperatorsMathRegistry.java
@@ -6,8 +6,12 @@
package org.solovyev.android.calculator.model;
+import android.content.Context;
+import android.content.SharedPreferences;
import jscl.math.operator.Operator;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.solovyev.common.definitions.IBuilder;
import org.solovyev.common.math.MathRegistry;
import java.util.HashMap;
@@ -18,7 +22,7 @@ import java.util.Map;
* Date: 11/17/11
* Time: 11:29 PM
*/
-public class AndroidOperatorsMathRegistry extends AndroidMathRegistryImpl {
+public class AndroidOperatorsMathRegistry extends AbstractAndroidMathRegistry {
@NotNull
private static final Map substitutes = new HashMap();
@@ -48,4 +52,42 @@ public class AndroidOperatorsMathRegistry extends AndroidMathRegistryImpl createBuilder(@NotNull MathPersistenceEntity entity) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @NotNull
+ @Override
+ protected Class extends MathEntityPersistenceContainer> getPersistenceContainerClass() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected Integer getPreferenceStringId() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public void save(@NotNull Context context) {
+ // not supported yet
+ }
+
+ @Override
+ protected MathPersistenceEntity transform(@NotNull Operator entity) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @NotNull
+ @Override
+ protected MathEntityPersistenceContainer createPersistenceContainer() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidPostfixFunctionsRegistry.java b/src/main/java/org/solovyev/android/calculator/model/AndroidPostfixFunctionsRegistry.java
index 58075907..ecb7157b 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidPostfixFunctionsRegistry.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidPostfixFunctionsRegistry.java
@@ -6,8 +6,12 @@
package org.solovyev.android.calculator.model;
+import android.content.Context;
+import android.content.SharedPreferences;
import jscl.math.operator.Operator;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.solovyev.common.definitions.IBuilder;
import org.solovyev.common.math.MathRegistry;
import java.util.HashMap;
@@ -18,7 +22,7 @@ import java.util.Map;
* Date: 11/19/11
* Time: 1:48 PM
*/
-public class AndroidPostfixFunctionsRegistry extends AndroidMathRegistryImpl {
+public class AndroidPostfixFunctionsRegistry extends AbstractAndroidMathRegistry {
@NotNull
private static final Map substitutes = new HashMap();
@@ -47,4 +51,42 @@ public class AndroidPostfixFunctionsRegistry extends AndroidMathRegistryImpl createBuilder(@NotNull MathPersistenceEntity entity) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @NotNull
+ @Override
+ protected Class extends MathEntityPersistenceContainer> getPersistenceContainerClass() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected Integer getPreferenceStringId() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public void save(@NotNull Context context) {
+ // not supported yet
+ }
+
+ @Override
+ protected MathPersistenceEntity transform(@NotNull Operator entity) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @NotNull
+ @Override
+ protected MathEntityPersistenceContainer createPersistenceContainer() {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistry.java b/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistry.java
deleted file mode 100644
index 80b2b85e..00000000
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistry.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.calculator.model;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.R;
-import org.solovyev.common.utils.CollectionsUtils;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * User: serso
- * Date: 10/6/11
- * Time: 9:31 PM
- */
-public interface AndroidVarsRegistry extends AndroidMathRegistry{
-
- public static enum Category {
-
- system(R.string.c_var_system, 100){
- @Override
- boolean isInCategory(@NotNull Var var) {
- return var.isSystem();
- }
- },
-
- my(R.string.c_var_my, 0) {
- @Override
- boolean isInCategory(@NotNull Var var) {
- return !var.isSystem();
- }
- };
-
- private final int captionId;
-
- private final int tabOrder;
-
- Category(int captionId, int tabOrder) {
- this.captionId = captionId;
- this.tabOrder = tabOrder;
- }
-
- public int getCaptionId() {
- return captionId;
- }
-
- abstract boolean isInCategory(@NotNull Var var);
-
- @NotNull
- public static List getCategoriesByTabOrder() {
- final List result = CollectionsUtils.asList(Category.values());
-
- Collections.sort(result, new Comparator() {
- @Override
- public int compare(Category category, Category category1) {
- return category.tabOrder - category1.tabOrder;
- }
- });
-
- return result;
- }
- }
-
- void load(@Nullable Context context, @Nullable SharedPreferences preferences);
-
- void save(@NotNull Context context);
-}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java b/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
index c6267e4c..96dfb8bb 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
@@ -15,92 +15,41 @@ import org.jetbrains.annotations.Nullable;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import org.solovyev.android.calculator.R;
-import org.solovyev.android.calculator.math.MathType;
import org.solovyev.common.definitions.IBuilder;
import org.solovyev.common.math.MathRegistry;
import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
/**
* User: serso
* Date: 9/29/11
* Time: 4:57 PM
*/
-class AndroidVarsRegistryImpl implements AndroidVarsRegistry {
+class AndroidVarsRegistryImpl extends AbstractAndroidMathRegistry {
@NotNull
- private final MathRegistry mathRegistry;
+ private static final Map substitutes = new HashMap();
+ static {
+ substitutes.put("π", "pi");
+ substitutes.put("∞", "inf");
+ substitutes.put("h", "h_reduced");
+ substitutes.put("NaN", "nan");
+ }
protected AndroidVarsRegistryImpl(@NotNull MathRegistry mathRegistry) {
- this.mathRegistry = mathRegistry;
+ super(mathRegistry, "c_var_description_");
+ }
+
+ @NotNull
+ @Override
+ protected Map getSubstitutes() {
+ return substitutes;
}
public synchronized void load(@Nullable Context context, @Nullable SharedPreferences preferences) {
-
- if (context != null && preferences != null) {
- final String value = preferences.getString(context.getString(R.string.p_calc_vars), null);
- if (value != null) {
- final Serializer serializer = new Persister();
- try {
- final Vars vars = serializer.read(Vars.class, value);
- for (Var var : vars.getVars()) {
- if (!contains(var.getName())) {
- add(new Var.Builder(var));
- }
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
-
-
- for (String systemVarName : MathType.constants) {
-
- final Var.Builder builder;
- final Integer varDescription;
-
- if (systemVarName.equals(MathType.E)) {
- builder = createBuilder(systemVarName, String.valueOf(Math.E));
- varDescription = R.string.c_e_description;
- } else if (systemVarName.equals(MathType.PI)) {
- builder = createBuilder(systemVarName, String.valueOf(Math.PI));
- varDescription = R.string.c_pi_description;
- } else if (systemVarName.equals(MathType.C)) {
- builder = createBuilder(systemVarName, String.valueOf(MathType.C_VALUE));
- varDescription = R.string.c_c_description;
- } else if (systemVarName.equals(MathType.G)) {
- builder = createBuilder(systemVarName, String.valueOf(MathType.G_VALUE));
- varDescription = R.string.c_g_description;
- /* } else if (systemVarName.equals(MathType.H)) {
- builder = new Var.Builder(systemVarName, MathType.H_VALUE);
- varDescription = R.string.c_h_description;*/
- } else if (systemVarName.equals(MathType.H_REDUCED)) {
- builder = createBuilder(systemVarName, String.valueOf(MathType.H_REDUCED_VALUE));
- varDescription = R.string.c_h_reduced_description;
- } else if (systemVarName.equals(MathType.IMAGINARY_NUMBER)) {
- builder = createBuilder(systemVarName, MathType.IMAGINARY_NUMBER_JSCL);
- varDescription = R.string.c_i_description;
- } else if (systemVarName.equals(MathType.NAN)) {
- builder = createBuilder(systemVarName, MathType.NAN);
- varDescription = R.string.c_nan_description;
- } else if (systemVarName.equals(MathType.INFINITY)) {
- builder = createBuilder(systemVarName, MathType.INFINITY_JSCL);
- varDescription = R.string.c_infinity_description;
- } else {
- throw new IllegalArgumentException(systemVarName + " is not supported yet!");
- }
-
- builder.setSystem(true);
-
- if (context != null) {
- builder.setDescription(context.getString(varDescription));
- }
-
- add(builder);
- }
+ super.load(context, preferences);
tryToAddAuxVar("x");
tryToAddAuxVar("y");
@@ -114,140 +63,59 @@ class AndroidVarsRegistryImpl implements AndroidVarsRegistry {
}*/
}
+
+ @NotNull
+ @Override
+ protected IBuilder extends IConstant> createBuilder(@NotNull Var entity) {
+ return new Var.Builder(entity);
+ }
+
+ @NotNull
+ @Override
+ protected Class extends MathEntityPersistenceContainer> getPersistenceContainerClass() {
+ return Vars.class;
+ }
+
+ @NotNull
+ @Override
+ protected MathEntityPersistenceContainer createPersistenceContainer() {
+ return new Vars();
+ }
+
+ @NotNull
+ protected Integer getPreferenceStringId() {
+ return R.string.p_calc_vars;
+ }
+
private void tryToAddAuxVar(@NotNull String name) {
if ( !contains(name) ) {
add(new Var.Builder(name, (String)null));
}
}
- private Var.Builder createBuilder(@NotNull String varName, @NotNull String varValue) {
- final Var.Builder result;
-
- final IConstant varFromRegistry = mathRegistry.get(varName);
- if (varFromRegistry == null) {
- result = new Var.Builder(varName, varValue);
- } else {
- result = new Var.Builder(varFromRegistry);
- }
-
- return result;
- }
-
- @Override
- public synchronized void save(@NotNull Context context) {
- final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
- final SharedPreferences.Editor editor = settings.edit();
-
- final Vars vars = new Vars();
- for (Var var : this.getEntities()) {
- if (!var.isSystem()) {
- vars.getVars().add(var);
- }
- }
-
- final StringWriter sw = new StringWriter();
- final Serializer serializer = new Persister();
- try {
- serializer.write(vars, sw);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- editor.putString(context.getString(R.string.p_calc_vars), sw.toString());
-
- editor.commit();
- }
-
@NotNull
@Override
- public List getEntities() {
- final List result = new ArrayList();
- for (IConstant iConstant : mathRegistry.getEntities()) {
- result.add(transform(iConstant));
- }
- return result;
- }
-
- @NotNull
- @Override
- public List getSystemEntities() {
- final List result = new ArrayList();
- for (IConstant iConstant : mathRegistry.getSystemEntities()) {
- result.add(transform(iConstant));
- }
- return result;
- }
-
- @Override
- public Var add(@NotNull IBuilder extends Var> IBuilder) {
- IConstant result = mathRegistry.add(IBuilder);
- if (result instanceof Var) {
- return (Var) result;
- } else if (result != null) {
- return transform(result);
+ protected Var transform(@NotNull IConstant entity) {
+ if (entity instanceof Var) {
+ return (Var) entity;
} else {
- return null;
- }
- }
-
- @NotNull
- private Var transform(@NotNull IConstant result) {
- return new Var.Builder(result).create();
- }
-
- @Override
- public void remove(@NotNull Var var) {
- mathRegistry.remove(var);
- }
-
- @NotNull
- @Override
- public List getNames() {
- return mathRegistry.getNames();
- }
-
- @Override
- public boolean contains(@NotNull String name) {
- return mathRegistry.contains(name);
- }
-
- @Override
- public Var get(@NotNull String name) {
- IConstant result = mathRegistry.get(name);
- if (result instanceof Var) {
- return (Var) result;
- } else if (result != null) {
- return transform(result);
- } else {
- return null;
+ return new Var.Builder(entity).create();
}
}
@Override
- public Var getById(@NotNull Integer id) {
- final IConstant result = mathRegistry.getById(id);
- if (result instanceof Var) {
- return (Var) result;
- } else if (result != null) {
- return transform(result);
- } else {
- return null;
- }
- }
-
- @Override
public String getDescription(@NotNull Context context, @NotNull String mathEntityName) {
- final Var var = get(mathEntityName);
- if (var != null) {
+ final IConstant var = get(mathEntityName);
+ if (var != null && !var.isSystem()) {
return var.getDescription();
} else {
- return null;
+ return super.getDescription(context, mathEntityName);
}
}
@Override
- public String getCategory(@NotNull Var var) {
- for (Category category : Category.values()) {
+ public String getCategory(@NotNull IConstant var) {
+ for (VarCategory category : VarCategory.values()) {
if ( category.isInCategory(var) ) {
return category.name();
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java b/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
index 9a5afa82..6ca6da8a 100644
--- a/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
+++ b/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
@@ -10,6 +10,7 @@ import android.content.SharedPreferences;
import jscl.*;
import jscl.math.Generic;
import jscl.math.function.Function;
+import jscl.math.function.IConstant;
import jscl.math.operator.Operator;
import jscl.text.ParseInterruptedException;
import org.jetbrains.annotations.NotNull;
@@ -64,7 +65,7 @@ public enum CalculatorEngine {
public final TextProcessor preprocessor = new ToJsclTextProcessor();
@NotNull
- private final AndroidVarsRegistry varsRegister = new AndroidVarsRegistryImpl(engine.getConstantsRegistry());
+ private final AndroidMathRegistry varsRegister = new AndroidVarsRegistryImpl(engine.getConstantsRegistry());
@NotNull
private final AndroidMathRegistry functionsRegistry = new AndroidFunctionsMathRegistry(engine.getFunctionsRegistry());
@@ -304,7 +305,7 @@ public enum CalculatorEngine {
}
@NotNull
- public AndroidVarsRegistry getVarsRegister() {
+ public AndroidMathRegistry getVarsRegister() {
return varsRegister;
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/Functions.java b/src/main/java/org/solovyev/android/calculator/model/Functions.java
new file mode 100644
index 00000000..35ae2b76
--- /dev/null
+++ b/src/main/java/org/solovyev/android/calculator/model/Functions.java
@@ -0,0 +1,29 @@
+package org.solovyev.android.calculator.model;
+
+import jscl.math.function.CustomFunction;
+import jscl.math.function.Function;
+import jscl.math.function.IConstant;
+import org.simpleframework.xml.ElementList;
+import org.simpleframework.xml.Root;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * User: serso
+ * Date: 12/22/11
+ * Time: 5:15 PM
+ */
+@Root
+public class Functions implements MathEntityPersistenceContainer {
+
+ @ElementList(type = CustomFunction.class)
+ private List functions = new ArrayList();
+
+ public Functions() {
+ }
+
+ public List getEntities() {
+ return functions;
+ }
+}
diff --git a/src/main/java/org/solovyev/android/calculator/model/MathEntityPersistenceContainer.java b/src/main/java/org/solovyev/android/calculator/model/MathEntityPersistenceContainer.java
new file mode 100644
index 00000000..7406b223
--- /dev/null
+++ b/src/main/java/org/solovyev/android/calculator/model/MathEntityPersistenceContainer.java
@@ -0,0 +1,12 @@
+package org.solovyev.android.calculator.model;
+
+import java.util.List;
+
+/**
+ * User: serso
+ * Date: 12/22/11
+ * Time: 5:03 PM
+ */
+public interface MathEntityPersistenceContainer {
+ public List getEntities();
+}
diff --git a/src/main/java/org/solovyev/android/calculator/model/MathPersistenceEntity.java b/src/main/java/org/solovyev/android/calculator/model/MathPersistenceEntity.java
new file mode 100644
index 00000000..abf4e48f
--- /dev/null
+++ b/src/main/java/org/solovyev/android/calculator/model/MathPersistenceEntity.java
@@ -0,0 +1,14 @@
+package org.solovyev.android.calculator.model;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * User: serso
+ * Date: 12/22/11
+ * Time: 5:27 PM
+ */
+public interface MathPersistenceEntity {
+
+ @NotNull
+ String getName();
+}
diff --git a/src/main/java/org/solovyev/android/calculator/model/PreparedExpression.java b/src/main/java/org/solovyev/android/calculator/model/PreparedExpression.java
index 820ae664..879b99f0 100644
--- a/src/main/java/org/solovyev/android/calculator/model/PreparedExpression.java
+++ b/src/main/java/org/solovyev/android/calculator/model/PreparedExpression.java
@@ -6,6 +6,7 @@
package org.solovyev.android.calculator.model;
+import jscl.math.function.IConstant;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -21,9 +22,9 @@ public class PreparedExpression implements CharSequence{
private String expression;
@NotNull
- private List undefinedVars;
+ private List undefinedVars;
- public PreparedExpression(@NotNull String expression, @NotNull List undefinedVars) {
+ public PreparedExpression(@NotNull String expression, @NotNull List undefinedVars) {
this.expression = expression;
this.undefinedVars = undefinedVars;
}
@@ -38,7 +39,7 @@ public class PreparedExpression implements CharSequence{
}
@NotNull
- public List getUndefinedVars() {
+ public List getUndefinedVars() {
return undefinedVars;
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java b/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
index 2e764b8b..6b46a57d 100644
--- a/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
+++ b/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
@@ -6,6 +6,7 @@
package org.solovyev.android.calculator.model;
+import jscl.math.function.IConstant;
import org.jetbrains.annotations.NotNull;
import org.solovyev.android.calculator.StartsWithFinder;
import org.solovyev.android.calculator.math.MathType;
@@ -22,10 +23,10 @@ class ToJsclTextProcessor implements TextProcessor {
@Override
@NotNull
public PreparedExpression process(@NotNull String s) throws CalculatorParseException {
- return processWithDepth(s, 0, new ArrayList());
+ return processWithDepth(s, 0, new ArrayList());
}
- private static PreparedExpression processWithDepth(@NotNull String s, int depth, @NotNull List undefinedVars) throws CalculatorParseException {
+ private static PreparedExpression processWithDepth(@NotNull String s, int depth, @NotNull List undefinedVars) throws CalculatorParseException {
return replaceVariables(processExpression(s).toString(), depth, undefinedVars);
}
@@ -69,7 +70,7 @@ class ToJsclTextProcessor implements TextProcessor {
}
@NotNull
- private static PreparedExpression replaceVariables(@NotNull final String s, int depth, @NotNull List undefinedVars) throws CalculatorParseException {
+ private static PreparedExpression replaceVariables(@NotNull final String s, int depth, @NotNull List undefinedVars) throws CalculatorParseException {
if (depth >= MAX_DEPTH) {
throw new CalculatorParseException(Messages.msg_6, s);
} else {
@@ -89,7 +90,7 @@ class ToJsclTextProcessor implements TextProcessor {
if (operatorName == null) {
String varName = CollectionsUtils.find(CalculatorEngine.instance.getVarsRegister().getNames(), startsWithFinder);
if (varName != null) {
- final Var var = CalculatorEngine.instance.getVarsRegister().get(varName);
+ final IConstant var = CalculatorEngine.instance.getVarsRegister().get(varName);
if (var != null) {
if (!var.isDefined()) {
undefinedVars.add(var);
diff --git a/src/main/java/org/solovyev/android/calculator/model/Var.java b/src/main/java/org/solovyev/android/calculator/model/Var.java
index 8d75275f..f561a75a 100644
--- a/src/main/java/org/solovyev/android/calculator/model/Var.java
+++ b/src/main/java/org/solovyev/android/calculator/model/Var.java
@@ -25,7 +25,7 @@ import org.solovyev.common.utils.StringUtils;
*/
@Root
-public class Var implements IConstant {
+public class Var implements IConstant, MathPersistenceEntity {
@Transient
private Integer id;
@@ -225,17 +225,7 @@ public class Var implements IConstant {
@Override
public String toString() {
- final Double doubleValue = getDoubleValue();
- if (doubleValue == null) {
- final String stringValue = getValue();
- if (!StringUtils.isEmpty(stringValue)) {
- return getName() + " = " + stringValue;
- } else {
- return getName();
- }
- } else {
- return getName() + " = " + doubleValue;
- }
+ return ExtendedConstant.toString(this);
}
@Override
diff --git a/src/main/java/org/solovyev/android/calculator/model/VarCategory.java b/src/main/java/org/solovyev/android/calculator/model/VarCategory.java
new file mode 100644
index 00000000..9914e4f2
--- /dev/null
+++ b/src/main/java/org/solovyev/android/calculator/model/VarCategory.java
@@ -0,0 +1,61 @@
+package org.solovyev.android.calculator.model;
+
+import jscl.math.function.IConstant;
+import org.jetbrains.annotations.NotNull;
+import org.solovyev.android.calculator.R;
+import org.solovyev.common.utils.CollectionsUtils;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+* User: serso
+* Date: 12/22/11
+* Time: 4:25 PM
+*/
+public enum VarCategory {
+
+ system(R.string.c_var_system, 100){
+ @Override
+ boolean isInCategory(@NotNull IConstant var) {
+ return var.isSystem();
+ }
+ },
+
+ my(R.string.c_var_my, 0) {
+ @Override
+ boolean isInCategory(@NotNull IConstant var) {
+ return !var.isSystem();
+ }
+ };
+
+ private final int captionId;
+
+ private final int tabOrder;
+
+ VarCategory(int captionId, int tabOrder) {
+ this.captionId = captionId;
+ this.tabOrder = tabOrder;
+ }
+
+ public int getCaptionId() {
+ return captionId;
+ }
+
+ abstract boolean isInCategory(@NotNull IConstant var);
+
+ @NotNull
+ public static List getCategoriesByTabOrder() {
+ final List result = CollectionsUtils.asList(VarCategory.values());
+
+ Collections.sort(result, new Comparator() {
+ @Override
+ public int compare(VarCategory category, VarCategory category1) {
+ return category.tabOrder - category1.tabOrder;
+ }
+ });
+
+ return result;
+ }
+}
diff --git a/src/main/java/org/solovyev/android/calculator/model/Vars.java b/src/main/java/org/solovyev/android/calculator/model/Vars.java
index 9e7b866a..edd94ffb 100644
--- a/src/main/java/org/solovyev/android/calculator/model/Vars.java
+++ b/src/main/java/org/solovyev/android/calculator/model/Vars.java
@@ -1,5 +1,6 @@
package org.solovyev.android.calculator.model;
+import jscl.math.function.IConstant;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@@ -13,15 +14,15 @@ import java.util.List;
*/
@Root
-public class Vars {
+public class Vars implements MathEntityPersistenceContainer {
- @ElementList
+ @ElementList(type = Var.class)
private List vars = new ArrayList();
public Vars() {
}
- public List getVars() {
+ public List getEntities() {
return vars;
}
}
diff --git a/src/test/java/org/solovyev/android/calculator/model/VarTest.java b/src/test/java/org/solovyev/android/calculator/model/VarTest.java
index cc17a44d..3b4f0435 100644
--- a/src/test/java/org/solovyev/android/calculator/model/VarTest.java
+++ b/src/test/java/org/solovyev/android/calculator/model/VarTest.java
@@ -6,6 +6,7 @@
package org.solovyev.android.calculator.model;
+import jscl.math.function.IConstant;
import junit.framework.Assert;
import org.junit.Test;
import org.simpleframework.xml.Serializer;
@@ -40,9 +41,9 @@ public class VarTest {
public void testXml() throws Exception {
final Vars vars = new Vars();
Var first = new Var.Builder("e", Math.E).setDescription("description").setSystem(true).create();
- vars.getVars().add(first);
+ vars.getEntities().add(first);
Var second = new Var.Builder(";", 3d).setSystem(true).create();
- vars.getVars().add(second);
+ vars.getEntities().add(second);
final StringWriter sw = new StringWriter();
final Serializer serializer = new Persister();
@@ -50,17 +51,16 @@ public class VarTest {
Assert.assertEquals(xml, sw.toString());
-
final Vars result = serializer.read(Vars.class, xml);
- final Var actualFirst = result.getVars().get(0);
- final Var actualSecond = result.getVars().get(1);
+ final IConstant actualFirst = result.getEntities().get(0);
+ final IConstant actualSecond = result.getEntities().get(1);
areEqual(first, actualFirst);
areEqual(second, actualSecond);
}
- private void areEqual(Var expected, Var actual) {
+ private void areEqual(IConstant expected, IConstant actual) {
Assert.assertEquals(expected.getName(), actual.getName());
Assert.assertEquals(expected.getDescription(), actual.getDescription());
Assert.assertEquals(expected.getValue(), actual.getValue());