/* * SettingsHandler.java * Copyright 2001 (C) Jonas Karlsson * * 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 July 10, 2002, 2:15 PM * * Current Ver: $Revision$ * */ package pcgen.core; import java.awt.Color; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import javax.swing.SwingConstants; import org.apache.commons.lang3.SystemUtils; import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.SourceFormat; import pcgen.core.utils.CoreUtility; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.core.utils.SortedProperties; import pcgen.persistence.PersistenceManager; import pcgen.system.ConfigurationSettings; import pcgen.system.LanguageBundle; import pcgen.util.Logging; /** * This class contains all settings-related code moved from Globals.java * * Should be cleaned up more. * * <b>NB: This class is being gradually replaced with use of * {@link pcgen.system.PropertyContext} and its children.</b> * * @author jujutsunerd **/ public final class SettingsHandler { private static boolean autoFeatsRefundable = false; private static boolean autogenExoticMaterial = false; private static boolean autogenMagic = false; private static boolean autogenMasterwork = false; private static boolean autogenRacial = false; public static boolean validateBonuses = false; // // For EqBuilder // private static int maxPotionSpellLevel = Constants.DEFAULT_MAX_POTION_SPELL_LEVEL; private static int maxWandSpellLevel = Constants.DEFAULT_MAX_WAND_SPELL_LEVEL; private static boolean allowMetamagicInCustomizer = false; private static boolean spellMarketPriceAdjusted = false; // Map of RuleCheck keys and their settings private static Map<String, String> ruleCheckMap = new HashMap<>(); /** That browserPath is set to null is intentional. */ private static String browserPath = null; //Intentional null /** * See @javax.swing.SwingConstants. */ private static int chaTabPlacement = SwingConstants.TOP; private static Dimension customizerDimension = null; private static Point customizerLeftUpperCorner = null; private static int customizerSplit1 = -1; private static int customizerSplit2 = -1; private static boolean enforceSpendingBeforeLevelUp = false; private static final Properties FILTERSETTINGS = new Properties(); public static GameMode game = new GameMode("default"); private static boolean grimHPMode = false; private static boolean grittyACMode = false; private static Dimension kitSelectorDimension = null; private static Point kitSelectorLeftUpperCorner = null; private static boolean useWaitCursor = true; private static boolean loadURLs = false; private static boolean hpMaxAtFirstLevel = true; private static boolean hpMaxAtFirstClassLevel = true; private static boolean hpMaxAtFirstPCClassLevelOnly = true; private static int hpRollMethod = Constants.HP_STANDARD; private static int hpPercent = Constants.DEFAULT_HP_PERCENT; private static boolean ignoreMonsterHDCap = false; private static String invalidDmgText; private static String invalidToHitText; private static boolean gearTab_IgnoreCost = false; private static boolean gearTab_AutoResize = false; private static boolean gearTab_AllowDebt = false; private static int gearTab_SellRate = Constants.DEFAULT_GEAR_TAB_SELL_RATE; private static int gearTab_BuyRate = Constants.DEFAULT_GEAR_TAB_BUY_RATE; private static boolean isROG = false; private static Point leftUpperCorner = null; private static int windowState = Frame.NORMAL; private static int looknFeel = 1; // default to Java L&F private static final SortedProperties options = new SortedProperties(); private static final Properties filepaths = new Properties(); private static final String fileLocation = Globals.getFilepathsPath(); private static File pccFilesLocation = null; private static File pcgPath = new File(Globals.getDefaultPath()); private static File lastUsedPcgPath = null; // NB: This is not saved to preferences private static File backupPcgPath = null; private static boolean createPcgBackup = true; private static File portraitsPath = new File(Globals.getDefaultPath()); private static File pcgenSponsorDir = new File(Globals.getDefaultPath() + File.separator + "system" //$NON-NLS-1$ + File.separator + "sponsors"); //$NON-NLS-1$ /** * Where to load the system lst files from. */ private static File pcgenOutputSheetDir = new File(Globals.getDefaultPath() + File.separator + "outputsheets"); //$NON-NLS-1$ private static File gmgenPluginDir = new File(Globals.getDefaultPath() + File.separator + "plugins"); //$NON-NLS-1$ private static int prereqQualifyColor = Constants.DEFAULT_PREREQ_QUALIFY_COLOUR; private static int prereqFailColor = Constants.DEFAULT_PREREQ_FAIL_COLOUR; private static boolean previewTabShown = false; private static File pcgenPreviewDir = new File(Globals.getDefaultPath() + File.separator + "preview");//$NON-NLS-1$ ///////////////////////////////////////////////// private static boolean saveCustomInLst = false; private static String selectedCharacterHTMLOutputSheet = ""; //$NON-NLS-1$ private static String selectedCharacterPDFOutputSheet = ""; //$NON-NLS-1$ private static boolean saveOutputSheetWithPC = false; private static boolean printSpellsWithPC = true; private static String selectedPartyHTMLOutputSheet = ""; //$NON-NLS-1$ private static String selectedPartyPDFOutputSheet = ""; //$NON-NLS-1$ private static String selectedEqSetTemplate = ""; //$NON-NLS-1$ private static String selectedSpellSheet = ""; //$NON-NLS-1$ private static boolean showFeatDialogAtLevelUp = true; private static boolean showHPDialogAtLevelUp = true; private static boolean showStatDialogAtLevelUp = true; private static boolean showToolBar = true; private static boolean showSkillModifier = false; private static boolean showSkillRanks = false; private static boolean showWarningAtFirstLevelUp = true; private static String skinLFThemePack = null; private static boolean alwaysOverwrite = false; private static String defaultOSType = ""; //$NON-NLS-1$ /** * See @javax.swing.SwingConstants */ private static int tabPlacement = SwingConstants.BOTTOM; private static final String tmpPath = System.getProperty("java.io.tmpdir"); //$NON-NLS-1$ private static final File tempPath = new File(getTmpPath()); private static boolean useHigherLevelSlotsDefault = false; private static boolean wantToLoadMasterworkAndMagic = false; private static int nameDisplayStyle = Constants.DISPLAY_STYLE_NAME; private static boolean weaponProfPrintout = Constants.DEFAULT_PRINTOUT_WEAPONPROF; private static String postExportCommandStandard = ""; //$NON-NLS-1$ private static String postExportCommandPDF = ""; //$NON-NLS-1$ private static boolean hideMonsterClasses = false; private static boolean guiUsesOutputNameEquipment = false; private static boolean guiUsesOutputNameSpells = false; private static int lastTipShown = -1; private static boolean showMemoryArea = false; private static boolean showImagePreview = true; private static boolean showTipOfTheDay = true; private static boolean isGMGen = false; private static boolean showSingleBoxPerBundle = false; public static String getSelectedGenerators(String string) { throw new UnsupportedOperationException("Not yet implemented"); } public static void setSelectedGenerators(String prop, String generators) { throw new UnsupportedOperationException("Not yet implemented"); } public static void setAlwaysOverwrite(final boolean argAlwaysOverwrite) { alwaysOverwrite = argAlwaysOverwrite; } public static boolean getAlwaysOverwrite() { return alwaysOverwrite; } public static void setDefaultOSType(final String argDefaultOSType) { defaultOSType = argDefaultOSType; } public static String getDefaultOSType() { return defaultOSType; } public static void setAutogen(final int idx, final boolean bFlag) { switch (idx) { case Constants.AUTOGEN_RACIAL: setAutogenRacial(bFlag); break; case Constants.AUTOGEN_MASTERWORK: setAutogenMasterwork(bFlag); break; case Constants.AUTOGEN_MAGIC: setAutogenMagic(bFlag); break; case Constants.AUTOGEN_EXOTIC_MATERIAL: setAutogenExoticMaterial(bFlag); break; default: break; } } public static boolean getAutogen(final int idx) { if (!wantToLoadMasterworkAndMagic()) { switch (idx) { case Constants.AUTOGEN_RACIAL: return isAutogenRacial(); case Constants.AUTOGEN_MASTERWORK: return isAutogenMasterwork(); case Constants.AUTOGEN_MAGIC: return isAutogenMagic(); case Constants.AUTOGEN_EXOTIC_MATERIAL: return isAutogenExoticMaterial(); default: break; } } return false; } /** * Sets the path to the backup directory for character files. * * @param path the {@code File} representing the path */ public static void setBackupPcgPath(final File path) { backupPcgPath = path; } /** * Returns the path to the backup directory for character files. * * @return the {@code backupPcgPath} property */ public static File getBackupPcgPath() { return backupPcgPath; } /** * Sets the external browser path to use. * * @param path the {@code String} representing the path **/ public static void setBrowserPath(final String path) { browserPath = path; } /** * Returns the external browser path to use. * * @return the {@code browserPath} property */ public static String getBrowserPath() { return browserPath; } public static void setChaTabPlacement(final int argChaTabPlacement) { chaTabPlacement = argChaTabPlacement; } public static int getChaTabPlacement() { return chaTabPlacement; } /** * Sets the flag to determine whether PCGen should backup pcg files before saving * * @param argCreatePcgBackup the {@code flag} */ public static void setCreatePcgBackup(final boolean argCreatePcgBackup) { createPcgBackup = argCreatePcgBackup; } /** * Returns the flag to determine whether PCGen should backup pcg files before saving * * @return the {@code createPcgBackup} property */ public static boolean getCreatePcgBackup() { return createPcgBackup; } public static void setCustomizerDimension(final Dimension d) { customizerDimension = d; } public static Dimension getCustomizerDimension() { return customizerDimension; } public static void setCustomizerLeftUpperCorner(final Point argLeftUpperCorner) { customizerLeftUpperCorner = argLeftUpperCorner; } public static Point getCustomizerLeftUpperCorner() { return customizerLeftUpperCorner; } public static void setCustomizerSplit1(final int split) { customizerSplit1 = split; } public static int getCustomizerSplit1() { return customizerSplit1; } public static void setCustomizerSplit2(final int split) { customizerSplit2 = split; } public static int getCustomizerSplit2() { return customizerSplit2; } /** * Sets whether PCgen will enforce the spending of all unallocated feats and skill points * before allowing the character to level up. * @param argEnforceSpendingBeforeLevelUp Should spending be enforced? */ public static void setEnforceSpendingBeforeLevelUp(final boolean argEnforceSpendingBeforeLevelUp) { enforceSpendingBeforeLevelUp = argEnforceSpendingBeforeLevelUp; } public static boolean getEnforceSpendingBeforeLevelUp() { return enforceSpendingBeforeLevelUp; } public static void setFilePaths(final String aString) { getFilepathProp().setProperty("pcgen.filepaths", aString); //$NON-NLS-1$ } public static String getFilePaths() { String def_type = "user"; if (SystemUtils.IS_OS_MAC) { def_type = "mac_user"; } return getFilepathProp().getProperty("pcgen.filepaths", def_type); //$NON-NLS-1$ //$NON-NLS-2$ } public static Properties getFilepathProp() { return filepaths; } public static boolean getFirstRun() { // if filepaths.ini doesn't exist that means this is // the first time PCGen has been run final File aFile = new File(fileLocation); return !aFile.exists(); } public static boolean isGMGen() { return isGMGen; } /** * Puts all properties into the {@code Properties} object, * ({@code options}). This is called by * {@code writeOptionsProperties}, which then saves the * {@code options} into a file. * <p> * I am guessing that named object properties are faster to access * than using the {@code getProperty} method, and that this is * why settings are stored as static properties of {@code Global}, * but converted into a {@code Properties} object for * storage and retrieval. * @param optionName * @param optionValue */ public static void setGMGenOption(final String optionName, final boolean optionValue) { setGMGenOption(optionName, optionValue ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ } public static void setGMGenOption(final String optionName, final int optionValue) { setGMGenOption(optionName, String.valueOf(optionValue)); } public static void setGMGenOption(final String optionName, final double optionValue) { setGMGenOption(optionName, String.valueOf(optionValue)); } public static void setGMGenOption(final String optionName, final String optionValue) { getOptions().setProperty("gmgen.options." + optionName, optionValue); //$NON-NLS-1$ } /** * Set most of this objects static properties from the loaded {@code options}. * Called by readOptionsProperties. Most of the static properties are * set as a side effect, with the main screen size being returned. * <p> * I am guessing that named object properties are faster to access * than using the {@code getProperty} method, and that this is * why settings are stored as static properties of {@code Global}, * but converted into a {@code Properties} object for * storage and retrieval. * @param optionName * @param defaultValue * * @return the default {@code Dimension} to set the screen size to */ public static boolean getGMGenOption(final String optionName, final boolean defaultValue) { final String option = getGMGenOption(optionName, defaultValue ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ return "true".equalsIgnoreCase(option); //$NON-NLS-1$ } public static int getGMGenOption(final String optionName, final int defaultValue) { return Integer.decode(getGMGenOption(optionName, String.valueOf(defaultValue))).intValue(); } public static Double getGMGenOption(final String optionName, final double defaultValue) { return new Double(getGMGenOption(optionName, Double.toString(defaultValue))); } public static String getGMGenOption(final String optionName, final String defaultValue) { return getOptions().getProperty("gmgen.options." + optionName, defaultValue); //$NON-NLS-1$ } public static void setGUIUsesOutputNameEquipment(final boolean argUseOutputNameEquipment) { guiUsesOutputNameEquipment = argUseOutputNameEquipment; } public static void setGUIUsesOutputNameSpells(final boolean argUseOutputNameSpells) { guiUsesOutputNameSpells = argUseOutputNameSpells; } public static void setGame(final String g) { final GameMode newMode = SystemCollections.getGameModeNamed(g); if (newMode != null) { game = newMode; } String key = g; // new key for game mode specific options are pcgen.options.gameMode.X.optionName // but offer downward compatible support to read in old version for unitSet from 5.8.0 String unitSetName = getOptions().getProperty("pcgen.options.gameMode." + key + ".unitSetName", getOptions().getProperty("pcgen.options.unitSetName." + key, game.getDefaultUnitSet())); if (!game.selectUnitSet(unitSetName)) { if (!game.selectDefaultUnitSet()) { game.selectUnitSet(Constants.STANDARD_UNITSET_NAME); } } game.setDefaultXPTableName(getPCGenOption("gameMode." + key + ".xpTableName", "")); //$NON-NLS-1$ //$NON-NLS-2$ game.setDefaultCharacterType(getPCGenOption("gameMode." + key + ".characterType", "")); //$NON-NLS-1$ //$NON-NLS-2$ AbilityCategory featTemplate = game.getFeatTemplate(); if (featTemplate != null) { AbilityCategory.FEAT.copyFields(featTemplate); } getChosenCampaignFiles(game); } public static GameMode getGame() { return game; } public static void setGearTab_AllowDebt(final boolean allowDebt) { gearTab_AllowDebt = allowDebt; } public static boolean getGearTab_AllowDebt() { return gearTab_AllowDebt; } public static void setGearTab_AutoResize(final boolean autoResize) { gearTab_AutoResize = autoResize; } public static boolean getGearTab_AutoResize() { return gearTab_AutoResize; } public static void setGearTab_BuyRate(final int argBuyRate) { gearTab_BuyRate = argBuyRate; } public static int getGearTab_BuyRate() { return gearTab_BuyRate; } public static void setGearTab_IgnoreCost(final boolean ignoreCost) { gearTab_IgnoreCost = ignoreCost; } public static boolean getGearTab_IgnoreCost() { return gearTab_IgnoreCost; } public static void setGearTab_SellRate(final int argSellRate) { gearTab_SellRate = argSellRate; } public static int getGearTab_SellRate() { return gearTab_SellRate; } public static void setGmgenPluginDir(final File aFile) { gmgenPluginDir = aFile; } public static File getGmgenPluginDir() { return gmgenPluginDir; } public static void setHPMaxAtFirstLevel(final boolean aBool) { hpMaxAtFirstLevel = aBool; } public static boolean isHPMaxAtFirstLevel() { return hpMaxAtFirstLevel; } public static void setHPMaxAtFirstClassLevel(final boolean aBool) { hpMaxAtFirstClassLevel = aBool; } public static boolean isHPMaxAtFirstClassLevel() { return hpMaxAtFirstClassLevel; } public static void setHPMaxAtFirstPCClassLevelOnly(final boolean aBool) { hpMaxAtFirstPCClassLevelOnly = aBool; } public static boolean isHPMaxAtFirstPCClassLevelOnly() { return hpMaxAtFirstPCClassLevelOnly; } public static void setHPPercent(final int argHPPct) { hpPercent = argHPPct; } public static int getHPPercent() { return hpPercent; } public static void setHPRollMethod(final int aBool) { hpRollMethod = aBool; } public static int getHPRollMethod() { return hpRollMethod; } public static String getHTMLOutputSheetPath() { if ("".equals(selectedCharacterHTMLOutputSheet)) //$NON-NLS-1$ { return ConfigurationSettings.getOutputSheetsDir(); } return new File(selectedCharacterHTMLOutputSheet).getParentFile().getAbsolutePath(); } public static void setHideMonsterClasses(final boolean argHideMonsterClasses) { hideMonsterClasses = argHideMonsterClasses; } public static void setIgnoreMonsterHDCap(final boolean argIgoreCap) { ignoreMonsterHDCap = argIgoreCap; } public static boolean isIgnoreMonsterHDCap() { return ignoreMonsterHDCap; } /** * @param string The invalidDmgText to set. */ public static void setInvalidDmgText(final String string) { SettingsHandler.invalidDmgText = string; } public static String getInvalidDmgText() { return invalidDmgText; } /** * @param string The invalidToHitText to set. */ public static void setInvalidToHitText(final String string) { SettingsHandler.invalidToHitText = string; } public static String getInvalidToHitText() { return invalidToHitText; } /** * TODO: It's commented out in gmgen. Is it safe to remove? * @param GMGen */ public static void setIsGMGen(final boolean GMGen) { isGMGen = GMGen; } public static void setKitSelectorDimension(final Dimension d) { kitSelectorDimension = d; } public static Dimension getKitSelectorDimension() { return kitSelectorDimension; } public static void setKitSelectorLeftUpperCorner(final Point argLeftUpperCorner) { kitSelectorLeftUpperCorner = argLeftUpperCorner; } public static Point getKitSelectorLeftUpperCorner() { return kitSelectorLeftUpperCorner; } public static void setLastTipShown(final int argLastTipShown) { lastTipShown = argLastTipShown; } public static int getLastTipShown() { return lastTipShown; } public static void setLeftUpperCorner(final Point argLeftUpperCorner) { leftUpperCorner = argLeftUpperCorner; } public static Point getLeftUpperCorner() { return leftUpperCorner; } public static void setLoadURLs(final boolean aBool) { loadURLs = aBool; } public static boolean isLoadURLs() { return loadURLs; } public static void setLookAndFeel(final int argLookAndFeel) { looknFeel = argLookAndFeel; } public static int getLookAndFeel() { return looknFeel; } public static void setMaxPotionSpellLevel(final int anInt) { maxPotionSpellLevel = anInt; } public static int getMaxPotionSpellLevel() { return maxPotionSpellLevel; } public static void setMaxWandSpellLevel(final int anInt) { maxWandSpellLevel = anInt; } public static int getMaxWandSpellLevel() { return maxWandSpellLevel; } public static void setMetamagicAllowedInEqBuilder(final boolean aBool) { allowMetamagicInCustomizer = aBool; } public static boolean isMetamagicAllowedInEqBuilder() { return allowMetamagicInCustomizer; } public static void setNameDisplayStyle(final int style) { nameDisplayStyle = style; } public static int getNameDisplayStyle() { return nameDisplayStyle; } public static SortedProperties getOptions() { return options; } public static Dimension getOptionsFromProperties(final PlayerCharacter aPC) { Dimension d = new Dimension(0, 0); final String tempBrowserPath = getPCGenOption("browserPath", ""); //$NON-NLS-1$ //$NON-NLS-2$ if (!"".equals(tempBrowserPath)) //$NON-NLS-1$ { setBrowserPath(tempBrowserPath); } else { setBrowserPath(null); } setLeftUpperCorner(new Point(getPCGenOption("windowLeftUpperCorner.X", -1.0).intValue(), //$NON-NLS-1$ getPCGenOption("windowLeftUpperCorner.Y", -1.0).intValue())); //$NON-NLS-1$ setWindowState(getPCGenOption("windowState",Frame.NORMAL)); //$NON-NLS-1$ Double dw = getPCGenOption("windowWidth", 0.0); //$NON-NLS-1$ Double dh = getPCGenOption("windowHeight", 0.0); //$NON-NLS-1$ if (!CoreUtility.doublesEqual(dw.doubleValue(), 0.0) && !CoreUtility.doublesEqual(dh.doubleValue(), 0.0)) { final int width = Integer.parseInt(dw.toString().substring(0, Math.min(dw.toString().length(), dw.toString().lastIndexOf(".")))); //$NON-NLS-1$ final int height = Integer.parseInt(dh.toString().substring(0, Math.min(dh.toString().length(), dh.toString().lastIndexOf(".")))); //$NON-NLS-1$ d = new Dimension(width, height); } setCustomizerLeftUpperCorner(new Point(getPCGenOption("customizer.windowLeftUpperCorner.X", -1.0).intValue(), //$NON-NLS-1$ getPCGenOption("customizer.windowLeftUpperCorner.Y", -1.0).intValue())); //$NON-NLS-1$ dw = getPCGenOption("customizer.windowWidth", 0.0); //$NON-NLS-1$ dh = getPCGenOption("customizer.windowHeight", 0.0); //$NON-NLS-1$ if (!CoreUtility.doublesEqual(dw.doubleValue(), 0.0) && !CoreUtility.doublesEqual(dh.doubleValue(), 0.0)) { setCustomizerDimension(new Dimension(dw.intValue(), dh.intValue())); } setKitSelectorLeftUpperCorner(new Point(getPCGenOption("kitSelector.windowLeftUpperCorner.X", -1.0).intValue(), //$NON-NLS-1$ getPCGenOption("kitSelector.windowLeftUpperCorner.Y", -1.0).intValue())); //$NON-NLS-1$ dw = getPCGenOption("kitSelector.windowWidth", 0.0); //$NON-NLS-1$ dh = getPCGenOption("kitSelector.windowHeight", 0.0); //$NON-NLS-1$ if (!CoreUtility.doublesEqual(dw.doubleValue(), 0.0) && !CoreUtility.doublesEqual(dh.doubleValue(), 0.0)) { setKitSelectorDimension(new Dimension(dw.intValue(), dh.intValue())); } // // Read in the buy/sell percentages for the gear tab // If not in the .ini file and ignoreCost is set, then use 0% // Otherwise set buy to 100% and sell to %50 // int buyRate = getPCGenOption("GearTab.buyRate", -1); //$NON-NLS-1$ int sellRate = getPCGenOption("GearTab.sellRate", -1); //$NON-NLS-1$ if ((buyRate < 0) || (sellRate < 0)) { if (getPCGenOption("GearTab.ignoreCost", false)) //$NON-NLS-1$ { buyRate = 0; sellRate = 0; } else { buyRate = 100; sellRate = 50; } } Globals.initCustColumnWidth(CoreUtility.split(getOptions().getProperty("pcgen.options.custColumnWidth", ""), ',')); //$NON-NLS-1$ //$NON-NLS-2$ loadURLs = getPCGenOption("loadURLs", false); //$NON-NLS-1$ Globals.setSourceDisplay(SourceFormat.values()[getPCGenOption("sourceDisplay", SourceFormat.LONG.ordinal())]); //$NON-NLS-1$ setAlwaysOverwrite(getPCGenOption("alwaysOverwrite", false)); //$NON-NLS-1$ setAutoFeatsRefundable(getPCGenOption("autoFeatsRefundable", false)); //$NON-NLS-1$ setAutogenExoticMaterial(getPCGenOption("autoGenerateExoticMaterial", false)); //$NON-NLS-1$ setAutogenMagic(getPCGenOption("autoGenerateMagic", false)); //$NON-NLS-1$ setAutogenMasterwork(getPCGenOption("autoGenerateMasterwork", false)); //$NON-NLS-1$ setAutogenRacial(getPCGenOption("autoGenerateRacial", false)); //$NON-NLS-1$ setChaTabPlacement(getOptionTabPlacement("chaTabPlacement", SwingConstants.TOP)); //$NON-NLS-1$ setCreatePcgBackup(getPCGenOption("createPcgBackup", true)); setCustomizerSplit1(getPCGenOption("customizer.split1", -1)); //$NON-NLS-1$ setCustomizerSplit2(getPCGenOption("customizer.split2", -1)); //$NON-NLS-1$ setDefaultOSType(getPCGenOption("defaultOSType", null)); //$NON-NLS-1$ setEnforceSpendingBeforeLevelUp(getPCGenOption("enforceSpendingBeforeLevelUp", false)); //$NON-NLS-1$ setGearTab_AllowDebt(getPCGenOption("GearTab.allowDebt", false)); //$NON-NLS-1$ setGearTab_AutoResize(getPCGenOption("GearTab.autoResize", false)); //$NON-NLS-1$ setGearTab_BuyRate(buyRate); setGearTab_IgnoreCost(getPCGenOption("GearTab.ignoreCost", false)); //$NON-NLS-1$ setGearTab_SellRate(sellRate); setGrimHPMode(getPCGenOption("grimHPMode", false)); //$NON-NLS-1$ setGrittyACMode(getPCGenOption("grittyACMode", false)); //$NON-NLS-1$ setGUIUsesOutputNameEquipment(getPCGenOption("GUIUsesOutputNameEquipment", false)); //$NON-NLS-1$ setGUIUsesOutputNameSpells(getPCGenOption("GUIUsesOutputNameSpells", false)); //$NON-NLS-1$ setHideMonsterClasses(getPCGenOption("hideMonsterClasses", false)); //$NON-NLS-1$ setHPMaxAtFirstLevel(getPCGenOption("hpMaxAtFirstLevel", true)); //$NON-NLS-1$ setHPMaxAtFirstClassLevel(getPCGenOption("hpMaxAtFirstClassLevel", false)); //$NON-NLS-1$ setHPMaxAtFirstPCClassLevelOnly(getPCGenOption("hpMaxAtFirstPCClassLevelOnly", false)); //$NON-NLS-1$ setHPPercent(getPCGenOption("hpPercent", 100)); //$NON-NLS-1$ setHPRollMethod(getPCGenOption("hpRollMethod", Constants.HP_STANDARD)); //$NON-NLS-1$ setIgnoreMonsterHDCap(getPCGenOption("ignoreMonsterHDCap", false)); //$NON-NLS-1$ setInvalidDmgText(getPCGenOption("invalidDmgText", LanguageBundle.getString("SettingsHandler.114"))); //$NON-NLS-1$//$NON-NLS-2$ setInvalidToHitText(getPCGenOption("invalidToHitText", LanguageBundle.getString("SettingsHandler.114"))); //$NON-NLS-1$//$NON-NLS-2$ setLastTipShown(getPCGenOption("lastTipOfTheDayTipShown", -1)); //$NON-NLS-1$ setLookAndFeel(getPCGenOption("looknFeel", 1)); //$NON-NLS-1$ setMaxPotionSpellLevel(getPCGenOption("maxPotionSpellLevel", 3)); //$NON-NLS-1$ setMaxWandSpellLevel(getPCGenOption("maxWandSpellLevel", 4)); //$NON-NLS-1$ setMetamagicAllowedInEqBuilder(getPCGenOption("allowMetamagicInCustomizer", false)); //$NON-NLS-1$ setPccFilesLocation(new File(expandRelativePath(getPCGenOption("pccFilesLocation", //$NON-NLS-1$ System.getProperty("user.dir") + File.separator + "data")))); //$NON-NLS-1$ //$NON-NLS-2$ setPcgenOutputSheetDir(new File(expandRelativePath(getOptions().getProperty("pcgen.files.pcgenOutputSheetDir", //$NON-NLS-1$ System.getProperty("user.dir") + File.separator + "outputsheets")))); //$NON-NLS-1$ //$NON-NLS-2$ setPcgenPreviewDir(new File(expandRelativePath(getOptions().getProperty("pcgen.files.pcgenPreviewDir", //$NON-NLS-1$ System.getProperty("user.dir") + File.separator + "preview")))); //$NON-NLS-1$ //$NON-NLS-2$ setGmgenPluginDir(new File(expandRelativePath(getOptions().getProperty("gmgen.files.gmgenPluginDir", //$NON-NLS-1$ System.getProperty("user.dir") + File.separator + "plugins")))); //$NON-NLS-1$ //$NON-NLS-2$ setBackupPcgPath(new File(expandRelativePath(getOptions().getProperty("pcgen.files.characters.backup", "")))); //$NON-NLS-1$ setPortraitsPath(new File(expandRelativePath(getOptions().getProperty("pcgen.files.portraits", //$NON-NLS-1$ Globals.getDefaultPcgPath())))); setPostExportCommandStandard(getPCGenOption("postExportCommandStandard", "")); //$NON-NLS-1$ //$NON-NLS-2$ setPostExportCommandPDF(getPCGenOption("postExportCommandPDF", "")); //$NON-NLS-1$ //$NON-NLS-2$ setPrereqFailColor(getPCGenOption("prereqFailColor", Color.red.getRGB())); //$NON-NLS-1$ setPrereqQualifyColor(getPCGenOption("prereqQualifyColor", Color.black.getRGB())); //$NON-NLS-1$ setPreviewTabShown(getPCGenOption("previewTabShown", true)); //$NON-NLS-1$ setROG(getPCGenOption("isROG", false)); //$NON-NLS-1$ setSaveCustomInLst(getPCGenOption("saveCustomInLst", false)); //$NON-NLS-1$ setSaveOutputSheetWithPC(getPCGenOption("saveOutputSheetWithPC", false)); //$NON-NLS-1$ setPrintSpellsWithPC(getPCGenOption("printSpellsWithPC", true)); //$NON-NLS-1$ setSelectedSpellSheet(expandRelativePath(getOptions().getProperty("pcgen.files.selectedSpellOutputSheet", ""))); //$NON-NLS-1$ //$NON-NLS-2$ setSelectedCharacterHTMLOutputSheet(expandRelativePath(getOptions().getProperty("pcgen.files.selectedCharacterHTMLOutputSheet", //$NON-NLS-1$ "")), aPC); //$NON-NLS-1$ setSelectedCharacterPDFOutputSheet(expandRelativePath(getOptions().getProperty("pcgen.files.selectedCharacterPDFOutputSheet", //$NON-NLS-1$ "")), aPC); //$NON-NLS-1$ setSelectedEqSetTemplate(expandRelativePath(getOptions().getProperty("pcgen.files.selectedEqSetTemplate", ""))); //$NON-NLS-1$ //$NON-NLS-2$ setSelectedPartyHTMLOutputSheet(expandRelativePath(getOptions().getProperty("pcgen.files.selectedPartyHTMLOutputSheet", //$NON-NLS-1$ ""))); //$NON-NLS-1$ setSelectedPartyPDFOutputSheet(expandRelativePath(getOptions().getProperty("pcgen.files.selectedPartyPDFOutputSheet", //$NON-NLS-1$ ""))); //$NON-NLS-1$ setShowFeatDialogAtLevelUp(getPCGenOption("showFeatDialogAtLevelUp", true)); //$NON-NLS-1$ setShowHPDialogAtLevelUp(getPCGenOption("showHPDialogAtLevelUp", true)); //$NON-NLS-1$ setShowImagePreview(getPCGenOption("showImagePreview", true)); //$NON-NLS-1$ setShowSingleBoxPerBundle(getPCGenOption("showSingleBoxPerBundle", false)); //$NON-NLS-1$ setOutputDeprecationMessages(getPCGenOption("outputDeprecationMessages", true)); setInputUnconstructedMessages(getPCGenOption("inputUnconstructedMessages", false)); setShowStatDialogAtLevelUp(getPCGenOption("showStatDialogAtLevelUp", true)); //$NON-NLS-1$ setShowTipOfTheDay(getPCGenOption("showTipOfTheDay", true)); //$NON-NLS-1$ setShowToolBar(getPCGenOption("showToolBar", true)); //$NON-NLS-1$ setShowSkillModifier(getPCGenOption("showSkillModifier", true)); //$NON-NLS-1$ setShowSkillRanks(getPCGenOption("showSkillRanks", true)); //$NON-NLS-1$ setShowWarningAtFirstLevelUp(getPCGenOption("showWarningAtFirstLevelUp", true)); //$NON-NLS-1$ setSkinLFThemePack(getPCGenOption("skinLFThemePack", "")); //$NON-NLS-1$ //$NON-NLS-2$ setSpellMarketPriceAdjusted(getPCGenOption("spellMarketPriceAdjusted", false)); //$NON-NLS-1$ setTabPlacement(getOptionTabPlacement("tabPlacement", SwingConstants.BOTTOM)); //$NON-NLS-1$ setUseHigherLevelSlotsDefault(getPCGenOption("useHigherLevelSlotsDefault", false)); //$NON-NLS-1$ setUseWaitCursor(getPCGenOption("useWaitCursor", true)); //$NON-NLS-1$ setWantToLoadMasterworkAndMagic(getPCGenOption("loadMasterworkAndMagicFromLst", false)); //$NON-NLS-1$ setWeaponProfPrintout(getPCGenOption("weaponProfPrintout", Constants.DEFAULT_PRINTOUT_WEAPONPROF)); //$NON-NLS-1$ // Load up all the RuleCheck stuff from the options.ini file // It's stored as: // pcgen.options.rulechecks=aKey:Y|bKey:N|cKey:Y parseRuleChecksFromOptions(getPCGenOption("ruleChecks", "")); //$NON-NLS-1$ //$NON-NLS-2$ return d; } /** * Retreive the chosen campaign files from properties for * use by the rest of PCGen. * * @param gameMode The GameMode to reteieve the files for. */ private static void getChosenCampaignFiles(GameMode gameMode) { List<String> uriStringList = CoreUtility.split(getOptions().getProperty( "pcgen.files.chosenCampaignSourcefiles." + gameMode.getName(), //$NON-NLS-1$ ""), ','); List<URI> uriList = new ArrayList<>(uriStringList.size()); for (String str : uriStringList) { try { uriList.add(new URI(str)); } catch (URISyntaxException e) { Logging.errorPrint("Settings error: Unable to convert " + str + " to a URI: " + e.getLocalizedMessage()); } } PersistenceManager.getInstance().setChosenCampaignSourcefiles(uriList, gameMode); //$NON-NLS-1$ } public static void setOptionsProperties(final PlayerCharacter aPC) { if (getBackupPcgPath() != null && !getBackupPcgPath().getPath().equals("")) { getOptions().setProperty("pcgen.files.characters.backup", retractRelativePath(getBackupPcgPath().getAbsolutePath())); //$NON-NLS-1$ } else { getOptions().setProperty("pcgen.files.characters.backup", ""); //$NON-NLS-1$ } getOptions().setProperty("pcgen.files.portraits", retractRelativePath(getPortraitsPath().getAbsolutePath())); //$NON-NLS-1$ getOptions().setProperty("pcgen.files.selectedSpellOutputSheet", retractRelativePath(getSelectedSpellSheet())); //$NON-NLS-1$ getOptions().setProperty("pcgen.files.selectedCharacterHTMLOutputSheet", //$NON-NLS-1$ retractRelativePath(getSelectedCharacterHTMLOutputSheet(aPC))); getOptions().setProperty("pcgen.files.selectedCharacterPDFOutputSheet", //$NON-NLS-1$ retractRelativePath(getSelectedCharacterPDFOutputSheet(aPC))); getOptions().setProperty("pcgen.files.selectedPartyHTMLOutputSheet", //$NON-NLS-1$ retractRelativePath(getSelectedPartyHTMLOutputSheet())); getOptions().setProperty("pcgen.files.selectedPartyPDFOutputSheet", //$NON-NLS-1$ retractRelativePath(getSelectedPartyPDFOutputSheet())); getOptions().setProperty("pcgen.files.selectedEqSetTemplate", retractRelativePath(getSelectedEqSetTemplate())); //$NON-NLS-1$ getOptions().setProperty("pcgen.files.chosenCampaignSourcefiles", //$NON-NLS-1$ StringUtil.join(PersistenceManager.getInstance().getChosenCampaignSourcefiles(), ", ")); getOptions().setProperty("pcgen.options.custColumnWidth", StringUtil.join(Globals.getCustColumnWidth(), ", ")); //$NON-NLS-1$ if (getGmgenPluginDir() != null) { getOptions().setProperty("gmgen.files.gmgenPluginDir", //$NON-NLS-1$ retractRelativePath(getGmgenPluginDir().getAbsolutePath())); } else { getOptions().setProperty("gmgen.files.gmgenPluginDir", ""); //$NON-NLS-1$ //$NON-NLS-2$ } if (getBrowserPath() != null) { setPCGenOption("browserPath", getBrowserPath()); //$NON-NLS-1$ } else { setPCGenOption("browserPath", ""); //$NON-NLS-1$ //$NON-NLS-2$ } if (getGame() != null) { setPCGenOption("game", getGame().getName()); //$NON-NLS-1$ } else { setPCGenOption("game", ""); //$NON-NLS-1$ //$NON-NLS-2$ } try { setPCGenOption("skinLFThemePack", getSkinLFThemePack()); //$NON-NLS-1$ } catch (NullPointerException e) { //TODO: Should this really be ignored??? XXX } if (getPccFilesLocation() != null) { setPCGenOption("pccFilesLocation", retractRelativePath(getPccFilesLocation().getAbsolutePath())); //$NON-NLS-1$ } else { setPCGenOption("pccFilesLocation", ""); //$NON-NLS-1$ //$NON-NLS-2$ } if (getLeftUpperCorner() != null) { setPCGenOption("windowLeftUpperCorner.X", getLeftUpperCorner().getX()); //$NON-NLS-1$ setPCGenOption("windowLeftUpperCorner.Y", getLeftUpperCorner().getY()); //$NON-NLS-1$ } setPCGenOption("windowState",getWindowState()); //$NON-NLS-1$ if (Globals.getRootFrame() != null) { setPCGenOption("windowWidth", Globals.getRootFrame().getSize().getWidth()); //$NON-NLS-1$ setPCGenOption("windowHeight", Globals.getRootFrame().getSize().getHeight()); //$NON-NLS-1$ } if (getCustomizerLeftUpperCorner() != null) { setPCGenOption("customizer.windowLeftUpperCorner.X", getCustomizerLeftUpperCorner().getX()); //$NON-NLS-1$ setPCGenOption("customizer.windowLeftUpperCorner.Y", getCustomizerLeftUpperCorner().getY()); //$NON-NLS-1$ } if (getCustomizerDimension() != null) { setPCGenOption("customizer.windowWidth", getCustomizerDimension().getWidth()); //$NON-NLS-1$ setPCGenOption("customizer.windowHeight", getCustomizerDimension().getHeight()); //$NON-NLS-1$ } if (getKitSelectorLeftUpperCorner() != null) { setPCGenOption("kitSelector.windowLeftUpperCorner.X", getKitSelectorLeftUpperCorner().getX()); //$NON-NLS-1$ setPCGenOption("kitSelector.windowLeftUpperCorner.Y", getKitSelectorLeftUpperCorner().getY()); //$NON-NLS-1$ } if (getKitSelectorDimension() != null) { setPCGenOption("kitSelector.windowWidth", getKitSelectorDimension().getWidth()); //$NON-NLS-1$ setPCGenOption("kitSelector.windowHeight", getKitSelectorDimension().getHeight()); //$NON-NLS-1$ } // // Remove old-style option values // setPCGenOption("allStatsValue", null); setPCGenOption("purchaseMethodName", null); setPCGenOption("rollMethod", null); setPCGenOption("rollMethodExpression", null); for (int idx = 0; idx < SystemCollections.getUnmodifiableGameModeList().size(); idx++) { final GameMode gameMode = SystemCollections.getUnmodifiableGameModeList().get(idx); String gameModeKey = gameMode.getName(); if (gameMode.getUnitSet() != null && gameMode.getUnitSet().getDisplayName() != null) { setPCGenOption("gameMode." + gameModeKey + ".unitSetName", gameMode.getUnitSet().getDisplayName()); } setPCGenOption("gameMode." + gameModeKey + ".purchaseMethodName", gameMode.getPurchaseModeMethodName()); //$NON-NLS-1$ setPCGenOption("gameMode." + gameModeKey + ".rollMethod", gameMode.getRollMethod()); //$NON-NLS-1$ setPCGenOption("gameMode." + gameModeKey + ".rollMethodExpression", gameMode.getRollMethodExpressionName()); //$NON-NLS-1$ setPCGenOption("gameMode." + gameModeKey + ".allStatsValue", gameMode.getAllStatsValue()); setPCGenOption("gameMode." + gameModeKey + ".xpTableName", gameMode.getDefaultXPTableName()); setPCGenOption("gameMode." + gameModeKey + ".characterType", gameMode.getDefaultCharacterType()); } setRuleChecksInOptions("ruleChecks"); //$NON-NLS-1$ setPCGenOption("allowMetamagicInCustomizer", isMetamagicAllowedInEqBuilder()); //$NON-NLS-1$ setPCGenOption("alwaysOverwrite", getAlwaysOverwrite()); //$NON-NLS-1$ setPCGenOption("autoFeatsRefundable", isAutoFeatsRefundable()); //$NON-NLS-1$ setPCGenOption("autoGenerateExoticMaterial", isAutogenExoticMaterial()); //$NON-NLS-1$ setPCGenOption("autoGenerateMagic", isAutogenMagic()); //$NON-NLS-1$ setPCGenOption("autoGenerateMasterwork", isAutogenMasterwork()); //$NON-NLS-1$ setPCGenOption("autoGenerateRacial", isAutogenRacial()); //$NON-NLS-1$ setPCGenOption("chaTabPlacement", convertTabPlacementToString(chaTabPlacement)); //$NON-NLS-1$ setPCGenOption("createPcgBackup", getCreatePcgBackup()); //$NON-NLS-1$ setPCGenOption("customizer.split1", getCustomizerSplit1()); //$NON-NLS-1$ setPCGenOption("customizer.split2", getCustomizerSplit2()); //$NON-NLS-1$ setPCGenOption("defaultOSType", getDefaultOSType()); //$NON-NLS-1$ setPCGenOption("GearTab.allowDebt", getGearTab_AllowDebt()); //$NON-NLS-1$ setPCGenOption("GearTab.autoResize", getGearTab_AutoResize()); //$NON-NLS-1$ setPCGenOption("GearTab.buyRate", getGearTab_BuyRate()); //$NON-NLS-1$ setPCGenOption("GearTab.ignoreCost", getGearTab_IgnoreCost()); //$NON-NLS-1$ setPCGenOption("GearTab.sellRate", getGearTab_SellRate()); //$NON-NLS-1$ setPCGenOption("grimHPMode", isGrimHPMode()); //$NON-NLS-1$ setPCGenOption("grittyACMode", isGrittyACMode()); //$NON-NLS-1$ setPCGenOption("GUIUsesOutputNameEquipment", guiUsesOutputNameEquipment()); //$NON-NLS-1$ setPCGenOption("GUIUsesOutputNameSpells", guiUsesOutputNameSpells()); //$NON-NLS-1$ setPCGenOption("hideMonsterClasses", hideMonsterClasses()); //$NON-NLS-1$ setPCGenOption("hpMaxAtFirstLevel", isHPMaxAtFirstLevel()); //$NON-NLS-1$ setPCGenOption("hpMaxAtFirstClassLevel", isHPMaxAtFirstClassLevel()); //$NON-NLS-1$ setPCGenOption("hpMaxAtFirstPCClassLevelOnly", isHPMaxAtFirstPCClassLevelOnly()); //$NON-NLS-1$ setPCGenOption("hpPercent", getHPPercent()); //$NON-NLS-1$ setPCGenOption("hpRollMethod", getHPRollMethod()); //$NON-NLS-1$ setPCGenOption("ignoreMonsterHDCap", isIgnoreMonsterHDCap()); //$NON-NLS-1$ setPCGenOption("invalidDmgText", getInvalidDmgText()); //$NON-NLS-1$ setPCGenOption("invalidToHitText", getInvalidToHitText()); //$NON-NLS-1$ setPCGenOption("lastTipOfTheDayTipShown", getLastTipShown()); //$NON-NLS-1$ setPCGenOption("loadMasterworkAndMagicFromLst", wantToLoadMasterworkAndMagic()); //$NON-NLS-1$ setPCGenOption("loadURLs", loadURLs); //$NON-NLS-1$ setPCGenOption("looknFeel", getLookAndFeel()); //$NON-NLS-1$ setPCGenOption("maxPotionSpellLevel", getMaxPotionSpellLevel()); //$NON-NLS-1$ setPCGenOption("maxWandSpellLevel", getMaxWandSpellLevel()); //$NON-NLS-1$ setPCGenOption("nameDisplayStyle", getNameDisplayStyle()); //$NON-NLS-1$ setPCGenOption("postExportCommandStandard", SettingsHandler.getPostExportCommandStandard()); //$NON-NLS-1$ setPCGenOption("postExportCommandPDF", SettingsHandler.getPostExportCommandPDF()); //$NON-NLS-1$ setPCGenOption("prereqFailColor", "0x" + Integer.toHexString(getPrereqFailColor())); //$NON-NLS-1$ //$NON-NLS-2$ setPCGenOption("prereqQualifyColor", "0x" + Integer.toHexString(getPrereqQualifyColor())); //$NON-NLS-1$ //$NON-NLS-2$ setPCGenOption("previewTabShown", isPreviewTabShown()); //$NON-NLS-1$ setPCGenOption("saveCustomInLst", isSaveCustomInLst()); //$NON-NLS-1$ setPCGenOption("saveOutputSheetWithPC", getSaveOutputSheetWithPC()); //$NON-NLS-1$ setPCGenOption("printSpellsWithPC", getPrintSpellsWithPC()); //$NON-NLS-1$ setPCGenOption("showFeatDialogAtLevelUp", getShowFeatDialogAtLevelUp()); //$NON-NLS-1$ setPCGenOption("enforceSpendingBeforeLevelUp", getEnforceSpendingBeforeLevelUp()); //$NON-NLS-1$ setPCGenOption("showHPDialogAtLevelUp", getShowHPDialogAtLevelUp()); //$NON-NLS-1$ setPCGenOption("showMemoryArea", isShowMemoryArea()); //$NON-NLS-1$ setPCGenOption("showImagePreview", isShowImagePreview()); //$NON-NLS-1$ setPCGenOption("showStatDialogAtLevelUp", getShowStatDialogAtLevelUp()); //$NON-NLS-1$ setPCGenOption("showTipOfTheDay", getShowTipOfTheDay()); //$NON-NLS-1$ setPCGenOption("showToolBar", isShowToolBar()); //$NON-NLS-1$ setPCGenOption("showSkillModifier", getShowSkillModifier()); //$NON-NLS-1$ setPCGenOption("showSkillRanks", getShowSkillRanks()); //$NON-NLS-1$ setPCGenOption("showSingleBoxPerBundle", getShowSingleBoxPerBundle()); //$NON-NLS-1$ setPCGenOption("showWarningAtFirstLevelUp", isShowWarningAtFirstLevelUp()); //$NON-NLS-1$ setPCGenOption("sourceDisplay", Globals.getSourceDisplay().ordinal()); //$NON-NLS-1$ setPCGenOption("spellMarketPriceAdjusted", isSpellMarketPriceAdjusted()); //$NON-NLS-1$ setPCGenOption("tabPlacement", convertTabPlacementToString(tabPlacement)); //$NON-NLS-1$ setPCGenOption("useHigherLevelSlotsDefault", isUseHigherLevelSlotsDefault()); //$NON-NLS-1$ setPCGenOption("useWaitCursor", getUseWaitCursor()); //$NON-NLS-1$ setPCGenOption("validateBonuses", validateBonuses); //$NON-NLS-1$ setPCGenOption("weaponProfPrintout", SettingsHandler.getWeaponProfPrintout()); //$NON-NLS-1$ setPCGenOption("outputDeprecationMessages", outputDeprecationMessages()); //$NON-NLS-1$ setPCGenOption("inputUnconstructedMessages", inputUnconstructedMessages()); //$NON-NLS-1$ } public static void setPCGenOption(final String optionName, final int optionValue) { setPCGenOption(optionName, String.valueOf(optionValue)); } public static void setPCGenOption(final String optionName, final String optionValue) { if (optionValue==null) { getOptions().remove("pcgen.options." + optionName); //$NON-NLS-1$ } else { getOptions().setProperty("pcgen.options." + optionName, optionValue); //$NON-NLS-1$ } } public static int getPCGenOption(final String optionName, final int defaultValue) { return Integer.decode(getPCGenOption(optionName, String.valueOf(defaultValue))).intValue(); } public static String getPCGenOption(final String optionName, final String defaultValue) { return getOptions().getProperty("pcgen.options." + optionName, defaultValue); //$NON-NLS-1$ } public static boolean hasPCGenOption(final String optionName) { return getOptions().containsKey("pcgen.options." + optionName); } public static String getPDFOutputSheetPath() { if ("".equals(selectedCharacterPDFOutputSheet)) //$NON-NLS-1$ { return ConfigurationSettings.getOutputSheetsDir(); } return new File(selectedCharacterPDFOutputSheet).getParentFile().getAbsolutePath(); } /** * Where to load the data (lst) files from * @param argPccFilesLocation */ public static void setPccFilesLocation(final File argPccFilesLocation) { pccFilesLocation = argPccFilesLocation; } /** * Where to load the data (lst) files from * @deprecated Use ConfigurationSettings.getPccFilesDir() instead. * @return pcc files location */ public static File getPccFilesLocation() { return pccFilesLocation; } /** * Ensures that the path specified exists. * * @param path the {@code File} representing the path */ public static void ensurePathExists(final File path) { if (path != null && !path.exists()) { path.mkdirs(); } } /** * Sets the path that was last used in a character or output file chooser. * * @param path the {@code File} representing the path */ public static void setLastUsedPcgPath(final File path) { if (path != null && !path.exists()) { path.mkdirs(); } lastUsedPcgPath = path; } /** * @return The path that was last used in a character or output file chooser. */ public static File getLastUsedPcgPath() { if (lastUsedPcgPath == null) { return pcgPath; } return lastUsedPcgPath; } public static void setPcgenSponsorDir(final File aFile) { pcgenSponsorDir = aFile; } /** * @deprecated * @return the sponsor directory */ public static File getPcgenSponsorDir() { return pcgenSponsorDir; } public static void setPcgenOutputSheetDir(final File aFile) { pcgenOutputSheetDir = aFile; } public static void setPcgenPreviewDir(final File aFile) { pcgenPreviewDir = aFile; } /** * Sets the path to the portrait files. * * @param path the {@code File} representing the path */ public static void setPortraitsPath(final File path) { portraitsPath = path; } /** * @deprecated Use PCGenSettings.getPortraitsDir() * @return the portraits directory */ public static File getPortraitsPath() { return portraitsPath; } public static void setPostExportCommandStandard(final String argPreference) { postExportCommandStandard = argPreference; } public static void setPostExportCommandPDF(final String argPreference) { postExportCommandPDF = argPreference; } public static String getPostExportCommandStandard() { return postExportCommandStandard; } public static String getPostExportCommandPDF() { return postExportCommandPDF; } public static void setPrereqFailColor(final int newColor) { prereqFailColor = newColor & 0x00FFFFFF; } public static int getPrereqFailColor() { return prereqFailColor; } public static String getPrereqFailColorAsHtmlStart() { final StringBuilder rString = new StringBuilder("<font color="); //$NON-NLS-1$ if (getPrereqFailColor() != 0) { rString.append("\"#").append(Integer.toHexString(getPrereqFailColor())).append("\""); //$NON-NLS-1$ //$NON-NLS-2$ } else { rString.append("red"); //$NON-NLS-1$ } rString.append('>'); return rString.toString(); } public static String getPrereqFailColorAsHtmlEnd() { return "</font>"; //$NON-NLS-1$ } public static void setPrereqQualifyColor(final int newColor) { prereqQualifyColor = newColor & 0x00FFFFFF; } public static int getPrereqQualifyColor() { return prereqQualifyColor; } /** * Output spells on standard PC output sheet? * @param arg **/ public static void setPrintSpellsWithPC(final boolean arg) { printSpellsWithPC = arg; } public static boolean getPrintSpellsWithPC() { return printSpellsWithPC; } /** * I guess only ROG can document this? * @return TRUR if ROG, else FALSE */ public static boolean isROG() { return isROG; } /** * Set's the ruleCheckMap key to 'Y' or 'N' * @param aKey * @param aBool **/ public static void setRuleCheck(final String aKey, final boolean aBool) { String aVal = "N"; //$NON-NLS-1$ if (aBool) { aVal = "Y"; //$NON-NLS-1$ } ruleCheckMap.put(aKey, aVal); } /** * Gets this PC's choice on a Rule * @param aKey * @return true or false **/ public static boolean getRuleCheck(final String aKey) { if (ruleCheckMap.containsKey(aKey)) { final String aVal = ruleCheckMap.get(aKey); if (aVal.equals("Y")) //$NON-NLS-1$ { return true; } } return false; } public static void setSaveCustomEquipment(final boolean aBool) { setSaveCustomInLst(aBool); } /** * save the outputsheet location with the PC? * @param arg **/ public static void setSaveOutputSheetWithPC(final boolean arg) { saveOutputSheetWithPC = arg; } public static boolean getSaveOutputSheetWithPC() { return saveOutputSheetWithPC; } /** * Sets the current HTML output sheet for a single character. * * @param path a string containing the path to the HTML output sheet * @param aPC */ public static void setSelectedCharacterHTMLOutputSheet(final String path, final PlayerCharacter aPC) { if (getSaveOutputSheetWithPC() && (aPC != null)) { aPC.setSelectedCharacterHTMLOutputSheet(path); } selectedCharacterHTMLOutputSheet = path; } /** * Returns the current HTML output sheet for a single character. * * @return the {@code selectedCharacterHTMLOutputSheet} property * @param aPC **/ public static String getSelectedCharacterHTMLOutputSheet(final PlayerCharacter aPC) { if (getSaveOutputSheetWithPC() && (aPC != null)) { if (!aPC.getSelectedCharacterHTMLOutputSheet().isEmpty()) { return aPC.getSelectedCharacterHTMLOutputSheet(); } } return selectedCharacterHTMLOutputSheet; } /** * Sets the current PDF output sheet for a single character. * * @param path a string containing the path to the PDF output sheet * @param aPC */ public static void setSelectedCharacterPDFOutputSheet(final String path, final PlayerCharacter aPC) { if (getSaveOutputSheetWithPC() && (aPC != null)) { aPC.setSelectedCharacterPDFOutputSheet(path); } selectedCharacterPDFOutputSheet = path; } /** * Returns the current PDF output sheet for a single character. * * @return the {@code selectedCharacterPDFOutputSheet} property * @param aPC */ public static String getSelectedCharacterPDFOutputSheet(final PlayerCharacter aPC) { if (getSaveOutputSheetWithPC() && (aPC != null)) { if (!aPC.getSelectedCharacterPDFOutputSheet().isEmpty()) { return aPC.getSelectedCharacterPDFOutputSheet(); } } return selectedCharacterPDFOutputSheet; } /** * Sets the current EquipSet template. * * @param path a string containing the path to the template **/ public static void setSelectedEqSetTemplate(final String path) { selectedEqSetTemplate = path; } /** * Returns the current EquipSet template. * * @return the {@code selectedEqSetTemplate} property **/ public static String getSelectedEqSetTemplate() { return selectedEqSetTemplate; } public static String getSelectedEqSetTemplateName() { if (!selectedEqSetTemplate.isEmpty()) { final int i = selectedEqSetTemplate.lastIndexOf("\\"); //$NON-NLS-1$ return selectedEqSetTemplate.substring(i + 1); } return selectedEqSetTemplate; } /** * Sets the current party HTML template. * * @param path a string containing the path to the template */ public static void setSelectedPartyHTMLOutputSheet(final String path) { selectedPartyHTMLOutputSheet = path; } /** * Returns the current party HTML template. * * @return the {@code selectedPartyHTMLOutputSheet} property **/ public static String getSelectedPartyHTMLOutputSheet() { return selectedPartyHTMLOutputSheet; } /** * Sets the current party PDF template. * * @param path a string containing the path to the template **/ public static void setSelectedPartyPDFOutputSheet(final String path) { selectedPartyPDFOutputSheet = path; } /** * Returns the current party PDF template. * * @return the {@code selectedPartyPDFOutputSheet} property **/ public static String getSelectedPartyPDFOutputSheet() { return selectedPartyPDFOutputSheet; } /** * Sets the current Spell output sheet * * @param path a string containing the path to the template **/ public static void setSelectedSpellSheet(final String path) { selectedSpellSheet = path; } /** * Returns the current spell output sheet * * @return the {@code selectedSpellSheet} property **/ public static String getSelectedSpellSheet() { return selectedSpellSheet; } public static String getSelectedSpellSheetName() { if (!selectedSpellSheet.isEmpty()) { final int i = selectedSpellSheet.lastIndexOf("\\"); //$NON-NLS-1$ return selectedSpellSheet.substring(i + 1); } return selectedSpellSheet; } /** * Sets whether the feats dialog should be shown at level up. * NOTE: This function has been disabled as it interferes with class builds. * @see <a href="https://sourceforge.net/tracker/index.php?func=detail&aid=1502512&group_id=25576&atid=384719">#1502512</a> * * @param argShowFeatDialogAtLevelUp Should the feats dialog be shown at level up? */ public static void setShowFeatDialogAtLevelUp(final boolean argShowFeatDialogAtLevelUp) { showFeatDialogAtLevelUp = true; //argShowFeatDialogAtLevelUp; } /** * Returns whether the feats dialog should be shown at level up. * @return true if the feats dialog should be shown at level up. */ public static boolean getShowFeatDialogAtLevelUp() { return showFeatDialogAtLevelUp; } /** * Sets whether the hit point dialog should be shown at level up. * @param argShowHPDialogAtLevelUp Should the hit point dialog be shown at level up? */ public static void setShowHPDialogAtLevelUp(final boolean argShowHPDialogAtLevelUp) { showHPDialogAtLevelUp = argShowHPDialogAtLevelUp; } /** * Returns whether the hit point dialog should be shown at level up. * @return true if the hit point dialog should be shown at level up. */ public static boolean getShowHPDialogAtLevelUp() { return showHPDialogAtLevelUp; } /** * Sets whether the Stat dialog should be shown at level up. * @param argShowStatDialogAtLevelUp Should the Stat dialog should be shown at level up? */ public static void setShowStatDialogAtLevelUp(final boolean argShowStatDialogAtLevelUp) { showStatDialogAtLevelUp = argShowStatDialogAtLevelUp; } /** * Returns whether the Stat dialog should be shown at level up. * @return true if the Stat dialog should be shown at level up. */ public static boolean getShowStatDialogAtLevelUp() { return showStatDialogAtLevelUp; } public static void setShowTipOfTheDay(final boolean argShowTipOfTheDay) { showTipOfTheDay = argShowTipOfTheDay; } public static boolean getShowTipOfTheDay() { return showTipOfTheDay; } /** * Sets the argShowWarningAtFirstLevelUp. * @param argShowWarningAtFirstLevelUp The argShowWarningAtFirstLevelUp to set */ public static void setShowWarningAtFirstLevelUp(final boolean argShowWarningAtFirstLevelUp) { SettingsHandler.showWarningAtFirstLevelUp = argShowWarningAtFirstLevelUp; } /** * Returns the showWarningAtFirstLevelUp. * @return boolean */ public static boolean isShowWarningAtFirstLevelUp() { return showWarningAtFirstLevelUp; } public static void setSkinLFThemePack(final String argSkinLFThemePack) { skinLFThemePack = argSkinLFThemePack; } public static String getSkinLFThemePack() { return skinLFThemePack; } public static void setTabPlacement(final int anInt) { tabPlacement = anInt; } public static int getTabPlacement() { return tabPlacement; } /** * Returns the path to the temporary output location (for previews). * * @return the {@code tempPath} property */ public static File getTempPath() { return tempPath; } public static void setToolBarShown(final boolean argShowToolBar) { setShowToolBar(argShowToolBar); } public static boolean isToolBarShown() { return isShowToolBar(); } /** * @return Returns the useHigherLevelSlotsDefault. */ public static boolean isUseHigherLevelSlotsDefault() { return useHigherLevelSlotsDefault; } /** * @param useHigherLevelSlotsDefault The useHigherLevelSlotsDefault to set. */ public static void setUseHigherLevelSlotsDefault( boolean useHigherLevelSlotsDefault) { SettingsHandler.useHigherLevelSlotsDefault = useHigherLevelSlotsDefault; } public static void setUseWaitCursor(final boolean b) { useWaitCursor = b; } public static boolean getUseWaitCursor() { return useWaitCursor; } public static void setWantToLoadMasterworkAndMagic(final boolean bFlag) { wantToLoadMasterworkAndMagic = bFlag; } public static void setWeaponProfPrintout(final boolean argPreference) { weaponProfPrintout = argPreference; } public static boolean getWeaponProfPrintout() { return weaponProfPrintout; } public static boolean guiUsesOutputNameEquipment() { return guiUsesOutputNameEquipment; } public static boolean guiUsesOutputNameSpells() { return guiUsesOutputNameSpells; } /** * Checks to see if the user has set a value for this key * @param aKey * @return true or false **/ public static boolean hasRuleCheck(final String aKey) { return ruleCheckMap.containsKey(aKey); } public static boolean hideMonsterClasses() { return hideMonsterClasses; } public static void readGUIOptionsProperties() { setNameDisplayStyle(getPCGenOption("nameDisplayStyle", Constants.DISPLAY_STYLE_NAME)); //$NON-NLS-1$ } /** * Opens the options.ini */ public static void readOptionsProperties() { // read in the filepath.ini settings before anything else readFilePaths(); // now get the Filter settings readFilterSettings(); // Globals.getOptionsPath() will _always_ return a string final String optionsLocation = Globals.getOptionsPath(); FileInputStream in = null; try { in = new FileInputStream(optionsLocation); getOptions().load(in); } catch (IOException e) { // Not an error, this file may not exist yet if (Logging.isDebugMode()) { Logging.debugPrint(LanguageBundle .getString("SettingsHandler.no.options.file")); //$NON-NLS-1$ } } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { //Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.options.file"), ex); //$NON-NLS-1$ } } } /** * retrieve filter settings * * <br>author: Thomas Behr 19-02-02 * * @param optionName the name of the property to retrieve * @return filter settings */ public static String retrieveFilterSettings(final String optionName) { return getFilterSettings().getProperty("pcgen.filters." + optionName, //$NON-NLS-1$ getOptions().getProperty("pcgen.filters." + optionName, "")); //$NON-NLS-1$ //$NON-NLS-2$ } public static boolean wantToLoadMasterworkAndMagic() { return wantToLoadMasterworkAndMagic; } private static String getPropertiesFileHeader(final String description) { return "# Emacs, this is -*- java-properties-generic -*- mode."//$NON-NLS-1$ + Constants.LINE_SEPARATOR + "#" //$NON-NLS-2$ + Constants.LINE_SEPARATOR + description //$NON-NLS-1$ + Constants.LINE_SEPARATOR + "# Do not edit this file manually." //$NON-NLS-1$ + Constants.LINE_SEPARATOR; } /** * Writes out filepaths.ini **/ public static void writeFilePaths() { final String fType = getFilePaths(); final String header = getPropertiesFileHeader( "# filepaths.ini -- location of other .ini files set in pcgen"); if (!fType.equals("pcgen") && !fType.equals("user") && !fType.equals("mac_user")) //$NON-NLS-1$ //$NON-NLS-2$ { if (fType != null) { setFilePaths(fType); } } // if it's the users home directory, we need to make sure // that the $HOME/.pcgen directory exists if (fType.equals("user")) //$NON-NLS-1$ { final String aLoc = System.getProperty("user.home") + File.separator + ".pcgen"; //$NON-NLS-1$ //$NON-NLS-2$ final File aFile = new File(aLoc); if (!aFile.exists()) { // Directory doesn't exist, so create it aFile.mkdir(); Logging.errorPrint(LanguageBundle.getFormattedString("SettingsHandler.dir.does.not.exist", aLoc)); //$NON-NLS-1$ } else if (!aFile.isDirectory()) { String notDir = LanguageBundle.getFormattedString( "SettingsHandler.is.not.a.directory", aLoc); //$NON-NLS-2$ ShowMessageDelegate.showMessageDialog( notDir, Constants.APPLICATION_NAME, MessageType.ERROR); } } // if it's the standard Mac user directory, we need to make sure // that the $HOME/Library/Preferences/pcgen directory exists if (fType.equals("mac_user")) //$NON-NLS-1$ { final String aLoc = Globals.defaultMacOptionsPath; final File aFile = new File(aLoc); if (!aFile.exists()) { // Directory doesn't exist, so create it aFile.mkdir(); Logging.errorPrint(LanguageBundle.getFormattedString("SettingsHandler.dir.does.not.exist", aLoc)); //$NON-NLS-1$ } else if (!aFile.isDirectory()) { String notDir = LanguageBundle.getFormattedString( "SettingsHandler.is.not.a.directory", aLoc); //$NON-NLS-2$ ShowMessageDelegate.showMessageDialog( notDir, Constants.APPLICATION_NAME, MessageType.ERROR); } } FileOutputStream out = null; try { out = new FileOutputStream(fileLocation); getFilepathProp().store(out, header); } catch (FileNotFoundException fnfe) { final File f = new File(fileLocation); if (!f.canWrite()) { Logging.errorPrint(LanguageBundle.getFormattedString("SettingsHandler.filepaths.readonly", fileLocation)) ; //$NON-NLS-1$ } else { Logging.errorPrint(LanguageBundle.getString("SettingsHandler.filepaths.write"), fnfe); //$NON-NLS-1$ } } catch (IOException e) { Logging.errorPrint(LanguageBundle.getString("SettingsHandler.filepaths.write"), e); //$NON-NLS-1$ } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { // Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.filepaths.ini.write"), ex); //$NON-NLS-1$ } } } /** * Opens (options.ini) for writing and calls {@link SettingsHandler#setOptionsProperties(PlayerCharacter)}. * @param aPC */ public static void writeOptionsProperties(final PlayerCharacter aPC) { writeFilePaths(); writeFilterSettings(); // Globals.getOptionsPath() will _always_ return a string final String optionsLocation = Globals.getOptionsPath(); final String header = getPropertiesFileHeader( "# options.ini -- options set in pcgen"); // Make sure all the Properties are set setOptionsProperties(aPC); FileOutputStream out = null; try { out = new FileOutputStream(optionsLocation); getOptions().mystore(out, header); } catch (FileNotFoundException fnfe) { final File f = new File(fileLocation); if (!f.canWrite()) { Logging.errorPrint(LanguageBundle.getFormattedString("SettingsHandler.options.ini.read.only", optionsLocation)); //$NON-NLS-1$ } else { Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.write.options.ini"), fnfe); //$NON-NLS-1$ } } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { // Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.options.ini.write"), ex); //$NON-NLS-1$ } } } static boolean isAutogenExoticMaterial() { return autogenExoticMaterial; } static boolean isAutogenMagic() { return autogenMagic; } static boolean isAutogenMasterwork() { return autogenMasterwork; } static boolean isAutogenRacial() { return autogenRacial; } static void setPreviewTabShown(final boolean showPreviewTab) { previewTabShown = showPreviewTab; } static boolean isPreviewTabShown() { return previewTabShown; } /** Sets whether 'automatic' class-granted feats can be turned in for other feats * @param argAutoFeatsRefundable */ private static void setAutoFeatsRefundable(final boolean argAutoFeatsRefundable) { autoFeatsRefundable = argAutoFeatsRefundable; } /** Returns whether 'automatic' class-granted feats can be turned in for other feats * @return true if 'automatic' class-granted feats can be turned in for other feats */ private static boolean isAutoFeatsRefundable() { return autoFeatsRefundable; } private static void setAutogenExoticMaterial(final boolean aBool) { autogenExoticMaterial = aBool; } private static void setAutogenMagic(final boolean aBool) { autogenMagic = aBool; } private static void setAutogenMasterwork(final boolean aBool) { autogenMasterwork = aBool; } private static void setAutogenRacial(final boolean aBool) { autogenRacial = aBool; } private static Properties getFilterSettings() { return FILTERSETTINGS; } private static void setGrimHPMode(final boolean argGrimHPMode) { grimHPMode = argGrimHPMode; } private static boolean isGrimHPMode() { return grimHPMode; } private static void setGrittyACMode(final boolean aBool) { grittyACMode = aBool; } private static boolean isGrittyACMode() { return grittyACMode; } private static int getOptionTabPlacement(final String optionName, final int defaultValue) { final String aString = getPCGenOption(optionName, convertTabPlacementToString(defaultValue)); int iVal; try { iVal = Integer.parseInt(aString); switch (iVal) { case SwingConstants.TOP: case SwingConstants.LEFT: case SwingConstants.BOTTOM: case SwingConstants.RIGHT: break; default: iVal = defaultValue; break; } } catch (NumberFormatException exc) { if ("TOP".equals(aString)) //$NON-NLS-1$ { iVal = SwingConstants.TOP; } else if ("LEFT".equals(aString)) //$NON-NLS-1$ { iVal = SwingConstants.LEFT; } else if ("BOTTOM".equals(aString)) //$NON-NLS-1$ { iVal = SwingConstants.BOTTOM; } else if ("RIGHT".equals(aString)) //$NON-NLS-1$ { iVal = SwingConstants.RIGHT; } else { iVal = defaultValue; } } return iVal; } /** * Puts all properties into the {@code Properties} object, * ({@code options}). This is called by * {@code writeOptionsProperties}, which then saves the * {@code options} into a file. * <p> * I am guessing that named object properties are faster to access * than using the {@code getProperty} method, and that this is * why settings are stored as static properties of {@code Global}, * but converted into a {@code Properties} object for * storage and retrieval. * @param optionName * @param optionValue */ public static void setPCGenOption(final String optionName, final boolean optionValue) { setPCGenOption(optionName, optionValue ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ } public static void setPCGenOption(final String optionName, final double optionValue) { setPCGenOption(optionName, String.valueOf(optionValue)); } /** * Set most of this objects static properties from the loaded {@code options}. * Called by readOptionsProperties. Most of the static properties are * set as a side effect, with the main screen size being returned. * <p> * I am guessing that named object properties are faster to access * than using the {@code getProperty} method, and that this is * why settings are stored as static properties of {@code Global}, * but converted into a {@code Properties} object for * storage and retrieval. * @param optionName * @param defaultValue * * @return the default {@code Dimension} to set the screen size to */ public static boolean getPCGenOption(final String optionName, final boolean defaultValue) { final String option = getPCGenOption(optionName, defaultValue ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ return "true".equalsIgnoreCase(option); //$NON-NLS-1$ } private static Double getPCGenOption(final String optionName, final double defaultValue) { return new Double(getPCGenOption(optionName, Double.toString(defaultValue))); } /** * What does this do??? * @param ROG */ private static void setROG(final boolean ROG) { isROG = ROG; } /** * Set's the RuleChecks in the options.ini file * @param optionName **/ private static void setRuleChecksInOptions(final String optionName) { String value = ""; //$NON-NLS-1$ for (Iterator<String> i = ruleCheckMap.keySet().iterator(); i.hasNext();) { final String aKey = i.next(); final String aVal = ruleCheckMap.get(aKey); if (value.isEmpty()) { value = aKey + "|" + aVal; //$NON-NLS-1$ } else { value += ("," + aKey + "|" + aVal); //$NON-NLS-1$ //$NON-NLS-2$ } } //setPCGenOption(optionName, value); getOptions().setProperty("pcgen.options." + optionName, value); //$NON-NLS-1$ } private static void setSaveCustomInLst(final boolean aBool) { saveCustomInLst = aBool; } private static boolean isSaveCustomInLst() { return saveCustomInLst; } private static void setShowToolBar(final boolean argShowToolBar) { showToolBar = argShowToolBar; } private static boolean isShowToolBar() { return showToolBar; } public static void setShowSkillModifier(final boolean argShowSkillMod) { showSkillModifier = argShowSkillMod; } public static boolean getShowSkillModifier() { return showSkillModifier; } public static void setShowSkillRanks(final boolean argShowSkillRanks) { showSkillRanks = argShowSkillRanks; } public static boolean getShowSkillRanks() { return showSkillRanks; } private static void setSpellMarketPriceAdjusted(final boolean aBool) { spellMarketPriceAdjusted = aBool; } private static boolean isSpellMarketPriceAdjusted() { return spellMarketPriceAdjusted; } private static String getTmpPath() { return tmpPath; } private static String convertTabPlacementToString(final int placement) { switch (placement) { case SwingConstants.BOTTOM: return "BOTTOM"; //$NON-NLS-1$ case SwingConstants.LEFT: return "LEFT"; //$NON-NLS-1$ case SwingConstants.RIGHT: return "RIGHT"; //$NON-NLS-1$ case SwingConstants.TOP:default: return "TOP"; //$NON-NLS-1$ } } /* * If the path starts with an @ then it's a relative path */ private static String expandRelativePath(String path) { if (path.startsWith("@")) //$NON-NLS-1$ { path = System.getProperty("user.dir") + path.substring(1); //$NON-NLS-1$ } return path; } /** * Parse all the user selected RuleChecks out of the options.ini file * of the form: * aKey|Y,bKey|N,cKey|Y * @param aString **/ private static void parseRuleChecksFromOptions(final String aString) { if (aString.length() <= 0) { return; } final StringTokenizer aTok = new StringTokenizer(aString, ","); //$NON-NLS-1$ while (aTok.hasMoreTokens()) { final String bs = aTok.nextToken(); final StringTokenizer bTok = new StringTokenizer(bs, "|"); //$NON-NLS-1$ final String aKey = bTok.nextToken(); final String aVal = bTok.nextToken(); ruleCheckMap.put(aKey, aVal); } } /** * Opens the filepaths.ini file for reading **/ private static void readFilePaths() { FileInputStream in = null; try { in = new FileInputStream(fileLocation); getFilepathProp().load(in); String fType = SettingsHandler.getFilePaths(); if ((fType == null) || (fType.length() < 1)) { // make sure we have a default if (SystemUtils.IS_OS_MAC) { fType = "mac_user"; //$NON-NLS-1$ } else { fType = "user"; //$NON-NLS-1$ } } } catch (IOException e) { // Not an error, this file may not exist yet if (Logging.isDebugMode()) { Logging.debugPrint(LanguageBundle .getString("SettingsHandler.will.create.filepaths.ini")); //$NON-NLS-1$ } } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { //Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.filepaths.ini"), ex); //$NON-NLS-1$ } } } /** * Opens the filter.ini file for reading * * <br>author: Thomas Behr 10-03-02 **/ private static void readFilterSettings() { // Globals.getFilterPath() will _always_ return a string final String filterLocation = Globals.getFilterPath(); FileInputStream in = null; try { in = new FileInputStream(filterLocation); getFilterSettings().load(in); } catch (IOException e) { // Not an error, this file may not exist yet if (Logging.isDebugMode()) { Logging.debugPrint(LanguageBundle .getString("SettingsHandler.will.create.filter.ini")); //$NON-NLS-1$ } } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { //Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.filter.ini"), ex); //$NON-NLS-1$ } } } /* * setup relative paths */ private static String retractRelativePath(String path) { final File userDir = new File(System.getProperty("user.dir")); //$NON-NLS-1$ if (path.startsWith(userDir.getAbsolutePath())) { path = "@" + path.substring(userDir.getAbsolutePath().length()); //$NON-NLS-1$ } return path; } /** * Opens the filter.ini file for writing * * <br>author: Thomas Behr 10-03-02 */ private static void writeFilterSettings() { // Globals.getFilterPath() will _always_ return a string final String filterLocation = Globals.getFilterPath(); final String header = getPropertiesFileHeader( "# filter.ini -- filters set in pcgen"); FileOutputStream out = null; try { out = new FileOutputStream(filterLocation); getFilterSettings().store(out, header); } catch (FileNotFoundException fnfe) { final File f = new File(fileLocation); if (!f.canWrite()) { Logging.errorPrint(LanguageBundle.getFormattedString("SettingsHandler.filter.ini.readonly", filterLocation)); //$NON-NLS-1$ } else { Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.write.filter.ini"), fnfe); //$NON-NLS-1$ } } catch (IOException e) { Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.write.filter.ini"), e); //$NON-NLS-1$ } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { //Not much to do about it... Logging.errorPrint(LanguageBundle.getString("SettingsHandler.can.not.close.filter.ini.write"), ex); //$NON-NLS-1$ } } // remove old filter stuff! for (Iterator<Object> it = getOptions().keySet().iterator(); it.hasNext();) { if (((String) it.next()).startsWith("pcgen.filters.")) //$NON-NLS-1$ { it.remove(); } } } /** * <p>Returns the window state. This corresponds to the values returned/accepted * by {@code Frame.getExtendedState} and <code>Frame.setExtendedState</code>.</p> * * @return Returns the windowState. */ public static int getWindowState() { return windowState; } /** * <p>Sets the window state. This corresponds to the values returned/accepted * by {@code Frame.getExtendedState} and <code>Frame.setExtendedState</code>.</p> * * @param argWindowState The argWindowState to set. */ public static void setWindowState(final int argWindowState) { SettingsHandler.windowState = argWindowState; } /** * Shows the program memory use in the status bar if {@code true}. * * @return show memory setting for the status bar */ public static boolean isShowMemoryArea() { return showMemoryArea; } /** * Shows character portrait preview in the file chooser if {@code true}. * * @return show portrait preview */ public static boolean isShowImagePreview() { return showImagePreview; } /** * Toggles displaying the character portrait preview in the file chooser * * @param showImagePreview {@code true} to show portrait preview */ public static void setShowImagePreview(final boolean showImagePreview) { SettingsHandler.showImagePreview = showImagePreview; } /** * @return The showSingleBoxPerBundle value. */ public static boolean getShowSingleBoxPerBundle() { return showSingleBoxPerBundle; } /** * Set the showSingleBoxPerBundle value. * * @param b The new showSingleBoxPerBundle value. */ public static void setShowSingleBoxPerBundle(boolean b) { showSingleBoxPerBundle = b; } private static boolean outputDeprecationMessages = true; public static boolean outputDeprecationMessages() { return outputDeprecationMessages; } public static void setOutputDeprecationMessages(boolean b) { outputDeprecationMessages = b; } private static boolean inputUnconstructedMessages = true; public static boolean inputUnconstructedMessages() { return inputUnconstructedMessages; } public static void setInputUnconstructedMessages(boolean b) { inputUnconstructedMessages = b; } }