package org.geogebra.common.euclidian.smallscreen;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.util.debug.Log;
/**
* Adjusts slider position on file load
*/
public class AdjustSlider extends AdjustWidget {
private GeoNumeric number;
private boolean horizontal;
static final int MARGIN_X = 15;
static final int MARGIN_Y = 15;
/**
* @param num
* slider
* @param view
* view
*/
public AdjustSlider(GeoNumeric num, EuclidianView view) {
super(view);
this.number = num;
x = number.getSliderX();
origX = number.getOrigSliderX();
y = number.getSliderY();
origY = number.getOrigSliderY();
width = number.getSliderWidth();
origWidth = number.getOrigSliderWidth() == null ? 0
: number.getOrigSliderWidth().doubleValue();
horizontal = number.isSliderHorizontal();
}
@Override
public boolean isOnScreen() {
return horizontal ? isHSliderOnScreen() : isVSliderOnScreen();
}
private boolean isHSliderOnScreen() {
Log.debug(number + " origX: " + origX + " origY: " + origY
+ " viewHeight: " + view.getHeight());
if (origX == null) {
return true;
}
if (Kernel.isEqual(x, origX) && origX + origWidth < view.getWidth()
&& Kernel.isEqual(origWidth, width) && Kernel.isEqual(y, origY)
&& origY < view.getHeight()) {
return true;
}
return false;
}
private boolean isVSliderOnScreen() {
if (origY == null) {
Log.debug("VSlider " + number.getLabelSimple() + " is ON screen");
return true;
}
if (Kernel.isEqual(x, origX) && origX < view.getViewWidth() - MARGIN_X
&& Kernel.isEqual(y, origY)
&& origY < view.getViewHeight() - MARGIN_Y
&& origY - origWidth > 0 && Kernel.isEqual(origWidth, width)) {
Log.debug("VSlider " + number.getLabelSimple() + " is ON screen");
return true;
}
Log.debug("VSlider " + number.getLabelSimple() + " is OFF screen");
return false;
}
@Override
public void apply() {
if (isOnScreen()) {
return;
}
double ratio = horizontal ? ratioX : ratioY;
if (ratio > 1) {
return;
}
x = Math.round(origX * ratioX);
y = Math.round(origY * ratioY);
if (horizontal) {
adjustToRight();
} else {
adjustToTop();
}
if (width > view.getViewWidth() || width != origWidth) {
width = Math.round(origWidth * ratio);
number.setSliderWidth(width);
}
number.setSliderLocation(x, y, true);
}
protected void setDefaultRatio() {
ratioX = 1;
ratioY = 1;
}
private void adjustToRight() {
if (x + width > view.getViewWidth()) {
x = view.getViewWidth() - width - MARGIN_X;
}
int maxY = view.getViewHeight() - AdjustSlider.MARGIN_Y;
if (y > maxY) {
y = maxY;
}
Log.debug("[AS] slider " + number.getAlgebraDescriptionDefault()
+ " y: " + y + " maxY: " + maxY);
}
private void adjustToTop() {
if (y - width < 0) {
y = width + MARGIN_Y;
}
int maxX = view.getViewWidth() - MARGIN_X;
if (x > maxX) {
x = maxX;
}
}
/**
* Makes a slider onScreen with no scaling enabled.
*
* @param num
* The geo represents the slider.
* @param view
* The view to adjust the slider on.
*/
public static void ensureOnScreen(GeoNumeric num, EuclidianView view) {
AdjustSlider adjust = new AdjustSlider(num, view);
adjust.setDefaultRatio();
adjust.apply();
}
}