EditFunctionFragment changes
This commit is contained in:
parent
3a879b0de8
commit
2a8c559a01
@ -60,6 +60,7 @@ dependencies {
|
|||||||
compile 'org.solovyev:common-core:1.0.7'
|
compile 'org.solovyev:common-core:1.0.7'
|
||||||
compile 'org.solovyev:common-text:1.0.7'
|
compile 'org.solovyev:common-text:1.0.7'
|
||||||
compile 'org.solovyev:common-security:1.0.7'
|
compile 'org.solovyev:common-security:1.0.7'
|
||||||
|
compile 'org.solovyev:common-msg:1.0.7'
|
||||||
compile 'com.android.support:support-v4:23.1.1'
|
compile 'com.android.support:support-v4:23.1.1'
|
||||||
compile 'com.android.support:appcompat-v7:23.1.1'
|
compile 'com.android.support:appcompat-v7:23.1.1'
|
||||||
compile 'com.android.support:design:23.1.1'
|
compile 'com.android.support:design:23.1.1'
|
||||||
@ -73,7 +74,7 @@ dependencies {
|
|||||||
compile 'org.solovyev.android:android-common-views:1.1.18@aar'
|
compile 'org.solovyev.android:android-common-views:1.1.18@aar'
|
||||||
compile 'org.solovyev.android:android-common-menus:1.1.18@aar'
|
compile 'org.solovyev.android:android-common-menus:1.1.18@aar'
|
||||||
compile 'org.solovyev.android:android-common-preferences:1.1.18@aar'
|
compile 'org.solovyev.android:android-common-preferences:1.1.18@aar'
|
||||||
compile('org.solovyev:jscl:1.0.8') {
|
compile('org.solovyev:jscl:1.0.12') {
|
||||||
exclude(module: 'xercesImpl')
|
exclude(module: 'xercesImpl')
|
||||||
}
|
}
|
||||||
compile 'org.solovyev.android:checkout:0.7.2@aar'
|
compile 'org.solovyev.android:checkout:0.7.2@aar'
|
||||||
|
BIN
app/misc/libs/jscl-1.0.12.jar
Normal file
BIN
app/misc/libs/jscl-1.0.12.jar
Normal file
Binary file not shown.
@ -1,7 +1,9 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import org.solovyev.android.calculator.function.EditFunctionFragment;
|
||||||
import org.solovyev.android.calculator.history.BaseHistoryFragment;
|
import org.solovyev.android.calculator.history.BaseHistoryFragment;
|
||||||
import org.solovyev.android.calculator.history.EditHistoryFragment;
|
import org.solovyev.android.calculator.history.EditHistoryFragment;
|
||||||
|
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
|
||||||
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenService;
|
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenService;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
@ -17,5 +19,7 @@ public interface AppComponent {
|
|||||||
void inject(CalculatorOnscreenService service);
|
void inject(CalculatorOnscreenService service);
|
||||||
void inject(BaseHistoryFragment fragment);
|
void inject(BaseHistoryFragment fragment);
|
||||||
void inject(BaseDialogFragment fragment);
|
void inject(BaseDialogFragment fragment);
|
||||||
|
void inject(EditFunctionFragment fragment);
|
||||||
void inject(EditHistoryFragment fragment);
|
void inject(EditHistoryFragment fragment);
|
||||||
|
void inject(FunctionsFragment fragment);
|
||||||
}
|
}
|
||||||
|
@ -33,12 +33,17 @@ import android.support.v7.app.AppCompatActivity;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import jscl.math.Generic;
|
|
||||||
import org.solovyev.android.Activities;
|
import org.solovyev.android.Activities;
|
||||||
import org.solovyev.android.calculator.about.CalculatorAboutActivity;
|
import org.solovyev.android.calculator.about.CalculatorAboutActivity;
|
||||||
|
import org.solovyev.android.calculator.function.CppFunction;
|
||||||
import org.solovyev.android.calculator.function.EditFunctionFragment;
|
import org.solovyev.android.calculator.function.EditFunctionFragment;
|
||||||
import org.solovyev.android.calculator.history.CalculatorHistoryActivity;
|
import org.solovyev.android.calculator.history.CalculatorHistoryActivity;
|
||||||
import org.solovyev.android.calculator.math.edit.*;
|
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
||||||
|
import org.solovyev.android.calculator.math.edit.CalculatorOperatorsActivity;
|
||||||
|
import org.solovyev.android.calculator.math.edit.CalculatorVarsActivity;
|
||||||
|
import org.solovyev.android.calculator.math.edit.VarEditDialogFragment;
|
||||||
|
import org.solovyev.android.calculator.math.edit.VarsFragment;
|
||||||
import org.solovyev.android.calculator.matrix.CalculatorMatrixActivity;
|
import org.solovyev.android.calculator.matrix.CalculatorMatrixActivity;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotActivity;
|
import org.solovyev.android.calculator.plot.CalculatorPlotActivity;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
import org.solovyev.android.calculator.plot.CalculatorPlotter;
|
||||||
@ -47,9 +52,14 @@ import org.solovyev.common.msg.Message;
|
|||||||
import org.solovyev.common.msg.MessageType;
|
import org.solovyev.common.msg.MessageType;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
|
||||||
|
import jscl.math.Generic;
|
||||||
|
import jscl.math.function.Constant;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
@ -159,9 +169,17 @@ public final class CalculatorActivityLauncher implements CalculatorEventListener
|
|||||||
final DisplayState viewState = display.getState();
|
final DisplayState viewState = display.getState();
|
||||||
|
|
||||||
if (viewState.valid) {
|
if (viewState.valid) {
|
||||||
final String functionValue = viewState.text;
|
final String functionBody = viewState.text;
|
||||||
if (!Strings.isEmpty(functionValue)) {
|
if (!Strings.isEmpty(functionBody)) {
|
||||||
EditFunctionFragment.showDialog(EditFunctionFragment.Input.newFromDisplay(viewState), context);
|
final CppFunction.Builder builder = CppFunction.builder("", functionBody);
|
||||||
|
final Generic generic = viewState.getResult();
|
||||||
|
if (generic != null) {
|
||||||
|
final Set<Constant> constants = CalculatorUtils.getNotSystemConstants(generic);
|
||||||
|
for (Constant constant : constants) {
|
||||||
|
builder.withParameter(constant.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EditFunctionFragment.showDialog(builder.build(), context);
|
||||||
} else {
|
} else {
|
||||||
getNotifier().showMessage(R.string.empty_function_error, MessageType.error);
|
getNotifier().showMessage(R.string.empty_function_error, MessageType.error);
|
||||||
}
|
}
|
||||||
|
@ -81,9 +81,6 @@ public enum CalculatorEventType {
|
|||||||
// @Nonnull IConstant
|
// @Nonnull IConstant
|
||||||
use_constant,
|
use_constant,
|
||||||
|
|
||||||
// @Nonnull Function
|
|
||||||
use_function,
|
|
||||||
|
|
||||||
// @Nonnull Operator
|
// @Nonnull Operator
|
||||||
use_operator,
|
use_operator,
|
||||||
|
|
||||||
@ -100,12 +97,6 @@ public enum CalculatorEventType {
|
|||||||
// @Nonnull Function
|
// @Nonnull Function
|
||||||
function_removed,
|
function_removed,
|
||||||
|
|
||||||
// @Nonnull Function
|
|
||||||
function_added,
|
|
||||||
|
|
||||||
// @Nonnull Change<IFunction>
|
|
||||||
function_changed,
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
*
|
*
|
||||||
|
@ -54,7 +54,6 @@ import jscl.MathEngine;
|
|||||||
import jscl.NumeralBase;
|
import jscl.NumeralBase;
|
||||||
import jscl.NumeralBaseException;
|
import jscl.NumeralBaseException;
|
||||||
import jscl.math.Generic;
|
import jscl.math.Generic;
|
||||||
import jscl.math.function.Function;
|
|
||||||
import jscl.math.function.IConstant;
|
import jscl.math.function.IConstant;
|
||||||
import jscl.math.operator.Operator;
|
import jscl.math.operator.Operator;
|
||||||
import jscl.text.ParseInterruptedException;
|
import jscl.text.ParseInterruptedException;
|
||||||
@ -489,6 +488,15 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
|
|||||||
VarsRegistry.saveVariable(varsRegistry, builder, ansVar, this, false);
|
VarsRegistry.saveVariable(varsRegistry, builder, ansVar, this, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onFunctionAdded(@Nonnull FunctionsRegistry.AddedEvent event) {
|
||||||
|
evaluate();
|
||||||
|
}
|
||||||
|
@Subscribe
|
||||||
|
public void onFunctionsChanged(@Nonnull FunctionsRegistry.ChangedEvent event) {
|
||||||
|
evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
||||||
|
|
||||||
@ -502,8 +510,6 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
|
|||||||
|
|
||||||
case constant_added:
|
case constant_added:
|
||||||
case constant_removed:
|
case constant_removed:
|
||||||
case function_added:
|
|
||||||
case function_changed:
|
|
||||||
case function_removed:
|
case function_removed:
|
||||||
evaluate();
|
evaluate();
|
||||||
break;
|
break;
|
||||||
@ -517,11 +523,6 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
|
|||||||
Locator.getInstance().getKeyboard().buttonPressed(operator.getName());
|
Locator.getInstance().getKeyboard().buttonPressed(operator.getName());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case use_function:
|
|
||||||
final Function function = (Function) data;
|
|
||||||
Locator.getInstance().getKeyboard().buttonPressed(function.getName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,13 +23,10 @@
|
|||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
import com.squareup.otto.Bus;
|
import com.squareup.otto.Bus;
|
||||||
import jscl.AngleUnit;
|
|
||||||
import jscl.JsclMathEngine;
|
import org.solovyev.android.Check;
|
||||||
import jscl.MathEngine;
|
|
||||||
import jscl.NumeralBase;
|
|
||||||
import jscl.math.function.IConstant;
|
|
||||||
import jscl.math.operator.Operator;
|
|
||||||
import org.solovyev.android.calculator.model.EntityDao;
|
import org.solovyev.android.calculator.model.EntityDao;
|
||||||
import org.solovyev.android.calculator.model.Vars;
|
import org.solovyev.android.calculator.model.Vars;
|
||||||
import org.solovyev.android.prefs.BooleanPreference;
|
import org.solovyev.android.prefs.BooleanPreference;
|
||||||
@ -40,14 +37,22 @@ import org.solovyev.common.text.EnumMapper;
|
|||||||
import org.solovyev.common.text.NumberMapper;
|
import org.solovyev.common.text.NumberMapper;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import jscl.AngleUnit;
|
||||||
|
import jscl.JsclMathEngine;
|
||||||
|
import jscl.MathEngine;
|
||||||
|
import jscl.NumeralBase;
|
||||||
|
import jscl.math.function.IConstant;
|
||||||
|
import jscl.math.operator.Operator;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class Engine implements SharedPreferences.OnSharedPreferenceChangeListener {
|
public class Engine implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
@ -131,6 +136,7 @@ public class Engine implements SharedPreferences.OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void init(@Nonnull Executor initThread) {
|
public void init(@Nonnull Executor initThread) {
|
||||||
|
Check.isMainThread();
|
||||||
checkPreferences();
|
checkPreferences();
|
||||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
applyPreferences();
|
applyPreferences();
|
||||||
@ -183,6 +189,7 @@ public class Engine implements SharedPreferences.OnSharedPreferenceChangeListene
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void applyPreferences() {
|
private void applyPreferences() {
|
||||||
|
Check.isMainThread();
|
||||||
mathEngine.setAngleUnits(Preferences.angleUnit.getPreference(preferences));
|
mathEngine.setAngleUnits(Preferences.angleUnit.getPreference(preferences));
|
||||||
mathEngine.setNumeralBase(Preferences.numeralBase.getPreference(preferences));
|
mathEngine.setNumeralBase(Preferences.numeralBase.getPreference(preferences));
|
||||||
setMultiplicationSign(Preferences.multiplicationSign.getPreference(preferences));
|
setMultiplicationSign(Preferences.multiplicationSign.getPreference(preferences));
|
||||||
|
@ -26,17 +26,15 @@ import android.app.Application;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import jscl.JsclMathEngine;
|
|
||||||
import jscl.math.function.CustomFunction;
|
import com.squareup.otto.Bus;
|
||||||
import jscl.math.function.Function;
|
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.simpleframework.xml.Serializer;
|
import org.simpleframework.xml.Serializer;
|
||||||
import org.simpleframework.xml.core.Persister;
|
import org.simpleframework.xml.core.Persister;
|
||||||
import org.solovyev.android.Check;
|
import org.solovyev.android.Check;
|
||||||
import org.solovyev.android.calculator.function.CppFunction;
|
import org.solovyev.android.calculator.function.CppFunction;
|
||||||
import org.solovyev.android.calculator.function.FunctionBuilderAdapter;
|
|
||||||
import org.solovyev.android.calculator.json.Json;
|
import org.solovyev.android.calculator.json.Json;
|
||||||
import org.solovyev.android.calculator.model.OldFunction;
|
import org.solovyev.android.calculator.model.OldFunction;
|
||||||
import org.solovyev.android.calculator.model.OldFunctions;
|
import org.solovyev.android.calculator.model.OldFunctions;
|
||||||
@ -44,15 +42,25 @@ import org.solovyev.android.io.FileSaver;
|
|||||||
import org.solovyev.common.JBuilder;
|
import org.solovyev.common.JBuilder;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import jscl.JsclMathEngine;
|
||||||
import java.util.*;
|
import jscl.math.function.CustomFunction;
|
||||||
import java.util.concurrent.Executor;
|
import jscl.math.function.Function;
|
||||||
|
|
||||||
import static android.text.TextUtils.isEmpty;
|
import static android.text.TextUtils.isEmpty;
|
||||||
|
|
||||||
@ -83,19 +91,20 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function, OldFunctio
|
|||||||
SharedPreferences preferences;
|
SharedPreferences preferences;
|
||||||
@Inject
|
@Inject
|
||||||
Application application;
|
Application application;
|
||||||
|
@Inject
|
||||||
|
Bus bus;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FunctionsRegistry(@Nonnull JsclMathEngine mathEngine) {
|
public FunctionsRegistry(@Nonnull JsclMathEngine mathEngine) {
|
||||||
super(mathEngine.getFunctionsRegistry(), FUNCTION_DESCRIPTION_PREFIX, null);
|
super(mathEngine.getFunctionsRegistry(), FUNCTION_DESCRIPTION_PREFIX, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(@NonNull FunctionBuilderAdapter builder, @Nullable IFunction editedInstance, Object source) {
|
public void add(@NonNull JBuilder<? extends Function> builder, @Nullable Function oldFunction) {
|
||||||
final Function function = add(builder);
|
final Function function = add(builder);
|
||||||
save();
|
if (oldFunction == null) {
|
||||||
if (editedInstance == null) {
|
bus.post(new AddedEvent(function));
|
||||||
calculator.fireCalculatorEvent(CalculatorEventType.function_added, function, source);
|
|
||||||
} else {
|
} else {
|
||||||
calculator.fireCalculatorEvent(CalculatorEventType.function_changed, ChangeImpl.newInstance(editedInstance, function), source);
|
bus.post(new ChangedEvent(oldFunction, function));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,12 +121,25 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function, OldFunctio
|
|||||||
add(new CustomFunction.Builder(true, "im", Collections.singletonList("x"), "(x-conjugate(x))/(2*i)"));
|
add(new CustomFunction.Builder(true, "im", Collections.singletonList("x"), "(x-conjugate(x))/(2*i)"));
|
||||||
|
|
||||||
for (CppFunction function : loadFunctions()) {
|
for (CppFunction function : loadFunctions()) {
|
||||||
final CustomFunction.Builder builder = new CustomFunction.Builder(function.getName(), function.getParameters(), function.getBody());
|
add(function.toCustomFunctionBuilder());
|
||||||
builder.setDescription(function.getDescription());
|
|
||||||
add(builder);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(@Nonnull Function function) {
|
||||||
|
super.remove(function);
|
||||||
|
bus.post(new RemovedEvent(function));
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Function add(@Nonnull JBuilder<? extends Function> result) {
|
||||||
|
final Function function = super.add(result);
|
||||||
|
// todo serso: don't save while we're initializing
|
||||||
|
save();
|
||||||
|
return function;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private List<CppFunction> loadFunctions() {
|
private List<CppFunction> loadFunctions() {
|
||||||
try {
|
try {
|
||||||
@ -194,7 +216,7 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function, OldFunctio
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected JBuilder<? extends Function> createBuilder(@Nonnull OldFunction function) {
|
protected JBuilder<? extends Function> createBuilder(@Nonnull OldFunction function) {
|
||||||
return new FunctionBuilderAdapter(new OldFunction.Builder(function));
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -239,4 +261,34 @@ public class FunctionsRegistry extends BaseEntitiesRegistry<Function, OldFunctio
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final class RemovedEvent {
|
||||||
|
@NonNull
|
||||||
|
public final Function function;
|
||||||
|
|
||||||
|
public RemovedEvent(@NonNull Function function) {
|
||||||
|
this.function = function;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class AddedEvent {
|
||||||
|
@NonNull
|
||||||
|
public final Function function;
|
||||||
|
|
||||||
|
public AddedEvent(@NonNull Function function) {
|
||||||
|
this.function = function;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class ChangedEvent {
|
||||||
|
@NonNull
|
||||||
|
public final Function oldFunction;
|
||||||
|
@NonNull
|
||||||
|
public final Function newFunction;
|
||||||
|
|
||||||
|
public ChangedEvent(@NonNull Function oldFunction, @NonNull Function newFunction) {
|
||||||
|
this.oldFunction = oldFunction;
|
||||||
|
this.newFunction = newFunction;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package org.solovyev.android.calculator.function;
|
package org.solovyev.android.calculator.function;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
@ -11,12 +13,16 @@ import org.solovyev.android.calculator.json.Json;
|
|||||||
import org.solovyev.android.calculator.json.Jsonable;
|
import org.solovyev.android.calculator.json.Jsonable;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CppFunction implements Jsonable {
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import jscl.math.function.CustomFunction;
|
||||||
|
import jscl.math.function.IFunction;
|
||||||
|
|
||||||
|
public class CppFunction implements Jsonable, Parcelable {
|
||||||
|
|
||||||
public static final Json.Creator<CppFunction> JSON_CREATOR = new Json.Creator<CppFunction>() {
|
public static final Json.Creator<CppFunction> JSON_CREATOR = new Json.Creator<CppFunction>() {
|
||||||
@NonNull
|
@NonNull
|
||||||
@ -25,10 +31,23 @@ public class CppFunction implements Jsonable {
|
|||||||
return new CppFunction(json);
|
return new CppFunction(json);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
public static final Creator<CppFunction> CREATOR = new Creator<CppFunction>() {
|
||||||
|
@Override
|
||||||
|
public CppFunction createFromParcel(Parcel in) {
|
||||||
|
return new CppFunction(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CppFunction[] newArray(int size) {
|
||||||
|
return new CppFunction[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
public static final int NO_ID = -1;
|
||||||
private static final String JSON_NAME = "n";
|
private static final String JSON_NAME = "n";
|
||||||
private static final String JSON_BODY = "b";
|
private static final String JSON_BODY = "b";
|
||||||
private static final String JSON_PARAMETERS = "ps";
|
private static final String JSON_PARAMETERS = "ps";
|
||||||
private static final String JSON_DESCRIPTION = "d";
|
private static final String JSON_DESCRIPTION = "d";
|
||||||
|
protected final int id;
|
||||||
@Nonnull
|
@Nonnull
|
||||||
protected final List<String> parameters = new ArrayList<>();
|
protected final List<String> parameters = new ArrayList<>();
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@ -41,13 +60,13 @@ public class CppFunction implements Jsonable {
|
|||||||
private CppFunction(@Nonnull String name, @Nonnull String body) {
|
private CppFunction(@Nonnull String name, @Nonnull String body) {
|
||||||
Check.isNotEmpty(name);
|
Check.isNotEmpty(name);
|
||||||
Check.isNotEmpty(body);
|
Check.isNotEmpty(body);
|
||||||
|
this.id = NO_ID;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.body = body;
|
this.body = body;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CppFunction(@NonNull JSONObject json) throws JSONException {
|
private CppFunction(@NonNull JSONObject json) throws JSONException {
|
||||||
name = json.getString(JSON_NAME);
|
id = NO_ID;
|
||||||
body = json.getString(JSON_BODY);
|
|
||||||
final JSONArray array = json.optJSONArray(JSON_PARAMETERS);
|
final JSONArray array = json.optJSONArray(JSON_PARAMETERS);
|
||||||
if (array != null) {
|
if (array != null) {
|
||||||
for (int i = 0; i < array.length(); i++) {
|
for (int i = 0; i < array.length(); i++) {
|
||||||
@ -57,21 +76,33 @@ public class CppFunction implements Jsonable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
name = json.getString(JSON_NAME);
|
||||||
|
body = json.getString(JSON_BODY);
|
||||||
description = json.optString(JSON_DESCRIPTION, "");
|
description = json.optString(JSON_DESCRIPTION, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
private CppFunction(@NonNull CppFunction that) {
|
private CppFunction(@NonNull CppFunction that) {
|
||||||
|
id = that.id;
|
||||||
|
parameters.addAll(that.parameters);
|
||||||
name = that.name;
|
name = that.name;
|
||||||
body = that.body;
|
body = that.body;
|
||||||
description = that.description;
|
description = that.description;
|
||||||
parameters.addAll(that.parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private CppFunction(@NonNull IFunction that) {
|
private CppFunction(@NonNull IFunction that) {
|
||||||
|
id = that.isIdDefined() ? that.getId() : NO_ID;
|
||||||
|
parameters.addAll(that.getParameterNames());
|
||||||
name = that.getName();
|
name = that.getName();
|
||||||
body = that.getContent();
|
body = that.getContent();
|
||||||
description = Strings.getNotEmpty(that.getDescription(), "");
|
description = Strings.getNotEmpty(that.getDescription(), "");
|
||||||
parameters.addAll(that.getParameterNames());
|
}
|
||||||
|
|
||||||
|
protected CppFunction(Parcel in) {
|
||||||
|
id = in.readInt();
|
||||||
|
parameters.addAll(in.createStringArrayList());
|
||||||
|
name = in.readString();
|
||||||
|
body = in.readString();
|
||||||
|
description = in.readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@ -93,8 +124,6 @@ public class CppFunction implements Jsonable {
|
|||||||
@Override
|
@Override
|
||||||
public JSONObject toJson() throws JSONException {
|
public JSONObject toJson() throws JSONException {
|
||||||
final JSONObject json = new JSONObject();
|
final JSONObject json = new JSONObject();
|
||||||
json.put(JSON_NAME, name);
|
|
||||||
json.put(JSON_BODY, body);
|
|
||||||
if (!parameters.isEmpty()) {
|
if (!parameters.isEmpty()) {
|
||||||
final JSONArray array = new JSONArray();
|
final JSONArray array = new JSONArray();
|
||||||
int j = 0;
|
int j = 0;
|
||||||
@ -106,12 +135,18 @@ public class CppFunction implements Jsonable {
|
|||||||
}
|
}
|
||||||
json.put(JSON_PARAMETERS, array);
|
json.put(JSON_PARAMETERS, array);
|
||||||
}
|
}
|
||||||
|
json.put(JSON_NAME, name);
|
||||||
|
json.put(JSON_BODY, body);
|
||||||
if (!TextUtils.isEmpty(description)) {
|
if (!TextUtils.isEmpty(description)) {
|
||||||
json.put(JSON_DESCRIPTION, description);
|
json.put(JSON_DESCRIPTION, description);
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public String getBody() {
|
public String getBody() {
|
||||||
return body;
|
return body;
|
||||||
@ -132,56 +167,73 @@ public class CppFunction implements Jsonable {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Builder extends CppFunction {
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(id);
|
||||||
|
dest.writeStringList(parameters);
|
||||||
|
dest.writeString(name);
|
||||||
|
dest.writeString(body);
|
||||||
|
dest.writeString(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public CustomFunction.Builder toCustomFunctionBuilder() {
|
||||||
|
final CustomFunction.Builder builder = new CustomFunction.Builder(name, parameters, body);
|
||||||
|
builder.setDescription(description);
|
||||||
|
if (id != NO_ID) {
|
||||||
|
builder.setId(id);
|
||||||
|
}
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Builder {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final CppFunction function;
|
||||||
private boolean built;
|
private boolean built;
|
||||||
|
|
||||||
private Builder(@Nonnull String name, @Nonnull String body) {
|
private Builder(@Nonnull String name, @Nonnull String body) {
|
||||||
super(name, body);
|
function = new CppFunction(name, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder(@NonNull CppFunction function) {
|
public Builder(@NonNull CppFunction that) {
|
||||||
super(function);
|
function = new CppFunction(that);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder(@NonNull IFunction function) {
|
public Builder(@NonNull IFunction that) {
|
||||||
super(function);
|
function = new CppFunction(that);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public Builder withDescription(@Nonnull String description) {
|
public Builder withDescription(@Nonnull String description) {
|
||||||
Check.isTrue(!built);
|
Check.isTrue(!built);
|
||||||
this.description = description;
|
function.description = description;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public Builder withParameters(@Nonnull Collection<? extends String> parameters) {
|
public Builder withParameters(@Nonnull Collection<? extends String> parameters) {
|
||||||
Check.isTrue(!built);
|
Check.isTrue(!built);
|
||||||
this.parameters.addAll(parameters);
|
function.parameters.addAll(parameters);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public Builder withParameter(@Nonnull String parameter) {
|
public Builder withParameter(@Nonnull String parameter) {
|
||||||
Check.isTrue(!built);
|
Check.isTrue(!built);
|
||||||
parameters.add(parameter);
|
function.parameters.add(parameter);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public CppFunction build() {
|
public CppFunction build() {
|
||||||
built = true;
|
built = true;
|
||||||
return this;
|
return function;
|
||||||
}
|
|
||||||
|
|
||||||
public void withValuesFrom(@Nonnull IFunction that) {
|
|
||||||
Check.isTrue(!built);
|
|
||||||
name = that.getName();
|
|
||||||
body = that.getContent();
|
|
||||||
description = Strings.getNotEmpty(that.getDescription(), "");
|
|
||||||
parameters.clear();
|
|
||||||
parameters.addAll(that.getParameterNames());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,40 +28,56 @@ import android.content.DialogInterface;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.design.widget.TextInputLayout;
|
import android.support.design.widget.TextInputLayout;
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.view.*;
|
import android.text.TextUtils;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import butterknife.Bind;
|
|
||||||
import butterknife.ButterKnife;
|
import org.solovyev.android.calculator.App;
|
||||||
import jscl.math.Generic;
|
import org.solovyev.android.calculator.AppComponent;
|
||||||
import jscl.math.function.*;
|
import org.solovyev.android.calculator.BaseDialogFragment;
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.Calculator;
|
||||||
|
import org.solovyev.android.calculator.CalculatorEventType;
|
||||||
|
import org.solovyev.android.calculator.FunctionsRegistry;
|
||||||
|
import org.solovyev.android.calculator.KeyboardUi;
|
||||||
|
import org.solovyev.android.calculator.KeyboardWindow;
|
||||||
|
import org.solovyev.android.calculator.Locator;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
||||||
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
|
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
|
||||||
import org.solovyev.android.calculator.math.edit.MathEntityRemover;
|
|
||||||
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
|
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
|
||||||
import org.solovyev.android.calculator.model.OldFunction;
|
|
||||||
import org.solovyev.common.math.MathRegistry;
|
import org.solovyev.common.math.MathRegistry;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
import javax.inject.Inject;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class EditFunctionFragment extends BaseDialogFragment implements CalculatorEventListener, View.OnClickListener, View.OnFocusChangeListener, View.OnKeyListener {
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import jscl.math.function.CustomFunction;
|
||||||
|
import jscl.math.function.Function;
|
||||||
|
import jscl.math.function.IConstant;
|
||||||
|
|
||||||
private static final String ARG_INPUT = "input";
|
public class EditFunctionFragment extends BaseDialogFragment implements View.OnClickListener, View.OnFocusChangeListener, View.OnKeyListener {
|
||||||
|
|
||||||
|
private static final String ARG_FUNCTION = "function";
|
||||||
private static final int MENU_FUNCTION = Menu.FIRST;
|
private static final int MENU_FUNCTION = Menu.FIRST;
|
||||||
private static final int MENU_CONSTANT = Menu.FIRST + 1;
|
private static final int MENU_CONSTANT = Menu.FIRST + 1;
|
||||||
|
|
||||||
@ -79,48 +95,65 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
TextInputLayout nameLabel;
|
TextInputLayout nameLabel;
|
||||||
@Bind(R.id.function_name)
|
@Bind(R.id.function_name)
|
||||||
EditText nameView;
|
EditText nameView;
|
||||||
|
@Bind(R.id.function_body_label)
|
||||||
|
TextInputLayout bodyLabel;
|
||||||
@Bind(R.id.function_body)
|
@Bind(R.id.function_body)
|
||||||
EditText bodyView;
|
EditText bodyView;
|
||||||
@Bind(R.id.function_description)
|
@Bind(R.id.function_description)
|
||||||
EditText descriptionView;
|
EditText descriptionView;
|
||||||
private Input input;
|
private CppFunction function;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
Calculator calculator;
|
||||||
|
@Inject
|
||||||
|
FunctionsRegistry registry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static EditFunctionFragment create(@Nonnull Input input) {
|
private static EditFunctionFragment create(@Nullable CppFunction function) {
|
||||||
final EditFunctionFragment fragment = new EditFunctionFragment();
|
final EditFunctionFragment fragment = new EditFunctionFragment();
|
||||||
fragment.input = input;
|
if (function != null) {
|
||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
args.putParcelable("input", input);
|
args.putParcelable(ARG_FUNCTION, function);
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
|
}
|
||||||
return fragment;
|
return fragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showDialog(@Nonnull Input input, @Nonnull Context context) {
|
public static void showDialog(@Nonnull FragmentActivity activity) {
|
||||||
if (context instanceof AppCompatActivity) {
|
EditFunctionFragment.showDialog(null, activity.getSupportFragmentManager());
|
||||||
EditFunctionFragment.showDialog(input, ((AppCompatActivity) context).getSupportFragmentManager());
|
}
|
||||||
} else {
|
|
||||||
|
public static void showDialog(@Nonnull CppFunction function, @Nonnull Context context) {
|
||||||
|
if (!(context instanceof CalculatorFunctionsActivity)) {
|
||||||
final Intent intent = new Intent(context, CalculatorFunctionsActivity.class);
|
final Intent intent = new Intent(context, CalculatorFunctionsActivity.class);
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
intent.putExtra(FunctionsFragment.EXTRA_FUNCTION, input);
|
intent.putExtra(FunctionsFragment.EXTRA_FUNCTION, function);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
|
} else {
|
||||||
|
EditFunctionFragment.showDialog(function, ((AppCompatActivity) context).getSupportFragmentManager());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showDialog(@Nonnull Input input, @Nonnull FragmentManager fm) {
|
public static void showDialog(@Nullable CppFunction input, @Nonnull FragmentManager fm) {
|
||||||
App.showDialog(create(input), "function-editor", fm);
|
App.showDialog(create(input), "function-editor", fm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
input = getArguments().getParcelable(ARG_INPUT);
|
function = getArguments().getParcelable(ARG_FUNCTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void inject(@NonNull AppComponent component) {
|
||||||
|
super.inject(component);
|
||||||
|
component.inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPrepareDialog(@NonNull AlertDialog.Builder builder) {
|
protected void onPrepareDialog(@NonNull AlertDialog.Builder builder) {
|
||||||
builder.setNegativeButton(R.string.c_cancel, null);
|
builder.setNegativeButton(R.string.c_cancel, null);
|
||||||
builder.setPositiveButton(R.string.ok, null);
|
builder.setPositiveButton(R.string.ok, null);
|
||||||
final OldFunction function = input.getFunction();
|
|
||||||
builder.setTitle(function == null ? R.string.function_create_function : R.string.function_edit_function);
|
builder.setTitle(function == null ? R.string.function_create_function : R.string.function_edit_function);
|
||||||
if (function != null) {
|
if (function != null) {
|
||||||
builder.setNeutralButton(R.string.c_remove, null);
|
builder.setNeutralButton(R.string.c_remove, null);
|
||||||
@ -145,17 +178,46 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
tryClose();
|
tryClose();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
final OldFunction function = input.getFunction();
|
|
||||||
if (function != null) {
|
if (function != null) {
|
||||||
final Function customFunction = new CustomFunction.Builder(function).create();
|
|
||||||
final Button neutral = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
|
final Button neutral = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
|
||||||
neutral.setOnClickListener(MathEntityRemover.newFunctionRemover(customFunction, null, getActivity(), EditFunctionFragment.this));
|
neutral.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
tryRemoveFunction(function, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void tryRemoveFunction(@NonNull CppFunction function, boolean confirmed) {
|
||||||
|
if (!confirmed) {
|
||||||
|
showRemovalDialog(function);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final CustomFunction entity = function.toCustomFunctionBuilder().create();
|
||||||
|
registry.remove(entity);
|
||||||
|
calculator.fireCalculatorEvent(CalculatorEventType.function_removed, entity, this);
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showRemovalDialog(@NonNull final CppFunction function) {
|
||||||
|
new AlertDialog.Builder(getActivity(), App.getTheme().alertDialogTheme)
|
||||||
|
.setCancelable(true)
|
||||||
|
.setTitle(R.string.removal_confirmation)
|
||||||
|
.setMessage(R.string.function_removal_confirmation_question)
|
||||||
|
.setNegativeButton(R.string.c_no, null)
|
||||||
|
.setPositiveButton(R.string.c_yes, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
tryRemoveFunction(function, true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFocusChange(View v, boolean hasFocus) {
|
public void onFocusChange(View v, boolean hasFocus) {
|
||||||
if (v.getId() == R.id.function_body) {
|
if (v.getId() == R.id.function_body) {
|
||||||
@ -166,6 +228,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (v.getId() == R.id.function_body) {
|
if (v.getId() == R.id.function_body) {
|
||||||
@ -199,9 +262,30 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
if (!validateName()) {
|
if (!validateName()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!validateParameters()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!validateBody()) {
|
if (!validateBody()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final CppFunction newFunction = CppFunction.builder(nameView.getText().toString(), bodyView.getText().toString())
|
||||||
|
.withParameters(paramsView.getParams())
|
||||||
|
.withDescription(descriptionView.getText().toString()).build();
|
||||||
|
final Function oldFunction = function.id == CppFunction.NO_ID ? null : registry.getById(function.id);
|
||||||
|
registry.add(newFunction.toCustomFunctionBuilder(), oldFunction);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validateParameters(@Nonnull List<String> parameterNames) {
|
||||||
|
for (String parameterName : parameterNames) {
|
||||||
|
if (!VarEditorSaver.isValidName(parameterName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// error = R.string.function_param_not_empty;
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,11 +295,32 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
setError(nameLabel, getString(R.string.function_name_is_not_valid));
|
setError(nameLabel, getString(R.string.function_name_is_not_valid));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
final Function existingFunction = registry.get(name);
|
||||||
|
if (existingFunction != null && (!existingFunction.isIdDefined() || !existingFunction.getId().equals(function.getId()))) {
|
||||||
|
setError(nameLabel, getString(R.string.function_already_exists));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
clearError(nameLabel);
|
clearError(nameLabel);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean validateBody() {
|
private boolean validateBody() {
|
||||||
|
final String body = bodyView.getText().toString();
|
||||||
|
if (TextUtils.isEmpty(body)) {
|
||||||
|
setError(bodyLabel, getString(R.string.function_is_empty));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
clearError(bodyLabel);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validateParameters() {
|
||||||
|
final List<String> parameters = paramsView.getParams();
|
||||||
|
/*if (TextUtils.isEmpty(body)) {
|
||||||
|
setError(bodyLabel, getString(R.string.function_is_empty));
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
//clearError(bodyLabel);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,14 +332,10 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
final List<String> parameterNames = input.getParameterNames();
|
paramsView.addParams(function.getParameters());
|
||||||
if (parameterNames != null) {
|
nameView.setText(function.getName());
|
||||||
paramsView.addParams(parameterNames);
|
descriptionView.setText(function.getDescription());
|
||||||
}
|
bodyView.setText(function.getBody());
|
||||||
|
|
||||||
nameView.setText(input.getName());
|
|
||||||
descriptionView.setText(input.getDescription());
|
|
||||||
bodyView.setText(input.getContent());
|
|
||||||
}
|
}
|
||||||
bodyView.setOnClickListener(this);
|
bodyView.setOnClickListener(this);
|
||||||
bodyView.setOnFocusChangeListener(this);
|
bodyView.setOnFocusChangeListener(this);
|
||||||
@ -243,177 +344,6 @@ public class EditFunctionFragment extends BaseDialogFragment implements Calculat
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
Locator.getInstance().getCalculator().addCalculatorEventListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
Locator.getInstance().getCalculator().removeCalculatorEventListener(this);
|
|
||||||
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
|
||||||
switch (calculatorEventType) {
|
|
||||||
case function_removed:
|
|
||||||
case function_added:
|
|
||||||
case function_changed:
|
|
||||||
if (calculatorEventData.getSource() == EditFunctionFragment.this) {
|
|
||||||
dismiss();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Input implements Parcelable {
|
|
||||||
|
|
||||||
private static final Parcelable.Creator<String> STRING_CREATOR = new Creator<String>() {
|
|
||||||
@Override
|
|
||||||
public String createFromParcel(@Nonnull Parcel in) {
|
|
||||||
return in.readString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] newArray(int size) {
|
|
||||||
return new String[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@Nullable
|
|
||||||
private OldFunction function;
|
|
||||||
@Nullable
|
|
||||||
private String name;
|
|
||||||
@Nullable
|
|
||||||
private String content;
|
|
||||||
@Nullable
|
|
||||||
private String description;
|
|
||||||
@Nullable
|
|
||||||
private List<String> parameterNames;
|
|
||||||
public static final Parcelable.Creator<Input> CREATOR = new Creator<Input>() {
|
|
||||||
@Override
|
|
||||||
public Input createFromParcel(@Nonnull Parcel in) {
|
|
||||||
return Input.fromParcel(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Input[] newArray(int size) {
|
|
||||||
return new Input[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private Input() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private static Input fromParcel(@Nonnull Parcel in) {
|
|
||||||
final Input result = new Input();
|
|
||||||
result.name = in.readString();
|
|
||||||
result.content = in.readString();
|
|
||||||
result.description = in.readString();
|
|
||||||
|
|
||||||
final List<String> parameterNames = new ArrayList<>();
|
|
||||||
in.readTypedList(parameterNames, STRING_CREATOR);
|
|
||||||
result.parameterNames = parameterNames;
|
|
||||||
|
|
||||||
result.function = (OldFunction) in.readSerializable();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static Input newInstance() {
|
|
||||||
return new Input();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static Input newFromFunction(@Nonnull IFunction function) {
|
|
||||||
final Input result = new Input();
|
|
||||||
result.function = OldFunction.fromIFunction(function);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static Input newInstance(@Nullable IFunction function,
|
|
||||||
@Nullable String name,
|
|
||||||
@Nullable String value,
|
|
||||||
@Nullable String description,
|
|
||||||
@Nonnull List<String> parameterNames) {
|
|
||||||
|
|
||||||
final Input result = new Input();
|
|
||||||
if (function != null) {
|
|
||||||
result.function = OldFunction.fromIFunction(function);
|
|
||||||
}
|
|
||||||
result.name = name;
|
|
||||||
result.content = value;
|
|
||||||
result.description = description;
|
|
||||||
result.parameterNames = new ArrayList<>(parameterNames);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static Input newFromDisplay(@Nonnull DisplayState viewState) {
|
|
||||||
final Input result = new Input();
|
|
||||||
|
|
||||||
result.content = viewState.text;
|
|
||||||
final Generic generic = viewState.getResult();
|
|
||||||
if (generic != null) {
|
|
||||||
final Set<Constant> constants = CalculatorUtils.getNotSystemConstants(generic);
|
|
||||||
final List<String> parameterNames = new ArrayList<>(constants.size());
|
|
||||||
for (Constant constant : constants) {
|
|
||||||
parameterNames.add(constant.getName());
|
|
||||||
}
|
|
||||||
result.parameterNames = parameterNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public OldFunction getFunction() {
|
|
||||||
return function;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String getName() {
|
|
||||||
return name == null ? (function == null ? null : function.getName()) : name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String getContent() {
|
|
||||||
return content == null ? (function == null ? null : function.getContent()) : content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String getDescription() {
|
|
||||||
return description == null ? (function == null ? null : function.getDescription()) : description;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public List<String> getParameterNames() {
|
|
||||||
return parameterNames == null ? (function == null ? null : function.getParameterNames()) : parameterNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(@Nonnull Parcel out, int flags) {
|
|
||||||
out.writeString(name);
|
|
||||||
out.writeString(content);
|
|
||||||
out.writeString(description);
|
|
||||||
out.writeList(parameterNames);
|
|
||||||
out.writeSerializable(function);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class KeyboardUser implements KeyboardUi.User, MenuItem.OnMenuItemClickListener {
|
private class KeyboardUser implements KeyboardUi.User, MenuItem.OnMenuItemClickListener {
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 serso aka se.solovyev
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
* Contact details
|
|
||||||
*
|
|
||||||
* Email: se.solovyev@gmail.com
|
|
||||||
* Site: http://se.solovyev.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.solovyev.android.calculator.function;
|
|
||||||
|
|
||||||
import jscl.CustomFunctionCalculationException;
|
|
||||||
import jscl.math.function.CustomFunction;
|
|
||||||
import jscl.math.function.Function;
|
|
||||||
import org.solovyev.android.calculator.model.MathEntityBuilder;
|
|
||||||
import org.solovyev.android.calculator.model.OldFunction;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 1/20/13
|
|
||||||
* Time: 12:21 PM
|
|
||||||
*/
|
|
||||||
public final class FunctionBuilderAdapter implements MathEntityBuilder<Function> {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final OldFunction.Builder nestedBuilder;
|
|
||||||
|
|
||||||
public FunctionBuilderAdapter(@Nonnull OldFunction.Builder nestedBuilder) {
|
|
||||||
this.nestedBuilder = nestedBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public MathEntityBuilder<Function> setName(@Nonnull String name) {
|
|
||||||
nestedBuilder.setName(name);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public MathEntityBuilder<Function> setDescription(@Nullable String description) {
|
|
||||||
nestedBuilder.setDescription(description);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public MathEntityBuilder<Function> setValue(@Nullable String value) {
|
|
||||||
nestedBuilder.setValue(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public Function create() throws CustomFunctionCalculationException, OldFunction.Builder.CreationException {
|
|
||||||
final OldFunction function = nestedBuilder.create();
|
|
||||||
return new CustomFunction.Builder(function).create();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,159 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 serso aka se.solovyev
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
* Contact details
|
|
||||||
*
|
|
||||||
* Email: se.solovyev@gmail.com
|
|
||||||
* Site: http://se.solovyev.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.solovyev.android.calculator.function;
|
|
||||||
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import jscl.CustomFunctionCalculationException;
|
|
||||||
import jscl.math.function.Function;
|
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
import org.solovyev.android.calculator.EntitiesRegistry;
|
|
||||||
import org.solovyev.android.calculator.FunctionsRegistry;
|
|
||||||
import org.solovyev.android.calculator.Locator;
|
|
||||||
import org.solovyev.android.calculator.R;
|
|
||||||
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
|
|
||||||
import org.solovyev.android.calculator.model.OldFunction;
|
|
||||||
import org.solovyev.common.msg.MessageType;
|
|
||||||
import org.solovyev.common.text.Strings;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class FunctionEditorSaver implements View.OnClickListener {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final Object source;
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final OldFunction.Builder builder;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private final IFunction editedInstance;
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final View view;
|
|
||||||
|
|
||||||
public FunctionEditorSaver(@Nonnull OldFunction.Builder builder,
|
|
||||||
@Nullable IFunction editedInstance,
|
|
||||||
@Nonnull View view,
|
|
||||||
@Nonnull EntitiesRegistry<Function> registry,
|
|
||||||
@Nonnull Object source) {
|
|
||||||
|
|
||||||
this.builder = builder;
|
|
||||||
this.editedInstance = editedInstance;
|
|
||||||
this.view = view;
|
|
||||||
this.source = source;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static EditFunctionFragment.Input readInput(@Nullable IFunction function, @Nonnull View root) {
|
|
||||||
final EditText editName = (EditText) root.findViewById(R.id.function_name);
|
|
||||||
String name = editName.getText().toString();
|
|
||||||
|
|
||||||
final EditText editValue = (EditText) root.findViewById(R.id.function_body);
|
|
||||||
String content = editValue.getText().toString();
|
|
||||||
|
|
||||||
final EditText editDescription = (EditText) root.findViewById(R.id.function_description);
|
|
||||||
String description = editDescription.getText().toString();
|
|
||||||
|
|
||||||
final FunctionParamsView editParams = (FunctionParamsView) root.findViewById(R.id.function_params);
|
|
||||||
List<String> parameterNames = editParams.getParams();
|
|
||||||
|
|
||||||
return EditFunctionFragment.Input.newInstance(function, name, content, description, parameterNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
final Integer error;
|
|
||||||
|
|
||||||
final EditFunctionFragment.Input input = readInput(null, view);
|
|
||||||
|
|
||||||
final String name = input.getName();
|
|
||||||
final String content = input.getContent();
|
|
||||||
final String description = input.getDescription();
|
|
||||||
|
|
||||||
List<String> parameterNames = input.getParameterNames();
|
|
||||||
if (parameterNames == null) {
|
|
||||||
parameterNames = Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
final FunctionsRegistry registry = Locator.getInstance().getEngine().getFunctionsRegistry();
|
|
||||||
if (VarEditorSaver.isValidName(name)) {
|
|
||||||
|
|
||||||
boolean canBeSaved = false;
|
|
||||||
|
|
||||||
final Function entityFromRegistry = registry.get(name);
|
|
||||||
if (entityFromRegistry == null) {
|
|
||||||
canBeSaved = true;
|
|
||||||
} else if (editedInstance != null && entityFromRegistry.getId().equals(editedInstance.getId())) {
|
|
||||||
canBeSaved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (canBeSaved) {
|
|
||||||
if (validateParameters(parameterNames)) {
|
|
||||||
|
|
||||||
if (!Strings.isEmpty(content)) {
|
|
||||||
builder.setParameterNames(parameterNames);
|
|
||||||
builder.setName(name);
|
|
||||||
builder.setDescription(description);
|
|
||||||
builder.setValue(content);
|
|
||||||
error = null;
|
|
||||||
} else {
|
|
||||||
error = R.string.function_is_empty;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error = R.string.function_param_not_empty;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error = R.string.function_already_exists;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error = R.string.function_name_is_not_valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error != null) {
|
|
||||||
Locator.getInstance().getNotifier().showMessage(error, MessageType.error);
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
registry.add(new FunctionBuilderAdapter(builder), editedInstance, source);
|
|
||||||
} catch (CustomFunctionCalculationException e) {
|
|
||||||
Locator.getInstance().getNotifier().showMessage(e);
|
|
||||||
} catch (OldFunction.Builder.CreationException e) {
|
|
||||||
Locator.getInstance().getNotifier().showMessage(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean validateParameters(@Nonnull List<String> parameterNames) {
|
|
||||||
for (String parameterName : parameterNames) {
|
|
||||||
if (!VarEditorSaver.isValidName(parameterName)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,9 +1,9 @@
|
|||||||
package org.solovyev.android.calculator.history;
|
package org.solovyev.android.calculator.history;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.solovyev.android.Check;
|
import org.solovyev.android.Check;
|
||||||
@ -173,17 +173,18 @@ public class HistoryState implements Parcelable, Jsonable {
|
|||||||
dest.writeString(comment);
|
dest.writeString(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("ParcelCreator")
|
public static final class Builder {
|
||||||
public static final class Builder extends HistoryState {
|
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final HistoryState state;
|
||||||
private boolean built;
|
private boolean built;
|
||||||
|
|
||||||
private Builder(@Nonnull EditorState editor, @Nonnull DisplayState display) {
|
private Builder(@Nonnull EditorState editor, @Nonnull DisplayState display) {
|
||||||
super(editor, display);
|
this.state = new HistoryState(editor, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Builder(@Nonnull HistoryState state, boolean newState) {
|
private Builder(@Nonnull HistoryState state, boolean newState) {
|
||||||
super(state, newState);
|
this.state = new HistoryState(state, newState);
|
||||||
if (newState) {
|
if (newState) {
|
||||||
withTime(now());
|
withTime(now());
|
||||||
}
|
}
|
||||||
@ -192,21 +193,21 @@ public class HistoryState implements Parcelable, Jsonable {
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
public Builder withTime(long time) {
|
public Builder withTime(long time) {
|
||||||
Check.isTrue(!built);
|
Check.isTrue(!built);
|
||||||
this.time = time;
|
state.time = time;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public Builder withComment(@Nullable String comment) {
|
public Builder withComment(@Nullable String comment) {
|
||||||
Check.isTrue(!built);
|
Check.isTrue(!built);
|
||||||
this.comment = comment == null ? "" : comment;
|
state.comment = comment == null ? "" : comment;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public HistoryState build() {
|
public HistoryState build() {
|
||||||
built = true;
|
built = true;
|
||||||
return this;
|
return state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,26 +31,44 @@ import android.support.v7.widget.LinearLayoutManager;
|
|||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.ClipboardManager;
|
import android.text.ClipboardManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.*;
|
import android.view.ContextMenu;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import butterknife.Bind;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import com.melnykov.fab.FloatingActionButton;
|
import com.melnykov.fab.FloatingActionButton;
|
||||||
|
|
||||||
import org.solovyev.android.Check;
|
import org.solovyev.android.Check;
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.BaseFragment;
|
||||||
|
import org.solovyev.android.calculator.CalculatorFragmentType;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.android.views.llm.DividerItemDecoration;
|
import org.solovyev.android.views.llm.DividerItemDecoration;
|
||||||
import org.solovyev.common.math.MathEntity;
|
import org.solovyev.common.math.MathEntity;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import java.util.Collections;
|
||||||
import javax.annotation.Nullable;
|
import java.util.Comparator;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFragment implements CalculatorEventListener {
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFragment {
|
||||||
|
|
||||||
public static final String EXTRA_CATEGORY = "category";
|
public static final String EXTRA_CATEGORY = "category";
|
||||||
|
private static final Comparator<MathEntity> COMPARATOR = new Comparator<MathEntity>() {
|
||||||
|
@Override
|
||||||
|
public int compare(MathEntity l, MathEntity r) {
|
||||||
|
return l.getName().compareTo(r.getName());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Handler uiHandler = new Handler();
|
private final Handler uiHandler = new Handler();
|
||||||
@ -58,7 +76,6 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
|
|||||||
FloatingActionButton fab;
|
FloatingActionButton fab;
|
||||||
@Bind(R.id.entities_recyclerview)
|
@Bind(R.id.entities_recyclerview)
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
@Nullable
|
|
||||||
private EntitiesAdapter adapter;
|
private EntitiesAdapter adapter;
|
||||||
@Nullable
|
@Nullable
|
||||||
private String category;
|
private String category;
|
||||||
@ -132,40 +149,6 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
|
|||||||
@Nullable
|
@Nullable
|
||||||
abstract String getCategory(@Nonnull E e);
|
abstract String getCategory(@Nonnull E e);
|
||||||
|
|
||||||
protected void sort() {
|
|
||||||
/*
|
|
||||||
final EntitiesAdapter localAdapter = adapter;
|
|
||||||
if (localAdapter != null) {
|
|
||||||
localAdapter.sort(new Comparator<E>() {
|
|
||||||
@Override
|
|
||||||
public int compare(E function1, E function2) {
|
|
||||||
return function1.getName().compareTo(function2.getName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
localAdapter.notifyDataSetChanged();
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addToAdapter(@Nonnull E mathEntity) {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
//this.adapter.add(mathEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFromAdapter(@Nonnull E mathEntity) {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
//this.adapter.remove(mathEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void notifyAdapter() {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
this.adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected EntitiesAdapter getAdapter() {
|
protected EntitiesAdapter getAdapter() {
|
||||||
return adapter;
|
return adapter;
|
||||||
}
|
}
|
||||||
@ -175,9 +158,21 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
|
|||||||
return uiHandler;
|
return uiHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@SuppressWarnings("deprecation")
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
protected final void copyDescription(@Nonnull E entity) {
|
||||||
|
final String description = getDescription(entity);
|
||||||
|
if (!Strings.isEmpty(description)) {
|
||||||
|
final ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Activity.CLIPBOARD_SERVICE);
|
||||||
|
clipboard.setText(description);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
protected abstract String getDescription(@NonNull E entity);
|
||||||
|
|
||||||
|
protected abstract void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull E entity, @Nonnull MenuItem.OnMenuItemClickListener listener);
|
||||||
|
|
||||||
|
protected abstract boolean onMenuItemClicked(@Nonnull MenuItem item, @Nonnull E entity);
|
||||||
|
|
||||||
public class EntityViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {
|
public class EntityViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {
|
||||||
@Bind(R.id.entity_text)
|
@Bind(R.id.entity_text)
|
||||||
@ -226,20 +221,6 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
protected final void copyDescription(@Nonnull E entity) {
|
|
||||||
final String description = getDescription(entity);
|
|
||||||
if (!Strings.isEmpty(description)) {
|
|
||||||
final ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Activity.CLIPBOARD_SERVICE);
|
|
||||||
clipboard.setText(description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected abstract String getDescription(@NonNull E entity);
|
|
||||||
protected abstract void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull E entity, @Nonnull MenuItem.OnMenuItemClickListener listener);
|
|
||||||
protected abstract boolean onMenuItemClicked(@Nonnull MenuItem item, @Nonnull E entity);
|
|
||||||
|
|
||||||
public class EntitiesAdapter extends RecyclerView.Adapter<EntityViewHolder> {
|
public class EntitiesAdapter extends RecyclerView.Adapter<EntityViewHolder> {
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final LayoutInflater inflater;
|
private final LayoutInflater inflater;
|
||||||
@ -271,5 +252,22 @@ public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFra
|
|||||||
public E getItem(int position) {
|
public E getItem(int position) {
|
||||||
return list.get(position);
|
return list.get(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void set(int position, @Nonnull E function) {
|
||||||
|
list.set(position, function);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sort() {
|
||||||
|
Collections.sort(list, COMPARATOR);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(@Nonnull E entity) {
|
||||||
|
list.add(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(@Nonnull E function) {
|
||||||
|
list.remove(function);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,16 @@ package org.solovyev.android.calculator.math.edit;
|
|||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import org.solovyev.android.calculator.*;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import org.solovyev.android.calculator.AndroidFunctionCategory;
|
||||||
|
import org.solovyev.android.calculator.BaseActivity;
|
||||||
|
import org.solovyev.android.calculator.CalculatorFragmentType;
|
||||||
|
import org.solovyev.android.calculator.FunctionCategory;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class CalculatorFunctionsActivity extends BaseActivity implements CalculatorEventListener {
|
public class CalculatorFunctionsActivity extends BaseActivity {
|
||||||
|
|
||||||
public CalculatorFunctionsActivity() {
|
public CalculatorFunctionsActivity() {
|
||||||
super(R.layout.main_empty, CalculatorFunctionsActivity.class.getSimpleName());
|
super(R.layout.main_empty, CalculatorFunctionsActivity.class.getSimpleName());
|
||||||
@ -62,13 +66,4 @@ public class CalculatorFunctionsActivity extends BaseActivity implements Calcula
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
|
||||||
switch (calculatorEventType) {
|
|
||||||
case use_function:
|
|
||||||
this.finish();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -26,24 +26,46 @@ import android.os.Bundle;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import jscl.math.function.Function;
|
import android.view.ViewGroup;
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
import org.solovyev.android.calculator.*;
|
import com.squareup.otto.Bus;
|
||||||
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
import org.solovyev.android.calculator.AppComponent;
|
||||||
|
import org.solovyev.android.calculator.Calculator;
|
||||||
|
import org.solovyev.android.calculator.CalculatorFragmentType;
|
||||||
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
|
import org.solovyev.android.calculator.FunctionsRegistry;
|
||||||
|
import org.solovyev.android.calculator.Keyboard;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
|
import org.solovyev.android.calculator.function.CppFunction;
|
||||||
import org.solovyev.android.calculator.function.EditFunctionFragment;
|
import org.solovyev.android.calculator.function.EditFunctionFragment;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import jscl.math.function.Function;
|
||||||
|
import jscl.math.function.IFunction;
|
||||||
|
|
||||||
public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
||||||
|
|
||||||
public static final String EXTRA_FUNCTION = "function";
|
public static final String EXTRA_FUNCTION = "function";
|
||||||
@NonNull
|
@Inject
|
||||||
private final EntitiesRegistry<Function> registry = Locator.getInstance().getEngine().getFunctionsRegistry();
|
FunctionsRegistry registry;
|
||||||
|
@Inject
|
||||||
|
Calculator calculator;
|
||||||
|
@Inject
|
||||||
|
Keyboard keyboard;
|
||||||
|
@Inject
|
||||||
|
Bus bus;
|
||||||
|
|
||||||
public FunctionsFragment() {
|
public FunctionsFragment() {
|
||||||
super(CalculatorFragmentType.functions);
|
super(CalculatorFragmentType.functions);
|
||||||
@ -55,15 +77,28 @@ public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
|||||||
|
|
||||||
final Bundle bundle = getArguments();
|
final Bundle bundle = getArguments();
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
final EditFunctionFragment.Input input = bundle.getParcelable(EXTRA_FUNCTION);
|
final CppFunction function = bundle.getParcelable(EXTRA_FUNCTION);
|
||||||
if (input != null) {
|
if (function != null) {
|
||||||
EditFunctionFragment.showDialog(input, getFragmentManager());
|
EditFunctionFragment.showDialog(function, getFragmentManager());
|
||||||
// in order to stop intent for other tabs
|
// in order to stop intent for other tabs
|
||||||
bundle.remove(EXTRA_FUNCTION);
|
bundle.remove(EXTRA_FUNCTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void inject(@Nonnull AppComponent component) {
|
||||||
|
super.inject(component);
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
final View view = super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
bus.register(this);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
public void onViewCreated(View root, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(root, savedInstanceState);
|
super.onViewCreated(root, savedInstanceState);
|
||||||
@ -73,14 +108,18 @@ public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
|||||||
fab.setOnClickListener(new View.OnClickListener() {
|
fab.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
EditFunctionFragment.showDialog(EditFunctionFragment.Input.newInstance(), getFragmentManager());
|
EditFunctionFragment.showDialog(getActivity());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onClick(@NonNull @Nonnull Function function) {
|
protected void onClick(@Nonnull Function function) {
|
||||||
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_function, function);
|
keyboard.buttonPressed(function.getName());
|
||||||
|
final FragmentActivity activity = getActivity();
|
||||||
|
if (activity instanceof CalculatorFunctionsActivity) {
|
||||||
|
activity.finish();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -102,15 +141,15 @@ public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
|||||||
final FragmentActivity activity = getActivity();
|
final FragmentActivity activity = getActivity();
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.string.c_use:
|
case R.string.c_use:
|
||||||
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_function, function);
|
onClick(function);
|
||||||
return true;
|
return true;
|
||||||
case R.string.c_edit:
|
case R.string.c_edit:
|
||||||
if (function instanceof IFunction) {
|
if (function instanceof IFunction) {
|
||||||
EditFunctionFragment.showDialog(EditFunctionFragment.Input.newFromFunction((IFunction) function), activity.getSupportFragmentManager());
|
EditFunctionFragment.showDialog(CppFunction.builder((IFunction) function).build(), activity.getSupportFragmentManager());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.string.c_remove:
|
case R.string.c_remove:
|
||||||
MathEntityRemover.newFunctionRemover(function, null, activity, activity).showConfirmationDialog();
|
// todo serso:
|
||||||
return true;
|
return true;
|
||||||
case R.string.c_copy_description:
|
case R.string.c_copy_description:
|
||||||
copyDescription(function);
|
copyDescription(function);
|
||||||
@ -131,87 +170,53 @@ public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
public void onDestroyView() {
|
||||||
super.onCalculatorEvent(calculatorEventData, calculatorEventType, data);
|
bus.unregister(this);
|
||||||
|
super.onDestroyView();
|
||||||
|
}
|
||||||
|
|
||||||
switch (calculatorEventType) {
|
@Subscribe
|
||||||
case function_added:
|
public void onFunctionAdded(@NonNull final FunctionsRegistry.AddedEvent event) {
|
||||||
processFunctionAdded((Function) data);
|
if (!isInCategory(event.function)) {
|
||||||
break;
|
return;
|
||||||
|
}
|
||||||
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
|
adapter.add(event.function);
|
||||||
|
adapter.sort();
|
||||||
|
}
|
||||||
|
|
||||||
case function_changed:
|
@Subscribe
|
||||||
processFunctionChanged((Change<IFunction>) data);
|
public void onFunctionChanged(@NonNull final FunctionsRegistry.ChangedEvent event) {
|
||||||
break;
|
if (!isInCategory(event.newFunction)) {
|
||||||
|
return;
|
||||||
case function_removed:
|
}
|
||||||
processFunctionRemoved((Function) data);
|
if (!event.oldFunction.isIdDefined()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
|
if (adapter == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < adapter.getItemCount(); i++) {
|
||||||
|
final Function adapterFunction = adapter.getItem(i);
|
||||||
|
if (adapterFunction.isIdDefined() && event.oldFunction.getId().equals(adapterFunction.getId())) {
|
||||||
|
adapter.set(i, adapterFunction);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
adapter.sort();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onFunctionRemoved(@NonNull final FunctionsRegistry.RemovedEvent event) {
|
||||||
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
|
adapter.remove(event.function);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
protected String getDescription(@NonNull Function function) {
|
protected String getDescription(@NonNull Function function) {
|
||||||
return registry.getDescription(function.getName());
|
return registry.getDescription(function.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void processFunctionRemoved(@Nonnull final Function function) {
|
|
||||||
if (this.isInCategory(function)) {
|
|
||||||
getUiHandler().post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
removeFromAdapter(function);
|
|
||||||
notifyAdapter();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processFunctionChanged(@Nonnull final Change<IFunction> change) {
|
|
||||||
final IFunction newFunction = change.getNewValue();
|
|
||||||
|
|
||||||
if (newFunction instanceof Function) {
|
|
||||||
|
|
||||||
if (this.isInCategory((Function) newFunction)) {
|
|
||||||
|
|
||||||
getUiHandler().post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
IFunction oldValue = change.getOldValue();
|
|
||||||
|
|
||||||
if (oldValue.isIdDefined()) {
|
|
||||||
final EntitiesAdapter adapter = getAdapter();
|
|
||||||
if (adapter != null) {
|
|
||||||
for (int i = 0; i < adapter.getItemCount(); i++) {
|
|
||||||
final Function functionFromAdapter = adapter.getItem(i);
|
|
||||||
if (functionFromAdapter.isIdDefined() && oldValue.getId().equals(functionFromAdapter.getId())) {
|
|
||||||
//adapter.remove(functionFromAdapter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addToAdapter((Function) newFunction);
|
|
||||||
sort();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Function must be instance of jscl.math.function.Function class!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processFunctionAdded(@Nonnull final Function function) {
|
|
||||||
if (this.isInCategory(function)) {
|
|
||||||
getUiHandler().post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
addToAdapter(function);
|
|
||||||
sort();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,6 @@ import org.solovyev.common.math.MathEntity;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import jscl.math.function.Function;
|
|
||||||
import jscl.math.function.IConstant;
|
import jscl.math.function.IConstant;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,13 +94,6 @@ public class MathEntityRemover<T extends MathEntity> implements View.OnClickList
|
|||||||
return new MathEntityRemover<IConstant>(constant, callbackOnCancel, false, Locator.getInstance().getEngine().getVarsRegistry(), context, source, Params.newConstantInstance());
|
return new MathEntityRemover<IConstant>(constant, callbackOnCancel, false, Locator.getInstance().getEngine().getVarsRegistry(), context, source, Params.newConstantInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MathEntityRemover<Function> newFunctionRemover(@Nonnull Function function,
|
|
||||||
@Nullable DialogInterface.OnClickListener callbackOnCancel,
|
|
||||||
@Nonnull Context context,
|
|
||||||
@Nonnull Object source) {
|
|
||||||
return new MathEntityRemover<Function>(function, callbackOnCancel, false, Locator.getInstance().getEngine().getFunctionsRegistry(), context, source, Params.newFunctionInstance());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
*
|
*
|
||||||
@ -169,14 +161,6 @@ public class MathEntityRemover<T extends MathEntity> implements View.OnClickList
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T extends MathEntity> Params newFunctionInstance() {
|
|
||||||
final Params result = new Params();
|
|
||||||
result.removalConfirmationTitleResId = R.string.removal_confirmation;
|
|
||||||
result.removalConfirmationQuestionResId = R.string.function_removal_confirmation_question;
|
|
||||||
result.calculatorEventType = CalculatorEventType.function_removed;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getRemovalConfirmationTitleResId() {
|
public int getRemovalConfirmationTitleResId() {
|
||||||
return removalConfirmationTitleResId;
|
return removalConfirmationTitleResId;
|
||||||
}
|
}
|
||||||
|
@ -26,14 +26,21 @@ import android.support.annotation.NonNull;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import jscl.math.operator.Operator;
|
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.CalculatorEventType;
|
||||||
|
import org.solovyev.android.calculator.CalculatorFragmentType;
|
||||||
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
|
import org.solovyev.android.calculator.Locator;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import jscl.math.operator.Operator;
|
||||||
|
|
||||||
public class OperatorsFragment extends BaseEntitiesFragment<Operator> {
|
public class OperatorsFragment extends BaseEntitiesFragment<Operator> {
|
||||||
|
|
||||||
|
@ -28,20 +28,34 @@ import android.support.v4.app.FragmentActivity;
|
|||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.melnykov.fab.FloatingActionButton;
|
import com.melnykov.fab.FloatingActionButton;
|
||||||
import jscl.math.function.IConstant;
|
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.CalculatorEventData;
|
||||||
|
import org.solovyev.android.calculator.CalculatorEventListener;
|
||||||
|
import org.solovyev.android.calculator.CalculatorEventType;
|
||||||
|
import org.solovyev.android.calculator.CalculatorFragmentType;
|
||||||
|
import org.solovyev.android.calculator.CalculatorParseException;
|
||||||
|
import org.solovyev.android.calculator.Change;
|
||||||
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
|
import org.solovyev.android.calculator.Locator;
|
||||||
|
import org.solovyev.android.calculator.PreparedExpression;
|
||||||
|
import org.solovyev.android.calculator.R;
|
||||||
|
import org.solovyev.android.calculator.ToJsclTextProcessor;
|
||||||
import org.solovyev.android.calculator.math.MathType;
|
import org.solovyev.android.calculator.math.MathType;
|
||||||
import org.solovyev.common.JPredicate;
|
import org.solovyev.common.JPredicate;
|
||||||
import org.solovyev.common.collections.Collections;
|
import org.solovyev.common.collections.Collections;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import jscl.math.function.IConstant;
|
||||||
|
|
||||||
|
public class VarsFragment extends BaseEntitiesFragment<IConstant>implements CalculatorEventListener {
|
||||||
|
|
||||||
public static final String CREATE_VAR_EXTRA_STRING = "create_var";
|
public static final String CREATE_VAR_EXTRA_STRING = "create_var";
|
||||||
@NonNull
|
@NonNull
|
||||||
@ -128,8 +142,6 @@ public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
||||||
super.onCalculatorEvent(calculatorEventData, calculatorEventType, data);
|
|
||||||
|
|
||||||
switch (calculatorEventType) {
|
switch (calculatorEventType) {
|
||||||
case constant_added:
|
case constant_added:
|
||||||
processConstantAdded((IConstant) data);
|
processConstantAdded((IConstant) data);
|
||||||
@ -196,8 +208,9 @@ public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
|||||||
getUiHandler().post(new Runnable() {
|
getUiHandler().post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
removeFromAdapter(constant);
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
notifyAdapter();
|
adapter.remove(constant);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -209,9 +222,10 @@ public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
|||||||
getUiHandler().post(new Runnable() {
|
getUiHandler().post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
removeFromAdapter(change.getOldValue());
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
addToAdapter(newConstant);
|
adapter.remove(change.getOldValue());
|
||||||
sort();
|
adapter.add(newConstant);
|
||||||
|
adapter.sort();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -222,8 +236,9 @@ public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
|||||||
getUiHandler().post(new Runnable() {
|
getUiHandler().post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
addToAdapter(constant);
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
sort();
|
adapter.add(constant);
|
||||||
|
adapter.sort();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user