/*
* $Id$
*
* Copyright (c) 2004 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.build.module;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.AbstractAction;
import javax.swing.Action;
import VASSAL.build.AbstractConfigurable;
import VASSAL.build.BadDataReport;
import VASSAL.build.Buildable;
import VASSAL.build.GameModule;
import VASSAL.build.module.documentation.HelpFile;
import VASSAL.command.Command;
import VASSAL.configure.VisibilityCondition;
import VASSAL.i18n.Resources;
import VASSAL.tools.ErrorDialog;
import VASSAL.tools.menu.ChildProxy;
import VASSAL.tools.menu.MenuItemProxy;
import VASSAL.tools.menu.MenuManager;
import VASSAL.tools.menu.MenuProxy;
import VASSAL.tools.menu.ParentProxy;
/**
* Defines a saved game that is accessible from the File menu.
* The game will be loaded in place of a normal New Game
*/
public class PredefinedSetup extends AbstractConfigurable implements GameComponent {
public static final String NAME = "name"; //$NON-NLS-1$
public static final String FILE = "file"; //$NON-NLS-1$
public static final String USE_FILE = "useFile"; //$NON-NLS-1$
public static final String IS_MENU = "isMenu"; //$NON-NLS-1$
protected boolean isMenu;
protected boolean useFile = true;
protected String fileName;
protected MenuItemProxy menuItem;
protected MenuProxy menu;
protected VisibilityCondition showFile;
protected VisibilityCondition showUseFile;
protected AbstractAction launchAction;
public PredefinedSetup() {
launchAction = new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
launch();
}
};
menuItem = new MenuItemProxy(launchAction);
menu = new MenuProxy();
showFile = new VisibilityCondition() {
public boolean shouldBeVisible() {
return !isMenu && useFile;
}
};
showUseFile = new VisibilityCondition() {
public boolean shouldBeVisible() {
return !isMenu;
}
};
}
public String[] getAttributeDescriptions() {
return new String[]{
Resources.getString(Resources.NAME_LABEL),
Resources.getString("Editor.PredefinedSetup.parent_menu"), //$NON-NLS-1$
Resources.getString("Editor.PredefinedSetup.predefined_file"), //$NON-NLS-1$
Resources.getString("Editor.PredefinedSetup.saved_game") //$NON-NLS-1$
};
}
public Class<?>[] getAttributeTypes() {
return new Class<?>[]{
String.class,
Boolean.class,
Boolean.class,
File.class
};
}
public String[] getAttributeNames() {
return new String[]{
NAME,
IS_MENU,
USE_FILE,
FILE
};
}
public String getAttributeValueString(String key) {
if (NAME.equals(key)) {
return getConfigureName();
}
else if (FILE.equals(key)) {
return fileName;
}
else if (USE_FILE.equals(key)) {
return String.valueOf(useFile);
}
else if (IS_MENU.equals(key)) {
return String.valueOf(isMenu);
}
else {
return null;
}
}
public void setAttribute(String key, Object value) {
if (NAME.equals(key)) {
setConfigureName((String) value);
menuItem.getAction().putValue(Action.NAME, (String) value);
menu.setText((String) value);
}
else if (USE_FILE.equals(key)) {
if (value instanceof String) {
value = Boolean.valueOf((String) value);
}
useFile = ((Boolean) value).booleanValue();
}
else if (FILE.equals(key)) {
if (value instanceof File) {
value = ((File) value).getName();
}
fileName = (String) value;
}
else if (IS_MENU.equals(key)) {
if (value instanceof String) {
value = Boolean.valueOf((String) value);
}
setMenu(((Boolean) value).booleanValue());
}
}
public VisibilityCondition getAttributeVisibility(String name) {
if (FILE.equals(name)) {
return showFile;
}
else if (USE_FILE.equals(name)) {
return showUseFile;
}
else {
return super.getAttributeVisibility(name);
}
}
public void launch() {
if (useFile && fileName != null) {
try {
GameModule.getGameModule()
.getGameState()
.loadGameInBackground(fileName, getSavedGameContents());
}
catch (IOException e) {
ErrorDialog.dataError(new BadDataReport(this, Resources.getString("Error.not_found", "Setup"),fileName,e)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
else {
GameModule.getGameModule().getGameState().setup(false);
GameModule.getGameModule().getGameState().setup(true);
}
}
public InputStream getSavedGameContents() throws IOException {
return GameModule.getGameModule().getDataArchive().getInputStream(fileName);
}
private ChildProxy<?> getMenuInUse() {
return isMenu ? menu : menuItem;
}
private void setMenu(boolean isMenu) {
if (isMenu == this.isMenu) return;
final ChildProxy<?> inUse = getMenuInUse();
final ParentProxy parent = inUse.getParent();
if (parent != null) {
// swap our items if one is already in the menu
final ChildProxy<?> notInUse = this.isMenu ? menuItem : menu;
parent.insert(notInUse, parent.getIndex(inUse));
parent.remove(inUse);
}
this.isMenu = isMenu;
}
public void addTo(Buildable parent) {
if (parent instanceof GameModule) {
MenuManager.getInstance().addToSection("PredefinedSetup", getMenuInUse()); //$NON-NLS-1$
}
else if (parent instanceof PredefinedSetup) {
final PredefinedSetup setup = (PredefinedSetup) parent;
setup.menu.add(getMenuInUse());
}
MenuManager.getInstance().removeAction("GameState.new_game"); //$NON-NLS-1$
GameModule.getGameModule().getGameState().addGameComponent(this);
GameModule.getGameModule().getWizardSupport().addPredefinedSetup(this);
}
public void removeFrom(Buildable parent) {
if (parent instanceof GameModule) {
MenuManager.getInstance()
.removeFromSection("PredefinedSetup", getMenuInUse()); //$NON-NLS-1$
}
else if (parent instanceof PredefinedSetup) {
final PredefinedSetup setup = (PredefinedSetup) parent;
setup.menu.remove(getMenuInUse());
}
GameModule.getGameModule().getGameState().removeGameComponent(this);
GameModule.getGameModule().getWizardSupport().removePredefinedSetup(this);
}
public Class<?>[] getAllowableConfigureComponents() {
return isMenu ? new Class<?>[]{PredefinedSetup.class} : new Class<?>[0];
}
public static String getConfigureTypeName() {
return Resources.getString("Editor.PredefinedSetup.component_type"); //$NON-NLS-1$
}
public HelpFile getHelpFile() {
return HelpFile.getReferenceManualPage("GameModule.htm", "PredefinedSetup"); //$NON-NLS-1$ //$NON-NLS-2$
}
public boolean isMenu() {
return isMenu;
}
public boolean isUseFile() {
return useFile;
}
public String getFileName() {
return fileName;
}
public Command getRestoreCommand() {
return null;
}
public void setup(boolean gameStarting) {
launchAction.setEnabled(!gameStarting);
}
}