package org.geogebra.common.kernel.advanced;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.algos.AlgoElement;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.geos.GeoVector;
public class AlgoDimension extends AlgoElement {
private GeoList matrixDimension;
private GeoNumeric firstDimension, secondDimension;
private boolean matrix;
private GeoList list;
private GeoElement point;
public AlgoDimension(Construction cons, String label, GeoList geoList) {
super(cons);
list = geoList;
firstDimension = new GeoNumeric(cons);
matrix = list.isMatrix();
if (matrix) {
matrixDimension = new GeoList(cons);
secondDimension = new GeoNumeric(cons);
matrixDimension.add(firstDimension);
matrixDimension.add(secondDimension);
}
setInputOutput();
compute();
getResult().setLabel(label);
}
public AlgoDimension(Construction cons, String label, GeoElement geoList) {
super(cons);
point = geoList;
firstDimension = new GeoNumeric(cons);
matrix = false;
setInputOutput();
compute();
getResult().setLabel(label);
}
@Override
protected void setInputOutput() {
input = new GeoElement[1];
input[0] = point == null ? list : point.toGeoElement();
if (matrix) {
setOnlyOutput(matrixDimension);
} else {
setOnlyOutput(firstDimension);
}
setDependencies();
}
@Override
public void compute() {
if (point != null) {
if (!point.isDefined()) {
firstDimension.setUndefined();
return;
}
firstDimension.setValue(
point instanceof GeoPoint || point instanceof GeoVector ? 2
: 3);
return;
}
if (!list.isDefined()) {
getResult().setUndefined();
return;
}
int size = list.size();
firstDimension.setValue(size);
if (matrix) {
matrixDimension.setDefined(true);
if (!list.get(0).isGeoList()) {
matrixDimension.setUndefined();
return;
}
int n = ((GeoList) list.get(0)).size();
for (int i = 0; i < size; i++) {
if (!list.get(i).isGeoList()
|| ((GeoList) list.get(i)).size() != n) {
matrixDimension.setUndefined();
return;
}
}
secondDimension.setValue(n);
}
}
public GeoElement getResult() {
return matrix ? matrixDimension : firstDimension;
}
@Override
public Commands getClassName() {
return Commands.Dimension;
}
}