package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.main.App;
import org.geogebra.common.main.error.ErrorHelper;
import org.geogebra.common.main.settings.EuclidianSettings;
import org.geogebra.common.util.lang.Unicode;
public class AxisModel {
final static public int AXIS_X = 0;
final static public int AXIS_Y = 1;
final static public int AXIS_Z = 2;
protected int axis;
protected EuclidianView view;
private IAxisModelListener listener;
private App app;
/******************************************************
* @param app
* @param view
* @param axis
*/
public AxisModel(App app, EuclidianView view, int axis,
IAxisModelListener listener) {
this.listener = listener;
this.app = app;
this.axis = axis;
this.view = view;
}
public void fillTicksCombo() {
// ticks
char big = '|';
char small = '\'';
listener.addTickItem(" " + big + " " + small + " " + big + " "
+ small + " " + big); // major and minor ticks
listener.addTickItem(" " + big + " " + big + " " + big); // major
// ticks
// only
// must be " " not ""
listener.addTickItem(" "); // no ticks
}
public String getAxisName() {
switch (axis) {
case AXIS_X:
default:
return "xAxis";
case AXIS_Y:
return "yAxis";
case AXIS_Z:
return "zAxis";
}
}
/**
* convert string to value for tick distance
*
* @param str string
* @return value computed (may be null)
*/
public GeoNumberValue applyTickDistance(String str) {
GeoNumberValue value = null;
final String text = str.trim();
if (!"".equals(text)) {
value = app.getKernel().getAlgebraProcessor()
.evaluateToNumeric(text, ErrorHelper.silent());
}
if (value != null) {
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1)
.setAxesNumberingDistance(value, axis);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2)
.setAxesNumberingDistance(value, axis);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3)
.setAxesNumberingDistance(value, axis);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAxesNumberingDistance(value, axis);
} else {
view.setAxesNumberingDistance(value, axis);
}
}
view.updateBackground();
}
return value;
}
protected double parseDouble(String text) {
if (text == null || "".equals(text)) {
return Double.NaN;
}
return app.getKernel().getAlgebraProcessor().evaluateToDouble(text);
}
public void fillUnitLabel() {
listener.addUnitLabelItem(null);
listener.addUnitLabelItem(Unicode.DEGREE); // degrees
listener.addUnitLabelItem(Unicode.PI_STRING); // pi
listener.addUnitLabelItem("mm");
listener.addUnitLabelItem("cm");
listener.addUnitLabelItem("m");
listener.addUnitLabelItem("km");
}
public void showAxis(boolean value) {
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setShowAxis(axis, value);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setShowAxis(axis, value);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setShowAxis(axis, value);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setShowAxis(axis, value);
} else {
view.setShowAxis(axis, value, true);
}
}
view.updateBackground();
}
public void showAxisNumbers(boolean value) {
view.setShowAxisNumbers(axis, value);
view.updateBackground();
}
public void applyTickDistance(boolean value) {
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1)
.setAutomaticAxesNumberingDistance(!value, axis, true);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2)
.setAutomaticAxesNumberingDistance(!value, axis, true);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3)
.setAutomaticAxesNumberingDistance(!value, axis, true);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAutomaticAxesNumberingDistance(!value, axis, true);
} else {
view.setAutomaticAxesNumberingDistance(!value, axis);
}
}
view.updateBackground();
}
public void applyUnitLabel(String text) {
String[] labels = view.getAxesUnitLabels();
labels[axis] = text;
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setAxesUnitLabels(labels);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setAxesUnitLabels(labels);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setAxesUnitLabels(labels);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAxesUnitLabels(labels);
} else {
view.setAxesUnitLabels(labels);
}
}
view.updateBackground();
view.repaintView();
}
public void applyAxisLabel(String text) {
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setAxisLabel(axis, text);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setAxisLabel(axis, text);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setAxisLabel(axis, text);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAxisLabel(axis, text);
} else {
view.setAxisLabel(axis, text);
}
}
view.updateBounds(true, true);
view.updateBackground();
view.repaintView();
}
public void applyTickStyle(int type) {
int[] styles = view.getAxesTickStyles();
styles[axis] = type;
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setAxisTickStyle(axis, type);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setAxisTickStyle(axis, type);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setAxisTickStyle(axis, type);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAxisTickStyle(axis, type);
} else {
view.setAxesTickStyles(styles);
}
}
view.updateBackground();
}
public void applyPositiveAxis(boolean value) {
if (view == app.getEuclidianView1()) {
app.getSettings().getEuclidian(1).setPositiveAxis(axis, value);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setPositiveAxis(axis, value);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setPositiveAxis(axis, value);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setPositiveAxis(axis, value);
} else {
view.setPositiveAxis(axis, value);
}
}
view.updateBackground();
}
public void applyDrawAtBorder(boolean value) {
boolean[] border = view.getDrawBorderAxes();
border[axis] = value;
view.setDrawBorderAxes(border);
if (!value) {
view.setAxisCross(axis, 0.0);
}
view.updateBackground();
}
public void applyCrossing(String crossStr) {
String str = crossStr;
if ("".equals(str)) {
str = "0";
}
double cross = parseDouble(str);
if (!(Double.isInfinite(cross) || Double.isNaN(cross))) {
double[] ac = view.getAxesCross();
ac[axis] = cross;
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setAxisCross(axis, cross);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setAxisCross(axis, cross);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setAxisCross(axis, cross);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setAxisCross(axis, cross);
} else {
view.setAxesCross(ac);
}
}
}
view.updateBackground();
listener.setCrossText("" + view.getAxesCross()[axis]);
}
public int getAxis() {
return axis;
}
public void fillAxisCombo() {
listener.addAxisLabelItem("");
String defaultLabel;
switch (axis) {
case AXIS_X:
defaultLabel = "x";
break;
case AXIS_Y:
default:
defaultLabel = "y";
break;
case AXIS_Z:
defaultLabel = "z";
break;
}
listener.addAxisLabelItem(defaultLabel);
GeoElement.addAddAllGreekLowerCaseNoPi(listener);
}
public void setView(EuclidianView view) {
this.view = view;
}
public void applyAllowSelection(boolean value) {
if (app.getEuclidianView1() == view) {
app.getSettings().getEuclidian(1).setSelectionAllowed(axis, value);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
app.getSettings().getEuclidian(2).setSelectionAllowed(axis, value);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
app.getSettings().getEuclidian(3).setSelectionAllowed(axis, value);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
settings.setSelectionAllowed(axis, value);
}
}
view.updateBackground();
}
public boolean isSelectionAllowed() {
boolean allowed = false;
if (app.getEuclidianView1() == view) {
allowed = app.getSettings().getEuclidian(1)
.isSelectionAllowed(axis);
} else if (app.hasEuclidianView2EitherShowingOrNot(1)
&& app.getEuclidianView2(1) == view) {
allowed = app.getSettings().getEuclidian(2)
.isSelectionAllowed(axis);
} else if (app.hasEuclidianView3D()
&& app.getEuclidianView3D() == view) {
allowed = app.getSettings().getEuclidian(3)
.isSelectionAllowed(axis);
} else {
EuclidianSettings settings = view.getSettings();
if (settings != null) {
allowed = settings.isSelectionAllowed(axis);
}
}
return allowed;
}
public interface IAxisModelListener {
void addTickItem(String item);
void addAxisLabelItem(String item);
void addUnitLabelItem(String item);
void setCrossText(String text);
}
public String getAxisDistance() {
return view.getAxesDistanceObjects()[axis] == null ? ""
: view.getAxesDistanceObjects()[axis].getDefinition() == null
? view.getAxesDistanceObjects()[axis]
.toValueString(StringTemplate.editorTemplate)
: view.getAxesDistanceObjects()[axis]
.getDefinition(StringTemplate.editorTemplate);
}
}