package nl.tudelft.bw4t.client.gui.menu;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import nl.tudelft.bw4t.client.controller.ClientMapController;
import nl.tudelft.bw4t.client.gui.BW4TClientGUI;
import nl.tudelft.bw4t.map.BlockColor;
import nl.tudelft.bw4t.map.Zone;
import nl.tudelft.bw4t.map.renderer.MapRenderSettings;
import nl.tudelft.bw4t.map.view.ViewBlock;
import nl.tudelft.bw4t.map.view.ViewEPartner;
/**
* The ActionPopUpMenu class which creates all popupmenu's.
*/
public class ActionPopUpMenu {
/**
* Used for building the pop up menu that displays the actions a user can
* undertake.
*
* @param gui
* the gui
*/
public static void buildPopUpMenu(BW4TClientGUI gui) {
int startPosX = 0;
ClientMapController cmc = gui.getController().getMapController();
MapRenderSettings settings = cmc.getRenderSettings();
boolean buildBlockadeMenu_ChargingZoneMenu = !buildBlockadeMenu(gui,
cmc, settings) && !buildChargingZoneMenu(gui, cmc, settings);
if (!buildSequenceBlockMenu(gui, startPosX, cmc, settings)
&& !buildEPartnerMenu(gui, cmc, settings)
&& !buildRoomMenu(gui, cmc, settings)
&& buildBlockadeMenu_ChargingZoneMenu) {
buildHallwayMenu(gui);
}
}
/**
* Builds the hallway menu.
*
* @param gui
* the gui
*/
private static void buildHallwayMenu(BW4TClientGUI gui) {
HallwayMenu.buildPopUpMenuForHallway(gui, "go to here");
showJPopupMenu(gui);
}
/**
* Builds the charging zone menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return Whether the menu was built.
*/
private static boolean buildChargingZoneMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
for (Zone chargingzone : cmc.getChargingZones()) {
Shape chargeBoundaries = settings.transformRectangle(chargingzone
.getBoundingbox().getRectangle());
if (chargeBoundaries.contains(gui.getSelectedLocation())) {
HallwayMenu.buildPopUpMenuForHallway(gui, "go recharge");
showJPopupMenu(gui);
return true;
}
}
return false;
}
/**
* Builds the blockade menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return Whether the menu was built.
*/
private static boolean buildBlockadeMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
for (Zone blockade : cmc.getBlockades()) {
Shape blockBoundaries = settings.transformRectangle(blockade
.getBoundingbox().getRectangle());
if (blockBoundaries.contains(gui.getSelectedLocation())) {
BlockadeMenu.buildPopUpMenuForBlockade(gui);
showJPopupMenu(gui);
return true;
}
}
return false;
}
/**
* Builds the room menu. Actually we first try if we can do a
* {@link #buildVisibleBlockMenu(BW4TClientGUI, ClientMapController, MapRenderSettings, Zone)}
* If that works, we show a more specific menu. If that fails, we build a
* more general room menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return true when the menu was built and is shown to the user.
*/
private static boolean buildRoomMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
for (Zone room : cmc.getRooms()) {
Shape roomBoundaries = settings.transformRectangle(room
.getBoundingbox().getRectangle());
if (roomBoundaries.contains(gui.getSelectedLocation())) {
/**
* We only draw the room menu if the block menu wasn't already
* drawn:
*/
if (!buildVisibleBlockMenu(gui, cmc, settings, room)) {
RoomMenus.buildPopUpMenuRoom(room, gui);
showJPopupMenu(gui);
}
return true;
}
}
return false;
}
/**
* Builds the visible block menu if the user clicks inside a visible block.
* If the user does not click on a block, we return without showing any
* menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @param room
* the room
* @return true iff the menu was built.
*/
private static boolean buildVisibleBlockMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings, Zone room) {
for (ViewBlock box : cmc.getVisibleBlocks()) {
Shape boxBoundaries = settings
.transformCenterRectangle(new Rectangle2D.Double(box
.getPosition().getX(), box.getPosition().getY(),
ViewBlock.BLOCK_SIZE, ViewBlock.BLOCK_SIZE));
if (boxBoundaries.contains(gui.getSelectedLocation())) {
if (MapOperations.closeToBox(box, gui.getController())) {
RoomMenus.buildPopUpMenuForBeingAtBlock(box, room, gui);
} else {
RoomMenus.buildPopUpMenuForBlock(box, room,
gui.getController());
}
showJPopupMenu(gui);
return true;
}
}
return false;
}
/**
* Builds the e partner menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return Whether the menu was built.
*/
private static boolean buildEPartnerMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
if (cmc.getTheBot().getHoldingEpartner() >= 0) {
return buildEPartnerHoldingMenu(gui, cmc, settings);
} else {
return buildEPartnerVisibleMenu(gui, cmc, settings);
}
}
/**
* Builds the e partner visible menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return Whether the menu was built.
*/
private static boolean buildEPartnerVisibleMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
for (ViewEPartner ep : cmc.getVisibleEPartners()) {
Shape ePartnerBox = settings
.transformCenterRectangle(new Rectangle2D.Double(ep
.getLocation().getX(), ep.getLocation().getY(),
ViewEPartner.EPARTNER_SIZE,
ViewEPartner.EPARTNER_SIZE));
if (ePartnerBox.contains(gui.getSelectedLocation())) {
if (MapOperations.closeToBox(ep, gui.getController())) {
EPartnerMenu.buildPopUpMenuPickUpEPartner(ep, gui);
} else {
EPartnerMenu.buildPopUpMenuMoveToEPartner(ep, gui);
}
showJPopupMenu(gui);
return true;
}
}
return false;
}
/**
* Builds the e partner holding menu.
*
* @param gui
* the gui
* @param cmc
* the client map controller
* @param settings
* the map renderer settings
* @return Whether the menu was built.
*/
private static boolean buildEPartnerHoldingMenu(BW4TClientGUI gui,
ClientMapController cmc, MapRenderSettings settings) {
ViewEPartner ep = cmc.getViewEPartner(cmc.getTheBot()
.getHoldingEpartner());
if (ep != null) {
final Point2D location = ep.getLocation();
Shape ePartnerBox = settings
.transformCenterRectangle(new Rectangle2D.Double(location
.getX(), location.getY(),
ViewEPartner.EPARTNER_SIZE,
ViewEPartner.EPARTNER_SIZE));
if (ePartnerBox.contains(gui.getSelectedLocation())) {
EPartnerMenu.buildPopUpMenuForEPartner(ep, gui);
showJPopupMenu(gui);
return true;
}
}
return false;
}
/**
* Show the jpopup menu.
*
* @param gui
* the gui
*/
public static void showJPopupMenu(BW4TClientGUI gui) {
gui.getjPopupMenu().show(gui, (int) gui.getSelectedLocation().getX(),
(int) gui.getSelectedLocation().getY());
}
/**
* Builds the sequence block menu.
*
* @param gui
* the gui
* @param startPosX
* the start position x
* @param cmc
* the client map controller
* @param set
* the set
* @return Whether the menu was built.
*/
private static boolean buildSequenceBlockMenu(BW4TClientGUI gui,
int startPosX, ClientMapController cmc, MapRenderSettings set) {
for (BlockColor color : cmc.getSequence()) {
Shape colorBounds = new Rectangle2D.Double(startPosX, set.scale(set
.getWorldHeight()), set.getSequenceBlockSize(),
set.getSequenceBlockSize());
if (colorBounds.contains(gui.getSelectedLocation())) {
MapOperations.buildPopUpMenuForGoalColor(color, gui);
showJPopupMenu(gui);
return true;
}
startPosX += set.getSequenceBlockSize();
}
return false;
}
}