source: gli/branches/3.03/src/org/greenstone/gatherer/cdm/IndexOptionManager.java@ 14746

Last change on this file since 14746 was 13468, checked in by mdewsnip, 17 years ago

A couple of minor changes to use dictionary strings.

  • Property svn:keywords set to Author Date Id Revision
File size: 15.3 KB
Line 
1package org.greenstone.gatherer.cdm;
2
3import java.awt.*;
4import java.awt.event.*;
5import java.util.*;
6import javax.swing.*;
7import javax.swing.event.*;
8import org.greenstone.gatherer.Configuration;
9import org.greenstone.gatherer.DebugStream;
10import org.greenstone.gatherer.Dictionary;
11import org.greenstone.gatherer.Gatherer;
12import org.greenstone.gatherer.util.JarTools;
13import org.greenstone.gatherer.util.StaticStrings;
14import org.w3c.dom.*;
15
16
17public class IndexOptionManager
18 implements BuildTypeManager.BuildTypeListener {
19
20 // we have an IndexOptionList (DOMProxyListModel) for each option type
21 private IndexOptionList level_model = null;
22 private IndexOptionList stem_model = null;
23
24 /** the default level option - for mgpp and lucene */
25 private IndexOption default_level = null;
26
27 private String build_type = null;
28 private Control controls = null;
29
30 public IndexOptionManager(String current_build_type) {
31 level_model = new IndexOptionList(CollectionDesignManager.collect_config.getLevels());
32 stem_model = new IndexOptionList(CollectionDesignManager.collect_config.getStemOptions());
33
34 DebugStream.println("IndexOptionManager: " + level_model.getSize() + " levels parsed.");
35 DebugStream.println("IndexOptionManager: " + stem_model.getSize() + " stem options parsed.");
36
37 build_type = current_build_type;
38 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
39 level_model.setAssigned(false);
40 }
41 else if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
42 stem_model.setAssigned(false);
43 }
44 // Parse and retrieve the default level
45 Element default_level_element = CollectionDesignManager.collect_config.getLevelDefault();
46 default_level = new IndexOption(default_level_element);
47 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
48 default_level.setAssigned(false);
49 }
50
51 }
52
53
54 public void buildTypeChanged(String new_build_type) {
55 boolean levels_enabled = true;
56 boolean stem_enabled = true;
57 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
58 levels_enabled = false;
59 } else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
60 stem_enabled = false;
61 }
62 level_model.setAssigned(levels_enabled);
63 default_level.setAssigned(levels_enabled);
64 stem_model.setAssigned(stem_enabled);
65 ((IndexOptionControl)controls).buildTypeChanged(new_build_type);
66 build_type = new_build_type;
67 }
68
69 /** Method to acquire the controls for editing the indexes.
70 * @return the Control
71 */
72 public Control getControls() {
73 if(controls == null) {
74 // Build controls
75 controls = new IndexOptionControl();
76 }
77 return controls;
78 }
79
80 public int getNumLevels() {
81 return level_model.getSize();
82 }
83 public ArrayList getLevels() {
84 return level_model.children();
85 }
86
87 private void addLevel(String level) {
88 if (level_model.getOption(level) == null) {
89 int position = 0;
90
91 if (level.equals(StaticStrings.SECTION_STR) && level_model.getSize()==1) {
92 position = 1;
93 }
94 level_model.add(position, new IndexOption(level));
95 // add in a default collection meta
96 CollectionMeta meta = new CollectionMeta(StaticStrings.STOP_CHARACTER + level);
97 meta.setAssigned(true);
98 meta.setValue(level);
99 CollectionDesignManager.collectionmeta_manager.addMetadatum(meta);
100 }
101 }
102
103 private IndexOption getLevel(String level) {
104 return level_model.getOption(level);
105 }
106
107 private void removeLevel(String level_name) {
108 // Remove any current metadata from this level
109 CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + level_name);
110 // Remove the level
111 level_model.removeOption(level_name);
112 }
113
114 /** Method to set the default level
115 * @param level the new default level
116 */
117 private void setDefaultLevel(String level) {
118 if(level != null) {
119 default_level.setValue(level);
120 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
121 default_level.setAssigned(true);
122 }
123 } else {
124 default_level.setAssigned(false);
125 }
126 }
127
128 private class IndexOptionControl
129 extends JPanel
130 implements Control {
131
132 public StemmingControl stem_control = null;
133 public LevelControl level_control = null;
134
135 public IndexOptionControl() {
136
137 stem_control = new StemmingControl();
138 level_control = new LevelControl();
139
140 setLayout(new BorderLayout());
141 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
142 add(stem_control, BorderLayout.NORTH);
143 }
144 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
145 add(level_control, BorderLayout.CENTER);
146 }
147 }
148
149 public void destroy() {}
150 public void gainFocus() {}
151 public void loseFocus() {}
152
153 public void buildTypeChanged(String new_build_type)
154 {
155 if (build_type.equals(new_build_type)) {
156 // shouldn't happen
157 return;
158 }
159 // tell our sub parts about the change in build type
160 stem_control.buildTypeChanged(new_build_type);
161 level_control.buildTypeChanged(new_build_type);
162
163 // then display/hide as appropriate
164 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
165 // Changing to MG/MGPP
166 add(stem_control, BorderLayout.NORTH);
167 }
168 else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
169 // Changing to Lucene
170 remove(stem_control);
171 }
172 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
173 // changing from MG
174 add(level_control, BorderLayout.CENTER);
175 }
176 else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
177 // changing to MG
178 remove(level_control);
179 }
180
181 }
182
183 }
184
185 private class StemmingControl
186 extends JPanel
187 implements BuildTypeManager.BuildTypeListener
188 {
189 private JCheckBox stem_checkbox = new JCheckBox();
190 private JCheckBox casefold_checkbox = new JCheckBox();
191 private JCheckBox accentfold_checkbox = new JCheckBox();
192
193 public StemmingControl()
194 {
195 setLayout(new BorderLayout(10,10));
196 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
197
198 stem_checkbox.setText(Dictionary.get("CDM.IndexingManager.Stem"));
199 stem_checkbox.setActionCommand(StaticStrings.STEM_OPTION_STR);
200
201 casefold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Casefold"));
202 casefold_checkbox.setActionCommand(StaticStrings.CASEFOLD_OPTION_STR);
203
204 accentfold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Accent_fold"));
205 accentfold_checkbox.setActionCommand(StaticStrings.ACCENTFOLD_OPTION_STR);
206 // Accent-folding is currently not available for MG
207 accentfold_checkbox.setEnabled(!build_type.equals(BuildTypeManager.BUILD_TYPE_MG));
208
209 JPanel checkbox_panel = new JPanel();
210 checkbox_panel.setLayout(new GridLayout(1, 3));
211 checkbox_panel.add(stem_checkbox);
212 checkbox_panel.add(casefold_checkbox);
213 checkbox_panel.add(accentfold_checkbox);
214
215 add(new JLabel(Dictionary.get("CDM.IndexingManager.Options")), BorderLayout.WEST);
216 add(checkbox_panel, BorderLayout.CENTER);
217
218 // set up the checked/unchecked boxes
219 if (stem_model.getSize()==0) {
220 // select all
221 stem_checkbox.setSelected(true);
222 stem_model.addOption(StaticStrings.STEM_OPTION_STR);
223 casefold_checkbox.setSelected(true);
224 stem_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
225 if (accentfold_checkbox.isEnabled()) {
226 accentfold_checkbox.setSelected(true);
227 stem_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
228 }
229 }
230 else {
231 if (stem_model.getOption(StaticStrings.STEM_OPTION_STR)!=null) {
232 stem_checkbox.setSelected(true);
233 }
234 if (stem_model.getOption(StaticStrings.CASEFOLD_OPTION_STR)!=null) {
235 casefold_checkbox.setSelected(true);
236 }
237 if (stem_model.getOption(StaticStrings.ACCENTFOLD_OPTION_STR)!=null) {
238 accentfold_checkbox.setSelected(true);
239 }
240
241 }
242
243 CheckBoxListener cbl = new CheckBoxListener();
244 stem_checkbox.addActionListener(cbl);
245 casefold_checkbox.addActionListener(cbl);
246 accentfold_checkbox.addActionListener(cbl);
247
248 // changing stem indexes changes build settings
249 stem_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
250 casefold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
251 accentfold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
252
253
254 }
255
256 public void buildTypeChanged(String new_build_type) {
257 // Accent-folding is currently not available for MG
258 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
259 //changing to MG
260 accentfold_checkbox.setEnabled(false);
261 if (accentfold_checkbox.isSelected()) {
262 stem_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR);
263 }
264 }
265 else if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
266 //Changing from MG
267 accentfold_checkbox.setEnabled(true);
268 if (accentfold_checkbox.isSelected()) {
269 stem_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
270 }
271 }
272
273 }
274
275 private class CheckBoxListener
276 implements ActionListener {
277 public void actionPerformed(ActionEvent event) {
278 if (!((JCheckBox)event.getSource()).isSelected()) {
279 // deselecting
280 stem_model.removeOption(event.getActionCommand());
281 }
282 else {
283 // selecting a new one
284 stem_model.addOption(event.getActionCommand());
285 }
286 }
287 }
288 }
289
290
291
292 /** This class creates a set of controls for editing the levels. */
293 private class LevelControl
294 extends JPanel
295 implements BuildTypeManager.BuildTypeListener
296 {
297
298 JCheckBox document_checkbox = null;
299 JCheckBox section_checkbox = null;
300 JRadioButton document_default_radio = null;
301 JRadioButton section_default_radio = null;
302
303 public LevelControl() {
304
305 JPanel checkbox_panel = new JPanel();
306 JPanel default_panel = new JPanel();
307 document_checkbox = new JCheckBox();
308 document_checkbox.setText(Dictionary.get("CDM.LevelManager.Document"));
309 document_default_radio = new JRadioButton();
310 document_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
311 document_default_radio.setOpaque(false);
312 document_default_radio.setActionCommand(StaticStrings.DOCUMENT_STR);
313 document_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
314 document_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
315
316 section_checkbox = new JCheckBox();
317 section_checkbox.setText(Dictionary.get("CDM.LevelManager.Section"));
318 section_default_radio = new JRadioButton();
319 section_default_radio.setOpaque(true);
320 section_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
321 section_default_radio.setOpaque(false);
322 section_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
323 section_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
324
325 section_default_radio.setActionCommand(StaticStrings.SECTION_STR);
326 ButtonGroup default_group = new ButtonGroup();
327 default_group.add(document_default_radio);
328 default_group.add(section_default_radio);
329
330
331
332 if (level_model.getSize()==0) {
333 // no levels yet, set document
334 document_checkbox.setSelected(true);
335 addLevel(StaticStrings.DOCUMENT_STR);
336 } else {
337 if (getLevel(StaticStrings.DOCUMENT_STR)!= null) {
338 document_checkbox.setSelected(true);
339 }
340 if (getLevel(StaticStrings.SECTION_STR) != null) {
341 section_checkbox.setSelected(true);
342 }
343 }
344
345 if (default_level.isAssigned()) {
346 // set the default based on specified default
347 if (default_level.getValue().equals(StaticStrings.DOCUMENT_STR) && document_checkbox.isSelected()) {
348 document_default_radio.setSelected(true);
349 }
350 else if (default_level.getValue().equals(StaticStrings.SECTION_STR) && section_checkbox.isSelected()) {
351 section_default_radio.setSelected(true);
352 } else {
353 default_level.setAssigned(false);
354 }
355 }
356 // if have no valid specified default
357 if (!default_level.isAssigned()) {
358 String default_l = StaticStrings.DOCUMENT_STR;
359 if (document_checkbox.isSelected()) {
360 document_default_radio.setSelected(true);
361 default_l = StaticStrings.DOCUMENT_STR;
362 } else if (section_checkbox.isSelected()) {
363 section_default_radio.setSelected(true);
364 default_l = StaticStrings.SECTION_STR;
365 }
366 setDefaultLevel(default_l);
367 }
368
369 validateControls();
370 JLabel checkbox_label = new JLabel(Dictionary.get("CDM.LevelManager.Level_Title"));
371 checkbox_panel.setLayout(new GridLayout(3,1));
372 checkbox_panel.setToolTipText(Dictionary.get("CDM.IndexManager.Level_Tooltip"));
373 checkbox_panel.add(checkbox_label);
374 checkbox_panel.add(document_checkbox);
375 checkbox_panel.add(section_checkbox);
376
377 JLabel default_label = new JLabel(Dictionary.get("CDM.LevelManager.Default"));
378 default_panel.setLayout(new GridLayout(3,1));
379 default_panel.setToolTipText(Dictionary.get("CDM.LevelManager.Default_Tooltip"));
380 default_panel.add(default_label);
381 default_panel.add(document_default_radio);
382 default_panel.add(section_default_radio);
383
384
385 CheckBoxListener cbl = new CheckBoxListener();
386 document_checkbox.addActionListener(cbl);
387 section_checkbox.addActionListener(cbl);
388
389 // changing selected levels changes build settings
390 document_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
391 section_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
392
393 RadioListener rl = new RadioListener();
394 document_default_radio.addActionListener(rl);
395 section_default_radio.addActionListener(rl);
396 // changing the default doesn't need a rebuild
397
398 setLayout(new BorderLayout(10,10));
399 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
400 add(checkbox_panel, BorderLayout.WEST);
401 add(default_panel, BorderLayout.CENTER);
402 } // LevelControl
403
404 public void buildTypeChanged(String new_build_type) {};
405 public void gainFocus() {
406
407 }
408
409 public void loseFocus() {
410
411 }
412
413 public void destroy() {
414 }
415
416 private class RadioListener
417 implements ActionListener {
418 public void actionPerformed(ActionEvent event) {
419 String new_level = event.getActionCommand();
420 setDefaultLevel(new_level);
421 }
422 }
423 private class CheckBoxListener
424 implements ActionListener {
425
426 public void actionPerformed(ActionEvent event) {
427 if (!((JCheckBox)event.getSource()).isSelected()) {
428 // deselecting
429 if (noLevelsSelected()) {
430 // can't do this
431 ((JCheckBox)event.getSource()).setSelected(true);
432 } else {
433 // remove the level
434 removeLevel(event.getActionCommand());
435 }
436 } else {
437 // selecting a new one
438 addLevel(event.getActionCommand());
439 }
440 validateControls();
441 }
442 }
443
444 private boolean noLevelsSelected() {
445 if (!document_checkbox.isSelected() && !section_checkbox.isSelected()) {
446 return true;
447
448 }
449 return false;
450 }
451
452 private void validateControls() {
453
454 boolean document_enabled = document_checkbox.isSelected();
455 document_default_radio.setEnabled(document_enabled);
456
457 boolean section_enabled = section_checkbox.isSelected();
458 section_default_radio.setEnabled(section_enabled);
459
460 // have we disabled our default??
461 if (!document_enabled && document_default_radio.isSelected()) {
462 section_default_radio.setSelected(true);
463 setDefaultLevel(StaticStrings.SECTION_STR);
464
465 } else if (!section_enabled && section_default_radio.isSelected()) {
466 document_default_radio.setSelected(true);
467 setDefaultLevel(StaticStrings.DOCUMENT_STR);
468 }
469
470
471 }
472
473 }
474
475}
Note: See TracBrowser for help on using the repository browser.