source: gli/trunk/src/org/greenstone/gatherer/cdm/IndexOptionManager.java@ 18688

Last change on this file since 18688 was 18688, checked in by kjdon, 15 years ago

removed the Ms from the file

  • Property svn:keywords set to Author Date Id Revision
File size: 20.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 options_model = null;
23 /** the default level option - for mgpp and lucene */
24 private IndexOption default_level = null;
25
26 private String build_type = null;
27 private Control controls = null;
28
29 public IndexOptionManager(String current_build_type) {
30 level_model = new IndexOptionList(CollectionDesignManager.collect_config.getLevels());
31 options_model = new IndexOptionList(CollectionDesignManager.collect_config.getIndexOptions());
32
33 DebugStream.println("IndexOptionManager: " + level_model.getSize() + " levels parsed.");
34 DebugStream.println("IndexOptionManager: " + options_model.getSize() + " index options parsed.");
35
36 build_type = current_build_type;
37 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
38 level_model.setAssigned(false);
39 }
40 // else if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
41 // options_model.setAssigned(false);
42 //}
43 // Parse and retrieve the default level
44 Element default_level_element = CollectionDesignManager.collect_config.getLevelDefault();
45 default_level = new IndexOption(default_level_element);
46 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
47 default_level.setAssigned(false);
48 }
49
50 }
51
52
53 public void buildTypeChanged(String new_build_type) {
54 boolean levels_enabled = true;
55 //boolean stem_enabled = true;
56 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
57 levels_enabled = false;
58 }// else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
59 // stem_enabled = false;
60 //}
61 level_model.setAssigned(levels_enabled);
62 default_level.setAssigned(levels_enabled);
63 //options_model.setAssigned(stem_enabled);
64 ((IndexOptionControl)controls).buildTypeChanged(new_build_type);
65 build_type = new_build_type;
66 }
67
68 /** Method to acquire the controls for editing the indexes.
69 * @return the Control
70 */
71 public Control getControls() {
72 if(controls == null) {
73 // Build controls
74 controls = new IndexOptionControl();
75 }
76 return controls;
77 }
78
79 public int getNumLevels() {
80 return level_model.getSize();
81 }
82 public ArrayList getLevels() {
83 return level_model.children();
84 }
85
86 private void addLevel(String level) {
87 if (level_model.getOption(level) == null) {
88 int position = 0;
89
90 if (level.equals(StaticStrings.SECTION_STR) && level_model.getSize()==1) {
91 position = 1;
92 }
93 level_model.add(position, new IndexOption(level));
94 // add in a default collection meta
95 CollectionMeta meta = new CollectionMeta(StaticStrings.STOP_CHARACTER + level);
96 meta.setAssigned(true);
97 meta.setValue(level);
98 CollectionDesignManager.collectionmeta_manager.addMetadatum(meta);
99 }
100 }
101
102 private IndexOption getLevel(String level) {
103 return level_model.getOption(level);
104 }
105
106 private void removeLevel(String level_name) {
107 // Remove any current metadata from this level
108 CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + level_name);
109 // Remove the level
110 level_model.removeOption(level_name);
111 }
112
113 /** Method to set the default level
114 * @param level the new default level
115 */
116 private void setDefaultLevel(String level) {
117 if(level != null) {
118 default_level.setValue(level);
119 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
120 default_level.setAssigned(true);
121 }
122 } else {
123 default_level.setAssigned(false);
124 }
125 }
126
127 private class IndexOptionControl
128 extends JPanel
129 implements Control {
130
131 public StemmingControl stem_control = null;
132 public LevelControl level_control = null;
133
134 public IndexOptionControl() {
135
136 this.setComponentOrientation(Dictionary.getOrientation());
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 private JCheckBox separate_cjk_checkbox =new JCheckBox();
193
194 public StemmingControl()
195 {
196 this.setComponentOrientation(Dictionary.getOrientation());
197 setLayout(new BorderLayout(10,10));
198 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
199
200 stem_checkbox.setText(Dictionary.get("CDM.IndexingManager.Stem"));
201 stem_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Stem_Tooltip"));
202 stem_checkbox.setActionCommand(StaticStrings.STEM_OPTION_STR);
203 stem_checkbox.setComponentOrientation(Dictionary.getOrientation());
204
205 casefold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Casefold"));
206 casefold_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Casefold_Tooltip"));
207 casefold_checkbox.setActionCommand(StaticStrings.CASEFOLD_OPTION_STR);
208 casefold_checkbox.setComponentOrientation(Dictionary.getOrientation());
209
210 accentfold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Accent_fold"));
211 accentfold_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Accent_fold_Tooltip"));
212 accentfold_checkbox.setActionCommand(StaticStrings.ACCENTFOLD_OPTION_STR);
213 // Accent-folding is currently not available for MG
214 // accentfold_checkbox.setEnabled(!build_type.equals(BuildTypeManager.BUILD_TYPE_MG));
215 accentfold_checkbox.setComponentOrientation(Dictionary.getOrientation());
216
217 separate_cjk_checkbox.setText(Dictionary.get("CDM.IndexingManager.Separate_cjk"));
218 separate_cjk_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Separate_cjk_Tooltip"));
219 separate_cjk_checkbox.setActionCommand(StaticStrings.SEPARATE_CJK_OPTION_STR);
220 separate_cjk_checkbox.setComponentOrientation(Dictionary.getOrientation());
221
222 JPanel checkbox_panel = new JPanel();
223 checkbox_panel.setLayout(new GridLayout(2, 1));
224 checkbox_panel.setComponentOrientation(Dictionary.getOrientation());
225
226 JPanel stem_panel = new JPanel();
227 stem_panel.setLayout(new GridLayout(1,3));
228 stem_panel.add(stem_checkbox);
229 stem_panel.add(casefold_checkbox);
230 stem_panel.add(accentfold_checkbox);
231 stem_panel.setComponentOrientation(Dictionary.getOrientation());
232
233 JPanel other_panel = new JPanel();
234 other_panel.setLayout(new GridLayout(1,1));
235 other_panel.add(separate_cjk_checkbox);
236 other_panel.setComponentOrientation(Dictionary.getOrientation());
237
238 checkbox_panel.add(stem_panel);
239 checkbox_panel.add(other_panel);
240
241 JLabel tmp = new JLabel(Dictionary.get("CDM.IndexingManager.Options"));
242 tmp.setComponentOrientation(Dictionary.getOrientation());
243 add(tmp, BorderLayout.LINE_START);
244 add(checkbox_panel, BorderLayout.CENTER);
245
246 // set the defaults
247 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
248 stem_checkbox.setSelected(false);
249 stem_checkbox.setEnabled(false);
250 casefold_checkbox.setSelected(true);
251 casefold_checkbox.setEnabled(false);
252 accentfold_checkbox.setSelected(true);
253 accentfold_checkbox.setEnabled(false);
254 if (options_model.getOption(StaticStrings.SEPARATE_CJK_OPTION_STR) != null) {
255 separate_cjk_checkbox.setSelected(true);
256 }
257 } else {
258 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
259 accentfold_checkbox.setEnabled(false);
260 }
261
262 // set up the checked/unchecked boxes
263 if (options_model.getSize()==0) {
264 // select all
265 stem_checkbox.setSelected(true);
266 options_model.addOption(StaticStrings.STEM_OPTION_STR);
267 casefold_checkbox.setSelected(true);
268 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
269 if (accentfold_checkbox.isEnabled()) {
270 accentfold_checkbox.setSelected(true);
271 options_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
272 }
273 separate_cjk_checkbox.setSelected(false);
274 }
275 else {
276 // we'll assume that the config file has got it correct
277 if (options_model.getOption(StaticStrings.STEM_OPTION_STR)!=null) {
278 stem_checkbox.setSelected(true);
279 }
280 if (options_model.getOption(StaticStrings.CASEFOLD_OPTION_STR)!=null) {
281 casefold_checkbox.setSelected(true);
282 }
283 if (options_model.getOption(StaticStrings.ACCENTFOLD_OPTION_STR)!=null) {
284 accentfold_checkbox.setSelected(true);
285 }
286 if (options_model.getOption(StaticStrings.SEPARATE_CJK_OPTION_STR) != null) {
287 separate_cjk_checkbox.setSelected(true);
288 }
289
290 }
291 }
292
293 CheckBoxListener cbl = new CheckBoxListener();
294 stem_checkbox.addActionListener(cbl);
295 casefold_checkbox.addActionListener(cbl);
296 accentfold_checkbox.addActionListener(cbl);
297 separate_cjk_checkbox.addActionListener(cbl);
298
299 // changing stem indexes changes build settings
300 stem_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
301 casefold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
302 accentfold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
303 separate_cjk_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
304
305 }
306
307 public void buildTypeChanged(String new_build_type) {
308 // accentfold only enabled for mgpp
309 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MGPP)) {
310 accentfold_checkbox.setEnabled(true);
311 accentfold_checkbox.setSelected(true);
312 options_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
313 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
314 // was lucene
315 stem_checkbox.setEnabled(true);
316 stem_checkbox.setSelected(true);
317 options_model.addOption(StaticStrings.STEM_OPTION_STR);
318 casefold_checkbox.setEnabled(true);
319 casefold_checkbox.setSelected(true);
320 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
321 } // else, was mg, stem and case remain the same
322
323 }
324 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
325 accentfold_checkbox.setSelected(false);
326 accentfold_checkbox.setEnabled(false);
327 options_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR);
328
329 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
330 // was lucene
331 stem_checkbox.setEnabled(true);
332 stem_checkbox.setSelected(true);
333 options_model.addOption(StaticStrings.STEM_OPTION_STR);
334 casefold_checkbox.setEnabled(true);
335 casefold_checkbox.setSelected(true);
336 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
337 } // else, was mgpp, stem and case remain the same
338
339 }
340 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
341 accentfold_checkbox.setSelected(true);
342 accentfold_checkbox.setEnabled(false);
343 options_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR);
344 stem_checkbox.setSelected(false);
345 stem_checkbox.setEnabled(false);
346 options_model.removeOption(StaticStrings.STEM_OPTION_STR);
347 casefold_checkbox.setSelected(true);
348 casefold_checkbox.setEnabled(false);
349 options_model.removeOption(StaticStrings.CASEFOLD_OPTION_STR);
350
351 }
352 }
353
354 private class CheckBoxListener
355 implements ActionListener {
356 public void actionPerformed(ActionEvent event) {
357 if (!((JCheckBox)event.getSource()).isSelected()) {
358 // deselecting
359 options_model.removeOption(event.getActionCommand());
360 }
361 else {
362 // selecting a new one
363 options_model.addOption(event.getActionCommand());
364 }
365 }
366 }
367 }
368
369
370
371 /** This class creates a set of controls for editing the levels. */
372 private class LevelControl
373 extends JPanel
374 implements BuildTypeManager.BuildTypeListener
375 {
376
377 JCheckBox document_checkbox = null;
378 JCheckBox section_checkbox = null;
379 JRadioButton document_default_radio = null;
380 JRadioButton section_default_radio = null;
381
382 public LevelControl() {
383 this.setComponentOrientation(Dictionary.getOrientation());
384 JPanel checkbox_panel = new JPanel();
385 checkbox_panel.setComponentOrientation(Dictionary.getOrientation());
386 JPanel default_panel = new JPanel();
387 default_panel.setComponentOrientation(Dictionary.getOrientation());
388 document_checkbox = new JCheckBox();
389 document_checkbox.setComponentOrientation(Dictionary.getOrientation());
390 document_checkbox.setText(Dictionary.get("CDM.LevelManager.Document"));
391 document_checkbox.setActionCommand(StaticStrings.DOCUMENT_STR);
392 document_default_radio = new JRadioButton();
393 document_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
394 document_default_radio.setOpaque(false);
395 document_default_radio.setActionCommand(StaticStrings.DOCUMENT_STR);
396 document_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
397 document_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
398 document_default_radio.setComponentOrientation(Dictionary.getOrientation());
399
400 section_checkbox = new JCheckBox();
401 section_checkbox.setText(Dictionary.get("CDM.LevelManager.Section"));
402 section_checkbox.setActionCommand(StaticStrings.SECTION_STR);
403 section_checkbox.setComponentOrientation(Dictionary.getOrientation());
404
405 section_default_radio = new JRadioButton();
406 section_default_radio.setOpaque(true);
407 section_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
408 section_default_radio.setOpaque(false);
409 section_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
410 section_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
411 section_default_radio.setComponentOrientation(Dictionary.getOrientation());
412
413 section_default_radio.setActionCommand(StaticStrings.SECTION_STR);
414 ButtonGroup default_group = new ButtonGroup();
415 default_group.add(document_default_radio);
416 default_group.add(section_default_radio);
417
418
419
420 if (level_model.getSize()==0) {
421 // no levels yet, set document
422 document_checkbox.setSelected(true);
423 addLevel(StaticStrings.DOCUMENT_STR);
424 } else {
425 if (getLevel(StaticStrings.DOCUMENT_STR)!= null) {
426 document_checkbox.setSelected(true);
427 }
428 if (getLevel(StaticStrings.SECTION_STR) != null) {
429 section_checkbox.setSelected(true);
430 }
431 }
432
433 if (default_level.isAssigned()) {
434 // set the default based on specified default
435 if (default_level.getValue().equals(StaticStrings.DOCUMENT_STR) && document_checkbox.isSelected()) {
436 document_default_radio.setSelected(true);
437 }
438 else if (default_level.getValue().equals(StaticStrings.SECTION_STR) && section_checkbox.isSelected()) {
439 section_default_radio.setSelected(true);
440 } else {
441 default_level.setAssigned(false);
442 }
443 }
444 // if have no valid specified default
445 if (!default_level.isAssigned()) {
446 String default_l = StaticStrings.DOCUMENT_STR;
447 if (document_checkbox.isSelected()) {
448 document_default_radio.setSelected(true);
449 default_l = StaticStrings.DOCUMENT_STR;
450 } else if (section_checkbox.isSelected()) {
451 section_default_radio.setSelected(true);
452 default_l = StaticStrings.SECTION_STR;
453 }
454 setDefaultLevel(default_l);
455 }
456
457 validateControls();
458 JLabel checkbox_label = new JLabel(Dictionary.get("CDM.LevelManager.Level_Title"));
459 checkbox_panel.setLayout(new GridLayout(3,1));
460 checkbox_panel.setToolTipText(Dictionary.get("CDM.IndexManager.Level_Tooltip"));
461 checkbox_panel.add(checkbox_label);
462 checkbox_panel.add(document_checkbox);
463 checkbox_panel.add(section_checkbox);
464 checkbox_label.setComponentOrientation(Dictionary.getOrientation());
465
466 JLabel default_label = new JLabel(Dictionary.get("CDM.LevelManager.Default"));
467 default_panel.setLayout(new GridLayout(3,1));
468 default_panel.setToolTipText(Dictionary.get("CDM.LevelManager.Default_Tooltip"));
469 default_panel.add(default_label);
470 default_panel.add(document_default_radio);
471 default_panel.add(section_default_radio);
472 default_label.setComponentOrientation(Dictionary.getOrientation());
473
474 CheckBoxListener cbl = new CheckBoxListener();
475 document_checkbox.addActionListener(cbl);
476 section_checkbox.addActionListener(cbl);
477
478 // changing selected levels changes build settings
479 document_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
480 section_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
481
482 RadioListener rl = new RadioListener();
483 document_default_radio.addActionListener(rl);
484 section_default_radio.addActionListener(rl);
485 // changing the default doesn't need a rebuild
486
487 setLayout(new BorderLayout(10,10));
488 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
489 add(checkbox_panel, BorderLayout.LINE_START);
490 add(default_panel, BorderLayout.CENTER);
491 } // LevelControl
492
493 public void buildTypeChanged(String new_build_type) {};
494 public void gainFocus() {
495
496 }
497
498 public void loseFocus() {
499
500 }
501
502 public void destroy() {
503 }
504
505 private class RadioListener
506 implements ActionListener {
507 public void actionPerformed(ActionEvent event) {
508 String new_level = event.getActionCommand();
509 setDefaultLevel(new_level);
510 }
511 }
512 private class CheckBoxListener
513 implements ActionListener {
514
515 public void actionPerformed(ActionEvent event) {
516 if (!((JCheckBox)event.getSource()).isSelected()) {
517 // deselecting
518 if (noLevelsSelected()) {
519 // can't do this
520 ((JCheckBox)event.getSource()).setSelected(true);
521 } else {
522 // remove the level
523 removeLevel(event.getActionCommand());
524 }
525 } else {
526 // selecting a new one
527 addLevel(event.getActionCommand());
528 }
529 validateControls();
530 }
531 }
532
533 private boolean noLevelsSelected() {
534 if (!document_checkbox.isSelected() && !section_checkbox.isSelected()) {
535 return true;
536
537 }
538 return false;
539 }
540
541 private void validateControls() {
542
543 boolean document_enabled = document_checkbox.isSelected();
544 document_default_radio.setEnabled(document_enabled);
545
546 boolean section_enabled = section_checkbox.isSelected();
547 section_default_radio.setEnabled(section_enabled);
548
549 // have we disabled our default??
550 if (!document_enabled && document_default_radio.isSelected()) {
551 section_default_radio.setSelected(true);
552 setDefaultLevel(StaticStrings.SECTION_STR);
553
554 } else if (!section_enabled && section_default_radio.isSelected()) {
555 document_default_radio.setSelected(true);
556 setDefaultLevel(StaticStrings.DOCUMENT_STR);
557 }
558
559
560 }
561
562 }
563
564}
Note: See TracBrowser for help on using the repository browser.