package org.geogebra.common.kernel.advanced;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.algos.AlgoAttachCopyToView;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.arithmetic.NumberValue;
import org.geogebra.common.kernel.commands.CommandProcessor;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoLocusStroke;
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.MyError;
/**
* AttachCopyToView
*/
public class CmdAttachCopyToView extends CommandProcessor {
/**
* Create new command processor
*
* @param kernel
* kernel
*/
public CmdAttachCopyToView(Kernel kernel) {
super(kernel);
}
@Override
final public GeoElement[] process(Command c) throws MyError {
int n = c.getArgumentNumber();
GeoElement[] arg;
GeoElement[] ret;
switch (n) {
case 6:
case 2:
arg = resArgs(c);
if (arg[1] instanceof GeoNumberValue) {
GeoPointND corner1, corner3, screenCorner1, screenCorner3;
int viewID = (int) ((NumberValue) arg[1]).getDouble();
EuclidianView ev = null;
if (viewID == 2) {
// #5014
if (app.hasEuclidianView2(1)) {
ev = app.getEuclidianView2(1);
}
} else {
ev = app.getEuclidianView1();
}
if (n == 2) {
corner1 = new GeoPoint(kernelA.getConstruction());
corner3 = new GeoPoint(kernelA.getConstruction());
screenCorner1 = new GeoPoint(kernelA.getConstruction());
screenCorner3 = new GeoPoint(kernelA.getConstruction());
if (ev != null) {
corner1.setCoords(ev.getXmin(), ev.getYmin(), 1);
corner3.setCoords(ev.getXmax(), ev.getYmax(), 1);
screenCorner1.setCoords(0, ev.getHeight(), 1);
screenCorner3.setCoords(ev.getWidth(), 0, 1);
}
} else {
if (arg[2].isGeoPoint()) {
corner1 = (GeoPointND) arg[2];
} else {
throw argErr(app, c, arg[2]);
}
if (arg[3].isGeoPoint()) {
corner3 = (GeoPointND) arg[3];
} else {
throw argErr(app, c, arg[3]);
}
if (arg[4].isGeoPoint()) {
screenCorner1 = (GeoPointND) arg[4];
} else {
throw argErr(app, c, arg[4]);
}
if (arg[5].isGeoPoint()) {
screenCorner3 = (GeoPointND) arg[5];
} else {
throw argErr(app, c, arg[5]);
}
}
if (arg[0].isMatrixTransformable() || arg[0].isGeoFunction()
|| arg[0].isGeoPolygon() || arg[0].isGeoPolyLine()
|| arg[0].isGeoList()
|| arg[0] instanceof GeoLocusStroke) {
AlgoAttachCopyToView algo = new AlgoAttachCopyToView(cons,
c.getLabel(), arg[0], (GeoNumberValue) arg[1],
corner1, corner3, screenCorner1, screenCorner3);
ret = new GeoElement[] { algo.getResult() };
if (n == 2 && ev != app.getActiveEuclidianView()) {
ret[0].addView(ev.getViewID());
ret[0].removeView(
app.getActiveEuclidianView().getViewID());
app.getActiveEuclidianView().remove(ret[0]);
ev.add(ret[0]);
}
return ret;
}
throw argErr(app, c, arg[0]);
}
throw argErr(app, c, arg[0]);
default:
throw argNumErr(app, c, n);
}
}
}