// Entity Controller.
int direction;
Locatable location = (Location) n;
if (location != null) {
final Port port = (Port) location.getContainer();
Color fill;
if (!(port instanceof IOPort)) {
polygon.moveTo(-6, 6);
polygon.lineTo(0, 6);
polygon.lineTo(8, 0);
polygon.lineTo(0, -6);
polygon.lineTo(-6, -6);
fill = Color.black;
} else {
IOPort ioport = (IOPort) port;
polygon.moveTo(-8, 4);
if (ioport.isMultiport()) {
if (ioport instanceof ParameterPort) {
// It would be better to couple these to the
// parameters by position, but this is impossible
// in diva, so we assign a special color.
// FIXME: are Multiport ParameterPorts possible?
// FIXME: Should this be lightGrey?
fill = Color.darkGray;
} else {
fill = Color.white;
}
if (ioport.isOutput() && ioport.isInput()) {
polygon.lineTo(-4, 4);
polygon.lineTo(-4, 9);
polygon.lineTo(2, 4);
polygon.lineTo(2, 9);
polygon.lineTo(8, 4);
polygon.lineTo(12, 4);
polygon.lineTo(12, -4);
polygon.lineTo(8, -4);
polygon.lineTo(2, -9);
polygon.lineTo(2, -4);
polygon.lineTo(-4, -9);
polygon.lineTo(-4, -4);
polygon.lineTo(-8, -4);
} else if (ioport.isOutput()) {
polygon.lineTo(-8, 4);
polygon.lineTo(-8, 9);
polygon.lineTo(-2, 4);
polygon.lineTo(-2, 9);
polygon.lineTo(4, 4);
polygon.lineTo(12, 4);
polygon.lineTo(12, -4);
polygon.lineTo(4, -4);
polygon.lineTo(-2, -9);
polygon.lineTo(-2, -4);
polygon.lineTo(-8, -9);
} else if (ioport.isInput()) {
polygon.lineTo(-5, 4);
polygon.lineTo(-5, 9);
polygon.lineTo(1, 4);
polygon.lineTo(1, 9);
polygon.lineTo(7, 4);
polygon.lineTo(12, 0);
polygon.lineTo(7, -4);
polygon.lineTo(1, -9);
polygon.lineTo(1, -4);
polygon.lineTo(-5, -9);
polygon.lineTo(-5, -4);
polygon.lineTo(-8, -4);
} else {
throw new InternalErrorException(port, null,
"Port is neither input nor output");
}
} else {
if (ioport instanceof ParameterPort) {
// It would be better to couple these to the
// parameters by position, but this is impossible
// in diva, so we assign a special color.
// FIXME: what about multiports para
fill = Color.lightGray;
} else {
fill = Color.black;
}
if (ioport.isOutput() && ioport.isInput()) {
polygon.lineTo(0, 4);
polygon.lineTo(0, 9);
polygon.lineTo(6, 4);
polygon.lineTo(12, 4);
polygon.lineTo(12, -4);
polygon.lineTo(6, -4);
polygon.lineTo(0, -9);
polygon.lineTo(0, -4);
polygon.lineTo(-8, -4);
} else if (ioport.isOutput()) {
polygon.lineTo(-8, 9);
polygon.lineTo(-2, 4);
polygon.lineTo(12, 4);
polygon.lineTo(12, -4);
polygon.lineTo(-2, -4);
polygon.lineTo(-8, -9);
} else if (ioport.isInput()) {
polygon.lineTo(0, 4);
polygon.lineTo(0, 9);
//polygon.lineTo(6, 4);
polygon.lineTo(12, 0);
//polygon.lineTo(6, -4);
polygon.lineTo(0, -9);
polygon.lineTo(0, -4);
polygon.lineTo(-8, -4);
} else {
throw new InternalErrorException(port, null,
"Port is neither input nor output");
}
}
}
polygon.closePath();
if (port instanceof ParameterPort) {
// Create a PaintedList that has two PaintedPaths,
// the usual icon and the > shape.
// PaintedList paintedList = new PaintedList();
// paintedList.add(new PaintedPath(polygon, (float) 1.5, fill));
// Polygon2D.Double polygon2 = new Polygon2D.Double();
// //polygon2.moveTo(-15,-15);
// //polygon2.lineTo(-3,-5);
// //polygon2.lineTo(-16,-5);
// polygon2.moveTo(5, 9);
// polygon2.lineTo(17, 0);
// polygon2.lineTo(5, -9);
// polygon2.lineTo(5, -9);
// polygon2.lineTo(17, 0);
// polygon2.lineTo(5, 9);
// //polygon2.lineTo(5, -9);
// //polygon2.lineTo(17, 0);
// //polygon2.lineTo(5, 9);
// polygon2.closePath();
// paintedList.add(new PaintedPath(polygon2, (float) 1.0, Color.black));
// figure = new PaintedFigure(paintedList);
figure = new BasicFigure(polygon, new Color(0, 0, 0, 0),
(float) 0.0);
} else {
figure = new BasicFigure(polygon, fill, (float) 1.5);
}
if (!(port instanceof IOPort)) {
direction = SwingConstants.NORTH;
} else {
IOPort ioport = (IOPort) port;
if (ioport.isInput() && ioport.isOutput()) {
direction = SwingConstants.NORTH;
} else if (ioport.isInput()) {
direction = SwingConstants.EAST;
} else if (ioport.isOutput()) {
direction = SwingConstants.WEST;
} else {
// should never happen
direction = SwingConstants.NORTH;
}
}
double normal = CanvasUtilities.getNormal(direction);
String name = port.getName();
Rectangle2D backBounds = figure.getBounds();
figure = new CompositeFigure(figure) {
// Override this because we want to show the type.
// It doesn't work to set it once because the type
// has not been resolved, and anyway, it may
// change. NOTE: This is copied from above.
public String getToolTipText() {
return _portTooltip(port);
}
};
if ((name != null) && !name.equals("")
&& !(port instanceof ParameterPort)) {
LabelFigure label = new LabelFigure(name, _labelFont, 1.0,
SwingConstants.SOUTH_WEST);
// Shift the label slightly right so it doesn't
// collide with ports.
label.translateTo(backBounds.getX(), backBounds.getY());
((CompositeFigure) figure).add(label);
}
if (port instanceof IOPort) {
// Create a diagonal connector for multiports, if necessary.
IOPort ioPort = (IOPort) port;
if (ioPort.isMultiport()) {
int numberOfLinks = ioPort.insideRelationList().size();
if (numberOfLinks > 1) {
// The diagonal is necessary.
// Line depends on the orientation.
double startX;
// The diagonal is necessary.
// Line depends on the orientation.
double startY;
// The diagonal is necessary.
// Line depends on the orientation.
double endX;
// The diagonal is necessary.
// Line depends on the orientation.
double endY;
Rectangle2D bounds = figure.getShape()
.getBounds2D();
double x = bounds.getX();
double y = bounds.getY();
double width = bounds.getWidth();
double height = bounds.getHeight();
int extent = numberOfLinks - 1;
if (direction == SwingConstants.EAST) {
startX = x + width;
startY = y + (height / 2);
endX = startX
+ (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
endY = startY
+ (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
} else if (direction == SwingConstants.WEST) {
startX = x;
startY = y + (height / 2);
endX = startX
- (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
endY = startY
- (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
} else if (direction == SwingConstants.NORTH) {
startX = x + (width / 2);
startY = y;
endX = startX
- (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
endY = startY
- (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
} else {
startX = x + (width / 2);
startY = y + height;
endX = startX
+ (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
endY = startY
+ (extent * IOPortController.MULTIPORT_CONNECTION_SPACING);
}
Line2D line = new Line2D.Double(startX, startY,
endX, endY);
Figure lineFigure = new BasicFigure(line, fill,
(float) 2.0);
((CompositeFigure) figure).add(lineFigure);
}
}
figure = new PortTerminal(ioPort, figure, normal, true);
} else {
Site tsite = new PerimeterSite(figure, 0);
tsite.setNormal(normal);
tsite = new FixedNormalSite(tsite);
figure = new TerminalFigure(figure, tsite) {
// Override this because the tooltip may
// change over time. I.e., the port may
// change from being an input or output, etc.
public String getToolTipText() {
return _portTooltip(port);
}
};
}
// Have to do this as well or awt will not render a tooltip.
figure.setToolTipText(port.getName());
} else {
polygon.moveTo(0, 0);
polygon.lineTo(0, 10);
polygon.lineTo(12, 0);
polygon.lineTo(0, -10);