Plotter
This commit is contained in:
parent
043576f5e8
commit
e946b1547c
@ -1,6 +1,13 @@
|
||||
package org.solovyev.android.calculator;
|
||||
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.function.Constant;
|
||||
import jscl.math.function.IConstant;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.solovyev.android.calculator.jscl.JsclOperation;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
@ -19,4 +26,30 @@ public final class CalculatorUtils {
|
||||
public static CalculatorEventData createFirstEventDataId() {
|
||||
return CalculatorEventDataImpl.newInstance(FIRST_ID, FIRST_ID);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Set<Constant> getNotSystemConstants(@NotNull Generic expression) {
|
||||
final Set<Constant> notSystemConstants = new HashSet<Constant>();
|
||||
|
||||
for (Constant constant : expression.getConstants()) {
|
||||
IConstant var = CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().get(constant.getName());
|
||||
if (var != null && !var.isSystem() && !var.isDefined()) {
|
||||
notSystemConstants.add(constant);
|
||||
}
|
||||
}
|
||||
|
||||
return notSystemConstants;
|
||||
}
|
||||
|
||||
public static boolean isPlotPossible(@NotNull Generic expression, @NotNull JsclOperation operation) {
|
||||
boolean result = false;
|
||||
|
||||
if (operation == JsclOperation.simplify) {
|
||||
if (getNotSystemConstants(expression).size() == 1) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -41,14 +41,8 @@
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/c_functions" android:name=".math.edit.CalculatorFunctionsFragmentActivity"/>
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/c_functions" android:name=".math.edit.CalculatorFunctionsFragment"/>
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/c_operators" android:name=".math.edit.CalculatorOperatorsFragment"/>
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/c_vars_and_constants" android:name=".math.edit.CalculatorVarsFragmentActivity"/>
|
||||
|
||||
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/c_vars_and_constants" android:name=".math.edit.CalculatorVarsFragment"/>
|
||||
|
||||
<activity android:label="@string/c_plot_graph" android:name=".plot.CalculatorPlotActivity"/>
|
||||
|
||||
<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:name="com.google.ads.AdActivity"/>
|
||||
|
16
calculatorpp/res/layout-large-land/calc_display.xml
Normal file
16
calculatorpp/res/layout-large-land/calc_display.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
~ Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
||||
~ For more information, please, contact se.solovyev@gmail.com
|
||||
~ or visit http://se.solovyev.org
|
||||
-->
|
||||
|
||||
<org.solovyev.android.calculator.AndroidCalculatorDisplayView
|
||||
xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:id="@+id/calculatorDisplay"
|
||||
style="@style/display_style"
|
||||
a:inputType="textMultiLine"
|
||||
a:maxLines="3"
|
||||
a:scrollHorizontally="false"
|
||||
a:scrollbars="none"/>
|
28
calculatorpp/res/layout-large-land/calc_editor.xml
Normal file
28
calculatorpp/res/layout-large-land/calc_editor.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
~ Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
||||
~ For more information, please, contact se.solovyev@gmail.com
|
||||
~ or visit http://se.solovyev.org
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
a:layout_height="match_parent">
|
||||
|
||||
<TextView a:id="@+id/fragmentTitle"
|
||||
a:layout_height="wrap_content"
|
||||
a:layout_width="match_parent"
|
||||
style="?fragmentTitleStyle"/>
|
||||
|
||||
<org.solovyev.android.calculator.AndroidCalculatorEditorView
|
||||
a:id="@+id/calculatorEditor"
|
||||
style="@style/editor_style"
|
||||
a:textIsSelectable="true"
|
||||
a:singleLine="false"
|
||||
a:scrollbars="vertical"
|
||||
a:hint ="@string/c_calc_editor_hint"/>
|
||||
|
||||
</LinearLayout>
|
@ -10,6 +10,7 @@
|
||||
xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:id="@+id/calculatorDisplay"
|
||||
style="@style/display_style"
|
||||
a:padding="@dimen/editor_padding"
|
||||
a:inputType="textMultiLine"
|
||||
a:maxLines="3"
|
||||
a:scrollHorizontally="false"
|
||||
|
@ -7,15 +7,18 @@
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:layout_width="match_parent"
|
||||
a:layout_height="wrap_content">
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
a:layout_height="match_parent"
|
||||
a:padding="@dimen/editor_padding">
|
||||
|
||||
<org.solovyev.android.calculator.AndroidCalculatorEditorView
|
||||
a:id="@+id/calculatorEditor"
|
||||
style="@style/editor_style"
|
||||
<org.solovyev.android.calculator.AndroidCalculatorEditorView
|
||||
a:id="@+id/calculatorEditor"
|
||||
style="@style/editor_style"
|
||||
a:textIsSelectable="true"
|
||||
a:singleLine="false"
|
||||
a:scrollbars="vertical"
|
||||
a:hint ="@string/c_calc_editor_hint"/>
|
||||
a:singleLine="false"
|
||||
a:scrollbars="vertical"
|
||||
a:hint="@string/c_calc_editor_hint"/>
|
||||
|
||||
</LinearLayout>
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:orientation="vertical"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:orientation="vertical"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:orientation="vertical"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
|
14
calculatorpp/res/layout/plot_fragment.xml
Normal file
14
calculatorpp/res/layout/plot_fragment.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
a:layout_height="match_parent">
|
||||
|
||||
<TextView a:id="@+id/fragmentTitle"
|
||||
a:layout_height="wrap_content"
|
||||
a:layout_width="match_parent"
|
||||
style="?fragmentTitleStyle"/>
|
||||
|
||||
</LinearLayout>
|
@ -7,7 +7,6 @@
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
a:orientation="vertical"
|
||||
a:id="@+id/main_fragment_layout"
|
||||
style="?fragmentLayoutStyle"
|
||||
a:layout_width="match_parent"
|
||||
|
@ -1,3 +1,5 @@
|
||||
<resources>
|
||||
<dimen name="editor_text_size">15sp</dimen>
|
||||
<dimen name="display_text_size">15sp</dimen>
|
||||
<dimen name="keyboard_button_text_size">20dp</dimen>
|
||||
</resources>
|
@ -7,4 +7,8 @@
|
||||
<dimen name="editor_text_size">25sp</dimen>
|
||||
<dimen name="pane_margin">5dp</dimen>
|
||||
<dimen name="pane_padding">5dp</dimen>
|
||||
|
||||
<!--only for not multipane-->
|
||||
<dimen name="editor_padding">5dp</dimen>
|
||||
<dimen name="display_padding">3dp</dimen>
|
||||
</resources>
|
@ -34,7 +34,7 @@
|
||||
|
||||
<style name="default_fragment_title_style">
|
||||
<item name="android:textColor">@android:color/white</item>
|
||||
<item name="android:textSize">25sp</item>
|
||||
<item name="android:textSize">20sp</item>
|
||||
</style>
|
||||
|
||||
<style name="default_button_style" parent="button_style">
|
||||
@ -67,6 +67,7 @@
|
||||
<style name="default_fragment_layout_style">
|
||||
<item name="android:layout_margin">0dp</item>
|
||||
<item name="android:padding">0dp</item>
|
||||
<item name="android:orientation">vertical</item>
|
||||
</style>
|
||||
|
||||
<style name="default_main_layout_style">
|
||||
|
@ -36,12 +36,10 @@
|
||||
|
||||
<style name="display_style_parent" parent="default_text">
|
||||
<item name="android:textSize">@dimen/display_text_size</item>
|
||||
<item name="android:padding">3dp</item>
|
||||
</style>
|
||||
|
||||
<style name="editor_style_parent" parent="default_text">
|
||||
<item name="android:textSize">@dimen/editor_text_size</item>
|
||||
<item name="android:padding">5dp</item>
|
||||
</style>
|
||||
|
||||
<style name="about_style_parent" parent="default_text">
|
||||
|
@ -207,4 +207,6 @@
|
||||
<string name="convert_to_bin">Convert to bin</string>
|
||||
<string name="convert_to_dec">Convert to dec</string>
|
||||
|
||||
<string name="editor">Editor</string>
|
||||
|
||||
</resources>
|
@ -31,6 +31,7 @@ import org.solovyev.android.calculator.history.CalculatorSavedHistoryFragment;
|
||||
import org.solovyev.android.calculator.math.edit.CalculatorFunctionsFragment;
|
||||
import org.solovyev.android.calculator.math.edit.CalculatorOperatorsFragment;
|
||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsFragment;
|
||||
import org.solovyev.android.calculator.plot.CalculatorPlotFragment;
|
||||
import org.solovyev.android.fragments.FragmentUtils;
|
||||
import org.solovyev.android.prefs.Preference;
|
||||
import org.solovyev.android.view.ColorButton;
|
||||
@ -78,6 +79,7 @@ public class CalculatorActivity extends SherlockFragmentActivity implements Shar
|
||||
activityHelper.addTab(this, "vars", CalculatorVarsFragment.class, null, R.string.c_vars, R.id.main_second_pane);
|
||||
activityHelper.addTab(this, "functions", CalculatorFunctionsFragment.class, null, R.string.c_functions, R.id.main_second_pane);
|
||||
activityHelper.addTab(this, "operators", CalculatorOperatorsFragment.class, null, R.string.c_operators, R.id.main_second_pane);
|
||||
activityHelper.addTab(this, "plot", CalculatorPlotFragment.class, null, R.string.c_plot, R.id.main_second_pane);
|
||||
|
||||
activityHelper.restoreSavedTab(this);
|
||||
} else {
|
||||
|
@ -65,6 +65,10 @@ public class CalculatorActivityHelperImpl extends AbstractCalculatorHelper imple
|
||||
public void onCreate(@NotNull Activity activity, @Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(activity);
|
||||
|
||||
if ( activity instanceof CalculatorEventListener) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener((CalculatorEventListener)activity);
|
||||
}
|
||||
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
|
||||
this.theme = CalculatorPreferences.Gui.getTheme(preferences);
|
||||
@ -82,6 +86,7 @@ public class CalculatorActivityHelperImpl extends AbstractCalculatorHelper imple
|
||||
final ActionBar actionBar = activity.getSupportActionBar();
|
||||
actionBar.setDisplayUseLogoEnabled(false);
|
||||
actionBar.setDisplayHomeAsUpEnabled(homeIcon);
|
||||
actionBar.setHomeButtonEnabled(false);
|
||||
actionBar.setDisplayShowHomeEnabled(true);
|
||||
actionBar.setDisplayShowTitleEnabled(true);
|
||||
|
||||
@ -119,8 +124,17 @@ public class CalculatorActivityHelperImpl extends AbstractCalculatorHelper imple
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy(@NotNull SherlockFragmentActivity activity) {
|
||||
public void onDestroy(@NotNull Activity activity) {
|
||||
super.onDestroy(activity);
|
||||
|
||||
if ( activity instanceof CalculatorEventListener) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener((CalculatorEventListener)activity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy(@NotNull SherlockFragmentActivity activity) {
|
||||
this.onDestroy((Activity)activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -15,6 +15,7 @@ import org.solovyev.android.calculator.math.edit.CalculatorOperatorsFragment;
|
||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsFragment;
|
||||
import org.solovyev.android.calculator.math.edit.CalculatorVarsFragmentActivity;
|
||||
import org.solovyev.android.calculator.plot.CalculatorPlotActivity;
|
||||
import org.solovyev.android.calculator.plot.CalculatorPlotFragment;
|
||||
import org.solovyev.common.text.StringUtils;
|
||||
|
||||
/**
|
||||
@ -55,7 +56,7 @@ public class CalculatorActivityLauncher {
|
||||
public static void plotGraph(@NotNull final Context context, @NotNull Generic generic, @NotNull Constant constant){
|
||||
final Intent intent = new Intent();
|
||||
intent.putExtra(ChartFactory.TITLE, context.getString(R.string.c_graph));
|
||||
intent.putExtra(CalculatorPlotActivity.INPUT, new CalculatorPlotActivity.Input(generic.toString(), constant.getName()));
|
||||
intent.putExtra(CalculatorPlotFragment.INPUT, new CalculatorPlotFragment.Input(generic.toString(), constant.getName()));
|
||||
intent.setClass(context, CalculatorPlotActivity.class);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
@ -116,7 +116,17 @@ public class CalculatorApplication extends android.app.Application {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public CalculatorFragmentHelper createFragmentHelper(int layoutId) {
|
||||
public CalculatorFragmentHelper createFragmentHelper(int layoutId) {
|
||||
return new CalculatorFragmentHelperImpl(layoutId);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public CalculatorFragmentHelper createFragmentHelper(int layoutId, int titleResId) {
|
||||
return new CalculatorFragmentHelperImpl(layoutId, titleResId);
|
||||
}
|
||||
@NotNull
|
||||
public CalculatorFragmentHelper createFragmentHelper(int layoutId, int titleResId, boolean listenersOnCreate) {
|
||||
return new CalculatorFragmentHelperImpl(layoutId, titleResId, listenersOnCreate);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,16 +3,12 @@ package org.solovyev.android.calculator;
|
||||
import android.content.Context;
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.function.Constant;
|
||||
import jscl.math.function.IConstant;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.solovyev.android.calculator.jscl.JsclOperation;
|
||||
import org.solovyev.android.calculator.view.NumeralBaseConverterDialog;
|
||||
import org.solovyev.android.menu.LabeledMenuItem;
|
||||
import org.solovyev.common.collections.CollectionsUtils;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* User: Solovyev_S
|
||||
* Date: 21.09.12
|
||||
@ -84,37 +80,16 @@ public enum CalculatorDisplayMenuItem implements LabeledMenuItem<CalculatorDispl
|
||||
final Generic generic = data.getResult();
|
||||
assert generic != null;
|
||||
|
||||
final Constant constant = CollectionsUtils.getFirstCollectionElement(getNotSystemConstants(generic));
|
||||
final Constant constant = CollectionsUtils.getFirstCollectionElement(CalculatorUtils.getNotSystemConstants(generic));
|
||||
assert constant != null;
|
||||
CalculatorActivityLauncher.plotGraph(context, generic, constant);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isItemVisibleFor(@NotNull Generic generic, @NotNull JsclOperation operation) {
|
||||
boolean result = false;
|
||||
|
||||
if (operation == JsclOperation.simplify) {
|
||||
if (getNotSystemConstants(generic).size() == 1) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return CalculatorUtils.isPlotPossible(generic, operation);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Set<Constant> getNotSystemConstants(@NotNull Generic generic) {
|
||||
final Set<Constant> notSystemConstants = new HashSet<Constant>();
|
||||
|
||||
for (Constant constant : generic.getConstants()) {
|
||||
IConstant var = CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().get(constant.getName());
|
||||
if (var != null && !var.isSystem() && !var.isDefined()) {
|
||||
notSystemConstants.add(constant);
|
||||
}
|
||||
}
|
||||
|
||||
return notSystemConstants;
|
||||
}
|
||||
};
|
||||
|
||||
private final int captionId;
|
||||
|
@ -23,22 +23,28 @@ public class CalculatorEditorFragment extends SherlockFragment {
|
||||
@NotNull
|
||||
private ActivityMenu<Menu, MenuItem> menu = ListActivityMenu.fromList(CalculatorMenu.class, SherlockMenuHelper.getInstance());
|
||||
|
||||
private CalculatorFragmentHelper fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(R.layout.calc_editor, R.string.editor);
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
fragmentHelper.onCreate(this);
|
||||
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.calc_editor, container, false);
|
||||
return fragmentHelper.onCreateView(this, inflater, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
fragmentHelper.onViewCreated(this, view);
|
||||
|
||||
((AndroidCalculator) CalculatorLocatorImpl.getInstance().getCalculator()).setEditor(getActivity());
|
||||
}
|
||||
|
||||
@ -47,6 +53,34 @@ public class CalculatorEditorFragment extends SherlockFragment {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
fragmentHelper.onDestroy(this);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
this.fragmentHelper.onResume(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
this.fragmentHelper.onPause(this);
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* MENU
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
this.menu.onCreateOptionsMenu(this.getActivity(), menu);
|
||||
|
@ -6,7 +6,6 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.android.calculator.math.edit.AbstractMathEntityListFragment;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
@ -21,10 +20,14 @@ public interface CalculatorFragmentHelper {
|
||||
|
||||
void onCreate(@NotNull Fragment fragment);
|
||||
|
||||
void onViewCreated(@NotNull Fragment fragment, @NotNull View root);
|
||||
void onResume(@NotNull Fragment fragment);
|
||||
|
||||
void onDestroy(@NotNull Fragment fragment);
|
||||
void onPause(@NotNull Fragment fragment);
|
||||
|
||||
@NotNull
|
||||
View onCreateView(@NotNull Fragment fragment, @NotNull LayoutInflater inflater, @Nullable ViewGroup container);
|
||||
|
||||
void onViewCreated(@NotNull Fragment fragment, @NotNull View root);
|
||||
|
||||
void onDestroy(@NotNull Fragment fragment);
|
||||
}
|
||||
|
@ -4,13 +4,12 @@ import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import com.google.ads.AdView;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.android.ads.AdsController;
|
||||
import org.solovyev.android.calculator.plot.CalculatorPlotFragment;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
@ -24,10 +23,25 @@ public class CalculatorFragmentHelperImpl extends AbstractCalculatorHelper imple
|
||||
|
||||
private int layoutId;
|
||||
|
||||
private int titleResId = -1;
|
||||
|
||||
private boolean listenersOnCreate = true;
|
||||
|
||||
public CalculatorFragmentHelperImpl(int layoutId) {
|
||||
this.layoutId = layoutId;
|
||||
}
|
||||
|
||||
public CalculatorFragmentHelperImpl(int layoutId, int titleResId) {
|
||||
this.layoutId = layoutId;
|
||||
this.titleResId = titleResId;
|
||||
}
|
||||
|
||||
public CalculatorFragmentHelperImpl(int layoutId, int titleResId, boolean listenersOnCreate) {
|
||||
this.layoutId = layoutId;
|
||||
this.titleResId = titleResId;
|
||||
this.listenersOnCreate = listenersOnCreate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPane(@NotNull Fragment fragment) {
|
||||
return fragment.getActivity() instanceof CalculatorActivity;
|
||||
@ -47,22 +61,58 @@ public class CalculatorFragmentHelperImpl extends AbstractCalculatorHelper imple
|
||||
@Override
|
||||
public void onCreate(@NotNull Fragment fragment) {
|
||||
super.onCreate(fragment.getActivity());
|
||||
|
||||
if (listenersOnCreate) {
|
||||
if ( fragment instanceof CalculatorEventListener ) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener((CalculatorEventListener) fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume(@NotNull Fragment fragment) {
|
||||
if (!listenersOnCreate) {
|
||||
if ( fragment instanceof CalculatorEventListener ) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener((CalculatorEventListener) fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause(@NotNull Fragment fragment) {
|
||||
if (!listenersOnCreate) {
|
||||
if ( fragment instanceof CalculatorEventListener ) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener((CalculatorEventListener) fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NotNull Fragment fragment, @NotNull View root) {
|
||||
final ViewGroup mainFragmentLayout = (ViewGroup) root.findViewById(R.id.main_fragment_layout);
|
||||
if (mainFragmentLayout != null) {
|
||||
adView = AdsController.getInstance().inflateAd(fragment.getActivity(), mainFragmentLayout, R.id.main_fragment_layout);
|
||||
if (!(fragment instanceof CalculatorPlotFragment)) {
|
||||
adView = AdsController.getInstance().inflateAd(fragment.getActivity(), mainFragmentLayout, R.id.main_fragment_layout);
|
||||
}
|
||||
}
|
||||
|
||||
processButtons(fragment.getActivity(), root);
|
||||
|
||||
if (titleResId >= 0) {
|
||||
this.setPaneTitle(fragment, titleResId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy(@NotNull Fragment fragment) {
|
||||
super.onDestroy(fragment.getActivity());
|
||||
|
||||
if (listenersOnCreate) {
|
||||
if ( fragment instanceof CalculatorEventListener ) {
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener((CalculatorEventListener) fragment);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.adView != null) {
|
||||
this.adView.destroy();
|
||||
}
|
||||
|
@ -54,6 +54,21 @@ public class CalculatorKeyboardFragment extends SherlockFragment implements Shar
|
||||
fragmentHelper.onViewCreated(this, root);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
this.fragmentHelper.onResume(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
this.fragmentHelper.onPause(this);
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
@ -86,7 +86,7 @@ public abstract class AbstractCalculatorHistoryFragment extends SherlockListFrag
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(R.layout.history_fragment);
|
||||
fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(R.layout.history_fragment, getTitleResId(), false);
|
||||
fragmentHelper.onCreate(this);
|
||||
|
||||
logDebug("onCreate");
|
||||
@ -108,7 +108,6 @@ public abstract class AbstractCalculatorHistoryFragment extends SherlockListFrag
|
||||
logDebug("onViewCreated");
|
||||
|
||||
fragmentHelper.onViewCreated(this, root);
|
||||
fragmentHelper.setPaneTitle(this, getTitleResId());
|
||||
|
||||
adapter = new HistoryArrayAdapter(this.getActivity(), getItemLayoutId(), R.id.history_item, new ArrayList<CalculatorHistoryState>());
|
||||
setListAdapter(adapter);
|
||||
@ -161,6 +160,23 @@ public abstract class AbstractCalculatorHistoryFragment extends SherlockListFrag
|
||||
|
||||
protected abstract int getTitleResId();
|
||||
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
this.fragmentHelper.onResume(this);
|
||||
|
||||
updateAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
this.fragmentHelper.onPause(this);
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
logDebug("onDestroy");
|
||||
@ -172,28 +188,6 @@ public abstract class AbstractCalculatorHistoryFragment extends SherlockListFrag
|
||||
|
||||
protected abstract int getItemLayoutId();
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
logDebug("onResume");
|
||||
|
||||
super.onResume();
|
||||
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||
|
||||
updateAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
logDebug("onPause");
|
||||
|
||||
super.onPause();
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||
|
||||
}
|
||||
|
||||
private void updateAdapter() {
|
||||
final List<CalculatorHistoryState> historyList = getHistoryList();
|
||||
|
||||
|
@ -30,8 +30,6 @@ public class CalculatorHistoryFragmentActivity extends SherlockFragmentActivity
|
||||
|
||||
activityHelper.addTab(this, "history", CalculatorHistoryFragment.class, null, R.string.c_history, R.id.main_layout);
|
||||
activityHelper.addTab(this, "saved_history", CalculatorSavedHistoryFragment.class, null, R.string.c_saved_history, R.id.main_layout);
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -53,8 +51,6 @@ public class CalculatorHistoryFragmentActivity extends SherlockFragmentActivity
|
||||
super.onDestroy();
|
||||
|
||||
activityHelper.onDestroy(this);
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -82,7 +82,7 @@ public abstract class AbstractMathEntityListFragment<T extends MathEntity> exten
|
||||
category = bundle.getString(MATH_ENTITY_CATEGORY_EXTRA_STRING);
|
||||
}
|
||||
|
||||
fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(getLayoutId());
|
||||
fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(getLayoutId(), getTitleResId());
|
||||
fragmentHelper.onCreate(this);
|
||||
}
|
||||
|
||||
@ -96,7 +96,6 @@ public abstract class AbstractMathEntityListFragment<T extends MathEntity> exten
|
||||
super.onViewCreated(root, savedInstanceState);
|
||||
|
||||
fragmentHelper.onViewCreated(this, root);
|
||||
this.fragmentHelper.setPaneTitle(this, getTitleResId());
|
||||
|
||||
final ListView lv = getListView();
|
||||
lv.setTextFilterEnabled(true);
|
||||
@ -141,10 +140,19 @@ public abstract class AbstractMathEntityListFragment<T extends MathEntity> exten
|
||||
@NotNull
|
||||
protected abstract List<LabeledMenuItem<T>> getMenuItemsOnLongClick(@NotNull T item);
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public void onPause() {
|
||||
this.fragmentHelper.onPause(this);
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
this.fragmentHelper.onResume(this);
|
||||
|
||||
adapter = new MathEntityArrayAdapter<T>(getDescriptionGetter(), this.getActivity(), R.layout.math_entity, R.id.math_entity_text, getMathEntitiesByCategory());
|
||||
setListAdapter(adapter);
|
||||
|
||||
|
@ -11,7 +11,6 @@ import com.actionbarsherlock.app.SherlockFragmentActivity;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.android.calculator.*;
|
||||
import org.solovyev.android.calculator.history.CalculatorHistoryFragment;
|
||||
import org.solovyev.android.calculator.history.CalculatorHistoryFragmentActivity;
|
||||
import org.solovyev.android.calculator.model.AndroidFunctionsMathRegistry;
|
||||
|
||||
@ -34,8 +33,6 @@ public class CalculatorFunctionsFragmentActivity extends SherlockFragmentActivit
|
||||
for (AndroidFunctionsMathRegistry.Category category : AndroidFunctionsMathRegistry.Category.getCategoriesByTabOrder()) {
|
||||
activityHelper.addTab(this, category.name(), CalculatorFunctionsFragment.class, AbstractMathEntityListFragment.createBundleFor(category.name()), category.getCaptionId(), R.id.main_layout);
|
||||
}
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -57,8 +54,6 @@ public class CalculatorFunctionsFragmentActivity extends SherlockFragmentActivit
|
||||
super.onDestroy();
|
||||
|
||||
this.activityHelper.onDestroy(this);
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -55,8 +55,6 @@ public class CalculatorVarsFragmentActivity extends SherlockFragmentActivity imp
|
||||
activityHelper.addTab(this, category.name(), CalculatorVarsFragment.class, fragmentParameters, category.getCaptionId(), R.id.main_layout);
|
||||
|
||||
}
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().addCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -78,8 +76,6 @@ public class CalculatorVarsFragmentActivity extends SherlockFragmentActivity imp
|
||||
super.onDestroy();
|
||||
|
||||
this.activityHelper.onDestroy(this);
|
||||
|
||||
CalculatorLocatorImpl.getInstance().getCalculator().removeCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,488 @@
|
||||
/*
|
||||
* Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
||||
* For more information, please, contact se.solovyev@gmail.com
|
||||
* or visit http://se.solovyev.org
|
||||
*/
|
||||
|
||||
package org.solovyev.android.calculator.plot;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
import com.actionbarsherlock.app.SherlockFragment;
|
||||
import jscl.math.Expression;
|
||||
import jscl.math.Generic;
|
||||
import jscl.math.function.Constant;
|
||||
import jscl.text.ParseException;
|
||||
import org.achartengine.GraphicalView;
|
||||
import org.achartengine.chart.CubicLineChart;
|
||||
import org.achartengine.chart.PointStyle;
|
||||
import org.achartengine.chart.XYChart;
|
||||
import org.achartengine.model.XYMultipleSeriesDataset;
|
||||
import org.achartengine.model.XYSeries;
|
||||
import org.achartengine.renderer.BasicStroke;
|
||||
import org.achartengine.renderer.XYMultipleSeriesRenderer;
|
||||
import org.achartengine.renderer.XYSeriesRenderer;
|
||||
import org.achartengine.tools.PanListener;
|
||||
import org.achartengine.tools.ZoomEvent;
|
||||
import org.achartengine.tools.ZoomListener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.solovyev.android.calculator.*;
|
||||
import org.solovyev.common.MutableObject;
|
||||
import org.solovyev.common.collections.CollectionsUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 12/1/11
|
||||
* Time: 12:40 AM
|
||||
*/
|
||||
public class CalculatorPlotFragment extends SherlockFragment implements CalculatorEventListener {
|
||||
|
||||
private static final String TAG = CalculatorPlotFragment.class.getSimpleName();
|
||||
|
||||
private static final int DEFAULT_NUMBER_OF_STEPS = 100;
|
||||
|
||||
private static final int DEFAULT_MIN_NUMBER = -10;
|
||||
|
||||
private static final int DEFAULT_MAX_NUMBER = 10;
|
||||
|
||||
public static final String INPUT = "org.solovyev.android.calculator.CalculatorPlotActivity_input";
|
||||
|
||||
public static final long EVAL_DELAY_MILLIS = 200;
|
||||
|
||||
private XYChart chart;
|
||||
|
||||
/**
|
||||
* The encapsulated graphical view.
|
||||
*/
|
||||
private GraphicalView graphicalView;
|
||||
|
||||
@NotNull
|
||||
private Generic expression;
|
||||
|
||||
@NotNull
|
||||
private Constant variable;
|
||||
|
||||
@NotNull
|
||||
private final CalculatorFragmentHelper fragmentHelper = CalculatorApplication.getInstance().createFragmentHelper(R.layout.plot_fragment, R.string.c_plot, false);
|
||||
|
||||
@NotNull
|
||||
private final Executor plotExecutor = Executors.newSingleThreadExecutor();
|
||||
|
||||
@NotNull
|
||||
private final Handler uiHandler = new Handler();
|
||||
|
||||
@Nullable
|
||||
private Input input = null;
|
||||
|
||||
private boolean inputFromArgs = true;
|
||||
|
||||
@NotNull
|
||||
private CalculatorEventData lastCalculatorEventData = CalculatorUtils.createFirstEventDataId();
|
||||
|
||||
private int bgColor;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
this.fragmentHelper.onCreate(this);
|
||||
|
||||
|
||||
final Bundle arguments = getArguments();
|
||||
|
||||
if (arguments != null) {
|
||||
input = (Input) arguments.getSerializable(INPUT);
|
||||
}
|
||||
|
||||
if (input == null) {
|
||||
inputFromArgs = false;
|
||||
createInputFromDisplayState(CalculatorLocatorImpl.getInstance().getDisplay().getViewState());
|
||||
this.bgColor = getResources().getColor(R.color.pane_background);
|
||||
} else {
|
||||
this.bgColor = getResources().getColor(android.R.color.transparent);
|
||||
prepareData();
|
||||
}
|
||||
}
|
||||
|
||||
private void createInputFromDisplayState(@NotNull CalculatorDisplayViewState displayState) {
|
||||
try {
|
||||
if (displayState.isValid() && displayState.getResult() != null) {
|
||||
final Generic expression = displayState.getResult();
|
||||
if (CalculatorUtils.isPlotPossible(expression, displayState.getOperation())) {
|
||||
final Constant constant = CollectionsUtils.getFirstCollectionElement(CalculatorUtils.getNotSystemConstants(expression));
|
||||
input = new Input(expression.toString(), constant.getName());
|
||||
|
||||
prepareData();
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
this.input = null;
|
||||
Log.e(TAG, e.getLocalizedMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareData(){
|
||||
try {
|
||||
if (input != null) {
|
||||
final PreparedExpression preparedExpression = ToJsclTextProcessor.getInstance().process(input.getExpression());
|
||||
this.expression = Expression.valueOf(preparedExpression.getExpression());
|
||||
this.variable = new Constant(input.getVariableName());
|
||||
|
||||
this.chart = prepareChart(getMinValue(null), getMaxValue(null), this.expression, variable, bgColor);
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
this.input = null;
|
||||
Toast.makeText(this.getActivity(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
|
||||
} catch (CalculatorParseException e) {
|
||||
this.input = null;
|
||||
Toast.makeText(this.getActivity(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return this.fragmentHelper.onCreateView(this, inflater, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View root, Bundle savedInstanceState) {
|
||||
super.onViewCreated(root, savedInstanceState);
|
||||
|
||||
this.fragmentHelper.onViewCreated(this, root);
|
||||
|
||||
updateGraphicalView(root);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
this.fragmentHelper.onResume(this);
|
||||
|
||||
if ( !inputFromArgs ) {
|
||||
createInputFromDisplayState(CalculatorLocatorImpl.getInstance().getDisplay().getViewState());
|
||||
updateGraphicalView(getView());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
this.fragmentHelper.onPause(this);
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
private void updateGraphicalView(@NotNull View root) {
|
||||
if (input != null) {
|
||||
// todo serso
|
||||
final Object lastNonConfigurationInstance = null;//getLastNonConfigurationInstance();
|
||||
setGraphicalView(root, lastNonConfigurationInstance instanceof PlotBoundaries ? (PlotBoundaries) lastNonConfigurationInstance : null);
|
||||
} else {
|
||||
Toast.makeText(this.getActivity(), "Plot is not possible!", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
this.fragmentHelper.onDestroy(this);
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
private void setGraphicalView(@NotNull View root, @Nullable PlotBoundaries plotBoundaries) {
|
||||
double minValue = getMinValue(plotBoundaries);
|
||||
double maxValue = getMaxValue(plotBoundaries);
|
||||
|
||||
final ViewGroup graphContainer = (ViewGroup) root.findViewById(R.id.main_fragment_layout);
|
||||
|
||||
if (graphicalView != null) {
|
||||
graphContainer.removeView(graphicalView);
|
||||
}
|
||||
|
||||
// reverting boundaries (as in prepareChart() we add some cached values )
|
||||
double minX = Double.MAX_VALUE;
|
||||
double minY = Double.MAX_VALUE;
|
||||
|
||||
double maxX = Double.MIN_VALUE;
|
||||
double maxY = Double.MIN_VALUE;
|
||||
|
||||
for (XYSeries series : chart.getDataset().getSeries()) {
|
||||
minX = Math.min(minX, series.getMinX());
|
||||
minY = Math.min(minY, series.getMinY());
|
||||
maxX = Math.max(maxX, series.getMaxX());
|
||||
maxY = Math.max(maxY, series.getMaxY());
|
||||
}
|
||||
|
||||
Log.d(CalculatorPlotFragment.class.getName(), "min x: " + minX + ", min y: " + minY + ", max x: " + maxX + ", max y: " + maxY);
|
||||
Log.d(CalculatorPlotFragment.class.getName(), "Plot boundaries are " + plotBoundaries);
|
||||
|
||||
|
||||
if (plotBoundaries == null) {
|
||||
chart.getRenderer().setXAxisMin(Math.max(minX, minValue));
|
||||
chart.getRenderer().setYAxisMin(Math.max(minY, minValue));
|
||||
chart.getRenderer().setXAxisMax(Math.min(maxX, maxValue));
|
||||
chart.getRenderer().setYAxisMax(Math.min(maxY, maxValue));
|
||||
} else {
|
||||
chart.getRenderer().setXAxisMin(plotBoundaries.xMin);
|
||||
chart.getRenderer().setYAxisMin(plotBoundaries.yMin);
|
||||
chart.getRenderer().setXAxisMax(plotBoundaries.xMax);
|
||||
chart.getRenderer().setYAxisMax(plotBoundaries.yMax);
|
||||
}
|
||||
|
||||
graphicalView = new GraphicalView(this.getActivity(), chart);
|
||||
graphicalView.setBackgroundColor(this.bgColor);
|
||||
|
||||
graphicalView.addZoomListener(new ZoomListener() {
|
||||
@Override
|
||||
public void zoomApplied(ZoomEvent e) {
|
||||
updateDataSets(chart);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void zoomReset() {
|
||||
updateDataSets(chart);
|
||||
}
|
||||
}, true, true);
|
||||
|
||||
graphicalView.addPanListener(new PanListener() {
|
||||
@Override
|
||||
public void panApplied() {
|
||||
Log.d(TAG, "org.achartengine.tools.PanListener.panApplied");
|
||||
updateDataSets(chart);
|
||||
}
|
||||
|
||||
});
|
||||
graphContainer.addView(graphicalView);
|
||||
|
||||
updateDataSets(chart, 50);
|
||||
}
|
||||
|
||||
private double getMaxValue(@Nullable PlotBoundaries plotBoundaries) {
|
||||
return plotBoundaries == null ? DEFAULT_MAX_NUMBER : plotBoundaries.xMax;
|
||||
}
|
||||
|
||||
private double getMinValue(@Nullable PlotBoundaries plotBoundaries) {
|
||||
return plotBoundaries == null ? DEFAULT_MIN_NUMBER : plotBoundaries.xMin;
|
||||
}
|
||||
|
||||
|
||||
private void updateDataSets(@NotNull final XYChart chart) {
|
||||
updateDataSets(chart, EVAL_DELAY_MILLIS);
|
||||
}
|
||||
|
||||
private void updateDataSets(@NotNull final XYChart chart, long millisToWait) {
|
||||
pendingOperation.setObject(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// allow only one runner at one time
|
||||
synchronized (pendingOperation) {
|
||||
//lock all operations with history
|
||||
if (pendingOperation.getObject() == this) {
|
||||
|
||||
plotExecutor.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Log.d(TAG, "org.solovyev.android.calculator.plot.CalculatorPlotActivity.updateDataSets");
|
||||
|
||||
final XYMultipleSeriesRenderer dr = chart.getRenderer();
|
||||
|
||||
//Log.d(CalculatorPlotActivity.class.getName(), "x = [" + dr.getXAxisMin() + ", " + dr.getXAxisMax() + "], y = [" + dr.getYAxisMin() + ", " + dr.getYAxisMax() + "]");
|
||||
|
||||
final MyXYSeries realSeries = (MyXYSeries) chart.getDataset().getSeriesAt(0);
|
||||
|
||||
final MyXYSeries imagSeries;
|
||||
if (chart.getDataset().getSeriesCount() > 1) {
|
||||
imagSeries = (MyXYSeries) chart.getDataset().getSeriesAt(1);
|
||||
} else {
|
||||
imagSeries = new MyXYSeries(getImagFunctionName(CalculatorPlotFragment.this.variable), DEFAULT_NUMBER_OF_STEPS * 2);
|
||||
}
|
||||
|
||||
try {
|
||||
if (PlotUtils.addXY(dr.getXAxisMin(), dr.getXAxisMax(), expression, variable, realSeries, imagSeries, true, DEFAULT_NUMBER_OF_STEPS)) {
|
||||
if (chart.getDataset().getSeriesCount() <= 1) {
|
||||
chart.getDataset().addSeries(imagSeries);
|
||||
chart.getRenderer().addSeriesRenderer(createImagRenderer());
|
||||
}
|
||||
}
|
||||
} catch (ArithmeticException e) {
|
||||
// todo serso: translate
|
||||
Toast.makeText(CalculatorPlotFragment.this.getActivity(), "Arithmetic error: " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
if (pendingOperation.getObject() == this) {
|
||||
uiHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
graphicalView.repaint();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
uiHandler.postDelayed(pendingOperation.getObject(), millisToWait);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getImagFunctionName(@NotNull Constant variable) {
|
||||
return "g(" + variable.getName() + ")" + " = " + "Im(ƒ(" + variable.getName() + "))";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getRealFunctionName(@NotNull Generic expression, @NotNull Constant variable) {
|
||||
return "ƒ(" + variable.getName() + ")" + " = " + expression.toString();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final MutableObject<Runnable> pendingOperation = new MutableObject<Runnable>();
|
||||
|
||||
private static XYChart prepareChart(final double minValue, final double maxValue, @NotNull final Generic expression, @NotNull final Constant variable, int bgColor) {
|
||||
final MyXYSeries realSeries = new MyXYSeries(getRealFunctionName(expression, variable), DEFAULT_NUMBER_OF_STEPS * 2);
|
||||
final MyXYSeries imagSeries = new MyXYSeries(getImagFunctionName(variable), DEFAULT_NUMBER_OF_STEPS * 2);
|
||||
|
||||
boolean imagExists = PlotUtils.addXY(minValue, maxValue, expression, variable, realSeries, imagSeries, false, DEFAULT_NUMBER_OF_STEPS);
|
||||
|
||||
final XYMultipleSeriesDataset data = new XYMultipleSeriesDataset();
|
||||
data.addSeries(realSeries);
|
||||
if (imagExists) {
|
||||
data.addSeries(imagSeries);
|
||||
}
|
||||
|
||||
final XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
|
||||
renderer.setShowGrid(true);
|
||||
renderer.setXTitle(variable.getName());
|
||||
renderer.setYTitle("f(" + variable.getName() + ")");
|
||||
renderer.setChartTitleTextSize(20);
|
||||
renderer.setApplyBackgroundColor(true);
|
||||
renderer.setBackgroundColor(bgColor);
|
||||
renderer.setMarginsColor(bgColor);
|
||||
|
||||
renderer.setZoomEnabled(true);
|
||||
renderer.setZoomButtonsVisible(true);
|
||||
|
||||
renderer.addSeriesRenderer(createCommonRenderer());
|
||||
if (imagExists) {
|
||||
renderer.addSeriesRenderer(createImagRenderer());
|
||||
}
|
||||
|
||||
return new CubicLineChart(data, renderer, 0.1f);
|
||||
}
|
||||
|
||||
private static XYSeriesRenderer createImagRenderer() {
|
||||
final XYSeriesRenderer imagRenderer = createCommonRenderer();
|
||||
imagRenderer.setStroke(BasicStroke.DASHED);
|
||||
imagRenderer.setColor(Color.LTGRAY);
|
||||
return imagRenderer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCalculatorEvent(@NotNull CalculatorEventData calculatorEventData, @NotNull CalculatorEventType calculatorEventType, @Nullable final Object data) {
|
||||
if ( calculatorEventType.isOfType(CalculatorEventType.display_state_changed) ) {
|
||||
if ( !inputFromArgs ) {
|
||||
if ( calculatorEventData.isAfter(this.lastCalculatorEventData) ) {
|
||||
this.lastCalculatorEventData = calculatorEventData;
|
||||
|
||||
createInputFromDisplayState(((CalculatorDisplayChangeEventData) data).getNewState());
|
||||
|
||||
uiHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateGraphicalView(getView());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public Object onRetainNonConfigurationInstance() {
|
||||
return new PlotBoundaries(chart.getRenderer());
|
||||
}*/
|
||||
|
||||
private static final class PlotBoundaries implements Serializable {
|
||||
|
||||
private final double xMin;
|
||||
private final double xMax;
|
||||
private final double yMin;
|
||||
private final double yMax;
|
||||
|
||||
public PlotBoundaries(@NotNull XYMultipleSeriesRenderer renderer) {
|
||||
this.xMin = renderer.getXAxisMin();
|
||||
this.yMin = renderer.getYAxisMin();
|
||||
this.xMax = renderer.getXAxisMax();
|
||||
this.yMax = renderer.getYAxisMax();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PlotBoundaries{" +
|
||||
"yMax=" + yMax +
|
||||
", yMin=" + yMin +
|
||||
", xMax=" + xMax +
|
||||
", xMin=" + xMin +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
private static XYSeriesRenderer createCommonRenderer() {
|
||||
final XYSeriesRenderer renderer = new XYSeriesRenderer();
|
||||
renderer.setFillPoints(true);
|
||||
renderer.setPointStyle(PointStyle.POINT);
|
||||
renderer.setLineWidth(3);
|
||||
renderer.setColor(Color.WHITE);
|
||||
renderer.setStroke(BasicStroke.SOLID);
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public void zoomInClickHandler(@NotNull View v) {
|
||||
this.graphicalView.zoomIn();
|
||||
}
|
||||
|
||||
public void zoomOutClickHandler(@NotNull View v) {
|
||||
this.graphicalView.zoomOut();
|
||||
}
|
||||
|
||||
|
||||
public static class Input implements Serializable {
|
||||
|
||||
@NotNull
|
||||
private String expression;
|
||||
|
||||
@NotNull
|
||||
private String variableName;
|
||||
|
||||
public Input(@NotNull String expression, @NotNull String variableName) {
|
||||
this.expression = expression;
|
||||
this.variableName = variableName;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getExpression() {
|
||||
return expression;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getVariableName() {
|
||||
return variableName;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user