/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation.
*/
// adapted from AlgoTextCorner by Michael Borcherds 2008-05-10
package org.geogebra.common.kernel.algos;
import org.geogebra.common.euclidian.EuclidianViewInterfaceSlim;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.main.App;
public class AlgoDrawingPadCorner extends AlgoElement {
protected GeoPointND corner; // output
protected GeoNumberValue number;
protected GeoNumberValue evNum;
protected AlgoDrawingPadCorner(Construction cons, String label,
GeoNumberValue number, GeoNumberValue evNum, double absCorner) {
super(cons);
this.number = number;
this.evNum = evNum; // can be null
corner = newGeoPoint(cons);
setInputOutput(); // for AlgoElement
compute();
corner.setEuclidianVisible(false); // hidden by default
corner.setLabel(label);
registerEV(absCorner);
}
private void registerEV(double absCorner) {
cons.registerEuclidianViewCE(this);
if (Kernel.isEqual(number.getDouble(), 11)) {
cons.registerCorner11(this);
return;
}
if (Kernel.isEqual(number.getDouble(), absCorner)) {
cons.registerCorner5(this);
}
}
public AlgoDrawingPadCorner(Construction cons, GeoNumberValue number,
GeoNumberValue evNum, double absCorner) {
super(cons);
this.number = number;
this.evNum = evNum; // can be null
corner = newGeoPoint(cons);
setInputOutput(); // for AlgoElement
compute();
corner.setEuclidianVisible(false); // hidden by default
registerEV(absCorner);
}
public AlgoDrawingPadCorner(Construction cons, String label,
GeoNumberValue number, GeoNumberValue evNum) {
this(cons, label, number, evNum, 5);
}
/**
*
* @param cons
* construction
* @return new point
*/
protected GeoPointND newGeoPoint(Construction cons) {
return new GeoPoint(cons);
}
@Override
public Commands getClassName() {
return Commands.Corner;
}
// for AlgoElement
@Override
protected void setInputOutput() {
if (evNum == null) {
input = new GeoElement[1];
input[0] = number.toGeoElement();
} else {
input = new GeoElement[2];
input[0] = evNum.toGeoElement();
input[1] = number.toGeoElement();
}
super.setOutputLength(1);
super.setOutput(0, (GeoElement) corner);
setDependencies(); // done by AlgoElement
}
public GeoPointND getCorner() {
return corner;
}
@Override
public void compute() {
// x1 = x1 / invXscale + xZero;
// x2 = x2 / invXscale + xZero;
EuclidianViewInterfaceSlim ev;
App app = cons.getApplication();
if (evNum == null || evNum.getDouble() == 1.0) {
ev = app.getEuclidianView1();
} else {
if (!app.hasEuclidianView2(1)) {
corner.setUndefined();
return;
}
ev = app.getEuclidianView2(1);
}
double xmax = ev.toRealWorldCoordX((double) (ev.getWidth()) + 1);
double ymin = ev.toRealWorldCoordY((double) (ev.getHeight()) + 1);
double zeroX = ev.toRealWorldCoordX(-1);
double zeroY = ev.toRealWorldCoordY(0 - 1);
switch ((int) number.getDouble()) {
case 1:
corner.setCoords(zeroX, ymin, 1.0);
break;
case 2:
corner.setCoords(xmax, ymin, 1.0);
break;
case 3:
corner.setCoords(xmax, zeroY, 1.0);
break;
case 4:
corner.setCoords(zeroX, zeroY, 1.0);
break;
case 5: // return size of Graphics View in pixels
corner.setCoords(ev.getWidth(), ev.getHeight(), 1.0);
break;
case 6: // return size of Window in pixels
// (to help with sizing for export to applet)
// doesn't work very well as it receives updates only when
// EuclidianView is changed
corner.setCoords(app.getWidth(), app.getHeight(), 1.0);
break;
default:
corner.setUndefined();
break;
}
}
@Override
public final boolean euclidianViewUpdate() {
compute();
// update output:
corner.updateCascade();
return false;
}
}