preferences added

This commit is contained in:
serso
2011-09-26 23:46:47 +04:00
parent 323fe37fa7
commit 268d3503d3
27 changed files with 404 additions and 133 deletions

View File

@@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.android.view.FontSizeAdjuster;
import org.solovyev.android.view.widgets.*;
import org.solovyev.common.BooleanMapper;
import org.solovyev.common.NumberMapper;
import org.solovyev.common.utils.Announcer;
import org.solovyev.common.utils.history.HistoryAction;
@@ -104,7 +106,10 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh
registerReceiver(preferencesChangesReceiver, new IntentFilter(DragButtonCalibrationActivity.INTENT_ACTION));
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
final SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this);
this.onSharedPreferenceChanged(defaultSharedPreferences, null);
}
@Override
@@ -236,5 +241,12 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
dpclRegister.announce().onDragPreferencesChange(DragButtonCalibrationActivity.getPreferences(CalculatorActivity.this));
final NumberMapper<Integer> integerNumberMapper = new NumberMapper<Integer>(Integer.class);
this.calculatorModel.setNumberOfFractionDigits(integerNumberMapper.parseValue(sharedPreferences.getString(this.getString(R.string.p_calc_result_precision_key), this.getString(R.string.p_calc_result_precision))));
final Boolean colorExpressionsInBracketsDefault = new BooleanMapper().parseValue(this.getString(R.string.p_calc_color_display));
assert colorExpressionsInBracketsDefault != null;
this.calculatorView.getEditor().setHighlightExpressionInBrackets(sharedPreferences.getBoolean(this.getString(R.string.p_calc_color_display_key), colorExpressionsInBracketsDefault));
}
}

View File

