source: trunk/gli/src/org/greenstone/gatherer/gui/Preferences.java@ 4428

Last change on this file since 4428 was 4428, checked in by kjdon, 21 years ago

the modal dialog now is one of our special ModalDialogs which only block the parent, enabling the use of help files while the dialog is open. A SimpleMenuBar with help on it has been added to the dialog.

  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 KB
Line 
1package org.greenstone.gatherer.gui;
2
3import java.awt.*;
4import java.awt.event.*;
5import java.util.*;
6import javax.swing.*;
7import org.greenstone.gatherer.Gatherer;
8import org.greenstone.gatherer.checklist.CheckList;
9import org.greenstone.gatherer.checklist.Entry;
10import org.greenstone.gatherer.gui.GUIManager;
11import org.greenstone.gatherer.gui.ModalDialog;
12import org.greenstone.gatherer.gui.NumberField;
13import org.greenstone.gatherer.gui.SimpleMenuBar;
14import org.greenstone.gatherer.util.Utility;
15import org.greenstone.gatherer.util.XORToggleButtonGroup;
16import org.w3c.dom.*;
17
18public class Preferences
19 extends ModalDialog {
20
21 private CheckList warning_preferences_check_list;
22 private JButton apply_button;
23 private JButton cancel_button;
24 private JButton ok_button;
25 private JCheckBox use_proxy_checkbox;
26 private JCheckBox workflow_browse;
27 private JCheckBox workflow_create;
28 private JCheckBox workflow_mirror;
29 private JCheckBox workflow_gather;
30 private JCheckBox workflow_enrich;
31 private JCheckBox workflow_design;
32 private JCheckBox workflow_export;
33 private JCheckBox workflow_preview;
34 private JTabbedPane tab_pane;
35 private JTextField proxy_host_field;
36 private JTextField proxy_port_field;
37 private Preferences self;
38
39 static final Dimension LABEL_SIZE = new Dimension(100, 25);
40 static final Dimension ROW_SIZE = new Dimension(380, 25);
41 static final Dimension SIZE = new Dimension(400, 345);
42 static final String TRUE = "true";
43
44 public Preferences() {
45 // Initialize
46 super(Gatherer.g_man, true);
47 this.self = this;
48 setSize(SIZE);
49 setTitle("Preferences");
50 setJMenuBar(new SimpleMenuBar("10.2"));
51 // Creation
52 JPanel content_pane = (JPanel) getContentPane();
53 tab_pane = new JTabbedPane();
54 tab_pane.add("Preferences.Workflow", createWorkflowPreferences());
55 tab_pane.add("Preferences.Connection", createConnectionPreferences());
56 tab_pane.add("Preferences.Warnings", createWarningPreferences());
57
58 JPanel button_pane = new JPanel();
59 ok_button = new JButton("General.OK");
60 apply_button = new JButton("General.Apply");
61 cancel_button = new JButton("General.Cancel");
62 // Connection
63 Gatherer.dictionary.register(this, null, false);
64 Gatherer.dictionary.register(tab_pane, null, false);
65 Gatherer.dictionary.register(ok_button, null, false);
66 Gatherer.dictionary.register(apply_button, null, false);
67 Gatherer.dictionary.register(cancel_button, null, false);
68 ok_button.addActionListener(new OKButtonListener(true));
69 apply_button.addActionListener(new OKButtonListener(false));
70 cancel_button.addActionListener(new CancelButtonListener());
71 // Layout
72 button_pane.setBorder(BorderFactory.createEmptyBorder(5,2,2,2));
73 button_pane.setLayout(new GridLayout(1,3,0,5));
74 button_pane.add(ok_button);
75 button_pane.add(apply_button);
76 button_pane.add(cancel_button);
77
78 content_pane.setLayout(new BorderLayout());
79 content_pane.add(tab_pane, BorderLayout.CENTER);
80 content_pane.add(button_pane, BorderLayout.SOUTH);
81
82 Dimension frame_size = Gatherer.g_man.getSize();
83 Point frame_location = Gatherer.g_man.getLocation();
84 //setLocation(frame_location.x + ((frame_size.width - SIZE.width) / 2), frame_location.y + ((frame_size.height - SIZE.height)));
85 setLocation(((frame_size.width - SIZE.width) / 2), ((frame_size.height - SIZE.height)));
86
87 // Clean up
88 frame_location = null;
89 frame_size = null;
90 cancel_button = null;
91 ok_button = null;
92 button_pane = null;
93 tab_pane = null;
94 content_pane = null;
95 setVisible(true);
96 }
97
98 private JPanel createConnectionPreferences() {
99 boolean currently_enabled = Gatherer.config.get("general.use_proxy", true);
100 // Creation
101 JPanel connection_pane = new JPanel();
102 use_proxy_checkbox = new JCheckBox("Preferences.Connection.Use_Proxy", currently_enabled);
103 use_proxy_checkbox.setPreferredSize(ROW_SIZE);
104 JPanel proxy_host_pane = new JPanel();
105 proxy_host_pane.setPreferredSize(ROW_SIZE);
106 JLabel proxy_host_label = new JLabel("Preferences.Connection.Proxy_Host");
107 proxy_host_label.setPreferredSize(LABEL_SIZE);
108 proxy_host_field = new JTextField(Gatherer.config.getString("general.proxy_host", true));
109 proxy_host_field.setEnabled(currently_enabled);
110 JPanel proxy_port_pane = new JPanel();
111 proxy_port_pane.setPreferredSize(ROW_SIZE);
112 JLabel proxy_port_label = new JLabel("Preferences.Connection.Proxy_Port");
113 proxy_port_label.setPreferredSize(LABEL_SIZE);
114 proxy_port_field = new NumberField(Gatherer.config.getString("general.proxy_port", true));
115 proxy_port_field.setEnabled(currently_enabled);
116
117 // Connection
118 Gatherer.dictionary.register(use_proxy_checkbox, null, false);
119 Gatherer.dictionary.register(proxy_host_label, null, false);
120 Gatherer.dictionary.register(proxy_port_label, null, false);
121 use_proxy_checkbox.addActionListener(new UseProxyListener());
122 // Layout
123 proxy_host_pane.setLayout(new BorderLayout());
124 proxy_host_pane.add(proxy_host_label, BorderLayout.WEST);
125 proxy_host_pane.add(proxy_host_field, BorderLayout.CENTER);
126
127 proxy_port_pane.setLayout(new BorderLayout());
128 proxy_port_pane.add(proxy_port_label, BorderLayout.WEST);
129 proxy_port_pane.add(proxy_port_field, BorderLayout.CENTER);
130
131 connection_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
132 connection_pane.add(use_proxy_checkbox);
133 connection_pane.add(proxy_host_pane);
134 connection_pane.add(proxy_port_pane);
135
136 return connection_pane;
137 }
138
139 /** The warning preferences are controlled through a checklist. */
140 private JPanel createWarningPreferences() {
141 // Retrieve all of the warning preferences settings.
142 HashMap warning_preferences = Gatherer.config.getAll("warning\\..*", true);
143 warning_preferences_check_list = new CheckList();
144 for(Iterator keys = warning_preferences.keySet().iterator(); keys.hasNext(); ) {
145 String property = (String) keys.next();
146 String value = (String) warning_preferences.get(property);
147 // Remove 'warning.'
148 String title = Gatherer.dictionary.get(property.substring(8) + ".Title");
149 Entry entry = new Entry(title, value.equalsIgnoreCase(TRUE));
150 entry.setProperty(property);
151 warning_preferences_check_list.addEntry(entry);
152 }
153 // Creation
154 JPanel warning_preferences_pane = new JPanel();
155 // Connection
156 // Layout
157 warning_preferences_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
158 warning_preferences_pane.setLayout(new BorderLayout());
159 warning_preferences_pane.add(new JScrollPane(warning_preferences_check_list), BorderLayout.CENTER);
160
161 return warning_preferences_pane;
162 }
163
164 private JPanel createWorkflowPreferences() {
165 // Read in the predefined configurations file.
166 Vector predefined = new Vector();
167 Document predefined_document = Utility.parse("xml/workflows.xml", true);
168 Element predefined_element = predefined_document.getDocumentElement();
169 NodeList workflow_elements = predefined_element.getElementsByTagName("Workflow");
170 for(int i = 0; i < workflow_elements.getLength(); i++) {
171 predefined.add(new WorkflowElementWrapper((Element)workflow_elements.item(i)));
172 }
173 // Creation
174 JPanel workflow_preferences_pane = new JPanel();
175 JPanel checklist_pane = new JPanel();
176 JLabel title_label = new JLabel("Preferences.Workflow.Title");
177 title_label.setPreferredSize(ROW_SIZE);
178 XORToggleButtonGroup checkbox_group = new XORToggleButtonGroup();
179 workflow_browse = new JCheckBox("Preferences.Workflow.Browse", Gatherer.config.get("workflow.browse", false));
180 workflow_browse.setPreferredSize(ROW_SIZE);
181 workflow_mirror = new JCheckBox("Preferences.Workflow.Mirror", Gatherer.config.get("workflow.mirror", false));
182 workflow_mirror.setPreferredSize(ROW_SIZE);
183 workflow_gather = new JCheckBox("Preferences.Workflow.Gather", Gatherer.config.get("workflow.gather", false));
184 workflow_gather.setPreferredSize(ROW_SIZE);
185 workflow_enrich = new JCheckBox("Preferences.Workflow.Enrich", Gatherer.config.get("workflow.enrich", false));
186 workflow_enrich.setPreferredSize(ROW_SIZE);
187 workflow_design = new JCheckBox("Preferences.Workflow.Design", Gatherer.config.get("workflow.design", false));
188 workflow_design.setPreferredSize(ROW_SIZE);
189 workflow_export = new JCheckBox("Preferences.Workflow.Export", Gatherer.config.get("workflow.export", false));
190 workflow_export.setPreferredSize(ROW_SIZE);
191 workflow_create = new JCheckBox("Preferences.Workflow.Create", Gatherer.config.get("workflow.create", false));
192 workflow_create.setPreferredSize(ROW_SIZE);
193 workflow_preview = new JCheckBox("Preferences.Workflow.Preview", Gatherer.config.get("workflow.preview", false));
194 workflow_preview.setPreferredSize(ROW_SIZE);
195 JPanel predefined_pane = new JPanel();
196 JLabel predefined_label = new JLabel("Preferences.Workflow.Predefined.Label");
197 predefined_label.setPreferredSize(new Dimension(150,25));
198 JComboBox predefined_combobox = new JComboBox(predefined);
199 // Connection
200 checkbox_group.add(workflow_mirror);
201 checkbox_group.add(workflow_gather);
202 checkbox_group.add(workflow_enrich);
203 checkbox_group.add(workflow_design);
204 checkbox_group.add(workflow_export);
205 checkbox_group.add(workflow_create);
206 checkbox_group.add(workflow_preview);
207 Gatherer.dictionary.register(title_label, null, false);
208 Gatherer.dictionary.register(workflow_browse, null, false);
209 Gatherer.dictionary.register(workflow_mirror, null, false);
210 Gatherer.dictionary.register(workflow_gather, null, false);
211 Gatherer.dictionary.register(workflow_enrich, null, false);
212 Gatherer.dictionary.register(workflow_design, null, false);
213 Gatherer.dictionary.register(workflow_export, null, false);
214 Gatherer.dictionary.register(workflow_create, null, false);
215 Gatherer.dictionary.register(workflow_preview, null, false);
216 Gatherer.dictionary.register(predefined_label, null, false);
217 predefined_combobox.addActionListener(new PredefinedActionListener());
218 // Layout
219 checklist_pane.setLayout(new BoxLayout(checklist_pane, BoxLayout.Y_AXIS));
220 checklist_pane.add(title_label);
221 if(Gatherer.config.get("workflow.browse", true)) {
222 checklist_pane.add(workflow_browse);
223 }
224 if(Gatherer.config.get("workflow.mirror", true)) {
225 checklist_pane.add(workflow_mirror);
226 }
227 if(Gatherer.config.get("workflow.gather", true)) {
228 checklist_pane.add(workflow_gather);
229 }
230 if(Gatherer.config.get("workflow.enrich", true)) {
231 checklist_pane.add(workflow_enrich);
232 }
233 if(Gatherer.config.get("workflow.design", true)) {
234 checklist_pane.add(workflow_design);
235 }
236 if(Gatherer.config.get("workflow.export", true)) {
237 checklist_pane.add(workflow_export);
238 }
239 if(Gatherer.config.get("workflow.create", true)) {
240 checklist_pane.add(workflow_create);
241 }
242 if(Gatherer.config.get("workflow.preview", true)) {
243 checklist_pane.add(workflow_preview);
244 }
245 predefined_pane.setLayout(new BorderLayout());
246 predefined_pane.add(predefined_label, BorderLayout.WEST);
247 predefined_pane.add(predefined_combobox, BorderLayout.CENTER);
248
249 workflow_preferences_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
250 workflow_preferences_pane.setLayout(new BorderLayout());
251 workflow_preferences_pane.add(checklist_pane, BorderLayout.CENTER);
252 workflow_preferences_pane.add(predefined_pane, BorderLayout.SOUTH);
253
254 return workflow_preferences_pane;
255 }
256
257 public void dispose() {
258 // Deregister dictionary components
259 Gatherer.dictionary.deregister(this);
260 Gatherer.dictionary.deregister(tab_pane);
261 Gatherer.dictionary.deregister(ok_button);
262 Gatherer.dictionary.deregister(apply_button);
263 Gatherer.dictionary.deregister(cancel_button);
264 // Dispose
265 super.dispose();
266 }
267
268 private class OKButtonListener
269 implements ActionListener {
270 private boolean close;
271 public OKButtonListener(boolean close) {
272 this.close = close;
273 }
274 public void actionPerformed(ActionEvent event) {
275 // Submit the various changes.
276 // Connection preferences
277 Gatherer.config.set("general.use_proxy", true, use_proxy_checkbox.isSelected());
278 Gatherer.config.setString("general.proxy_host", true, proxy_host_field.getText());
279 Gatherer.config.setString("general.proxy_port", true, proxy_port_field.getText());
280 Gatherer.setProxy();
281 // Warning preferences
282 for(int i = 0; i < warning_preferences_check_list.getEntryCount(); i++) {
283 Entry entry = warning_preferences_check_list.get(i);
284 Gatherer.config.set(entry.getProperty(), true, entry.isSelected());
285 }
286 // Workflow preferences
287 Gatherer.config.set("workflow.browse", false, workflow_browse.isSelected());
288 Gatherer.config.set("workflow.mirror", false, workflow_mirror.isSelected());
289 Gatherer.config.set("workflow.gather", false, workflow_gather.isSelected());
290 Gatherer.config.set("workflow.enrich", false, workflow_enrich.isSelected());
291 Gatherer.config.set("workflow.design", false, workflow_design.isSelected());
292 Gatherer.config.set("workflow.export", false, workflow_export.isSelected());
293 Gatherer.config.set("workflow.create", false, workflow_create.isSelected());
294 Gatherer.config.set("workflow.preview", false, workflow_preview.isSelected());
295 Gatherer.g_man.workflowUpdate("Browser", workflow_browse.isSelected());
296 Gatherer.g_man.workflowUpdate("Mirroring", workflow_mirror.isSelected());
297 Gatherer.g_man.workflowUpdate("Collection", workflow_gather.isSelected());
298 Gatherer.g_man.workflowUpdate("MetaEdit", workflow_enrich.isSelected());
299 Gatherer.g_man.workflowUpdate("Build", workflow_design.isSelected());
300 Gatherer.g_man.workflowUpdate("Export", workflow_export.isSelected());
301 Gatherer.g_man.workflowUpdate("Create", workflow_create.isSelected());
302 Gatherer.g_man.workflowUpdate("Preview", workflow_preview.isSelected());
303 // Hide dialog
304 if(close) {
305 self.dispose();
306 }
307 }
308 }
309
310 private class CancelButtonListener
311 implements ActionListener {
312 public void actionPerformed(ActionEvent event) {
313 self.dispose();
314 }
315 }
316
317 private class PredefinedActionListener
318 implements ActionListener {
319 public void actionPerformed(ActionEvent event) {
320 JComboBox cb = (JComboBox) event.getSource();
321 WorkflowElementWrapper element = (WorkflowElementWrapper) cb.getSelectedItem();
322 CheckboxUpdater task = new CheckboxUpdater(element);
323 SwingUtilities.invokeLater(task);
324 }
325
326 private class CheckboxUpdater
327 implements Runnable {
328 private WorkflowElementWrapper element;
329 public CheckboxUpdater(WorkflowElementWrapper element) {
330 this.element = element;
331 }
332 public void run() {
333 workflow_browse.setSelected(element.getEnabled("browse"));
334 workflow_create.setSelected(element.getEnabled("create"));
335 workflow_mirror.setSelected(element.getEnabled("mirror"));
336 workflow_gather.setSelected(element.getEnabled("gather"));
337 workflow_enrich.setSelected(element.getEnabled("enrich"));
338 workflow_design.setSelected(element.getEnabled("design"));
339 workflow_export.setSelected(element.getEnabled("export"));
340 workflow_preview.setSelected(element.getEnabled("preview"));
341 }
342 }
343 }
344
345 private class UseProxyListener
346 implements ActionListener {
347 public void actionPerformed(ActionEvent event) {
348 boolean enabled = use_proxy_checkbox.isSelected();
349 Gatherer.config.set("general.use_proxy", true, enabled);
350 // Fortunately this is already driven by the event thread.
351 proxy_host_field.setEnabled(enabled);
352 proxy_port_field.setEnabled(enabled);
353 }
354 }
355
356 private class WorkflowElementWrapper {
357 private Element element;
358 private String text;
359 public WorkflowElementWrapper(Element element) {
360 this.element = element;
361 }
362 public boolean getEnabled(String name) {
363 boolean result = true;
364 if(element.getAttribute(name).equalsIgnoreCase("false")) {
365 result = false;
366 }
367 return result;
368 }
369 public String toString() {
370 if(text == null) {
371 text = element.getFirstChild().getNodeValue();
372 }
373 return text;
374 }
375 }
376}
Note: See TracBrowser for help on using the repository browser.