parent
b3cc081f47
commit
cca775c2ac
@ -1,7 +1,5 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import jscl.NumeralBase;
|
|
||||||
import jscl.math.Generic;
|
|
||||||
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.jscl.JsclOperation;
|
import org.solovyev.android.calculator.jscl.JsclOperation;
|
||||||
@ -24,7 +22,4 @@ public interface Calculator extends CalculatorEventContainer {
|
|||||||
CalculatorEventDataId evaluate(@NotNull JsclOperation operation,
|
CalculatorEventDataId evaluate(@NotNull JsclOperation operation,
|
||||||
@NotNull String expression,
|
@NotNull String expression,
|
||||||
@Nullable MessageRegistry mr);
|
@Nullable MessageRegistry mr);
|
||||||
|
|
||||||
@NotNull
|
|
||||||
CalculatorEventDataId convert(@NotNull Generic generic, @NotNull NumeralBase to);
|
|
||||||
}
|
}
|
||||||
|
@ -47,8 +47,8 @@ public class CalculatorEvaluationEventDataImpl implements CalculatorEvaluationEv
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Long getSequenceId() {
|
public Long getCalculationId() {
|
||||||
return calculatorEventData.getSequenceId();
|
return calculatorEventData.getCalculationId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,9 +13,8 @@ public interface CalculatorEventDataId {
|
|||||||
// the higher id => the later event
|
// the higher id => the later event
|
||||||
long getEventId();
|
long getEventId();
|
||||||
|
|
||||||
// the higher id => the later event
|
|
||||||
@Nullable
|
@Nullable
|
||||||
Long getSequenceId();
|
Long getCalculationId();
|
||||||
|
|
||||||
boolean isAfter(@NotNull CalculatorEventDataId calculatorEventDataId);
|
boolean isAfter(@NotNull CalculatorEventDataId calculatorEventDataId);
|
||||||
}
|
}
|
||||||
|
@ -13,16 +13,18 @@ class CalculatorEventDataIdImpl implements CalculatorEventDataId {
|
|||||||
private final long eventId;
|
private final long eventId;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private final Long sequenceId;
|
private final Long calculationId;
|
||||||
|
|
||||||
private CalculatorEventDataIdImpl(long id, @Nullable Long sequenceId) {
|
private CalculatorEventDataIdImpl(long id,
|
||||||
|
@Nullable Long calculationId) {
|
||||||
this.eventId = id;
|
this.eventId = id;
|
||||||
this.sequenceId = sequenceId;
|
this.calculationId = calculationId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
static CalculatorEventDataId newInstance(long id, @Nullable Long sequenceId) {
|
static CalculatorEventDataId newInstance(long id,
|
||||||
return new CalculatorEventDataIdImpl(id, sequenceId);
|
@Nullable Long calculationId) {
|
||||||
|
return new CalculatorEventDataIdImpl(id, calculationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -32,8 +34,8 @@ class CalculatorEventDataIdImpl implements CalculatorEventDataId {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Long getSequenceId() {
|
public Long getCalculationId() {
|
||||||
return this.sequenceId;
|
return this.calculationId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -49,7 +51,7 @@ class CalculatorEventDataIdImpl implements CalculatorEventDataId {
|
|||||||
CalculatorEventDataIdImpl that = (CalculatorEventDataIdImpl) o;
|
CalculatorEventDataIdImpl that = (CalculatorEventDataIdImpl) o;
|
||||||
|
|
||||||
if (eventId != that.eventId) return false;
|
if (eventId != that.eventId) return false;
|
||||||
if (sequenceId != null ? !sequenceId.equals(that.sequenceId) : that.sequenceId != null)
|
if (calculationId != null ? !calculationId.equals(that.calculationId) : that.calculationId != null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -58,7 +60,7 @@ class CalculatorEventDataIdImpl implements CalculatorEventDataId {
|
|||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = (int) (eventId ^ (eventId >>> 32));
|
int result = (int) (eventId ^ (eventId >>> 32));
|
||||||
result = 31 * result + (sequenceId != null ? sequenceId.hashCode() : 0);
|
result = 31 * result + (calculationId != null ? calculationId.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@ class CalculatorEventDataImpl implements CalculatorEventData {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Long getSequenceId() {
|
public Long getCalculationId() {
|
||||||
return calculatorEventDataId.getSequenceId();
|
return calculatorEventDataId.getCalculationId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -28,19 +28,7 @@ public enum CalculatorEventType {
|
|||||||
calculation_finished,
|
calculation_finished,
|
||||||
|
|
||||||
// @NotNull org.solovyev.android.calculator.CalculatorFailure
|
// @NotNull org.solovyev.android.calculator.CalculatorFailure
|
||||||
calculation_failed,
|
calculation_failed;
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* CONVERSION
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
conversion_started,
|
|
||||||
|
|
||||||
// @NotNull String conversion result
|
|
||||||
conversion_finished;
|
|
||||||
|
|
||||||
public boolean isOfType(@NotNull CalculatorEventType... types) {
|
public boolean isOfType(@NotNull CalculatorEventType... types) {
|
||||||
for (CalculatorEventType type : types) {
|
for (CalculatorEventType type : types) {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import jscl.AbstractJsclArithmeticException;
|
import jscl.AbstractJsclArithmeticException;
|
||||||
import jscl.NumeralBase;
|
|
||||||
import jscl.NumeralBaseException;
|
import jscl.NumeralBaseException;
|
||||||
import jscl.math.Generic;
|
import jscl.math.Generic;
|
||||||
import jscl.text.ParseInterruptedException;
|
import jscl.text.ParseInterruptedException;
|
||||||
@ -11,10 +10,6 @@ import org.solovyev.android.calculator.jscl.JsclOperation;
|
|||||||
import org.solovyev.android.calculator.text.TextProcessor;
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
import org.solovyev.common.msg.MessageRegistry;
|
import org.solovyev.common.msg.MessageRegistry;
|
||||||
import org.solovyev.common.msg.MessageType;
|
import org.solovyev.common.msg.MessageType;
|
||||||
import org.solovyev.common.text.StringUtils;
|
|
||||||
import org.solovyev.math.units.UnitConverter;
|
|
||||||
import org.solovyev.math.units.UnitImpl;
|
|
||||||
import org.solovyev.math.units.UnitType;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@ -48,32 +43,6 @@ public class CalculatorImpl implements Calculator {
|
|||||||
public CalculatorImpl() {
|
public CalculatorImpl() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@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)) {
|
|
||||||
result = "";
|
|
||||||
} else {
|
|
||||||
|
|
||||||
String to = null;
|
|
||||||
try {
|
|
||||||
if (converter.isSupported(fromUnitType, toUnitType)) {
|
|
||||||
to = converter.convert(UnitImpl.newInstance(from, fromUnitType), toUnitType).getValue();
|
|
||||||
}
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
throw new ConversionException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = to;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private CalculatorEventDataId nextCalculatorEventDataId() {
|
private CalculatorEventDataId nextCalculatorEventDataId() {
|
||||||
long eventId = counter.incrementAndGet();
|
long eventId = counter.incrementAndGet();
|
||||||
@ -81,9 +50,9 @@ public class CalculatorImpl implements Calculator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private CalculatorEventDataId nextEventDataId(@NotNull Long sequenceId) {
|
private CalculatorEventDataId nextEventDataId(@NotNull Long calculationId) {
|
||||||
long eventId = counter.incrementAndGet();
|
long eventId = counter.incrementAndGet();
|
||||||
return CalculatorEventDataIdImpl.newInstance(eventId, sequenceId);
|
return CalculatorEventDataIdImpl.newInstance(eventId, calculationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -117,56 +86,14 @@ public class CalculatorImpl implements Calculator {
|
|||||||
threadPoolExecutor.execute(new Runnable() {
|
threadPoolExecutor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
CalculatorImpl.this.evaluate(eventDataId.getSequenceId(), operation, expression, mr);
|
CalculatorImpl.this.evaluate(eventDataId.getCalculationId(), operation, expression, mr);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return eventDataId;
|
return eventDataId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
private void evaluate(@NotNull Long calculationId,
|
||||||
@Override
|
|
||||||
public CalculatorEventDataId convert(@NotNull final Generic generic,
|
|
||||||
@NotNull final NumeralBase to) {
|
|
||||||
final CalculatorEventDataId eventDataId = nextCalculatorEventDataId();
|
|
||||||
|
|
||||||
threadPoolExecutor.execute(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
final Long sequenceId = eventDataId.getSequenceId();
|
|
||||||
assert sequenceId != null;
|
|
||||||
|
|
||||||
fireCalculatorEvent(newConversionEventData(sequenceId), CalculatorEventType.conversion_started, null);
|
|
||||||
|
|
||||||
final NumeralBase from = CalculatorLocatorImpl.getInstance().getCalculatorEngine().getEngine().getNumeralBase();
|
|
||||||
|
|
||||||
if (from != to) {
|
|
||||||
String fromString = generic.toString();
|
|
||||||
if (!StringUtils.isEmpty(fromString)) {
|
|
||||||
try {
|
|
||||||
fromString = ToJsclTextProcessor.getInstance().process(fromString).getExpression();
|
|
||||||
} catch (CalculatorParseException e) {
|
|
||||||
// ok, problems while processing occurred
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// todo serso: continue
|
|
||||||
//doConversion(AndroidNumeralBase.getConverter(), fromString, AndroidNumeralBase.valueOf(fromString), AndroidNumeralBase.valueOf(to));
|
|
||||||
} else {
|
|
||||||
fireCalculatorEvent(newConversionEventData(sequenceId), CalculatorEventType.conversion_finished, generic.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return eventDataId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private CalculatorEventData newConversionEventData(@NotNull Long sequenceId) {
|
|
||||||
return CalculatorEventDataImpl.newInstance(nextEventDataId(sequenceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void evaluate(@NotNull Long sequenceId,
|
|
||||||
@NotNull JsclOperation operation,
|
@NotNull JsclOperation operation,
|
||||||
@NotNull String expression,
|
@NotNull String expression,
|
||||||
@Nullable MessageRegistry mr) {
|
@Nullable MessageRegistry mr) {
|
||||||
@ -174,7 +101,7 @@ public class CalculatorImpl implements Calculator {
|
|||||||
|
|
||||||
PreparedExpression preparedExpression = null;
|
PreparedExpression preparedExpression = null;
|
||||||
|
|
||||||
fireCalculatorEvent(newCalculationEventData(operation, expression, sequenceId), CalculatorEventType.calculation_started, new CalculatorInputImpl(expression, operation));
|
fireCalculatorEvent(newCalculationEventData(operation, expression, calculationId), CalculatorEventType.calculation_started, new CalculatorInputImpl(expression, operation));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
preparedExpression = preprocessor.process(expression);
|
preparedExpression = preprocessor.process(expression);
|
||||||
@ -189,27 +116,27 @@ public class CalculatorImpl implements Calculator {
|
|||||||
result.toString();
|
result.toString();
|
||||||
|
|
||||||
final CalculatorOutputImpl data = new CalculatorOutputImpl(operation.getFromProcessor().process(result), operation, result);
|
final CalculatorOutputImpl data = new CalculatorOutputImpl(operation.getFromProcessor().process(result), operation, result);
|
||||||
fireCalculatorEvent(newCalculationEventData(operation, expression, sequenceId), CalculatorEventType.calculation_result, data);
|
fireCalculatorEvent(newCalculationEventData(operation, expression, calculationId), CalculatorEventType.calculation_result, data);
|
||||||
|
|
||||||
} catch (AbstractJsclArithmeticException e) {
|
} catch (AbstractJsclArithmeticException e) {
|
||||||
handleException(sequenceId, operation, expression, mr, new CalculatorEvalException(e, e, jsclExpression));
|
handleException(calculationId, operation, expression, mr, new CalculatorEvalException(e, e, jsclExpression));
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (ArithmeticException e) {
|
} catch (ArithmeticException e) {
|
||||||
handleException(sequenceId, operation, expression, mr, preparedExpression, new CalculatorParseException(expression, new CalculatorMessage(CalculatorMessages.msg_001, MessageType.error, e.getMessage())));
|
handleException(calculationId, operation, expression, mr, preparedExpression, new CalculatorParseException(expression, new CalculatorMessage(CalculatorMessages.msg_001, MessageType.error, e.getMessage())));
|
||||||
} catch (StackOverflowError e) {
|
} catch (StackOverflowError e) {
|
||||||
handleException(sequenceId, operation, expression, mr, preparedExpression, new CalculatorParseException(expression, new CalculatorMessage(CalculatorMessages.msg_002, MessageType.error)));
|
handleException(calculationId, operation, expression, mr, preparedExpression, new CalculatorParseException(expression, new CalculatorMessage(CalculatorMessages.msg_002, MessageType.error)));
|
||||||
} catch (jscl.text.ParseException e) {
|
} catch (jscl.text.ParseException e) {
|
||||||
handleException(sequenceId, operation, expression, mr, preparedExpression, new CalculatorParseException(e));
|
handleException(calculationId, operation, expression, mr, preparedExpression, new CalculatorParseException(e));
|
||||||
} catch (ParseInterruptedException e) {
|
} catch (ParseInterruptedException e) {
|
||||||
|
|
||||||
// do nothing - we ourselves interrupt the calculations
|
// do nothing - we ourselves interrupt the calculations
|
||||||
fireCalculatorEvent(newCalculationEventData(operation, expression, sequenceId), CalculatorEventType.calculation_cancelled, null);
|
fireCalculatorEvent(newCalculationEventData(operation, expression, calculationId), CalculatorEventType.calculation_cancelled, null);
|
||||||
|
|
||||||
} catch (CalculatorParseException e) {
|
} catch (CalculatorParseException e) {
|
||||||
handleException(sequenceId, operation, expression, mr, preparedExpression, e);
|
handleException(calculationId, operation, expression, mr, preparedExpression, e);
|
||||||
} finally {
|
} finally {
|
||||||
fireCalculatorEvent(newCalculationEventData(operation, expression, sequenceId), CalculatorEventType.calculation_finished, null);
|
fireCalculatorEvent(newCalculationEventData(operation, expression, calculationId), CalculatorEventType.calculation_finished, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -279,13 +206,4 @@ public class CalculatorImpl implements Calculator {
|
|||||||
public void fireCalculatorEvents(@NotNull List<CalculatorEvent> calculatorEvents) {
|
public void fireCalculatorEvents(@NotNull List<CalculatorEvent> calculatorEvents) {
|
||||||
calculatorEventContainer.fireCalculatorEvents(calculatorEvents);
|
calculatorEventContainer.fireCalculatorEvents(calculatorEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class ConversionException extends Exception {
|
|
||||||
private ConversionException() {
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConversionException(Throwable throwable) {
|
|
||||||
super(throwable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,12 @@
|
|||||||
|
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-15
|
target=android-15
|
||||||
android.library.reference.1=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.0
|
android.library.reference.1=../calculatorpp-service
|
||||||
android.library.reference.2=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.0
|
android.library.reference.2=gen-external-apklibs/org.solovyev.android_android-common-core_1.0.0
|
||||||
android.library.reference.3=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.0
|
android.library.reference.3=gen-external-apklibs/org.solovyev.android_android-common-ads_1.0.0
|
||||||
android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.0
|
android.library.reference.4=gen-external-apklibs/org.solovyev.android_android-common-view_1.0.0
|
||||||
android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.0
|
android.library.reference.5=gen-external-apklibs/org.solovyev.android_android-common-preferences_1.0.0
|
||||||
android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.0
|
android.library.reference.6=gen-external-apklibs/org.solovyev.android_android-common-other_1.0.0
|
||||||
|
android.library.reference.7=gen-external-apklibs/org.solovyev.android_android-common-menu_1.0.0
|
||||||
|
|
||||||
|
|
||||||
|
@ -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,9 +20,12 @@ import org.solovyev.android.calculator.model.CalculatorEngine;
|
|||||||
import org.solovyev.android.calculator.text.TextProcessor;
|
import org.solovyev.android.calculator.text.TextProcessor;
|
||||||
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.collections.CollectionsUtils;
|
import org.solovyev.common.collections.CollectionsUtils;
|
||||||
|
import org.solovyev.common.text.StringUtils;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -33,18 +37,95 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class AndroidCalculatorDisplayView extends AutoResizeTextView implements CalculatorDisplayView {
|
public class AndroidCalculatorDisplayView extends AutoResizeTextView implements CalculatorDisplayView {
|
||||||
|
|
||||||
public static enum MenuItem implements LabeledMenuItem<CalculatorDisplayViewState> {
|
private static enum ConversionMenuItem implements AMenuItem<CalculatorDisplayView> {
|
||||||
|
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 CalculatorDisplayView data, @NotNull Context context) {
|
||||||
|
final NumeralBase fromNumeralBase = CalculatorEngine.instance.getEngine().getNumeralBase();
|
||||||
|
|
||||||
|
final Generic lastResult = CalculatorLocatorImpl.getInstance().getCalculatorDisplay().getViewState().getResult();
|
||||||
|
|
||||||
|
if (lastResult != null) {
|
||||||
|
String to;
|
||||||
|
try {
|
||||||
|
to = convert(lastResult);
|
||||||
|
|
||||||
|
// 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<CalculatorDisplayView> {
|
||||||
|
|
||||||
copy(R.string.c_copy) {
|
copy(R.string.c_copy) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
CalculatorModel.copyResult(context, data);
|
CalculatorModel.copyResult(context, data);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
convert_to_bin(R.string.convert_to_bin) {
|
convert_to_bin(R.string.convert_to_bin) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
ConversionMenuItem.convert_to_bin.onClick(data, context);
|
ConversionMenuItem.convert_to_bin.onClick(data, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +137,7 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
|
|
||||||
convert_to_dec(R.string.convert_to_dec) {
|
convert_to_dec(R.string.convert_to_dec) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
ConversionMenuItem.convert_to_dec.onClick(data, context);
|
ConversionMenuItem.convert_to_dec.onClick(data, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +149,7 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
|
|
||||||
convert_to_hex(R.string.convert_to_hex) {
|
convert_to_hex(R.string.convert_to_hex) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
ConversionMenuItem.convert_to_hex.onClick(data, context);
|
ConversionMenuItem.convert_to_hex.onClick(data, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,8 +161,8 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
|
|
||||||
convert(R.string.c_convert) {
|
convert(R.string.c_convert) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
final Generic result = data.getResult();
|
final Generic result = data.getState().getResult();
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
new NumeralBaseConverterDialog(result.toString()).show(context);
|
new NumeralBaseConverterDialog(result.toString()).show(context);
|
||||||
}
|
}
|
||||||
@ -95,8 +176,8 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
|
|||||||
|
|
||||||
plot(R.string.c_plot) {
|
plot(R.string.c_plot) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
public void onClick(@NotNull CalculatorDisplayView data, @NotNull Context context) {
|
||||||
final Generic generic = data.getResult();
|
final Generic generic = data.getState().getResult();
|
||||||
assert generic != null;
|
assert generic != null;
|
||||||
|
|
||||||
final Constant constant = CollectionsUtils.getFirstCollectionElement(getNotSystemConstants(generic));
|
final Constant constant = CollectionsUtils.getFirstCollectionElement(getNotSystemConstants(generic));
|
||||||
|
@ -97,9 +97,10 @@ public enum CalculatorModel implements CursorControl, HistoryControl<CalculatorH
|
|||||||
copyResult(context, display);
|
copyResult(context, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void copyResult(@NotNull Context context, @NotNull final CalculatorDisplayViewState viewState) {
|
public static void copyResult(@NotNull Context context, @NotNull final CalculatorDisplayView display) {
|
||||||
if (viewState.isValid()) {
|
final CalculatorDisplayViewState displayViewState = display.getState();
|
||||||
final CharSequence text = viewState.getText();
|
if (displayViewState.isValid()) {
|
||||||
|
final CharSequence text = display.getText();
|
||||||
if (!StringUtils.isEmpty(text)) {
|
if (!StringUtils.isEmpty(text)) {
|
||||||
final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE);
|
final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE);
|
||||||
clipboard.setText(text.toString());
|
clipboard.setText(text.toString());
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
package org.solovyev.android.calculator;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import jscl.NumeralBase;
|
|
||||||
import jscl.math.Generic;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.solovyev.android.calculator.jscl.JsclOperation;
|
|
||||||
import org.solovyev.android.calculator.model.CalculatorEngine;
|
|
||||||
import org.solovyev.android.menu.AMenuItem;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 9/21/12
|
|
||||||
* Time: 12:11 AM
|
|
||||||
*/
|
|
||||||
enum ConversionMenuItem implements AMenuItem<CalculatorDisplayViewState> {
|
|
||||||
|
|
||||||
convert_to_bin(NumeralBase.bin),
|
|
||||||
convert_to_dec(NumeralBase.dec),
|
|
||||||
convert_to_hex(NumeralBase.hex);
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final NumeralBase toNumeralBase;
|
|
||||||
|
|
||||||
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 (CalculatorImpl.ConversionException e) {
|
|
||||||
// conversion is not possible => return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(@NotNull CalculatorDisplayViewState data, @NotNull Context context) {
|
|
||||||
final NumeralBase fromNumeralBase = CalculatorEngine.instance.getEngine().getNumeralBase();
|
|
||||||
|
|
||||||
final Generic lastResult = data.getResult();
|
|
||||||
|
|
||||||
if (lastResult != null) {
|
|
||||||
convert(lastResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void convert(@NotNull Generic generic) {
|
|
||||||
CalculatorLocatorImpl.getInstance().getCalculator().convert(generic, this.toNumeralBase);
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,7 +10,6 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
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.CalculatorImpl;
|
|
||||||
import org.solovyev.math.units.Unit;
|
import org.solovyev.math.units.Unit;
|
||||||
import org.solovyev.math.units.UnitConverter;
|
import org.solovyev.math.units.UnitConverter;
|
||||||
import org.solovyev.math.units.UnitImpl;
|
import org.solovyev.math.units.UnitImpl;
|
||||||
@ -18,6 +17,7 @@ import org.solovyev.math.units.UnitType;
|
|||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.android.view.ViewBuilder;
|
import org.solovyev.android.view.ViewBuilder;
|
||||||
import org.solovyev.android.view.ViewFromLayoutBuilder;
|
import org.solovyev.android.view.ViewFromLayoutBuilder;
|
||||||
|
import org.solovyev.common.text.StringUtils;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -173,12 +173,47 @@ public class UnitConverterViewBuilder implements ViewBuilder<View> {
|
|||||||
|
|
||||||
final String from = fromEditText.getText().toString();
|
final String from = fromEditText.getText().toString();
|
||||||
try {
|
try {
|
||||||
toEditText.setText(CalculatorImpl.doConversion(converter, from, getFromUnitType(main), getToUnitType(main)));
|
toEditText.setText(doConversion(converter, from, getFromUnitType(main), getToUnitType(main)));
|
||||||
} catch (CalculatorImpl.ConversionException e) {
|
} catch (ConversionException e) {
|
||||||
toEditText.setText(context.getString(R.string.c_error));
|
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)) {
|
||||||
|
result = "";
|
||||||
|
} else {
|
||||||
|
|
||||||
|
String to = null;
|
||||||
|
try {
|
||||||
|
if (converter.isSupported(fromUnitType, toUnitType)) {
|
||||||
|
to = converter.convert(UnitImpl.newInstance(from, fromUnitType), toUnitType).getValue();
|
||||||
|
}
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
throw new ConversionException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static Unit<String> getToUnit(@NotNull View main) {
|
private static Unit<String> getToUnit(@NotNull View main) {
|
||||||
final EditText toUnits = (EditText) main.findViewById(R.id.units_to);
|
final EditText toUnits = (EditText) main.findViewById(R.id.units_to);
|
||||||
|
Loading…
Reference in New Issue
Block a user