Fixes + Fast conversion from menu

This commit is contained in:
Sergey Solovyev 2012-04-24 16:48:58 +04:00
parent 315a2eb604
commit 37e9354a5b
10 changed files with 174 additions and 22 deletions

View File

@ -10,5 +10,5 @@
# Project target. # Project target.
target=android-15 target=android-15
android.library.reference.1=../calculatorpp-service android.library.reference.1=../calculatorpp-service
android.library.reference.2=gen-external-apklibs/org.solovyev.android_common_0.1.3 android.library.reference.2=gen-external-apklibs/org.solovyev.android_common_0.1.4

View File

@ -51,21 +51,25 @@
<Button a:id="@+id/unit_converter_ok_button" <Button a:id="@+id/unit_converter_ok_button"
a:text="@android:string/ok" a:text="@android:string/ok"
a:paddingLeft="30dp" a:paddingLeft="15dp"
a:paddingRight="30dp" a:paddingRight="15dp"
a:singleLine="true"
a:layout_width="wrap_content" a:layout_width="wrap_content"
a:layout_height="wrap_content"/> a:layout_height="wrap_content"/>
<Button a:id="@+id/unit_converter_copy_button" <Button a:id="@+id/unit_converter_copy_button"
a:text="@android:string/copy" a:text="@android:string/copy"
a:paddingLeft="30dp" a:paddingLeft="15dp"
a:paddingRight="30dp" a:paddingRight="15dp"
a:singleLine="true"
a:layout_width="wrap_content" a:layout_width="wrap_content"
a:layout_height="wrap_content"/> a:layout_height="wrap_content"/>
<Button a:id="@+id/unit_converter_custom_button" <Button a:id="@+id/unit_converter_custom_button"
a:paddingLeft="30dp" a:paddingLeft="15dp"
a:paddingRight="30dp" a:paddingRight="15dp"
a:ellipsize="end"
a:singleLine="true"
a:layout_width="wrap_content" a:layout_width="wrap_content"
a:layout_height="wrap_content"/> a:layout_height="wrap_content"/>

View File

@ -199,4 +199,8 @@
<string name="c_convert">Перевести в…</string> <string name="c_convert">Перевести в…</string>
<string name="convert_to_hex">Перевести в hex</string>
<string name="convert_to_bin">Перевести в bin</string>
<string name="convert_to_dec">Перевести в dec</string>
</resources> </resources>

View File

@ -199,4 +199,8 @@
<string name="c_convert">Перевести в…</string> <string name="c_convert">Перевести в…</string>
<string name="convert_to_hex">Перевести в hex</string>
<string name="convert_to_bin">Перевести в bin</string>
<string name="convert_to_dec">Перевести в dec</string>
</resources> </resources>

View File

@ -199,4 +199,8 @@
<string name="c_convert">Convert to…</string> <string name="c_convert">Convert to…</string>
<string name="convert_to_hex">Convert to hex</string>
<string name="convert_to_bin">Convert to bin</string>
<string name="convert_to_dec">Convert to dec</string>
</resources> </resources>

View File

