number formatting is working now
This commit is contained in:
parent
c91d57a92c
commit
8d15db4c3f
@ -62,7 +62,7 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="cpp_onscreen_editor_style" parent="cpp_editor_style">
|
<style name="cpp_onscreen_editor_style" parent="cpp_editor_style">
|
||||||
<item name="android:ellipsize">end</item>
|
<item name="android:ellipsize">none</item>
|
||||||
<item name="android:singleLine">true</item>
|
<item name="android:singleLine">true</item>
|
||||||
<item name="android:maxLines">1</item>
|
<item name="android:maxLines">1</item>
|
||||||
<item name="android:minLines">1</item>
|
<item name="android:minLines">1</item>
|
||||||
|
@ -35,6 +35,7 @@ import android.util.TypedValue;
|
|||||||
import org.solovyev.android.calculator.core.R;
|
import org.solovyev.android.calculator.core.R;
|
||||||
import org.solovyev.android.calculator.text.TextProcessor;
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
import org.solovyev.android.calculator.view.TextHighlighter;
|
import org.solovyev.android.calculator.view.TextHighlighter;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
import org.solovyev.android.view.AutoResizeTextView;
|
import org.solovyev.android.view.AutoResizeTextView;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@ -59,7 +60,7 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final static TextProcessor<TextHighlighter.Result, String> textHighlighter = new TextHighlighter(Color.WHITE, false);
|
private final static TextProcessor<TextProcessorEditorResult, String> textHighlighter = new TextHighlighter(Color.WHITE, false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
@ -169,7 +170,7 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
//Log.d(this.getClass().getName(), text);
|
//Log.d(this.getClass().getName(), text);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final TextHighlighter.Result processedText = textHighlighter.process(text);
|
final TextProcessorEditorResult processedText = textHighlighter.process(text);
|
||||||
text = processedText.toString();
|
text = processedText.toString();
|
||||||
result = Html.fromHtml(text);
|
result = Html.fromHtml(text);
|
||||||
} catch (CalculatorParseException e) {
|
} catch (CalculatorParseException e) {
|
||||||
|
@ -23,44 +23,26 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.Html;
|
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.text.TextProcessor;
|
|
||||||
import org.solovyev.android.calculator.view.TextHighlighter;
|
|
||||||
import org.solovyev.android.prefs.BooleanPreference;
|
|
||||||
import org.solovyev.common.collections.Collections;
|
import org.solovyev.common.collections.Collections;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
* Date: 9/17/11
|
* Date: 9/17/11
|
||||||
* Time: 12:25 AM
|
* Time: 12:25 AM
|
||||||
*/
|
*/
|
||||||
public class AndroidCalculatorEditorView extends EditText implements SharedPreferences.OnSharedPreferenceChangeListener, CalculatorEditorView {
|
public class AndroidCalculatorEditorView extends EditText implements CalculatorEditorView {
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private static final BooleanPreference colorDisplay = BooleanPreference.of("org.solovyev.android.calculator.CalculatorModel_color_display", true);
|
|
||||||
|
|
||||||
private volatile boolean initialized = false;
|
private volatile boolean initialized = false;
|
||||||
|
|
||||||
private boolean highlightText = true;
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final static TextProcessor<TextHighlighter.Result, String> textHighlighter = new TextHighlighter(Color.WHITE, false);
|
|
||||||
|
|
||||||
@SuppressWarnings("UnusedDeclaration")
|
@SuppressWarnings("UnusedDeclaration")
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private volatile CalculatorEditorViewState viewState = CalculatorEditorViewStateImpl.newDefaultInstance();
|
private volatile CalculatorEditorViewState viewState = CalculatorEditorViewStateImpl.newDefaultInstance();
|
||||||
@ -113,57 +95,15 @@ public class AndroidCalculatorEditorView extends EditText implements SharedPrefe
|
|||||||
menu.removeItem(android.R.id.selectAll);
|
menu.removeItem(android.R.id.selectAll);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private CharSequence prepareText(@Nonnull String text, boolean highlightText) {
|
|
||||||
CharSequence result;
|
|
||||||
|
|
||||||
if (highlightText) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
final TextHighlighter.Result processesText = textHighlighter.process(text);
|
|
||||||
|
|
||||||
assert processesText.getOffset() == 0;
|
|
||||||
|
|
||||||
result = Html.fromHtml(processesText.toString());
|
|
||||||
} catch (CalculatorParseException e) {
|
|
||||||
// set raw text
|
|
||||||
result = text;
|
|
||||||
|
|
||||||
Log.e(this.getClass().getName(), e.getMessage(), e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isHighlightText() {
|
|
||||||
return highlightText;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHighlightText(boolean highlightText) {
|
public void setHighlightText(boolean highlightText) {
|
||||||
this.highlightText = highlightText;
|
//this.highlightText = highlightText;
|
||||||
Locator.getInstance().getEditor().updateViewState();
|
Locator.getInstance().getEditor().updateViewState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public synchronized void init() {
|
||||||
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
|
||||||
if (colorDisplay.getKey().equals(key)) {
|
|
||||||
this.setHighlightText(colorDisplay.getPreference(preferences));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void init(@Nonnull Context context) {
|
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
|
|
||||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
|
|
||||||
this.addTextChangedListener(new TextWatcherImpl());
|
this.addTextChangedListener(new TextWatcherImpl());
|
||||||
|
|
||||||
onSharedPreferenceChanged(preferences, colorDisplay.getKey());
|
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,8 +112,6 @@ public class AndroidCalculatorEditorView extends EditText implements SharedPrefe
|
|||||||
public void setState(@Nonnull final CalculatorEditorViewState viewState) {
|
public void setState(@Nonnull final CalculatorEditorViewState viewState) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
|
||||||
final CharSequence text = prepareText(viewState.getText(), highlightText);
|
|
||||||
|
|
||||||
uiHandler.post(new Runnable() {
|
uiHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -182,7 +120,7 @@ public class AndroidCalculatorEditorView extends EditText implements SharedPrefe
|
|||||||
try {
|
try {
|
||||||
editorView.viewStateChange = true;
|
editorView.viewStateChange = true;
|
||||||
editorView.viewState = viewState;
|
editorView.viewState = viewState;
|
||||||
editorView.setText(text, BufferType.EDITABLE);
|
editorView.setText(viewState.getTextAsCharSequence(), BufferType.EDITABLE);
|
||||||
final int selection = CalculatorEditorImpl.correctSelection(viewState.getSelection(), editorView.getText());
|
final int selection = CalculatorEditorImpl.correctSelection(viewState.getSelection(), editorView.getText());
|
||||||
editorView.setSelection(selection);
|
editorView.setSelection(selection);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -84,6 +84,7 @@ public final class CalculatorPreferences {
|
|||||||
public static final Preference<Boolean> autoOrientation = BooleanPreference.of("autoOrientation", true);
|
public static final Preference<Boolean> autoOrientation = BooleanPreference.of("autoOrientation", true);
|
||||||
public static final Preference<Boolean> hideNumeralBaseDigits = BooleanPreference.of("hideNumeralBaseDigits", true);
|
public static final Preference<Boolean> hideNumeralBaseDigits = BooleanPreference.of("hideNumeralBaseDigits", true);
|
||||||
public static final Preference<Boolean> preventScreenFromFading = BooleanPreference.of("preventScreenFromFading", true);
|
public static final Preference<Boolean> preventScreenFromFading = BooleanPreference.of("preventScreenFromFading", true);
|
||||||
|
public static final Preference<Boolean> colorDisplay = BooleanPreference.of("org.solovyev.android.calculator.CalculatorModel_color_display", true);
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static Theme getTheme(@Nonnull SharedPreferences preferences) {
|
public static Theme getTheme(@Nonnull SharedPreferences preferences) {
|
||||||
|
@ -66,6 +66,12 @@ public final class ParcelableCalculatorEditorViewState implements CalculatorEdit
|
|||||||
return viewState.getText();
|
return viewState.getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public CharSequence getTextAsCharSequence() {
|
||||||
|
return getText();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSelection() {
|
public int getSelection() {
|
||||||
return viewState.getSelection();
|
return viewState.getSelection();
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
package org.solovyev.android.calculator.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.text.Html;
|
||||||
|
import android.util.Log;
|
||||||
|
import org.solovyev.android.calculator.CalculatorParseException;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import static org.solovyev.android.calculator.CalculatorPreferences.Gui.colorDisplay;
|
||||||
|
import static org.solovyev.android.calculator.view.TextHighlighter.WHITE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 6/27/13
|
||||||
|
* Time: 6:11 PM
|
||||||
|
*/
|
||||||
|
public final class EditorTextProcessor implements TextProcessor<TextProcessorEditorResult, String>, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
private boolean highlightText = true;
|
||||||
|
|
||||||
|
private final TextProcessor<TextProcessorEditorResult, String> textHighlighter = new TextHighlighter(WHITE, true);
|
||||||
|
|
||||||
|
public EditorTextProcessor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(@Nonnull Context context) {
|
||||||
|
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
onSharedPreferenceChanged(preferences, colorDisplay.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public TextProcessorEditorResult process(@Nonnull String text) throws CalculatorParseException {
|
||||||
|
TextProcessorEditorResult result;
|
||||||
|
|
||||||
|
if (highlightText) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final TextProcessorEditorResult processesText = textHighlighter.process(text);
|
||||||
|
|
||||||
|
result = new TextProcessorEditorResult(Html.fromHtml(processesText.toString()), processesText.getOffset());
|
||||||
|
} catch (CalculatorParseException e) {
|
||||||
|
// set raw text
|
||||||
|
result = new TextProcessorEditorResult(text, 0);
|
||||||
|
|
||||||
|
Log.e(this.getClass().getName(), e.getMessage(), e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = new TextProcessorEditorResult(text, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHighlightText() {
|
||||||
|
return highlightText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHighlightText(boolean highlightText) {
|
||||||
|
this.highlightText = highlightText;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
|
if (colorDisplay.getKey().equals(key)) {
|
||||||
|
this.setHighlightText(colorDisplay.getPreference(preferences));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,14 +22,14 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator.view;
|
package org.solovyev.android.calculator.view;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.*;
|
||||||
import org.solovyev.android.calculator.math.MathType;
|
import org.solovyev.android.calculator.math.MathType;
|
||||||
import org.solovyev.android.calculator.text.TextProcessor;
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
import org.solovyev.common.MutableObject;
|
import org.solovyev.common.MutableObject;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -38,7 +38,9 @@ import java.util.Map;
|
|||||||
* Date: 10/12/11
|
* Date: 10/12/11
|
||||||
* Time: 9:47 PM
|
* Time: 9:47 PM
|
||||||
*/
|
*/
|
||||||
public class TextHighlighter implements TextProcessor<TextHighlighter.Result, String> {
|
public class TextHighlighter implements TextProcessor<TextProcessorEditorResult, String> {
|
||||||
|
|
||||||
|
public static final int WHITE = -1;
|
||||||
|
|
||||||
private static final Map<String, String> nbFontAttributes = new HashMap<String, String>();
|
private static final Map<String, String> nbFontAttributes = new HashMap<String, String>();
|
||||||
|
|
||||||
@ -46,54 +48,6 @@ public class TextHighlighter implements TextProcessor<TextHighlighter.Result, St
|
|||||||
nbFontAttributes.put("color", "#008000");
|
nbFontAttributes.put("color", "#008000");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Result implements CharSequence {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final CharSequence charSequence;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private String string;
|
|
||||||
|
|
||||||
private final int offset;
|
|
||||||
|
|
||||||
public Result(@Nonnull CharSequence charSequence, int offset) {
|
|
||||||
this.charSequence = charSequence;
|
|
||||||
this.offset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int length() {
|
|
||||||
return charSequence.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public char charAt(int i) {
|
|
||||||
return charSequence.charAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CharSequence subSequence(int i, int i1) {
|
|
||||||
return charSequence.subSequence(i, i1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
if (string == null) {
|
|
||||||
string = charSequence.toString();
|
|
||||||
}
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public CharSequence getCharSequence() {
|
|
||||||
return charSequence;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getOffset() {
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final int color;
|
private final int color;
|
||||||
private final int colorRed;
|
private final int colorRed;
|
||||||
private final int colorGreen;
|
private final int colorGreen;
|
||||||
@ -113,7 +67,7 @@ public class TextHighlighter implements TextProcessor<TextHighlighter.Result, St
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public Result process(@Nonnull String text) throws CalculatorParseException {
|
public TextProcessorEditorResult process(@Nonnull String text) throws CalculatorParseException {
|
||||||
final CharSequence result;
|
final CharSequence result;
|
||||||
|
|
||||||
int maxNumberOfOpenGroupSymbols = 0;
|
int maxNumberOfOpenGroupSymbols = 0;
|
||||||
@ -186,20 +140,17 @@ public class TextHighlighter implements TextProcessor<TextHighlighter.Result, St
|
|||||||
|
|
||||||
final StringBuilder text2 = new StringBuilder(text1.length());
|
final StringBuilder text2 = new StringBuilder(text1.length());
|
||||||
|
|
||||||
final CharSequence s = text1;
|
int i = processBracketGroup(text2, text1, 0, 0, maxNumberOfOpenGroupSymbols);
|
||||||
int i = processBracketGroup(text2, s, 0, 0, maxNumberOfOpenGroupSymbols);
|
for (; i < text1.length(); i++) {
|
||||||
for (; i < s.length(); i++) {
|
text2.append(text1.charAt(i));
|
||||||
text2.append(s.charAt(i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Log.d(AndroidCalculatorEditorView.class.getName(), text2.toString());
|
|
||||||
|
|
||||||
result = text2.toString();
|
result = text2.toString();
|
||||||
} else {
|
} else {
|
||||||
result = text1.toString();
|
result = text1.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Result(result, resultOffset);
|
return new TextProcessorEditorResult(result, resultOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int processHighlightedText(@Nonnull StringBuilder result, int i, @Nonnull String match, @Nonnull String tag, @Nullable Map<String, String> tagAttributes) {
|
private int processHighlightedText(@Nonnull StringBuilder result, int i, @Nonnull String match, @Nonnull String tag, @Nullable Map<String, String> tagAttributes) {
|
||||||
|
@ -31,35 +31,26 @@ import android.os.IBinder;
|
|||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import org.solovyev.android.Views;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
|
import org.solovyev.android.calculator.external.AndroidExternalListenersContainer;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.solovyev.android.Views;
|
import static org.solovyev.android.calculator.external.AndroidExternalListenersContainer.INIT_ACTION;
|
||||||
import org.solovyev.android.calculator.CalculatorDisplayViewState;
|
|
||||||
import org.solovyev.android.calculator.CalculatorEditorViewState;
|
|
||||||
import org.solovyev.android.calculator.Locator;
|
|
||||||
import org.solovyev.android.calculator.external.AndroidExternalListenersContainer;
|
|
||||||
import org.solovyev.android.calculator.external.DefaultExternalCalculatorIntentHandler;
|
|
||||||
import org.solovyev.android.calculator.external.ExternalCalculatorIntentHandler;
|
|
||||||
import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
* Date: 11/20/12
|
* Date: 11/20/12
|
||||||
* Time: 9:42 PM
|
* Time: 9:42 PM
|
||||||
*/
|
*/
|
||||||
public class CalculatorOnscreenService extends Service implements ExternalCalculatorStateUpdater, OnscreenViewListener {
|
public class CalculatorOnscreenService extends Service implements OnscreenViewListener, CalculatorEventListener {
|
||||||
|
|
||||||
private static final int NOTIFICATION_ID = 9031988; // my birthday =)
|
private static final int NOTIFICATION_ID = 9031988; // my birthday =)
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final ExternalCalculatorIntentHandler intentHandler = new DefaultExternalCalculatorIntentHandler(this);
|
|
||||||
public static final Class<CalculatorOnscreenBroadcastReceiver> INTENT_LISTENER_CLASS = CalculatorOnscreenBroadcastReceiver.class;
|
public static final Class<CalculatorOnscreenBroadcastReceiver> INTENT_LISTENER_CLASS = CalculatorOnscreenBroadcastReceiver.class;
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static String cursorColor;
|
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private CalculatorOnscreenView view;
|
private CalculatorOnscreenView view;
|
||||||
|
|
||||||
@ -96,7 +87,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
final int width = Math.min(width0, height0);
|
final int width = Math.min(width0, height0);
|
||||||
final int height = Math.max(width0, height0);
|
final int height = Math.max(width0, height0);
|
||||||
|
|
||||||
view = CalculatorOnscreenView.newInstance(this, CalculatorOnscreenViewState.newInstance(width, height, -1, -1), getCursorColor(this), this);
|
view = CalculatorOnscreenView.newInstance(this, CalculatorOnscreenViewState.newInstance(width, height, -1, -1), this);
|
||||||
view.show();
|
view.show();
|
||||||
|
|
||||||
startCalculatorListening();
|
startCalculatorListening();
|
||||||
@ -110,7 +101,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startCalculatorListening() {
|
private void startCalculatorListening() {
|
||||||
Locator.getInstance().getExternalListenersContainer().addExternalListener(getIntentListenerClass());
|
Locator.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@ -119,7 +110,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void stopCalculatorListening() {
|
private void stopCalculatorListening() {
|
||||||
Locator.getInstance().getExternalListenersContainer().removeExternalListener(getIntentListenerClass());
|
Locator.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -131,20 +122,6 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateState(@Nonnull Context context, @Nonnull CalculatorEditorViewState editorState, @Nonnull CalculatorDisplayViewState displayState) {
|
|
||||||
view.updateDisplayState(displayState);
|
|
||||||
view.updateEditorState(editorState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private static String getCursorColor(@Nonnull Context context) {
|
|
||||||
if (cursorColor == null) {
|
|
||||||
cursorColor = Integer.toHexString(context.getResources().getColor(R.color.cpp_onscreen_cursor_color)).substring(2);
|
|
||||||
}
|
|
||||||
return cursorColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart(Intent intent, int startId) {
|
public void onStart(Intent intent, int startId) {
|
||||||
super.onStart(intent, startId);
|
super.onStart(intent, startId);
|
||||||
@ -182,16 +159,11 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
showNotification();
|
showNotification();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (viewCreated) {
|
|
||||||
intentHandler.onIntent(this, intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isInitIntent(@Nonnull Intent intent) {
|
private boolean isInitIntent(@Nonnull Intent intent) {
|
||||||
return intent.getAction().equals(AndroidExternalListenersContainer.INIT_ACTION);
|
return intent.getAction().equals(INIT_ACTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void hideNotification() {
|
private void hideNotification() {
|
||||||
@ -225,7 +197,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void showNotification(@Nonnull Context context) {
|
public static void showNotification(@Nonnull Context context) {
|
||||||
final Intent intent = new Intent(AndroidExternalListenersContainer.INIT_ACTION);
|
final Intent intent = new Intent(INIT_ACTION);
|
||||||
intent.setClass(context, getIntentListenerClass());
|
intent.setClass(context, getIntentListenerClass());
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
@ -237,10 +209,23 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static Intent createShowOnscreenViewIntent(@Nonnull Context context) {
|
private static Intent createShowOnscreenViewIntent(@Nonnull Context context) {
|
||||||
final Intent intent = new Intent(AndroidExternalListenersContainer.INIT_ACTION);
|
final Intent intent = new Intent(INIT_ACTION);
|
||||||
intent.setClass(context, getIntentListenerClass());
|
intent.setClass(context, getIntentListenerClass());
|
||||||
intent.putExtra(AndroidExternalListenersContainer.INIT_ACTION_CREATE_VIEW_EXTRA, true);
|
intent.putExtra(AndroidExternalListenersContainer.INIT_ACTION_CREATE_VIEW_EXTRA, true);
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
||||||
|
switch (calculatorEventType) {
|
||||||
|
case editor_state_changed:
|
||||||
|
case editor_state_changed_light:
|
||||||
|
view.updateEditorState(((CalculatorEditorChangeEventData) data).getNewValue());
|
||||||
|
break;
|
||||||
|
case display_state_changed:
|
||||||
|
view.updateDisplayState(((CalculatorDisplayChangeEventData) data).getNewValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,13 +33,12 @@ import android.view.MotionEvent;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
|
import org.solovyev.android.prefs.Preference;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.*;
|
|
||||||
import org.solovyev.android.prefs.Preference;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
* Date: 11/21/12
|
* Date: 11/21/12
|
||||||
@ -95,9 +94,6 @@ public class CalculatorOnscreenView {
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private CalculatorOnscreenViewState state = CalculatorOnscreenViewState.newDefaultState();
|
private CalculatorOnscreenViewState state = CalculatorOnscreenViewState.newDefaultState();
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private String cursorColor;
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private OnscreenViewListener viewListener;
|
private OnscreenViewListener viewListener;
|
||||||
|
|
||||||
@ -133,13 +129,11 @@ public class CalculatorOnscreenView {
|
|||||||
|
|
||||||
public static CalculatorOnscreenView newInstance(@Nonnull Context context,
|
public static CalculatorOnscreenView newInstance(@Nonnull Context context,
|
||||||
@Nonnull CalculatorOnscreenViewState state,
|
@Nonnull CalculatorOnscreenViewState state,
|
||||||
@Nonnull String cursorColor,
|
|
||||||
@Nullable OnscreenViewListener viewListener) {
|
@Nullable OnscreenViewListener viewListener) {
|
||||||
final CalculatorOnscreenView result = new CalculatorOnscreenView();
|
final CalculatorOnscreenView result = new CalculatorOnscreenView();
|
||||||
|
|
||||||
result.root = View.inflate(context, R.layout.onscreen_layout, null);
|
result.root = View.inflate(context, R.layout.onscreen_layout, null);
|
||||||
result.context = context;
|
result.context = context;
|
||||||
result.cursorColor = cursorColor;
|
|
||||||
result.viewListener = viewListener;
|
result.viewListener = viewListener;
|
||||||
|
|
||||||
final CalculatorOnscreenViewState persistedState = readState(context);
|
final CalculatorOnscreenViewState persistedState = readState(context);
|
||||||
@ -222,7 +216,7 @@ public class CalculatorOnscreenView {
|
|||||||
displayView.init(this.context, false);
|
displayView.init(this.context, false);
|
||||||
|
|
||||||
editorView = (AndroidCalculatorEditorView) root.findViewById(R.id.calculator_editor);
|
editorView = (AndroidCalculatorEditorView) root.findViewById(R.id.calculator_editor);
|
||||||
editorView.init(this.context);
|
editorView.init();
|
||||||
|
|
||||||
final View onscreenFoldButton = root.findViewById(R.id.onscreen_fold_button);
|
final View onscreenFoldButton = root.findViewById(R.id.onscreen_fold_button);
|
||||||
onscreenFoldButton.setOnClickListener(new View.OnClickListener() {
|
onscreenFoldButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@ -173,13 +173,13 @@ abstract class AbstractCalculatorWidgetProvider extends AppWidgetProvider implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateEditorState(@Nonnull Context context, @Nonnull RemoteViews views, @Nonnull CalculatorEditorViewState editorState) {
|
private void updateEditorState(@Nonnull Context context, @Nonnull RemoteViews views, @Nonnull CalculatorEditorViewState editorState) {
|
||||||
String text = editorState.getText();
|
final CharSequence text = editorState.getTextAsCharSequence();
|
||||||
|
|
||||||
CharSequence newText = text;
|
CharSequence newText = text;
|
||||||
int selection = editorState.getSelection();
|
int selection = editorState.getSelection();
|
||||||
if (selection >= 0 && selection <= text.length()) {
|
if (selection >= 0 && selection <= text.length()) {
|
||||||
// inject cursor
|
// inject cursor
|
||||||
newText = Html.fromHtml(text.substring(0, selection) + "<font color=\"#" + getCursorColor(context) + "\">|</font>" + text.substring(selection));
|
newText = Html.fromHtml(text.subSequence(0, selection) + "<font color=\"#" + getCursorColor(context) + "\">|</font>" + text.subSequence(selection, text.length()));
|
||||||
}
|
}
|
||||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "New editor state: " + text);
|
Locator.getInstance().getNotifier().showDebugMessage(TAG, "New editor state: " + text);
|
||||||
views.setTextViewText(R.id.calculator_editor, newText);
|
views.setTextViewText(R.id.calculator_editor, newText);
|
||||||
|
@ -29,15 +29,13 @@ import android.content.SharedPreferences;
|
|||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import jscl.NumeralBase;
|
import jscl.NumeralBase;
|
||||||
import jscl.math.Generic;
|
import jscl.math.Generic;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import org.solovyev.android.calculator.history.CalculatorHistoryState;
|
import org.solovyev.android.calculator.history.CalculatorHistoryState;
|
||||||
import org.solovyev.android.calculator.jscl.JsclOperation;
|
import org.solovyev.android.calculator.jscl.JsclOperation;
|
||||||
import org.solovyev.common.history.HistoryAction;
|
import org.solovyev.common.history.HistoryAction;
|
||||||
import org.solovyev.common.msg.Message;
|
import org.solovyev.common.msg.Message;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,7 +79,7 @@ public class AndroidCalculator implements Calculator, CalculatorEventListener, S
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setEditor(@Nonnull Context context, @Nonnull AndroidCalculatorEditorView editorView) {
|
public void setEditor(@Nonnull Context context, @Nonnull AndroidCalculatorEditorView editorView) {
|
||||||
editorView.init(context);
|
editorView.init();
|
||||||
Locator.getInstance().getEditor().setView(editorView);
|
Locator.getInstance().getEditor().setView(editorView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,13 +31,9 @@ import android.util.Log;
|
|||||||
import net.robotmedia.billing.BillingController;
|
import net.robotmedia.billing.BillingController;
|
||||||
import net.robotmedia.billing.helper.DefaultBillingObserver;
|
import net.robotmedia.billing.helper.DefaultBillingObserver;
|
||||||
import net.robotmedia.billing.model.BillingDB;
|
import net.robotmedia.billing.model.BillingDB;
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.ReportingInteractionMode;
|
import org.acra.ReportingInteractionMode;
|
||||||
import org.acra.annotation.ReportsCrashes;
|
import org.acra.annotation.ReportsCrashes;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
import org.solovyev.android.Android;
|
import org.solovyev.android.Android;
|
||||||
import org.solovyev.android.App;
|
import org.solovyev.android.App;
|
||||||
import org.solovyev.android.ServiceLocator;
|
import org.solovyev.android.ServiceLocator;
|
||||||
@ -48,8 +44,10 @@ import org.solovyev.android.calculator.model.AndroidCalculatorEngine;
|
|||||||
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenStartActivity;
|
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenStartActivity;
|
||||||
import org.solovyev.android.calculator.plot.AndroidCalculatorPlotter;
|
import org.solovyev.android.calculator.plot.AndroidCalculatorPlotter;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotterImpl;
|
import org.solovyev.android.calculator.plot.CalculatorPlotterImpl;
|
||||||
|
import org.solovyev.android.calculator.view.EditorTextProcessor;
|
||||||
import org.solovyev.common.msg.MessageType;
|
import org.solovyev.common.msg.MessageType;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -137,6 +135,8 @@ public class CalculatorApplication extends android.app.Application implements Sh
|
|||||||
|
|
||||||
final AndroidCalculator calculator = new AndroidCalculator(this);
|
final AndroidCalculator calculator = new AndroidCalculator(this);
|
||||||
|
|
||||||
|
final EditorTextProcessor editorTextProcessor = new EditorTextProcessor();
|
||||||
|
|
||||||
Locator.getInstance().init(calculator,
|
Locator.getInstance().init(calculator,
|
||||||
new AndroidCalculatorEngine(this),
|
new AndroidCalculatorEngine(this),
|
||||||
new AndroidCalculatorClipboard(this),
|
new AndroidCalculatorClipboard(this),
|
||||||
@ -146,7 +146,10 @@ public class CalculatorApplication extends android.app.Application implements Sh
|
|||||||
new AndroidCalculatorPreferenceService(this),
|
new AndroidCalculatorPreferenceService(this),
|
||||||
new AndroidCalculatorKeyboard(this, new CalculatorKeyboardImpl(calculator)),
|
new AndroidCalculatorKeyboard(this, new CalculatorKeyboardImpl(calculator)),
|
||||||
new AndroidExternalListenersContainer(calculator),
|
new AndroidExternalListenersContainer(calculator),
|
||||||
new AndroidCalculatorPlotter(this, new CalculatorPlotterImpl(calculator)));
|
new AndroidCalculatorPlotter(this, new CalculatorPlotterImpl(calculator)),
|
||||||
|
editorTextProcessor);
|
||||||
|
|
||||||
|
editorTextProcessor.init(this);
|
||||||
|
|
||||||
listeners.add(new CalculatorActivityLauncher());
|
listeners.add(new CalculatorActivityLauncher());
|
||||||
for (CalculatorEventListener listener : listeners) {
|
for (CalculatorEventListener listener : listeners) {
|
||||||
|
@ -41,7 +41,7 @@ import javax.annotation.Nullable;
|
|||||||
public class CalculatorTestUtils {
|
public class CalculatorTestUtils {
|
||||||
|
|
||||||
public static void staticSetUp(@Nullable Context context) throws Exception {
|
public static void staticSetUp(@Nullable Context context) throws Exception {
|
||||||
Locator.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class));
|
Locator.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class), null);
|
||||||
Locator.getInstance().getEngine().init();
|
Locator.getInstance().getEngine().init();
|
||||||
|
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
@ -51,7 +51,7 @@ public class CalculatorTestUtils {
|
|||||||
|
|
||||||
public static void initViews(@Nonnull Context context) {
|
public static void initViews(@Nonnull Context context) {
|
||||||
final AndroidCalculatorEditorView editor = new AndroidCalculatorEditorView(context);
|
final AndroidCalculatorEditorView editor = new AndroidCalculatorEditorView(context);
|
||||||
editor.init(context);
|
editor.init();
|
||||||
Locator.getInstance().getEditor().setView(editor);
|
Locator.getInstance().getEditor().setView(editor);
|
||||||
|
|
||||||
final AndroidCalculatorDisplayView display = new AndroidCalculatorDisplayView(context);
|
final AndroidCalculatorDisplayView display = new AndroidCalculatorDisplayView(context);
|
||||||
|
@ -22,11 +22,11 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import org.solovyev.common.gui.CursorControl;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.solovyev.common.gui.CursorControl;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
* Date: 21.09.12
|
* Date: 21.09.12
|
||||||
@ -34,6 +34,9 @@ import org.solovyev.common.gui.CursorControl;
|
|||||||
*/
|
*/
|
||||||
public interface CalculatorEditor extends CalculatorEventListener {
|
public interface CalculatorEditor extends CalculatorEventListener {
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
String TAG = CalculatorEditor.class.getSimpleName();
|
||||||
|
|
||||||
void setView(@Nullable CalculatorEditorView view);
|
void setView(@Nullable CalculatorEditorView view);
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
|
@ -22,10 +22,41 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
* Date: 21.09.12
|
* Date: 21.09.12
|
||||||
* Time: 13:46
|
* Time: 13:46
|
||||||
*/
|
*/
|
||||||
public interface CalculatorEditorChangeEventData extends Change<CalculatorEditorViewState> {
|
public final class CalculatorEditorChangeEventData implements Change<CalculatorEditorViewState> {
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private CalculatorEditorViewState oldState;
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private CalculatorEditorViewState newState;
|
||||||
|
|
||||||
|
private CalculatorEditorChangeEventData(@Nonnull CalculatorEditorViewState oldState,
|
||||||
|
@Nonnull CalculatorEditorViewState newState) {
|
||||||
|
this.oldState = oldState;
|
||||||
|
this.newState = newState;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CalculatorEditorChangeEventData newChangeEventData(@Nonnull CalculatorEditorViewState oldState,
|
||||||
|
@Nonnull CalculatorEditorViewState newState) {
|
||||||
|
return new CalculatorEditorChangeEventData(oldState, newState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public CalculatorEditorViewState getOldValue() {
|
||||||
|
return this.oldState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public CalculatorEditorViewState getNewValue() {
|
||||||
|
return this.newState;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 serso aka se.solovyev
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
* Contact details
|
|
||||||
*
|
|
||||||
* Email: se.solovyev@gmail.com
|
|
||||||
* Site: http://se.solovyev.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.solovyev.android.calculator;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: Solovyev_S
|
|
||||||
* Date: 21.09.12
|
|
||||||
* Time: 13:46
|
|
||||||
*/
|
|
||||||
public class CalculatorEditorChangeEventDataImpl implements CalculatorEditorChangeEventData {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private CalculatorEditorViewState oldState;
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private CalculatorEditorViewState newState;
|
|
||||||
|
|
||||||
public CalculatorEditorChangeEventDataImpl(@Nonnull CalculatorEditorViewState oldState,
|
|
||||||
@Nonnull CalculatorEditorViewState newState) {
|
|
||||||
this.oldState = oldState;
|
|
||||||
this.newState = newState;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public CalculatorEditorViewState getOldValue() {
|
|
||||||
return this.oldState;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public CalculatorEditorViewState getNewValue() {
|
|
||||||
return this.newState;
|
|
||||||
}
|
|
||||||
}
|
|
@ -22,13 +22,19 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import org.solovyev.android.calculator.history.CalculatorHistoryState;
|
||||||
|
import org.solovyev.android.calculator.history.EditorHistoryState;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
|
import org.solovyev.common.gui.CursorControl;
|
||||||
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.history.CalculatorHistoryState;
|
import static org.solovyev.android.calculator.CalculatorEditorChangeEventData.newChangeEventData;
|
||||||
import org.solovyev.android.calculator.history.EditorHistoryState;
|
import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed;
|
||||||
import org.solovyev.common.gui.CursorControl;
|
import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed_light;
|
||||||
import org.solovyev.common.text.Strings;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
@ -55,8 +61,12 @@ public class CalculatorEditorImpl implements CalculatorEditor {
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private final CursorControlAdapter cursorControlAdapter = new CursorControlAdapter(this);
|
private final CursorControlAdapter cursorControlAdapter = new CursorControlAdapter(this);
|
||||||
|
|
||||||
public CalculatorEditorImpl(@Nonnull Calculator calculator) {
|
@Nullable
|
||||||
|
private final TextProcessor<TextProcessorEditorResult, String> textProcessor;
|
||||||
|
|
||||||
|
public CalculatorEditorImpl(@Nonnull Calculator calculator, @Nullable TextProcessor<TextProcessorEditorResult, String> textProcessor) {
|
||||||
this.calculator = calculator;
|
this.calculator = calculator;
|
||||||
|
this.textProcessor = textProcessor;
|
||||||
this.calculator.addCalculatorEventListener(this);
|
this.calculator.addCalculatorEventListener(this);
|
||||||
this.lastEventHolder = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId());
|
this.lastEventHolder = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId());
|
||||||
}
|
}
|
||||||
@ -89,6 +99,14 @@ public class CalculatorEditorImpl implements CalculatorEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setViewState(@Nonnull CalculatorEditorViewState newViewState, boolean majorChanges) {
|
private void setViewState(@Nonnull CalculatorEditorViewState newViewState, boolean majorChanges) {
|
||||||
|
if (textProcessor != null) {
|
||||||
|
try {
|
||||||
|
final TextProcessorEditorResult result = textProcessor.process(newViewState.getText());
|
||||||
|
newViewState = CalculatorEditorViewStateImpl.newInstance(result.getCharSequence(), newViewState.getSelection() + result.getOffset());
|
||||||
|
} catch (CalculatorParseException e) {
|
||||||
|
Locator.getInstance().getLogger().error(TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
synchronized (viewLock) {
|
synchronized (viewLock) {
|
||||||
final CalculatorEditorViewState oldViewState = this.lastViewState;
|
final CalculatorEditorViewState oldViewState = this.lastViewState;
|
||||||
|
|
||||||
@ -97,12 +115,18 @@ public class CalculatorEditorImpl implements CalculatorEditor {
|
|||||||
this.view.setState(newViewState);
|
this.view.setState(newViewState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (majorChanges) {
|
fireStateChangedEvent(majorChanges, oldViewState, newViewState);
|
||||||
calculator.fireCalculatorEvent(CalculatorEventType.editor_state_changed, new CalculatorEditorChangeEventDataImpl(oldViewState, newViewState));
|
|
||||||
} else {
|
|
||||||
calculator.fireCalculatorEvent(CalculatorEventType.editor_state_changed_light, new CalculatorEditorChangeEventDataImpl(oldViewState, newViewState));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void fireStateChangedEvent(boolean majorChanges, @Nonnull CalculatorEditorViewState oldViewState, @Nonnull CalculatorEditorViewState newViewState) {
|
||||||
|
assert Thread.holdsLock(viewLock);
|
||||||
|
|
||||||
|
if (majorChanges) {
|
||||||
|
calculator.fireCalculatorEvent(editor_state_changed, newChangeEventData(oldViewState, newViewState));
|
||||||
|
} else {
|
||||||
|
calculator.fireCalculatorEvent(editor_state_changed_light, newChangeEventData(oldViewState, newViewState));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -36,5 +36,8 @@ public interface CalculatorEditorViewState extends Serializable {
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
String getText();
|
String getText();
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
CharSequence getTextAsCharSequence();
|
||||||
|
|
||||||
int getSelection();
|
int getSelection();
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ import javax.annotation.Nonnull;
|
|||||||
public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState {
|
public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState {
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private String text = "";
|
private CharSequence text = "";
|
||||||
|
|
||||||
private int selection = 0;
|
private int selection = 0;
|
||||||
|
|
||||||
@ -47,6 +47,12 @@ public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public String getText() {
|
public String getText() {
|
||||||
|
return this.text.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public CharSequence getTextAsCharSequence() {
|
||||||
return this.text;
|
return this.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +76,7 @@ public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static CalculatorEditorViewState newInstance(@Nonnull String text, int selection) {
|
public static CalculatorEditorViewState newInstance(@Nonnull CharSequence text, int selection) {
|
||||||
final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl();
|
final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl();
|
||||||
result.text = text;
|
result.text = text;
|
||||||
result.selection = selection;
|
result.selection = selection;
|
||||||
|
@ -22,11 +22,14 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
import org.solovyev.android.calculator.external.CalculatorExternalListenersContainer;
|
import org.solovyev.android.calculator.external.CalculatorExternalListenersContainer;
|
||||||
import org.solovyev.android.calculator.history.CalculatorHistory;
|
import org.solovyev.android.calculator.history.CalculatorHistory;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
@ -44,7 +47,8 @@ public interface CalculatorLocator {
|
|||||||
@Nonnull CalculatorPreferenceService preferenceService,
|
@Nonnull CalculatorPreferenceService preferenceService,
|
||||||
@Nonnull CalculatorKeyboard keyboard,
|
@Nonnull CalculatorKeyboard keyboard,
|
||||||
@Nonnull CalculatorExternalListenersContainer externalListenersContainer,
|
@Nonnull CalculatorExternalListenersContainer externalListenersContainer,
|
||||||
@Nonnull CalculatorPlotter plotter);
|
@Nonnull CalculatorPlotter plotter,
|
||||||
|
@Nullable TextProcessor<TextProcessorEditorResult, String> editorTextProcessor);
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
Calculator getCalculator();
|
Calculator getCalculator();
|
||||||
|
@ -25,8 +25,11 @@ package org.solovyev.android.calculator;
|
|||||||
import org.solovyev.android.calculator.external.CalculatorExternalListenersContainer;
|
import org.solovyev.android.calculator.external.CalculatorExternalListenersContainer;
|
||||||
import org.solovyev.android.calculator.history.CalculatorHistory;
|
import org.solovyev.android.calculator.history.CalculatorHistory;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
|
import org.solovyev.android.calculator.text.TextProcessorEditorResult;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
@ -87,7 +90,8 @@ public class Locator implements CalculatorLocator {
|
|||||||
@Nonnull CalculatorPreferenceService preferenceService,
|
@Nonnull CalculatorPreferenceService preferenceService,
|
||||||
@Nonnull CalculatorKeyboard keyboard,
|
@Nonnull CalculatorKeyboard keyboard,
|
||||||
@Nonnull CalculatorExternalListenersContainer externalListenersContainer,
|
@Nonnull CalculatorExternalListenersContainer externalListenersContainer,
|
||||||
@Nonnull CalculatorPlotter plotter) {
|
@Nonnull CalculatorPlotter plotter,
|
||||||
|
@Nullable TextProcessor<TextProcessorEditorResult, String> editorTextProcessor) {
|
||||||
|
|
||||||
this.calculator = calculator;
|
this.calculator = calculator;
|
||||||
this.calculatorEngine = engine;
|
this.calculatorEngine = engine;
|
||||||
@ -99,7 +103,7 @@ public class Locator implements CalculatorLocator {
|
|||||||
this.calculatorExternalListenersContainer = externalListenersContainer;
|
this.calculatorExternalListenersContainer = externalListenersContainer;
|
||||||
this.calculatorPlotter = plotter;
|
this.calculatorPlotter = plotter;
|
||||||
|
|
||||||
calculatorEditor = new CalculatorEditorImpl(this.calculator);
|
calculatorEditor = new CalculatorEditorImpl(this.calculator, editorTextProcessor);
|
||||||
calculatorDisplay = new CalculatorDisplayImpl(this.calculator);
|
calculatorDisplay = new CalculatorDisplayImpl(this.calculator);
|
||||||
calculatorKeyboard = keyboard;
|
calculatorKeyboard = keyboard;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
package org.solovyev.android.calculator.text;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 6/27/13
|
||||||
|
* Time: 8:07 PM
|
||||||
|
*/
|
||||||
|
public final class TextProcessorEditorResult implements CharSequence {
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private final CharSequence charSequence;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private String string;
|
||||||
|
|
||||||
|
private final int offset;
|
||||||
|
|
||||||
|
public TextProcessorEditorResult(@Nonnull CharSequence charSequence, int offset) {
|
||||||
|
this.charSequence = charSequence;
|
||||||
|
this.offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int length() {
|
||||||
|
return charSequence.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char charAt(int i) {
|
||||||
|
return charSequence.charAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence subSequence(int i, int i1) {
|
||||||
|
return charSequence.subSequence(i, i1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (string == null) {
|
||||||
|
string = charSequence.toString();
|
||||||
|
}
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public CharSequence getCharSequence() {
|
||||||
|
return charSequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOffset() {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@ import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
|||||||
public class AbstractCalculatorTest {
|
public class AbstractCalculatorTest {
|
||||||
|
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
Locator.getInstance().init(new CalculatorImpl(), CalculatorTestUtils.newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class));
|
Locator.getInstance().init(new CalculatorImpl(), CalculatorTestUtils.newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class), null);
|
||||||
Locator.getInstance().getEngine().init();
|
Locator.getInstance().getEngine().init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,12 +22,12 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: Solovyev_S
|
* User: Solovyev_S
|
||||||
* Date: 21.09.12
|
* Date: 21.09.12
|
||||||
@ -41,7 +41,7 @@ public class CalculatorEditorImplTest extends AbstractCalculatorTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
this.calculatorEditor = new CalculatorEditorImpl(Locator.getInstance().getCalculator());
|
this.calculatorEditor = new CalculatorEditorImpl(Locator.getInstance().getCalculator(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -49,7 +49,7 @@ public class CalculatorTestUtils {
|
|||||||
public static final int TIMEOUT = 15;
|
public static final int TIMEOUT = 15;
|
||||||
|
|
||||||
public static void staticSetUp() throws Exception {
|
public static void staticSetUp() throws Exception {
|
||||||
Locator.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class));
|
Locator.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class), new SystemOutCalculatorLogger(), Mockito.mock(CalculatorPreferenceService.class), Mockito.mock(CalculatorKeyboard.class), Mockito.mock(CalculatorExternalListenersContainer.class), Mockito.mock(CalculatorPlotter.class), null);
|
||||||
Locator.getInstance().getEngine().init();
|
Locator.getInstance().getEngine().init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user