package pipe.gui; import pipe.actions.gui.GuiAction; import pipe.controllers.PetriNetController; import pipe.controllers.application.PipeApplicationController; import pipe.gui.widgets.EscapableDialog; import pipe.historyActions.LayoutPetriNetEvent; import pipe.views.PipeApplicationView; import uk.ac.imperial.pipe.models.petrinet.PetriNet; import uk.ac.imperial.pipe.models.petrinet.Place; import uk.ac.imperial.pipe.models.petrinet.Transition; import javax.swing.*; import java.awt.Container; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.HashMap; import java.util.Map; public class LayoutAction extends GuiAction { private final PipeApplicationController pipeApplicationController; private final PipeApplicationView applicationView; public LayoutAction(PipeApplicationController pipeApplicationController, PipeApplicationView applicationView) { super("Layout", "Layout", KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK); this.pipeApplicationController = pipeApplicationController; this.applicationView = applicationView; } @Override public void actionPerformed(ActionEvent e) { PetriNetController petriNetController = pipeApplicationController.getActivePetriNetController(); PetriNet petriNet = petriNetController.getPetriNet(); showLayoutEditor(petriNet); } public void showLayoutEditor(PetriNet petriNet) { EscapableDialog guiDialog = new EscapableDialog(applicationView, "PIPE 5", true); Container contentPane = guiDialog.getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); final Map<String, Point> previousLocations = getLocations(petriNet); LayoutForm formLayout = new LayoutForm(petriNet, new LayoutForm.ChangeAction() { @Override public void changed(PetriNet petriNet) { registerUndoEvent(new LayoutPetriNetEvent(petriNet, previousLocations, getLocations(petriNet))); } }); contentPane.add(formLayout.getMainPanel()); guiDialog.setResizable(false); guiDialog.pack(); guiDialog.setLocationRelativeTo(null); guiDialog.setVisible(true); } private Map<String, Point> getLocations(PetriNet petriNet) { Map<String, Point> pointMap = new HashMap<>(); for (Place place : petriNet.getPlaces()) { pointMap.put(place.getId(), new Point(place.getX(), place.getY())); } for (Transition transition : petriNet.getTransitions()) { pointMap.put(transition.getId(), new Point(transition.getX(), transition.getY())); } return pointMap; } }