/*
* $Id$
*
* Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton
*
* 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.documentation;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.AbstractAction;
import javax.swing.Action;
import VASSAL.build.AbstractConfigurable;
import VASSAL.build.Buildable;
import VASSAL.build.GameModule;
import VASSAL.build.module.Documentation;
import VASSAL.tools.DataArchive;
import VASSAL.tools.ErrorDialog;
import VASSAL.tools.ReadErrorDialog;
import VASSAL.tools.URLUtils;
import VASSAL.tools.menu.MenuItemProxy;
import VASSAL.tools.menu.MenuManager;
/**
* Places an entry in the <code>Help</code> menu. Selecting the entry
* displays a window with stored text on it.
*/
public class HelpFile extends AbstractConfigurable {
public static final String TITLE = "title"; //$NON-NLS-1$
public static final String FILE = "fileName"; //$NON-NLS-1$
public static final String TYPE = "fileType"; //$NON-NLS-1$
private static final String IMAGE = "image"; //$NON-NLS-1$
public static final String ARCHIVE_ENTRY = "archive"; //$NON-NLS-1$
public static final String RESOURCE = "resource"; //$NON-NLS-1$
public static final String LOCAL_FILE = "file"; //$NON-NLS-1$
protected HelpWindow frame;
protected DialogHelpWindow dialog;
protected URL contents;
protected String title;
protected String fileName;
protected Action launch;
protected String fileType = ARCHIVE_ENTRY;
public static String getConfigureTypeName() {
return "Plain Text Help File";
}
public HelpFile() {
this("help", (URL) null);
}
public HelpFile(String title, File contents, String ref)
throws MalformedURLException {
this(title, new URL(URLUtils.toURL(contents), ref));
}
public HelpFile(String title, File contents) throws MalformedURLException {
this(title, URLUtils.toURL(contents));
}
public HelpFile(String title, URL contents) {
this.title = title;
this.contents = contents;
setConfigureName(title);
launch = new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
showWindow();
}
};
launch.putValue(Action.NAME, getConfigureName());
}
/**
* Create and display a new HelpWindow with the contents of this HelpFile
*/
public void showWindow() {
final HelpWindow w = getHelpWindow();
w.setVisible(true);
w.toFront();
}
protected HelpWindow getHelpWindow() {
if (frame == null) {
frame = new HelpWindow(title, getContents());
}
return frame;
}
/**
* Create and display a new HelpWindow as a Dialog
* with the contents of this HelpFile
*/
public void showWindow(Dialog owner) {
final DialogHelpWindow w = getDialogHelpWindow(owner);
w.setVisible(true);
w.toFront();
}
protected DialogHelpWindow getDialogHelpWindow(Dialog d) {
if (dialog == null) {
dialog = new DialogHelpWindow(title, getContents(), d);
}
return dialog;
}
public URL getContents() {
if (contents != null || fileName == null) return contents;
if (ARCHIVE_ENTRY.equals(fileType)) {
try {
contents = GameModule.getGameModule().getDataArchive().getURL(fileName);
}
catch (IOException e) {
ReadErrorDialog.error(e, fileName);
}
}
else if (RESOURCE.equals(fileType)) {
contents = getClass().getResource(fileName);
}
else if (LOCAL_FILE.equals(fileType)) {
File f = new File(fileName);
if (fileName.startsWith("docs/")) { //$NON-NLS-1$
f = new File(Documentation.getDocumentationBaseDir(),
fileName.substring("docs/".length())); //$NON-NLS-1$
}
try {
contents = URLUtils.toURL(f);
}
catch (MalformedURLException e) {
ErrorDialog.bug(e);
}
}
return contents;
}
/** @deprecated Use {@link URLUtils.toURL(File)} instead. */
@Deprecated
public static URL toURL(File f) throws MalformedURLException {
return URLUtils.toURL(f);
}
public HelpFile getHelpFile() {
File dir = VASSAL.build.module.Documentation.getDocumentationBaseDir();
dir = new File(dir, "ReferenceManual"); //$NON-NLS-1$
try {
return new HelpFile(null, new File(dir, "HelpMenu.htm"), "#HelpFile"); //$NON-NLS-1$ //$NON-NLS-2$
}
catch (MalformedURLException e) {
ErrorDialog.bug(e);
return null;
}
}
/**
* The attributes of a HelpFile are:
*
* <code>TITLE</code> the text of the menu entry in the Help menu
* <code>FILE</code> the name of an text file in the {@link
* DataArchive}. The text is displayed in a window with the same title
*/
public String[] getAttributeNames() {
return new String[] {
TITLE,
FILE,
IMAGE,
TYPE
};
}
public String getAttributeValueString(String key) {
if (TITLE.equals(key)) {
return title;
}
else if (FILE.equals(key)) {
return fileName;
}
else if (TYPE.equals(key)) {
return fileType;
}
return null;
}
public void setAttribute(String key, Object val) {
if (TITLE.equals(key)) {
title = (String) val;
setConfigureName(title);
launch.putValue(Action.NAME, title);
}
else if (FILE.equals(key)) {
if (val instanceof File) {
val = ((File) val).getName();
fileType = ARCHIVE_ENTRY;
}
fileName = (String) val;
if ("Intro.txt".equals(key)) { //$NON-NLS-1$
fileType = RESOURCE;
}
}
else if (TYPE.equals(key)) {
fileType = (String) val;
}
}
public String[] getAttributeDescriptions() {
return new String[]{
"Menu Entry: ",
"Text File: "
};
}
public Class<?>[] getAttributeTypes() {
return new Class<?>[]{
String.class,
File.class
};
}
public Class<?>[] getAllowableConfigureComponents() {
return new Class<?>[0];
}
protected MenuItemProxy launchItem;
public void addTo(Buildable b) {
launchItem = new MenuItemProxy(launch);
MenuManager.getInstance().addToSection("Documentation.Module", launchItem);
launch.setEnabled(true);
}
public void removeFrom(Buildable b) {
MenuManager.getInstance()
.removeFromSection("Documentation.Module", launchItem);
launch.setEnabled(false);
}
public static HelpFile getReferenceManualPage(String page) {
return getReferenceManualPage(page,null);
}
public static HelpFile getReferenceManualPage(String page, String anchor) {
if (anchor != null && !anchor.startsWith("#")) { //$NON-NLS-1$
anchor = "#"+anchor; //$NON-NLS-1$
}
File dir = VASSAL.build.module.Documentation.getDocumentationBaseDir();
dir = new File(dir, "ReferenceManual"); //$NON-NLS-1$
try {
return anchor == null ? new HelpFile(null,new File(dir, page)) :
new HelpFile(null, new File(dir, page), anchor);
}
catch (MalformedURLException ex) {
ErrorDialog.bug(ex);
return null;
}
}
}