package pipe.handlers;
import pipe.actions.gui.DeletePetriNetComponentAction;
import pipe.actions.gui.PipeApplicationModel;
import pipe.constants.GUIConstants;
import pipe.controllers.DragManager;
import pipe.controllers.PetriNetController;
import pipe.controllers.SelectionManager;
import uk.ac.imperial.pipe.models.petrinet.PetriNetComponent;
import javax.swing.*;
import java.awt.Container;
import java.awt.event.MouseEvent;
/**
* Class used to implement methods corresponding to mouse events on all
* PetriNetObjects.
*
* @author unknown
*/
public class PetriNetObjectHandler<T extends PetriNetComponent> extends javax.swing.event.MouseInputAdapter {
// justSelected: set to true on press, and false on release;
private static boolean justSelected = false;
/**
* Container of the component
*/
protected final Container contentPane;
/**
* Controller for the Petri net the component is contained in
*/
protected final PetriNetController petriNetController;
/**
* Main PIPE application model
*/
protected final PipeApplicationModel applicationModel;
/**
* Petri net component
*/
protected final T component;
/**
* Drag manager for the Petri ent
*/
protected final DragManager dragManager;
/**
* true if dragging is taking place
*/
protected boolean isDragging = false;
/**
* true if pop ups are enabled
*/
protected boolean enablePopup = false;
/**
* Constructor
* @param contentPane parent pane of the view of the component
* @param component Petri net component
* @param controller Petri net controller for the Petri net the component is contained in
* @param applicationModel main PIPE application model
*/
PetriNetObjectHandler(Container contentPane, T component, PetriNetController controller,
PipeApplicationModel applicationModel) {
this.contentPane = contentPane;
this.component = component;
petriNetController = controller;
this.applicationModel = applicationModel;
dragManager = petriNetController.getDragManager();
}
/**
* When the mouse is pressed on a component if editions and pop ups
* are allowed then the pop up menu appears
* @param e mouse event
*/
@Override
public void mousePressed(MouseEvent e) {
if (applicationModel.isEditionAllowed() && enablePopup) {
checkForPopup(e);
}
}
/**
* Displays the popup menu in the top left
* of the item
*
* @param e event
*/
private void checkForPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
JPopupMenu m = getPopup(e);
m.show(e.getComponent(), 0, 0);
}
}
/**
* Creates the popup menu that the user will see when they right click on a
* component
*
* @param e mouse event
* @return popup menu
*/
protected JPopupMenu getPopup(MouseEvent e) {
JPopupMenu popup = new JPopupMenu();
JMenuItem menuItem = new JMenuItem(new DeletePetriNetComponentAction(component, petriNetController));
menuItem.setText("Delete");
popup.add(menuItem);
return popup;
}
/**
* Event handler for when the user releases the mouse, used in conjunction
* with mouseDragged and mouseReleased to implement the moving action
*/
@Override
public void mouseReleased(MouseEvent e) {
if (isDragging) {
dragManager.finishDrag();
}
isDragging = false;
// Have to check for popup here as well as on pressed for crossplatform!!
if (applicationModel.isEditionAllowed() && enablePopup) {
checkForPopup(e);
}
if (!SwingUtilities.isLeftMouseButton(e)) {
return;
}
if (applicationModel.getMode() == GUIConstants.SELECT && !justSelected) {
if (e.isShiftDown()) {
petriNetController.deselect(component);
} else {
SelectionManager selectionManager = petriNetController.getSelectionManager();
selectionManager.clearSelection();
petriNetController.deselect(component);
}
}
justSelected = false;
}
/**
* Handler for dragging objects around
* @param e mouse event
*/
@Override
public void mouseDragged(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e)) {
return;
}
if (applicationModel.getMode() == GUIConstants.SELECT) {
if (component.isDraggable() && !isDragging) {
isDragging = true;
dragManager.saveStartingDragCoordinates();
}
}
if (!e.isConsumed()) {
MouseEvent newEvent = SwingUtilities.convertMouseEvent(e.getComponent(), e, contentPane);
dragManager.drag(newEvent.getPoint());
}
}
}