package jadex.application.space.envsupport.observer.gui.plugin; import jadex.application.space.envsupport.environment.ISpaceObject; import jadex.application.space.envsupport.math.IVector2; import jadex.application.space.envsupport.observer.graphics.IViewport; import jadex.application.space.envsupport.observer.graphics.drawable.DrawableCombiner; import jadex.application.space.envsupport.observer.gui.ObserverCenter; import jadex.application.space.envsupport.observer.perspective.Perspective2D; import jadex.commons.SimplePropertyObject; import java.awt.Canvas; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public abstract class AbstractInteractionPlugin extends SimplePropertyObject implements IObserverCenterPlugin { private DrawableCombiner marker; private ObserverCenter obsCenter; private List listeners; private MouseListener clickListener; private ChangeListener objectListener; private boolean initialized = false; /** * Adds a MouseListener. * @param listener The MouseListener. */ public void addMouseListener(MouseListener listener) { if (listeners == null) listeners = new ArrayList(); listeners.add(listener); } /** * Removes a MouseListener. * @param listener The MouseListener. */ public void removeMouseListener(MouseListener listener) { if (listeners != null) listeners.remove(listener); } /** * Initializes the plugin. This method is invoked once when the ObserverCenter becomes available. * @param center The OberverCenter. */ protected abstract void initialize(ObserverCenter center); /** * This method is executed when the plugins starts. * @param center The OberverCenter. */ protected void startUp(ObserverCenter center) { } /** * This method is executed when the plugins shuts down. * @param center The OberverCenter. */ protected void cleanUp(ObserverCenter center) { } /** * This method receives space objects on left-clicks. * @param object space object that was clicked. */ protected void handleObjectClick(ISpaceObject object) { } public void refresh() { } public String getIconPath() { return "jadex/application/space/envsupport/observer/images/introspector_icon.png"; } @Override public final void shutdown() { // TODO Auto-generated method stub ((Perspective2D) obsCenter.getSelectedPerspective()).setMarkerDrawCombiner(marker); ((Canvas) ((Perspective2D) obsCenter.getSelectedPerspective()).getView()).removeMouseListener(clickListener); obsCenter.removeSelectedObjectListener(objectListener); cleanUp(obsCenter); } @Override public final void start(ObserverCenter main) { if (!initialized) { initialize(main); obsCenter = main; clickListener = new MouseListener() { @Override public void mouseReleased(MouseEvent e) { e.setSource(AbstractInteractionPlugin.this); if (listeners != null) for (Iterator it = listeners.iterator(); it.hasNext(); ) ((MouseListener) it.next()).mouseReleased(e); } @Override public void mousePressed(MouseEvent e) { e.setSource(AbstractInteractionPlugin.this); if (listeners != null) for (Iterator it = listeners.iterator(); it.hasNext(); ) ((MouseListener) it.next()).mousePressed(e); } @Override public void mouseExited(MouseEvent e) { e.setSource(AbstractInteractionPlugin.this); if (listeners != null) for (Iterator it = listeners.iterator(); it.hasNext(); ) ((MouseListener) it.next()).mouseExited(e); } @Override public void mouseEntered(MouseEvent e) { e.setSource(AbstractInteractionPlugin.this); if (listeners != null) for (Iterator it = listeners.iterator(); it.hasNext(); ) ((MouseListener) it.next()).mouseEntered(e); } public void mouseClicked(MouseEvent e) { e.setSource(AbstractInteractionPlugin.this); if (listeners != null) for (Iterator it = listeners.iterator(); it.hasNext(); ) ((MouseListener) it.next()).mouseClicked(e); } }; objectListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (obsCenter.getSelectedPerspective().getSelectedObject() != null) handleObjectClick((ISpaceObject) obsCenter.getSelectedPerspective().getSelectedObject()); } }; initialized = true; } main.getSelectedPerspective().setSelectedObject(null); marker = ((Perspective2D) main.getSelectedPerspective()).getMarkerDrawCombiner(); ((Perspective2D) main.getSelectedPerspective()).setMarkerDrawCombiner(new DrawableCombiner()); ((Canvas) ((Perspective2D) main.getSelectedPerspective()).getView()).addMouseListener(clickListener); main.addSelectedObjectListener(objectListener); startUp(main); } public IVector2 getWorldCoordinates(Point p) { IViewport viewport = ((Perspective2D) obsCenter.getSelectedPerspective()).getViewport(); return viewport.getWorldCoordinates((int) p.getX(), (int) p.getY()); } }