new version + language added + refactor

This commit is contained in:
Sergey Solovyev 2011-12-10 23:18:04 +04:00
parent 25de9060bb
commit d888d2dd47
12 changed files with 409 additions and 109 deletions

View File

@ -3,8 +3,8 @@
<manifest xmlns:a="http://schemas.android.com/apk/res/android"
package="org.solovyev.android.calculator"
a:installLocation="auto"
a:versionCode="16"
a:versionName="1.1.16">
a:versionCode="17"
a:versionName="1.2.17">
<uses-permission a:name="android.permission.VIBRATE"/>

303
res/values-es/strings.xml Normal file
View File

@ -0,0 +1,303 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="c_app_name">Calculadora++</string>
<string name="c_app_icon_name">Calc++</string>
<string name="c_app_settings">Configuración</string>
<string name="c_syntax_error">Error</string>
<string name="c_result_copied">Resultado copiado al Portapapeles!</string>
<string name="c_settings">Configuración</string>
<string name="c_help">Ayuda</string>
<string name="c_about">Acerca de</string>
<string name="c_vars_and_constants">Variables y Constantes</string>
<!--PREFERENCE ACTIVITY-->
<string name="c_prefs_main_category">Ajustes principales</string>
<string name="c_prefs_calculations_category">Ajustes de Cálculo</string>
<string name="c_prefs_appearance_category">Ajustes de apariencia</string>
<string name="c_prefs_drag_button_category">Configuración del deslizamiento de los botones</string>
<string name="c_prefs_drag_button_calibration">Calibración del deslizamiento de los botones</string>
<string name="c_prefs_drag_button_calibration_summary">Permite calibrar el comportamiento del deslizamiento de los botones</string>
<string name="c_down">Abajo</string>
<string name="c_up">Arriba</string>
<string name="c_restart">Reiniciar</string>
<string name="c_about_content" formatted="false">Copyright (c) 2009-2011\n\n<b>Creado por serso aka se.solovyev</b>\n\n
Este programa es Open Source:\n
Todo el código fuente puede encontrarse en\n
<a href="https://github.com/serso/android_calculator">http://github.com</a>\n\n
Para más información, por favor,\n
contacte con el autor al mail\n
<a href="mailto:se.solovyev@gmail.com">se.solovyev@gmail.com</a>\n
o visite\n
<a href="http://se.solovyev.org">http://se.solovyev.org</a>\n\n
Si desea apoyar el proyecto,\n
puede hacer una donación vía\n
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=se%2esolovyev%40gmail%2ecom&amp;lc=RU&amp;item_name=Android%20Calculator&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted">\n
http://paypal.com
</a>\n\n
Si le gusta la aplicación\n
valórela con 5 estrellas en\n
<a href="https://market.android.com/details?id=org.solovyev.android.calculator">android.market</a>\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
<a href="http://simple.sourceforge.net">Simple (XML serialization)</a>\n
<a href="http://meditorworld.appspot.com/meditor.txt">JSCL</a>\n
<a href="http://www.achartengine.org/">AChartEngine</a>
</string>
<string name="c_undo">deshacer</string>
<string name="c_redo">rehacer</string>
<string name="c_clear">C</string>
<string name="c_erase">borrar</string>
<string name="c_paste">pegar</string>
<string name="c_vars">vars</string>
<string name="c_calc_color_display_title">Resaltar expresiones</string>
<string name="c_calc_round_result_title">Redondear resultado</string>
<string name="c_calc_round_result_summary">Activar redondeo del resultado</string>
<string name="p_calc_result_precision_title">Precisión del resultado</string>
<string name="c_exit">Salir</string>
<string name="c_add">Añadir</string>
<string name="c_cancel">Cancelar</string>
<string name="c_save">Grabar</string>
<string name="c_remove">Borrar</string>
<string name="c_yes">Si</string>
<string name="c_no">No</string>
<string name="c_var_removal_confirmation">Confirmación de Borrado</string>
<string name="c_var_removal_confirmation_question">¿Realmente desea borrar la variable \'%s\'?</string>
<string name="c_var_name">Nombre</string>
<string name="c_var_value">Valor</string>
<string name="c_var_description">Descripción</string>
<string name="c_var_create_var">Crear variable</string>
<string name="c_var_edit_var">Editar variable</string>
<string name="c_value.is.not.a.number">¡El valor debe ser numérico o estar vacío!</string>
<string name="c_var.name.clashes">La variable name entra en conflicto con la función name!</string>
<string name="c_var.already.exists">¡Ya existe una variable con el mismo nombre!</string>
<string name="c_name.is.not.valid">El nombre de la Constante no es válido: el nombre debe comenzar con una letra,puede contener letras, dígitos y líneas.</string>
<string name="c_sys.var.cannot.be.changed">¡Una Variable de Sistema no puede ser cambiada!</string>
<string name="c_pi_description">Ratio de la circunferencia del círculo a su diámetro</string>
<string name="c_e_description">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</string>
<string name="c_i_description">Unidad imaginaria, definida como i^2 = 1</string>
<string name="c_c_description">Velocidad de la luz en vacío, m·s^-1</string>
<string name="c_g_description">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</string>
<string name="c_h_description">Constante física que refleja los tamaños de energía cuántica en mecánica cuántica, J·s</string>
<string name="c_h_reduced_description">Constante Planck reducida, J·s</string>
<string name="c_nan_description">No es un número</string>
<string name="c_infinity_description">Infinito</string>
<string name="c_calc_editor_hint">Introducir nuevo cálculo</string>
<string name="c_press_to_copy">Pulsar para copiar</string>
<string name="c_continue">Continuar</string>
<string name="c_donate">Donar</string>
<string name="c_donate_text" formatted="false">Puede dar las gracias por mail al autor de este programa\n\n
<a href="mailto:se.solovyev@gmail.com">se.solovyev@gmail.com</a>\n\n
donar dinero a través de\n\n
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=se%2esolovyev%40gmail%2ecom&amp;lc=RU&amp;item_name=Android%20Calculator&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted">
http://paypal.com
</a>\n\n
o evaluar el programa con 5 estrellas en\n\n
<a href="https://market.android.com/details?id=org.solovyev.android.calculator">android.market</a>\n
</string>
<string name="c_history">Historial</string>
<string name="c_history_button">M</string>
<string name="c_history_is_empty">¡El Historial está vacío!</string>
<string name="c_app_history">Historial</string>
<string name="c_char_is_not_accepted">El caracter \'%s\' no es aceptado en la variable name!</string>
<string name="c_calc_angle_units">Unidades de Ángulos</string>
<string name="p_deg">Grados</string>
<string name="p_rad">Radianes</string>
<string name="p_grad">Gradianes</string>
<string name="p_turns">Vueltas</string>
<string name="c_angle_units_summary">Define la unidad para ángulos predeterminada.</string>
<string name="c_calc_theme">Tema</string>
<string name="p_default_theme">Predeterminado</string>
<string name="p_violet_theme">Violeta</string>
<string name="p_light_blue_theme">Azul claro</string>
<string name="c_calc_result_precision_summary">Precisión del resultado (todos los cálculos se realizar con la máxima precisión a pesar del valor de esta opción)</string>
<string name="c_calc_color_display_summary">Ajustar colores y estilo en el editor de la calculadora</string>
<string name="c_calc_theme_summary">Establecer el tema para la Calculadora</string>
<string name="c_clear_history">Limpiar historial</string>
<string name="c_simplify_instead_of_numeric">Las constantes siguientes no están definidas: {0}!</string>
<string name="p_grouping_separator_no">No usar separador de Grupos</string>
<string name="p_grouping_separator_apostrophe">Apóstrofe (\')</string>
<string name="p_grouping_separator_space">Espacio ( )</string>
<string name="c_calc_grouping_separator">Separador de Grupos</string>
<string name="c_calc_grouping_separator_summary">Establecer el separador de Grupos</string>
<string name="c_calc_layout">Plantilla</string>
<string name="p_layout_cellphone">Teléfono</string>
<string name="p_layout_calculator">Calculadora</string>
<string name="c_calc_layout_summary">Establecer la plantilla de los botones</string>
<string name="c_calc_haptic_feedback_title">Configurar vibración</string>
<string name="c_calc_haptic_feedback_summary">Vibrar al pulsar un botón</string>
<string name="p_calc_haptic_feedback_strength_short">Corto</string>
<string name="p_calc_haptic_feedback_strength_middle">Medio</string>
<string name="p_calc_haptic_feedback_strength_long">Largo</string>
<string name="p_calc_haptic_feedback_duration_title">Duración de la vibración</string>
<string name="p_calc_haptic_feedback_duration_summary">Duración de la vibración al pulsar un butón</string>
<string name="c_functions">Funciones</string>
<string name="c_fun_description_sin">Función trigonométrica seno.</string>
<string name="c_fun_description_cos">Función trigonométrica coseno.</string>
<string name="c_fun_description_tan">Función trigonométrica tangente.</string>
<string name="c_fun_description_cot">Función trigonométrica cotangente.</string>
<string name="c_fun_description_asin">Arcseno - El inverso de la función seno.</string>
<string name="c_fun_description_acos">Arccoseno - El inverso de la función coseno.</string>
<string name="c_fun_description_atan">Arctangente - El inverso de la función tangente.</string>
<string name="c_fun_description_acot">Arccotangente - El inverso de la función cotangente.</string>
<string name="c_fun_description_ln">Logaritmo neperiano - logaritmo de base e.</string>
<string name="c_fun_description_lg">Decadic logaritmo - logaritmo de base 10.</string>
<string name="c_fun_description_exp">Función exponencial.</string>
<string name="c_fun_description_sqrt">Función Raíz cuadrado.</string>
<string name="c_fun_description_cubic">Función Raíz cuadrada.</string>
<string name="c_fun_description_abs">Función que devuelve el valor absoluto de un argumento.</string>
<string name="c_fun_description_sgn">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.</string>
<string name="c_fun_description_eq">Función Igual - Devuelve 1 si dos argumentos son iguales, 0 si no lo son.</string>
<string name="c_fun_description_le">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.</string>
<string name="c_fun_description_ge">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.</string>
<string name="c_fun_description_ne">Función Distinto - Devuelve 1 si dos argumentos no son iguales, 0 si son idénticos.</string>
<string name="c_fun_description_lt">Función Menor - Devuelve 1 si el primer argumento es menor que el segundo, 0 si no lo es.</string>
<string name="c_fun_description_gt">Función Mayor - Devuelve 1 si el primer argumento es mayor que el segundo, 0 si no lo es.</string>
<string name="c_fun_description_rad">Convierte grados a radianes: d - grados, m - minutos (por defecto = 0), s - segundos (por defecto = 0).</string>
<string name="c_fun_description_dms">Convierte grados de notación DMS a notación decimal: d - grados, m - minutos (por defecto = 0), s - segundos (por defecto = 0).</string>
<string name="c_fun_description_deg">Convierte radianes a grados.</string>
<string name="c_empty_var_error">No se puede crear una constante vacía!</string>
<string name="c_not_valid_result">El resultado actual no es válido!</string>
<string name="c_operators">Operadores</string>
<string name="c_op_description_mod">El módulo operación encuentra el resto de la división de \'x\' por \'y\'.</string>
<string name="c_op_description_sum">Función Suma \'f(i)\', iterativamente a través de \'i\' desde \'from\' hasta \'to\'.</string>
<string name="c_op_description_product">Devuelve el producto de las funciones \'f(i)\', iterativamente a través de \'i\' desde \'from\' hasta \'to\'.</string>
<string name="c_op_description_derivative">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\').</string>
<string name="c_op_description_integral">Devuelve la integral de la función \'f(x)\' por \'x\' variable.</string>
<string name="c_op_description_integral_ab">Función integral \'f(x)\' por \'x\' variable desde \'a\' hasta \'b\'.</string>
<string name="c_pf_description_factorial">Devuelve el factorial de la expresión antes.</string>
<string name="c_pf_description_percent" formatted="false">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
</string>
<string name="c_pf_description_degree">Convierte Grados a Radianes.\n
Ejemplos:\n
268° = 4.67748\n
30.21° = 0.52726\n
</string>
<string name="c_faq">FAQ</string>
<string name="c_hints">Consejos</string>
<string name="c_screens">Pantallas</string>
<string name="c_faq_content" formatted="false">
<b>¿Como puedo utilizar las funciones indicadas en las esquinas superior e inferior derechas de los botones?</b>\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
<b>¿Como puedo conmutar entre Radianes y Grados?</b>\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
<b>Ejemplos:</b>\n
268° = 4.67748\n
30.21° = 0.52726\n
rad(30, 21, 0) = 0.52726\n
deg(4.67748) = 268\n\n
<b>¿Soporta C+ %?</b>\n\n
Si, la función % puede encontrarse en la esquina superior derecha del botón / .\n\n
<b>Ejemplos:</b>\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
<b>Nota:</b>\n\n
100 + (20 + 20)% = 140,\n
<b>pero</b>\n
100+ (20% + 20%) = 124.0\n
100 + 50% ^ 2 = 2600,\n
<b>pero</b>\n
100 + 50 ^ 2% = 101.08\n\n
<b>¿Soporta C+ cálculos fraccionarios?</b>\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
<b>Ejemplos:</b>\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
<b>¿Soporta C+ cálculos complejos?</b>\n\n
Si, simplemente introduzca la expresión compleja (utilizando i o √(-1) como número imaginario).\n\n
<b>Ejemplos:</b>\n\n
(2i + 1) ^ = -3 + 4i\n
e ^ i = 0.5403 + 0.84147i\n\n
<b>¿Puede C+ dibujar gráficas de las funciones?</b>\n\n
No, actualmente C+ no puede dibujar gráficas.\n\n
<b>¿Soporta C+ cálculos matriciales?</b>\n\n
No, no los soporta.\n\n
<b>¿Porqué obtengo 1.76732452452345E-17 en lugar de 0?</b>\n\n
Compruebe la opción \'Redondear resultado\' en la configuración de la aplicación - debe activarla.\n
</string>
<string name="c_hints_content">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
</string>
<string name="c_screens_content">1.
<b>Pantalla principal:</b>
Se muestra al inicio de la aplicación. Puede llegar a ella desde otra pantalla pulsando el botón Atrás.\n\n
2.
<b>Pantalla de Variables y Constantes:</b>
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.
<b>Pantalla de Funciones:</b>
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.
<b>Pantalla de Operadores:</b>
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.
<b>Pantalla de Historial:</b>
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.
<b>Pantalla de Configuración:</b>
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
</string>
</resources>

View File

@ -43,7 +43,6 @@
<string name="c_undo">annulla</string>
<string name="c_redo">rifai</string>
<string name="c_clear">CE</string>
<string name="c_erase">cancella</string>
<string name="c_paste">incolla</string>
<string name="c_vars">vars</string>
@ -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
</string>
<string name="c_screens_content">

View File

@ -29,7 +29,8 @@
Если вы хотите поддержать проект материально\nвы можете сделать это через \n<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=se%2esolovyev%40gmail%2ecom&amp;lc=RU&amp;item_name=Android%20Calculator&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted">http://paypal.com</a>\n\n
Если вам понравилось приложение -\nпоставьте 5 звёздочек в\n<a href="https://market.android.com/details?id=org.solovyev.android.calculator">андроид.маркете</a>\n\n
Спасибо тем, кто переводил Калькулятор++:\n
на итальянский - Gabriele Ravanetti\n\n
на итальянский - Gabriele Ravanetti\n
на испанский - Jordi Luna\т\n
Это приложение использует следующие открытые библиотеки:\n
<a href="http://simple.sourceforge.net">Simple (XML serialization)</a>\n
<a href="http://meditorworld.appspot.com/meditor.txt">JSCL</a>\n
@ -104,7 +105,7 @@
<string name="p_turns">Обороты</string>
<string name="c_angle_units_summary">Устанавливает единицы измерения углов.</string>
<string name="c_calc_numeral_bases">Системы счичления</string>
<string name="c_calc_numeral_bases">Системы счисления</string>
<string name="c_numeral_bases_summary">Устанавливает систему счисления для всех вводимых чисел.</string>
<string name="p_dec">Десятичная</string>
<string name="p_hex">Шестнадцатеричная</string>
@ -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
</string>
<string name="c_screens_content">

View File

@ -30,7 +30,8 @@
If you want to support the project\nyou can donate money via\n<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=se%2esolovyev%40gmail%2ecom&amp;lc=RU&amp;item_name=Android%20Calculator&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted">http://paypal.com</a>\n\n
If you like the application\nrank it with 5 stars in\n<a href="https://market.android.com/details?id=org.solovyev.android.calculator">android.market</a>\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
<a href="http://simple.sourceforge.net">Simple (XML serialization)</a>\n
<a href="http://meditorworld.appspot.com/meditor.txt">JSCL</a>\n
@ -39,7 +40,7 @@
<string name="c_undo">undo</string>
<string name="c_redo">redo</string>
<string name="c_clear">CE</string>
<string name="c_clear">C</string>
<string name="c_erase">clear</string>
<string name="c_paste">paste</string>
<string name="c_vars">vars</string>
@ -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
</string>
<string name="c_screens_content">

View File

@ -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<String, Integer> layouts = RClassUtils.getCache(R.layout.class);
final Map<String, Integer> 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<String, Integer> styles = RClassUtils.getCache(R.style.class);
final Map<String, Integer> 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));
}
}

