123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978 |
- package holeg.ui.view.inspector;
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Cursor;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.event.ComponentEvent;
- import java.awt.event.ComponentListener;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseListener;
- import java.awt.event.MouseMotionListener;
- import java.awt.geom.Path2D;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.ListIterator;
- import java.util.Optional;
- import java.util.Set;
- import javax.swing.JPanel;
- import holeg.interfaces.TimelineDependent;
- import holeg.interfaces.GraphEditable.GraphType;
- import holeg.model.HolonElement;
- import holeg.ui.controller.Control;
- import holeg.ui.model.Model;
- import holeg.utility.Maths;
- import holeg.utility.Vector2Float;
- import holeg.utility.Vector2Int;
- public class UnitGraph extends JPanel implements MouseListener, MouseMotionListener, ComponentListener {
-
- private static final int border = 4;
- private static final int clickThreshholdSquared = 25;
-
-
- private static final int dotSize = 8;
-
- private static final Color dotColor = Color.blue;
- private static final Color editDotColor = new Color(255, 119, 0);
- private static final Color[] seriesColorArray = { Color.blue, Color.cyan, Color.black, Color.green, Color.gray,
- Color.magenta, Color.yellow, Color.PINK, Color.red };
- private static final Color globalCurveColor = new Color(255, 30, 30);
- private static final Color zeroLineColor = new Color(255, 153, 153);
-
- private class Series {
- public LinkedList<UnitGraphPoint> points = new LinkedList<UnitGraphPoint>();
- public TimelineDependent element;
- public GraphType type;
- public Color color;
- }
- private ArrayList<Series> seriesList = new ArrayList<Series>();
- private Vector2Int editPosition;
- private Optional<Series> actualSeries;
- private class GlobalCurve {
- public LinkedList<UnitGraphPoint> points = new LinkedList<UnitGraphPoint>();
- public float minEnergy;
- public float maxEnergy;
- public LinkedList<UnitGraphPoint> zeroLinePoints = new LinkedList<UnitGraphPoint>();
- }
- private Optional<GlobalCurve> globalCurve = Optional.empty();
- private boolean editMode = false;
- private Set<HolonElement> elements;
-
- private enum EditPointType {
- Normal, StartPoint, EndPoint
- };
- private Model model;
- private int widthWithBorder, heightWithBorder;
- private EditPointType editPointType;
-
-
-
- public UnitGraph(Control control) {
- setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
- this.model = control.getModel();
- this.setBackground(Color.WHITE);
- this.addMouseListener(this);
- this.addMouseMotionListener(this);
- this.addComponentListener(this);
- }
-
- public void addNewSeries(TimelineDependent element) {
- Series series = new Series();
- overrideUnitGraph(series, element.getStateGraph());
- series.element = element;
- series.type = element.getGraphType();
- series.color = seriesColorArray[element.hashCode() % seriesColorArray.length];
- seriesList.add(series);
- repaint();
- }
- public void clearSeries() {
- seriesList.clear();
- repaint();
- }
- public void setGlobalCurve(Set<HolonElement> elements) {
- if(elements.isEmpty()) {
- this.globalCurve = Optional.empty();
- return;
- }
- GlobalCurve curve = new GlobalCurve();
- curve.maxEnergy = elements.stream().map(ele -> ele.getEnergy()).filter(energy -> energy > 0).reduce(0.0f,
- Float::sum);
- curve.minEnergy = elements.stream().map(ele -> ele.getEnergy()).filter(energy -> energy < 0).reduce(0.0f,
- Float::sum);
-
- float[] sample = new float[model.getMaxIterations()];
-
- for (HolonElement element : elements) {
- for (int i = 0; i < model.getMaxIterations(); i++) {
- sample[i] += element.calculateExpectedEnergyAtTimeStep(i);
- }
- }
-
-
- for (int i = 0; i < model.getMaxIterations(); i++) {
- curve.points.add(new UnitGraphPoint((double) i / (double)model.getMaxIterations(),
- Maths.inverseLinearInterpolation(curve.minEnergy, curve.maxEnergy, sample[i]), false));
- }
-
- for (UnitGraphPoint p : curve.points) {
- p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- }
- double zeroLineYPos = Maths.inverseLinearInterpolation(curve.minEnergy, curve.maxEnergy, 0.0);
- curve.zeroLinePoints.add(new UnitGraphPoint(0.0,zeroLineYPos, false));
- curve.zeroLinePoints.add(new UnitGraphPoint(1.0,zeroLineYPos, false));
- for (UnitGraphPoint p : curve.zeroLinePoints) {
- p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- }
-
- this.globalCurve = Optional.of(curve);
- this.elements = elements;
-
- }
- private void updateGlobalCurve() {
- setGlobalCurve(this.elements);
- }
-
-
-
-
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- Graphics2D g2D = (Graphics2D) g;
- drawGrid(g2D);
- g2D.setColor(Color.BLACK);
- g2D.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
- g2D.setStroke(new BasicStroke(2f));
- drawUnitGraph(g2D);
- g2D.setColor(dotColor);
- if (editMode) {
- drawUnitGraphPointsReleased(g2D);
- } else {
- drawUnitGraphPoints(g2D);
- }
- g2D.setColor(dotColor);
- g2D.setStroke(new BasicStroke(1));
- drawCurrentIterartionLine(g2D);
- g2D.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND, 1.0f, new float[]{6}, 3));
- this.globalCurve.ifPresent(curve -> {
- g2D.setColor(globalCurveColor);
- drawDoubleGraph(g2D, curve.points);
- g2D.setColor(zeroLineColor);
- g2D.setStroke(new BasicStroke(1));
- drawDoubleGraph(g2D, curve.zeroLinePoints);
- });
- }
-
-
-
- private void drawUnitGraph(Graphics2D g) {
- boolean drawSnappingHintFlag = false;
- for (Series series : this.seriesList) {
- g.setColor(series.color);
- switch (series.type) {
- case boolGraph:
- if (editMode) {
- drawBoolGraphInEditMode(g, series);
- drawSnappingHintFlag = true;
- } else
- drawBoolGraph(g, series);
- break;
- case doubleGraph:
- if (editMode)
- drawDoubleGraphInEditMode(g, series);
- else
- drawDoubleGraph(g, series.points);
- break;
- default:
- throw new UnsupportedOperationException();
- }
- }
- if (drawSnappingHintFlag) {
- drawSnappingHint(g);
- }
- }
-
- private void drawUnitGraphPoints(Graphics2D g) {
- g.setColor(dotColor);
- for (Series series : seriesList) {
- for (UnitGraphPoint p : series.points) {
- drawDot(g, p.displayedPosition);
- }
- }
- }
-
- private void drawUnitGraphPointsReleased(Graphics2D g) {
- drawUnitGraphPoints(g);
- g.setColor(editDotColor);
- drawDot(g, editPosition);
- }
-
- private void drawGrid(Graphics2D g2D) {
- g2D.setStroke(new BasicStroke(1));
- g2D.setColor(Color.lightGray);
- int amountOfLines = 10;
- int width = widthWithBorder + 2 * border;
- int height = heightWithBorder;
- for (int i = 0; i <= amountOfLines; i++) {
- int linehieght = (int) (((double) i / (double) amountOfLines) * (double) height) + border;
- g2D.drawLine(0, linehieght, width, linehieght);
- }
- }
-
- private void drawCurrentIterartionLine(Graphics2D g) {
- int cur = model.getActualTimeStep();
- int max = model.getMaxIterations();
- if (isLocalPeriedDifferentInSeries()) {
- for (Series series : seriesList) {
- double where;
- if (!series.element.isUsingLocalPeriod()) {
- where = ((double) cur) / ((double) max);
- } else {
- int lPeriod = series.element.getLocalPeriod();
- where = ((double) cur % lPeriod) / ((double) lPeriod);
- }
- Vector2Int oben = new Vector2Int(border + (int) (where * widthWithBorder), 0);
- Vector2Int unten = new Vector2Int(border + (int) (where * widthWithBorder),
- 2 * border + heightWithBorder);
- g.setColor(series.color);
- drawLine(g, oben, unten);
- }
- } else {
- double where;
- if (!isUsingLocalPeriod()) {
- where = ((double) cur) / ((double) max);
- } else {
- int lPeriod = getFirstLocalPeriod();
- where = ((double) cur % lPeriod) / ((double) lPeriod);
- }
- Vector2Int oben = new Vector2Int(border + (int) (where * widthWithBorder), 0);
- Vector2Int unten = new Vector2Int(border + (int) (where * widthWithBorder), 2 * border + heightWithBorder);
- g.setColor(dotColor);
- drawLine(g, oben, unten);
- }
- }
-
- private void drawLine(Graphics2D g, Vector2Int start, Vector2Int end) {
- Path2D.Double path = new Path2D.Double();
- path.moveTo(start.getX(), start.getY());
- path.lineTo(end.getX(), end.getY());
- g.draw(path);
- }
-
- private Path2D.Double initBezier(Vector2Int start) {
-
-
- Path2D.Double path = new Path2D.Double();
- path.moveTo(start.getX(), start.getY());
- return path;
- }
-
- private void curveTo(Path2D.Double path, Vector2Int actual, Vector2Int target) {
- double mitte = (actual.getX() + target.getX()) * 0.5;
- path.curveTo(mitte, actual.getY(), mitte, target.getY(), target.getX(), target.getY());
- }
-
- private void drawDot(Graphics2D g, Vector2Int p) {
- g.fillOval(p.getX() - dotSize / 2, p.getY() - dotSize / 2, dotSize, dotSize);
- }
-
- private void drawBoolGraph(Graphics2D g, Series series) {
- if (series.points.size() <= 1)
- return;
- LinkedList<Vector2Int> cornerPoints = new LinkedList<Vector2Int>();
- ListIterator<UnitGraphPoint> iter = series.points.listIterator();
- Vector2Int actual = series.points.getFirst().displayedPosition;
- Path2D.Double path = new Path2D.Double();
- path.moveTo(actual.getX(), actual.getY());
- while (iter.hasNext()) {
- Vector2Int target = iter.next().displayedPosition;
-
- path.lineTo(target.getX(), actual.getY());
- cornerPoints.add(new Vector2Int(target.getX(), actual.getY()));
- path.lineTo(target.getX(), target.getY());
- actual = target;
- }
- g.draw(path);
-
- g.setColor(dotColor);
- for (Vector2Int p : cornerPoints) {
- drawDot(g, p);
- }
- }
-
- private void drawBoolGraphInEditMode(Graphics2D g, Series series) {
- LinkedList<Vector2Int> before = new LinkedList<Vector2Int>();
- LinkedList<Vector2Int> after = new LinkedList<Vector2Int>();
- for (UnitGraphPoint p : series.points) {
- if (p.displayedPosition.getX() < editPosition.getX())
- before.add(p.displayedPosition);
- else
- after.add(p.displayedPosition);
- }
- g.setColor(series.color);
- drawBoolGraphFromList(g, before);
- g.setColor(series.color);
- drawBoolGraphFromList(g, after);
-
- LinkedList<Vector2Int> middle = new LinkedList<Vector2Int>();
- if (!before.isEmpty())
- middle.add(before.getLast());
- middle.add(editPosition);
- if (!after.isEmpty())
- middle.add(after.getFirst());
- g.setColor(editDotColor);
- drawBoolGraphFromList(g, middle);
- }
-
- private void drawSnappingHint(Graphics2D g) {
-
- g.setColor(Color.RED);
-
- final float dash1[] = { 10.0f };
- final BasicStroke dashed = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1,
- 0.0f);
- g.setStroke(dashed);
- int halfheight = border + heightWithBorder / 2;
- g.drawLine(0, halfheight, widthWithBorder + 2 * border, halfheight);
-
- g.drawString("Snapping Threshold", 10, halfheight - 2);
- }
-
- private void drawBoolGraphFromList(Graphics2D g, LinkedList<Vector2Int> list) {
- if (list.size() <= 1)
- return;
- ListIterator<Vector2Int> iter = list.listIterator();
- LinkedList<Vector2Int> cornerPoints = new LinkedList<Vector2Int>();
- Vector2Int actual = list.getFirst();
- Path2D.Double path = new Path2D.Double();
- path.moveTo(actual.getX(), actual.getY());
- while (iter.hasNext()) {
- Vector2Int target = iter.next();
-
- path.lineTo(target.getX(), actual.getY());
- cornerPoints.add(new Vector2Int(target.getX(), actual.getY()));
- path.lineTo(target.getX(), target.getY());
- actual = target;
- }
- g.draw(path);
- g.setColor(dotColor);
- for (Vector2Int p : cornerPoints) {
- drawDot(g, p);
- }
- }
-
- private void drawDoubleGraph(Graphics2D g, List<UnitGraphPoint> points) {
- if (points.isEmpty())
- return;
- ListIterator<UnitGraphPoint> iter = points.listIterator();
- Vector2Int actual = iter.next().displayedPosition;
- Path2D.Double path = this.initBezier(actual);
- while (iter.hasNext()) {
- Vector2Int target = iter.next().displayedPosition;
- this.curveTo(path, actual, target);
- actual = target;
- }
- g.draw(path);
- }
-
- private void drawDoubleGraphInEditMode(Graphics2D g, Series series) {
- LinkedList<Vector2Int> before = new LinkedList<Vector2Int>();
- LinkedList<Vector2Int> after = new LinkedList<Vector2Int>();
- for (UnitGraphPoint p : series.points) {
- if (p.displayedPosition.getX() < editPosition.getX())
- before.add(p.displayedPosition);
- else
- after.add(p.displayedPosition);
- }
- drawUnitGraphFromList(g, before);
- drawUnitGraphFromList(g, after);
-
- LinkedList<Vector2Int> middle = new LinkedList<Vector2Int>();
- if (!before.isEmpty())
- middle.add(before.getLast());
- middle.add(editPosition);
- if (!after.isEmpty())
- middle.add(after.getFirst());
- g.setColor(editDotColor);
- drawUnitGraphFromList(g, middle);
- }
-
- private void drawUnitGraphFromList(Graphics2D g, LinkedList<Vector2Int> list) {
- if (list.size() <= 1)
- return;
- ListIterator<Vector2Int> iter = list.listIterator();
- Vector2Int actual = list.getFirst();
- Path2D.Double path = this.initBezier(actual);
- while (iter.hasNext()) {
- Vector2Int target = iter.next();
- curveTo(path, actual, target);
- actual = target;
- }
- g.draw(path);
- }
-
-
- private void updateRepresentativePositions() {
- for (Series series : seriesList) {
- for (UnitGraphPoint p : series.points) {
- p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- }
- }
- this.globalCurve.ifPresent(curve -> {
- for (UnitGraphPoint p : curve.points) {
- p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- }
- for (UnitGraphPoint p : curve.zeroLinePoints) {
- p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- }
- });
-
- }
-
- private void overrideUnitGraph(Series series, LinkedList<Vector2Float> stateCurve) {
- series.points.clear();
- for (Vector2Float p : stateCurve) {
- UnitGraphPoint point = new UnitGraphPoint(p);
- point.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
- series.points.add(point);
- }
- }
-
- private void calculateWidthHeight() {
- widthWithBorder = this.getWidth() - 2 * border;
- heightWithBorder = this.getHeight() - 2 * border;
- }
-
- private void saveGraph() {
- for (Series series : seriesList) {
- LinkedList<Vector2Float> actual = series.element.getStateGraph();
- actual.clear();
- for (UnitGraphPoint p : series.points) {
- actual.add(p.getPoint());
- }
- series.element.sampleGraph();
- }
- }
-
- private void removePointNearPosition(Series series, Vector2Int mPosition) {
- ListIterator<UnitGraphPoint> iter = series.points.listIterator();
- while (iter.hasNext()) {
- if (near(mPosition, iter.next().displayedPosition, series.type)) {
- iter.remove();
- break;
- }
- }
- }
- private void removePointsNearPosition(Vector2Int mPosition) {
- for (Series series : seriesList) {
- removePointNearPosition(series, mPosition);
- }
- }
- private Optional<Series> detectSeries(Vector2Int mPosition) {
- return seriesList.stream().min((a, b) -> {
- float minDistanceA = a.points.stream().map(point -> point.displayedPosition.getSquaredDistance(mPosition))
- .min(Float::compare).get();
- float minDistanceB = b.points.stream().map(point -> point.displayedPosition.getSquaredDistance(mPosition))
- .min(Float::compare).get();
- return Float.compare(minDistanceA, minDistanceB);
- });
- }
-
- private EditPointType detectStartEndPoint(Series series, Vector2Int mPosition) {
- UnitGraphPoint first = series.points.getFirst();
- UnitGraphPoint last = series.points.getLast();
- if (near(mPosition, first.displayedPosition, series.type))
- return EditPointType.StartPoint;
- else if (near(mPosition, last.displayedPosition, series.type))
- return EditPointType.EndPoint;
- else
- return EditPointType.Normal;
- }
-
- private boolean near(Vector2Int actual, Vector2Int target, GraphType graphType) {
- switch (graphType) {
- case boolGraph:
- int xDis = target.getX() - actual.getX();
- return xDis * xDis < clickThreshholdSquared;
- case doubleGraph:
- return actual.getSquaredDistance(target) < clickThreshholdSquared;
- default:
- return false;
- }
- }
-
- private void updateEditPointPosition(Vector2Int newPosition, EditPointType editPointType, GraphType graphType) {
-
- Vector2Int currentPosition = setInBounds(newPosition);
- if (editPointType != EditPointType.Normal) {
- attachToBorder(currentPosition, editPointType);
- }
- if (graphType == GraphType.boolGraph) {
- snapBoolean(currentPosition);
- }
- editPosition = currentPosition;
- }
-
- private Vector2Int setInBounds(Vector2Int p) {
- p.clampX(border, border + widthWithBorder);
- p.clampY(border, border + heightWithBorder);
- return p;
- }
-
- private Vector2Int snapBoolean(Vector2Int p) {
- if (p.getY() < border + heightWithBorder / 2) {
- p.setY(border);
- } else {
- p.setY(border + heightWithBorder);
- }
- return p;
- }
-
- private Vector2Int attachToBorder(Vector2Int p, EditPointType editPointType) {
- switch (editPointType) {
- case StartPoint:
- p.setX(border);
- break;
- case EndPoint:
- p.setX(border + widthWithBorder);
- break;
- default:
- break;
- }
- return p;
- }
-
- private void insertNewGraphPoint(Series series, Vector2Int pos) {
- setInBounds(pos);
- ListIterator<UnitGraphPoint> iter = series.points.listIterator();
- while (iter.hasNext()) {
- Vector2Int tempPosition = iter.next().displayedPosition;
- if (pos.getX() <= tempPosition.getX()) {
-
-
- iter.previous();
- iter.add(generateUnitGraphPoint(pos));
- break;
- }
- }
- if (!iter.hasNext())
- {
- iter.add(generateUnitGraphPoint(pos));
- }
- }
-
- private UnitGraphPoint generateUnitGraphPoint(Vector2Int pos) {
- UnitGraphPoint temp = new UnitGraphPoint((double) (pos.getX() - border) / (double) widthWithBorder,
- 1 - (double) (pos.getY() - border) / (double) heightWithBorder, true);
- temp.displayedPosition = pos;
- return temp;
- }
-
- @Override
- public void mouseDragged(MouseEvent e) {
- actualSeries.ifPresent(series -> {
- updateEditPointPosition(new Vector2Int(e.getPoint().x, e.getPoint().y), this.editPointType, series.type);
- updateGlobalCurve();
- repaint();
- });
- }
- @Override
- public void mouseMoved(MouseEvent e) {
- }
- @Override
- public void mouseClicked(MouseEvent e) {
- }
- @Override
- public void mouseEntered(MouseEvent e) {
- }
- @Override
- public void mouseExited(MouseEvent e) {
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- Vector2Int mPosition = new Vector2Int(e.getPoint().x, e.getPoint().y);
- actualSeries = detectSeries(mPosition);
- actualSeries.ifPresent(series -> {
- if (e.getButton() == MouseEvent.BUTTON3) {
-
- editPointType = detectStartEndPoint(series, mPosition);
- if (editPointType == EditPointType.Normal) {
- removePointsNearPosition(mPosition);
- repaint();
- }
- editMode = false;
- } else if (e.getButton() == MouseEvent.BUTTON1) {
-
- editPointType = detectStartEndPoint(series, mPosition);
- removePointsNearPosition(mPosition);
- updateEditPointPosition(mPosition, editPointType, series.type);
- editMode = true;
- repaint();
- }
- });
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- if (editMode && actualSeries.isPresent()) {
- for (Series series : seriesList) {
- this.insertNewGraphPoint(series, editPosition);
- }
- editMode = false;
- }
- saveGraph();
- updateGlobalCurve();
- repaint();
- }
-
- public void componentResized(ComponentEvent e) {
- calculateWidthHeight();
- updateRepresentativePositions();
- repaint();
- }
- @Override
- public void componentHidden(ComponentEvent e) {
- }
- @Override
- public void componentMoved(ComponentEvent e) {
- }
- @Override
- public void componentShown(ComponentEvent e) {
- }
-
- public void reset() {
- for (Series series : seriesList) {
- series.element.reset();
- overrideUnitGraph(series, series.element.getStateGraph());
- }
- repaint();
- }
-
-
- public void setUseLocalPeriod(boolean state) {
- for (Series series : seriesList) {
- series.element.setUseLocalPeriod(state);
- }
- }
- public void setLocalPeriod(int localLength) {
- for (Series series : seriesList) {
- series.element.setLocalPeriod(localLength);
- }
- }
- public boolean isLocalPeriedDifferentInSeries() {
- return seriesList.stream().map(series -> series.element.getLocalPeriod()).distinct().count() > 1;
- }
- public int getFirstLocalPeriod() {
- return seriesList.isEmpty() ? 0 : seriesList.get(0).element.getLocalPeriod();
- }
- public boolean isUsingLocalPeriod() {
- return seriesList.stream().anyMatch(series -> series.element.isUsingLocalPeriod());
- }
- }
|