package com.baselet.gui.listener; import java.awt.event.ComponentAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.Collections; import java.util.Vector; import com.baselet.control.basics.Converter; import com.baselet.control.basics.geom.Point; import com.baselet.control.enums.Direction; import com.baselet.diagram.CurrentDiagram; import com.baselet.diagram.DiagramHandler; import com.baselet.diagram.DrawPanel; import com.baselet.diagram.SelectorFrame; import com.baselet.diagram.SelectorOld; import com.baselet.element.interfaces.GridElement; import com.baselet.element.sticking.StickableMap; import com.baselet.gui.CurrentGui; import com.baselet.gui.command.Command; import com.baselet.gui.command.Controller; import com.baselet.gui.command.Macro; import com.baselet.gui.command.Move; public abstract class UniversalListener extends ComponentAdapter implements MouseListener, MouseMotionListener { protected DiagramHandler handler; protected DrawPanel diagram; public SelectorOld selector; protected Controller controller; private int _xOffset, _yOffset; private boolean disableElementMovement = true; // is true after mouseReleased until the next mousePressed AND if the lasso is active private int old_x_eff, old_y_eff; private int new_x_eff, new_y_eff; protected UniversalListener(DiagramHandler handler) { this.handler = handler; diagram = handler.getDrawPanel(); selector = diagram.getSelector(); controller = handler.getController(); } @Override public void mouseClicked(MouseEvent arg0) {} @Override public void mouseEntered(MouseEvent me) {} @Override public void mousePressed(MouseEvent me) { disableElementMovement = false; CurrentGui.getInstance().getGui().requestFocus(); // to avoid beeing stuck in the propertyPanel Point off = getOffset(me); _xOffset = off.x; _yOffset = off.y; // everytime a mouse is pressed within a listener the gui gets the current diagram! CurrentDiagram.getInstance().setCurrentDiagramHandlerAndZoom(handler); } @Override public void mouseReleased(MouseEvent me) { disableElementMovement = true; if (selector.isSelectorFrameActive()) { SelectorFrame selframe = selector.getSelectorFrame(); diagram.remove(selframe); selector.deselectAll(); selector.multiSelect(Converter.convert(selframe.getBounds())); selector.setSelectorFrameActive(false); diagram.repaint(); } diagram.updatePanelAndScrollbars(); } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseMoved(MouseEvent me) { } @Override public void mouseDragged(MouseEvent me) { // Get new mouse coordinates if (selector.isSelectorFrameActive()) { selector.getSelectorFrame().resizeTo(getOffset(me).getX(), getOffset(me).getY()); disableElementMovement = true; return; } else if (disableElementMovement()) { return; } Point off = getOffset(me); int xNewOffset = off.x; int yNewOffset = off.y; int gridSize = CurrentDiagram.getInstance().getDiagramHandler().getGridSize(); new_x_eff = gridSize * ((xNewOffset - gridSize / 2) / gridSize); new_y_eff = gridSize * ((yNewOffset - gridSize / 2) / gridSize); old_x_eff = gridSize * ((_xOffset - gridSize / 2) / gridSize); old_y_eff = gridSize * ((_yOffset - gridSize / 2) / gridSize); _xOffset = xNewOffset; _yOffset = yNewOffset; } // only call after mouseDragged protected final boolean disableElementMovement() { return disableElementMovement; } // only call after mouseDragged protected final Point getOldCoordinate() { return new Point(old_x_eff, old_y_eff); } // only call after mouseDragged protected final Point getNewCoordinate() { return new Point(new_x_eff, new_y_eff); } protected abstract Point getOffset(MouseEvent me); protected void dragDiagram() { if (disableElementMovement()) { return; } Point newp = getNewCoordinate(); Point oldp = getOldCoordinate(); int diffx = newp.x - oldp.x; int diffy = newp.y - oldp.y; if (diffx != 0 || diffy != 0) { Vector<Command> moveCommands = new Vector<Command>(); for (GridElement e : diagram.getGridElements()) { moveCommands.add(new Move(Collections.<Direction> emptySet(), e, diffx, diffy, oldp, false, false, true, StickableMap.EMPTY_MAP)); } controller.executeCommand(new Macro(moveCommands)); } } }