@ -99,6 +99,11 @@ public enum AndroidNumeralBase implements UnitType<String> {
button.setShowText(show); button.setShowText(show);
} }
@NotNull
public NumeralBase getNumeralBase() {
return numeralBase;
}
@NotNull @NotNull
@Override @Override
public Class<String> getUnitValueClass() { public Class<String> getUnitValueClass() {

View File

@ -10,6 +10,7 @@ import android.graphics.Color;
import android.text.Html; import android.text.Html;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import jscl.NumeralBase;
import jscl.math.Generic; import jscl.math.Generic;
import jscl.math.function.Constant; import jscl.math.function.Constant;
import jscl.math.function.IConstant; import jscl.math.function.IConstant;
@ -19,11 +20,15 @@ import org.solovyev.android.calculator.jscl.JsclOperation;
import org.solovyev.android.calculator.model.CalculatorEngine; import org.solovyev.android.calculator.model.CalculatorEngine;
import org.solovyev.android.calculator.model.CalculatorParseException; import org.solovyev.android.calculator.model.CalculatorParseException;
import org.solovyev.android.calculator.model.TextProcessor; import org.solovyev.android.calculator.model.TextProcessor;
import org.solovyev.android.calculator.model.ToJsclTextProcessor;
import org.solovyev.android.calculator.view.NumeralBaseConverterDialog; import org.solovyev.android.calculator.view.NumeralBaseConverterDialog;
import org.solovyev.android.calculator.view.TextHighlighter; import org.solovyev.android.calculator.view.TextHighlighter;
import org.solovyev.android.calculator.view.UnitConverterViewBuilder;
import org.solovyev.android.menu.AMenuItem;
import org.solovyev.android.menu.LabeledMenuItem; import org.solovyev.android.menu.LabeledMenuItem;
import org.solovyev.android.view.AutoResizeTextView; import org.solovyev.android.view.AutoResizeTextView;
import org.solovyev.common.utils.CollectionsUtils; import org.solovyev.common.utils.CollectionsUtils;
import org.solovyev.common.utils.StringUtils;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -35,6 +40,79 @@ import java.util.Set;
*/ */
public class CalculatorDisplay extends AutoResizeTextView implements ICalculatorDisplay{ public class CalculatorDisplay extends AutoResizeTextView implements ICalculatorDisplay{
private static enum ConversionMenuItem implements AMenuItem<CalculatorDisplay> {
convert_to_bin(NumeralBase.bin),
convert_to_dec(NumeralBase.dec),
convert_to_hex(NumeralBase.hex);
@NotNull
private final NumeralBase toNumeralBase;
private ConversionMenuItem(@NotNull NumeralBase toNumeralBase) {
this.toNumeralBase = toNumeralBase;
}
protected boolean isItemVisibleFor(@NotNull Generic generic, @NotNull JsclOperation operation) {
boolean result = false;
if (operation == JsclOperation.numeric) {
if (generic.getConstants().isEmpty()) {
try {
convert(generic);
// conversion possible => return true
result = true;
} catch (UnitConverterViewBuilder.ConversionException e) {
// conversion is not possible => return false
}
}
}
return result;
}
@Override
public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) {
final NumeralBase fromNumeralBase = CalculatorEngine.instance.getEngine().getNumeralBase();
String to;
try {
to = convert(data.getGenericResult());
// add prefix
if (fromNumeralBase != toNumeralBase) {
to = toNumeralBase.getJsclPrefix() + to;
}
} catch (UnitConverterViewBuilder.ConversionException e) {
to = context.getString(R.string.c_error);
}
data.setText(to);
data.redraw();
}
@NotNull
private String convert(@NotNull Generic generic) throws UnitConverterViewBuilder.ConversionException {
final NumeralBase fromNumeralBase = CalculatorEngine.instance.getEngine().getNumeralBase();
if (fromNumeralBase != toNumeralBase) {
String from = generic.toString();
if (!StringUtils.isEmpty(from)) {
try {
from = ToJsclTextProcessor.getInstance().process(from).getExpression();
} catch (CalculatorParseException e) {
// ok, problems while processing occurred
}
}
return UnitConverterViewBuilder.doConversion(AndroidNumeralBase.getConverter(), from, AndroidNumeralBase.valueOf(fromNumeralBase), AndroidNumeralBase.valueOf(toNumeralBase));
} else {
return generic.toString();
}
}
}
public static enum MenuItem implements LabeledMenuItem<CalculatorDisplay> { public static enum MenuItem implements LabeledMenuItem<CalculatorDisplay> {
copy(R.string.c_copy) { copy(R.string.c_copy) {
@ -44,6 +122,42 @@ public class CalculatorDisplay extends AutoResizeTextView implements ICalculator
} }
}, },
convert_to_bin(R.string.convert_to_bin) {
@Override
public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) {
ConversionMenuItem.convert_to_bin.onClick(data, context);
}
@Override
protected boolean isItemVisibleFor(@NotNull Generic generic, @NotNull JsclOperation operation) {
return ConversionMenuItem.convert_to_bin.isItemVisibleFor(generic, operation);
}
},
convert_to_dec(R.string.convert_to_dec) {
@Override
public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) {
ConversionMenuItem.convert_to_dec.onClick(data, context);
}
@Override
protected boolean isItemVisibleFor(@NotNull Generic generic, @NotNull JsclOperation operation) {
return ConversionMenuItem.convert_to_dec.isItemVisibleFor(generic, operation);
}
},
convert_to_hex(R.string.convert_to_hex) {
@Override
public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) {
ConversionMenuItem.convert_to_hex.onClick(data, context);
}
@Override
protected boolean isItemVisibleFor(@NotNull Generic generic, @NotNull JsclOperation operation) {
return ConversionMenuItem.convert_to_hex.isItemVisibleFor(generic, operation);
}
},
convert(R.string.c_convert) { convert(R.string.c_convert) {
@Override @Override
public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) { public void onClick(@NotNull CalculatorDisplay data, @NotNull Context context) {

View File

@ -4,12 +4,11 @@ import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import jscl.NumeralBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.solovyev.android.calculator.AndroidNumeralBase;
import org.solovyev.android.Unit; import org.solovyev.android.Unit;
import org.solovyev.android.UnitImpl; import org.solovyev.android.UnitImpl;
import org.solovyev.android.calculator.AndroidNumeralBase;
import org.solovyev.android.calculator.CalculatorModel; import org.solovyev.android.calculator.CalculatorModel;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.model.CalculatorEngine; import org.solovyev.android.calculator.model.CalculatorEngine;
@ -70,12 +69,7 @@ public class NumeralBaseConverterDialog {
String toUnitsValue = toUnits.getValue(); String toUnitsValue = toUnits.getValue();
if (!toUnits.getUnitType().equals(AndroidNumeralBase.valueOf(CalculatorEngine.instance.getEngine().getNumeralBase()))) { if (!toUnits.getUnitType().equals(AndroidNumeralBase.valueOf(CalculatorEngine.instance.getEngine().getNumeralBase()))) {
for (NumeralBase nb : NumeralBase.values()) { toUnitsValue = ((AndroidNumeralBase) toUnits.getUnitType()).getNumeralBase().getJsclPrefix() + toUnitsValue;
if (AndroidNumeralBase.valueOf(nb).equals(toUnits.getUnitType())) {
toUnitsValue = nb.getJsclPrefix() + toUnitsValue;
break;
}
}
} }
CalculatorModel.instance.processDigitButtonAction(toUnitsValue, false); CalculatorModel.instance.processDigitButtonAction(toUnitsValue, false);

View File

@ -172,11 +172,32 @@ public class UnitConverterViewBuilder implements ViewBuilder<View> {
final EditText toEditText = (EditText) main.findViewById(R.id.units_to); final EditText toEditText = (EditText) main.findViewById(R.id.units_to);
final String from = fromEditText.getText().toString(); final String from = fromEditText.getText().toString();
try {
toEditText.setText(doConversion(converter, from, getFromUnitType(main), getToUnitType(main)));
} catch (ConversionException e) {
toEditText.setText(context.getString(R.string.c_error));
}
}
public static final class ConversionException extends Exception {
private ConversionException() {
}
private ConversionException(Throwable throwable) {
super(throwable);
}
}
@NotNull
public static String doConversion(@NotNull UnitConverter<String> converter,
@Nullable String from,
@NotNull UnitType<String> fromUnitType,
@NotNull UnitType<String> toUnitType) throws ConversionException{
final String result;
if (StringUtils.isEmpty(from)) { if (StringUtils.isEmpty(from)) {
toEditText.setText(""); result = "";
} else { } else {
final UnitType<String> fromUnitType = getFromUnitType(main);
final UnitType<String> toUnitType = getToUnitType(main);
String to = null; String to = null;
try { try {
@ -184,11 +205,13 @@ public class UnitConverterViewBuilder implements ViewBuilder<View> {
to = converter.convert(UnitImpl.newInstance(from, fromUnitType), toUnitType).getValue(); to = converter.convert(UnitImpl.newInstance(from, fromUnitType), toUnitType).getValue();
} }
} catch (RuntimeException e) { } catch (RuntimeException e) {
to = context.getString(R.string.c_error); throw new ConversionException(e);
} }
toEditText.setText(to); result = to;
} }
return result;
} }
@NotNull @NotNull

View File

@ -33,7 +33,7 @@
<dependency> <dependency>
<groupId>org.solovyev.android</groupId> <groupId>org.solovyev.android</groupId>
<artifactId>common</artifactId> <artifactId>common</artifactId>
<version>0.1.3</version> <version>0.1.4</version>
<type>apklib</type> <type>apklib</type>
</dependency> </dependency>