diff --git a/gen/org/solovyev/android/calculator/R.java b/gen/org/solovyev/android/calculator/R.java
index b7275ca9..9b960dbc 100644
--- a/gen/org/solovyev/android/calculator/R.java
+++ b/gen/org/solovyev/android/calculator/R.java
@@ -35,9 +35,10 @@ containing a value of this type.
public static final int button=0x7f020001;
public static final int down=0x7f020002;
public static final int icon=0x7f020003;
- public static final int not_ok=0x7f020004;
- public static final int ok=0x7f020005;
- public static final int up=0x7f020006;
+ public static final int light_blue_button=0x7f020004;
+ public static final int not_ok=0x7f020005;
+ public static final int ok=0x7f020006;
+ public static final int up=0x7f020007;
}
public static final class id {
public static final int calibrationArrowLeft=0x7f090001;
@@ -45,34 +46,32 @@ containing a value of this type.
public static final int calibrationButtonLeft=0x7f090002;
public static final int calibrationButtonRight=0x7f090003;
public static final int calibrationStart=0x7f090005;
- public static final int curlyBracketsButton=0x7f09001b;
- public static final int divisionButton=0x7f090011;
+ public static final int divisionButton=0x7f09000f;
public static final int editText=0x7f090006;
- public static final int eigthDigitButton=0x7f090014;
- public static final int equalsButton=0x7f09001d;
- public static final int fiveDigitButton=0x7f09000f;
- public static final int fourDigitButton=0x7f09000e;
- public static final int historyButton=0x7f09001e;
- public static final int menu_item_help=0x7f090020;
- public static final int menu_item_settings=0x7f09001f;
- public static final int muliplicationButton=0x7f09000c;
- public static final int nineDigitButton=0x7f090015;
- public static final int oneDigitButton=0x7f090009;
- public static final int panelswitch=0x7f090008;
- public static final int piButton=0x7f09001c;
- public static final int plusButton=0x7f09000d;
- public static final int pointDigitButton=0x7f090016;
+ public static final int eigthDigitButton=0x7f090011;
+ public static final int equalsButton=0x7f090018;
+ public static final int eraseButton=0x7f090019;
+ public static final int fiveDigitButton=0x7f09000d;
+ public static final int fourDigitButton=0x7f09000c;
+ public static final int historyButton=0x7f09001c;
+ public static final int leftButton=0x7f09001a;
+ public static final int menu_item_help=0x7f09001e;
+ public static final int menu_item_settings=0x7f09001d;
+ public static final int muliplicationButton=0x7f09000b;
+ public static final int nineDigitButton=0x7f090012;
+ public static final int oneDigitButton=0x7f090008;
+ public static final int plusButton=0x7f090013;
public static final int resultEditText=0x7f090007;
- public static final int roundBracketsButton=0x7f090019;
- public static final int sevenDigitButton=0x7f090013;
+ public static final int rightButton=0x7f09001b;
+ public static final int roundBracketsButton=0x7f090014;
+ public static final int sevenDigitButton=0x7f090010;
public static final int simplePad=0x7f090000;
- public static final int sixDigitButton=0x7f090010;
- public static final int sqrtButton=0x7f090017;
- public static final int squareBracketsButton=0x7f09001a;
- public static final int subtractionButton=0x7f090012;
- public static final int threeDigitButton=0x7f09000b;
- public static final int twoDigitButton=0x7f09000a;
- public static final int zeroDigitButton=0x7f090018;
+ public static final int sixDigitButton=0x7f09000e;
+ public static final int squareBracketsButton=0x7f090016;
+ public static final int subtractionButton=0x7f090017;
+ public static final int threeDigitButton=0x7f09000a;
+ public static final int twoDigitButton=0x7f090009;
+ public static final int zeroDigitButton=0x7f090015;
}
public static final class layout {
public static final int drag_button_calibration=0x7f030000;
@@ -95,10 +94,11 @@ containing a value of this type.
public static final int syntax_error=0x7f060002;
}
public static final class style {
- public static final int button_small_style=0x7f070003;
+ public static final int button_small_style=0x7f070004;
public static final int button_style=0x7f070001;
+ public static final int controlButtonStyle=0x7f070003;
public static final int digitButtonStyle=0x7f070002;
- public static final int display_style=0x7f070004;
+ public static final int display_style=0x7f070005;
public static final int editTextInputStyle=0x7f070000;
}
public static final class xml {
diff --git a/res/drawable/blue_button.xml b/res/drawable/blue_button.xml
index f4d6059b..f686a06a 100644
--- a/res/drawable/blue_button.xml
+++ b/res/drawable/blue_button.xml
@@ -15,7 +15,6 @@
-->
-
+
diff --git a/res/drawable/light_blue_button.xml b/res/drawable/light_blue_button.xml
new file mode 100644
index 00000000..4b0623ee
--- /dev/null
+++ b/res/drawable/light_blue_button.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/res/layout/main.xml b/res/layout/main.xml
index 3a3be71d..7c6cae20 100644
--- a/res/layout/main.xml
+++ b/res/layout/main.xml
@@ -8,165 +8,171 @@
a:background="#ff000000">
+ a:layout_gravity="center">
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/styles.xml b/res/values/styles.xml
index be73b39e..49225a9a 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -20,20 +20,19 @@
- @drawable/blue_button
+
+
diff --git a/src/org/solovyev/android/calculator/CalculatorActivity.java b/src/org/solovyev/android/calculator/CalculatorActivity.java
index d778e0ab..d874f9ca 100644
--- a/src/org/solovyev/android/calculator/CalculatorActivity.java
+++ b/src/org/solovyev/android/calculator/CalculatorActivity.java
@@ -8,8 +8,6 @@ import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Handler;
import android.util.TypedValue;
import android.view.*;
import android.widget.TextView;
@@ -28,9 +26,9 @@ import android.util.Log;
import android.widget.EditText;
import org.solovyev.util.math.Point2d;
-public class CalculatorActivity extends Activity implements FontSizeAdjuster{
+public class CalculatorActivity extends Activity implements FontSizeAdjuster {
- private static final int HVGA_WIDTH_PIXELS = 320;
+ private static final int HVGA_WIDTH_PIXELS = 320;
@NotNull
private EditText editText;
@@ -42,7 +40,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
private Interpreter interpreter;
@NotNull
- private HistoryHelper historyHelper;
+ private HistoryHelper historyHelper;
@NotNull
private BroadcastReceiver preferencesChangesReceiver;
@@ -106,8 +104,8 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
Log.e(CalculatorActivity.class.getName(), e.getMessage());
}
- this.historyHelper = new SimpleHistoryHelper();
- this.historyHelper.addState(getCurrentHistoryState());
+ this.historyHelper = new SimpleHistoryHelper();
+ saveHistoryState();
this.preferencesChangesReceiver = new BroadcastReceiver() {
@Override
@@ -123,6 +121,10 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
};
}
+ private void saveHistoryState() {
+ historyHelper.addState(getCurrentHistoryState());
+ }
+
public void elementaryButtonClickHandler(@NotNull View v) {
eval(JsclOperation.elementary);
}
@@ -131,14 +133,46 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
eval(JsclOperation.numeric);
}
+ public void eraseButtonClickHandler(@NotNull View v) {
+ editText.getText().delete(editText.getSelectionStart() - 1, editText.getSelectionStart());
+ saveHistoryState();
+ }
+
public void simplifyButtonClickHandler(@NotNull View v) {
eval(JsclOperation.simplify);
}
+ public void moveLeftButtonClickHandler(@NotNull View v) {
+ if (editText.getSelectionStart() > 0) {
+ editText.setSelection(editText.getSelectionStart() - 1);
+ }
+ }
+
+ public void moveRightButtonClickHandler(@NotNull View v) {
+ if (editText.getSelectionStart() < editText.getText().length()) {
+ editText.setSelection(editText.getSelectionStart() + 1);
+ }
+ }
+
+ public void clearButtonClickHandler(@NotNull View v) {
+ editText.getText().clear();
+ resultEditText.getText().clear();
+ saveHistoryState();
+ }
+
private void eval(@NotNull JsclOperation operation) {
try {
final String preprocessedString = Preprocessor.process(String.valueOf(editText.getText()));
resultEditText.setText(String.valueOf(interpreter.eval(Preprocessor.wrap(operation, preprocessedString))));
+
+ // result editor might be changed (but main editor - no) => make undo and add new state with saved result
+ CalculatorHistoryState currentHistoryState = getCurrentHistoryState();
+ if (this.historyHelper.isUndoAvailable()) {
+ this.historyHelper.undo(currentHistoryState);
+ }
+
+ this.historyHelper.addState(currentHistoryState);
+
} catch (EvalError e) {
Log.e(CalculatorActivity.class.getName(), e.getMessage());
resultEditText.setText(R.string.syntax_error);
@@ -165,7 +199,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
final HistoryAction historyAction = HistoryAction.valueOf(actionText);
if (historyHelper.isActionAvailable(historyAction)) {
- final EditorHistoryState newState = historyHelper.doAction(historyAction, getCurrentHistoryState());
+ final CalculatorHistoryState newState = historyHelper.doAction(historyAction, getCurrentHistoryState());
if (newState != null) {
setCurrentHistoryState(newState);
}
@@ -200,17 +234,26 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
return result;
}
- public void setCurrentHistoryState(@NotNull EditorHistoryState editorHistoryState) {
- this.editText.setText(editorHistoryState.getText());
- this.editText.setSelection(editorHistoryState.getCursorPosition(), editorHistoryState.getCursorPosition());
+ public void setCurrentHistoryState(@NotNull CalculatorHistoryState editorHistoryState) {
+ setValuesFromHistory(this.editText, editorHistoryState.getEditorState());
+ setValuesFromHistory(this.resultEditText, editorHistoryState.getResultEditorState());
+ }
+
+ private void setValuesFromHistory(@NotNull EditText editText, EditorHistoryState editorHistoryState) {
+ editText.setText(editorHistoryState.getText());
+ editText.setSelection(editorHistoryState.getCursorPosition());
}
@NotNull
- public EditorHistoryState getCurrentHistoryState() {
+ public CalculatorHistoryState getCurrentHistoryState() {
+ return new CalculatorHistoryState(getEditorHistoryState(this.editText), getEditorHistoryState(this.resultEditText));
+ }
+
+ private EditorHistoryState getEditorHistoryState(@NotNull EditText editorText) {
final EditorHistoryState result = new EditorHistoryState();
- result.setText(String.valueOf(this.editText.getText()));
- result.setCursorPosition(this.editText.getSelectionStart());
+ result.setText(String.valueOf(editorText.getText()));
+ result.setCursorPosition(editorText.getSelectionStart());
return result;
}
@@ -241,7 +284,7 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
this.editText.getText().insert(this.editText.getSelectionStart(), text);
this.editText.setSelection(this.editText.getSelectionStart() + cursorPositionOffset, this.editText.getSelectionEnd() + cursorPositionOffset);
- this.historyHelper.addState(getCurrentHistoryState());
+ saveHistoryState();
}
}
@@ -278,17 +321,17 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster{
Log.d(CalculatorActivity.class + "showHelp()", "Show help!");
}
- /**
- * The font sizes in the layout files are specified for a HVGA display.
- * Adjust the font sizes accordingly if we are running on a different
- * display.
- */
+ /**
+ * The font sizes in the layout files are specified for a HVGA display.
+ * Adjust the font sizes accordingly if we are running on a different
+ * display.
+ */
@Override
- public void adjustFontSize(@NotNull TextView view) {
- float fontPixelSize = view.getTextSize();
- Display display = getWindowManager().getDefaultDisplay();
- int h = Math.min(display.getWidth(), display.getHeight());
- float ratio = (float)h/HVGA_WIDTH_PIXELS;
- view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);
- }
+ public void adjustFontSize(@NotNull TextView view) {
+ float fontPixelSize = view.getTextSize();
+ Display display = getWindowManager().getDefaultDisplay();
+ int h = Math.min(display.getWidth(), display.getHeight());
+ float ratio = (float) h / HVGA_WIDTH_PIXELS;
+ view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize * ratio);
+ }
}
\ No newline at end of file
diff --git a/src/org/solovyev/android/calculator/CalculatorHistoryState.java b/src/org/solovyev/android/calculator/CalculatorHistoryState.java
new file mode 100644
index 00000000..f4468778
--- /dev/null
+++ b/src/org/solovyev/android/calculator/CalculatorHistoryState.java
@@ -0,0 +1,40 @@
+package org.solovyev.android.calculator;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * User: serso
+ * Date: 9/11/11
+ * Time: 12:16 AM
+ */
+public class CalculatorHistoryState {
+
+ @NotNull
+ private EditorHistoryState editorState;
+
+ @NotNull
+ private EditorHistoryState resultEditorState;
+
+ public CalculatorHistoryState(@NotNull EditorHistoryState editorState, @NotNull EditorHistoryState resultEditorState) {
+ this.editorState = editorState;
+ this.resultEditorState = resultEditorState;
+ }
+
+ @NotNull
+ public EditorHistoryState getEditorState() {
+ return editorState;
+ }
+
+ public void setEditorState(@NotNull EditorHistoryState editorState) {
+ this.editorState = editorState;
+ }
+
+ @NotNull
+ public EditorHistoryState getResultEditorState() {
+ return resultEditorState;
+ }
+
+ public void setResultEditorState(@NotNull EditorHistoryState resultEditorState) {
+ this.resultEditorState = resultEditorState;
+ }
+}
diff --git a/src/org/solovyev/android/calculator/Preprocessor.java b/src/org/solovyev/android/calculator/Preprocessor.java
index 60e54bc4..49701d76 100644
--- a/src/org/solovyev/android/calculator/Preprocessor.java
+++ b/src/org/solovyev/android/calculator/Preprocessor.java
@@ -15,10 +15,22 @@ public class Preprocessor {
sb.append('(');
} else if (ch == ']' || ch == '}') {
sb.append(')');
- } else if (ch == ',') {
- sb.append('.');
} else if (ch == 'π') {
sb.append("pi");
+ } else if (s.startsWith("ln", i)) {
+ sb.append("log");
+ i += 1;
+ } else if (s.startsWith("tg", i)) {
+ sb.append("tan");
+ i += 1;
+ } else if (s.startsWith("atg", i)) {
+ sb.append("atan");
+ i += 2;
+ } else if (s.startsWith("e(", i)) {
+ sb.append("exp(");
+ i += 1;
+ } else if (ch == 'e') {
+ sb.append("exp(1)");
} else if (ch == '√') {
sb.append("sqrt");
} else {
diff --git a/src/org/solovyev/android/view/PanelSwitcher.java b/src/org/solovyev/android/view/PanelSwitcher.java
deleted file mode 100644
index b8719de9..00000000
--- a/src/org/solovyev/android/view/PanelSwitcher.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.solovyev.android.view;
-
-import android.view.animation.TranslateAnimation;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.GestureDetector;
-import android.widget.FrameLayout;
-import android.content.Context;
-import android.util.AttributeSet;
-
-class PanelSwitcher extends FrameLayout {
- private static final int MAJOR_MOVE = 60;
- private static final int ANIM_DURATION = 400;
-
- private GestureDetector mGestureDetector;
- private int mCurrentView;
- private View mChildren[] = new View[0];
-
- private int mWidth;
- private TranslateAnimation inLeft;
- private TranslateAnimation outLeft;
-
- private TranslateAnimation inRight;
- private TranslateAnimation outRight;
-
- private static final int LEFT = 1;
- private static final int RIGHT = 2;
- private int mPreviousMove;
-
- public PanelSwitcher(Context context, AttributeSet attrs) {
- super(context, attrs);
- mCurrentView = 0;
- mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int dx = (int) (e2.getX() - e1.getX());
-
- // don't accept the fling if it's too short
- // as it may conflict with a button push
- if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) {
- if (velocityX > 0) {
- moveRight();
- } else {
- moveLeft();
- }
- return true;
- } else {
- return false;
- }
- }
- });
- }
-
- void setCurrentIndex(int current) {
- mCurrentView = current;
- updateCurrentView();
- }
-
- private void updateCurrentView() {
- for (int i = mChildren.length-1; i >= 0 ; --i) {
- mChildren[i].setVisibility(i==mCurrentView ? View.VISIBLE : View.GONE);
- }
- }
-
- @Override
- public void onSizeChanged(int w, int h, int oldW, int oldH) {
- mWidth = w;
- inLeft = new TranslateAnimation(mWidth, 0, 0, 0);
- outLeft = new TranslateAnimation(0, -mWidth, 0, 0);
- inRight = new TranslateAnimation(-mWidth, 0, 0, 0);
- outRight = new TranslateAnimation(0, mWidth, 0, 0);
-
- inLeft.setDuration(ANIM_DURATION);
- outLeft.setDuration(ANIM_DURATION);
- inRight.setDuration(ANIM_DURATION);
- outRight.setDuration(ANIM_DURATION);
- }
-
- protected void onFinishInflate() {
- int count = getChildCount();
- mChildren = new View[count];
- for (int i = 0; i < count; ++i) {
- mChildren[i] = getChildAt(i);
- }
- updateCurrentView();
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- mGestureDetector.onTouchEvent(event);
- return true;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return mGestureDetector.onTouchEvent(event);
- }
-
- void moveLeft() {
- // <--
- if (mCurrentView < mChildren.length - 1 && mPreviousMove != LEFT) {
- mChildren[mCurrentView+1].setVisibility(View.VISIBLE);
- mChildren[mCurrentView+1].startAnimation(inLeft);
- mChildren[mCurrentView].startAnimation(outLeft);
- mChildren[mCurrentView].setVisibility(View.GONE);
-
- mCurrentView++;
- mPreviousMove = LEFT;
- }
- }
-
- void moveRight() {
- // -->
- if (mCurrentView > 0 && mPreviousMove != RIGHT) {
- mChildren[mCurrentView-1].setVisibility(View.VISIBLE);
- mChildren[mCurrentView-1].startAnimation(inRight);
- mChildren[mCurrentView].startAnimation(outRight);
- mChildren[mCurrentView].setVisibility(View.GONE);
-
- mCurrentView--;
- mPreviousMove = RIGHT;
- }
- }
-
- int getCurrentIndex() {
- return mCurrentView;
- }
-}
diff --git a/src/org/solovyev/util/math/MathEntityType.java b/src/org/solovyev/util/math/MathEntityType.java
index db4e5ccb..f7800b55 100644
--- a/src/org/solovyev/util/math/MathEntityType.java
+++ b/src/org/solovyev/util/math/MathEntityType.java
@@ -19,7 +19,7 @@ public enum MathEntityType {
private static final List binaryOperations = Arrays.asList('-', '+', '*', '/', '^' );
- private static final List functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "exp", "log", "ln", "mod", "√");
+ private static final List functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√");
private static final List groupSymbols = Arrays.asList("[]", "()", "{}");