EntitiesFragment
This commit is contained in:
parent
c0710801cd
commit
b5600114ed
@ -26,19 +26,13 @@ import org.solovyev.common.JBuilder;
|
|||||||
import org.solovyev.common.math.MathEntity;
|
import org.solovyev.common.math.MathEntity;
|
||||||
import org.solovyev.common.math.MathRegistry;
|
import org.solovyev.common.math.MathRegistry;
|
||||||
|
|
||||||
|
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 java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
public abstract class BaseEntitiesRegistry<T extends MathEntity, P extends MathPersistenceEntity> implements EntitiesRegistry<T> {
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 10/30/11
|
|
||||||
* Time: 1:03 AM
|
|
||||||
*/
|
|
||||||
public abstract class AbstractCalculatorMathRegistry<T extends MathEntity, P extends MathPersistenceEntity> implements CalculatorMathRegistry<T> {
|
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final MathRegistry<T> mathRegistry;
|
private final MathRegistry<T> mathRegistry;
|
||||||
@ -49,9 +43,9 @@ public abstract class AbstractCalculatorMathRegistry<T extends MathEntity, P ext
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private final MathEntityDao<P> mathEntityDao;
|
private final MathEntityDao<P> mathEntityDao;
|
||||||
|
|
||||||
protected AbstractCalculatorMathRegistry(@Nonnull MathRegistry<T> mathRegistry,
|
protected BaseEntitiesRegistry(@Nonnull MathRegistry<T> mathRegistry,
|
||||||
@Nonnull String prefix,
|
@Nonnull String prefix,
|
||||||
@Nonnull MathEntityDao<P> mathEntityDao) {
|
@Nonnull MathEntityDao<P> mathEntityDao) {
|
||||||
this.mathRegistry = mathRegistry;
|
this.mathRegistry = mathRegistry;
|
||||||
this.prefix = prefix;
|
this.prefix = prefix;
|
||||||
this.mathEntityDao = mathEntityDao;
|
this.mathEntityDao = mathEntityDao;
|
||||||
@ -63,13 +57,13 @@ public abstract class AbstractCalculatorMathRegistry<T extends MathEntity, P ext
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public String getDescription(@Nonnull String mathEntityName) {
|
public String getDescription(@Nonnull String name) {
|
||||||
final String stringName;
|
final String stringName;
|
||||||
|
|
||||||
final Map<String, String> substitutes = getSubstitutes();
|
final Map<String, String> substitutes = getSubstitutes();
|
||||||
final String substitute = substitutes.get(mathEntityName);
|
final String substitute = substitutes.get(name);
|
||||||
if (substitute == null) {
|
if (substitute == null) {
|
||||||
stringName = prefix + mathEntityName;
|
stringName = prefix + name;
|
||||||
} else {
|
} else {
|
||||||
stringName = prefix + substitute;
|
stringName = prefix + substitute;
|
||||||
}
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.StringRes;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.view.*;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import static android.view.Menu.NONE;
|
||||||
|
|
||||||
|
public abstract class BaseFragment extends Fragment {
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected final FragmentUi ui;
|
||||||
|
|
||||||
|
public BaseFragment(@Nonnull CalculatorFragmentType type) {
|
||||||
|
ui = new FragmentUi(type.getDefaultLayoutId(), type.getDefaultTitleResId(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
inject(((CalculatorApplication) getActivity().getApplication()).getComponent());
|
||||||
|
ui.onCreate(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void inject(@Nonnull AppComponent component) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
return ui.onCreateView(this, inflater, container);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View root, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(root, savedInstanceState);
|
||||||
|
ui.onViewCreated(this, root);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
ui.onResume(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
ui.onPause(this);
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
ui.onDestroyView(this);
|
||||||
|
super.onDestroyView();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
ui.onDestroy(this);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected static MenuItem addMenu(@Nonnull ContextMenu menu, @StringRes int label, @Nonnull MenuItem.OnMenuItemClickListener listener) {
|
||||||
|
return menu.add(NONE, label, NONE, label).setOnMenuItemClickListener(listener);
|
||||||
|
}
|
||||||
|
}
|
@ -41,7 +41,7 @@ import org.solovyev.android.calculator.history.CalculatorHistoryActivity;
|
|||||||
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorOperatorsActivity;
|
import org.solovyev.android.calculator.math.edit.CalculatorOperatorsActivity;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsActivity;
|
import org.solovyev.android.calculator.math.edit.CalculatorVarsActivity;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsFragment;
|
import org.solovyev.android.calculator.math.edit.VarsFragment;
|
||||||
import org.solovyev.android.calculator.math.edit.VarEditDialogFragment;
|
import org.solovyev.android.calculator.math.edit.VarEditDialogFragment;
|
||||||
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;
|
||||||
@ -141,12 +141,12 @@ public final class CalculatorActivityLauncher implements CalculatorEventListener
|
|||||||
if (viewState.valid) {
|
if (viewState.valid) {
|
||||||
final String varValue = viewState.text;
|
final String varValue = viewState.text;
|
||||||
if (!Strings.isEmpty(varValue)) {
|
if (!Strings.isEmpty(varValue)) {
|
||||||
if (CalculatorVarsFragment.isValidValue(varValue)) {
|
if (VarsFragment.isValidValue(varValue)) {
|
||||||
if (context instanceof AppCompatActivity) {
|
if (context instanceof AppCompatActivity) {
|
||||||
VarEditDialogFragment.showDialog(VarEditDialogFragment.Input.newFromValue(varValue), ((AppCompatActivity) context).getSupportFragmentManager());
|
VarEditDialogFragment.showDialog(VarEditDialogFragment.Input.newFromValue(varValue), ((AppCompatActivity) context).getSupportFragmentManager());
|
||||||
} else {
|
} else {
|
||||||
final Intent intent = new Intent(context, CalculatorVarsActivity.class);
|
final Intent intent = new Intent(context, CalculatorVarsActivity.class);
|
||||||
intent.putExtra(CalculatorVarsFragment.CREATE_VAR_EXTRA_STRING, varValue);
|
intent.putExtra(VarsFragment.CREATE_VAR_EXTRA_STRING, varValue);
|
||||||
Activities.addIntentFlags(intent, false, context);
|
Activities.addIntentFlags(intent, false, context);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
@ -39,13 +39,13 @@ public interface CalculatorEngine {
|
|||||||
void softReset();
|
void softReset();
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
CalculatorMathRegistry<IConstant> getVarsRegistry();
|
EntitiesRegistry<IConstant> getVarsRegistry();
|
||||||
@Nonnull
|
@Nonnull
|
||||||
CalculatorMathRegistry<Function> getFunctionsRegistry();
|
EntitiesRegistry<Function> getFunctionsRegistry();
|
||||||
@Nonnull
|
@Nonnull
|
||||||
CalculatorMathRegistry<Operator> getOperatorsRegistry();
|
EntitiesRegistry<Operator> getOperatorsRegistry();
|
||||||
@Nonnull
|
@Nonnull
|
||||||
CalculatorMathRegistry<Operator> getPostfixFunctionsRegistry();
|
EntitiesRegistry<Operator> getPostfixFunctionsRegistry();
|
||||||
@Nonnull
|
@Nonnull
|
||||||
CalculatorMathEngine getMathEngine();
|
CalculatorMathEngine getMathEngine();
|
||||||
@Deprecated
|
@Deprecated
|
||||||
|
@ -22,11 +22,6 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
import java.text.DecimalFormatSymbols;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import jscl.AngleUnit;
|
import jscl.AngleUnit;
|
||||||
import jscl.JsclMathEngine;
|
import jscl.JsclMathEngine;
|
||||||
import jscl.MathEngine;
|
import jscl.MathEngine;
|
||||||
@ -37,6 +32,10 @@ import jscl.math.function.IConstant;
|
|||||||
import jscl.math.operator.Operator;
|
import jscl.math.operator.Operator;
|
||||||
import jscl.text.ParseException;
|
import jscl.text.ParseException;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.text.DecimalFormatSymbols;
|
||||||
|
|
||||||
public class CalculatorEngineImpl implements CalculatorEngine {
|
public class CalculatorEngineImpl implements CalculatorEngine {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -63,16 +62,16 @@ public class CalculatorEngineImpl implements CalculatorEngine {
|
|||||||
private final CalculatorMathEngine mathEngine;
|
private final CalculatorMathEngine mathEngine;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<IConstant> varsRegistry;
|
private final EntitiesRegistry<IConstant> varsRegistry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<Function> functionsRegistry;
|
private final EntitiesRegistry<Function> functionsRegistry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<Operator> operatorsRegistry;
|
private final EntitiesRegistry<Operator> operatorsRegistry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<Operator> postfixFunctionsRegistry;
|
private final EntitiesRegistry<Operator> postfixFunctionsRegistry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Object lock;
|
private final Object lock;
|
||||||
@ -90,10 +89,10 @@ public class CalculatorEngineImpl implements CalculatorEngine {
|
|||||||
private String multiplicationSign = MULTIPLICATION_SIGN_DEFAULT;
|
private String multiplicationSign = MULTIPLICATION_SIGN_DEFAULT;
|
||||||
|
|
||||||
public CalculatorEngineImpl(@Nonnull JsclMathEngine engine,
|
public CalculatorEngineImpl(@Nonnull JsclMathEngine engine,
|
||||||
@Nonnull CalculatorMathRegistry<IConstant> varsRegistry,
|
@Nonnull EntitiesRegistry<IConstant> varsRegistry,
|
||||||
@Nonnull CalculatorMathRegistry<Function> functionsRegistry,
|
@Nonnull EntitiesRegistry<Function> functionsRegistry,
|
||||||
@Nonnull CalculatorMathRegistry<Operator> operatorsRegistry,
|
@Nonnull EntitiesRegistry<Operator> operatorsRegistry,
|
||||||
@Nonnull CalculatorMathRegistry<Operator> postfixFunctionsRegistry,
|
@Nonnull EntitiesRegistry<Operator> postfixFunctionsRegistry,
|
||||||
@Nullable Object lock) {
|
@Nullable Object lock) {
|
||||||
|
|
||||||
this.engine = engine;
|
this.engine = engine;
|
||||||
@ -118,25 +117,25 @@ public class CalculatorEngineImpl implements CalculatorEngine {
|
|||||||
*/
|
*/
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public CalculatorMathRegistry<IConstant> getVarsRegistry() {
|
public EntitiesRegistry<IConstant> getVarsRegistry() {
|
||||||
return this.varsRegistry;
|
return this.varsRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public CalculatorMathRegistry<Function> getFunctionsRegistry() {
|
public EntitiesRegistry<Function> getFunctionsRegistry() {
|
||||||
return this.functionsRegistry;
|
return this.functionsRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public CalculatorMathRegistry<Operator> getOperatorsRegistry() {
|
public EntitiesRegistry<Operator> getOperatorsRegistry() {
|
||||||
return this.operatorsRegistry;
|
return this.operatorsRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public CalculatorMathRegistry<Operator> getPostfixFunctionsRegistry() {
|
public EntitiesRegistry<Operator> getPostfixFunctionsRegistry() {
|
||||||
return this.postfixFunctionsRegistry;
|
return this.postfixFunctionsRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +176,7 @@ public class CalculatorEngineImpl implements CalculatorEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void safeLoadRegistry(@Nonnull CalculatorMathRegistry<?> registry) {
|
private void safeLoadRegistry(@Nonnull EntitiesRegistry<?> registry) {
|
||||||
try {
|
try {
|
||||||
registry.load();
|
registry.load();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -28,9 +28,9 @@ import org.solovyev.android.calculator.about.CalculatorAboutFragment;
|
|||||||
import org.solovyev.android.calculator.about.CalculatorReleaseNotesFragment;
|
import org.solovyev.android.calculator.about.CalculatorReleaseNotesFragment;
|
||||||
import org.solovyev.android.calculator.history.RecentHistoryFragment;
|
import org.solovyev.android.calculator.history.RecentHistoryFragment;
|
||||||
import org.solovyev.android.calculator.history.SavedHistoryFragment;
|
import org.solovyev.android.calculator.history.SavedHistoryFragment;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsFragment;
|
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorOperatorsFragment;
|
import org.solovyev.android.calculator.math.edit.OperatorsFragment;
|
||||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsFragment;
|
import org.solovyev.android.calculator.math.edit.VarsFragment;
|
||||||
import org.solovyev.android.calculator.matrix.CalculatorMatrixEditFragment;
|
import org.solovyev.android.calculator.matrix.CalculatorMatrixEditFragment;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotFragment;
|
import org.solovyev.android.calculator.plot.CalculatorPlotFragment;
|
||||||
import org.solovyev.android.calculator.plot.CalculatorPlotFunctionSettingsActivity;
|
import org.solovyev.android.calculator.plot.CalculatorPlotFunctionSettingsActivity;
|
||||||
@ -52,9 +52,9 @@ public enum CalculatorFragmentType {
|
|||||||
//keyboard(CalculatorHistoryFragment.class, "history", R.layout.fragment_history, R.string.c_history),
|
//keyboard(CalculatorHistoryFragment.class, "history", R.layout.fragment_history, R.string.c_history),
|
||||||
history(RecentHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_recent),
|
history(RecentHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_recent),
|
||||||
saved_history(SavedHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_saved),
|
saved_history(SavedHistoryFragment.class, R.layout.fragment_history, R.string.cpp_history_tab_saved),
|
||||||
variables(CalculatorVarsFragment.class, R.layout.vars_fragment, R.string.c_vars),
|
variables(VarsFragment.class, R.layout.vars_fragment, R.string.c_vars),
|
||||||
functions(CalculatorFunctionsFragment.class, R.layout.math_entities_fragment, R.string.c_functions),
|
functions(FunctionsFragment.class, R.layout.fragment_entities, R.string.c_functions),
|
||||||
operators(CalculatorOperatorsFragment.class, R.layout.math_entities_fragment, R.string.c_operators),
|
operators(OperatorsFragment.class, R.layout.fragment_entities, R.string.c_operators),
|
||||||
plotter(CalculatorPlotFragment.class, R.layout.cpp_plotter_fragment, R.string.c_graph),
|
plotter(CalculatorPlotFragment.class, R.layout.cpp_plotter_fragment, R.string.c_graph),
|
||||||
plotter_functions(CalculatorPlotFunctionsActivity.CalculatorPlotFunctionsFragment.class, R.layout.cpp_plot_functions_fragment, R.string.cpp_plot_functions),
|
plotter_functions(CalculatorPlotFunctionsActivity.CalculatorPlotFunctionsFragment.class, R.layout.cpp_plot_functions_fragment, R.string.cpp_plot_functions),
|
||||||
plotter_function_settings(CalculatorPlotFunctionSettingsActivity.CalculatorPlotFunctionSettingsFragment.class, R.layout.cpp_plot_function_settings_fragment, R.string.cpp_plot_function_settings),
|
plotter_function_settings(CalculatorPlotFunctionSettingsActivity.CalculatorPlotFunctionSettingsFragment.class, R.layout.cpp_plot_function_settings_fragment, R.string.cpp_plot_function_settings),
|
||||||
|
@ -498,7 +498,7 @@ public class CalculatorImpl implements Calculator, CalculatorEventListener {
|
|||||||
if (TextUtils.isEmpty(text)) {
|
if (TextUtils.isEmpty(text)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final CalculatorMathRegistry<IConstant> varsRegistry = Locator.getInstance().getEngine().getVarsRegistry();
|
final EntitiesRegistry<IConstant> varsRegistry = Locator.getInstance().getEngine().getVarsRegistry();
|
||||||
final IConstant ansVar = varsRegistry.get(CalculatorVarsRegistry.ANS);
|
final IConstant ansVar = varsRegistry.get(CalculatorVarsRegistry.ANS);
|
||||||
|
|
||||||
final Var.Builder builder = ansVar != null ? new Var.Builder(ansVar) : new Var.Builder();
|
final Var.Builder builder = ansVar != null ? new Var.Builder(ansVar) : new Var.Builder();
|
||||||
|
@ -37,7 +37,7 @@ import jscl.math.operator.Operator;
|
|||||||
* Date: 11/17/11
|
* Date: 11/17/11
|
||||||
* Time: 11:29 PM
|
* Time: 11:29 PM
|
||||||
*/
|
*/
|
||||||
public class CalculatorOperatorsMathRegistry extends AbstractCalculatorMathRegistry<Operator, MathPersistenceEntity> {
|
public class CalculatorOperatorsMathRegistry extends BaseEntitiesRegistry<Operator, MathPersistenceEntity> {
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
||||||
|
@ -37,7 +37,7 @@ import jscl.math.operator.Operator;
|
|||||||
* Date: 11/19/11
|
* Date: 11/19/11
|
||||||
* Time: 1:48 PM
|
* Time: 1:48 PM
|
||||||
*/
|
*/
|
||||||
public class CalculatorPostfixFunctionsRegistry extends AbstractCalculatorMathRegistry<Operator, MathPersistenceEntity> {
|
public class CalculatorPostfixFunctionsRegistry extends BaseEntitiesRegistry<Operator, MathPersistenceEntity> {
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
||||||
|
@ -42,7 +42,7 @@ import jscl.math.function.IConstant;
|
|||||||
* Date: 9/29/11
|
* Date: 9/29/11
|
||||||
* Time: 4:57 PM
|
* Time: 4:57 PM
|
||||||
*/
|
*/
|
||||||
public class CalculatorVarsRegistry extends AbstractCalculatorMathRegistry<IConstant, Var> {
|
public class CalculatorVarsRegistry extends BaseEntitiesRegistry<IConstant, Var> {
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static final String ANS = "ans";
|
public static final String ANS = "ans";
|
||||||
@ -63,7 +63,7 @@ public class CalculatorVarsRegistry extends AbstractCalculatorMathRegistry<ICons
|
|||||||
super(mathRegistry, "c_var_description_", mathEntityDao);
|
super(mathRegistry, "c_var_description_", mathEntityDao);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends MathEntity> void saveVariable(@Nonnull CalculatorMathRegistry<T> registry,
|
public static <T extends MathEntity> void saveVariable(@Nonnull EntitiesRegistry<T> registry,
|
||||||
@Nonnull MathEntityBuilder<? extends T> builder,
|
@Nonnull MathEntityBuilder<? extends T> builder,
|
||||||
@Nullable T editedInstance,
|
@Nullable T editedInstance,
|
||||||
@Nonnull Object source, boolean save) {
|
@Nonnull Object source, boolean save) {
|
||||||
@ -131,12 +131,12 @@ public class CalculatorVarsRegistry extends AbstractCalculatorMathRegistry<ICons
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription(@Nonnull String mathEntityName) {
|
public String getDescription(@Nonnull String name) {
|
||||||
final IConstant var = get(mathEntityName);
|
final IConstant var = get(name);
|
||||||
if (var != null && !var.isSystem()) {
|
if (var != null && !var.isSystem()) {
|
||||||
return var.getDescription();
|
return var.getDescription();
|
||||||
} else {
|
} else {
|
||||||
return super.getDescription(mathEntityName);
|
return super.getDescription(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,18 +28,13 @@ import org.solovyev.common.math.MathRegistry;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
public interface EntitiesRegistry<E extends MathEntity> extends MathRegistry<E> {
|
||||||
* User: serso
|
|
||||||
* Date: 10/30/11
|
|
||||||
* Time: 1:02 AM
|
|
||||||
*/
|
|
||||||
public interface CalculatorMathRegistry<T extends MathEntity> extends MathRegistry<T> {
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
String getDescription(@Nonnull String mathEntityName);
|
String getDescription(@Nonnull String name);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
String getCategory(@Nonnull T mathEntity);
|
String getCategory(@Nonnull E entity);
|
||||||
|
|
||||||
void load();
|
void load();
|
||||||
|
|
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator;
|
package org.solovyev.android.calculator;
|
||||||
|
|
||||||
|
import jscl.CustomFunctionCalculationException;
|
||||||
|
import jscl.math.function.CustomFunction;
|
||||||
|
import jscl.math.function.Function;
|
||||||
|
import jscl.math.function.IFunction;
|
||||||
import org.solovyev.android.calculator.function.FunctionBuilderAdapter;
|
import org.solovyev.android.calculator.function.FunctionBuilderAdapter;
|
||||||
import org.solovyev.android.calculator.model.AFunction;
|
import org.solovyev.android.calculator.model.AFunction;
|
||||||
import org.solovyev.android.calculator.model.Functions;
|
import org.solovyev.android.calculator.model.Functions;
|
||||||
@ -30,24 +34,13 @@ import org.solovyev.common.JBuilder;
|
|||||||
import org.solovyev.common.math.MathRegistry;
|
import org.solovyev.common.math.MathRegistry;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
public class FunctionsRegistry extends BaseEntitiesRegistry<Function, AFunction> {
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import jscl.CustomFunctionCalculationException;
|
|
||||||
import jscl.math.function.CustomFunction;
|
|
||||||
import jscl.math.function.Function;
|
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 11/17/11
|
|
||||||
* Time: 11:28 PM
|
|
||||||
*/
|
|
||||||
public class CalculatorFunctionsMathRegistry extends AbstractCalculatorMathRegistry<Function, AFunction> {
|
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
private static final Map<String, String> substitutes = new HashMap<String, String>();
|
||||||
@ -58,12 +51,12 @@ public class CalculatorFunctionsMathRegistry extends AbstractCalculatorMathRegis
|
|||||||
substitutes.put("√", "sqrt");
|
substitutes.put("√", "sqrt");
|
||||||
}
|
}
|
||||||
|
|
||||||
public CalculatorFunctionsMathRegistry(@Nonnull MathRegistry<Function> functionsRegistry,
|
public FunctionsRegistry(@Nonnull MathRegistry<Function> functionsRegistry,
|
||||||
@Nonnull MathEntityDao<AFunction> mathEntityDao) {
|
@Nonnull MathEntityDao<AFunction> mathEntityDao) {
|
||||||
super(functionsRegistry, FUNCTION_DESCRIPTION_PREFIX, mathEntityDao);
|
super(functionsRegistry, FUNCTION_DESCRIPTION_PREFIX, mathEntityDao);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveFunction(@Nonnull CalculatorMathRegistry<Function> registry,
|
public static void saveFunction(@Nonnull EntitiesRegistry<Function> registry,
|
||||||
@Nonnull MathEntityBuilder<? extends Function> builder,
|
@Nonnull MathEntityBuilder<? extends Function> builder,
|
||||||
@Nullable IFunction editedInstance,
|
@Nullable IFunction editedInstance,
|
||||||
@Nonnull Object source, boolean save) throws CustomFunctionCalculationException, AFunction.Builder.CreationException {
|
@Nonnull Object source, boolean save) throws CustomFunctionCalculationException, AFunction.Builder.CreationException {
|
||||||
@ -111,8 +104,8 @@ public class CalculatorFunctionsMathRegistry extends AbstractCalculatorMathRegis
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public String getDescription(@Nonnull String functionName) {
|
public String getDescription(@Nonnull String name) {
|
||||||
final Function function = get(functionName);
|
final Function function = get(name);
|
||||||
|
|
||||||
String result = null;
|
String result = null;
|
||||||
if (function instanceof CustomFunction) {
|
if (function instanceof CustomFunction) {
|
||||||
@ -120,7 +113,7 @@ public class CalculatorFunctionsMathRegistry extends AbstractCalculatorMathRegis
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Strings.isEmpty(result)) {
|
if (Strings.isEmpty(result)) {
|
||||||
result = super.getDescription(functionName);
|
result = super.getDescription(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
@ -34,32 +34,22 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.App;
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventData;
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventListener;
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventType;
|
|
||||||
import org.solovyev.android.calculator.CalculatorUtils;
|
|
||||||
import org.solovyev.android.calculator.DisplayState;
|
|
||||||
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.CalculatorFunctionsFragment;
|
|
||||||
import org.solovyev.android.calculator.math.edit.MathEntityRemover;
|
|
||||||
import org.solovyev.android.calculator.model.AFunction;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import jscl.math.Generic;
|
import jscl.math.Generic;
|
||||||
import jscl.math.function.Constant;
|
import jscl.math.function.Constant;
|
||||||
import jscl.math.function.CustomFunction;
|
import jscl.math.function.CustomFunction;
|
||||||
import jscl.math.function.Function;
|
import jscl.math.function.Function;
|
||||||
import jscl.math.function.IFunction;
|
import jscl.math.function.IFunction;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
|
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsActivity;
|
||||||
|
import org.solovyev.android.calculator.math.edit.FunctionsFragment;
|
||||||
|
import org.solovyev.android.calculator.math.edit.MathEntityRemover;
|
||||||
|
import org.solovyev.android.calculator.model.AFunction;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
@ -91,7 +81,7 @@ public class FunctionEditDialogFragment extends DialogFragment implements Calcul
|
|||||||
} else {
|
} else {
|
||||||
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(CalculatorFunctionsFragment.CREATE_FUNCTION_EXTRA, input);
|
intent.putExtra(FunctionsFragment.EXTRA_FUNCTION, input);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,14 +183,6 @@ public class FunctionEditDialogFragment extends DialogFragment implements Calcul
|
|||||||
Locator.getInstance().getCalculator().addCalculatorEventListener(this);
|
Locator.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* STATIC
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
Locator.getInstance().getCalculator().removeCalculatorEventListener(this);
|
Locator.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||||
|
@ -25,8 +25,8 @@ package org.solovyev.android.calculator.function;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.CalculatorFunctionsMathRegistry;
|
import org.solovyev.android.calculator.FunctionsRegistry;
|
||||||
import org.solovyev.android.calculator.CalculatorMathRegistry;
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
import org.solovyev.android.calculator.Locator;
|
import org.solovyev.android.calculator.Locator;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
|
import org.solovyev.android.calculator.math.edit.VarEditorSaver;
|
||||||
@ -59,13 +59,13 @@ public class FunctionEditorSaver implements View.OnClickListener {
|
|||||||
private final View view;
|
private final View view;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<Function> mathRegistry;
|
private final EntitiesRegistry<Function> mathRegistry;
|
||||||
|
|
||||||
|
|
||||||
public FunctionEditorSaver(@Nonnull AFunction.Builder builder,
|
public FunctionEditorSaver(@Nonnull AFunction.Builder builder,
|
||||||
@Nullable IFunction editedInstance,
|
@Nullable IFunction editedInstance,
|
||||||
@Nonnull View view,
|
@Nonnull View view,
|
||||||
@Nonnull CalculatorMathRegistry<Function> registry,
|
@Nonnull EntitiesRegistry<Function> registry,
|
||||||
@Nonnull Object source) {
|
@Nonnull Object source) {
|
||||||
|
|
||||||
this.builder = builder;
|
this.builder = builder;
|
||||||
@ -144,7 +144,7 @@ public class FunctionEditorSaver implements View.OnClickListener {
|
|||||||
Locator.getInstance().getNotifier().showMessage(error, MessageType.error);
|
Locator.getInstance().getNotifier().showMessage(error, MessageType.error);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
CalculatorFunctionsMathRegistry.saveFunction(mathRegistry, new FunctionBuilderAdapter(builder), editedInstance, source, true);
|
FunctionsRegistry.saveFunction(mathRegistry, new FunctionBuilderAdapter(builder), editedInstance, source, true);
|
||||||
} catch (CustomFunctionCalculationException e) {
|
} catch (CustomFunctionCalculationException e) {
|
||||||
Locator.getInstance().getNotifier().showMessage(e);
|
Locator.getInstance().getNotifier().showMessage(e);
|
||||||
} catch (AFunction.Builder.CreationException e) {
|
} catch (AFunction.Builder.CreationException e) {
|
||||||
|
@ -27,8 +27,6 @@ import android.content.Context;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.StringRes;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
@ -53,27 +51,32 @@ import javax.annotation.Nullable;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static android.view.Menu.NONE;
|
|
||||||
import static android.view.View.GONE;
|
import static android.view.View.GONE;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
|
|
||||||
public abstract class BaseHistoryFragment extends Fragment {
|
public abstract class BaseHistoryFragment extends BaseFragment {
|
||||||
private final boolean recentHistory;
|
private final boolean recentHistory;
|
||||||
@Inject
|
@Inject
|
||||||
History history;
|
History history;
|
||||||
@Inject
|
@Inject
|
||||||
|
Editor editor;
|
||||||
|
@Inject
|
||||||
Bus bus;
|
Bus bus;
|
||||||
@Bind(R.id.history_recyclerview)
|
@Bind(R.id.history_recyclerview)
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
@Bind(R.id.history_fab)
|
@Bind(R.id.history_fab)
|
||||||
FloatingActionButton fab;
|
FloatingActionButton fab;
|
||||||
@Nonnull
|
|
||||||
private FragmentUi ui;
|
|
||||||
private HistoryAdapter adapter;
|
private HistoryAdapter adapter;
|
||||||
|
|
||||||
protected BaseHistoryFragment(@Nonnull CalculatorFragmentType type) {
|
protected BaseHistoryFragment(@Nonnull CalculatorFragmentType type) {
|
||||||
|
super(type);
|
||||||
recentHistory = type == CalculatorFragmentType.history;
|
recentHistory = type == CalculatorFragmentType.history;
|
||||||
ui = new FragmentUi(type.getDefaultLayoutId(), type.getDefaultTitleResId(), false);
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void inject(@Nonnull AppComponent component) {
|
||||||
|
super.inject(component);
|
||||||
|
component.inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@ -87,23 +90,16 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void useState(@Nonnull final HistoryState state) {
|
public void useState(@Nonnull final HistoryState state) {
|
||||||
App.getEditor().setState(state.editor);
|
editor.setState(state.editor);
|
||||||
final FragmentActivity activity = getActivity();
|
final FragmentActivity activity = getActivity();
|
||||||
if (!(activity instanceof CalculatorActivity)) {
|
if (!(activity instanceof CalculatorActivity)) {
|
||||||
activity.finish();
|
activity.finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
((CalculatorApplication) getActivity().getApplication()).getComponent().inject(this);
|
|
||||||
ui.onCreate(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
final View view = ui.onCreateView(this, inflater, container);
|
final View view = super.onCreateView(inflater, container, savedInstanceState);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
final Context context = inflater.getContext();
|
final Context context = inflater.getContext();
|
||||||
adapter = new HistoryAdapter(context);
|
adapter = new HistoryAdapter(context);
|
||||||
@ -121,12 +117,6 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
|
||||||
super.onViewCreated(root, savedInstanceState);
|
|
||||||
ui.onViewCreated(this, root);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showClearHistoryDialog() {
|
private void showClearHistoryDialog() {
|
||||||
new AlertDialog.Builder(getActivity(), ui.getTheme().alertDialogTheme)
|
new AlertDialog.Builder(getActivity(), ui.getTheme().alertDialogTheme)
|
||||||
.setTitle(R.string.cpp_clear_history_title)
|
.setTitle(R.string.cpp_clear_history_title)
|
||||||
@ -146,12 +136,6 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
ui.onResume(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
protected final void copyResult(@Nonnull HistoryState state) {
|
protected final void copyResult(@Nonnull HistoryState state) {
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
@ -163,6 +147,12 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
clipboard.setText(displayText);
|
clipboard.setText(displayText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
bus.unregister(adapter);
|
||||||
|
super.onDestroyView();
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
protected final void copyExpression(@Nonnull HistoryState state) {
|
protected final void copyExpression(@Nonnull HistoryState state) {
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
@ -178,25 +168,6 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
return !state.display.valid || !Strings.isEmpty(state.display.text);
|
return !state.display.valid || !Strings.isEmpty(state.display.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
ui.onPause(this);
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroyView() {
|
|
||||||
bus.unregister(adapter);
|
|
||||||
ui.onDestroyView(this);
|
|
||||||
super.onDestroyView();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
ui.onDestroy(this);
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HistoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener, MenuItem.OnMenuItemClickListener {
|
public class HistoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener, MenuItem.OnMenuItemClickListener {
|
||||||
|
|
||||||
private static final int DATETIME_FORMAT = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_ABBREV_TIME;
|
private static final int DATETIME_FORMAT = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_ABBREV_TIME;
|
||||||
@ -234,28 +205,23 @@ public abstract class BaseHistoryFragment extends Fragment {
|
|||||||
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
|
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
|
||||||
Check.isNotNull(state);
|
Check.isNotNull(state);
|
||||||
if (recentHistory) {
|
if (recentHistory) {
|
||||||
addMenu(menu, R.string.c_use);
|
addMenu(menu, R.string.c_use, this);
|
||||||
addMenu(menu, R.string.c_copy_expression);
|
addMenu(menu, R.string.c_copy_expression, this);
|
||||||
if (shouldHaveCopyResult(state)) {
|
if (shouldHaveCopyResult(state)) {
|
||||||
addMenu(menu, R.string.c_copy_result);
|
addMenu(menu, R.string.c_copy_result, this);
|
||||||
}
|
}
|
||||||
addMenu(menu, R.string.c_save);
|
addMenu(menu, R.string.c_save, this);
|
||||||
} else {
|
} else {
|
||||||
addMenu(menu, R.string.c_use);
|
addMenu(menu, R.string.c_use, this);
|
||||||
addMenu(menu, R.string.c_copy_expression);
|
addMenu(menu, R.string.c_copy_expression, this);
|
||||||
if (shouldHaveCopyResult(state)) {
|
if (shouldHaveCopyResult(state)) {
|
||||||
addMenu(menu, R.string.c_copy_result);
|
addMenu(menu, R.string.c_copy_result, this);
|
||||||
}
|
}
|
||||||
addMenu(menu, R.string.c_edit);
|
addMenu(menu, R.string.c_edit, this);
|
||||||
addMenu(menu, R.string.c_remove);
|
addMenu(menu, R.string.c_remove, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private MenuItem addMenu(@Nonnull ContextMenu menu, @StringRes int label) {
|
|
||||||
return menu.add(NONE, label, NONE, label).setOnMenuItemClickListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Check.isNotNull(state);
|
Check.isNotNull(state);
|
||||||
|
@ -1,342 +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.math.edit;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.support.v4.app.ListFragment;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import org.solovyev.android.calculator.*;
|
|
||||||
import org.solovyev.android.menu.AMenuItem;
|
|
||||||
import org.solovyev.android.menu.ContextMenuBuilder;
|
|
||||||
import org.solovyev.android.menu.LabeledMenuItem;
|
|
||||||
import org.solovyev.android.menu.ListContextMenu;
|
|
||||||
import org.solovyev.common.JPredicate;
|
|
||||||
import org.solovyev.common.Objects;
|
|
||||||
import org.solovyev.common.filter.Filter;
|
|
||||||
import org.solovyev.common.math.MathEntity;
|
|
||||||
import org.solovyev.common.text.Strings;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 12/21/11
|
|
||||||
* Time: 9:24 PM
|
|
||||||
*/
|
|
||||||
public abstract class AbstractMathEntityListFragment<T extends MathEntity> extends ListFragment implements CalculatorEventListener {
|
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* CONSTANTS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static final String MATH_ENTITY_CATEGORY_EXTRA_STRING = "org.solovyev.android.calculator.CalculatorVarsActivity_math_entity_category";
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* FIELDS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
@Nonnull
|
|
||||||
private final FragmentUi ui;
|
|
||||||
@Nonnull
|
|
||||||
private final Handler uiHandler = new Handler();
|
|
||||||
@Nullable
|
|
||||||
private MathEntityArrayAdapter<T> adapter;
|
|
||||||
@Nullable
|
|
||||||
private String category;
|
|
||||||
|
|
||||||
protected AbstractMathEntityListFragment(@Nonnull CalculatorFragmentType fragmentType) {
|
|
||||||
ui = new FragmentUi(fragmentType.getDefaultLayoutId(), fragmentType.getDefaultTitleResId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public static Bundle createBundleFor(@Nonnull String categoryId) {
|
|
||||||
final Bundle result = new Bundle(1);
|
|
||||||
putCategory(result, categoryId);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void putCategory(@Nonnull Bundle bundle, @Nonnull String categoryId) {
|
|
||||||
bundle.putString(MATH_ENTITY_CATEGORY_EXTRA_STRING, categoryId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
final Bundle bundle = getArguments();
|
|
||||||
if (bundle != null) {
|
|
||||||
category = bundle.getString(MATH_ENTITY_CATEGORY_EXTRA_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui.onCreate(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
||||||
return ui.onCreateView(this, inflater, container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
|
||||||
super.onViewCreated(root, savedInstanceState);
|
|
||||||
|
|
||||||
ui.onViewCreated(this, root);
|
|
||||||
|
|
||||||
final ListView lv = getListView();
|
|
||||||
lv.setTextFilterEnabled(true);
|
|
||||||
|
|
||||||
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
||||||
public void onItemClick(final AdapterView<?> parent,
|
|
||||||
final View view,
|
|
||||||
final int position,
|
|
||||||
final long id) {
|
|
||||||
final AMenuItem<T> onClick = getOnClickAction();
|
|
||||||
if (onClick != null) {
|
|
||||||
onClick.onClick(((T) parent.getItemAtPosition(position)), getActivity());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
final T item = (T) parent.getItemAtPosition(position);
|
|
||||||
|
|
||||||
final List<LabeledMenuItem<T>> menuItems = getMenuItemsOnLongClick(item);
|
|
||||||
|
|
||||||
if (!menuItems.isEmpty()) {
|
|
||||||
final ContextMenuBuilder<LabeledMenuItem<T>, T> menuBuilder = ContextMenuBuilder.newInstance(AbstractMathEntityListFragment.this.getActivity(), "math-entity-menu", ListContextMenu.newInstance(menuItems));
|
|
||||||
menuBuilder.build(item).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected abstract AMenuItem<T> getOnClickAction();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroyView() {
|
|
||||||
ui.onDestroyView(this);
|
|
||||||
super.onDestroyView();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
ui.onDestroy(this);
|
|
||||||
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
protected abstract List<LabeledMenuItem<T>> getMenuItemsOnLongClick(@Nonnull T item);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
this.ui.onPause(this);
|
|
||||||
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
this.ui.onResume(this);
|
|
||||||
|
|
||||||
adapter = new MathEntityArrayAdapter<T>(getDescriptionGetter(), this.getActivity(), getMathEntitiesByCategory());
|
|
||||||
setListAdapter(adapter);
|
|
||||||
|
|
||||||
sort();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private List<T> getMathEntitiesByCategory() {
|
|
||||||
final List<T> result = getMathEntities();
|
|
||||||
|
|
||||||
new Filter<T>(new JPredicate<T>() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(T t) {
|
|
||||||
return !isInCategory(t);
|
|
||||||
}
|
|
||||||
}).filter(result.iterator());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isInCategory(@Nullable T t) {
|
|
||||||
return t != null && (category == null || Objects.areEqual(getMathEntityCategory(t), category));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
protected abstract MathEntityDescriptionGetter getDescriptionGetter();
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
protected abstract List<T> getMathEntities();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
abstract String getMathEntityCategory(@Nonnull T t);
|
|
||||||
|
|
||||||
protected void sort() {
|
|
||||||
final MathEntityArrayAdapter<T> localAdapter = adapter;
|
|
||||||
if (localAdapter != null) {
|
|
||||||
localAdapter.sort(new Comparator<T>() {
|
|
||||||
@Override
|
|
||||||
public int compare(T function1, T function2) {
|
|
||||||
return function1.getName().compareTo(function2.getName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
localAdapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addToAdapter(@Nonnull T mathEntity) {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
this.adapter.add(mathEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFromAdapter(@Nonnull T mathEntity) {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
this.adapter.remove(mathEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void notifyAdapter() {
|
|
||||||
if (this.adapter != null) {
|
|
||||||
this.adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected MathEntityArrayAdapter<T> getAdapter() {
|
|
||||||
return adapter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
protected Handler getUiHandler() {
|
|
||||||
return uiHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* STATIC
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
protected static interface MathEntityDescriptionGetter {
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
String getDescription(@Nonnull Context context, @Nonnull String mathEntityName);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static class MathEntityArrayAdapter<T extends MathEntity> extends ArrayAdapter<T> {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final MathEntityDescriptionGetter descriptionGetter;
|
|
||||||
|
|
||||||
private MathEntityArrayAdapter(@Nonnull MathEntityDescriptionGetter descriptionGetter,
|
|
||||||
@Nonnull Context context,
|
|
||||||
@Nonnull List<T> objects) {
|
|
||||||
super(context, R.layout.math_entity, R.id.math_entity_text, objects);
|
|
||||||
this.descriptionGetter = descriptionGetter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
|
|
||||||
final ViewGroup result;
|
|
||||||
|
|
||||||
if (convertView == null) {
|
|
||||||
result = (ViewGroup) super.getView(position, convertView, parent);
|
|
||||||
fillView(position, result);
|
|
||||||
} else {
|
|
||||||
result = (ViewGroup) convertView;
|
|
||||||
fillView(position, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fillView(int position, @Nonnull ViewGroup result) {
|
|
||||||
final T mathEntity = getItem(position);
|
|
||||||
|
|
||||||
final TextView text = (TextView) result.findViewById(R.id.math_entity_text);
|
|
||||||
text.setText(String.valueOf(mathEntity));
|
|
||||||
|
|
||||||
final String mathEntityDescription = descriptionGetter.getDescription(getContext(), mathEntity.getName());
|
|
||||||
|
|
||||||
final TextView description = (TextView) result.findViewById(R.id.math_entity_short_description);
|
|
||||||
if (!Strings.isEmpty(mathEntityDescription)) {
|
|
||||||
description.setVisibility(View.VISIBLE);
|
|
||||||
description.setText(mathEntityDescription);
|
|
||||||
} else {
|
|
||||||
description.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static class MathEntityDescriptionGetterImpl implements MathEntityDescriptionGetter {
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private final CalculatorMathRegistry<?> mathRegistry;
|
|
||||||
|
|
||||||
public MathEntityDescriptionGetterImpl(@Nonnull CalculatorMathRegistry<?> mathRegistry) {
|
|
||||||
this.mathRegistry = mathRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription(@Nonnull Context context, @Nonnull String mathEntityName) {
|
|
||||||
return this.mathRegistry.getDescription(mathEntityName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,275 @@
|
|||||||
|
/*
|
||||||
|
* 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.math.edit;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.text.ClipboardManager;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.view.*;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import com.melnykov.fab.FloatingActionButton;
|
||||||
|
import org.solovyev.android.Check;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
|
import org.solovyev.android.views.llm.DividerItemDecoration;
|
||||||
|
import org.solovyev.common.math.MathEntity;
|
||||||
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class BaseEntitiesFragment<E extends MathEntity> extends BaseFragment implements CalculatorEventListener {
|
||||||
|
|
||||||
|
public static final String EXTRA_CATEGORY = "category";
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private final Handler uiHandler = new Handler();
|
||||||
|
@Bind(R.id.entities_fab)
|
||||||
|
FloatingActionButton fab;
|
||||||
|
@Bind(R.id.entities_recyclerview)
|
||||||
|
RecyclerView recyclerView;
|
||||||
|
@Nullable
|
||||||
|
private EntitiesAdapter adapter;
|
||||||
|
@Nullable
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
protected BaseEntitiesFragment(@Nonnull CalculatorFragmentType type) {
|
||||||
|
super(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public static Bundle createBundleFor(@Nonnull String categoryId) {
|
||||||
|
final Bundle result = new Bundle(1);
|
||||||
|
putCategory(result, categoryId);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void putCategory(@Nonnull Bundle bundle, @Nonnull String categoryId) {
|
||||||
|
bundle.putString(EXTRA_CATEGORY, categoryId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
final Bundle bundle = getArguments();
|
||||||
|
if (bundle != null) {
|
||||||
|
category = bundle.getString(EXTRA_CATEGORY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
final View view = ui.onCreateView(this, inflater, container);
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
final Context context = inflater.getContext();
|
||||||
|
adapter = new EntitiesAdapter(context, TextUtils.isEmpty(category) ? getEntities() : getEntities(category));
|
||||||
|
recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
recyclerView.addItemDecoration(new DividerItemDecoration(context, null));
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void onClick(@Nonnull E entity);
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private List<E> getEntities(@NonNull String category) {
|
||||||
|
Check.isNotEmpty(category);
|
||||||
|
final List<E> entities = getEntities();
|
||||||
|
|
||||||
|
final Iterator<E> iterator = entities.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
final E entity = iterator.next();
|
||||||
|
if (!isInCategory(entity, category)) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final boolean isInCategory(@NonNull E entity) {
|
||||||
|
return TextUtils.isEmpty(category) || isInCategory(entity, category);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isInCategory(@NonNull E entity, @NonNull String category) {
|
||||||
|
return TextUtils.equals(getCategory(entity), category);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected abstract List<E> getEntities();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
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() {
|
||||||
|
return adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
protected Handler getUiHandler() {
|
||||||
|
return uiHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EntityViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {
|
||||||
|
@Bind(R.id.entity_text)
|
||||||
|
TextView textView;
|
||||||
|
@Bind(R.id.entity_description)
|
||||||
|
TextView descriptionView;
|
||||||
|
@Nullable
|
||||||
|
private E entity;
|
||||||
|
|
||||||
|
public EntityViewHolder(@Nonnull View view) {
|
||||||
|
super(view);
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
view.setOnClickListener(this);
|
||||||
|
view.setOnCreateContextMenuListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bind(@Nonnull E entity) {
|
||||||
|
this.entity = entity;
|
||||||
|
textView.setText(String.valueOf(entity));
|
||||||
|
|
||||||
|
final String description = getDescription(entity);
|
||||||
|
if (!Strings.isEmpty(description)) {
|
||||||
|
descriptionView.setVisibility(View.VISIBLE);
|
||||||
|
descriptionView.setText(description);
|
||||||
|
} else {
|
||||||
|
descriptionView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Check.isNotNull(entity);
|
||||||
|
BaseEntitiesFragment.this.onClick(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
|
||||||
|
Check.isNotNull(entity);
|
||||||
|
BaseEntitiesFragment.this.onCreateContextMenu(menu, entity, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
Check.isNotNull(entity);
|
||||||
|
return BaseEntitiesFragment.this.onMenuItemClicked(item, entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@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> {
|
||||||
|
@Nonnull
|
||||||
|
private final LayoutInflater inflater;
|
||||||
|
@Nonnull
|
||||||
|
private final List<E> list;
|
||||||
|
|
||||||
|
private EntitiesAdapter(@Nonnull Context context,
|
||||||
|
@Nonnull List<E> list) {
|
||||||
|
this.list = list;
|
||||||
|
this.inflater = LayoutInflater.from(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
return new EntityViewHolder(inflater.inflate(R.layout.fragment_entities_item, parent, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(EntityViewHolder holder, int position) {
|
||||||
|
holder.bind(list.get(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return list.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public E getItem(int position) {
|
||||||
|
return list.get(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,18 +22,9 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator.math.edit;
|
package org.solovyev.android.calculator.math.edit;
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
import org.solovyev.android.calculator.AndroidFunctionCategory;
|
|
||||||
import org.solovyev.android.calculator.BaseActivity;
|
|
||||||
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.FunctionCategory;
|
|
||||||
import org.solovyev.android.calculator.R;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@ -48,14 +39,7 @@ public class CalculatorFunctionsActivity extends BaseActivity implements Calcula
|
|||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
final Bundle bundle;
|
final Bundle bundle = getIntent().getExtras();
|
||||||
|
|
||||||
final Intent intent = getIntent();
|
|
||||||
if (intent != null) {
|
|
||||||
bundle = intent.getExtras();
|
|
||||||
} else {
|
|
||||||
bundle = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final CalculatorFragmentType fragmentType = CalculatorFragmentType.functions;
|
final CalculatorFragmentType fragmentType = CalculatorFragmentType.functions;
|
||||||
|
|
||||||
@ -66,10 +50,10 @@ public class CalculatorFunctionsActivity extends BaseActivity implements Calcula
|
|||||||
final Bundle fragmentParameters;
|
final Bundle fragmentParameters;
|
||||||
|
|
||||||
if (category == FunctionCategory.my && bundle != null) {
|
if (category == FunctionCategory.my && bundle != null) {
|
||||||
AbstractMathEntityListFragment.putCategory(bundle, category.name());
|
BaseEntitiesFragment.putCategory(bundle, category.name());
|
||||||
fragmentParameters = bundle;
|
fragmentParameters = bundle;
|
||||||
} else {
|
} else {
|
||||||
fragmentParameters = AbstractMathEntityListFragment.createBundleFor(category.name());
|
fragmentParameters = BaseEntitiesFragment.createBundleFor(category.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, androidCategory.getCaptionId(), R.id.main_layout);
|
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), fragmentParameters, androidCategory.getCaptionId(), R.id.main_layout);
|
||||||
|
@ -51,7 +51,7 @@ public class CalculatorOperatorsActivity extends BaseActivity implements Calcula
|
|||||||
for (OperatorCategory category : OperatorCategory.getCategoriesByTabOrder()) {
|
for (OperatorCategory category : OperatorCategory.getCategoriesByTabOrder()) {
|
||||||
final AndroidOperatorCategory androidCategory = AndroidOperatorCategory.valueOf(category);
|
final AndroidOperatorCategory androidCategory = AndroidOperatorCategory.valueOf(category);
|
||||||
if (androidCategory != null) {
|
if (androidCategory != null) {
|
||||||
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), AbstractMathEntityListFragment.createBundleFor(category.name()), androidCategory.getCaptionId(), R.id.main_layout);
|
ui.addTab(this, fragmentType.createSubFragmentTag(category.name()), fragmentType.getFragmentClass(), BaseEntitiesFragment.createBundleFor(category.name()), androidCategory.getCaptionId(), R.id.main_layout);
|
||||||
} else {
|
} else {
|
||||||
ui.logError("Unable to find android operator category for " + category);
|
ui.logError("Unable to find android operator category for " + category);
|
||||||
}
|
}
|
||||||
|
@ -1,158 +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.math.edit;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.ClipboardManager;
|
|
||||||
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventType;
|
|
||||||
import org.solovyev.android.calculator.CalculatorFragmentType;
|
|
||||||
import org.solovyev.android.calculator.Locator;
|
|
||||||
import org.solovyev.android.calculator.R;
|
|
||||||
import org.solovyev.android.menu.AMenuItem;
|
|
||||||
import org.solovyev.android.menu.LabeledMenuItem;
|
|
||||||
import org.solovyev.common.text.Strings;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
import jscl.math.operator.Operator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 11/17/11
|
|
||||||
* Time: 1:53 PM
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class CalculatorOperatorsFragment extends AbstractMathEntityListFragment<Operator> {
|
|
||||||
|
|
||||||
public CalculatorOperatorsFragment() {
|
|
||||||
super(CalculatorFragmentType.operators);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AMenuItem<Operator> getOnClickAction() {
|
|
||||||
return LongClickMenuItem.use;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected List<LabeledMenuItem<Operator>> getMenuItemsOnLongClick(@Nonnull Operator item) {
|
|
||||||
final List<LabeledMenuItem<Operator>> result = new ArrayList<LabeledMenuItem<Operator>>(Arrays.asList(LongClickMenuItem.values()));
|
|
||||||
|
|
||||||
if (Strings.isEmpty(OperatorDescriptionGetter.instance.getDescription(this.getActivity(), item.getName()))) {
|
|
||||||
result.remove(LongClickMenuItem.copy_description);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected MathEntityDescriptionGetter getDescriptionGetter() {
|
|
||||||
return OperatorDescriptionGetter.instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected List<Operator> getMathEntities() {
|
|
||||||
final List<Operator> result = new ArrayList<Operator>();
|
|
||||||
|
|
||||||
result.addAll(Locator.getInstance().getEngine().getOperatorsRegistry().getEntities());
|
|
||||||
result.addAll(Locator.getInstance().getEngine().getPostfixFunctionsRegistry().getEntities());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getMathEntityCategory(@Nonnull Operator operator) {
|
|
||||||
String result = Locator.getInstance().getEngine().getOperatorsRegistry().getCategory(operator);
|
|
||||||
if (result == null) {
|
|
||||||
result = Locator.getInstance().getEngine().getPostfixFunctionsRegistry().getCategory(operator);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static enum OperatorDescriptionGetter implements MathEntityDescriptionGetter {
|
|
||||||
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription(@Nonnull Context context, @Nonnull String mathEntityName) {
|
|
||||||
String result = Locator.getInstance().getEngine().getOperatorsRegistry().getDescription(mathEntityName);
|
|
||||||
if (Strings.isEmpty(result)) {
|
|
||||||
result = Locator.getInstance().getEngine().getPostfixFunctionsRegistry().getDescription(mathEntityName);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* STATIC
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static enum LongClickMenuItem implements LabeledMenuItem<Operator> {
|
|
||||||
|
|
||||||
use(R.string.c_use) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Operator data, @Nonnull Context context) {
|
|
||||||
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_operator, data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
copy_description(R.string.c_copy_description) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Operator data, @Nonnull Context context) {
|
|
||||||
final String text = OperatorDescriptionGetter.instance.getDescription(context, data.getName());
|
|
||||||
if (!Strings.isEmpty(text)) {
|
|
||||||
final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE);
|
|
||||||
clipboard.setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private final int captionId;
|
|
||||||
|
|
||||||
LongClickMenuItem(int captionId) {
|
|
||||||
this.captionId = captionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public String getCaption(@Nonnull Context context) {
|
|
||||||
return context.getString(captionId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -63,10 +63,10 @@ public class CalculatorVarsActivity extends BaseActivity implements CalculatorEv
|
|||||||
final Bundle fragmentParameters;
|
final Bundle fragmentParameters;
|
||||||
|
|
||||||
if (category == VarCategory.my && bundle != null) {
|
if (category == VarCategory.my && bundle != null) {
|
||||||
AbstractMathEntityListFragment.putCategory(bundle, category.name());
|
BaseEntitiesFragment.putCategory(bundle, category.name());
|
||||||
fragmentParameters = bundle;
|
fragmentParameters = bundle;
|
||||||
} else {
|
} else {
|
||||||
fragmentParameters = AbstractMathEntityListFragment.createBundleFor(category.name());
|
fragmentParameters = BaseEntitiesFragment.createBundleFor(category.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,49 +22,30 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator.math.edit;
|
package org.solovyev.android.calculator.math.edit;
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.text.ClipboardManager;
|
import android.view.ContextMenu;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ListView;
|
import jscl.math.function.Function;
|
||||||
|
import jscl.math.function.IFunction;
|
||||||
import com.melnykov.fab.FloatingActionButton;
|
import org.solovyev.android.calculator.*;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventData;
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventType;
|
|
||||||
import org.solovyev.android.calculator.CalculatorFragmentType;
|
|
||||||
import org.solovyev.android.calculator.CalculatorMathRegistry;
|
|
||||||
import org.solovyev.android.calculator.Change;
|
|
||||||
import org.solovyev.android.calculator.Locator;
|
|
||||||
import org.solovyev.android.calculator.R;
|
|
||||||
import org.solovyev.android.calculator.function.FunctionEditDialogFragment;
|
import org.solovyev.android.calculator.function.FunctionEditDialogFragment;
|
||||||
import org.solovyev.android.menu.AMenuItem;
|
|
||||||
import org.solovyev.android.menu.LabeledMenuItem;
|
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
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.function.Function;
|
public class FunctionsFragment extends BaseEntitiesFragment<Function> {
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
|
|
||||||
/**
|
public static final String EXTRA_FUNCTION = "function";
|
||||||
* User: serso
|
@NonNull
|
||||||
* Date: 10/29/11
|
private final EntitiesRegistry<Function> registry = Locator.getInstance().getEngine().getFunctionsRegistry();
|
||||||
* Time: 4:55 PM
|
|
||||||
*/
|
|
||||||
public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<Function> {
|
|
||||||
|
|
||||||
public static final String CREATE_FUNCTION_EXTRA = "create_function";
|
public FunctionsFragment() {
|
||||||
|
|
||||||
public CalculatorFunctionsFragment() {
|
|
||||||
super(CalculatorFragmentType.functions);
|
super(CalculatorFragmentType.functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,27 +55,21 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<
|
|||||||
|
|
||||||
final Bundle bundle = getArguments();
|
final Bundle bundle = getArguments();
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
final Parcelable parcelable = bundle.getParcelable(CREATE_FUNCTION_EXTRA);
|
final FunctionEditDialogFragment.Input input = bundle.getParcelable(EXTRA_FUNCTION);
|
||||||
if (parcelable instanceof FunctionEditDialogFragment.Input) {
|
if (input != null) {
|
||||||
FunctionEditDialogFragment.showDialog((FunctionEditDialogFragment.Input) parcelable, getFragmentManager());
|
FunctionEditDialogFragment.showDialog(input, getFragmentManager());
|
||||||
|
|
||||||
// in order to stop intent for other tabs
|
// in order to stop intent for other tabs
|
||||||
bundle.remove(CREATE_FUNCTION_EXTRA);
|
bundle.remove(EXTRA_FUNCTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
public void onViewCreated(View root, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(root, savedInstanceState);
|
super.onViewCreated(root, savedInstanceState);
|
||||||
|
|
||||||
final ListView lv = getListView();
|
|
||||||
final FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.fab);
|
|
||||||
fab.setVisibility(View.VISIBLE);
|
fab.setVisibility(View.VISIBLE);
|
||||||
fab.attachToListView(lv);
|
fab.attachToRecyclerView(recyclerView);
|
||||||
fab.setOnClickListener(new View.OnClickListener() {
|
fab.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@ -104,44 +79,55 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AMenuItem<Function> getOnClickAction() {
|
protected void onClick(@NonNull @Nonnull Function function) {
|
||||||
return LongClickMenuItem.use;
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_function, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
@Override
|
||||||
protected List<LabeledMenuItem<Function>> getMenuItemsOnLongClick(@Nonnull Function item) {
|
protected void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull Function function, @NonNull MenuItem.OnMenuItemClickListener listener) {
|
||||||
List<LabeledMenuItem<Function>> result = new ArrayList<LabeledMenuItem<Function>>(Arrays.asList(LongClickMenuItem.values()));
|
addMenu(menu, R.string.c_use, listener);
|
||||||
|
final EntitiesRegistry<Function> functionsRegistry = registry;
|
||||||
final CalculatorMathRegistry<Function> functionsRegistry = Locator.getInstance().getEngine().getFunctionsRegistry();
|
if (!Strings.isEmpty(functionsRegistry.getDescription(function.getName()))) {
|
||||||
if (Strings.isEmpty(functionsRegistry.getDescription(item.getName()))) {
|
addMenu(menu, R.string.c_copy_description, listener);
|
||||||
result.remove(LongClickMenuItem.copy_description);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final Function function = functionsRegistry.get(item.getName());
|
if (!function.isSystem()) {
|
||||||
if (function == null || function.isSystem()) {
|
addMenu(menu, R.string.c_edit, listener);
|
||||||
result.remove(LongClickMenuItem.edit);
|
addMenu(menu, R.string.c_remove, listener);
|
||||||
result.remove(LongClickMenuItem.remove);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
@Override
|
||||||
|
protected boolean onMenuItemClicked(@Nonnull MenuItem item, @Nonnull Function function) {
|
||||||
|
final FragmentActivity activity = getActivity();
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.string.c_use:
|
||||||
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_function, function);
|
||||||
|
return true;
|
||||||
|
case R.string.c_edit:
|
||||||
|
if (function instanceof IFunction) {
|
||||||
|
FunctionEditDialogFragment.showDialog(FunctionEditDialogFragment.Input.newFromFunction((IFunction) function), activity.getSupportFragmentManager());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case R.string.c_remove:
|
||||||
|
MathEntityRemover.newFunctionRemover(function, null, activity, activity).showConfirmationDialog();
|
||||||
|
return true;
|
||||||
|
case R.string.c_copy_description:
|
||||||
|
copyDescription(function);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected MathEntityDescriptionGetter getDescriptionGetter() {
|
protected List<Function> getEntities() {
|
||||||
return new MathEntityDescriptionGetterImpl(Locator.getInstance().getEngine().getFunctionsRegistry());
|
return new ArrayList<>(registry.getEntities());
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected List<Function> getMathEntities() {
|
|
||||||
return new ArrayList<Function>(Locator.getInstance().getEngine().getFunctionsRegistry().getEntities());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getMathEntityCategory(@Nonnull Function function) {
|
protected String getCategory(@Nonnull Function function) {
|
||||||
return Locator.getInstance().getEngine().getFunctionsRegistry().getCategory(function);
|
return registry.getCategory(function);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -163,6 +149,12 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
protected String getDescription(@NonNull Function function) {
|
||||||
|
return registry.getDescription(function.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void processFunctionRemoved(@Nonnull final Function function) {
|
private void processFunctionRemoved(@Nonnull final Function function) {
|
||||||
if (this.isInCategory(function)) {
|
if (this.isInCategory(function)) {
|
||||||
@ -189,12 +181,12 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<
|
|||||||
IFunction oldValue = change.getOldValue();
|
IFunction oldValue = change.getOldValue();
|
||||||
|
|
||||||
if (oldValue.isIdDefined()) {
|
if (oldValue.isIdDefined()) {
|
||||||
final MathEntityArrayAdapter<Function> adapter = getAdapter();
|
final EntitiesAdapter adapter = getAdapter();
|
||||||
if (adapter != null) {
|
if (adapter != null) {
|
||||||
for (int i = 0; i < adapter.getCount(); i++) {
|
for (int i = 0; i < adapter.getItemCount(); i++) {
|
||||||
final Function functionFromAdapter = adapter.getItem(i);
|
final Function functionFromAdapter = adapter.getItem(i);
|
||||||
if (functionFromAdapter.isIdDefined() && oldValue.getId().equals(functionFromAdapter.getId())) {
|
if (functionFromAdapter.isIdDefined() && oldValue.getId().equals(functionFromAdapter.getId())) {
|
||||||
adapter.remove(functionFromAdapter);
|
//adapter.remove(functionFromAdapter);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,59 +214,4 @@ public class CalculatorFunctionsFragment extends AbstractMathEntityListFragment<
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* STATIC
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static enum LongClickMenuItem implements LabeledMenuItem<Function> {
|
|
||||||
use(R.string.c_use) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Function function, @Nonnull Context context) {
|
|
||||||
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_function, function);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
edit(R.string.c_edit) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Function function, @Nonnull Context context) {
|
|
||||||
if (function instanceof IFunction) {
|
|
||||||
FunctionEditDialogFragment.showDialog(FunctionEditDialogFragment.Input.newFromFunction((IFunction) function), ((ActionBarActivity) context).getSupportFragmentManager());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
remove(R.string.c_remove) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Function function, @Nonnull Context context) {
|
|
||||||
MathEntityRemover.newFunctionRemover(function, null, context, context).showConfirmationDialog();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
copy_description(R.string.c_copy_description) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull Function function, @Nonnull Context context) {
|
|
||||||
final String text = Locator.getInstance().getEngine().getFunctionsRegistry().getDescription(function.getName());
|
|
||||||
if (!Strings.isEmpty(text)) {
|
|
||||||
final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE);
|
|
||||||
clipboard.setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private final int captionId;
|
|
||||||
|
|
||||||
LongClickMenuItem(int captionId) {
|
|
||||||
this.captionId = captionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public String getCaption(@Nonnull Context context) {
|
|
||||||
return context.getString(captionId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ import android.view.View;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.CalculatorEventType;
|
import org.solovyev.android.calculator.CalculatorEventType;
|
||||||
import org.solovyev.android.calculator.CalculatorMathRegistry;
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
import org.solovyev.android.calculator.Locator;
|
import org.solovyev.android.calculator.Locator;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.common.math.MathEntity;
|
import org.solovyev.common.math.MathEntity;
|
||||||
@ -56,7 +56,7 @@ public class MathEntityRemover<T extends MathEntity> implements View.OnClickList
|
|||||||
private final boolean confirmed;
|
private final boolean confirmed;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<? super T> varsRegistry;
|
private final EntitiesRegistry<? super T> varsRegistry;
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Object source;
|
private final Object source;
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@ -75,7 +75,7 @@ public class MathEntityRemover<T extends MathEntity> implements View.OnClickList
|
|||||||
private MathEntityRemover(@Nonnull T mathEntity,
|
private MathEntityRemover(@Nonnull T mathEntity,
|
||||||
@Nullable DialogInterface.OnClickListener callbackOnCancel,
|
@Nullable DialogInterface.OnClickListener callbackOnCancel,
|
||||||
boolean confirmed,
|
boolean confirmed,
|
||||||
@Nonnull CalculatorMathRegistry<? super T> varsRegistry,
|
@Nonnull EntitiesRegistry<? super T> varsRegistry,
|
||||||
@Nonnull Context context,
|
@Nonnull Context context,
|
||||||
@Nonnull Object source,
|
@Nonnull Object source,
|
||||||
@Nonnull Params params) {
|
@Nonnull Params params) {
|
||||||
|
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* 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.math.edit;
|
||||||
|
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import jscl.math.operator.Operator;
|
||||||
|
import org.solovyev.android.calculator.*;
|
||||||
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class OperatorsFragment extends BaseEntitiesFragment<Operator> {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final EntitiesRegistry<Operator> operatorsRegistry = Locator.getInstance().getEngine().getOperatorsRegistry();
|
||||||
|
@NonNull
|
||||||
|
private final EntitiesRegistry<Operator> postfixFunctionsRegistry = Locator.getInstance().getEngine().getPostfixFunctionsRegistry();
|
||||||
|
|
||||||
|
public OperatorsFragment() {
|
||||||
|
super(CalculatorFragmentType.operators);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onClick(@NonNull Operator operator) {
|
||||||
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_operator, operator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
protected List<Operator> getEntities() {
|
||||||
|
final List<Operator> result = new ArrayList<Operator>();
|
||||||
|
|
||||||
|
result.addAll(operatorsRegistry.getEntities());
|
||||||
|
result.addAll(postfixFunctionsRegistry.getEntities());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getCategory(@Nonnull Operator operator) {
|
||||||
|
final String result = operatorsRegistry.getCategory(operator);
|
||||||
|
if (!TextUtils.isEmpty(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return postfixFunctionsRegistry.getCategory(operator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull Operator operator, @Nonnull MenuItem.OnMenuItemClickListener listener) {
|
||||||
|
addMenu(menu, R.string.c_use, listener);
|
||||||
|
if (!Strings.isEmpty(getDescription(operator))) {
|
||||||
|
addMenu(menu, R.string.c_copy_description, listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean onMenuItemClicked(@Nonnull MenuItem item, @Nonnull Operator operator) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.string.c_use:
|
||||||
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_operator, operator);
|
||||||
|
return true;
|
||||||
|
case R.string.c_copy_description:
|
||||||
|
copyDescription(operator);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
protected String getDescription(@NonNull Operator operator) {
|
||||||
|
final String name = operator.getName();
|
||||||
|
final String result = operatorsRegistry.getDescription(name);
|
||||||
|
if (!Strings.isEmpty(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return postfixFunctionsRegistry.getDescription(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -25,7 +25,7 @@ package org.solovyev.android.calculator.math.edit;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import org.solovyev.android.calculator.CalculatorMathRegistry;
|
import org.solovyev.android.calculator.EntitiesRegistry;
|
||||||
import org.solovyev.android.calculator.CalculatorVarsRegistry;
|
import org.solovyev.android.calculator.CalculatorVarsRegistry;
|
||||||
import org.solovyev.android.calculator.Locator;
|
import org.solovyev.android.calculator.Locator;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
@ -57,7 +57,7 @@ public class VarEditorSaver<T extends MathEntity> implements View.OnClickListene
|
|||||||
private final T editedInstance;
|
private final T editedInstance;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final CalculatorMathRegistry<T> mathRegistry;
|
private final EntitiesRegistry<T> mathRegistry;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Object source;
|
private final Object source;
|
||||||
@ -68,7 +68,7 @@ public class VarEditorSaver<T extends MathEntity> implements View.OnClickListene
|
|||||||
public VarEditorSaver(@Nonnull MathEntityBuilder<? extends T> varBuilder,
|
public VarEditorSaver(@Nonnull MathEntityBuilder<? extends T> varBuilder,
|
||||||
@Nullable T editedInstance,
|
@Nullable T editedInstance,
|
||||||
@Nonnull View editView,
|
@Nonnull View editView,
|
||||||
@Nonnull CalculatorMathRegistry<T> mathRegistry,
|
@Nonnull EntitiesRegistry<T> mathRegistry,
|
||||||
@Nonnull Object source) {
|
@Nonnull Object source) {
|
||||||
this.varBuilder = varBuilder;
|
this.varBuilder = varBuilder;
|
||||||
this.editedInstance = editedInstance;
|
this.editedInstance = editedInstance;
|
||||||
@ -130,7 +130,7 @@ public class VarEditorSaver<T extends MathEntity> implements View.OnClickListene
|
|||||||
error = null;
|
error = null;
|
||||||
} else {
|
} else {
|
||||||
// value is not empty => must be a number
|
// value is not empty => must be a number
|
||||||
boolean valid = CalculatorVarsFragment.isValidValue(value);
|
boolean valid = VarsFragment.isValidValue(value);
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
varBuilder.setName(name);
|
varBuilder.setName(name);
|
||||||
|
@ -22,49 +22,32 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator.math.edit;
|
package org.solovyev.android.calculator.math.edit;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
import com.melnykov.fab.FloatingActionButton;
|
import com.melnykov.fab.FloatingActionButton;
|
||||||
|
import jscl.math.function.IConstant;
|
||||||
import org.solovyev.android.calculator.CalculatorEventData;
|
import org.solovyev.android.calculator.*;
|
||||||
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.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.android.menu.AMenuItem;
|
|
||||||
import org.solovyev.android.menu.LabeledMenuItem;
|
|
||||||
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 java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
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.function.IConstant;
|
public class VarsFragment extends BaseEntitiesFragment<IConstant> {
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 9/28/11
|
|
||||||
* Time: 10:55 PM
|
|
||||||
*/
|
|
||||||
public class CalculatorVarsFragment extends AbstractMathEntityListFragment<IConstant> {
|
|
||||||
|
|
||||||
public static final String CREATE_VAR_EXTRA_STRING = "create_var";
|
public static final String CREATE_VAR_EXTRA_STRING = "create_var";
|
||||||
|
@NonNull
|
||||||
|
private final EntitiesRegistry<IConstant> registry = Locator.getInstance().getEngine().getVarsRegistry();
|
||||||
|
|
||||||
public CalculatorVarsFragment() {
|
public VarsFragment() {
|
||||||
super(CalculatorFragmentType.variables);
|
super(CalculatorFragmentType.variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,10 +85,9 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
public void onViewCreated(View root, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(root, savedInstanceState);
|
super.onViewCreated(root, savedInstanceState);
|
||||||
|
|
||||||
final ListView lv = getListView();
|
|
||||||
final FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.fab);
|
final FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.fab);
|
||||||
fab.setVisibility(View.VISIBLE);
|
fab.setVisibility(View.VISIBLE);
|
||||||
fab.attachToListView(lv);
|
fab.attachToRecyclerView(recyclerView);
|
||||||
fab.setOnClickListener(new View.OnClickListener() {
|
fab.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@ -115,35 +97,8 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AMenuItem<IConstant> getOnClickAction() {
|
protected void onClick(@NonNull IConstant constant) {
|
||||||
return LongClickMenuItem.use;
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_constant, constant);
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected List<LabeledMenuItem<IConstant>> getMenuItemsOnLongClick(@Nonnull IConstant item) {
|
|
||||||
final List<LabeledMenuItem<IConstant>> result = new ArrayList<LabeledMenuItem<IConstant>>(Arrays.asList(LongClickMenuItem.values()));
|
|
||||||
|
|
||||||
if (item.isSystem()) {
|
|
||||||
result.remove(LongClickMenuItem.edit);
|
|
||||||
result.remove(LongClickMenuItem.remove);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Strings.isEmpty(Locator.getInstance().getEngine().getVarsRegistry().getDescription(item.getName()))) {
|
|
||||||
result.remove(LongClickMenuItem.copy_description);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Strings.isEmpty(item.getValue())) {
|
|
||||||
result.remove(LongClickMenuItem.copy_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
protected MathEntityDescriptionGetter getDescriptionGetter() {
|
|
||||||
return new MathEntityDescriptionGetterImpl(Locator.getInstance().getEngine().getVarsRegistry());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"UnusedDeclaration"})
|
@SuppressWarnings({"UnusedDeclaration"})
|
||||||
@ -153,8 +108,8 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected List<IConstant> getMathEntities() {
|
protected List<IConstant> getEntities() {
|
||||||
final List<IConstant> result = new ArrayList<IConstant>(Locator.getInstance().getEngine().getVarsRegistry().getEntities());
|
final List<IConstant> result = new ArrayList<IConstant>(registry.getEntities());
|
||||||
|
|
||||||
Collections.removeAll(result, new JPredicate<IConstant>() {
|
Collections.removeAll(result, new JPredicate<IConstant>() {
|
||||||
@Override
|
@Override
|
||||||
@ -167,8 +122,8 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getMathEntityCategory(@Nonnull IConstant var) {
|
protected String getCategory(@Nonnull IConstant var) {
|
||||||
return Locator.getInstance().getEngine().getVarsRegistry().getCategory(var);
|
return registry.getCategory(var);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -190,6 +145,52 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreateContextMenu(@Nonnull ContextMenu menu, @Nonnull IConstant constant, @Nonnull MenuItem.OnMenuItemClickListener listener) {
|
||||||
|
addMenu(menu, R.string.c_use, listener);
|
||||||
|
if (!constant.isSystem()) {
|
||||||
|
addMenu(menu, R.string.c_edit, listener);
|
||||||
|
addMenu(menu, R.string.c_remove, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Strings.isEmpty(constant.getValue())) {
|
||||||
|
addMenu(menu, R.string.c_copy_value, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Strings.isEmpty(registry.getDescription(constant.getName()))) {
|
||||||
|
addMenu(menu, R.string.c_copy_description, listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean onMenuItemClicked(@Nonnull MenuItem item, @Nonnull IConstant constant) {
|
||||||
|
FragmentActivity activity = getActivity();
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.string.c_use:
|
||||||
|
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_constant, constant);
|
||||||
|
return true;
|
||||||
|
case R.string.c_edit:
|
||||||
|
VarEditDialogFragment.showDialog(VarEditDialogFragment.Input.newFromConstant(constant), activity.getSupportFragmentManager());
|
||||||
|
return true;
|
||||||
|
case R.string.c_remove:
|
||||||
|
MathEntityRemover.newConstantRemover(constant, null, activity, activity).showConfirmationDialog();
|
||||||
|
return true;
|
||||||
|
case R.string.c_copy_value:
|
||||||
|
final String value = constant.getValue();
|
||||||
|
if (!Strings.isEmpty(value)) {
|
||||||
|
Locator.getInstance().getClipboard().setText(value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case R.string.c_copy_description:
|
||||||
|
final String description = registry.getDescription(constant.getName());
|
||||||
|
if (!Strings.isEmpty(description)) {
|
||||||
|
Locator.getInstance().getClipboard().setText(description);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private void processConstantRemoved(@Nonnull final IConstant constant) {
|
private void processConstantRemoved(@Nonnull final IConstant constant) {
|
||||||
if (this.isInCategory(constant)) {
|
if (this.isInCategory(constant)) {
|
||||||
getUiHandler().post(new Runnable() {
|
getUiHandler().post(new Runnable() {
|
||||||
@ -228,67 +229,10 @@ public class CalculatorVarsFragment extends AbstractMathEntityListFragment<ICons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
@Nullable
|
||||||
**********************************************************************
|
@Override
|
||||||
*
|
protected String getDescription(@NonNull IConstant constant) {
|
||||||
* STATIC
|
return registry.getDescription(constant.getName());
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static enum LongClickMenuItem implements LabeledMenuItem<IConstant> {
|
|
||||||
use(R.string.c_use) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull IConstant data, @Nonnull Context context) {
|
|
||||||
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_constant, data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
edit(R.string.c_edit) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull IConstant constant, @Nonnull Context context) {
|
|
||||||
VarEditDialogFragment.showDialog(VarEditDialogFragment.Input.newFromConstant(constant), ((ActionBarActivity) context).getSupportFragmentManager());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
remove(R.string.c_remove) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull IConstant constant, @Nonnull Context context) {
|
|
||||||
MathEntityRemover.newConstantRemover(constant, null, context, context).showConfirmationDialog();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
copy_value(R.string.c_copy_value) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull IConstant data, @Nonnull Context context) {
|
|
||||||
final String text = data.getValue();
|
|
||||||
if (!Strings.isEmpty(text)) {
|
|
||||||
if (text == null) throw new AssertionError();
|
|
||||||
Locator.getInstance().getClipboard().setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
copy_description(R.string.c_copy_description) {
|
|
||||||
@Override
|
|
||||||
public void onClick(@Nonnull IConstant data, @Nonnull Context context) {
|
|
||||||
final String text = Locator.getInstance().getEngine().getVarsRegistry().getDescription(data.getName());
|
|
||||||
if (!Strings.isEmpty(text)) {
|
|
||||||
if (text == null) throw new AssertionError();
|
|
||||||
Locator.getInstance().getClipboard().setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private final int captionId;
|
|
||||||
|
|
||||||
LongClickMenuItem(int captionId) {
|
|
||||||
this.captionId = captionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public String getCaption(@Nonnull Context context) {
|
|
||||||
return context.getString(captionId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
package org.solovyev.android.calculator.model;
|
package org.solovyev.android.calculator.model;
|
||||||
|
|
||||||
|
import jscl.math.function.IFunction;
|
||||||
import org.simpleframework.xml.Element;
|
import org.simpleframework.xml.Element;
|
||||||
import org.simpleframework.xml.ElementList;
|
import org.simpleframework.xml.ElementList;
|
||||||
import org.simpleframework.xml.Root;
|
import org.simpleframework.xml.Root;
|
||||||
@ -34,33 +35,17 @@ import org.solovyev.common.msg.Message;
|
|||||||
import org.solovyev.common.msg.MessageLevel;
|
import org.solovyev.common.msg.MessageLevel;
|
||||||
import org.solovyev.common.text.Strings;
|
import org.solovyev.common.text.Strings;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
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.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import jscl.math.function.IFunction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 12/22/11
|
|
||||||
* Time: 5:25 PM
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Root(name = "function")
|
@Root(name = "function")
|
||||||
public class AFunction implements IFunction, MathPersistenceEntity, Serializable {
|
public class AFunction implements IFunction, MathPersistenceEntity, Serializable {
|
||||||
|
|
||||||
/*
|
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* FIELDS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
@Transient
|
@Transient
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
@ -83,15 +68,7 @@ public class AFunction implements IFunction, MathPersistenceEntity, Serializable
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private String description = "";
|
private String description = "";
|
||||||
|
|
||||||
/*
|
public AFunction() {
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* CONSTRUCTORS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
public AFunction() {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public AFunction(Integer id) {
|
public AFunction(Integer id) {
|
||||||
@ -106,15 +83,7 @@ public class AFunction implements IFunction, MathPersistenceEntity, Serializable
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
private static void copy(@Nonnull AFunction target,
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* METHODS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static void copy(@Nonnull AFunction target,
|
|
||||||
@Nonnull IFunction source) {
|
@Nonnull IFunction source) {
|
||||||
target.name = source.getName();
|
target.name = source.getName();
|
||||||
target.content = source.getContent();
|
target.content = source.getContent();
|
||||||
@ -123,7 +92,7 @@ public class AFunction implements IFunction, MathPersistenceEntity, Serializable
|
|||||||
if (source.isIdDefined()) {
|
if (source.isIdDefined()) {
|
||||||
target.id = source.getId();
|
target.id = source.getId();
|
||||||
}
|
}
|
||||||
target.parameterNames = new ArrayList<String>(source.getParameterNames());
|
target.parameterNames = new ArrayList<>(source.getParameterNames());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -149,15 +118,7 @@ public class AFunction implements IFunction, MathPersistenceEntity, Serializable
|
|||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
@Nonnull
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* GETTERS/SETTERS
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@ -211,15 +172,7 @@ public class AFunction implements IFunction, MathPersistenceEntity, Serializable
|
|||||||
this.parameterNames = parameterNames;
|
this.parameterNames = parameterNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
public static class Builder implements MathEntityBuilder<AFunction> {
|
||||||
**********************************************************************
|
|
||||||
*
|
|
||||||
* STATIC
|
|
||||||
*
|
|
||||||
**********************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static class Builder implements MathEntityBuilder<AFunction> {
|
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private String name;
|
private String name;
|
||||||
|
@ -91,7 +91,7 @@ public class AndroidCalculatorEngine implements CalculatorEngine, SharedPreferen
|
|||||||
final JsclMathEngine engine = JsclMathEngine.getInstance();
|
final JsclMathEngine engine = JsclMathEngine.getInstance();
|
||||||
this.calculatorEngine = new CalculatorEngineImpl(engine,
|
this.calculatorEngine = new CalculatorEngineImpl(engine,
|
||||||
new CalculatorVarsRegistry(engine.getConstantsRegistry(), new AndroidMathEntityDao<Var>("org.solovyev.android.calculator.CalculatorModel_vars", application, Vars.class)),
|
new CalculatorVarsRegistry(engine.getConstantsRegistry(), new AndroidMathEntityDao<Var>("org.solovyev.android.calculator.CalculatorModel_vars", application, Vars.class)),
|
||||||
new CalculatorFunctionsMathRegistry(engine.getFunctionsRegistry(), new AndroidMathEntityDao<AFunction>("org.solovyev.android.calculator.CalculatorModel_functions", application, Functions.class)),
|
new FunctionsRegistry(engine.getFunctionsRegistry(), new AndroidMathEntityDao<AFunction>("org.solovyev.android.calculator.CalculatorModel_functions", application, Functions.class)),
|
||||||
new CalculatorOperatorsMathRegistry(engine.getOperatorsRegistry(), new AndroidMathEntityDao<MathPersistenceEntity>(null, application, null)),
|
new CalculatorOperatorsMathRegistry(engine.getOperatorsRegistry(), new AndroidMathEntityDao<MathPersistenceEntity>(null, application, null)),
|
||||||
new CalculatorPostfixFunctionsRegistry(engine.getPostfixFunctionsRegistry(), new AndroidMathEntityDao<MathPersistenceEntity>(null, application, null)),
|
new CalculatorPostfixFunctionsRegistry(engine.getPostfixFunctionsRegistry(), new AndroidMathEntityDao<MathPersistenceEntity>(null, application, null)),
|
||||||
this.lock);
|
this.lock);
|
||||||
@ -109,25 +109,25 @@ public class AndroidCalculatorEngine implements CalculatorEngine, SharedPreferen
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public CalculatorMathRegistry<IConstant> getVarsRegistry() {
|
public EntitiesRegistry<IConstant> getVarsRegistry() {
|
||||||
return calculatorEngine.getVarsRegistry();
|
return calculatorEngine.getVarsRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public CalculatorMathRegistry<Function> getFunctionsRegistry() {
|
public EntitiesRegistry<Function> getFunctionsRegistry() {
|
||||||
return calculatorEngine.getFunctionsRegistry();
|
return calculatorEngine.getFunctionsRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public CalculatorMathRegistry<Operator> getOperatorsRegistry() {
|
public EntitiesRegistry<Operator> getOperatorsRegistry() {
|
||||||
return calculatorEngine.getOperatorsRegistry();
|
return calculatorEngine.getOperatorsRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public CalculatorMathRegistry<Operator> getPostfixFunctionsRegistry() {
|
public EntitiesRegistry<Operator> getPostfixFunctionsRegistry() {
|
||||||
return calculatorEngine.getPostfixFunctionsRegistry();
|
return calculatorEngine.getPostfixFunctionsRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,10 +41,13 @@
|
|||||||
a:layout_width="match_parent"
|
a:layout_width="match_parent"
|
||||||
a:layout_height="match_parent">
|
a:layout_height="match_parent">
|
||||||
|
|
||||||
<ListView style="@style/CppListView" />
|
<android.support.v7.widget.RecyclerView
|
||||||
|
a:id="@+id/entities_recyclerview"
|
||||||
|
a:layout_width="match_parent"
|
||||||
|
a:layout_height="match_parent" />
|
||||||
|
|
||||||
<com.melnykov.fab.FloatingActionButton
|
<com.melnykov.fab.FloatingActionButton
|
||||||
a:id="@+id/fab"
|
a:id="@+id/entities_fab"
|
||||||
style="@style/CppFab"
|
style="@style/CppFab"
|
||||||
a:src="@drawable/ic_add_white_36dp"
|
a:src="@drawable/ic_add_white_36dp"
|
||||||
a:visibility="gone" />
|
a:visibility="gone" />
|
@ -24,20 +24,18 @@
|
|||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:a="http://schemas.android.com/apk/res/android"
|
xmlns:a="http://schemas.android.com/apk/res/android"
|
||||||
style="@style/CppListItem"
|
style="@style/CppListItem.TwoLines"
|
||||||
a:layout_width="match_parent"
|
|
||||||
a:layout_height="wrap_content"
|
|
||||||
a:orientation="vertical">
|
a:orientation="vertical">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
a:id="@+id/math_entity_text"
|
a:id="@+id/entity_text"
|
||||||
style="@style/CppListItemText.Primary"
|
style="@style/CppListItemText.Primary"
|
||||||
a:layout_width="match_parent"
|
a:layout_width="match_parent"
|
||||||
a:layout_height="wrap_content" />
|
a:layout_height="wrap_content" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
a:id="@+id/math_entity_short_description"
|
a:id="@+id/entity_description"
|
||||||
style="@style/CppListViewItemTextSecondary"
|
style="@style/CppListItemText.Secondary"
|
||||||
a:layout_width="match_parent"
|
a:layout_width="match_parent"
|
||||||
a:layout_height="wrap_content" />
|
a:layout_height="wrap_content" />
|
||||||
|
|
@ -93,7 +93,7 @@ public class CalculatorTestUtils {
|
|||||||
final JsclMathEngine jsclEngine = JsclMathEngine.getInstance();
|
final JsclMathEngine jsclEngine = JsclMathEngine.getInstance();
|
||||||
|
|
||||||
final CalculatorVarsRegistry varsRegistry = new CalculatorVarsRegistry(jsclEngine.getConstantsRegistry(), mathEntityDao);
|
final CalculatorVarsRegistry varsRegistry = new CalculatorVarsRegistry(jsclEngine.getConstantsRegistry(), mathEntityDao);
|
||||||
final CalculatorFunctionsMathRegistry functionsRegistry = new CalculatorFunctionsMathRegistry(jsclEngine.getFunctionsRegistry(), mathEntityDao);
|
final FunctionsRegistry functionsRegistry = new FunctionsRegistry(jsclEngine.getFunctionsRegistry(), mathEntityDao);
|
||||||
final CalculatorOperatorsMathRegistry operatorsRegistry = new CalculatorOperatorsMathRegistry(jsclEngine.getOperatorsRegistry(), mathEntityDao);
|
final CalculatorOperatorsMathRegistry operatorsRegistry = new CalculatorOperatorsMathRegistry(jsclEngine.getOperatorsRegistry(), mathEntityDao);
|
||||||
final CalculatorPostfixFunctionsRegistry postfixFunctionsRegistry = new CalculatorPostfixFunctionsRegistry(jsclEngine.getPostfixFunctionsRegistry(), mathEntityDao);
|
final CalculatorPostfixFunctionsRegistry postfixFunctionsRegistry = new CalculatorPostfixFunctionsRegistry(jsclEngine.getPostfixFunctionsRegistry(), mathEntityDao);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user