View File

@ -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);
}
}

View File

@ -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<CalculatorH
this.calculatorEngine = calculator;
this.editor = (CalculatorEditor) activity.findViewById(R.id.calculatorEditor);
final Boolean colorExpressionsInBracketsDefault = new BooleanMapper().parseValue(activity.getString(R.string.p_calc_color_display));
assert colorExpressionsInBracketsDefault != null;
this.editor.setHighlightText(preferences.getBoolean(activity.getString(R.string.p_calc_color_display_key), colorExpressionsInBracketsDefault));
this.editor.init(preferences);
preferences.registerOnSharedPreferenceChangeListener(editor);
this.display = (CalculatorDisplay) activity.findViewById(R.id.calculatorDisplay);
this.display.setOnClickListener(new CalculatorDisplayOnClickListener(activity));
@ -384,11 +381,6 @@ public enum CalculatorModel implements CursorControl, HistoryControl<CalculatorH
return CalculatorDisplayHistoryState.newInstance(display);
}
@NotNull
public CalculatorEditor getEditor() {
return editor;
}
@NotNull
public CalculatorDisplay getDisplay() {
return display;

View File

@ -1,55 +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;
import android.util.Log;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
/**
* User: serso
* Date: 10/30/11
* Time: 1:11 AM
*/
public class RClassUtils {
@NotNull
private final static Map<Class<?>, Map<String, Integer>> caches = new HashMap<Class<?>, Map<String, Integer>>(3);
// not intended for instantiation
private RClassUtils() {
throw new AssertionError();
}
@NotNull
public static Map<String, Integer> getCache(@NotNull Class<?> clazz) {
Map<String, Integer> result = caches.get(clazz);
if (result == null) {
result = new HashMap<String, Integer>();
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;
}
}

View File

@ -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<T extends MathEntity> implements A
@Nullable
@Override
public String getDescription(@NotNull Context context, @NotNull String name) {
final String result;
final Map<String, Integer> stringsCache = RClassUtils.getCache(R.string.class);
final Integer stringId;
final String stringName;
final Map<String, String> 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

View File

@ -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<Integer> dragButtonIds = null;
@ -44,6 +47,9 @@ public enum ResourceCache {
private Context context;
@NotNull
private final NameToIdCache nameToIdCache = new NameToIdCache();
public List<Integer> getDragButtonIds() {
return dragButtonIds;
}
@ -54,6 +60,7 @@ public enum ResourceCache {
/**
* Method load captions for default locale using android R class
*
* @param context STATIC CONTEXT
* @param resourceClass class of captions in android (SUBCLASS of R class)
*/
@ -63,6 +70,7 @@ public enum ResourceCache {
/**
* Method load captions for specified locale using android R class
*
* @param context STATIC CONTEXT
* @param resourceClass class of captions in android (SUBCLASS of R class)
* @param locale language to be used for translation
@ -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());
}
}
}
@ -115,7 +125,7 @@ public enum ResourceCache {
public String getCaption(@NotNull String captionId, @NotNull final Locale locale) {
Map<String, String> 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<String, String> 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<Integer>();
buttonIds = new ArrayList<Integer>();
@ -152,4 +171,44 @@ public enum ResourceCache {
}
}
}
@NotNull
public Map<String, Integer> getNameToIdCache(@NotNull Class<?> clazz) {
return this.nameToIdCache.getCache(clazz);
}
private static class NameToIdCache {
@NotNull
private final Map<Class<?>, Map<String, Integer>> caches = new HashMap<Class<?>, Map<String, Integer>>(3);
// not intended for instantiation
private NameToIdCache() {
}
@NotNull
public Map<String, Integer> getCache(@NotNull Class<?> clazz) {
Map<String, Integer> result = caches.get(clazz);
if (result == null) {
result = new HashMap<String, Integer>();
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;
}
}
}

View File

@ -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));