001 /* 002 * This file is part of McIDAS-V 003 * 004 * Copyright 2007-2013 005 * Space Science and Engineering Center (SSEC) 006 * University of Wisconsin - Madison 007 * 1225 W. Dayton Street, Madison, WI 53706, USA 008 * https://www.ssec.wisc.edu/mcidas 009 * 010 * All Rights Reserved 011 * 012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 013 * some McIDAS-V source code is based on IDV and VisAD source code. 014 * 015 * McIDAS-V is free software; you can redistribute it and/or modify 016 * it under the terms of the GNU Lesser Public License as published by 017 * the Free Software Foundation; either version 3 of the License, or 018 * (at your option) any later version. 019 * 020 * McIDAS-V is distributed in the hope that it will be useful, 021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 023 * GNU Lesser Public License for more details. 024 * 025 * You should have received a copy of the GNU Lesser Public License 026 * along with this program. If not, see http://www.gnu.org/licenses. 027 */ 028 029 package edu.wisc.ssec.mcidasv.startupmanager.options; 030 031 import javax.swing.JCheckBox; 032 import javax.swing.JComponent; 033 import javax.swing.JTextField; 034 035 import edu.wisc.ssec.mcidasv.startupmanager.Platform; 036 import edu.wisc.ssec.mcidasv.startupmanager.StartupManager; 037 import edu.wisc.ssec.mcidasv.startupmanager.options.OptionMaster.OptionPlatform; 038 import edu.wisc.ssec.mcidasv.startupmanager.options.OptionMaster.Type; 039 import edu.wisc.ssec.mcidasv.startupmanager.options.OptionMaster.Visibility; 040 041 public abstract class AbstractOption implements Option { 042 043 /** 044 * A unique identifier for an option. Should be the same as the 045 * startup variable name found in the startup preference file. 046 */ 047 private final String optionId; 048 049 /** 050 * Brief description of the option. It will appear as the option's 051 * label in the GUI. 052 */ 053 private final String label; 054 055 /** @see Type */ 056 private final Type optionType; 057 058 /** @see OptionPlatform */ 059 private final OptionPlatform optionPlatform; 060 061 /** @see Visibility */ 062 private final Visibility optionVisibility; 063 064 /** 065 * Creates an option that can hold a specified sort of data and that 066 * applies to a given platform. 067 * 068 * @param id ID used to refer to this option. 069 * @param label Text that'll be used as the GUI label for this option 070 * @param optionType Type of data this option will represent. 071 * @param optionPlatform Platform(s) where this option is applicable. 072 * @param optionVisibility Visibility behavior of this option. 073 */ 074 public AbstractOption(final String id, final String label, 075 final Type optionType, final OptionPlatform optionPlatform, 076 final Visibility optionVisibility) 077 { 078 this.optionId = id; 079 this.label = label; 080 this.optionType = optionType; 081 this.optionPlatform = optionPlatform; 082 this.optionVisibility = optionVisibility; 083 } 084 085 /** 086 * Determines if the option applies to the current platform. 087 * 088 * @return {@code true} if this option is applicable, {@code false} 089 * otherwise. 090 */ 091 protected boolean onValidPlatform() { 092 OptionPlatform platform = getOptionPlatform(); 093 if (platform == OptionPlatform.ALL) { 094 return true; 095 } 096 if (platform == OptionMaster.getInstance().convertToOptionPlatform()) { 097 return true; 098 } 099 return false; 100 } 101 102 /** 103 * Tests the specified string to see if it's valid for the current 104 * platform. Currently strings that contain {@literal "SET "} 105 * <b>[ note the space ]</b> are considered to be Windows-only, while 106 * strings lacking {@literal "SET "} are considered Unix-like. 107 * 108 * @param text The string to test. 109 * 110 * @return Whether or not the string is valid. 111 */ 112 private boolean isValidPrefFormat(final String text) { 113 assert text != null; 114 boolean hasSet = text.contains("SET "); 115 boolean isWin = (StartupManager.getInstance().getPlatform() == Platform.WINDOWS); 116 return (isWin == hasSet); 117 } 118 119 /** 120 * Returns this option's type. 121 * 122 * @return The option's type. 123 * 124 * @see Type 125 */ 126 public Type getOptionType() { 127 return optionType; 128 } 129 130 /** 131 * Returns the platform(s) to which this option applies. 132 * 133 * @return The option's platform. 134 * 135 * @see OptionPlatform 136 */ 137 public OptionPlatform getOptionPlatform() { 138 return optionPlatform; 139 } 140 141 /** 142 * Returns whether or not this option represents a visible UI element. 143 * 144 * @return The option's visibility. 145 * 146 * @see Visibility 147 */ 148 public Visibility getOptionVisibility() { 149 return optionVisibility; 150 } 151 152 /** 153 * Returns the ID used when referring to this option. 154 * 155 * @return The option's ID. 156 */ 157 public String getOptionId() { 158 return optionId; 159 } 160 161 /** 162 * Returns a brief description of this option. Mostly useful for 163 * providing a GUI label. 164 * 165 * @return The option's label. 166 */ 167 public String getLabel() { 168 return label; 169 } 170 171 /** 172 * Initializes the current option using a relevant variable from the 173 * startup script. 174 * 175 * @param text Line from the startup script that represents the current 176 * option. 177 * 178 * @throws IllegalArgumentException if {@code text} is not in the proper 179 * format for the current platform. 180 */ 181 public void fromPrefsFormat(final String text) { 182 if (!isValidPrefFormat(text)) { 183 throw new IllegalArgumentException("Incorrect syntax for this platform: " + text); 184 } 185 String copy = new String(text); 186 if (StartupManager.getInstance().getPlatform() == Platform.WINDOWS) { 187 copy = copy.replace("SET ", ""); 188 } 189 String[] chunks = copy.split("="); 190 if (chunks.length == 2 && chunks[0].equals(optionId)) { 191 setValue(chunks[1]); 192 } else { 193 setValue(""); 194 } 195 } 196 197 /** 198 * Returns a string representation of the current option that is suitable 199 * for use in the startup script. 200 * 201 * @return Current value of this option as a startup script variable. The 202 * formatting changes slightly between {@literal "Unix-like"} platforms 203 * and Windows. 204 * 205 * @see #isValidPrefFormat(String) 206 */ 207 public String toPrefsFormat() { 208 StringBuilder str = new StringBuilder(optionId); 209 String value = getValue(); 210 if (StartupManager.getInstance().getPlatform() == Platform.WINDOWS) { 211 str.insert(0, "SET "); 212 } 213 return str.append("=").append(value).toString(); 214 } 215 216 /** 217 * Returns the GUI component that represents the option. 218 * {@link BooleanOption}s are represented by a {@link JCheckBox}, while 219 * {@link TextOption}s appear as a {@link JTextField}. 220 * 221 * @return The GUI representation of this option. 222 */ 223 public abstract JComponent getComponent(); 224 225 /** 226 * Returns the value of the option. Note that {@link BooleanOption}s 227 * return either "0" or "1". 228 * 229 * @return The current value of the option. 230 */ 231 public abstract String getValue(); 232 233 /** 234 * Forces the value of the option to the data specified. Note that 235 * {@link BooleanOption}s accept either "0", or "1". 236 * 237 * @param value New value to use. 238 */ 239 public abstract void setValue(final String value); 240 241 /** 242 * Friendly string representation of the option. 243 * 244 * @return String containing relevant info about the option. 245 * 246 * @see TextOption#toString() 247 * @see BooleanOption#toString() 248 */ 249 public abstract String toString(); 250 }