From d888d2dd47577187bfb9b133a23e3d93a2731365 Mon Sep 17 00:00:00 2001 From: Sergey Solovyev Date: Sat, 10 Dec 2011 23:18:04 +0400 Subject: [PATCH] new version + language added + refactor --- AndroidManifest.xml | 4 +- res/values-es/strings.xml | 303 ++++++++++++++++++ res/values-it/strings.xml | 3 +- res/values-ru/strings.xml | 9 +- res/values/strings.xml | 9 +- .../calculator/CalculatorActivity.java | 9 +- .../android/calculator/CalculatorEditor.java | 17 +- .../android/calculator/CalculatorModel.java | 12 +- .../android/calculator/RClassUtils.java | 55 ---- .../model/AndroidMathRegistryImpl.java | 21 +- .../android/view/prefs/ResourceCache.java | 73 ++++- .../android/view/widgets/ColorButton.java | 3 +- 12 files changed, 409 insertions(+), 109 deletions(-) create mode 100644 res/values-es/strings.xml delete mode 100644 src/main/java/org/solovyev/android/calculator/RClassUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 32630cd4..53182fda 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3,8 +3,8 @@ + a:versionCode="17" + a:versionName="1.2.17"> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml new file mode 100644 index 00000000..bd484c7e --- /dev/null +++ b/res/values-es/strings.xml @@ -0,0 +1,303 @@ + + + Calculadora++ + Calc++ + Configuración + Error + Resultado copiado al Portapapeles! + Configuración + Ayuda + Acerca de + Variables y Constantes + + Ajustes principales + Ajustes de Cálculo + Ajustes de apariencia + Configuración del deslizamiento de los botones + + + Calibración del deslizamiento de los botones + Permite calibrar el comportamiento del deslizamiento de los botones + Abajo + Arriba + Reiniciar + + + Copyright (c) 2009-2011\n\nCreado por serso aka se.solovyev\n\n + Este programa es Open Source:\n + Todo el código fuente puede encontrarse en\n + http://github.com\n\n + Para más información, por favor,\n + contacte con el autor al mail\n + se.solovyev@gmail.com\n + o visite\n + http://se.solovyev.org\n\n + Si desea apoyar el proyecto,\n + puede hacer una donación vía\n + \n + http://paypal.com + \n\n + Si le gusta la aplicación\n + valórela con 5 estrellas en\n + android.market\n\n + Gracias a las personas que han traducido Calculadora++ a los diferentes idiomas:\n + Español - Jordi Luna\n + Italiano - Gabriele Ravanetti\n\n + Esta aplicación utiliza las siguiente librerías Open Source:\n + Simple (XML serialization)\n + JSCL\n + AChartEngine + + + deshacer + rehacer + C + borrar + pegar + vars + Resaltar expresiones + Redondear resultado + Activar redondeo del resultado + Precisión del resultado + Salir + Añadir + Cancelar + Grabar + Borrar + Si + No + Confirmación de Borrado + ¿Realmente desea borrar la variable \'%s\'? + Nombre + Valor + Descripción + Crear variable + Editar variable + ¡El valor debe ser numérico o estar vacío! + La variable name entra en conflicto con la función name! + ¡Ya existe una variable con el mismo nombre! + El nombre de la Constante no es válido: el nombre debe comenzar con una letra,puede contener letras, dígitos y líneas. + ¡Una Variable de Sistema no puede ser cambiada! + Ratio de la circunferencia del círculo a su diámetro + Número real único como el valor de la derivada (pendiente de la línea tangente) de la función f(x) = e^x en el punto x = 0 es igual a 1 + Unidad imaginaria, definida como i^2 = −1 + Velocidad de la luz en vacío, m·s^-1 + La constante gravitatoria es una constante física empírica consistente en el cálculo de la atracción gravitatoria entre objetos con masa, m^3·kg^−1·s^−2 + Constante física que refleja los tamaños de energía cuántica en mecánica cuántica, J·s + Constante Planck reducida, J·s + No es un número + Infinito + Introducir nuevo cálculo + Pulsar para copiar + Continuar + Donar + Puede dar las gracias por mail al autor de este programa\n\n + se.solovyev@gmail.com\n\n + donar dinero a través de\n\n + + http://paypal.com + \n\n + o evaluar el programa con 5 estrellas en\n\n + android.market\n + + Historial + M + ¡El Historial está vacío! + Historial + El caracter \'%s\' no es aceptado en la variable name! + Unidades de Ángulos + Grados + Radianes + Gradianes + Vueltas + Define la unidad para ángulos predeterminada. + Tema + Predeterminado + Violeta + Azul claro + Precisión del resultado (todos los cálculos se realizar con la máxima precisión a pesar del valor de esta opción) + Ajustar colores y estilo en el editor de la calculadora + Establecer el tema para la Calculadora + Limpiar historial + Las constantes siguientes no están definidas: {0}! + No usar separador de Grupos + Apóstrofe (\') + Espacio ( ) + Separador de Grupos + Establecer el separador de Grupos + Plantilla + Teléfono + Calculadora + Establecer la plantilla de los botones + Configurar vibración + Vibrar al pulsar un botón + Corto + Medio + Largo + Duración de la vibración + Duración de la vibración al pulsar un butón + Funciones + Función trigonométrica seno. + Función trigonométrica coseno. + Función trigonométrica tangente. + Función trigonométrica cotangente. + Arcseno - El inverso de la función seno. + Arccoseno - El inverso de la función coseno. + Arctangente - El inverso de la función tangente. + Arccotangente - El inverso de la función cotangente. + Logaritmo neperiano - logaritmo de base e. + Decadic logaritmo - logaritmo de base 10. + Función exponencial. + Función Raíz cuadrado. + Función Raíz cuadrada. + Función que devuelve el valor absoluto de un argumento. + Función que devuelve el signo de un argumento: -1 si el argumento es menor que 0, 0 si es igual a 0, 1 si es mayor que 0. + Función Igual - Devuelve 1 si dos argumentos son iguales, 0 si no lo son. + Función Menor o igual - Devuelve 1 si dos argumentos son iguales o el primero es menor que el segundo, 0 si el primero es mayor. + Función Mayor o igual - Devuelve 1 si dos argumentos son iguales o si el primero es mayor que el segundo, 0 si el primero es menor. + Función Distinto - Devuelve 1 si dos argumentos no son iguales, 0 si son idénticos. + Función Menor - Devuelve 1 si el primer argumento es menor que el segundo, 0 si no lo es. + Función Mayor - Devuelve 1 si el primer argumento es mayor que el segundo, 0 si no lo es. + Convierte grados a radianes: d - grados, m - minutos (por defecto = 0), s - segundos (por defecto = 0). + Convierte grados de notación DMS a notación decimal: d - grados, m - minutos (por defecto = 0), s - segundos (por defecto = 0). + Convierte radianes a grados. + No se puede crear una constante vacía! + El resultado actual no es válido! + Operadores + El módulo operación encuentra el resto de la división de \'x\' por \'y\'. + Función Suma \'f(i)\', iterativamente a través de \'i\' desde \'from\' hasta \'to\'. + Devuelve el producto de las funciones \'f(i)\', iterativamente a través de \'i\' desde \'from\' hasta \'to\'. + Devuelve el derivado de orden \'order\' (por defecto = 1) de funciones \'f(x)\' por \'x\' variable y calcula en el punto \'x_point\' (por defecto = el mismo que \'x\'). + Devuelve la integral de la función \'f(x)\' por \'x\' variable. + Función integral \'f(x)\' por \'x\' variable desde \'a\' hasta \'b\'. + Devuelve el factorial de la expresión antes. + Devuelve el valor porcentaje de la expresión antes.\n + Ejemplos:\n + 100 + 50% = 150\n + 100 * 50% = 50\n + 100 + 100 * 50% * 50% = 125\n + + Convierte Grados a Radianes.\n + Ejemplos:\n + 268° = 4.67748\n + 30.21° = 0.52726\n + + FAQ + Consejos + Pantallas + + ¿Como puedo utilizar las funciones indicadas en las esquinas superior e inferior derechas de los botones?\n\n + + Mantenga pulsado el botón y deslícelo ligeramente hacia arriba o abajo. En función del valor mostrado en el\n + botón se realizará la acción deseada.\n\n + + ¿Como puedo conmutar entre Radianes y Grados?\n\n + + Para conmutar entre las diferentes unidades de ángulo, puede ajustar la opción preferida en la configuración de\n + la aplicación\n + o bién utilizar el conmutador ubicado en el botón 6\n + (el valor actual está resaltado en color amarillo).\n + También puede utilizar las funciones deg() y rad() y el operador ° para convertir grados a radianes y viceversa.\n\n + + Ejemplos:\n + 268° = 4.67748\n + 30.21° = 0.52726\n + rad(30, 21, 0) = 0.52726\n + deg(4.67748) = 268\n\n + + ¿Soporta C+ %?\n\n + + Si, la función % puede encontrarse en la esquina superior derecha del botón / .\n\n + + Ejemplos:\n\n + + 100 + 50% = 150\n + 100 * 50% = 50\n + 100 + 100 * 50% * 50% = 125\n + 100 + (100 * 50% * (25 + 25)% + 100%) = 150\n\n + + Nota:\n\n + + 100 + (20 + 20)% = 140,\n + pero\n + 100+ (20% + 20%) = 124.0\n + 100 + 50% ^ 2 = 2600,\n + pero\n + 100 + 50 ^ 2% = 101.08\n\n + + ¿Soporta C+ cálculos fraccionarios?\n\n + + Si, puede teclear la expresión fraccionaria en el editor y utilizar ≡ (en la esquina superior derecha del botón\n + = ). También puede utilizar ≡ para simplificar la expresión.\n\n + + Ejemplos:\n\n + + 2/3 + 5/9 ≡ 11/9\n + 2/9 + 3/123 ≡ 91/369\n + (6 - t) ^ 3 ≡ 216 - 108t + 18t ^ 2 - t ^ 3\n\n + + ¿Soporta C+ cálculos complejos?\n\n + + Si, simplemente introduzca la expresión compleja (utilizando i o √(-1) como número imaginario).\n\n + + Ejemplos:\n\n + + (2i + 1) ^ = -3 + 4i\n + e ^ i = 0.5403 + 0.84147i\n\n + + ¿Puede C+ dibujar gráficas de las funciones?\n\n + + No, actualmente C+ no puede dibujar gráficas.\n\n + + ¿Soporta C+ cálculos matriciales?\n\n + + No, no los soporta.\n\n + + ¿Porqué obtengo 1.76732452452345E-17 en lugar de 0?\n\n + + Compruebe la opción \'Redondear resultado\' en la configuración de la aplicación - debe activarla.\n + + 1. Puede omitir signos de multiplicación innecesarios (en lugar de 3*t o t*sin(π*t)simplemente escriba 3t o tsin(πt))\n\n + + 2. Utilice ≡ (en la esquina superior derecha del botón = ) para simplificar la expresión\n\n + + 3. Haga clic en el resultado para copiarlo al portapapeles\n\n + + 4. Raravez deberá utilizar el botón = ya que el resultado se va calculando automáticamente conforme introduce las funciones\n\n + + 5. Añada constantes para los valores usados habitualmente (incluso puede grabar expresiones)\n\n + + 6. Utilice las variables ubicadas en los botones 4 y 5\n\n + + + 1. + Pantalla principal: + Se muestra al inicio de la aplicación. Puede llegar a ella desde otra pantalla pulsando el botón Atrás.\n\n + + 2. + Pantalla de Variables y Constantes: + contiene una lista de las constantes disponibles. Puede añadir más constantes y variables haciendo clic en el + botón Añadir. Un Clic corto en variable/constante la inserta en el editor, Clic largo - abre la ventana del + editor de variables. Puede llegar a ella desde la pantalla principal pulsando el botón π,… .\n\n + + 3. + Pantalla de Funciones: + contiene una lista de todas las funciones disponibles. Un Clic corto en la función la inserta en el editor. + Puede llegar a ella desde la pantalla principal pulsando el botón f(x).\n\n + + 4. + Pantalla de Operadores: + contiene una lista de todos los operadores disponibles. Un Clic corto en el operador lo inserta en el editor. + Puede llegar a él desde la pantalla principal pulsando el botón ∂,… .\n\n + + 5. + Pantalla de Historial: + contiene una lista de todas las acciones realizadas por el usuario. Un Clic corto en el elemento Historial lo + inserta en el editor. Puede llegar a él desde la pantalla principal pulsando el botón M .\n\n + + 6. + Pantalla de Configuración: + contiene los ajustes de la aplicación. Puede llegar a él desde la pantalla principal seleccionando la opción + Configuración del menú.\n\n + + \ No newline at end of file diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index ef565c49..b8549f57 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -43,7 +43,6 @@ annulla rifai - CE cancella incolla vars @@ -255,7 +254,7 @@ Controlla l\'opzione \'Arrotonda risultato\' nelle impostazioni dell\'applicazio 2. Utilizza = (nell\'angolo in alto a destra del pulsante = ) per semplificare l\'espressione\n\n 3. Basta fare click sul risultato per copiarlo negli appunti\n\n 4. Usa raramente il pulsante = - il risultato è calcolato in tempo reale\n\n -4. Aggiungi costanti per i valori usati spesso (è possibile salvare anche le espressioni)\n\n +5. Aggiungi costanti per i valori usati spesso (è possibile salvare anche le espressioni)\n\n diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index bf20fde7..8df3ee26 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -29,7 +29,8 @@ Если вы хотите поддержать проект материально\nвы можете сделать это через \nhttp://paypal.com\n\n Если вам понравилось приложение -\nпоставьте 5 звёздочек в\nандроид.маркете\n\n Спасибо тем, кто переводил Калькулятор++:\n - на итальянский - Gabriele Ravanetti\n\n + на итальянский - Gabriele Ravanetti\n + на испанский - Jordi Luna\т\n Это приложение использует следующие открытые библиотеки:\n Simple (XML serialization)\n JSCL\n @@ -104,7 +105,7 @@ Обороты Устанавливает единицы измерения углов. - Системы счичления + Системы счисления Устанавливает систему счисления для всех вводимых чисел. Десятичная Шестнадцатеричная @@ -264,8 +265,8 @@ e ^ i = 0.5403 + 0.84147i\n 2. Используйте ≡ (в верхнем правом углу кнопки =) для упрощения выражения.\n\n 3. Нажмите на результат для того, чтобы скопировать его в буфер обмена.\n\n 4. Используйте кнопку = реже - результат вычисляется на лету.\n\n -4. Создайте константы для часто используемых значений (таким образом вы можете даже сохранять выражения). -5. Используйте переменные расположенные на 4 и 5 клавише.\n\n +5. Создайте константы для часто используемых значений (таким образом вы можете даже сохранять выражения). +6. Используйте переменные расположенные на 4 и 5 клавише.\n\n diff --git a/res/values/strings.xml b/res/values/strings.xml index c55ab36c..0c07a229 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -30,7 +30,8 @@ If you want to support the project\nyou can donate money via\nhttp://paypal.com\n\n If you like the application\nrank it with 5 stars in\nandroid.market\n\n Thanks to people who translate Calculator++ in different languages:\n - Italian - Gabriele Ravanetti\n\n + Italian - Gabriele Ravanetti\n + Spanish - Jordi Luna\n\n This application uses next open source libraries:\n Simple (XML serialization)\n JSCL\n @@ -39,7 +40,7 @@ undo redo - CE + C clear paste vars @@ -267,8 +268,8 @@ Check the \'Round result\' preference in application settings - it should be tur 2. Use ≡ (in the top right corner of = button) to simplify expression\n\n 3. Just click on the result to copy it to the clipboard\n\n 4. Use = button seldom - result is calculating on the fly\n\n -4. Add constants for often used values (you can even save expressions)\n\n -5. Use variables located on 4 and 5 buttons\n\n +5. Add constants for often used values (you can even save expressions)\n\n +6. Use variables located on 4 and 5 buttons\n\n diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java b/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java index 86e98354..73491017 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorActivity.java @@ -30,7 +30,6 @@ import org.solovyev.android.calculator.model.CalculatorEngine; import org.solovyev.android.view.FontSizeAdjuster; import org.solovyev.android.view.prefs.ResourceCache; import org.solovyev.android.view.widgets.*; -import org.solovyev.common.BooleanMapper; import org.solovyev.common.utils.Announcer; import org.solovyev.common.utils.Point2d; import org.solovyev.common.utils.history.HistoryAction; @@ -288,7 +287,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh private synchronized void setLayout(@NotNull SharedPreferences preferences) { - final Map layouts = RClassUtils.getCache(R.layout.class); + final Map layouts = ResourceCache.instance.getNameToIdCache(R.layout.class); layoutName = preferences.getString(getString(R.string.p_calc_layout_key), getString(R.string.p_calc_layout)); @@ -304,7 +303,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh } private synchronized void setTheme(@NotNull SharedPreferences preferences) { - final Map styles = RClassUtils.getCache(R.style.class); + final Map styles = ResourceCache.instance.getNameToIdCache(R.style.class); themeName = preferences.getString(getString(R.string.p_calc_theme_key), getString(R.string.p_calc_theme)); @@ -553,9 +552,5 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh CalculatorEngine.instance.reset(this, preferences); this.calculatorModel.evaluate(); } - - final Boolean colorExpressionsInBracketsDefault = new BooleanMapper().parseValue(this.getString(R.string.p_calc_color_display)); - assert colorExpressionsInBracketsDefault != null; - this.calculatorModel.getEditor().setHighlightText(preferences.getBoolean(this.getString(R.string.p_calc_color_display_key), colorExpressionsInBracketsDefault)); } } \ No newline at end of file diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java b/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java index 73efc3bd..63c2c515 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorEditor.java @@ -6,6 +6,7 @@ package org.solovyev.android.calculator; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Color; import android.text.Html; import android.util.AttributeSet; @@ -22,7 +23,10 @@ import org.solovyev.android.calculator.model.TextProcessor; * Date: 9/17/11 * Time: 12:25 AM */ -public class CalculatorEditor extends EditText { +public class CalculatorEditor extends EditText implements SharedPreferences.OnSharedPreferenceChangeListener { + + private static final String CALC_COLOR_DISPLAY_KEY = "org.solovyev.android.calculator.CalculatorModel_color_display"; + private static final boolean CALC_COLOR_DISPLAY_DEFAULT = true; private boolean highlightText = true; @@ -104,4 +108,15 @@ public class CalculatorEditor extends EditText { this.highlightText = highlightText; redraw(); } + + @Override + public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + if (CALC_COLOR_DISPLAY_KEY.equals(key)) { + this.setHighlightText(preferences.getBoolean(CALC_COLOR_DISPLAY_KEY, CALC_COLOR_DISPLAY_DEFAULT)); + } + } + + public void init(@NotNull SharedPreferences preferences) { + onSharedPreferenceChanged(preferences, CALC_COLOR_DISPLAY_KEY); + } } diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorModel.java b/src/main/java/org/solovyev/android/calculator/CalculatorModel.java index 522d7f16..d7e1c7c1 100644 --- a/src/main/java/org/solovyev/android/calculator/CalculatorModel.java +++ b/src/main/java/org/solovyev/android/calculator/CalculatorModel.java @@ -30,7 +30,6 @@ import org.solovyev.android.calculator.model.CalculatorParseException; import org.solovyev.android.calculator.model.Var; import org.solovyev.android.view.CursorControl; import org.solovyev.android.view.HistoryControl; -import org.solovyev.common.BooleanMapper; import org.solovyev.common.msg.Message; import org.solovyev.common.utils.CollectionsUtils; import org.solovyev.common.utils.MutableObject; @@ -66,10 +65,8 @@ public enum CalculatorModel implements CursorControl, HistoryControl, Map> caches = new HashMap, Map>(3); - - // not intended for instantiation - private RClassUtils() { - throw new AssertionError(); - } - - @NotNull - public static Map getCache(@NotNull Class clazz) { - Map result = caches.get(clazz); - - if (result == null) { - result = new HashMap(); - - for (Field field : clazz.getDeclaredFields()) { - int modifiers = field.getModifiers(); - if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) { - try { - result.put(field.getName(), field.getInt(R.style.class)); - } catch (IllegalAccessException e) { - Log.e(CalculatorActivity.class.getName(), e.getMessage()); - } - } - } - - caches.put(clazz, result); - } - - return result; - } -} diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java b/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java index 1ddb30d8..cdca7963 100644 --- a/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java +++ b/src/main/java/org/solovyev/android/calculator/model/AndroidMathRegistryImpl.java @@ -9,8 +9,7 @@ package org.solovyev.android.calculator.model; import android.content.Context; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.solovyev.android.calculator.R; -import org.solovyev.android.calculator.RClassUtils; +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; @@ -42,27 +41,17 @@ public abstract class AndroidMathRegistryImpl implements A @Nullable @Override public String getDescription(@NotNull Context context, @NotNull String name) { - final String result; - - final Map stringsCache = RClassUtils.getCache(R.string.class); - - final Integer stringId; + final String stringName; final Map substitutes = getSubstitutes(); final String substitute = substitutes.get(name); if (substitute == null) { - stringId = stringsCache.get(prefix + name); + stringName = prefix + name; } else { - stringId = stringsCache.get(prefix + substitute); + stringName = prefix + substitute; } - if (stringId != null) { - result = context.getString(stringId); - } else { - result = null; - } - - return result; + return ResourceCache.instance.getCaption(stringName); } @NotNull diff --git a/src/main/java/org/solovyev/android/view/prefs/ResourceCache.java b/src/main/java/org/solovyev/android/view/prefs/ResourceCache.java index 9dcf45fb..7a19ddba 100644 --- a/src/main/java/org/solovyev/android/view/prefs/ResourceCache.java +++ b/src/main/java/org/solovyev/android/view/prefs/ResourceCache.java @@ -30,6 +30,9 @@ public enum ResourceCache { instance; + @NotNull + private static final Locale DEFAULT_LOCALE = Locale.ENGLISH; + // ids of drag buttons in R.class private List dragButtonIds = null; @@ -44,6 +47,9 @@ public enum ResourceCache { private Context context; + @NotNull + private final NameToIdCache nameToIdCache = new NameToIdCache(); + public List getDragButtonIds() { return dragButtonIds; } @@ -54,7 +60,8 @@ public enum ResourceCache { /** * Method load captions for default locale using android R class - * @param context STATIC CONTEXT + * + * @param context STATIC CONTEXT * @param resourceClass class of captions in android (SUBCLASS of R class) */ public void initCaptions(@NotNull Context context, @NotNull Class resourceClass) { @@ -63,9 +70,10 @@ public enum ResourceCache { /** * Method load captions for specified locale using android R class - * @param context STATIC CONTEXT + * + * @param context STATIC CONTEXT * @param resourceClass class of captions in android (SUBCLASS of R class) - * @param locale language to be used for translation + * @param locale language to be used for translation */ public void initCaptions(@NotNull Context context, @NotNull Class resourceClass, @NotNull Locale locale) { assert this.resourceClass == null || this.resourceClass.equals(resourceClass); @@ -84,6 +92,8 @@ public enum ResourceCache { captionsByLanguage.put(field.getName(), context.getString(captionId)); } catch (IllegalAccessException e) { Log.e(ResourceCache.class.getName(), e.getMessage()); + } catch (Resources.NotFoundException e) { + Log.e(ResourceCache.class.getName(), "Caption with name " + field.getName() + " was not found for " + locale.getLanguage() + " language: " + e.getMessage()); } } } @@ -107,15 +117,15 @@ public enum ResourceCache { /** - * @param captionId id of caption to be translated - * @param locale language to be used for translation + * @param captionId id of caption to be translated + * @param locale language to be used for translation * @return translation by caption id in specified language, null if no translation in specified language present */ @Nullable public String getCaption(@NotNull String captionId, @NotNull final Locale locale) { Map captionsByLanguage = captions.get(locale.getLanguage()); if (captionsByLanguage != null) { - return captionsByLanguage.get(captionId); + return getCaption(captionsByLanguage, captionId, locale); } else { assert resourceClass != null && context != null; @@ -123,13 +133,22 @@ public enum ResourceCache { captionsByLanguage = captions.get(locale.getLanguage()); if (captionsByLanguage != null) { - return captionsByLanguage.get(captionId); + return getCaption(captionsByLanguage, captionId, locale); } } return null; } + @Nullable + private String getCaption(@NotNull Map captionsByLanguage, @NotNull String captionId, @NotNull Locale locale) { + String result = captionsByLanguage.get(captionId); + if (result == null && !locale.getLanguage().equals(DEFAULT_LOCALE.getLanguage())) { + result = getCaption(captionId, DEFAULT_LOCALE); + } + return result; + } + public void init(@NotNull Class resourceClass, @NotNull Activity activity) { dragButtonIds = new ArrayList(); buttonIds = new ArrayList(); @@ -152,4 +171,44 @@ public enum ResourceCache { } } } + + @NotNull + public Map getNameToIdCache(@NotNull Class clazz) { + return this.nameToIdCache.getCache(clazz); + } + + private static class NameToIdCache { + + @NotNull + private final Map, Map> caches = new HashMap, Map>(3); + + // not intended for instantiation + private NameToIdCache() { + } + + @NotNull + public Map getCache(@NotNull Class clazz) { + Map result = caches.get(clazz); + + if (result == null) { + result = new HashMap(); + + for (Field field : clazz.getDeclaredFields()) { + int modifiers = field.getModifiers(); + if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) { + try { + result.put(field.getName(), field.getInt(clazz)); + } catch (IllegalAccessException e) { + Log.e(CalculatorActivity.class.getName(), e.getMessage()); + } + } + } + + caches.put(clazz, result); + } + + return result; + } + } + } diff --git a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java b/src/main/java/org/solovyev/android/view/widgets/ColorButton.java index b9042726..bccafa51 100644 --- a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java +++ b/src/main/java/org/solovyev/android/view/widgets/ColorButton.java @@ -89,9 +89,10 @@ public class ColorButton extends Button { feedbackPaint.setStyle(Style.STROKE); feedbackPaint.setStrokeWidth(2); + if (CollectionsUtils.contains(getText().toString(), Arrays.asList("+", "-", "/", "×"))) { getPaint().setColor(resources.getColor(R.color.button_operator_text_color)); - } else if (getText().toString().equals("CE")) { + } else if (getText().toString().equals("C")) { getPaint().setColor(resources.getColor(R.color.button_ce_text_color)); } else { getPaint().setColor(resources.getColor(R.color.button_text_color));