operators activity added
This commit is contained in:
parent
5957fca923
commit
ab58ed9ba4
@ -42,6 +42,11 @@
|
||||
a:configChanges="orientation|keyboardHidden">
|
||||
</activity>
|
||||
|
||||
<activity a:name=".CalculatorOperatorsActivity"
|
||||
a:label="@string/c_operators"
|
||||
a:configChanges="orientation|keyboardHidden">
|
||||
</activity>
|
||||
|
||||
<activity a:name=".CalculatorVarsActivity"
|
||||
a:label="@string/c_vars_and_constants"
|
||||
a:configChanges="orientation|keyboardHidden">
|
||||
|
@ -99,7 +99,7 @@
|
||||
<include layout="@layout/calc_six_digit_button"/>
|
||||
<include layout="@layout/calc_plus_button"/>
|
||||
<include layout="@layout/calc_subtraction_button"/>
|
||||
<include layout="@layout/calc_empty_button"/>
|
||||
<include layout="@layout/calc_operators_button"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
14
res/layout/calc_operators_button.xml
Normal file
14
res/layout/calc_operators_button.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
~ 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
|
||||
-->
|
||||
|
||||
<org.solovyev.android.view.widgets.DirectionDragButton xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:id="@+id/functionsButton"
|
||||
a:text="∂,∫"
|
||||
a:textStyle="italic"
|
||||
a:onClick="operatorsButtonClickHandler"
|
||||
style="?controlButtonStyle"/>
|
20
res/layout/operators.xml
Normal file
20
res/layout/operators.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
~ 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
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:orientation="vertical"
|
||||
a:layout_width="fill_parent"
|
||||
a:layout_height="fill_parent">
|
||||
|
||||
<ListView
|
||||
a:layout_width="fill_parent"
|
||||
a:layout_height="fill_parent"
|
||||
a:layout_weight="1"
|
||||
a:id="@android:id/list"/>
|
||||
|
||||
</LinearLayout>
|
@ -145,5 +145,6 @@
|
||||
|
||||
<string name="c_empty_var_error">Невозможно создать пустую константу!</string>
|
||||
<string name="c_not_valid_result">Результат не допустим!</string>
|
||||
<string name="c_operators">Операторы</string>
|
||||
|
||||
</resources>
|
||||
|
@ -146,5 +146,6 @@
|
||||
|
||||
<string name="c_empty_var_error">Unable to create empty constant!</string>
|
||||
<string name="c_not_valid_result">Current result is not valid!</string>
|
||||
<string name="c_operators">Operators</string>
|
||||
|
||||
</resources>
|
||||
|
@ -333,6 +333,11 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh
|
||||
CalculatorActivityLauncher.showFunctions(this);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
public void operatorsButtonClickHandler(@NotNull View v) {
|
||||
CalculatorActivityLauncher.showOperators(this);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
public void varsButtonClickHandler(@NotNull View v) {
|
||||
CalculatorActivityLauncher.showVars(this);
|
||||
|
@ -29,6 +29,10 @@ public class CalculatorActivityLauncher {
|
||||
context.startActivity(new Intent(context, CalculatorFunctionsActivity.class));
|
||||
}
|
||||
|
||||
public static void showOperators(@NotNull final Context context) {
|
||||
context.startActivity(new Intent(context, CalculatorOperatorsActivity.class));
|
||||
}
|
||||
|
||||
public static void showVars(@NotNull final Context context) {
|
||||
context.startActivity(new Intent(context, CalculatorVarsActivity.class));
|
||||
}
|
||||
|
@ -265,6 +265,10 @@ public enum CalculatorModel implements CursorControl, HistoryControl<CalculatorH
|
||||
textToBeInserted.append("()");
|
||||
cursorPositionOffset = -1;
|
||||
break;
|
||||
case operator:
|
||||
textToBeInserted.append("()");
|
||||
cursorPositionOffset = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cursorPositionOffset == 0) {
|
||||
|
@ -0,0 +1,110 @@
|
||||
package org.solovyev.android.calculator;
|
||||
|
||||
import android.app.ListActivity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import jscl.math.function.Function;
|
||||
import jscl.math.operator.Operator;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.solovyev.android.calculator.model.CalculatorEngine;
|
||||
import org.solovyev.common.utils.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 11/17/11
|
||||
* Time: 1:53 PM
|
||||
*/
|
||||
|
||||
public class CalculatorOperatorsActivity extends ListActivity {
|
||||
|
||||
@NotNull
|
||||
private OperatorsArrayAdapter adapter;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.operators);
|
||||
|
||||
adapter = new OperatorsArrayAdapter(this, R.layout.var, R.id.var_text, new ArrayList<Operator>(CalculatorEngine.instance.getOperatorsRegistry().getEntities()));
|
||||
setListAdapter(adapter);
|
||||
|
||||
final ListView lv = getListView();
|
||||
lv.setTextFilterEnabled(true);
|
||||
|
||||
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
public void onItemClick(final AdapterView<?> parent,
|
||||
final View view,
|
||||
final int position,
|
||||
final long id) {
|
||||
|
||||
CalculatorModel.instance.processDigitButtonAction(((Operator) parent.getItemAtPosition(position)).getName(), false);
|
||||
|
||||
CalculatorOperatorsActivity.this.finish();
|
||||
}
|
||||
});
|
||||
|
||||
sort();
|
||||
|
||||
}
|
||||
|
||||
private void sort() {
|
||||
CalculatorOperatorsActivity.this.adapter.sort(new Comparator<Operator>() {
|
||||
@Override
|
||||
public int compare(Operator operator1, Operator operator2) {
|
||||
return operator1.getName().compareTo(operator2.getName());
|
||||
}
|
||||
});
|
||||
|
||||
CalculatorOperatorsActivity.this.adapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private class OperatorsArrayAdapter extends ArrayAdapter<Operator> {
|
||||
|
||||
private OperatorsArrayAdapter(Context context, int resource, int textViewResourceId, List<Operator> objects) {
|
||||
super(context, resource, textViewResourceId, objects);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
final ViewGroup result = (ViewGroup) super.getView(position, convertView, parent);
|
||||
|
||||
final Operator operator = getItem(position);
|
||||
|
||||
final String operatorDescription = CalculatorEngine.instance.getOperatorsRegistry().getDescription(getContext(), operator.getName());
|
||||
if (!StringUtils.isEmpty(operatorDescription)) {
|
||||
TextView description = (TextView) result.findViewById(R.id.var_description);
|
||||
if (description == null) {
|
||||
final LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
|
||||
final ViewGroup itemView = (ViewGroup) layoutInflater.inflate(R.layout.var, null);
|
||||
description = (TextView) itemView.findViewById(R.id.var_description);
|
||||
itemView.removeView(description);
|
||||
result.addView(description);
|
||||
}
|
||||
description.setText(operatorDescription);
|
||||
} else {
|
||||
TextView description = (TextView) result.findViewById(R.id.var_description);
|
||||
if (description != null) {
|
||||
result.removeView(description);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -104,6 +104,7 @@ public class TextHighlighter implements TextProcessor<TextHighlighter.Result> {
|
||||
numberOfOpenGroupSymbols--;
|
||||
text1.append(text.charAt(i));
|
||||
break;
|
||||
case operator:
|
||||
case function:
|
||||
i = processHighlightedText(text1, i, mathType.getMatch(), "i");
|
||||
break;
|
||||
|
@ -68,7 +68,7 @@ public enum MathType {
|
||||
open_group_symbol(800, true, false, "[", "(", "{") {
|
||||
@Override
|
||||
public boolean isNeedMultiplicationSignBefore(@NotNull MathType mathTypeBefore) {
|
||||
return super.isNeedMultiplicationSignBefore(mathTypeBefore) && mathTypeBefore != function;
|
||||
return super.isNeedMultiplicationSignBefore(mathTypeBefore) && mathTypeBefore != function && mathTypeBefore != operator;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -97,6 +97,14 @@ public enum MathType {
|
||||
}
|
||||
},
|
||||
|
||||
operator(1050, true, true) {
|
||||
@NotNull
|
||||
@Override
|
||||
public List<String> getTokens() {
|
||||
return CalculatorEngine.instance.getOperatorsRegistry().getNames();
|
||||
}
|
||||
},
|
||||
|
||||
constant(1100, true, true) {
|
||||
@NotNull
|
||||
@Override
|
||||
|
@ -10,6 +10,7 @@ import android.content.Context;
|
||||
import jscl.math.function.Function;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.common.math.MathEntity;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
/**
|
||||
@ -17,7 +18,7 @@ import org.solovyev.common.math.MathRegistry;
|
||||
* Date: 10/30/11
|
||||
* Time: 1:02 AM
|
||||
*/
|
||||
public interface AndroidFunctionsRegistry extends MathRegistry<Function> {
|
||||
public interface AndroidMathRegistry<T extends MathEntity> extends MathRegistry<T> {
|
||||
|
||||
@Nullable
|
||||
String getDescription(@NotNull Context context, @NotNull String functionName);
|
@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.android.calculator.R;
|
||||
import org.solovyev.android.calculator.RClassUtils;
|
||||
import org.solovyev.common.definitions.IBuilder;
|
||||
import org.solovyev.common.math.MathEntity;
|
||||
import org.solovyev.common.math.MathRegistry;
|
||||
|
||||
import java.util.List;
|
||||
@ -23,15 +24,15 @@ import java.util.Map;
|
||||
* Date: 10/30/11
|
||||
* Time: 1:03 AM
|
||||
*/
|
||||
public class AndroidFunctionsRegistryImpl implements AndroidFunctionsRegistry {
|
||||
public class AndroidMathRegistryImpl<T extends MathEntity> implements AndroidMathRegistry<T> {
|
||||
|
||||
@NotNull
|
||||
private static final String FUNCTION_DESCRIPTION_PREFIX = "c_fun_description_";
|
||||
|
||||
@NotNull
|
||||
private final MathRegistry<Function> functionsRegistry;
|
||||
private final MathRegistry<T> functionsRegistry;
|
||||
|
||||
public AndroidFunctionsRegistryImpl(@NotNull MathRegistry<Function> functionsRegistry) {
|
||||
public AndroidMathRegistryImpl(@NotNull MathRegistry<T> functionsRegistry) {
|
||||
this.functionsRegistry = functionsRegistry;
|
||||
}
|
||||
|
||||
@ -60,23 +61,23 @@ public class AndroidFunctionsRegistryImpl implements AndroidFunctionsRegistry {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Function> getEntities() {
|
||||
public List<T> getEntities() {
|
||||
return functionsRegistry.getEntities();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Function> getSystemEntities() {
|
||||
public List<T> getSystemEntities() {
|
||||
return functionsRegistry.getSystemEntities();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Function add(@NotNull IBuilder<? extends Function> IBuilder) {
|
||||
public T add(@NotNull IBuilder<? extends T> IBuilder) {
|
||||
return functionsRegistry.add(IBuilder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(@NotNull Function var) {
|
||||
public void remove(@NotNull T var) {
|
||||
functionsRegistry.remove(var);
|
||||
}
|
||||
|
||||
@ -92,12 +93,12 @@ public class AndroidFunctionsRegistryImpl implements AndroidFunctionsRegistry {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Function get(@NotNull String name) {
|
||||
public T get(@NotNull String name) {
|
||||
return functionsRegistry.get(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Function getById(@NotNull Integer id) {
|
||||
public T getById(@NotNull Integer id) {
|
||||
return functionsRegistry.getById(id);
|
||||
}
|
||||
}
|
@ -70,7 +70,10 @@ public enum CalculatorEngine {
|
||||
private final AndroidVarsRegistry varsRegister = new AndroidVarsRegistryImpl(engine.getConstantsRegistry());
|
||||
|
||||
@NotNull
|
||||
private final AndroidFunctionsRegistry functionsRegistry = new AndroidFunctionsRegistryImpl(engine.getFunctionsRegistry());
|
||||
private final AndroidMathRegistry functionsRegistry = new AndroidMathRegistryImpl(engine.getFunctionsRegistry());
|
||||
|
||||
@NotNull
|
||||
private final AndroidMathRegistry operatorsRegistry = new AndroidMathRegistryImpl(engine.getOperatorsRegistry());
|
||||
|
||||
private final MathRegistry<Operator> postfixFunctionsRegistry = engine.getPostfixFunctionsRegistry();
|
||||
|
||||
@ -156,7 +159,7 @@ public enum CalculatorEngine {
|
||||
sb.append(preparedExpression);
|
||||
|
||||
//Log.d(CalculatorEngine.class.getName(), "Preprocessed expression: " + preprocessedExpression);
|
||||
if (operation == JsclOperation.numeric && preparedExpression.isExistsUndefinedVar()) {
|
||||
/*if (operation == JsclOperation.numeric && preparedExpression.isExistsUndefinedVar()) {
|
||||
operation = JsclOperation.simplify;
|
||||
|
||||
if (mr != null) {
|
||||
@ -169,7 +172,7 @@ public enum CalculatorEngine {
|
||||
|
||||
mr.addMessage(new AndroidMessage(R.string.c_simplify_instead_of_numeric, MessageType.info, undefinedVars));
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
final String jsclExpression = sb.toString();
|
||||
final JsclOperation finalOperation = operation;
|
||||
@ -224,6 +227,9 @@ public enum CalculatorEngine {
|
||||
}
|
||||
|
||||
if ( evalErrorLocal != null ) {
|
||||
if ( finalOperation == JsclOperation.numeric && preparedExpression.isExistsUndefinedVar() ) {
|
||||
return evaluate(JsclOperation.simplify, expression, mr);
|
||||
}
|
||||
throw evalErrorLocal;
|
||||
}
|
||||
|
||||
@ -301,10 +307,15 @@ public enum CalculatorEngine {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public AndroidFunctionsRegistry getFunctionsRegistry() {
|
||||
public AndroidMathRegistry getFunctionsRegistry() {
|
||||
return functionsRegistry;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public AndroidMathRegistry getOperatorsRegistry() {
|
||||
return operatorsRegistry;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public MathRegistry<Operator> getPostfixFunctionsRegistry() {
|
||||
return postfixFunctionsRegistry;
|
||||
|
@ -62,7 +62,7 @@ public class FromJsclSimplifyTextProcessor implements TextProcessor<String> {
|
||||
}
|
||||
|
||||
} else {
|
||||
if (mathType.getMathType() == MathType.constant || mathType.getMathType() == MathType.function) {
|
||||
if (mathType.getMathType() == MathType.constant || mathType.getMathType() == MathType.function || mathType.getMathType() == MathType.operator) {
|
||||
sb.append(mathType.getMatch());
|
||||
i += mathType.getMatch().length() - 1;
|
||||
} else {
|
||||
|
@ -54,7 +54,7 @@ class ToJsclTextProcessor implements TextProcessor<PreparedExpression> {
|
||||
}
|
||||
}
|
||||
|
||||
if (mathTypeBefore == MathType.function && CollectionsUtils.find(MathType.openGroupSymbols, startsWithFinder) != null) {
|
||||
if ((mathTypeBefore == MathType.function || mathTypeBefore == MathType.operator) && CollectionsUtils.find(MathType.openGroupSymbols, startsWithFinder) != null) {
|
||||
throw new ParseException("Empty function: " + mathTypeResult.getMatch());
|
||||
}
|
||||
|
||||
@ -80,28 +80,34 @@ class ToJsclTextProcessor implements TextProcessor<PreparedExpression> {
|
||||
int offset = 0;
|
||||
String functionName = CollectionsUtils.find(MathType.function.getTokens(), startsWithFinder);
|
||||
if (functionName == null) {
|
||||
String varName = CollectionsUtils.find(CalculatorEngine.instance.getVarsRegister().getNames(), startsWithFinder);
|
||||
if (varName != null) {
|
||||
final Var var = CalculatorEngine.instance.getVarsRegister().get(varName);
|
||||
if (var != null) {
|
||||
if (!var.isDefined()) {
|
||||
undefinedVars.add(var);
|
||||
result.append(varName);
|
||||
offset = varName.length();
|
||||
} else {
|
||||
final String value = var.getValue();
|
||||
assert value != null;
|
||||
|
||||
if ( var.getDoubleValue() != null ) {
|
||||
//result.append(value);
|
||||
// NOTE: append varName as JSCL engine will convert it to double if needed
|
||||
String operatorName = CollectionsUtils.find(MathType.operator.getTokens(), startsWithFinder);
|
||||
if (operatorName == null) {
|
||||
String varName = CollectionsUtils.find(CalculatorEngine.instance.getVarsRegister().getNames(), startsWithFinder);
|
||||
if (varName != null) {
|
||||
final Var var = CalculatorEngine.instance.getVarsRegister().get(varName);
|
||||
if (var != null) {
|
||||
if (!var.isDefined()) {
|
||||
undefinedVars.add(var);
|
||||
result.append(varName);
|
||||
offset = varName.length();
|
||||
} else {
|
||||
result.append("(").append(processWithDepth(value, depth, undefinedVars)).append(")");
|
||||
final String value = var.getValue();
|
||||
assert value != null;
|
||||
|
||||
if ( var.getDoubleValue() != null ) {
|
||||
//result.append(value);
|
||||
// NOTE: append varName as JSCL engine will convert it to double if needed
|
||||
result.append(varName);
|
||||
} else {
|
||||
result.append("(").append(processWithDepth(value, depth, undefinedVars)).append(")");
|
||||
}
|
||||
offset = varName.length();
|
||||
}
|
||||
offset = varName.length();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result.append(operatorName);
|
||||
offset = operatorName.length();
|
||||
}
|
||||
} else {
|
||||
result.append(functionName);
|
||||
|
@ -113,7 +113,7 @@ public class CalculatorEngineTest {
|
||||
junit.framework.Assert.assertEquals("36.0", Expression.valueOf("3!^2").numeric().toString());
|
||||
junit.framework.Assert.assertEquals("3.0", Expression.valueOf("cubic(27)").numeric().toString());
|
||||
try {
|
||||
junit.framework.Assert.assertEquals("i", cm.evaluate(JsclOperation.numeric, "i!").getResult());
|
||||
junit.framework.Assert.assertEquals("√(-1)!", cm.evaluate(JsclOperation.numeric, "i!").getResult());
|
||||
fail();
|
||||
} catch (ParseException e) {
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user