preferences added
This commit is contained in:
parent
e81a1ef27b
commit
769d8068f2
@ -12,4 +12,10 @@
|
|||||||
<string name="p_drag_angle">0;45</string>
|
<string name="p_drag_angle">0;45</string>
|
||||||
<string name="p_drag_duration_key">org.solovyev.android.calculator.DragButtonCalibrationActivity_duration</string>
|
<string name="p_drag_duration_key">org.solovyev.android.calculator.DragButtonCalibrationActivity_duration</string>
|
||||||
<string name="p_drag_duration">40;2500</string>
|
<string name="p_drag_duration">40;2500</string>
|
||||||
|
|
||||||
|
<string name="p_calc_result_precision_key">org.solovyev.android.calculator.CalculatorModel_result_precision</string>
|
||||||
|
<string name="p_calc_result_precision">5</string>
|
||||||
|
|
||||||
|
<string name="p_calc_color_display_key">org.solovyev.android.calculator.CalculatorModel_color_display</string>
|
||||||
|
<string name="p_calc_color_display">true</string>
|
||||||
</resources>
|
</resources>
|
@ -4,14 +4,16 @@
|
|||||||
xmlns:range="http://schemas.android.com/apk/res/org.solovyev.android.calculator">
|
xmlns:range="http://schemas.android.com/apk/res/org.solovyev.android.calculator">
|
||||||
<PreferenceCategory a:title="@string/c_prefs_drag_button_category">
|
<PreferenceCategory a:title="@string/c_prefs_drag_button_category">
|
||||||
|
|
||||||
<org.solovyev.android.view.prefs.SeekBarPreference a:key="duration"
|
<org.solovyev.android.view.prefs.NumberPickerDialogPreference
|
||||||
a:title="Duration of something"
|
a:key="@string/p_calc_result_precision_key"
|
||||||
a:summary="How long something will last"
|
a:title="Precision of result value"
|
||||||
a:dialogMessage="Something duration"
|
|
||||||
a:defaultValue="5"
|
a:defaultValue="5"
|
||||||
a:text=" minutes"
|
range:boundaries="0;10"/>
|
||||||
a:max="60"/>
|
|
||||||
|
|
||||||
|
<android.preference.CheckBoxPreference
|
||||||
|
a:key="@string/p_calc_color_display_key"
|
||||||
|
a:title="Highlight expressions in brackets"
|
||||||
|
a:defaultValue="true"/>
|
||||||
|
|
||||||
<org.solovyev.android.view.prefs.FloatRangeSeekBarPreference
|
<org.solovyev.android.view.prefs.FloatRangeSeekBarPreference
|
||||||
a:key="@string/p_drag_distance_key"
|
a:key="@string/p_drag_distance_key"
|
||||||
|
@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.solovyev.android.view.FontSizeAdjuster;
|
import org.solovyev.android.view.FontSizeAdjuster;
|
||||||
import org.solovyev.android.view.widgets.*;
|
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.Announcer;
|
||||||
import org.solovyev.common.utils.history.HistoryAction;
|
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));
|
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
|
@Override
|
||||||
@ -236,5 +241,12 @@ public class CalculatorActivity extends Activity implements FontSizeAdjuster, Sh
|
|||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
|
||||||
dpclRegister.announce().onDragPreferencesChange(DragButtonCalibrationActivity.getPreferences(CalculatorActivity.this));
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,6 +22,7 @@ import org.solovyev.android.calculator.math.MathEntityType;
|
|||||||
*/
|
*/
|
||||||
public class CalculatorEditText extends EditText {
|
public class CalculatorEditText extends EditText {
|
||||||
|
|
||||||
|
private boolean highlightExpressionInBrackets = true;
|
||||||
|
|
||||||
public CalculatorEditText(Context context) {
|
public CalculatorEditText(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@ -42,9 +43,12 @@ public class CalculatorEditText extends EditText {
|
|||||||
|
|
||||||
public void redraw() {
|
public void redraw() {
|
||||||
String text = getText().toString();
|
String text = getText().toString();
|
||||||
|
|
||||||
int selectionStart = getSelectionStart();
|
int selectionStart = getSelectionStart();
|
||||||
int selectionEnd = getSelectionEnd();
|
int selectionEnd = getSelectionEnd();
|
||||||
|
|
||||||
|
if (highlightExpressionInBrackets) {
|
||||||
|
|
||||||
int maxNumberOfOpenGroupSymbols = 0;
|
int maxNumberOfOpenGroupSymbols = 0;
|
||||||
int numberOfOpenGroupSymbols = 0;
|
int numberOfOpenGroupSymbols = 0;
|
||||||
for (int i = 0; i < text.length(); i++) {
|
for (int i = 0; i < text.length(); i++) {
|
||||||
@ -69,6 +73,9 @@ public class CalculatorEditText extends EditText {
|
|||||||
} else {
|
} else {
|
||||||
super.setText(text, BufferType.EDITABLE);
|
super.setText(text, BufferType.EDITABLE);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
super.setText(text, BufferType.EDITABLE);
|
||||||
|
}
|
||||||
|
|
||||||
setSelection(selectionStart, selectionEnd);
|
setSelection(selectionStart, selectionEnd);
|
||||||
}
|
}
|
||||||
@ -106,10 +113,19 @@ public class CalculatorEditText extends EditText {
|
|||||||
|
|
||||||
double c = 1;
|
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);
|
return "#" + Integer.toHexString(result).substring(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isHighlightExpressionInBrackets() {
|
||||||
|
return highlightExpressionInBrackets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHighlightExpressionInBrackets(boolean highlightExpressionInBrackets) {
|
||||||
|
this.highlightExpressionInBrackets = highlightExpressionInBrackets;
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ public class CalculatorModel {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private Interpreter interpreter;
|
private Interpreter interpreter;
|
||||||
|
|
||||||
private int NUMBER_OF_FRACTION_DIGITS = 5;
|
private int numberOfFractionDigits = 5;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Preprocessor preprocessor = new ToJsclPreprocessor();
|
public Preprocessor preprocessor = new ToJsclPreprocessor();
|
||||||
@ -96,7 +96,7 @@ public class CalculatorModel {
|
|||||||
|
|
||||||
private Double round(@NotNull String result) {
|
private Double round(@NotNull String result) {
|
||||||
final Double dResult = Double.valueOf(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 {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -285,4 +285,9 @@ public class CalculatorView implements CursorControl, HistoryControl<CalculatorH
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public CalculatorEditText getEditor() {
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ import android.view.View;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.solovyev.android.view.widgets.*;
|
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.ManyValuedHashMap;
|
||||||
import org.solovyev.common.collections.ManyValuedMap;
|
import org.solovyev.common.collections.ManyValuedMap;
|
||||||
import org.solovyev.common.utils.*;
|
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) {
|
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()) {
|
for (Map.Entry<DragDirection, MathUtils.StatData> entry : statData.entrySet()) {
|
||||||
final float min = (float) entry.getValue().getMean() - 2 * (float) entry.getValue().getStandardDeviation();
|
final float min = (float) entry.getValue().getMean() - 2 * (float) entry.getValue().getStandardDeviation();
|
||||||
final float max = (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) {
|
public static Preferences getPreferences(@NotNull Context context) {
|
||||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(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();
|
final Preferences result = new Preferences();
|
||||||
|
|
||||||
|
@ -22,10 +22,11 @@ public class EditorHistoryState {
|
|||||||
this.text = text;
|
this.text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setText(String text) {
|
public void setText(@Nullable String text) {
|
||||||
this.text = text;
|
this.text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public String getText() {
|
public String getText() {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
* Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
||||||
* For more information, please, contact se.solovyev@gmail.com
|
* For more information, please, contact se.solovyev@gmail.com
|
||||||
|
* or visit http://se.solovyev.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
@ -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;
|
package org.solovyev.android.calculator.math;
|
||||||
|
|
||||||
import jscl.math.Generic;
|
import jscl.math.Generic;
|
||||||
import jscl.math.JSCLInteger;
|
|
||||||
import jscl.math.NotIntegrableException;
|
import jscl.math.NotIntegrableException;
|
||||||
import jscl.math.Variable;
|
import jscl.math.Variable;
|
||||||
import jscl.math.function.Function;
|
import jscl.math.function.Function;
|
||||||
|
@ -3,6 +3,7 @@ package org.solovyev.android.view.prefs;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.preference.DialogPreference;
|
import android.preference.DialogPreference;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
@ -19,7 +20,10 @@ import org.solovyev.common.utils.Mapper;
|
|||||||
public abstract class AbstractDialogPreference<T> extends DialogPreference {
|
public abstract class AbstractDialogPreference<T> extends DialogPreference {
|
||||||
|
|
||||||
@NotNull
|
@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
|
@NotNull
|
||||||
protected TextView valueTextView;
|
protected TextView valueTextView;
|
||||||
@ -127,21 +131,29 @@ public abstract class AbstractDialogPreference<T> extends DialogPreference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void persistValue(@Nullable T value) {
|
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)) {
|
if (callChangeListener(value)) {
|
||||||
|
Log.d(AbstractDialogPreference.class.getName(), "android.preference.Preference.shouldPersist()");
|
||||||
if (shouldPersist()) {
|
if (shouldPersist()) {
|
||||||
|
Log.d(AbstractDialogPreference.class.getName(), "org.solovyev.android.view.prefs.AbstractDialogPreference.persist()");
|
||||||
persist(value);
|
persist(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void persist(@Nullable T value) {
|
private void persist(@Nullable T value) {
|
||||||
|
if (value != null) {
|
||||||
final String toBePersistedString = getMapper().formatValue(value);
|
final String toBePersistedString = getMapper().formatValue(value);
|
||||||
if (toBePersistedString != null) {
|
if (toBePersistedString != null) {
|
||||||
if ( callChangeListener(value) ) {
|
if ( callChangeListener(toBePersistedString) ) {
|
||||||
persistString(toBePersistedString);
|
persistString(toBePersistedString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected abstract Mapper<T> getMapper();
|
protected abstract Mapper<T> getMapper();
|
||||||
|
@ -9,7 +9,7 @@ package org.solovyev.android.view.prefs;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.Interval;
|
||||||
import org.solovyev.common.utils.Mapper;
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
|
||||||
@ -27,6 +27,6 @@ public class FloatRangeSeekBarPreference extends RangeSeekBarPreference<Float> {
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected Mapper<Interval<Float>> getMapper() {
|
protected Mapper<Interval<Float>> getMapper() {
|
||||||
return new FloatIntervalMapper() ;
|
return new NumberIntervalMapper<Float>(Float.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ package org.solovyev.android.view.prefs;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.solovyev.common.IntegerIntervalMapper;
|
import org.solovyev.common.NumberIntervalMapper;
|
||||||
import org.solovyev.common.utils.*;
|
import org.solovyev.common.utils.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,7 +26,7 @@ public class IntegerRangeSeekBarPreference extends RangeSeekBarPreference<Intege
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected Mapper<Interval<Integer>> getMapper() {
|
protected Mapper<Interval<Integer>> getMapper() {
|
||||||
return new IntegerIntervalMapper();
|
return new NumberIntervalMapper<Integer>(Integer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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 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
|
@NotNull
|
||||||
private AbstractRangeSeekBar<T> rangeSeekBar;
|
private AbstractRangeSeekBar<T> rangeSeekBar;
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import android.util.AttributeSet;
|
|||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.solovyev.common.NumberMapper;
|
||||||
import org.solovyev.common.utils.Mapper;
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
|
||||||
|
|
||||||
@ -60,17 +60,7 @@ public class SeekBarPreference extends AbstractDialogPreference<Integer> impleme
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected Mapper<Integer> getMapper() {
|
protected Mapper<Integer> getMapper() {
|
||||||
return new Mapper<Integer>() {
|
return new NumberMapper<Integer>(Integer.class);
|
||||||
@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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {
|
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {
|
||||||
|
34
src/main/java/org/solovyev/common/BooleanMapper.java
Normal file
34
src/main/java/org/solovyev/common/BooleanMapper.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.solovyev.common.math.ValueOfFormatter;
|
||||||
|
import org.solovyev.common.utils.Formatter;
|
||||||
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 9/26/11
|
||||||
|
* Time: 11:27 PM
|
||||||
|
*/
|
||||||
|
public class BooleanMapper implements Mapper<Boolean>{
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final Formatter<Boolean> formatter = new ValueOfFormatter<Boolean>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String formatValue(@Nullable Boolean value) throws IllegalArgumentException {
|
||||||
|
return formatter.formatValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean parseValue(@Nullable String value) throws IllegalArgumentException {
|
||||||
|
return value == null ? null : Boolean.valueOf(value);
|
||||||
|
}
|
||||||
|
}
|
@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.common;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.solovyev.common.math.ValueOfFormatter;
|
|
||||||
import org.solovyev.common.utils.Formatter;
|
|
||||||
import org.solovyev.common.utils.Parser;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 9/21/11
|
|
||||||
* Time: 12:06 AM
|
|
||||||
*/
|
|
||||||
public class FloatIntervalMapper extends AbstractIntervalMapper<Float> {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
protected Formatter<Float> getFormatter() {
|
|
||||||
return new ValueOfFormatter<Float>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
protected Parser<Float> getParser() {
|
|
||||||
return new Parser<Float>() {
|
|
||||||
@Override
|
|
||||||
public Float parseValue(@Nullable String s) throws IllegalArgumentException {
|
|
||||||
return Float.valueOf(s);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
39
src/main/java/org/solovyev/common/GenericIntervalMapper.java
Normal file
39
src/main/java/org/solovyev/common/GenericIntervalMapper.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* 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.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.solovyev.common.utils.Formatter;
|
||||||
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
import org.solovyev.common.utils.Parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 9/26/11
|
||||||
|
* Time: 10:45 PM
|
||||||
|
*/
|
||||||
|
public class GenericIntervalMapper<T> extends AbstractIntervalMapper<T> {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final Mapper<T> mapper;
|
||||||
|
|
||||||
|
public GenericIntervalMapper(@NotNull Mapper<T> mapper) {
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Formatter<T> getFormatter() {
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Parser<T> getParser() {
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
}
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.common;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.solovyev.common.math.ValueOfFormatter;
|
|
||||||
import org.solovyev.common.utils.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 9/20/11
|
|
||||||
* Time: 11:56 PM
|
|
||||||
*/
|
|
||||||
public class IntegerIntervalMapper extends AbstractIntervalMapper<Integer> {
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
protected Formatter<Integer> getFormatter() {
|
|
||||||
return new ValueOfFormatter<Integer>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
protected Parser<Integer> getParser() {
|
|
||||||
return new Parser<Integer>() {
|
|
||||||
@Override
|
|
||||||
public Integer parseValue(@Nullable String s) throws IllegalArgumentException {
|
|
||||||
return Integer.valueOf(s);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
21
src/main/java/org/solovyev/common/NumberIntervalMapper.java
Normal file
21
src/main/java/org/solovyev/common/NumberIntervalMapper.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 9/20/11
|
||||||
|
* Time: 11:56 PM
|
||||||
|
*/
|
||||||
|
public class NumberIntervalMapper<T extends Number> extends GenericIntervalMapper<T> {
|
||||||
|
|
||||||
|
public NumberIntervalMapper(@NotNull Class<T> clazz) {
|
||||||
|
super(new NumberMapper<T>(clazz));
|
||||||
|
}
|
||||||
|
}
|
42
src/main/java/org/solovyev/common/NumberMapper.java
Normal file
42
src/main/java/org/solovyev/common/NumberMapper.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* 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.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.solovyev.common.math.ValueOfFormatter;
|
||||||
|
import org.solovyev.common.utils.Formatter;
|
||||||
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
import org.solovyev.common.utils.Parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 9/26/11
|
||||||
|
* Time: 11:10 PM
|
||||||
|
*/
|
||||||
|
public class NumberMapper<T extends Number> implements Mapper<T>{
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final Formatter<T> formatter = new ValueOfFormatter<T>();
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final Parser<T> parser;
|
||||||
|
|
||||||
|
public NumberMapper(@NotNull Class<T> clazz) {
|
||||||
|
this.parser = new NumberParser<T>(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String formatValue(@Nullable T value) throws IllegalArgumentException {
|
||||||
|
return formatter.formatValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T parseValue(@Nullable String value) throws IllegalArgumentException {
|
||||||
|
return this.parser.parseValue(value);
|
||||||
|
}
|
||||||
|
}
|
45
src/main/java/org/solovyev/common/NumberParser.java
Normal file
45
src/main/java/org/solovyev/common/NumberParser.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* 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.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.solovyev.common.utils.Parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User: serso
|
||||||
|
* Date: 9/26/11
|
||||||
|
* Time: 11:07 PM
|
||||||
|
*/
|
||||||
|
public class NumberParser<T extends Number> implements Parser<T> {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final Class<T> clazz;
|
||||||
|
|
||||||
|
public NumberParser(@NotNull Class<T> clazz) {
|
||||||
|
this.clazz = clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T parseValue(@Nullable String value) throws IllegalArgumentException {
|
||||||
|
T result;
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
if (this.clazz.equals(Integer.class)) {
|
||||||
|
result = (T) Integer.valueOf(value);
|
||||||
|
} else if (this.clazz.equals(Float.class)) {
|
||||||
|
result = (T) Float.valueOf(value);
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException(this.clazz + " is not supported!");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -16,8 +16,19 @@ import org.solovyev.common.utils.Formatter;
|
|||||||
*/
|
*/
|
||||||
public class ValueOfFormatter<T> implements Formatter<T>{
|
public class ValueOfFormatter<T> implements Formatter<T>{
|
||||||
|
|
||||||
|
private final boolean processNulls;
|
||||||
|
|
||||||
|
public ValueOfFormatter() {
|
||||||
|
this(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueOfFormatter(boolean processNulls) {
|
||||||
|
this.processNulls = processNulls;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String formatValue(@Nullable T t) throws IllegalArgumentException {
|
public String formatValue(@Nullable T t) throws IllegalArgumentException {
|
||||||
return String.valueOf(t);
|
return t == null ? (processNulls ? String.valueOf(t) : null) : String.valueOf(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,6 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import de.congrace.exp4j.Calculable;
|
|
||||||
import de.congrace.exp4j.ExpressionBuilder;
|
|
||||||
import de.congrace.exp4j.UnknownFunctionException;
|
|
||||||
import de.congrace.exp4j.UnparsableExpressionException;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
@ -2,7 +2,9 @@ package org.solovyev.common;
|
|||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.solovyev.common.utils.Interval;
|
||||||
import org.solovyev.common.utils.IntervalImpl;
|
import org.solovyev.common.utils.IntervalImpl;
|
||||||
|
import org.solovyev.common.utils.Mapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
@ -13,7 +15,7 @@ public class FloatIntervalMapperTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParse() throws Exception {
|
public void testParse() throws Exception {
|
||||||
final FloatIntervalMapper mapper = new FloatIntervalMapper();
|
final Mapper<Interval<Float>> mapper = new NumberIntervalMapper<Float>(Float.class);
|
||||||
|
|
||||||
Assert.assertEquals(new IntervalImpl<Float>(1.2f, 12.2f), mapper.parseValue("1.2;12.2"));
|
Assert.assertEquals(new IntervalImpl<Float>(1.2f, 12.2f), mapper.parseValue("1.2;12.2"));
|
||||||
Assert.assertEquals(new IntervalImpl<Float>(0f, 0f), mapper.parseValue("0;0"));
|
Assert.assertEquals(new IntervalImpl<Float>(0f, 0f), mapper.parseValue("0;0"));
|
||||||
|
Loading…
Reference in New Issue
Block a user