/* VisualReferenceBin.java created 2007-11-30
*
*/
package org.signalml.app.view.montage.visualreference;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.Iterator;
import java.util.LinkedHashSet;
import org.signalml.util.Util;
/** VisualReferenceBin
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public abstract class VisualReferenceBin {
public static final int HEADER_HEIGHT = 20;
protected String name;
protected Point location;
protected Dimension size;
protected Insets margin;
protected int hGap = 20;
protected int vGap = 20;
protected int maxHeight = 0;
protected LinkedHashSet<VisualReferenceSourceChannel> channels = new LinkedHashSet<VisualReferenceSourceChannel>();
protected boolean valid = false;
protected boolean positioned = false;
public VisualReferenceBin() {
location = new Point(0,0);
margin = new Insets(4,4,4,4);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Point getLocation() {
return location;
}
public void setLocation(Point location) {
if (!Util.equalsWithNulls(this.location, location)) {
this.location = location;
positioned = false;
}
}
public int getHGap() {
return hGap;
}
public void setHGap(int gap) {
if (hGap != gap) {
valid = false;
positioned = false;
hGap = gap;
}
}
public int getVGap() {
return vGap;
}
public void setVGap(int gap) {
if (vGap != gap) {
valid = false;
positioned = false;
vGap = gap;
}
}
public Dimension getSize() {
if (!valid) {
validate();
}
return size;
}
public Dimension getCellSize() {
int w = 0;
int h = 0;
Rectangle r;
for (VisualReferenceSourceChannel channel : channels) {
r = channel.getShape().getBounds();
if (w < r.width) {
w = r.width;
}
if (h < r.height) {
h = r.height;
}
}
return new Dimension(w,h);
}
public Rectangle getBounds() {
if (!valid) {
validate();
}
return new Rectangle(location, size);
}
public Insets getMargin() {
return margin;
}
public void setMargin(Insets margin) {
if (!this.margin.equals(margin)) {
this.margin = margin;
positioned = false;
valid = false;
}
}
public int getMaxHeight() {
return maxHeight;
}
public void setMaxHeight(int maxHeight) {
if (this.maxHeight != maxHeight) {
this.maxHeight = maxHeight;
positioned = false;
valid = false;
}
}
public int getMinHeight() {
return HEADER_HEIGHT + margin.top + margin.bottom + VisualReferenceSourceChannel.CIRCLE_DIAMETER;
}
public boolean add(VisualReferenceSourceChannel channel) {
valid = false;
positioned = false;
return channels.add(channel);
}
public boolean remove(VisualReferenceSourceChannel channel) {
valid = false;
positioned = false;
return channels.remove(channel);
}
public void clear() {
channels.clear();
positioned = false;
valid = false;
}
public boolean contains(Object o) {
return channels.contains(o);
}
public boolean isEmpty() {
return channels.isEmpty();
}
public Iterator<VisualReferenceSourceChannel> iterator() {
return channels.iterator();
}
public int size() {
return channels.size();
}
public boolean isValid() {
return valid;
}
public boolean isPositioned() {
return positioned;
}
protected abstract void validate();
protected abstract void reposition();
}