package pipe.handlers;
import pipe.controllers.PetriNetController;
import pipe.actions.gui.PipeApplicationModel;
import pipe.gui.widgets.EscapableDialog;
import pipe.gui.widgets.PlaceEditorPanel;
import uk.ac.imperial.pipe.models.petrinet.Place;
import javax.swing.*;
import java.awt.Container;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
/**
* Handles place actions
*/
public class PlaceHandler
extends ConnectableHandler<Place> {
/**
* Constructor
* @param contentpane parent pane of the view
* @param place place model
* @param controller Petri net controller of the Petri net the place belongs to
* @param applicationModel main PIPE application model
*/
public PlaceHandler(Container contentpane, Place place, PetriNetController controller, PipeApplicationModel applicationModel) {
super(contentpane, place, controller, applicationModel);
}
/**
* Creates the pop up meny for a place containing the options
* Edit place
*
* @param e event
* @return the pop up menu for the place
*/
@Override
protected JPopupMenu getPopup(MouseEvent e) {
int index = 0;
JPopupMenu popup = super.getPopup(e);
JMenuItem menuItem = new JMenuItem("Edit Place");
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showEditor();
}
};
menuItem.addActionListener(actionListener);
popup.insert(menuItem, index++);
popup.insert(new JPopupMenu.Separator(), index);
return popup;
}
/**
* Shows the Place editor dialog where the place components can be edited
*/
public void showEditor() {
// Build interface
Window window = SwingUtilities.getWindowAncestor(contentPane);
EscapableDialog guiDialog = new EscapableDialog(window, "PIPE5", true);
Container contentPane = guiDialog.getContentPane();
// 1 Set layout
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
// 2 Add Place editor
contentPane.add(
new PlaceEditorPanel(guiDialog.getRootPane(), petriNetController.getPlaceController(component),
petriNetController));
guiDialog.setResizable(false);
// Make window fit contents' preferred size
guiDialog.pack();
// Move window to the middle of the screen
guiDialog.setLocationRelativeTo(null);
guiDialog.setVisible(true);
}
}