package org.expeditee.items.MagneticConstraint.Utilities; import java.awt.Rectangle; import java.util.*; import org.expeditee.items.Item; @SuppressWarnings("serial") public class Line extends LinkedList { private Line() { super(); } private Line(final Line toCopy) { super(toCopy); } public static Line getLineFromToken(final Item token) { if(token == null) return new Line(); else return getLineFromToken(token, new Line()); } public static Line getLineContainingToken(final Item token) { if(token == null) return new Line(); Item current = token; while(current.getMagnetizedItemLeft() != -1) current = current.getParent().getItemWithID(current.getMagnetizedItemLeft()); return getLineFromToken(current, new Line()); } public static int getLineHeight(final Line line) { return (int) (line.getBoundingBox().getHeight() * 1.2); } public Line setX(final int newX) { int delta = newX - this.getFirst().getX(); deltaX(delta); return this; } public Line setY(final int newY) { int delta = newY - this.getFirst().getY(); deltaY(delta); return this; } public Line deltaX(final int delta) { for(final Item token : this) token.setPosition(token.getX() + delta, token.getY()); return this; } public Line deltaY(final int delta) { for(final Item token : this) token.setPosition(token.getX(), token.getY() + delta); return this; } public Rectangle getBoundingBox() { final Rectangle rect = new Rectangle(this.getFirst().getX(), this.getFirst().getY(), this.getFirst().getBoundsWidth(), this.getFirst().getBoundsHeight()); for(final Item token : this) rect.add(new Rectangle(token.getX(), token.getY(), token.getBoundsWidth(), token.getBoundsHeight())); return rect; } public Line next() { final Item lastInThisLine = this.get(this.size() - 1); if(lastInThisLine.getMagnetizedItemBottom() == -1) return null; else return getLineFromToken(this.get(0).getParent().getItemWithID(lastInThisLine.getMagnetizedItemBottom())); } public Line last() { final Item firstInThisLine = this.get(0); if(firstInThisLine.getMagnetizedItemTop() == -1) return null; else return getLineContainingToken(this.get(0).getParent().getItemWithID(firstInThisLine.getMagnetizedItemTop())); } private static Line getLineFromToken(final Item token, final Line acc) { if(token.getMagnetizedItemRight() == -1) { acc.add(token); return acc; } else { final Line lineSoFar = new Line(acc); lineSoFar.add(token); return getLineFromToken(token.getParent().getItemWithID(token.getMagnetizedItemRight()), lineSoFar); } } }