| 11 | | public URLField(Color foreground, Color background) |
|---|
| 12 | | { |
|---|
| 13 | | super(); |
|---|
| 14 | | setBackground(background); |
|---|
| 15 | | setForeground(foreground); |
|---|
| 16 | | } |
|---|
| 17 | | |
|---|
| 18 | | |
|---|
| 19 | | public boolean validateURL() |
|---|
| 20 | | { |
|---|
| 21 | | String url_string = getText(); |
|---|
| | 23 | static public String getText(JComponent control) |
|---|
| | 24 | { |
|---|
| | 25 | if(control instanceof JTextField) { // not specifically a URL Field, therefore, we're not meant to do checking |
|---|
| | 26 | return ((JTextField)control).getText(); |
|---|
| | 27 | } |
|---|
| | 28 | else if(control instanceof URLField.DropDown) { |
|---|
| | 29 | return (String)((JComboBox)control).getSelectedItem(); |
|---|
| | 30 | } |
|---|
| | 31 | |
|---|
| | 32 | // unknown control, shouldn't happen |
|---|
| | 33 | return ""; |
|---|
| | 34 | } |
|---|
| | 35 | |
|---|
| | 36 | static public String setText(JComponent control, String text) |
|---|
| | 37 | { |
|---|
| | 38 | if(control instanceof JTextField) { // not specifically a URL Field, therefore, we're not meant to do checking |
|---|
| | 39 | ((JTextField)control).setText(text); |
|---|
| | 40 | } |
|---|
| | 41 | else if(control instanceof URLField.DropDown) { |
|---|
| | 42 | ((JComboBox)control).setSelectedItem(text); |
|---|
| | 43 | } |
|---|
| | 44 | |
|---|
| | 45 | // unknown control, shouldn't happen |
|---|
| | 46 | return ""; |
|---|
| | 47 | } |
|---|
| | 48 | |
|---|
| | 49 | static public boolean validateURL(JComponent control) |
|---|
| | 50 | { |
|---|
| | 51 | if(control instanceof URLField.Text) { |
|---|
| | 52 | return ((URLField.Text)control).validateURL(); |
|---|
| | 53 | } |
|---|
| | 54 | else if (control instanceof JTextField) { |
|---|
| | 55 | return true; // not specifically a URL Field, therefore, we're not meant to do checking |
|---|
| | 56 | } |
|---|
| | 57 | else { // control is a DropDown |
|---|
| | 58 | return ((URLField.DropDown)control).validateURL(); |
|---|
| | 59 | } |
|---|
| | 60 | } |
|---|
| | 61 | |
|---|
| | 62 | static public boolean validateURL(String url_string) |
|---|
| | 63 | { |
|---|
| | 78 | |
|---|
| | 79 | static public void store(JComponent control, String affected_property) { |
|---|
| | 80 | if(control instanceof JTextField) { |
|---|
| | 81 | String value = ((JTextField)control).getText(); |
|---|
| | 82 | Configuration.setString(affected_property, true, value); |
|---|
| | 83 | } |
|---|
| | 84 | else { // DropDown |
|---|
| | 85 | ((DropDown)control).saveProperties(); |
|---|
| | 86 | } |
|---|
| | 87 | } |
|---|
| | 88 | |
|---|
| | 89 | |
|---|
| | 90 | /** INTERFACE CLASS IMPLEMENTED BY Static inner classes Text and DropDown */ |
|---|
| | 91 | public static interface URLFieldControl { |
|---|
| | 92 | public boolean validateURL(); |
|---|
| | 93 | } |
|---|
| | 94 | |
|---|
| | 95 | |
|---|
| | 96 | /** STATIC INNER CLASS URLTextField */ |
|---|
| | 97 | public static class Text |
|---|
| | 98 | extends JTextField implements URLFieldControl |
|---|
| | 99 | { |
|---|
| | 100 | public Text(Color foreground, Color background) |
|---|
| | 101 | { |
|---|
| | 102 | super(); |
|---|
| | 103 | setBackground(background); |
|---|
| | 104 | setForeground(foreground); |
|---|
| | 105 | } |
|---|
| | 106 | |
|---|
| | 107 | public boolean validateURL() { |
|---|
| | 108 | String url_string = getText(); |
|---|
| | 109 | return URLField.validateURL(url_string); |
|---|
| | 110 | } |
|---|
| | 111 | } |
|---|
| | 112 | |
|---|
| | 113 | |
|---|
| | 114 | /** STATIC INNER CLASS DropDown, an editable URLComboBox */ |
|---|
| | 115 | public static class DropDown |
|---|
| | 116 | extends JComboBox implements URLFieldControl |
|---|
| | 117 | { |
|---|
| | 118 | private String checkString = null; // optional string to check the URLs items against to see whether the URLs contain this |
|---|
| | 119 | private String affectedProperty = null; // the Configuration property associated with this DropDown |
|---|
| | 120 | private String coaffectedProperty = null; // the Configuration property whose suffix should change along with the affectedProperty |
|---|
| | 121 | |
|---|
| | 122 | private static final int MAX_URLS = 5; |
|---|
| | 123 | |
|---|
| | 124 | public DropDown(Color foreground, Color background, String[] defaultURLs, |
|---|
| | 125 | String affectedProperty, String coaffectedProperty) |
|---|
| | 126 | { |
|---|
| | 127 | super(URLCollectionPair.createDefaultsArray(defaultURLs)); |
|---|
| | 128 | this.setEditable(true); |
|---|
| | 129 | this.getEditor().selectAll(); |
|---|
| | 130 | |
|---|
| | 131 | setBackground(background); |
|---|
| | 132 | setForeground(foreground); |
|---|
| | 133 | |
|---|
| | 134 | this.affectedProperty = affectedProperty; |
|---|
| | 135 | this.coaffectedProperty = coaffectedProperty; |
|---|
| | 136 | // read any URLS specified in the config file |
|---|
| | 137 | setComboBoxValues(); |
|---|
| | 138 | |
|---|
| | 139 | } |
|---|
| | 140 | |
|---|
| | 141 | public DropDown(Color foreground, Color background, String[] defaultURLs, |
|---|
| | 142 | String affectedProperty, String coaffectedProperty, String checkString) |
|---|
| | 143 | { |
|---|
| | 144 | this(foreground, background, defaultURLs, affectedProperty, coaffectedProperty); |
|---|
| | 145 | this.checkString = checkString; |
|---|
| | 146 | } |
|---|
| | 147 | |
|---|
| | 148 | public boolean validateURL() { |
|---|
| | 149 | //String url_string = (String)this.getEditor().getItem(); |
|---|
| | 150 | String url_string = this.getSelectedItem().toString(); // returns url of the combobox item |
|---|
| | 151 | |
|---|
| | 152 | if(checkString != null && !url_string.endsWith(checkString)) { |
|---|
| | 153 | return false; |
|---|
| | 154 | } else { |
|---|
| | 155 | return URLField.validateURL(url_string); |
|---|
| | 156 | } |
|---|
| | 157 | } |
|---|
| | 158 | |
|---|
| | 159 | public void saveProperties() { |
|---|
| | 160 | // 1. Add the first url just edited (if any) |
|---|
| | 161 | |
|---|
| | 162 | // The user might have created a new STRING, or selected an existing URLCollectionPair |
|---|
| | 163 | // We don't know the type! |
|---|
| | 164 | Object o = this.getSelectedItem(); |
|---|
| | 165 | URLCollectionPair editedItem = (o instanceof URLCollectionPair) |
|---|
| | 166 | ? (URLCollectionPair)o : new URLCollectionPair(o.toString()); |
|---|
| | 167 | |
|---|
| | 168 | if(editedItem != null) { |
|---|
| | 169 | insertItemAt(editedItem, 0); |
|---|
| | 170 | } else { |
|---|
| | 171 | editedItem = (URLCollectionPair)getItemAt(0); // else reuse the first default: |
|---|
| | 172 | } |
|---|
| | 173 | Configuration.setString(affectedProperty, true, editedItem.getURL()); |
|---|
| | 174 | |
|---|
| | 175 | // concurrently set the last opened collection for this url |
|---|
| | 176 | String lastOpenedCollection = editedItem.getCollection(); |
|---|
| | 177 | if(lastOpenedCollection.equals("")) { |
|---|
| | 178 | Configuration.setString(coaffectedProperty, true, null); |
|---|
| | 179 | } else { |
|---|
| | 180 | Configuration.setString(coaffectedProperty, true, lastOpenedCollection); |
|---|
| | 181 | } |
|---|
| | 182 | |
|---|
| | 183 | |
|---|
| | 184 | // 2. Add the remaining urls into the combobox |
|---|
| | 185 | int url_count = 1; // remain under MAX_URLS AND under the number of actual URLs in the dropdown |
|---|
| | 186 | for(int i = 0; url_count < MAX_URLS && i < getItemCount(); i++, url_count++) { |
|---|
| | 187 | |
|---|
| | 188 | URLCollectionPair item = (URLCollectionPair)getItemAt(i); |
|---|
| | 189 | String url = item.getURL(); |
|---|
| | 190 | |
|---|
| | 191 | if(item == null || url.equals(editedItem.getURL()) || url.equals("")) { |
|---|
| | 192 | // skip any duplicates of the just-edited URL and skip empty URLs |
|---|
| | 193 | url_count--; |
|---|
| | 194 | } |
|---|
| | 195 | else { |
|---|
| | 196 | Configuration.setString(affectedProperty+url_count, true, url); |
|---|
| | 197 | |
|---|
| | 198 | // concurrently save the name of the corresponding open collection |
|---|
| | 199 | if(item.getCollection().equals("")) { |
|---|
| | 200 | Configuration.setString(coaffectedProperty+url_count, true, null); |
|---|
| | 201 | } else { |
|---|
| | 202 | Configuration.setString(coaffectedProperty+url_count, true, item.getCollection()); |
|---|
| | 203 | } |
|---|
| | 204 | |
|---|
| | 205 | } // else retain old value for this affectedProperty (general.gliserver_url) |
|---|
| | 206 | } |
|---|
| | 207 | Configuration.save(); |
|---|
| | 208 | } |
|---|
| | 209 | |
|---|
| | 210 | |
|---|
| | 211 | // Get values from Configuration file, or (if none) use defaultURLs. |
|---|
| | 212 | // Put them into the combobox |
|---|
| | 213 | private void setComboBoxValues() { |
|---|
| | 214 | |
|---|
| | 215 | String url = Configuration.getString(affectedProperty, true); |
|---|
| | 216 | String collection = Configuration.getString(coaffectedProperty, true); |
|---|
| | 217 | boolean finished = url.equals(""); |
|---|
| | 218 | if(!finished) { |
|---|
| | 219 | this.removeAllItems(); // remove defaults, since config file now contains init values |
|---|
| | 220 | this.addItem(new URLCollectionPair(url, collection)); |
|---|
| | 221 | } // else urls and combobox already contains the defaults |
|---|
| | 222 | |
|---|
| | 223 | |
|---|
| | 224 | for(int i = 1; !finished; i++) { |
|---|
| | 225 | url = Configuration.getString(affectedProperty+i, true); |
|---|
| | 226 | collection = Configuration.getString(coaffectedProperty+i, true); |
|---|
| | 227 | if(url.equals("")) { |
|---|
| | 228 | finished = true; |
|---|
| | 229 | } |
|---|
| | 230 | else { // url is not empty |
|---|
| | 231 | this.addItem(new URLCollectionPair(url, collection)); |
|---|
| | 232 | } |
|---|
| | 233 | } |
|---|
| | 234 | |
|---|
| | 235 | // setting the size of the dropdown control |
|---|
| | 236 | Dimension newSize=new Dimension(getPreferredSize().width+20, getPreferredSize().height); |
|---|
| | 237 | setPreferredSize(newSize); |
|---|
| | 238 | } |
|---|
| | 239 | } |
|---|
| | 240 | |
|---|
| | 241 | |
|---|
| | 242 | /** STATIC INNER CLASS URLCollectionPair. |
|---|
| | 243 | * Since the configuration for a (remote) Greenstone2 and Greenstone3 is now |
|---|
| | 244 | * stored in a single file for both, we can have GLI connecting to different servers |
|---|
| | 245 | * while for each server, a different collection may have been left open last time. |
|---|
| | 246 | * This class URLCollectionPair will associate a GLIServer_URL or Library_URL with |
|---|
| | 247 | * the last opened collection file for it. It is used by URLField.DropDown combobox. */ |
|---|
| | 248 | public static class URLCollectionPair { |
|---|
| | 249 | String url; // gliserverURL |
|---|
| | 250 | String collection; // last opened collection for the corresponding gliserver |
|---|
| | 251 | |
|---|
| | 252 | |
|---|
| | 253 | public static URLCollectionPair[] createDefaultsArray(String[] defaultURLs) { |
|---|
| | 254 | URLCollectionPair[] pairs = new URLCollectionPair[defaultURLs.length]; |
|---|
| | 255 | for(int i = 0; i < pairs.length; i++) { |
|---|
| | 256 | pairs[i] = new URLCollectionPair(defaultURLs[i]); // no associated open collection |
|---|
| | 257 | } |
|---|
| | 258 | return pairs; |
|---|
| | 259 | } |
|---|
| | 260 | |
|---|
| | 261 | public URLCollectionPair(String url) { |
|---|
| | 262 | this.set(url, ""); |
|---|
| | 263 | } |
|---|
| | 264 | |
|---|
| | 265 | public URLCollectionPair(String url, String collection) { |
|---|
| | 266 | this.set(url, collection); |
|---|
| | 267 | } |
|---|
| | 268 | |
|---|
| | 269 | public void set(String url, String collection) { |
|---|
| | 270 | this.url = url; |
|---|
| | 271 | this.collection = collection; |
|---|
| | 272 | } |
|---|
| | 273 | |
|---|
| | 274 | public void setURL(String url) { |
|---|
| | 275 | this.url = url; |
|---|
| | 276 | } |
|---|
| | 277 | |
|---|
| | 278 | public void setCollection(String collection) { |
|---|
| | 279 | this.collection = collection; |
|---|
| | 280 | } |
|---|
| | 281 | |
|---|
| | 282 | public String getCollection() { |
|---|
| | 283 | return collection; |
|---|
| | 284 | } |
|---|
| | 285 | |
|---|
| | 286 | public String getURL() { |
|---|
| | 287 | return url; |
|---|
| | 288 | } |
|---|
| | 289 | |
|---|
| | 290 | /** For display in comboboxes */ |
|---|
| | 291 | public String toString() { |
|---|
| | 292 | return url; |
|---|
| | 293 | } |
|---|
| | 294 | |
|---|
| | 295 | /** @returns the number that is suffixed to the gliserver_url */ |
|---|
| | 296 | public String getSuffixNumber() { |
|---|
| | 297 | String numericSuffix = ""; |
|---|
| | 298 | boolean stop = false; |
|---|
| | 299 | for(int index = url.length()-1; index >= 0 && !stop; index--) { // work from the end |
|---|
| | 300 | char character = url.charAt(index); |
|---|
| | 301 | if(Character.isDigit(character)) { |
|---|
| | 302 | numericSuffix = Character.toString(character) + numericSuffix; |
|---|
| | 303 | } else { |
|---|
| | 304 | stop = true; |
|---|
| | 305 | } |
|---|
| | 306 | } |
|---|
| | 307 | |
|---|
| | 308 | return numericSuffix; |
|---|
| | 309 | } |
|---|
| | 310 | } |
|---|
| | 311 | |
|---|