/******************************************************************************* * Copyright (c) 2015 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.graphics.map.controls.original.panel; import jsettlers.common.images.EImageLinkType; import jsettlers.common.images.OriginalImageLink; import jsettlers.common.map.IGraphicsGrid; import jsettlers.common.map.shapes.MapRectangle; import jsettlers.common.menu.action.EActionType; import jsettlers.common.menu.action.IAction; import jsettlers.common.player.IInGamePlayer; import jsettlers.common.position.ShortPoint2D; import jsettlers.graphics.action.Action; import jsettlers.graphics.action.ActionFireable; import jsettlers.graphics.action.AskSetTradingWaypointAction; import jsettlers.graphics.action.ExecutableAction; import jsettlers.graphics.action.PointAction; import jsettlers.graphics.action.SetTradingWaypointAction; import jsettlers.graphics.action.SetTradingWaypointAction.EWaypointType; import jsettlers.graphics.localization.Labels; import jsettlers.graphics.map.controls.original.ControlPanelLayoutProperties; import jsettlers.graphics.map.controls.original.panel.content.AbstractContentProvider; import jsettlers.graphics.map.controls.original.panel.content.ContentType; import jsettlers.graphics.map.controls.original.panel.content.ESecondaryTabType; import jsettlers.graphics.map.controls.original.panel.content.MessageContent; import jsettlers.graphics.ui.Button; import jsettlers.graphics.ui.UIPanel; /** * This class handles the contents of the main panel. * * @author Michael Zangl */ public class MainPanel extends UIPanel { public static final int BUTTONS_FILE = 3; private final UIPanel tabpanel = new UIPanel(); private final Button button_build = new TabButton(ContentType.BUILD_NORMAL, BUTTONS_FILE, 51, 60, ""); private final Button button_goods = new TabButton(ContentType.STOCK, BUTTONS_FILE, 54, 63, ""); private final Button button_settlers = new TabButton(ContentType.SETTLERSTATISTIC, BUTTONS_FILE, 57, 66, ""); private final TabButton[] buildButtons = new TabButton[] { new TabButton(ContentType.BUILD_NORMAL, BUTTONS_FILE, 69, 81, ""), new TabButton(ContentType.BUILD_FOOD, BUTTONS_FILE, 72, 84, ""), new TabButton(ContentType.BUILD_MILITARY, BUTTONS_FILE, 75, 87, ""), new TabButton(ContentType.BUILD_SOCIAL, BUTTONS_FILE, 78, 90, ""), }; private final TabButton[] goodsButtons = new TabButton[] { new TabButton(ContentType.STOCK, BUTTONS_FILE, 258, 270, ""), new TabButton(ContentType.TOOLS, BUTTONS_FILE, 261, 273, ""), new TabButton(ContentType.GOODS_SPREAD, BUTTONS_FILE, 264, 276, ""), new TabButton(ContentType.GOODS_TRANSPORT, BUTTONS_FILE, 267, 279, ""), }; private final TabButton[] settlerButtons = new TabButton[] { new TabButton(ContentType.SETTLERSTATISTIC, BUTTONS_FILE, 234, 246, ""), new TabButton(ContentType.PROFESSION, BUTTONS_FILE, 237, 249, ""), new TabButton(ContentType.WARRIORS, BUTTONS_FILE, 240, 252, ""), new TabButton(ContentType.PRODUCTION, BUTTONS_FILE, 243, 255, ""), }; private final MessageContent quitPrompt = new MessageContent( Labels.getString("game-quit"), Labels.getString("game-quit-cancel"), new ExecutableAction() { @Override public void execute() { setContent(ContentType.BUILD_NORMAL); btnSystem.setActive(false); } }, Labels.getString("game-quit-ok"), new Action(EActionType.EXIT)) { @Override public void contentShowing(ActionFireable actionFireable) { btnSystem.setActive(true); } @Override public void contentHiding(ActionFireable actionFireable, AbstractContentProvider nextContent) { btnSystem.setActive(false); } }; private final Button btnSystem = new TabButton(quitPrompt, new OriginalImageLink(EImageLinkType.GUI, BUTTONS_FILE, 93, 0), new OriginalImageLink(EImageLinkType.GUI, BUTTONS_FILE, 96, 0), "game-quit-description"); private final Button btnScroll = new TabButton(ContentType.EMPTY, BUTTONS_FILE, 111, 99, ""); private final Button btnSwords = new TabButton(ContentType.EMPTY, BUTTONS_FILE, 114, 102, ""); private final Button btnSignPost = new TabButton(ContentType.EMPTY, BUTTONS_FILE, 117, 105, ""); private final Button btnPots = new TabButton(ContentType.EMPTY, BUTTONS_FILE, 120, 108, ""); { btnScroll.setActive(true); btnSwords.setActive(true); btnSignPost.setActive(true); btnPots.setActive(true); } private final UIPanel contentContainer = new UIPanel(); private ControlPanelLayoutProperties constants; private AbstractContentProvider activeContent = ContentType.EMPTY; private AbstractContentProvider goBackContent; private IGraphicsGrid grid; private ShortPoint2D displayCenter; /** * Somewhere to fire actions to. */ private final ActionFireable actionFireable; public MainPanel(ActionFireable actionFireable, IInGamePlayer player) { this.actionFireable = actionFireable; ContentType.WARRIORS.setPlayer(player); layoutPanel(ControlPanelLayoutProperties.getLayoutPropertiesFor(480)); } /** * Sets the content of the main panel. * * @param content * The content to change to. */ public synchronized void setContent(AbstractContentProvider content) { activeContent.contentHiding(actionFireable, content); ESecondaryTabType tabs = content.getTabs(); showSecondaryTabs(tabs); if (tabs != null) { switch (tabs) { case BUILD: setButtonsActive(buildButtons, content); break; case GOODS: setButtonsActive(goodsButtons, content); break; case SETTLERS: setButtonsActive(settlerButtons, content); break; case NONE: default: break; } } contentContainer.removeAll(); contentContainer.addChild(content.getPanel(), 0, 0, 1, 1); activeContent = content; sendMapPositionChange(); activeContent.contentShowing(actionFireable); } private void setButtonsActive(TabButton[] buttons, AbstractContentProvider type) { for (TabButton button : buttons) { button.setActiveByContent(type); } } private void showSecondaryTabs(ESecondaryTabType tabs) { tabpanel.removeAll(); if (tabs != null) { switch (tabs) { case BUILD: addTabpanelButtons(buildButtons); break; case GOODS: addTabpanelButtons(goodsButtons); break; case SETTLERS: addTabpanelButtons(settlerButtons); break; case NONE: default: break; } } button_build.setActive(tabs == ESecondaryTabType.BUILD); button_goods.setActive(tabs == ESecondaryTabType.GOODS); button_settlers.setActive(tabs == ESecondaryTabType.SETTLERS); } private void addTabpanelButtons(Button[] buttons) { int i = 0; for (Button button : buttons) { float left = constants.SECONDARY_TABS_SIDEMARGIN + i * (constants.SECONDARY_TABS_WIDTH + constants.SECONDARY_TABS_SPACING); tabpanel.addChild(button, left, 0, left + constants.SECONDARY_TABS_WIDTH, 1); i++; } } /** * Position the graphical components of this panel using the specified layout properties. * * @param layoutProperties */ public void layoutPanel(ControlPanelLayoutProperties layoutProperties) { this.constants = layoutProperties; this.removeAll(); initTabbar1(); initTabbar2(); addSystemButton(); addLowerTabBar(); this.addChild(contentContainer, layoutProperties.CONTENT_LEFT, layoutProperties.CONTENT_BOTTOM, layoutProperties.CONTENT_RIGHT, layoutProperties.CONTENT_TOP); setContent(activeContent); } private void initTabbar1() { int i = 0; UIPanel tabbar1 = new UIPanel(); this.addChild(tabbar1, 0, constants.PRIMARY_TABS_BOTTOM, 1, constants.PRIMARY_TABS_TOP); Button[] buttons = new Button[] { button_build, button_goods, button_settlers }; for (Button button : buttons) { float left = constants.PRIMARY_TABS_SIDEMARGIN + i * (constants.PRIMARY_TABS_WIDTH + constants.PRIMARY_TABS_SPACING); tabbar1.addChild(button, left, 0, left + constants.PRIMARY_TABS_WIDTH, 1); i++; } } private void initTabbar2() { this.addChild(tabpanel, 0, constants.SECONDARY_TABS_BOTTOM, 1, constants.SECONDARY_TABS_TOP); } private void addSystemButton() { this.addChild( btnSystem, constants.SYSTEM_BUTTON_LEFT, constants.SYSTEM_BUTTON_BOTTOM, constants.SYSTEM_BUTTON_RIGHT, constants.SYSTEM_BUTTON_TOP); } private void addLowerTabBar() { UIPanel lowerTabBar = new UIPanel(); Button[] buttons = new Button[] { btnScroll, btnSwords, btnSignPost, btnPots }; int i = 0; for (Button button : buttons) { float left = constants.LOWER_TABS_LEFT + (i++ * constants.LOWER_TABS_WIDTH); lowerTabBar.addChild(button, left, 0, left + constants.LOWER_TABS_WIDTH, 1); } this.addChild(lowerTabBar, 0, constants.LOWER_TABS_BOTTOM, 1, constants.LOWER_TABS_TOP); } /** * A special panel that si displayed to the user while the user should select a point. * * @author Michael Zangl */ public static class SelectPointMessage extends MessageContent { public SelectPointMessage(String message) { super(message, null, null, Labels.getString("abort"), new Action(EActionType.ABORT)); } @Override public boolean isForSelection() { return true; } } public synchronized IAction catchAction(IAction action) { action = activeContent.catchAction(action); // TODO: Abort on MOVE_TO-action. EActionType type = action.getActionType(); switch (type) { case MOVE_TO: case SET_DOCK: case SET_TRADING_WAYPOINT: case SET_WORK_AREA: if (activeContent instanceof SelectPointMessage) { goBack(); } return action; case ASK_SET_DOCK: goBackContent = activeContent; setContent(new SelectPointMessage( Labels.getString("click_set_dock")) { @Override public PointAction getSelectAction(ShortPoint2D position) { return new PointAction(EActionType.SET_DOCK, position); } }); return null; case ASK_SET_WORK_AREA: goBackContent = activeContent; setContent(new SelectPointMessage( Labels.getString("click_set_workcenter")) { @Override public PointAction getSelectAction(ShortPoint2D position) { return new PointAction(EActionType.SET_WORK_AREA, position); } }); return null; case ASK_SET_TRADING_WAYPOINT: goBackContent = activeContent; final EWaypointType wp = ((AskSetTradingWaypointAction) action).getWaypoint(); setContent(new SelectPointMessage( Labels.getString("click_set_trading_waypoint_" + wp)) { @Override public PointAction getSelectAction(ShortPoint2D position) { return new SetTradingWaypointAction(wp, position); } }); return null; case ASK_DESTROY: goBackContent = activeContent; setContent(new MessageContent( Labels.getString("really_destroy_building"), Labels.getName(EActionType.DESTROY), new Action( EActionType.DESTROY), Labels.getString("abort"), new Action(EActionType.ABORT)) { @Override public boolean isForSelection() { return true; } }); return null; case ABORT: goBack(); return action; case EXECUTABLE: ((ExecutableAction) action).execute(); return null; default: return action; } } private void goBack() { if (goBackContent != null) { setContent(goBackContent); goBackContent = null; } else { setContent(ContentType.EMPTY); } } public void setMapViewport(MapRectangle screenArea, IGraphicsGrid grid) { this.grid = grid; displayCenter = new ShortPoint2D(screenArea.getLineStartX(screenArea.getLines() / 2) + screenArea.getLineLength() / 2, screenArea .getLineY(screenArea.getLines() / 2)); sendMapPositionChange(); } private void sendMapPositionChange() { if (displayCenter != null) { activeContent.showMapPosition(displayCenter, grid); } } public boolean isSelectionActive() { return activeContent.isForSelection(); } }