diff --git a/res/layout/main.xml b/res/layout/main.xml index 0a1a4c40..8938fac8 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -59,7 +59,7 @@ calc:textDown="atg" style="@style/digitButtonStyle" a:onClick="digitButtonClickHandler"/> - diff --git a/src/org/solovyev/android/calculator/CalculatorActivity.java b/src/org/solovyev/android/calculator/CalculatorActivity.java index 116f71b5..75bd56a1 100644 --- a/src/org/solovyev/android/calculator/CalculatorActivity.java +++ b/src/org/solovyev/android/calculator/CalculatorActivity.java @@ -205,7 +205,8 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster { public void pasteButtonClickHandler(@NotNull View v) { final ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if ( clipboard.hasText() ) { - editText.getText().append(clipboard.getText()); + editText.getText().insert(editText.getSelectionStart(), clipboard.getText()); + eval(JsclOperation.numeric, false); saveHistoryState(); } } diff --git a/src/org/solovyev/android/calculator/Preprocessor.java b/src/org/solovyev/android/calculator/Preprocessor.java index 49701d76..5769b9b7 100644 --- a/src/org/solovyev/android/calculator/Preprocessor.java +++ b/src/org/solovyev/android/calculator/Preprocessor.java @@ -1,6 +1,7 @@ package org.solovyev.android.calculator; import org.jetbrains.annotations.NotNull; +import org.solovyev.util.math.MathEntityType; public class Preprocessor { @@ -11,12 +12,16 @@ public class Preprocessor { for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); + checkMultiplicationSignBeforeFunction(sb, s, i); + if (ch == '[' || ch == '{') { sb.append('('); } else if (ch == ']' || ch == '}') { sb.append(')'); } else if (ch == 'π') { sb.append("pi"); + } else if (ch == '×' || ch == '∙') { + sb.append("*"); } else if (s.startsWith("ln", i)) { sb.append("log"); i += 1; @@ -41,6 +46,35 @@ public class Preprocessor { return sb.toString(); } + private static void checkMultiplicationSignBeforeFunction(@NotNull StringBuilder sb, @NotNull String s, int i) { + if (i > 0) { + // get character before function + char chBefore = s.charAt(i - 1); + char ch = s.charAt(i); + + final MathEntityType mathTypeBefore = MathEntityType.getType(String.valueOf(chBefore)); + final MathEntityType mathType = MathEntityType.getType(String.valueOf(ch)); + + if (mathTypeBefore != MathEntityType.binary_operation && + mathTypeBefore != MathEntityType.unary_operation && + !MathEntityType.openGroupSymbols.contains(chBefore)) { + + if (mathType == MathEntityType.constant) { + sb.append("*"); + } else if (mathType == MathEntityType.digit && mathTypeBefore != MathEntityType.digit && mathTypeBefore != MathEntityType.dot) { + sb.append("*"); + } else { + for (String function : MathEntityType.functions) { + if (s.startsWith(function, i)) { + sb.append("*"); + break; + } + } + } + } + } + } + public static String wrap(@NotNull JsclOperation operation, @NotNull String s) { return operation.name() + "(\"" + s + "\");"; } diff --git a/src/org/solovyev/util/math/MathEntityType.java b/src/org/solovyev/util/math/MathEntityType.java index f7800b55..757b34e7 100644 --- a/src/org/solovyev/util/math/MathEntityType.java +++ b/src/org/solovyev/util/math/MathEntityType.java @@ -1,6 +1,8 @@ package org.solovyev.util.math; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.jetbrains.annotations.NotNull; @@ -9,22 +11,38 @@ import org.jetbrains.annotations.Nullable; public enum MathEntityType { digit, + constant, + dot, function, unary_operation, binary_operation, group_symbols, group_symbol; - private static final List unaryOperations = Arrays.asList('-', '=', '!'); - - private static final List binaryOperations = Arrays.asList('-', '+', '*', '/', '^' ); + public static final List constants = Arrays.asList('e', 'π'); - private static final List functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√"); - - private static final List groupSymbols = Arrays.asList("[]", "()", "{}"); + public static final List dots = Arrays.asList('.', ','); - private static final List singleGroupSymbols = Arrays.asList('[', ']', '(', ')', '{', '}'); + public static final List unaryOperations = Arrays.asList('-', '=', '!'); + + public static final List binaryOperations = Arrays.asList('-', '+', '*', '×', '∙', '/', '^' ); + + public static final List functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√"); + public static final List groupSymbols = Arrays.asList("[]", "()", "{}"); + + public static final List openGroupSymbols = Arrays.asList('[', '(', '{'); + + public static final List closeGroupSymbols = Arrays.asList(']', ')', '}'); + + public static final List singleGroupSymbols; + static { + final List list = new ArrayList(); + list.addAll(openGroupSymbols); + list.addAll(closeGroupSymbols); + singleGroupSymbols = Collections.unmodifiableList(list); + } + @Nullable public static MathEntityType getType( @NotNull String s ) { MathEntityType result = null; @@ -40,6 +58,10 @@ public enum MathEntityType { result = MathEntityType.binary_operation; } else if ( singleGroupSymbols.contains(ch) ) { result = MathEntityType.group_symbol; + } else if ( constants.contains(ch) ) { + result = MathEntityType.constant; + } else if ( dots.contains(ch) ) { + result = MathEntityType.dot; } }