@@ -22,6 +22,7 @@ import org.solovyev.android.calculator.math.MathEntityType;
*/
public class CalculatorEditText extends EditText {
private boolean highlightExpressionInBrackets = true;
public CalculatorEditText(Context context) {
super(context);
@@ -42,30 +43,36 @@ public class CalculatorEditText extends EditText {
public void redraw() {
String text = getText().toString();
int selectionStart = getSelectionStart();
int selectionEnd = getSelectionEnd();
int maxNumberOfOpenGroupSymbols = 0;
int numberOfOpenGroupSymbols = 0;
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
if (MathEntityType.openGroupSymbols.contains(ch)) {
numberOfOpenGroupSymbols++;
maxNumberOfOpenGroupSymbols = Math.max(maxNumberOfOpenGroupSymbols, numberOfOpenGroupSymbols);
} else if (MathEntityType.closeGroupSymbols.contains(ch)) {
numberOfOpenGroupSymbols--;
if (highlightExpressionInBrackets) {
int maxNumberOfOpenGroupSymbols = 0;
int numberOfOpenGroupSymbols = 0;
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
if (MathEntityType.openGroupSymbols.contains(ch)) {
numberOfOpenGroupSymbols++;
maxNumberOfOpenGroupSymbols = Math.max(maxNumberOfOpenGroupSymbols, numberOfOpenGroupSymbols);
} else if (MathEntityType.closeGroupSymbols.contains(ch)) {
numberOfOpenGroupSymbols--;
}
}
}
if (maxNumberOfOpenGroupSymbols > 0) {
if (maxNumberOfOpenGroupSymbols > 0) {
final StringBuilder sb = new StringBuilder();
final StringBuilder sb = new StringBuilder();
processGroup(sb, text, 0, 0, maxNumberOfOpenGroupSymbols);
processGroup(sb, text, 0, 0, maxNumberOfOpenGroupSymbols);
Log.d(CalculatorEditText.class.getName(), sb.toString());
Log.d(CalculatorEditText.class.getName(), sb.toString());
super.setText(Html.fromHtml(sb.toString()), BufferType.EDITABLE);
super.setText(Html.fromHtml(sb.toString()), BufferType.EDITABLE);
} else {
super.setText(text, BufferType.EDITABLE);
}
} else {
super.setText(text, BufferType.EDITABLE);
}
@@ -106,10 +113,19 @@ public class CalculatorEditText extends EditText {
double c = 1;
int i = ((int)(255 * c)) * numberOfOpenings / (numberOfOpenGroupSymbols + 1);
int i = ((int) (255 * c)) * numberOfOpenings / (numberOfOpenGroupSymbols + 1);
int result = Color.rgb( Color.red(baseColor) - i, Color.green(baseColor) - i, Color.blue(baseColor) - i);
int result = Color.rgb(Color.red(baseColor) - i, Color.green(baseColor) - i, Color.blue(baseColor) - i);
return "#" + Integer.toHexString(result).substring(2);
}
public boolean isHighlightExpressionInBrackets() {
return highlightExpressionInBrackets;
}
public void setHighlightExpressionInBrackets(boolean highlightExpressionInBrackets) {
this.highlightExpressionInBrackets = highlightExpressionInBrackets;
redraw();
}
}

View File

@@ -23,7 +23,7 @@ public class CalculatorModel {
@NotNull
private Interpreter interpreter;
private int NUMBER_OF_FRACTION_DIGITS = 5;
private int numberOfFractionDigits = 5;
@NotNull
public Preprocessor preprocessor = new ToJsclPreprocessor();
@@ -96,7 +96,7 @@ public class CalculatorModel {
private Double round(@NotNull String result) {
final Double dResult = Double.valueOf(result);
return MathUtils.round(dResult, NUMBER_OF_FRACTION_DIGITS);
return MathUtils.round(dResult, numberOfFractionDigits);
}
public static class ParseException extends SersoException {
@@ -105,4 +105,11 @@ public class CalculatorModel {
}
}
public int getNumberOfFractionDigits() {
return numberOfFractionDigits;
}
public void setNumberOfFractionDigits(int numberOfFractionDigits) {
this.numberOfFractionDigits = numberOfFractionDigits;
}
}

View File

@@ -285,4 +285,9 @@ public class CalculatorView implements CursorControl, HistoryControl<CalculatorH
return result;
}
@NotNull
public CalculatorEditText getEditor() {
return editor;
}
}

View File

@@ -19,7 +19,7 @@ import android.view.View;
import android.widget.ImageView;
import org.jetbrains.annotations.NotNull;
import org.solovyev.android.view.widgets.*;
import org.solovyev.common.FloatIntervalMapper;
import org.solovyev.common.NumberIntervalMapper;
import org.solovyev.common.collections.ManyValuedHashMap;
import org.solovyev.common.collections.ManyValuedMap;
import org.solovyev.common.utils.*;
@@ -178,7 +178,7 @@ public class DragButtonCalibrationActivity extends Activity {
}
private void setPreferences(@NotNull Map<DragDirection, MathUtils.StatData> statData, @NotNull SharedPreferences.Editor editor, @NotNull PreferenceType preferenceType) {
final Mapper<Interval<Float>> mapper = new FloatIntervalMapper();
final Mapper<Interval<Float>> mapper = new NumberIntervalMapper<Float>(Float.class);
for (Map.Entry<DragDirection, MathUtils.StatData> entry : statData.entrySet()) {
final float min = (float) entry.getValue().getMean() - 2 * (float) entry.getValue().getStandardDeviation();
final float max = (float) entry.getValue().getMean() + 2 * (float) entry.getValue().getStandardDeviation();
@@ -195,7 +195,7 @@ public class DragButtonCalibrationActivity extends Activity {
public static Preferences getPreferences(@NotNull Context context) {
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
final Mapper<Interval<Float>> mapper = new FloatIntervalMapper();
final Mapper<Interval<Float>> mapper = new NumberIntervalMapper<Float>(Float.class);
final Preferences result = new Preferences();

View File

@@ -22,10 +22,11 @@ public class EditorHistoryState {
this.text = text;
}
public void setText(String text) {
public void setText(@Nullable String text) {
this.text = text;
}
@Nullable
public String getText() {
return text;
}

View File

@@ -1,6 +1,7 @@
/*
* 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
*/
package org.solovyev.android.calculator;

View File

@@ -1,7 +1,12 @@
/*
* 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
*/
package org.solovyev.android.calculator.math;
import jscl.math.Generic;
import jscl.math.JSCLInteger;
import jscl.math.NotIntegrableException;
import jscl.math.Variable;
import jscl.math.function.Function;

View File

@@ -3,6 +3,7 @@ package org.solovyev.android.view.prefs;
import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
@@ -19,7 +20,10 @@ import org.solovyev.common.utils.Mapper;
public abstract class AbstractDialogPreference<T> extends DialogPreference {
@NotNull
protected static final String androidns = "http://schemas.android.com/apk/res/android";
protected final static String localNameSpace = "http://schemas.android.com/apk/res/org.solovyev.android.calculator";
@NotNull
protected final static String androidns = "http://schemas.android.com/apk/res/android";
@NotNull
protected TextView valueTextView;
@@ -127,18 +131,26 @@ public abstract class AbstractDialogPreference<T> extends DialogPreference {
}
protected void persistValue(@Nullable T value) {
Log.d(AbstractDialogPreference.class.getName(), "Trying to persist value: " + value);
this.value = value;
Log.d(AbstractDialogPreference.class.getName(), "android.preference.Preference.callChangeListener()");
if (callChangeListener(value)) {
Log.d(AbstractDialogPreference.class.getName(), "android.preference.Preference.shouldPersist()");
if (shouldPersist()) {
Log.d(AbstractDialogPreference.class.getName(), "org.solovyev.android.view.prefs.AbstractDialogPreference.persist()");
persist(value);
}
}
}
private void persist(@Nullable T value) {
final String toBePersistedString = getMapper().formatValue(value);
if (toBePersistedString != null) {
if ( callChangeListener(value) ) {
persistString(toBePersistedString);
if (value != null) {
final String toBePersistedString = getMapper().formatValue(value);
if (toBePersistedString != null) {
if ( callChangeListener(toBePersistedString) ) {
persistString(toBePersistedString);
}
}
}
}

View File

@@ -9,7 +9,7 @@ package org.solovyev.android.view.prefs;
import android.content.Context;
import android.util.AttributeSet;
import org.jetbrains.annotations.NotNull;
import org.solovyev.common.FloatIntervalMapper;
import org.solovyev.common.NumberIntervalMapper;
import org.solovyev.common.utils.Interval;
import org.solovyev.common.utils.Mapper;
@@ -27,6 +27,6 @@ public class FloatRangeSeekBarPreference extends RangeSeekBarPreference<Float> {
@NotNull
@Override
protected Mapper<Interval<Float>> getMapper() {
return new FloatIntervalMapper() ;
return new NumberIntervalMapper<Float>(Float.class);
}
}

View File

@@ -9,7 +9,7 @@ package org.solovyev.android.view.prefs;
import android.content.Context;
import android.util.AttributeSet;
import org.jetbrains.annotations.NotNull;
import org.solovyev.common.IntegerIntervalMapper;
import org.solovyev.common.NumberIntervalMapper;
import org.solovyev.common.utils.*;
/**
@@ -26,7 +26,7 @@ public class IntegerRangeSeekBarPreference extends RangeSeekBarPreference<Intege
@NotNull
@Override
protected Mapper<Interval<Integer>> getMapper() {
return new IntegerIntervalMapper();
return new NumberIntervalMapper<Integer>(Integer.class);
}
}

View File

@@ -0,0 +1,92 @@
/*
* 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
*/
package org.solovyev.android.view.prefs;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.LinearLayout;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.android.view.widgets.NumberPicker;
import org.solovyev.common.GenericIntervalMapper;
import org.solovyev.common.utils.Interval;
import org.solovyev.common.utils.Mapper;
/**
* User: serso
* Date: 9/26/11
* Time: 10:31 PM
*/
public class NumberPickerDialogPreference extends AbstractDialogPreference<Integer> implements NumberPicker.OnChangedListener {
@NotNull
private NumberPicker numberPicker;
@NotNull
private final Interval<Integer> boundaries;
public NumberPickerDialogPreference(Context context, AttributeSet attrs) {
super(context, attrs, null);
//noinspection ConstantConditions
boundaries = new GenericIntervalMapper<Integer>(getMapper()).parseValue(attrs.getAttributeValue(localNameSpace, "boundaries"));
createPreferenceView();
}
@NotNull
@Override
protected LinearLayout onCreateDialogView() {
final LinearLayout result = super.onCreateDialogView();
createPreferenceView();
initPreferenceView();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
result.addView(numberPicker, params);
return result;
}
protected void createPreferenceView() {
this.numberPicker = new NumberPicker(context);
this.numberPicker.setOnChangeListener(this);
initPreferenceView();
}
@Override
protected void initPreferenceView() {
if (value != null) {
numberPicker.setRange(boundaries.getLeftBorder(), boundaries.getRightBorder());
numberPicker.setCurrent(value);
}
}
@NotNull
@Override
protected Mapper<Integer> getMapper() {
return new Mapper<Integer>() {
@Override
public String formatValue(@Nullable Integer value) throws IllegalArgumentException {
return String.valueOf(value);
}
@Override
public Integer parseValue(@Nullable String value) throws IllegalArgumentException {
return Integer.valueOf(value);
}
};
}
@Override
public void onChanged(NumberPicker picker, int oldVal, int newVal) {
persistValue(newVal);
}
}

View File

@@ -16,8 +16,6 @@ import org.solovyev.common.utils.NumberInterval;
*/
public abstract class RangeSeekBarPreference<T extends Number> extends AbstractDialogPreference<Interval<T>> implements AbstractRangeSeekBar.OnRangeSeekBarChangeListener<T> {
public final static String localNameSpace = "http://schemas.android.com/apk/res/org.solovyev.android.calculator";
@NotNull
private AbstractRangeSeekBar<T> rangeSeekBar;

View File

@@ -11,7 +11,7 @@ import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.common.NumberMapper;
import org.solovyev.common.utils.Mapper;
@@ -60,17 +60,7 @@ public class SeekBarPreference extends AbstractDialogPreference<Integer> impleme
@NotNull
@Override
protected Mapper<Integer> getMapper() {
return new Mapper<Integer>() {
@Override
public String formatValue(@Nullable Integer integer) throws IllegalArgumentException {
return integer == null ? null : String.valueOf(integer);
}
@Override
public Integer parseValue(@Nullable String s) throws IllegalArgumentException {
return s == null ? null : Integer.valueOf(s);
}
};
return new NumberMapper<Integer>(Integer.class);
}
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {