package nl.tudelft.bw4t.client.gui.menu; import java.awt.geom.Point2D; import javax.swing.JMenu; import javax.swing.JMenuItem; import nl.tudelft.bw4t.client.controller.ClientController; import nl.tudelft.bw4t.client.controller.ClientMapController; import nl.tudelft.bw4t.client.gui.BW4TClientGUI; import nl.tudelft.bw4t.client.gui.listeners.MessageSenderActionListener; import nl.tudelft.bw4t.client.gui.listeners.PutdownActionListener; import nl.tudelft.bw4t.client.message.BW4TMessage; import nl.tudelft.bw4t.client.message.MessageType; import nl.tudelft.bw4t.map.BlockColor; import nl.tudelft.bw4t.map.Zone; import nl.tudelft.bw4t.map.view.ViewBlock; import nl.tudelft.bw4t.map.view.ViewEPartner; /** Responsible for building the pop-up menu when clicking on goal colors. */ public final class MapOperations { /** Should never be instantiated. */ private MapOperations() { } /** * Used for building the pop-up menu that displays the actions a user can * perform when clicking on a group goal color. * * @param color * - The color that was clicked. * @param gui * - The {@link BW4TClientGUI} to create the pop-up menu on. */ public static void buildPopUpMenuForGoalColor(BlockColor color, BW4TClientGUI gui) { ClientMapController cmc = gui.getController().getMapController(); ViewBlock holdingID = cmc.getTheBot().getTopBlock(); gui.getjPopupMenu().removeAll(); JMenuItem menuItem = new JMenuItem(color.getName()); gui.getjPopupMenu().add(menuItem); gui.getjPopupMenu().addSeparator(); buildCommandMenu(gui, holdingID); gui.getjPopupMenu().addSeparator(); buildTellMenu(color, gui, cmc, holdingID); gui.getjPopupMenu().addSeparator(); buildAskMenu(color, gui); gui.getjPopupMenu().addSeparator(); menuItem = new JMenuItem("Close menu"); gui.getjPopupMenu().add(menuItem); } private static void buildCommandMenu(BW4TClientGUI gui, ViewBlock holdingID) { JMenuItem menuItem; BasicMenuOperations.addSectionTitleToPopupMenu("Command my robot to:", gui.getjPopupMenu()); if (holdingID != null) { menuItem = new JMenuItem("Put down block"); menuItem.addActionListener(new PutdownActionListener(gui .getController())); gui.getjPopupMenu().add(menuItem); } } private static void buildAskMenu(BlockColor color, BW4TClientGUI gui) { BasicMenuOperations.addSectionTitleToPopupMenu("Ask: ", gui.getjPopupMenu()); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WHEREISCOLOR, null, color.getName(), null), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WHOHASABLOCK, null, color.getName(), null), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WHERESHOULDIGO), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WHATCOLORSHOULDIGET), gui); } private static void buildTellMenu(BlockColor color, BW4TClientGUI gui, ClientMapController cmc, ViewBlock holdingID) { JMenuItem menuItem; BasicMenuOperations.addSectionTitleToPopupMenu("Tell: ", gui.getjPopupMenu()); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.LOOKINGFOR, null, color.getName(), null), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WILLGETCOLOR, null, color.getName(), null), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.DROPPEDOFFBLOCK, null, color.getName(), null), gui); BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.WENEED, null, color.getName(), null), gui); if (holdingID != null) { BasicMenuOperations.addMenuItemToPopupMenu(new BW4TMessage( MessageType.HASCOLOR, null, color.getName(), null), gui); JMenu submenu = BasicMenuOperations.addSubMenuToPopupMenu( "I have a " + color + " block from room", gui.getjPopupMenu()); for (Zone room : cmc.getRooms()) { menuItem = new JMenuItem(room.getName()); menuItem.addActionListener(new MessageSenderActionListener( new BW4TMessage(MessageType.HASCOLORFROMROOM, room .getName(), color.getName(), null), gui .getController())); submenu.add(menuItem); } } } /** * Method to determine if the player is close to a box (which means at most * bot size +1, this matches server requirement for picking up) * * @param boxID * The box that should be checked. * @param data * {@link ClientController} to retrieve data from. * @return {@code true} if close to the box, {@code false} if not. */ public static boolean closeToBox(ViewBlock boxID, ClientController data) { return closeToBox(boxID.getPosition(), data); } public static boolean closeToBox(ViewEPartner ep, ClientController data) { return closeToBox(ep.getLocation(), data); } public static boolean closeToBox(Point2D boxLoc, ClientController data) { ClientMapController mapController = data.getMapController(); double dist = boxLoc.distance(mapController.getTheBot().getLocation()); return dist < 1 + mapController.getTheBot().getRobotSize(); } }