package vooga.towerdefense.gameeditor.gamemaker.editorscreens; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import vooga.towerdefense.gameeditor.controller.GameEditorController; /** * Super class that makes common behavior for each of * the editor screens. * * @author Angelica Schwartz * */ public abstract class GameEditorScreen extends JPanel { public static final int TEXT_FIELD_WIDTH = 20; private static final long serialVersionUID = 1L; private static final String ADD_BUTTON_TEXT = "Add to game"; private static final String FINISH_BUTTON_TEXT = "Next section"; private String myNextScreenName = "vooga.towerdefense.gameeditor.gamemaker.editorscreens."; private String myTitle = " MAKING SCREEN"; private MouseAdapter myMouseAdapter; private JButton myAddButton; private JButton myFinishButton; private Dimension mySize; private GameEditorController myController; /** * Constructor. * * @param size * @param controller * @param title * @param nextScreenName */ public GameEditorScreen (Dimension size, GameEditorController controller, String title, String nextScreenName) { mySize = size; setPreferredSize(mySize); myController = controller; myTitle = title + myTitle; addTitle(); myNextScreenName += nextScreenName; myMouseAdapter = makeMouseAdapter(); addMouseListener(myMouseAdapter); addButtons(); } /** * displays this screen. */ public void display () { setVisible(true); repaint(); } /** * clears the screen. */ public void clearScreen () { // does nothing for game editor screen, // but can be overriden by subclass screens. } /** * gets the associated controller. * * @return the GameEditorController */ public GameEditorController getController () { return myController; } /** * gets the associated mouse listener. * * @return the MouseAdapter */ public MouseAdapter getMouseAdapter () { return myMouseAdapter; } /** * helper method to make common buttons. */ private void addButtons () { JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BorderLayout()); myAddButton = new JButton(ADD_BUTTON_TEXT); myAddButton.addMouseListener(myMouseAdapter); myAddButton.setVisible(true); myFinishButton = new JButton(FINISH_BUTTON_TEXT); myFinishButton.addMouseListener(myMouseAdapter); myFinishButton.setVisible(true); buttonPanel.add(myAddButton, BorderLayout.NORTH); buttonPanel.add(myFinishButton, BorderLayout.SOUTH); add(buttonPanel, BorderLayout.NORTH); } /** * helper method to make the title label. */ private void addTitle () { JLabel titleLabel = new JLabel(myTitle); add(titleLabel); } /** * makes the mouse adapters for the screen. * * @return the mouse adapter created */ public MouseAdapter makeMouseAdapter () { MouseAdapter myMouseAdapter = new MouseAdapter() { @Override public void mouseClicked (MouseEvent e) { if (e.getSource().equals(myAddButton)) { addElementToGame(); clearScreen(); JOptionPane.showMessageDialog(null, "Element Added to Your Game"); } else if (e.getSource().equals(myFinishButton)) { try { setVisible(false); myController.displayNextScreen(myNextScreenName); } catch (SecurityException e1) { e1.printStackTrace(); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (InvocationTargetException e1) { e1.printStackTrace(); } } addAdditionalMouseBehavior(e); } }; return myMouseAdapter; } /** * adds the specific element to the XML file. * will be implemented by the sub-classes */ public abstract void addElementToGame (); /** * adds any additional mouse behavior. * will be implemented by the sub-classes */ public abstract void addAdditionalMouseBehavior (MouseEvent e); }