package org.seqcode.viz.paintable; import java.awt.Graphics; import java.util.Collection; import java.util.LinkedList; import javax.swing.Action; public class BorderPaintable extends AbstractPaintable { private Paintable fTop, fBottom, fLeft, fRight, fCenter; private double fTopFrac, fBottomFrac, fLeftFrac, fRightFrac; public BorderPaintable(Paintable center) { super(); fTopFrac = fBottomFrac = fLeftFrac = fRightFrac = 0.1; fTop = fBottom = fLeft = fRight = null; fCenter = center; fCenter.addPaintableChangedListener(this); } public double getTopFrac() { return fTopFrac; } public double getBottomFrac() { return fBottomFrac; } public double getLeftFrac() { return fLeftFrac; } public double getRightFrac() { return fRightFrac; } public void setTop(Paintable p) { if(fTop != null) { fTop.removePaintableChangedListener(this); } fTop = p; dispatchChangedEvent(); if(p != null) { p.addPaintableChangedListener(this); } } public void setBottom(Paintable p) { if(fBottom != null) { fBottom.removePaintableChangedListener(this); } fBottom = p; dispatchChangedEvent(); if(p != null) { p.addPaintableChangedListener(this); } } public void setLeft(Paintable p) { if(fLeft != null) { fLeft.removePaintableChangedListener(this); } fLeft = p; dispatchChangedEvent(); if(p != null) { p.addPaintableChangedListener(this); } } public void setRight(Paintable p) { if(fRight != null) { fRight.removePaintableChangedListener(this); } fRight = p; dispatchChangedEvent(); if(p != null) { p.addPaintableChangedListener(this); } } public Collection<Action> getPaintableActions() { LinkedList<Action> lst = new LinkedList<Action>(); lst.addAll(fCenter.getPaintableActions()); if(fTop != null) { lst.addAll(fTop.getPaintableActions()); } if(fBottom != null) { lst.addAll(fBottom.getPaintableActions()); } if(fLeft != null) { lst.addAll(fLeft.getPaintableActions()); } if(fRight != null) { lst.addAll(fRight.getPaintableActions()); } return lst; } public void registerClick(double xf, double yf) { double x1 = 0.0; double x2 = 1.0; double y1 = 0.0; double y2 = 1.0; if(fLeft != null) { x1 = fLeftFrac; } if(fRight != null) { x2 = 1.0 - fRightFrac; } if(fTop != null) { y1 = fTopFrac; } if(fBottom != null) { y2 = 1.0 - fBottomFrac; } if(x1 <= xf && xf <= x2 && y1 <= yf && yf <= y2) { fCenter.registerClick((xf - x1) / (x2 - x1), (yf - y1) / (y2 - y1)); } else { if(fLeft != null && xf < x1 && y1 <= yf && yf <= y2) { fLeft.registerClick(xf / x1, (yf - y1) / (y2 - y1)); } if(fRight != null && xf > x2 && y1 <= yf && yf <= y2) { fRight.registerClick((xf - x2) / (1.0 - x2), (yf - y1) / (y2 - y1)); } if(fTop != null && yf < y1 && x1 <= xf && xf <= x2) { fTop.registerClick((xf - x1) / (x2 - x1), yf / y1); } if(fBottom != null && yf > y2 && x1 <= xf && xf <= x2) { fBottom.registerClick((xf - x1) / (x2 - x1), (yf - y2) / (1.0 - y2)); } } } public void paintItem(Graphics g, int x1, int y1, int x2, int y2) { int xi1 = x1; int xi2 = x2; int yi1 = y1; int yi2 = y2; int w = x2 - x1; int h = y2 - y1; if(fLeft != null) { xi1 = x1 + (int)Math.round(fLeftFrac * (double)w); } if(fRight != null) { xi2 = x2 - (int)Math.round(fRightFrac * (double)w); } if(fTop != null) { yi1 = y1 + (int)Math.round(fTopFrac * (double)h); } if(fBottom != null) { yi2 = y2 - (int)Math.round(fBottomFrac * (double)h); } fCenter.paintItem(g, xi1, yi1, xi2, yi2); if(fLeft != null) { fLeft.paintItem(g, x1, yi1, xi1, yi2); } if(fRight != null) { fRight.paintItem(g, xi2, yi1, x2, yi2); } if(fTop != null) { fTop.paintItem(g, xi1, y1, xi2, yi1); } if(fBottom != null) { fBottom.paintItem(g, xi1, yi2, xi2, y2); } } }