package org.esa.snap.timeseries.ui.graph;
import org.esa.snap.core.datamodel.Placemark;
import org.esa.snap.core.datamodel.PlacemarkGroup;
import org.esa.snap.timeseries.core.timeseries.datamodel.AbstractTimeSeries;
import java.awt.Color;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class TimeSeriesGraphDisplayController {
private static final Color[] COLORS = {
Color.blue,
Color.red.darker(),
Color.green.darker(),
Color.orange,
Color.gray,
Color.blue,
Color.magenta.darker(),
Color.pink,
Color.cyan.darker(),
Color.yellow.darker(),
Color.green.darker().darker(),
Color.red,
Color.magenta,
Color.orange.darker(),
};
private static Shape createTriangle() {
final GeneralPath generalPath = new GeneralPath();
generalPath.moveTo(-5, -5);
generalPath.lineTo(5, -5);
generalPath.lineTo(0, 5);
generalPath.closePath();
return generalPath;
}
private static Shape createPlus() {
final GeneralPath generalPath = new GeneralPath();
generalPath.moveTo(-5, -1);
generalPath.lineTo(-1, -1);
generalPath.lineTo(-1, -5);
generalPath.lineTo(1, -5);
generalPath.lineTo(1, -1);
generalPath.lineTo(5, -1);
generalPath.lineTo(5, 1);
generalPath.lineTo(1, 1);
generalPath.lineTo(1, 5);
generalPath.lineTo(-1, 5);
generalPath.lineTo(-1, 1);
generalPath.lineTo(-5, 1);
generalPath.closePath();
return generalPath;
}
private static final AffineTransform ROTATION_45 = AffineTransform.getRotateInstance(Math.toRadians(45));
private static final AffineTransform ROTATION_180 = AffineTransform.getRotateInstance(Math.toRadians(180));
private static final AffineTransform SCALE = AffineTransform.getScaleInstance(1, 1);
private static Shape createStar() {
final GeneralPath generalPath = new GeneralPath();
generalPath.moveTo(0, -5);
generalPath.lineTo(1.5, -2.5);
generalPath.lineTo(4.5, -2.5);
generalPath.lineTo(3, 0);
generalPath.lineTo(4.5, 2.5);
generalPath.lineTo(1.5, 2.5);
generalPath.lineTo(0, 5);
generalPath.lineTo(-1.5, 2.5);
generalPath.lineTo(-4.5, 2.5);
generalPath.lineTo(-3, 0);
generalPath.lineTo(-4.5, -2.5);
generalPath.lineTo(-1.5, -2.5);
generalPath.closePath();
return generalPath;
}
private static Shape createDiamond() {
final GeneralPath generalPath = new GeneralPath();
generalPath.moveTo(0, -5);
generalPath.lineTo(5, 0);
generalPath.lineTo(0, 5);
generalPath.lineTo(-5, 0);
generalPath.closePath();
return generalPath;
}
private static final Shape[] SHAPES = {
new Rectangle(-5, -5, 10, 10),
new Ellipse2D.Float(-5, -5, 10, 10),
createTriangle(),
ROTATION_180.createTransformedShape(createTriangle()),
createDiamond(),
createPlus(),
createStar(),
new Rectangle(-2, -5, 4, 10),
new Rectangle(-5, -2, 10, 4),
ROTATION_45.createTransformedShape(new Rectangle(-2, -5, 4, 10)),
ROTATION_45.createTransformedShape(new Rectangle(-5, -2, 10, 4))
};
public static final Shape CURSOR_SHAPE = ROTATION_45.createTransformedShape(createPlus());
private final List<String> eoVariablesToDisplay;
private final List<String> insituVariablesToDisplay;
private final PinSupport pinSupport;
private AbstractTimeSeries timeSeries;
TimeSeriesGraphDisplayController(PinSupport pinSupport) {
this.pinSupport = pinSupport;
eoVariablesToDisplay = new ArrayList<>();
insituVariablesToDisplay = new ArrayList<>();
}
public Paint getPaint(int i) {
return COLORS[i % COLORS.length];
}
public List<String> getEoVariablesToDisplay() {
return Collections.unmodifiableList(eoVariablesToDisplay);
}
public List<String> getInsituVariablesToDisplay() {
return Collections.unmodifiableList(insituVariablesToDisplay);
}
public void adaptTo(AbstractTimeSeries timeSeries) {
this.timeSeries = timeSeries;
for (String eoVariableName : timeSeries.getEoVariables()) {
if (timeSeries.isEoVariableSelected(eoVariableName)) {
if (!eoVariablesToDisplay.contains(eoVariableName)) {
eoVariablesToDisplay.add(eoVariableName);
}
} else {
eoVariablesToDisplay.remove(eoVariableName);
}
}
if (timeSeries.hasInsituData()) {
for (String insituVariableName : timeSeries.getInsituSource().getParameterNames()) {
if (timeSeries.isInsituVariableSelected(insituVariableName)) {
if (!insituVariablesToDisplay.contains(insituVariableName)) {
insituVariablesToDisplay.add(insituVariableName);
}
} else {
insituVariablesToDisplay.remove(insituVariableName);
}
}
}
}
public Placemark[] getPinPositionsToDisplay() {
if (pinSupport.isShowingAllPins()) {
final PlacemarkGroup pinGroup = timeSeries.getTsProduct().getPinGroup();
return pinGroup.toArray(new Placemark[pinGroup.getNodeCount()]);
} else if (pinSupport.isShowingSelectedPins()) {
return pinSupport.getSelectedPins();
}
return new Placemark[0];
}
public Shape getShape(int posIdx) {
final Shape shape = SHAPES[posIdx % SHAPES.length];
return SCALE.createTransformedShape(shape);
}
interface PinSupport {
boolean isShowingAllPins();
boolean isShowingSelectedPins();
Placemark[] getSelectedPins();
}
}