new interface implementation
This commit is contained in:
parent
cb9e0332a9
commit
23b57fe7f3
@ -59,7 +59,7 @@
|
|||||||
calc:textDown="atg" style="@style/digitButtonStyle"
|
calc:textDown="atg" style="@style/digitButtonStyle"
|
||||||
a:onClick="digitButtonClickHandler"/>
|
a:onClick="digitButtonClickHandler"/>
|
||||||
|
|
||||||
<org.solovyev.android.view.DirectionDragButton a:id="@+id/muliplicationButton" a:text="*"
|
<org.solovyev.android.view.DirectionDragButton a:id="@+id/muliplicationButton" a:text="×"
|
||||||
calc:textUp="^"
|
calc:textUp="^"
|
||||||
calc:textDown="^2" style="@style/digitButtonStyle"
|
calc:textDown="^2" style="@style/digitButtonStyle"
|
||||||
a:onClick="digitButtonClickHandler"/>
|
a:onClick="digitButtonClickHandler"/>
|
||||||
|
@ -205,7 +205,8 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster {
|
|||||||
public void pasteButtonClickHandler(@NotNull View v) {
|
public void pasteButtonClickHandler(@NotNull View v) {
|
||||||
final ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
|
final ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
|
||||||
if ( clipboard.hasText() ) {
|
if ( clipboard.hasText() ) {
|
||||||
editText.getText().append(clipboard.getText());
|
editText.getText().insert(editText.getSelectionStart(), clipboard.getText());
|
||||||
|
eval(JsclOperation.numeric, false);
|
||||||
saveHistoryState();
|
saveHistoryState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.solovyev.util.math.MathEntityType;
|
||||||
|
|
||||||
public class Preprocessor {
|
public class Preprocessor {
|
||||||
|
|
||||||
@ -11,12 +12,16 @@ public class Preprocessor {
|
|||||||
for (int i = 0; i < s.length(); i++) {
|
for (int i = 0; i < s.length(); i++) {
|
||||||
char ch = s.charAt(i);
|
char ch = s.charAt(i);
|
||||||
|
|
||||||
|
checkMultiplicationSignBeforeFunction(sb, s, i);
|
||||||
|
|
||||||
if (ch == '[' || ch == '{') {
|
if (ch == '[' || ch == '{') {
|
||||||
sb.append('(');
|
sb.append('(');
|
||||||
} else if (ch == ']' || ch == '}') {
|
} else if (ch == ']' || ch == '}') {
|
||||||
sb.append(')');
|
sb.append(')');
|
||||||
} else if (ch == 'π') {
|
} else if (ch == 'π') {
|
||||||
sb.append("pi");
|
sb.append("pi");
|
||||||
|
} else if (ch == '×' || ch == '∙') {
|
||||||
|
sb.append("*");
|
||||||
} else if (s.startsWith("ln", i)) {
|
} else if (s.startsWith("ln", i)) {
|
||||||
sb.append("log");
|
sb.append("log");
|
||||||
i += 1;
|
i += 1;
|
||||||
@ -41,6 +46,35 @@ public class Preprocessor {
|
|||||||
return sb.toString();
|
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) {
|
public static String wrap(@NotNull JsclOperation operation, @NotNull String s) {
|
||||||
return operation.name() + "(\"" + s + "\");";
|
return operation.name() + "(\"" + s + "\");";
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package org.solovyev.util.math;
|
package org.solovyev.util.math;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@ -9,22 +11,38 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
public enum MathEntityType {
|
public enum MathEntityType {
|
||||||
|
|
||||||
digit,
|
digit,
|
||||||
|
constant,
|
||||||
|
dot,
|
||||||
function,
|
function,
|
||||||
unary_operation,
|
unary_operation,
|
||||||
binary_operation,
|
binary_operation,
|
||||||
group_symbols,
|
group_symbols,
|
||||||
group_symbol;
|
group_symbol;
|
||||||
|
|
||||||
private static final List<Character> unaryOperations = Arrays.asList('-', '=', '!');
|
public static final List<Character> constants = Arrays.asList('e', 'π');
|
||||||
|
|
||||||
private static final List<Character> binaryOperations = Arrays.asList('-', '+', '*', '/', '^' );
|
|
||||||
|
|
||||||
private static final List<String> functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√");
|
public static final List<Character> dots = Arrays.asList('.', ',');
|
||||||
|
|
||||||
private static final List<String> groupSymbols = Arrays.asList("[]", "()", "{}");
|
|
||||||
|
|
||||||
private static final List<Character> singleGroupSymbols = Arrays.asList('[', ']', '(', ')', '{', '}');
|
public static final List<Character> unaryOperations = Arrays.asList('-', '=', '!');
|
||||||
|
|
||||||
|
public static final List<Character> binaryOperations = Arrays.asList('-', '+', '*', '×', '∙', '/', '^' );
|
||||||
|
|
||||||
|
public static final List<String> functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√");
|
||||||
|
|
||||||
|
public static final List<String> groupSymbols = Arrays.asList("[]", "()", "{}");
|
||||||
|
|
||||||
|
public static final List<Character> openGroupSymbols = Arrays.asList('[', '(', '{');
|
||||||
|
|
||||||
|
public static final List<Character> closeGroupSymbols = Arrays.asList(']', ')', '}');
|
||||||
|
|
||||||
|
public static final List<Character> singleGroupSymbols;
|
||||||
|
static {
|
||||||
|
final List<Character> list = new ArrayList<Character>();
|
||||||
|
list.addAll(openGroupSymbols);
|
||||||
|
list.addAll(closeGroupSymbols);
|
||||||
|
singleGroupSymbols = Collections.unmodifiableList(list);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static MathEntityType getType( @NotNull String s ) {
|
public static MathEntityType getType( @NotNull String s ) {
|
||||||
MathEntityType result = null;
|
MathEntityType result = null;
|
||||||
@ -40,6 +58,10 @@ public enum MathEntityType {
|
|||||||
result = MathEntityType.binary_operation;
|
result = MathEntityType.binary_operation;
|
||||||
} else if ( singleGroupSymbols.contains(ch) ) {
|
} else if ( singleGroupSymbols.contains(ch) ) {
|
||||||
result = MathEntityType.group_symbol;
|
result = MathEntityType.group_symbol;
|
||||||
|
} else if ( constants.contains(ch) ) {
|
||||||
|
result = MathEntityType.constant;
|
||||||
|
} else if ( dots.contains(ch) ) {
|
||||||
|
result = MathEntityType.dot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user