if (source instanceof LayerEvent) {
_sourceType = CANVAS_TYPE;
// Action activated using an ActionInteractor.
LayerEvent event = (LayerEvent) source;
CanvasLayer layer = event.getLayerSource();
GraphPane pane = (GraphPane) layer.getCanvasPane();
GraphController controller = pane.getGraphController();
GraphModel model = controller.getGraphModel();
_figure = event.getFigureSource();
// Set the target.
if (_figure == null) {
_target = (NamedObj) model.getRoot();
} else {
Object object = _figure.getUserObject();
_target = (NamedObj) model.getSemanticObject(object);
}
// Set the position.
_x = event.getX();
_y = event.getY();
// Set the parent.
CanvasPane canvasPane = layer.getCanvasPane();
parent = canvasPane.getCanvas();
} else if (source instanceof JMenuItem) {
// Action activated using a context menu or submenu.
JMenuItem item = (JMenuItem) source;
// Find the original context menu.
Component contextMenu = item.getParent();
if (!(contextMenu instanceof JContextMenu)) {
// Probably a submenu.
// FIXME: This only supports one level of submenus.
if (contextMenu instanceof JPopupMenu) {
contextMenu = ((JPopupMenu) contextMenu).getInvoker();
}
if (contextMenu instanceof JMenu) {
contextMenu = contextMenu.getParent();
}
}
if (contextMenu instanceof JContextMenu) {
_sourceType = CONTEXTMENU_TYPE;
JContextMenu menu = (JContextMenu) contextMenu;
parent = menu.getInvoker();
_target = (NamedObj) menu.getTarget();
_x = item.getX();
_y = item.getY();
} else {
// Not implicit location.. should there be?
_sourceType = MENUBAR_TYPE;
}
/*
} else if (source instanceof JMenuItem) {
// Action activated using a context menu.
JMenuItem item = (JMenuItem) source;
if (item.getParent() instanceof JContextMenu) {
_sourceType = CONTEXTMENU_TYPE;
JContextMenu menu = (JContextMenu) item.getParent();
parent = menu.getInvoker();
_target = (NamedObj) menu.getTarget();
_x = item.getX();
_y = item.getY();
} else {
// Not implicit location.. should there be?
_sourceType = MENUBAR_TYPE;
}
*/
} else if (source instanceof JButton) {
// presumably we are in a toolbar...
_sourceType = TOOLBAR_TYPE;
_target = null;
parent = ((Component) source).getParent();
} else if (source instanceof JGraph) {
// This is an absurdly convoluted way to get the info we need.
// But there seems to be no other way.
// This is an architectural flaw in vergil.
GraphPane pane = ((JGraph) source).getGraphPane();
FigureLayer layer = pane.getForegroundLayer();
CanvasComponent currentFigure = layer.getCurrentFigure();
GraphController controller = pane.getGraphController();
GraphModel model = controller.getGraphModel();
if (currentFigure != null) {
_target = null;
while ((_target == null) && (currentFigure != null)) {
Object object = currentFigure;
if (object instanceof Figure) {
object = ((Figure) currentFigure).getUserObject();
}
_target = (NamedObj) model.getSemanticObject(object);
currentFigure = currentFigure.getParent();
}
// NOTE: _target may end up null here!
if (_target == null) {
throw new InternalErrorException(
"Internal error: Figure has no associated Ptolemy II object!");
}
} else {
_target = (NamedObj) model.getRoot();
}
_sourceType = HOTKEY_TYPE;
// FIXME: set _x and _y. How to do this?
_x = 0;
_y = 0;
// Set the parent.
CanvasPane canvasPane = layer.getCanvasPane();
parent = canvasPane.getCanvas();
} else {
_sourceType = null;
_target = null;
parent = null;