From: <th...@us...> - 2008-01-14 05:08:34
|
Revision: 4885 http://pcgen.svn.sourceforge.net/pcgen/?rev=4885&view=rev Author: thpr Date: 2008-01-13 21:08:40 -0800 (Sun, 13 Jan 2008) Log Message: ----------- Bring CDOM pieces up to 4876 (NON WORKING BUILD) Modified Paths: -------------- branches/cdom/code/src/java/pcgen/gui/AddSpecialAbility.java branches/cdom/code/src/java/pcgen/gui/CharacterInfo.java branches/cdom/code/src/java/pcgen/gui/ChooseSpellDialog.java branches/cdom/code/src/java/pcgen/gui/EQFrame.java branches/cdom/code/src/java/pcgen/gui/EqBuilder.java branches/cdom/code/src/java/pcgen/gui/HPFrame.java branches/cdom/code/src/java/pcgen/gui/KitSelector.java branches/cdom/code/src/java/pcgen/gui/LstEditorMain.java branches/cdom/code/src/java/pcgen/gui/MainSource.java branches/cdom/code/src/java/pcgen/gui/NameGui.java branches/cdom/code/src/java/pcgen/gui/NewWeaponInfoDialog.java branches/cdom/code/src/java/pcgen/gui/PCCCreator.java branches/cdom/code/src/java/pcgen/gui/PCGenPopup.java branches/cdom/code/src/java/pcgen/gui/PCGen_Frame1.java branches/cdom/code/src/java/pcgen/gui/PToolBar.java branches/cdom/code/src/java/pcgen/gui/PreferencesDialog.java branches/cdom/code/src/java/pcgen/gui/editor/EditorMainForm.java branches/cdom/code/src/java/pcgen/gui/filter/FilterFactory.java branches/cdom/code/src/java/pcgen/gui/pcGenGUI.java branches/cdom/code/src/java/pcgen/gui/prop/LanguageBundle.properties branches/cdom/code/src/java/pcgen/gui/prop/PCGenProp.properties branches/cdom/code/src/java/pcgen/gui/tabs/InfoAbilities.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoAbility.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoGear.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoSkills.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoSummary.java branches/cdom/code/src/java/pcgen/gui/tabs/InfoTempMod.java branches/cdom/code/src/java/pcgen/gui/tabs/TabContainer.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/AbilityPoolPanel.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/AbilitySelectionPanel.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java branches/cdom/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java branches/cdom/code/src/java/pcgen/gui/utils/IconUtilitities.java Added Paths: ----------- branches/cdom/code/src/java/pcgen/gui/DataInstaller.java branches/cdom/code/src/java/pcgen/gui/PCGenMenuBar.java branches/cdom/code/src/java/pcgen/gui/filter/RaceSubTypeFilter.java branches/cdom/code/src/java/pcgen/gui/filter/RaceTypeFilter.java branches/cdom/code/src/java/pcgen/gui/resource/PCGenApp.png branches/cdom/code/src/java/pcgen/gui/tabs/ability/IAbilityCategorySelectionListener.java Modified: branches/cdom/code/src/java/pcgen/gui/AddSpecialAbility.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/AddSpecialAbility.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/AddSpecialAbility.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -97,10 +97,10 @@ { aPC = pc; setTitle(myGetTitle()); + IconUtilitities.maybeSetIcon(this, + IconUtilitities.RESOURCE_APP_ICON); Toolkit kit = Toolkit.getDefaultToolkit(); - Image img = kit.getImage(getClass().getResource(IconUtilitities.RESOURCE_URL + "PcgenIcon.gif")); - this.setIconImage(img); // since the Toolkit.getScreenSize() method is broken in the Linux implementation // of Java 5 (it returns double the screen size under xinerama), this method is Modified: branches/cdom/code/src/java/pcgen/gui/CharacterInfo.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/CharacterInfo.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/CharacterInfo.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -195,7 +195,9 @@ .getComponentAt(i); characterInfoTabbedPane.setTitleAt(i, tab.getTabName()); } + infoAbilities().refreshAbilityCategories(); } + /** * Get the info description * @return info description Modified: branches/cdom/code/src/java/pcgen/gui/ChooseSpellDialog.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/ChooseSpellDialog.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/ChooseSpellDialog.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -97,7 +97,7 @@ ChooseSpellDialog(JFrame parent, PlayerCharacter pc, final int eqType, final boolean metaAllowed, final List<String> classList, final List<String> levelList, final int spellBooks, final String choiceString) { super(parent); - IconUtilitities.maybeSetIcon(parent, "PcgenIcon.gif"); + IconUtilitities.maybeSetIcon(parent, IconUtilitities.RESOURCE_APP_ICON); this.eqType = eqType; this.pc = pc; this.metaAllowed = metaAllowed; @@ -113,7 +113,7 @@ ChooseSpellDialog(JFrame parent, PlayerCharacter pc, final int eqType, final boolean metaAllowed, final List<String> classList, final List<String> levelList, final int spellBooks) { super(parent); - IconUtilitities.maybeSetIcon(parent, "PcgenIcon.gif"); + IconUtilitities.maybeSetIcon(parent, IconUtilitities.RESOURCE_APP_ICON); this.eqType = eqType; this.metaAllowed = metaAllowed; Copied: branches/cdom/code/src/java/pcgen/gui/DataInstaller.java (from rev 4876, Trunk/pcgen/code/src/java/pcgen/gui/DataInstaller.java) =================================================================== --- branches/cdom/code/src/java/pcgen/gui/DataInstaller.java (rev 0) +++ branches/cdom/code/src/java/pcgen/gui/DataInstaller.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -0,0 +1,794 @@ +/* + * DataInstaller.java + * Copyright 2007 (C) James Dempsey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 22/12/2007 + * + * $Id$ + */ + +package pcgen.gui; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.filechooser.FileFilter; + +import pcgen.core.InstallableCampaign; +import pcgen.core.SettingsHandler; +import pcgen.core.InstallableCampaign.Destination; +import pcgen.core.utils.CoreUtility; +import pcgen.core.utils.MessageType; +import pcgen.core.utils.ShowMessageDelegate; +import pcgen.gui.utils.IconUtilitities; +import pcgen.gui.utils.JLabelPane; +import pcgen.gui.utils.Utility; +import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.lst.InstallLoader; +import pcgen.util.Logging; +import pcgen.util.PropertyFactory; + +/** + * <code>DataInstaller</code> is responsible for managing the installation of + * a data set including the selection of the set and the install options. + * + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public class DataInstaller extends JFrame +{ + + /** + * Filter class to only display potential zip format data sets. + */ + private final class DataPackFilter extends FileFilter + { + /* (non-Javadoc) + * @see javax.swing.filechooser.FileFilter#accept(java.io.File) + */ + public boolean accept(File f) + { + if (f.isDirectory()) + { + return true; + } + + if (f.getName().endsWith(".zip")) + { + return true; + } + + return false; + } + + /* (non-Javadoc) + * @see javax.swing.filechooser.FileFilter#getDescription() + */ + public String getDescription() + { + return "Data Sets (*.zip)"; + } + } + + /** + * The listener for receiving and processing action events from installer + * buttons. + */ + private final class InstallerButtonListener implements ActionListener + { + + /* (non-Javadoc) + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed(ActionEvent actionEvent) + { + JButton source = (JButton) actionEvent.getSource(); + + if (source == null) + { + // Do nothing + } + else if (source == cancel) + { + setVisible(false); + DataInstaller.this.dispose(); + } + else if (source == selectButton) + { + JFileChooser chooser = + new JFileChooser(new File(System + .getProperty("user.dir"))); + chooser.setDialogTitle(PropertyFactory + .getString("in_diChooserTitle")); + chooser.addChoosableFileFilter(new DataPackFilter()); + int result = chooser.showOpenDialog(DataInstaller.this); + if (result != JFileChooser.APPROVE_OPTION) + { + return; + } + File dataset = chooser.getSelectedFile(); + readDataSet(dataset); + } + else if (source == installButton) + { + if (installDataSource(currDataSet, getSelectedDestination())) + { + PCGen_Frame1.getInst().getMainSource().refreshCampaigns(); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diInstalled", campaign + .getDisplayName()), TITLE, MessageType.INFORMATION); + } + } + } + } + + /** The name of the OUTPUTSHEETS folder. */ + private static final String OUTPUTSHEETS_FOLDER = "outputsheets/"; + + /** The name of the DATA folder. */ + private static final String DATA_FOLDER = "data/"; + + /** The standard window title. */ + private static final String TITLE = PropertyFactory.getString("in_dataInstaller"); + + /** The component to display the path of the selected data set. */ + private JTextField dataSetSel; + + /** The select button. */ + private JButton selectButton; + + /** The data set detail display component. */ + private JLabelPane dataSetDetails; + + /** The button for the data location. */ + private JRadioButton locDataButton; + + /** The button for the vendor data location. */ + private JRadioButton locVendorDataButton; + + /** The install button. */ + private JButton installButton; + + /** The cancel. */ + private JButton cancel; + + /** The listener. */ + private InstallerButtonListener listener = new InstallerButtonListener(); + + /** The campaign. */ + private InstallableCampaign campaign; + + /** The current data set. */ + private File currDataSet; + + /** + * Instantiates a new data installer. + * + * @param owner the parent window of the dialog. + */ + public DataInstaller(Component owner) + { + initComponents(); + + IconUtilitities.maybeSetIcon(this, IconUtilitities.RESOURCE_APP_ICON); + pcgen.gui.utils.Utility.centerFrame(this, false); + } + + /** + * Check for any non standard files being installed and check with the + * user if there are. Note if the user says no to installing the non + * standard files they will be removed from the file list + * + * @param files the names of the files being installed. + * + * @return Should the install process continue + */ + private boolean checkNonStandardOK(List<String> files) + { + List<String> nonStandardFiles = new ArrayList<String>(); + for (String filename : files) + { + if (!filename.toLowerCase().startsWith(DATA_FOLDER) + && !filename.toLowerCase().startsWith(OUTPUTSHEETS_FOLDER)) + { + nonStandardFiles.add(filename); + } + } + + if (!nonStandardFiles.isEmpty()) + { + StringBuffer msg = new StringBuffer(); + for (String filename : nonStandardFiles) + { + msg.append(' ').append(filename).append("\n"); + } + int result = JOptionPane.showConfirmDialog(this, PropertyFactory + .getFormattedString("in_diNonStandardFiles", msg.toString()), + TITLE, JOptionPane.YES_NO_CANCEL_OPTION); + if (result == JOptionPane.CANCEL_OPTION) + { + return false; + } + if (result == JOptionPane.NO_OPTION) + { + for (String filename : nonStandardFiles) + { + files.remove(filename); + } + } + } + + return true; + } + + /** + * Check for any files that would be overwritten and confirm it is ok + * with the user. + * + * @param files the names of the files being installed. + * @param destDir the destination data directory + * + * @return true, if successful + */ + private boolean checkOverwriteOK(List<String> files, File destDir) + { + List<String> existingFiles = new ArrayList<String>(); + List<String> existingFilesCorr = new ArrayList<String>(); + for (String filename : files) + { + String correctedFilename = correctFileName(destDir, filename); + if (new File(correctedFilename).exists()) + { + existingFiles.add(filename); + existingFilesCorr.add(correctedFilename); + } + } + + if (!existingFiles.isEmpty()) + { + StringBuffer msg = new StringBuffer(); + for (String filename : existingFilesCorr) + { + msg.append(' ').append(filename).append("\n"); + } + int result = JOptionPane.showConfirmDialog(this, PropertyFactory + .getFormattedString("in_diOverwriteFiles", msg.toString()), + TITLE, JOptionPane.YES_NO_CANCEL_OPTION); + if (result == JOptionPane.CANCEL_OPTION) + { + return false; + } + if (result == JOptionPane.NO_OPTION) + { + for (String filename : existingFiles) + { + files.remove(filename); + } + } + } + + return true; + } + + /** + * Copy the contents of the input stream to the output stream. Used + * here to write the zipped file to the install location. + * + * @param in the input stream + * @param out the output stream + * + * @throws IOException Signals that an I/O exception has occurred. + */ + private final void copyInputStream(InputStream in, OutputStream out) + throws IOException + { + byte[] buffer = new byte[1024]; + int len; + + while ((len = in.read(buffer)) >= 0) + { + out.write(buffer, 0, len); + } + + in.close(); + out.close(); + } + + /** + * Correct the file name to account for the selected data directory and + * preference based folder locations such as output sheets. + * + * @param destDir the destination data directory + * @param fileName the file name to be corrected. + * + * @return the corrected file name. + */ + private String correctFileName(File destDir, String fileName) + { + if (fileName.toLowerCase().startsWith(DATA_FOLDER)) + { + fileName = destDir.getAbsolutePath() + fileName.substring(4); + } + else if (fileName.toLowerCase().startsWith(OUTPUTSHEETS_FOLDER)) + { + fileName = + SettingsHandler.getPcgenOutputSheetDir().getAbsolutePath() + + fileName.substring(12); + } + return fileName; + } + + /** + * Creates the directories needed by the installer, where they + * do not already exist. + * + * @param directories the directories + * @param destDir the destination data directory + * + * @return true, if successful + */ + private boolean createDirectories(List<String> directories, File destDir) + { + for (String dirname : directories) + { + String corrDirname = correctFileName(destDir, dirname); + File dir = new File(corrDirname); + if (!dir.exists()) + { + Logging.log(Logging.INFO, "Creating directory: " + dir); + if (!dir.mkdirs()) + { + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diDirNotCreated", destDir + .getAbsoluteFile()), TITLE, MessageType.ERROR); + return false; + } + } + } + return true; + } + + /** + * Creates the files in the archive, as filtered by previous user actions. + * + * @param dataSet the data set (campaign) to be installed. + * @param destDir the destination data directory + * @param files the list of file names + * + * @return true, if all files created ok + */ + private boolean createFiles(File dataSet, File destDir, List<String> files) + { + String corrFilename = ""; + ZipFile in; + // Open the ZIP file + try + { + in = new ZipFile(dataSet); + } + catch (IOException e) + { + Logging.errorPrint("Failed to read data set " + dataSet + + " due to ", e); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diBadDataSet", dataSet), TITLE, + MessageType.ERROR); + return false; + } + + try + { + for (String filename : files) + { + ZipEntry entry = in.getEntry(filename); + corrFilename = correctFileName(destDir, filename); + Logging.debugPrint("Extracting file: " + filename + " to " + + corrFilename); + copyInputStream( + in.getInputStream(entry), + new BufferedOutputStream(new FileOutputStream(corrFilename))); + } + in.close(); + } + catch (IOException e) + { + // Report the error + Logging.errorPrint("Failed to read data set " + dataSet + + " or write file " + corrFilename + " due to ", e); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diWriteFail", corrFilename), TITLE, + MessageType.ERROR); + return false; + } + return true; + } + + /** + * Gets the currently selected destination. + * + * @return the selected destination + */ + private Destination getSelectedDestination() + { + if (locDataButton.isSelected()) + { + return Destination.DATA; + } + if (locVendorDataButton.isSelected()) + { + return Destination.VENDORDATA; + } + return null; + } + + /** + * Build the user interface ready for display. + */ + private void initComponents() + { + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.WEST; + gbc.insets = new Insets(2, 2, 2, 2); + GridBagLayout gridbag = new GridBagLayout(); + setTitle(TITLE); + setLayout(gridbag); + + // Data set selection row + Utility.buildConstraints(gbc, 0, 0, 1, 1, 0.0, 0.0); + JLabel dataSetLabel = new JLabel(PropertyFactory.getString("in_diDataSet"), JLabel.RIGHT); + gridbag.setConstraints(dataSetLabel, gbc); + add(dataSetLabel, gbc); + + Utility.buildConstraints(gbc, 1, 0, 2, 1, 1.0, 0.0); + dataSetSel = new JTextField("", JLabel.WEST); + dataSetSel.setEditable(false); + gridbag.setConstraints(dataSetSel, gbc); + add(dataSetSel, gbc); + + Utility.buildConstraints(gbc, 3, 0, 1, 1, 0.0, 0.0); + gbc.fill = GridBagConstraints.NONE; + selectButton = new JButton(PropertyFactory.getString("in_select")); + gridbag.setConstraints(selectButton, gbc); + add(selectButton, gbc); + selectButton.addActionListener(listener); + + // Data set details row + Utility.buildConstraints(gbc, 0, 1, 4, 1, 1.0, 1.0); + dataSetDetails = new JLabelPane(); + dataSetDetails.setPreferredSize(new Dimension(400, 200)); + dataSetDetails.setEditable(false); + dataSetDetails.setBackground(getBackground()); + gbc.fill = GridBagConstraints.BOTH; + JScrollPane jScrollPane = new JScrollPane(); + jScrollPane.setViewportView(dataSetDetails); + gridbag.setConstraints(jScrollPane, gbc); + add(jScrollPane, gbc); + + // Location row + Utility.buildConstraints(gbc, 0, 2, 1, 1, 0.0, 0.0); + gbc.fill = GridBagConstraints.HORIZONTAL; + JLabel locLabel = new JLabel(PropertyFactory.getString("in_diLocation"), JLabel.RIGHT); + gridbag.setConstraints(locLabel, gbc); + add(locLabel, gbc); + + ButtonGroup exclusiveGroup = new ButtonGroup(); + locDataButton = + new JRadioButton(PropertyFactory + .getString("in_diData")); + Utility.setDescription(locDataButton, PropertyFactory + .getString("in_diData_tip")); + exclusiveGroup.add(locDataButton); + locVendorDataButton = + new JRadioButton(PropertyFactory + .getString("in_diVendorData")); + Utility.setDescription(locVendorDataButton, PropertyFactory + .getString("in_diVendorData_tip")); + exclusiveGroup.add(locVendorDataButton); + JPanel optionsPanel = new JPanel(); + optionsPanel.add(locDataButton); + optionsPanel.add(locVendorDataButton); + Utility.buildConstraints(gbc, 1, 2, 3, 1, 0.0, 0.0); + gridbag.setConstraints(optionsPanel, gbc); + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.WEST; + add(optionsPanel, gbc); + + // Buttons row + installButton = new JButton(PropertyFactory.getString("in_diInstall")); + installButton.addActionListener(listener); + cancel = new JButton(PropertyFactory.getString("in_cancel")); + cancel.addActionListener(listener); + + JPanel buttonsPanel = new JPanel(); + buttonsPanel.add(installButton); + buttonsPanel.add(cancel); + Utility.buildConstraints(gbc, 2, 3, 2, 1, 0.0, 0.0); + gridbag.setConstraints(buttonsPanel, gbc); + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.EAST; + add(buttonsPanel, gbc); + + pack(); + } + + /** + * Install a data set (campaign) into the current PCGen install. + * + * @param dataSet the data set (campaign) to be installed. + * @param dest The location the data is to be installed to. + * + * @return true, if install data source + */ + private boolean installDataSource(File dataSet, Destination dest) + { + // Get the directory the data is to be stored in + if (dataSet == null) + { + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diDataSetNotSelected"), TITLE, + MessageType.ERROR); + return false; + } + if (dest == null) + { + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diDataFolderNotSelected"), TITLE, + MessageType.ERROR); + return false; + } + File destDir; + switch (dest) + { + case VENDORDATA: + destDir = SettingsHandler.getPcgenVendorDataDir(); + break; + + case DATA: + default: + destDir = SettingsHandler.getPccFilesLocation(); + break; + } + + // Check chosen dir exists + if (!destDir.exists()) + { + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diDataFolderNotExist", destDir + .getAbsoluteFile()), TITLE, MessageType.ERROR); + return false; + } + + // Scan for non standard files and files that would be overwritten + List<String> directories = new ArrayList<String>(); + List<String> files = new ArrayList<String>(); + if (!populateFileAndDirLists(dataSet, directories, files)) + { + return false; + } + if (!checkNonStandardOK(files)) + { + return false; + } + if (!checkOverwriteOK(files, destDir)) + { + return false; + } + + if (!createDirectories(directories, destDir)) + { + return false; + } + + // Navigate through the zip file, processing each file + return createFiles(dataSet, destDir, files); + } + + + /** + * Populate the lists of files and directories to be installed. + * + * @param dataSet the data set (campaign) to be installed. + * @param directories the list of directory names + * @param files the list of file names + * + * @return true, if populate file and dir lists + */ + @SuppressWarnings("unchecked") + private boolean populateFileAndDirLists(File dataSet, + List<String> directories, List<String> files) + { + // Navigate through the zip file, processing each file + try + { + // Open the ZIP file + ZipFile in = new ZipFile(dataSet); + + Enumeration entries = in.entries(); + while (entries.hasMoreElements()) + { + ZipEntry entry = (ZipEntry) entries.nextElement(); + if (entry.isDirectory()) + { + directories.add(entry.getName()); + } + else if (!entry.getName().equals("Install.lst")) + { + files.add(entry.getName()); + } + } + in.close(); + } + catch (IOException e) + { + // Report the error + Logging.errorPrint("Failed to read data set " + dataSet + + " due to ", e); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diBadDataSet", dataSet), TITLE, + MessageType.ERROR); + return false; + } + return true; + } + + /** + * Read data set. + * + * @param dataSet the data set + * + * @return true, if successful + */ + private boolean readDataSet(File dataSet) + { + try + { + // Open the ZIP file + ZipFile in = new ZipFile(dataSet); + + // Get the install file + ZipEntry entry = in.getEntry("Install.lst"); + if (entry == null) + { + // Report that it isn't a valid data set + Logging.errorPrint("File " + dataSet + + " is not a valid datsset - no Install.lst file"); + ShowMessageDelegate.showMessageDialog( + PropertyFactory.getFormattedString("in_diNoInstallFile", + dataSet.getName()), TITLE, MessageType.WARNING); + in.close(); + return false; + } + + // Parse the install file + InputStream inStream = in.getInputStream(entry); + StringBuffer installInfo = new StringBuffer(); + byte[] b = new byte[512]; + int len = 0; + while ((len = inStream.read(b)) != -1) + { + installInfo.append((new String(b, "UTF8")).substring(0, len)); + } + final InstallLoader loader = new InstallLoader(); + loader.loadLstString(dataSet.toURI(), installInfo.toString()); + campaign = loader.getCampaign(); + in.close(); + } + catch (IOException e) + { + // Report the error + Logging.errorPrint("Failed to read data set " + dataSet + + " due to ", e); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diBadDataSet", dataSet), TITLE, + MessageType.ERROR); + return false; + } + catch (PersistenceLayerException e) + { + Logging.errorPrint("Failed to parse data set " + dataSet + + " due to ", e); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diBadDataSet", dataSet), TITLE, + MessageType.ERROR); + return false; + } + + // Validate that the campaign is compatible with our version + if (campaign.getMinDevVer() != null + && !CoreUtility.isPriorToCurrent(campaign.getMinDevVer())) + { + if (CoreUtility.isCurrMinorVer(campaign.getMinDevVer())) + { + Logging.errorPrint("Dataset " + campaign.getDisplayName() + + " needs at least PCGen version " + + campaign.getMinDevVer() + + " to run. It could not be installed."); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diVersionTooOldDev", campaign + .getMinDevVer(), campaign.getMinVer()), TITLE, + MessageType.WARNING); + return false; + } + } + if (campaign.getMinVer() != null + && !CoreUtility.isPriorToCurrent(campaign.getMinVer())) + { + Logging.errorPrint("Dataset " + campaign.getDisplayName() + + " needs at least PCGen version " + campaign.getMinVer() + + " to run. It could not be installed."); + ShowMessageDelegate.showMessageDialog(PropertyFactory + .getFormattedString("in_diVersionTooOld", campaign.getMinVer()), + TITLE, MessageType.WARNING); + return false; + } + + // Display the info + dataSetSel.setText(dataSet.getAbsolutePath()); + dataSetDetails.setText(MainSource.buildInfoLabel(campaign)); + if (campaign.getDest() == null) + { + locDataButton.setSelected(false); + locVendorDataButton.setSelected(false); + } + else + { + switch (campaign.getDest()) + { + case DATA: + locDataButton.setSelected(true); + break; + case VENDORDATA: + locVendorDataButton.setSelected(true); + break; + } + } + currDataSet = dataSet; + + toFront(); + return true; + } +} \ No newline at end of file Modified: branches/cdom/code/src/java/pcgen/gui/EQFrame.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/EQFrame.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/EQFrame.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -54,9 +54,8 @@ this.aPC = aPC; - Toolkit kit = Toolkit.getDefaultToolkit(); - Image img = kit.getImage(getClass().getResource(IconUtilitities.RESOURCE_URL + "PcgenIcon.gif")); - this.setIconImage(img); + IconUtilitities.maybeSetIcon(this, + IconUtilitities.RESOURCE_APP_ICON); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Modified: branches/cdom/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/EqBuilder.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/EqBuilder.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -1709,7 +1709,7 @@ if (!nwid.getWasCancelled()) { - StringBuffer modString = new StringBuffer("PCGENi_WEAPON"); + StringBuffer modString = new StringBuffer(Constants.s_INTERNAL_EQMOD_WEAPON); modString.append("|DAMAGE=").append(nwid.getDamage()); modString.append("|CRITRANGE=").append(nwid.getCritRange()); modString.append("|CRITMULT=").append(nwid.getCritMultiplier()); @@ -1722,7 +1722,7 @@ } } - final String modString = "PCGENi_WEAPON|RANGE="; + final String modString = Constants.s_INTERNAL_EQMOD_WEAPON + "|RANGE="; if (aNewEq.isWeapon() && aNewEq.isRanged()) { Modified: branches/cdom/code/src/java/pcgen/gui/HPFrame.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/HPFrame.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/HPFrame.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -20,19 +20,19 @@ */ package pcgen.gui; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Toolkit; + +import javax.swing.JFrame; +import javax.swing.WindowConstants; + import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.gui.utils.IconUtilitities; import pcgen.gui.utils.Utility; import pcgen.util.PropertyFactory; -import javax.swing.JFrame; -import javax.swing.WindowConstants; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Image; -import java.awt.Toolkit; - /** * Popup frame with export options * @@ -48,9 +48,8 @@ super(); setTitle(myGetTitle()); + IconUtilitities.maybeSetIcon(this, IconUtilitities.RESOURCE_APP_ICON); Toolkit kit = Toolkit.getDefaultToolkit(); - Image img = kit.getImage(getClass().getResource(IconUtilitities.RESOURCE_URL + "PcgenIcon.gif")); - this.setIconImage(img); // since the Toolkit.getScreenSize() method is broken in the Linux implementation // of Java 5 (it returns double the screen size under xinerama), this method is Modified: branches/cdom/code/src/java/pcgen/gui/KitSelector.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/KitSelector.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/KitSelector.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -241,7 +241,7 @@ private void initComponentContents() { - IconUtilitities.maybeSetIcon(this, "PcgenIcon.gif"); + IconUtilitities.maybeSetIcon(this, IconUtilitities.RESOURCE_APP_ICON); lstAvailable = new JList(new KitListModel(new ArrayList<Kit>())); lstAvailable.setCellRenderer(new MyCellRenderer()); Modified: branches/cdom/code/src/java/pcgen/gui/LstEditorMain.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/LstEditorMain.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/LstEditorMain.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -130,7 +130,7 @@ { initComponents(); - IconUtilitities.maybeSetIcon(this, "PcgenIcon.gif"); + IconUtilitities.maybeSetIcon(this, IconUtilitities.RESOURCE_APP_ICON); pcgen.gui.utils.Utility.centerFrame(this, false); } Modified: branches/cdom/code/src/java/pcgen/gui/MainSource.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/MainSource.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/MainSource.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -133,6 +133,7 @@ private static final int VIEW_PUBLISH = 1; private static final int VIEW_PUBSET = 2; private static final int VIEW_PUBFMTSET = 3; + //private static final int VIEW_RANK = 4; private static int viewMode = VIEW_PUBFMTSET; // keep track of what view mode we're in for Available private static int viewSelectMode = VIEW_PRODUCT; // keep track of what view mode we're in for Selected. defaults to "Name" @@ -142,6 +143,7 @@ private static PObjectNode typePubRoot; private static PObjectNode typePubSetRoot; private static PObjectNode typePubFmtSetRoot; + //private static PObjectNode rankRoot; private final JLabel avaLabel = new JLabel( /*"Available"*/ ); private final JLabel selLabel = new JLabel( /*"Selected"*/ @@ -366,58 +368,20 @@ final String web = aCamp.getSourceEntry().getSourceBook().getWebsite(); websiteButton.setEnabled(web != null); - StringBuffer sb = new StringBuffer(); - sb.append("<b>") - .append(aCamp.getDisplayName()) - .append("</b><br>"); - sb.append("<html>"); - if(aCamp.getCoverFiles().size() > 0) { - CampaignSourceEntry image = aCamp.getCoverFiles().get(0); - sb.append("<img src='") - .append(image.getURI()) - .append("'><br>"); - } - sb.append("<b>TYPE</b>: ") - .append(aCamp.getType()); - sb.append(" <b>RANK</b>: ") - .append(aCamp.getRank()); - sb.append(" <b>GAME MODE</b>: ") - .append(aCamp.getGameModeString()); + // Test of new format +// sb = new StringBuffer("<b>Behemoth3 - Masters and Minions - Horde Book 1: A Swarm of Stirges</b><br>\r\n"); +// sb.append("<b>DESCRIPTION:</b> Textual Description, may be multiple lines <br>"); +// sb.append("<b>WEBSITE:</b> <a href=\"http://pcgen.sourceforge.net\" >Behemoth3 - Masters and Minions</a><br>"); +// sb.append("<b>TYPE:</b> BEHEMOTH3.MASTERS AND MINIONS\xA0 <b>RANK:</b> 6\xA0 <b>GAME MODE:</b> 35e\xA0 <b>SOURCE:</b> A Swarm of Stirges<br>\r\n"); +// sb.append("<b>PURCHASE:</b> <a href=\"http://pcgen.sourceforge.net\" >Buy this book from Amazon.com</a><br>"); +// sb.append("<b>SURVEY:</b> <a href=\"http://pcgen.sourceforge.net\" >Tell us about your use of this dataset</a><br>"); +// +// sb.append("<b>COPYRIGHT:</b><br>\r\n"); +// sb.append("Open Game License v. 1.0 Copyright 2000, Wizards of the Coast, Inc.<br>\r\n"); +// sb.append("System Reference Document Copyright 2000-2003, Wizards of the Coast, Inc.; Authors Jonathan Tweet, Monte Cook, Skip Williams, Rich Baker, Andy Collins, David Noonan, Rich Redman, Bruce R. Cordell, John D. Rateliff, Thomas Reid, James Wyatt, based on original material by E. Gary Gygax and Dave Arneson.<br>\r\n"); +// sb.append("Masters and Minions Horde Book 1: A Swarm of Stirges Copyright (c) 2004, Behemoth3, Inc.; Author Tavis Allison. PCGen dataset conversion for Masters and Minions Horde Book 1: A Swarm of Stirges Copyright 2004-2005, PCGen Data team (Including, but not limited to Eddy Anthony, Andrew McDougall (Tir Gwaith)) "); - String bString = aCamp.getDefaultSourceString(); - - if (bString.length() > 0) - { - sb.append(" <b>SOURCE</b>: ") - .append(bString); - } - - boolean infoDisplayed = false; - bString = aCamp.getInfoText(); - - if (bString.length() > 0) - { - sb.append("<p><b>INFORMATION</b>:<br>") - .append(bString) - .append("</p>"); - infoDisplayed = true; - } - - bString = aCamp.getSection15String(); - - if (bString.length() != 0) - { - if (!infoDisplayed) - { - sb.append("<br"); - } - - sb.append("<b>COPYRIGHT</b>:<br>") - .append(bString); - } - - sb.append("</html>"); - infoLabel.setText(sb.toString()); + infoLabel.setText(buildInfoLabel(aCamp)); } else //must just be a branch node { @@ -450,6 +414,72 @@ } } + /** + * Create the html text content for the information label for a campaign + * @param aCamp The campaign. + */ + static String buildInfoLabel(final Campaign aCamp) + { + StringBuffer sb = new StringBuffer(); + sb.append("<html><b>") + .append(aCamp.getDisplayName()) + .append("</b><br>"); + if(aCamp.getCoverFiles().size() > 0) { + CampaignSourceEntry image = aCamp.getCoverFiles().get(0); + sb.append("<img src='") + .append(image.getURI()) + .append("'><br>"); + } + if (aCamp.getType().length() > 0) + { + sb.append("<b>TYPE</b>: ") + .append(aCamp.getType()) + .append(" "); + } + sb.append("<b>RANK</b>: ") + .append(aCamp.getRank()); + if (aCamp.getGameModeString().length() > 0) + { + sb.append(" <b>GAME MODE</b>: ") + .append(aCamp.getGameModeString()); + } + + String bString = aCamp.getDefaultSourceString(); + + if (bString.length() > 0) + { + sb.append(" <b>SOURCE</b>: ") + .append(bString); + } + + boolean infoDisplayed = false; + bString = aCamp.getInfoText(); + + if (bString.length() > 0) + { + sb.append("<p><b>INFORMATION</b>:<br>") + .append(bString) + .append("</p>"); + infoDisplayed = true; + } + + bString = aCamp.getSection15String(); + + if (bString.length() != 0) + { + if (!infoDisplayed) + { + sb.append("<br"); + } + + sb.append("<b>COPYRIGHT</b>:<br>") + .append(bString); + } + + sb.append("</html>"); + return sb.toString(); + } + private void setLoadedColMaxWidth() { //make the "Loaded" checkbox column a reasonable size @@ -790,6 +820,7 @@ viewComboBox.addItem("Company"); viewComboBox.addItem("Company/Setting"); viewComboBox.addItem("Comp/Fmt/Setting"); //abbr. here so that all GUI elements will fit when started at default window size + //viewComboBox.addItem("Rank"); Utility.setDescription(viewComboBox, "You can change how the Sources in the Tables are listed."); viewMode = SettingsHandler.getPCGenOption("pcgen.options.sourceTab.availableListMode", VIEW_PUBFMTSET); viewComboBox.setSelectedIndex(viewMode); // must be done before createModels call @@ -1078,6 +1109,12 @@ updateModels(); showSourcesLoaded(oldStatus); + + if (Globals.getRootFrame() != null) + { + PCGen_Frame1.getInst().refreshCharInfoTabs(); + } + } }; @@ -1143,8 +1180,10 @@ typePubRoot = new PObjectNode(); typePubSetRoot = new PObjectNode(); typePubFmtSetRoot = new PObjectNode(); + //rankRoot = new PObjectNode(); Set<String> aList = new TreeSet<String>(); //TYPE list + //Set<Integer> rankList = new TreeSet<Integer>(); //RANK list for (Campaign aCamp : Globals.getCampaignList()) { @@ -1154,6 +1193,7 @@ { aList.add(aCamp.getMyType(0)); //TYPE[0] = Publisher } + //rankList.add(aCamp.getRank()); } } @@ -1164,6 +1204,20 @@ PObjectNode[] p1 = new PObjectNode[size]; PObjectNode[] p2 = new PObjectNode[size]; PObjectNode[] p3 = new PObjectNode[size]; +// PObjectNode[] pRank = new PObjectNode[rankList.size()+1]; +// int arrayIdx = 0; +// for (Integer rank : rankList) +// { +// PObjectNode pon = new PObjectNode(); +// pon.setItem(rank.toString()); +// pon.setParent(rankRoot); +// pRank[arrayIdx++] = pon; +// } +// PObjectNode opon = new PObjectNode(); +// opon.setItem("Other"); +// opon.setParent(rankRoot); +// pRank[arrayIdx++] = opon; +// rankRoot.setChildren(pRank); int arrayIdx = 0; for (String s : aList) @@ -1910,6 +1964,46 @@ break; +// case VIEW_RANK: // by Rank/Product Name +// setRoot((PObjectNode) MainSource.rankRoot.clone()); +// +// for (Campaign aCamp : campList) +// { +// PObjectNode rootAsPObjectNode = (PObjectNode) super.getRoot(); +//// final Campaign aCamp = (Campaign) fI.next(); +// +// // filter out campaigns here +// if (!shouldDisplayThis(aCamp, aPC) || !aCamp.isGameMode(allowedModes)) +// { +// continue; +// } +// +// //don't display selected campaigns in the available table +// if (available && selectedCampaigns.contains(aCamp)) +// { +// continue; +// } +// +// boolean added = false; +// +// for (int i = 0; i < rootAsPObjectNode.getChildCount(); ++i) +// { +// //if we've matched Publisher, or we've reached the last node ("Other") then add it here +// if (String.valueOf(aCamp.getRank()).equals(rootAsPObjectNode.getChild(i).getItem().toString()) +// || (!added && (i == (rootAsPObjectNode.getChildCount() - 1)))) +// { +// PObjectNode aFN = new PObjectNode(); +// aFN.setParent(rootAsPObjectNode.getChild(i)); +// aFN.setItem(aCamp); +// PrereqHandler.passesAll(aCamp.getPreReqList(), aPC, aCamp ); +// rootAsPObjectNode.getChild(i).addChild(aFN); +// added = true; +// } +// } +// } +// +// break; + default: Logging.errorPrint("In MainSource.CampaignlModel.resetModel the mode " + mode + " is not handled."); Modified: branches/cdom/code/src/java/pcgen/gui/NameGui.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/NameGui.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/NameGui.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -57,9 +57,8 @@ super("Random Name Generator"); this.pc = pc; - // according to the API, the following should *ALWAYS* use '/' - this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource(IconUtilitities.RESOURCE_URL - + "PcgenIcon.gif"))); + IconUtilitities.maybeSetIcon(this, + IconUtilitities.RESOURCE_APP_ICON); Utility.centerFrame(this, true); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); Modified: branches/cdom/code/src/java/pcgen/gui/NewWeaponInfoDialog.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/NewWeaponInfoDialog.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/NewWeaponInfoDialog.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -58,9 +58,8 @@ Toolkit kit = Toolkit.getDefaultToolkit(); - // according to the API, the following should *ALWAYS* use '/' - Image img = kit.getImage(getClass().getResource(IconUtilitities.RESOURCE_URL + "PcgenIcon.gif")); - parent.setIconImage(img); + IconUtilitities.maybeSetIcon(parent, + IconUtilitities.RESOURCE_APP_ICON); initComponents(); setLocationRelativeTo(parent); // centre on parent (Canadian spelling eh?) } Modified: branches/cdom/code/src/java/pcgen/gui/PCCCreator.java =================================================================== --- branches/cdom/code/src/java/pcgen/gui/PCCCreator.java 2008-01-14 05:07:17 UTC (rev 4884) +++ branches/cdom/code/src/java/pcgen/gui/PCCCreator.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -85,9 +85,8 @@ { mSrc = ms; - Toolkit kit = Toolkit.getDefaultToolkit(); - Image img = kit.getImage(getClass().getResource(IconUtilitities.RESOURCE_URL + "PcgenIcon.gif")); - this.setIconImage(img); + IconUtilitities.maybeSetIcon(this, + IconUtilitities.RESOURCE_APP_ICON); buildTree(); JButton writeBtn = new JButton("Write .pcc file"); Copied: branches/cdom/code/src/java/pcgen/gui/PCGenMenuBar.java (from rev 4876, Trunk/pcgen/code/src/java/pcgen/gui/PCGenMenuBar.java) =================================================================== --- branches/cdom/code/src/java/pcgen/gui/PCGenMenuBar.java (rev 0) +++ branches/cdom/code/src/java/pcgen/gui/PCGenMenuBar.java 2008-01-14 05:08:40 UTC (rev 4885) @@ -0,0 +1,827 @@ +/* + * MenuItems.java + * Copyright 2007 (C) James Dempsey <jde...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 8/12/2007 + * + * $Id$ + */ +package pcgen.gui; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; + +import javax.swing.Box; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; + +import pcgen.core.Constants; +import pcgen.core.SettingsHandler; +import pcgen.core.utils.MessageType; +import pcgen.core.utils.ShowMessageDelegate; +import pcgen.gui.filter.FilterDialogFactory; +import pcgen.gui.utils.BrowserLauncher; +import pcgen.gui.utils.JOpenRecentMenu; +import pcgen.gui.utils.Utility; +import pcgen.util.FOPResourceChecker; +import pcgen.util.Logging; +import pcgen.util.PropertyFactory; + +/** + * Main menu bar of the PCGen application. + * <p/> + * There is still a tight integration with the + * PCGen_Frame1 class though, where this was originally + * defined. + * <p/> + * The {@link Options} + * and {@link GameModes} are all created externally. + * + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +final class PCGenMenuBar extends JMenuBar +{ + /** The PCGen window we are attached to. */ + private final PCGen_Frame1 mainFrame; + + static final long serialVersionUID = 1042236188732008819L; + + /** Instantiated popup frame {@link ExportPopup}. */ + public ExportPopup exportPopup = null; + + /** Instantiated popup frame {@link AboutFrame}. */ + AboutFrame aboutFrame = null; + + /** Instantiated popup frame {@link DebugFrame}. */ + DebugFrame debugFrame = null; + + /** Instantiated popup frame {@link ExportPDFPopup}. */ + ExportPDFPopup exportPDFPopup = null; + + /** Instantiated popup frame {@link ExportTextPopup}. */ + ExportTextPopup exportTextPopup = null; + + private JCheckBoxMenuItem debugMode; + JMenu exportMenu; + private JMenu filtersMenu; + private JMenu importMenu; + private JMenu helpMenu; + JMenuItem addKit; + JMenuItem closeAllItem; + JMenuItem closeItem; + JMenuItem exitItem; + JMenuItem exportItem; + private JMenuItem exportPDFItem; + private JMenuItem installDataItem; + JMenuItem listEditor; + JMenuItem newItem; + JMenuItem newNPCItem; + JMenuItem openItem; + JMenuItem partyCloseItem; + JMenuItem partyOpenItem; + JMenuItem partySaveAsItem; + JMenuItem partySaveItem; + JMenuItem printItem; + JMenuItem printPreviewItem; + JMenuItem revertToSavedItem; + JMenuItem saveAllItem; + JMenuItem saveAsItem; + JMenuItem saveItem; + JMenuItem treasureItem; + JOpenRecentMenu openRecentPCMenu; + JOpenRecentMenu openRecentPartyMenu; + private LoggingLevelMenu loggingMenu; + + /** Instantiated popup frame {@link PrintFrame}. */ + PrintFrame printFrame = null; + boolean enablePDF; + + /** + * Create a new menu item bar including all menu items. + * @param pcgenframe The PCGen window we are attached to. + * @param frameActionListener Listener for Menubar and toolbar actions. + */ + public PCGenMenuBar(PCGen_Frame1 pcgenFrame, + FrameActionListener frameActionListener) + { + mainFrame = pcgenFrame; + // check for resources needed by FOP + enablePDF = (FOPResourceChecker.getMissingResourceCount() == 0); + mainFrame.checkResources(); + + //File Menu + JMenu fileMenu = createFileMenu(frameActionListener); + this.add(fileMenu); + + //Options Menu (called Settings in the UI) + Options optionMenu = new Options(); + this.add(optionMenu); + + //Tools Menu + JMenu toolsMenu = createToolsMenu(); + this.add(toolsMenu); + + //Debug Menu + JMenu debugMenu = createDebugMenu(); + this.add(debugMenu); + + //Help Menu + helpMenu = createHelpMenu(); + this.add(helpMenu); + + // Scootch the Help menu over to the right + separateHelpMenu(!UIFactory.isWindowsUI()); + } + + /** + * Create the file menu, which handles character related things such as + * creating, loading, saving and printing character. + * + * @param frameActionListener The listener interested in events from us. + * @return The file menu. + */ + private JMenu createFileMenu(FrameActionListener frameActionListener) + { + JMenu fileMenu = Utility.createMenu("mnuFile", null, true); + + newItem = + Utility.createMenuItem("mnuFileNew", + frameActionListener.newActionListener, "file.new", + "shortcut N", "New16.gif", false); + fileMenu.add(newItem); + + newNPCItem = + Utility.createMenuItem("mnuFileNewNPC", + frameActionListener.newNPCActionListener, "file.newNPC", + null, "NewNPC16.gif", false); + fileMenu.add(newNPCItem); + + openItem = + Utility.createMenuItem("mnuFileOpen", + frameActionListener.openActionListener, "file.open", + "shortcut O", "Open16.gif", true); + fileMenu.add(openItem); + + openRecentPCMenu = + new JOpenRecentMenu(new JOpenRecentMenu.OpenRecentCallback() + { + public void openRecentPerformed(ActionEvent e, File file) + { + PCGenMenuBar.this.mainFrame.loadPCFromFile(file); + } + }); + fileMenu.add(openRecentPCMenu); + + fileMenu.addSeparator(); + + closeItem = + Utility.createMenuItem("mnuFileClose", + frameActionListener.closeActionListener, "file.close", + "shortcut W", "Close16.gif", false); + fileMenu.add(closeItem); + + closeAllItem = + Utility.createMenuItem("mnuFileCloseAll", + frameActionListener.closeAllActionListener, + "file.closeall", null, "CloseAll16.gif", false); + + // Special so that Close A_l_l, not C_l_ose All + //closeAllItem.setDisplayedMnemonicIndex(7); // JDK 1.4 + fileMenu.add(closeAllItem); + + saveItem = + Utility.createMenuItem("mnuFileSave", + frameActionListener.saveActionListener, "file.save", + "shortcut S", "Save16.gif", false); + fileMenu.add(saveItem); + + saveAsItem = + Utility.createMenuItem("mnuFileSaveAs", + frameActionListener.saveAsActionListener, "file.saveas", + "shift-shortcut S", "SaveAs16.gif", false); + + // Special so that Save _A_s..., not S_a_ve As... + //saveAsItem.setDisplayedMnemonicIndex(5); // JDK 1.4 + fileMenu.add(saveAsItem); + + saveAllItem = + Utility.createMenuItem("mnuFileSaveAll", + frameActionListener.saveAllActionListener, "file.saveall", + null, "SaveAll16.gif", false); + fileMenu.add(saveAllItem); + + revertToSavedItem = + Utility.createMenuItem("mnuFileRevertToSaved", + frameActionListener.revertToSavedActionListener, + "file.reverttosaved", "shortcut R", null, false); + fileMenu.add(revertToSavedItem); + + fileMenu.addSeparator(); + + JMenu partyMenu = Utility.createMenu("mnuFileParty", null, true); + fileMenu.add(partyMenu); + + partyOpenItem = + Utility.createMenuItem("mnuFilePartyOpen", + frameActionListener.partyOpenActionListener, + "file.party.open", null, "Open16.gif", true); + partyMenu.add(partyOpenItem); + + openRecentPartyMenu = + new JOpenRecentMenu(new JOpenRecentMenu.OpenRecentCallback() + { + public void openRecentPerformed(ActionEvent e, File file) + { + PCGenMenuBar.this.mainFrame.loadPartyFromFile(file); + } + }); + partyMenu.add(openRecentPartyMenu); + + partyCloseItem = + Utility.createMenuItem("mnuFilePartyClose", + frameActionListener.partyCloseActionListener, + "file.party.close", null, "Close16.gif", false); + partyMenu.addSeparator(); + + partyMenu.add(partyCloseItem); + + partySaveItem = + Utility.createMenuItem("mnuFilePartySave", + frameActionListener.partySaveActionListener, + "file.party.save", null, "Save16.gif", false); + partyMenu.add(partySaveItem); + + partySaveAsItem = + Utility.createMenuItem("mnuFilePartySaveAs", + frameActionListener.partySaveAsActionListener, + "file.party.saveas", null, "SaveAs16.gif", false); + partyMenu.add(partySaveAsItem); + + fileMenu.addSeparator(); + + printPreviewItem = + Utility.createMenuItem("mnuFilePrintPreview", + frameActionListener.printPreviewActionListener, + "file.printpreview", null, "PrintPreview16.gif", false); + fileMenu.add(printPreviewItem); + + printItem = + Utility.createMenuItem("mnuFilePrint", + frameActionListener.printActionListener, "file.print", + "shortcut P", "Print16.gif", false); + fileMenu.add(printItem); + + fileMenu.addSeparator(); + + importMenu = + Utility.createMenu("Import", 'I', + "Import from other file formats", "Import16.gif", true); + + // Do not add until we get some formats to + // import. --bko XXX + //fileMenu.add(importMenu); + exportMenu = Utility.createMenu("mnuFileExport", "Export16.gif", false); + fileMenu.add(exportMenu); + + exportItem = + Utility.createMenuItem("mnuFileExportStandard", + frameActionListener.exportToStandardActionListener, + "file.export.standard", null, null, true); + exportMenu.add(exportItem); + + /* + * changed this, so a warning will pop up, + * if user tries to print without having the needed + * libraries installed + * + * author: Thomas Behr 03-01-02 + */ + exportPDFItem = + Utility.createMenuItem("mnuFileExportPDF", new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + if (enablePDF) + { + if (exportPDFPopup == null) + { + exportPDFPopup = + new ExportPDFPopup( + PCGen_Frame1.baseTabbedPane); + } + exportPDFPopup.setCurrentPCSelectionByTab(); + } + else + { + PCGenMenuBar.this.mainFrame.warnAboutMissingResource(); + } + } + }, "file.export.pdf", null, null, true); + exportMenu.add(exportPDFItem); + + // Added New Text Export + exportItem = + Utility.createMenuItem("mnuFileExportText", + frameActionListener.exportToTextActionListener, + "file.export.text", null, null, true); + exportMenu.add(exportItem); + + fileMenu.addSeparator(); + + addKit = + Utility.createMenuItem("mnuFileAddKit", + frameActionListener.addKitActionListener, "assign.kit", + "shortcut K", "Information16.gif", false); + fileMenu.add(addKit); + + fileMenu.addSeparator(); + + exitItem = Utility.createMenuItem("mnuFileExit", new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + mainFrame.exitItem_actionPerformed(); + } + }, "file.exit", "shortcut Q", null, true); + fileMenu.add(exitItem); + return fileMenu; + } + + /** + * Creates the tools menu, which handles things like filters, list + * editors, generators and GMGen. + * + * @return The tools menu + */ + private JMenu createToolsMenu() + { + JMenu toolsMenu = Utility.createMenu("mnuTools", "wrench.gif", true); + + treasureItem = + Utility.createMenuItem("mnuToolsTreasure", new ActionListener() + { + public void actionPerformed(final ActionEvent e) + { + new TreasureGeneratorDlg(mainFrame); + } + }, "tools.teasure", "shortcut T", null, true); + toolsMenu.add(treasureItem); + /*JMenuItem converterItem = Utility.createMenuItem("mnuToolsLstConverter", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + String basePath = null; + + if (lstConverter == null) + { + if (SettingsHandler.getPccFilesLocation() != null) + { + basePath = SettingsHandler.getPccFilesLocation().toString(); + } + } + else + { + basePath = lstConverter.getBasePath(); + } + + JFileChooser fc = new JFileChooser(); + fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fc.setDialogTitle("Select base directory to convert"); + + if (System.getProperty("os.name").startsWith("Mac OS")) + { + // On MacOS X, do not traverse file bundles + fc.putClientProperty("JFileChooser.appBundleIsTraversable", "never"); + } + + if (basePath != null) + { + final File baseFile = new File(basePath); + fc.setCurrentDirectory(baseFile.getParentFile()); + fc.setSelectedFile(baseFile); + } + + final int returnVal = fc.showOpenDialog(getParent().getParent()); //ugly, but it works + + if (returnVal == JFileChooser.APPROVE_OPTION) + { + final File file = fc.getSelectedFile(); + + if ((lstConverter == null) || (basePath == null) || !basePath.equals(file.toString())) + { + lstConverter = new LstConverter(file.toString()); + } + + lstConverter.setVisible(true); + } + } + }, "tools.converter", null, "wrench.gif", true); + toolsMenu.add(converterItem);*/ + + filtersMenu = Utility.createMenu("mnuToolsFilters", "Zoom16.gif", true); + toolsMenu.add(filtersMenu); + + JMenuItem openFiltersItem = + Utility.createMenuItem("mnuToolsFiltersOpen", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + FilterDialogFactory.showHideFilterSelectDialog(); + } + }, "tools.filters.open", null, "Zoom16.gif", true); + filtersMenu.add(openFiltersItem); + + JMenuItem clearFiltersItem = + Utility.createMenuItem("mnuToolsFiltersClear", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + FilterDialogFactory + .clearSelectedFiltersForSelectedFilterable(); + } + }, "tools.filters.clear", null, "RemoveZoom16.gif", true); + filtersMenu.add(clearFiltersItem); + + JMenuItem customFiltersItem = + Utility.createMenuItem("mnuToolsFiltersCustom", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + FilterDialogFactory.showHideFilterCustomDialog(); + } + }, "tools.filters.custom", null, "CustomZoom16.gif", true); + filtersMenu.add(customFiltersItem); + + JMenuItem editFiltersItem = + Utility.createMenuItem("mnuToolsFiltersEdit", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + FilterDialogFactory.showHideFilterEditorDialog(); + } + }, "tools.filters.edit", null, "EditZoom16.gif", true); + filtersMenu.add(editFiltersItem); + + toolsMenu.addSeparator(); + + JMenuItem gmgenItem = + Utility.createMenuItem("mnuToolsGMGen", new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + PCGenMenuBar.this.mainFrame.openGMGen_actionPerformed(); + } + }, "tools.gmgen", null, "gmgen_icon.png", true); + toolsMenu.add(gmgenItem); + + toolsMenu.addSeparator(); + + installDataItem = + Utility.createMenuItem("mnuToolsInstallData", new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + DataInstaller di = new DataInstaller(PCGenMenuBar.this.mainFrame); + di.setVisible(true); + } + }, "tools.installdata", null, null, true); + toolsMenu.add(installDataItem); + + toolsMenu.addSeparator(); + + // + // List Editors + // + listEditor = + Utility.createMenuItem("mnuToolsListEditors", + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + new LstEditorMain().setVisible(true); + } + }, "tools.editors", null, n... [truncated message content] |