package vooga.towerdefense.gameeditor.gamemaker.editorscreens; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import vooga.towerdefense.gameeditor.controller.GameEditorController; /** * ViewEditorScreen is responsible for helping * the game developer make the view. * * @author Leonard K. Ng'eno * @author Angelica Schwartz */ public class ViewEditorScreen extends GameEditorScreen { /** * default serialized id. */ private static final long serialVersionUID = 1L; /** * next screen constant. */ private static final String NEXT_SCREEN_NAME = "mapeditor.MapEditorScreen"; /** * package name for the available game screens. */ private static final String SCREEN_PACKAGE_PATH = "vooga.towerdefense.view.gamescreens"; /** * the name of the class the represents multiple panels. */ private static final String MULTIPLE_PANEL_NAME = "MultipleScreenPanel"; /** * title constant. */ private static final String TITLE_NAME = "VIEW "; /** * north constant. */ private static final String NORTH_NAME = "NORTH"; /** * south constant. */ private static final String SOUTH_NAME = "SOUTH"; /** * east constant. */ private static final String EAST_NAME = "EAST"; /** * west constant. */ private static final String WEST_NAME = "WEST"; /** * center constant. */ private static final String CENTER_NAME = "CENTER"; /** * string constant for getting the view's main dimension. */ private static final String TOP_LEVEL_DIMENSION_PROMPT = "TOP LEVEL CONTAINER DIMENSION"; /** * north drop down box. */ @SuppressWarnings("rawtypes") private JComboBox myNorthPanel; /** * south drop down box. */ @SuppressWarnings("rawtypes") private JComboBox mySouthPanel; /** * center drop down box. */ @SuppressWarnings("rawtypes") private JComboBox myCenterPanel; /** * east drop down box. */ @SuppressWarnings("rawtypes") private JComboBox myEastPanel; /** * west drop down box. */ @SuppressWarnings("rawtypes") private JComboBox myWestPanel; /** * north size field. */ private JTextField myNorthSize; /** * south size field. */ private JTextField mySouthSize; /** * center size field. */ private JTextField myCenterSize; /** * east size field. */ private JTextField myEastSize; /** * west size field. */ private JTextField myWestSize; @SuppressWarnings("rawtypes") private JComboBox myMultiPanel; private JTextField myMultiPanelSize; private ActionListener myActionListener; @SuppressWarnings("rawtypes") private List<JComboBox> myJComboPanels; private JPanel mySouthernPanelScreen; @SuppressWarnings("rawtypes") private JComboBox mySouthernPanelPosition; private JButton myMultiButtonADD; private JButton myMultiButtonDONE; private Map<String, List<String>> myMultiScreenMap; private String myKey; private List<String> myScreens; private JLabel myScreenLabel, mySizeLabel; private JTextField myContainerSize; private JComboBox mySelectedJC; /** * Constructor. * * @param size * @param controller */ @SuppressWarnings("rawtypes") public ViewEditorScreen (Dimension size, GameEditorController controller) { super(size, controller, TITLE_NAME, NEXT_SCREEN_NAME); myJComboPanels = new ArrayList<JComboBox>(); myMultiScreenMap = new HashMap<String, List<String>>(); myScreens = new ArrayList<String>(); makeActionListener(); try { add(makeScreen(), BorderLayout.CENTER); add(makeSouthPanel(), BorderLayout.SOUTH); attachListeners(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } JOptionPane.showMessageDialog(null, "Note: you must contain a mapscreen\nand shopscreen in your view"); } public String getTopLevelContainerDimension() { String text = myContainerSize.getText(); return text; } private JComponent makeSouthPanel () { mySouthernPanelScreen = new JPanel(); mySouthernPanelScreen.setPreferredSize(new Dimension(800, 100)); myScreenLabel = new JLabel("SCREEN"); mySouthernPanelScreen.add(myScreenLabel); mySouthernPanelScreen.add(myMultiPanel); mySizeLabel = new JLabel("SIZE"); mySouthernPanelScreen.add(mySizeLabel); mySouthernPanelScreen.add(myMultiPanelSize); mySouthernPanelScreen.add(mySouthernPanelPosition); myMultiButtonADD = new JButton("ADD"); myMultiButtonDONE = new JButton("DONE"); myMultiButtonADD.addActionListener(myActionListener); myMultiButtonDONE.addActionListener(myActionListener); mySouthernPanelScreen.add(myMultiButtonADD); mySouthernPanelScreen.add(myMultiButtonDONE); this.add(mySouthernPanelScreen, BorderLayout.SOUTH); mySouthernPanelScreen.setVisible(false); return mySouthernPanelScreen; } private void makeActionListener () { myActionListener = new ActionListener() { @Override public void actionPerformed (ActionEvent e) { if (e.getSource().equals(myMultiButtonADD)){ addPanelToMultiplePanels(); } else if (e.getSource().equals(myMultiButtonDONE)){ doneAddingMultiplePanels(); mySelectedJC.setSelectedItem(""); } checkItemSelected(e); } }; } private void doneAddingMultiplePanels () { myMultiScreenMap.put(myKey, myScreens); myKey = ""; myScreens.removeAll(myScreens); } private void setVisibility (boolean vis) { mySouthernPanelScreen.setVisible(vis); mySouthernPanelPosition.setVisible(vis); myMultiPanel.setVisible(vis); myMultiPanelSize.setVisible(vis); myMultiButtonADD.setVisible(vis); myMultiButtonDONE.setVisible(vis); myScreenLabel.setVisible(vis); mySizeLabel.setVisible(vis); } private void addPanelToMultiplePanels () { String position = (String)mySouthernPanelPosition.getSelectedItem(); String screen = (String)myMultiPanel.getSelectedItem(); String size = myMultiPanelSize.getText(); size = size.replaceFirst(",", ""); myScreens.add(position + " " + screen + " " + size); myMultiPanelSize.setText(""); } @SuppressWarnings("rawtypes") private void checkItemSelected (ActionEvent e) { for (JComboBox s: myJComboPanels) { if (s.getSelectedItem().equals(MULTIPLE_PANEL_NAME)){ mySouthernPanelScreen.setVisible(true); myKey = s.getName(); mySelectedJC = s; } } } @SuppressWarnings("rawtypes") private JComponent makeScreen() throws IOException, ClassNotFoundException { JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(800, 400)); myContainerSize = new JTextField(TEXT_FIELD_WIDTH); add(new JLabel (TOP_LEVEL_DIMENSION_PROMPT)); add(myContainerSize); myNorthPanel = new JComboBox(); myNorthPanel.setName(NORTH_NAME); mySouthPanel = new JComboBox(); mySouthPanel.setName(SOUTH_NAME); myCenterPanel = new JComboBox(); myCenterPanel.setName(CENTER_NAME); myEastPanel = new JComboBox(); myEastPanel.setName(EAST_NAME); myWestPanel = new JComboBox(); myWestPanel.setName(WEST_NAME); myMultiPanel = new JComboBox(); mySelectedJC = new JComboBox(); mySouthernPanelPosition = new JComboBox(); myNorthSize = new JTextField(TEXT_FIELD_WIDTH); mySouthSize = new JTextField(TEXT_FIELD_WIDTH); myCenterSize = new JTextField(TEXT_FIELD_WIDTH); myEastSize = new JTextField(TEXT_FIELD_WIDTH); myWestSize = new JTextField(TEXT_FIELD_WIDTH); myMultiPanelSize = new JTextField(TEXT_FIELD_WIDTH); populateDropDoxBoxes(); alignCenterScreenComponents(panel); return panel; } private void alignCenterScreenComponents(JPanel panel) { JPanel north = new JPanel(); north.setPreferredSize(new Dimension(800, 50)); north.add(new JLabel(NORTH_NAME)); north.add(myNorthPanel); north.add(myNorthSize); panel.add(north); JPanel center = new JPanel(); center.setPreferredSize(new Dimension(800, 50)); center.add(new JLabel(CENTER_NAME)); center.add(myCenterPanel); center.add(myCenterSize); panel.add(center); JPanel south = new JPanel(); south.setPreferredSize(new Dimension(800, 50)); south.add(new JLabel(SOUTH_NAME)); south.add(mySouthPanel); south.add(mySouthSize); panel.add(south); JPanel east = new JPanel(); east.setPreferredSize(new Dimension(800, 50)); east.add(new JLabel(EAST_NAME)); east.add(myEastPanel); east.add(myEastSize); panel.add(east); JPanel west = new JPanel(); west.setPreferredSize(new Dimension(800, 50)); west.add(new JLabel(WEST_NAME), BorderLayout.WEST); west.add(myWestPanel, BorderLayout.WEST); west.add(myWestSize, BorderLayout.WEST); panel.add(west); } @SuppressWarnings("rawtypes") private void attachListeners () { myJComboPanels.add(myCenterPanel); myJComboPanels.add(myEastPanel); myJComboPanels.add(myNorthPanel); myJComboPanels.add(mySouthPanel); myJComboPanels.add(myWestPanel); for (JComboBox jc : myJComboPanels) { jc.addActionListener(myActionListener); } } @SuppressWarnings("unchecked") private void populateDropDoxBoxes() throws IOException, ClassNotFoundException { List<String> screens = getController().getClassNamesInPackage(SCREEN_PACKAGE_PATH); screens.add(""); for (String s : screens) { myNorthPanel.addItem(s); mySouthPanel.addItem(s); myCenterPanel.addItem(s); myEastPanel.addItem(s); myWestPanel.addItem(s); myMultiPanel.addItem(s); } myNorthPanel.setSelectedItem(""); mySouthPanel.setSelectedItem(""); myCenterPanel.setSelectedItem(""); myEastPanel.setSelectedItem(""); myWestPanel.setSelectedItem(""); mySouthernPanelPosition.addItem(NORTH_NAME); mySouthernPanelPosition.addItem(CENTER_NAME); mySouthernPanelPosition.addItem(SOUTH_NAME); mySouthernPanelPosition.addItem(EAST_NAME); mySouthernPanelPosition.addItem(WEST_NAME); } /** * adds this view to the game. */ @Override public void addElementToGame () { getController().setMapSize(getMapDimension()); List<String> viewInfo = makeViewStrings(); String dimension = getTopLevelContainerDimension(); getController().addViewToGame(dimension, viewInfo, myMultiScreenMap); } /** * makes a map of the screen name to the location. */ private List<String> makeViewStrings() { List<String> viewInfo = new ArrayList<String>(); String s = (String)myNorthPanel.getSelectedItem() + " " + myNorthSize.getText() + " " + "North"; viewInfo.add(s); s = (String)mySouthPanel.getSelectedItem() + " " + mySouthSize.getText() + " " + "South"; viewInfo.add(s); s = (String)myCenterPanel.getSelectedItem() + " " + myCenterSize.getText() + " " + "Center"; viewInfo.add(s); s = (String)myEastPanel.getSelectedItem() + " " + myEastSize.getText() + " " + "East"; viewInfo.add(s); s = (String)myWestPanel.getSelectedItem() + " " + myWestSize.getText() + " " + "West"; viewInfo.add(s); return viewInfo; } /** * helper method to get the map dimension from the string. * @return dimension of the map screen */ private Dimension getMapDimension() { String dimension = ""; if (myNorthPanel.getSelectedItem().equals("MapScreen")) { dimension += myNorthSize.getText(); } else if (mySouthPanel.getSelectedItem().equals("MapScreen")) { dimension += mySouthSize.getText(); } else if (myCenterPanel.getSelectedItem().equals("MapScreen")) { dimension += myCenterSize.getText(); } else if (myEastPanel.getSelectedItem().equals("MapScreen")) { dimension += myEastSize.getText(); } else { dimension += myWestSize.getText(); } String[] dim = dimension.split(", "); return (new Dimension(Integer.parseInt(dim[0]), Integer.parseInt(dim[1]))); } /** * adds additional mouse behavior specific * to the ViewEditorScreen. * * @param e is the MouseEvent */ @Override public void addAdditionalMouseBehavior (MouseEvent e) { List<String> screens = new ArrayList<String>(); screens.add((String)myNorthPanel.getSelectedItem()); screens.add((String)mySouthPanel.getSelectedItem()); screens.add((String)myCenterPanel.getSelectedItem()); screens.add((String)myEastPanel.getSelectedItem()); screens.add((String)myWestPanel.getSelectedItem()); if (screens.contains(MULTIPLE_PANEL_NAME)) { } } }