source: gli/trunk/src/org/greenstone/gatherer/gui/URLField.java@ 16338

Last change on this file since 16338 was 16338, checked in by ak19, 16 years ago

Completely changed in order to still work with WarningDialog but now deal with not only the regular JTextField and URLField.Text field, but also a URLField.Dropdown combobox that stores a certain number of previously-entered gliserver URLs and also the associated last-opened collection files. URLField is now a class with static methods now in order to deal with JTextField, URL TextFields and URL Comboxes. Therefore it now contains serveral inner classes.

  • Property svn:keywords set to Author Date Id Revision
File size: 9.9 KB
Line 
1package org.greenstone.gatherer.gui;
2
3import java.awt.*;
4import java.net.*;
5import javax.swing.*;
6import java.util.*;
7import java.io.*;
8import org.greenstone.gatherer.Gatherer;
9import org.greenstone.gatherer.Configuration;
10
11/** Modified.
12 * Class used by WarningDialog and Gatherer which represents a textual input control
13 * (TextField or Combobox) into which a URL can be entered. Provides some static methods
14 * shared by these controls and by a general JTextField control which can all be used
15 * in a WarningDialog. Class URLField also contains an inner Interface class and two
16 * static inner classes that implement this interface: Text and DropDown.
17 * Finally, another static inner class URLCollectionPair associates each Gliserver URL
18 * (or Library URL) that can be displayed in the DropDown with the last opened collection
19 * file for the Greenstone server at that URL.
20*/
21public class URLField
22{
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 {
64 if (!url_string.equals("")) {
65 // Check the URL string is valid by trying to create a URL object from it
66 try {
67 new URL(url_string);
68 }
69 catch (MalformedURLException exception) {
70 // URL string is invalid
71 return false;
72 }
73 }
74
75 // URL string is valid
76 return true;
77 }
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
312}
Note: See TracBrowser for help on using the repository browser.