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

Last change on this file since 18886 was 18886, checked in by anna, 15 years ago

Changes for ticket #369. Display translations of search metadata fields if they meets certain criteria and translation of search levels.

  • Property svn:keywords set to Author Date Id Revision
File size: 20.4 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 if (level.equals("document") || level.equals("section")) {
98 meta.setValue("_text" + level + "_");
99 } else {
100 meta.setValue(level);
101 }
102 CollectionDesignManager.collectionmeta_manager.addMetadatum(meta);
103 }
104 }
105
106 private IndexOption getLevel(String level) {
107 return level_model.getOption(level);
108 }
109
110 private void removeLevel(String level_name) {
111 // Remove any current metadata from this level
112 CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + level_name);
113 // Remove the level
114 level_model.removeOption(level_name);
115 }
116
117 /** Method to set the default level
118 * @param level the new default level
119 */
120 private void setDefaultLevel(String level) {
121 if(level != null) {
122 default_level.setValue(level);
123 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
124 default_level.setAssigned(true);
125 }
126 } else {
127 default_level.setAssigned(false);
128 }
129 }
130
131 private class IndexOptionControl
132 extends JPanel
133 implements Control {
134
135 public StemmingControl stem_control = null;
136 public LevelControl level_control = null;
137
138 public IndexOptionControl() {
139
140 this.setComponentOrientation(Dictionary.getOrientation());
141 stem_control = new StemmingControl();
142 level_control = new LevelControl();
143
144 setLayout(new BorderLayout());
145 //if (!build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
146 add(stem_control, BorderLayout.NORTH);
147 //}
148 if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
149 add(level_control, BorderLayout.CENTER);
150 }
151 }
152
153 public void destroy() {}
154 public void gainFocus() {}
155 public void loseFocus() {}
156
157 public void buildTypeChanged(String new_build_type)
158 {
159 if (build_type.equals(new_build_type)) {
160 // shouldn't happen
161 return;
162 }
163 // tell our sub parts about the change in build type
164 stem_control.buildTypeChanged(new_build_type);
165 level_control.buildTypeChanged(new_build_type);
166
167 // then display/hide as appropriate
168 //if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
169 // Changing to MG/MGPP
170 // add(stem_control, BorderLayout.NORTH);
171 //}
172 //else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
173 // Changing to Lucene
174 //remove(stem_control);
175 //}
176 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
177 // changing from MG
178 add(level_control, BorderLayout.CENTER);
179 }
180 else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
181 // changing to MG
182 remove(level_control);
183 }
184
185 }
186
187 }
188
189 private class StemmingControl
190 extends JPanel
191 implements BuildTypeManager.BuildTypeListener
192 {
193 private JCheckBox stem_checkbox = new JCheckBox();
194 private JCheckBox casefold_checkbox = new JCheckBox();
195 private JCheckBox accentfold_checkbox = new JCheckBox();
196 private JCheckBox separate_cjk_checkbox =new JCheckBox();
197
198 public StemmingControl()
199 {
200 this.setComponentOrientation(Dictionary.getOrientation());
201 setLayout(new BorderLayout(10,10));
202 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
203
204 stem_checkbox.setText(Dictionary.get("CDM.IndexingManager.Stem"));
205 stem_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Stem_Tooltip"));
206 stem_checkbox.setActionCommand(StaticStrings.STEM_OPTION_STR);
207 stem_checkbox.setComponentOrientation(Dictionary.getOrientation());
208
209 casefold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Casefold"));
210 casefold_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Casefold_Tooltip"));
211 casefold_checkbox.setActionCommand(StaticStrings.CASEFOLD_OPTION_STR);
212 casefold_checkbox.setComponentOrientation(Dictionary.getOrientation());
213
214 accentfold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Accent_fold"));
215 accentfold_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Accent_fold_Tooltip"));
216 accentfold_checkbox.setActionCommand(StaticStrings.ACCENTFOLD_OPTION_STR);
217 // Accent-folding is currently not available for MG
218 // accentfold_checkbox.setEnabled(!build_type.equals(BuildTypeManager.BUILD_TYPE_MG));
219 accentfold_checkbox.setComponentOrientation(Dictionary.getOrientation());
220
221 separate_cjk_checkbox.setText(Dictionary.get("CDM.IndexingManager.Separate_cjk"));
222 separate_cjk_checkbox.setToolTipText(Dictionary.get("CDM.IndexingManager.Separate_cjk_Tooltip"));
223 separate_cjk_checkbox.setActionCommand(StaticStrings.SEPARATE_CJK_OPTION_STR);
224 separate_cjk_checkbox.setComponentOrientation(Dictionary.getOrientation());
225
226 JPanel checkbox_panel = new JPanel();
227 checkbox_panel.setLayout(new GridLayout(2, 1));
228 checkbox_panel.setComponentOrientation(Dictionary.getOrientation());
229
230 JPanel stem_panel = new JPanel();
231 stem_panel.setLayout(new GridLayout(1,3));
232 stem_panel.add(stem_checkbox);
233 stem_panel.add(casefold_checkbox);
234 stem_panel.add(accentfold_checkbox);
235 stem_panel.setComponentOrientation(Dictionary.getOrientation());
236
237 JPanel other_panel = new JPanel();
238 other_panel.setLayout(new GridLayout(1,1));
239 other_panel.add(separate_cjk_checkbox);
240 other_panel.setComponentOrientation(Dictionary.getOrientation());
241
242 checkbox_panel.add(stem_panel);
243 checkbox_panel.add(other_panel);
244
245 JLabel tmp = new JLabel(Dictionary.get("CDM.IndexingManager.Options"));
246 tmp.setComponentOrientation(Dictionary.getOrientation());
247 add(tmp, BorderLayout.LINE_START);
248 add(checkbox_panel, BorderLayout.CENTER);
249
250 // set the defaults
251 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
252 stem_checkbox.setSelected(false);
253 stem_checkbox.setEnabled(false);
254 casefold_checkbox.setSelected(true);
255 casefold_checkbox.setEnabled(false);
256 accentfold_checkbox.setSelected(true);
257 accentfold_checkbox.setEnabled(false);
258 if (options_model.getOption(StaticStrings.SEPARATE_CJK_OPTION_STR) != null) {
259 separate_cjk_checkbox.setSelected(true);
260 }
261 } else {
262 if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
263 accentfold_checkbox.setEnabled(false);
264 }
265
266 // set up the checked/unchecked boxes
267 if (options_model.getSize()==0) {
268 // select all
269 stem_checkbox.setSelected(true);
270 options_model.addOption(StaticStrings.STEM_OPTION_STR);
271 casefold_checkbox.setSelected(true);
272 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
273 if (accentfold_checkbox.isEnabled()) {
274 accentfold_checkbox.setSelected(true);
275 options_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
276 }
277 separate_cjk_checkbox.setSelected(false);
278 }
279 else {
280 // we'll assume that the config file has got it correct
281 if (options_model.getOption(StaticStrings.STEM_OPTION_STR)!=null) {
282 stem_checkbox.setSelected(true);
283 }
284 if (options_model.getOption(StaticStrings.CASEFOLD_OPTION_STR)!=null) {
285 casefold_checkbox.setSelected(true);
286 }
287 if (options_model.getOption(StaticStrings.ACCENTFOLD_OPTION_STR)!=null) {
288 accentfold_checkbox.setSelected(true);
289 }
290 if (options_model.getOption(StaticStrings.SEPARATE_CJK_OPTION_STR) != null) {
291 separate_cjk_checkbox.setSelected(true);
292 }
293
294 }
295 }
296
297 CheckBoxListener cbl = new CheckBoxListener();
298 stem_checkbox.addActionListener(cbl);
299 casefold_checkbox.addActionListener(cbl);
300 accentfold_checkbox.addActionListener(cbl);
301 separate_cjk_checkbox.addActionListener(cbl);
302
303 // changing stem indexes changes build settings
304 stem_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
305 casefold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
306 accentfold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
307 separate_cjk_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
308
309 }
310
311 public void buildTypeChanged(String new_build_type) {
312 // accentfold only enabled for mgpp
313 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MGPP)) {
314 accentfold_checkbox.setEnabled(true);
315 accentfold_checkbox.setSelected(true);
316 options_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR);
317 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
318 // was lucene
319 stem_checkbox.setEnabled(true);
320 stem_checkbox.setSelected(true);
321 options_model.addOption(StaticStrings.STEM_OPTION_STR);
322 casefold_checkbox.setEnabled(true);
323 casefold_checkbox.setSelected(true);
324 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
325 } // else, was mg, stem and case remain the same
326
327 }
328 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) {
329 accentfold_checkbox.setSelected(false);
330 accentfold_checkbox.setEnabled(false);
331 options_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR);
332
333 if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
334 // was lucene
335 stem_checkbox.setEnabled(true);
336 stem_checkbox.setSelected(true);
337 options_model.addOption(StaticStrings.STEM_OPTION_STR);
338 casefold_checkbox.setEnabled(true);
339 casefold_checkbox.setSelected(true);
340 options_model.addOption(StaticStrings.CASEFOLD_OPTION_STR);
341 } // else, was mgpp, stem and case remain the same
342
343 }
344 if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) {
345 accentfold_checkbox.setSelected(true);
346 accentfold_checkbox.setEnabled(false);
347 options_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR);
348 stem_checkbox.setSelected(false);
349 stem_checkbox.setEnabled(false);
350 options_model.removeOption(StaticStrings.STEM_OPTION_STR);
351 casefold_checkbox.setSelected(true);
352 casefold_checkbox.setEnabled(false);
353 options_model.removeOption(StaticStrings.CASEFOLD_OPTION_STR);
354
355 }
356 }
357
358 private class CheckBoxListener
359 implements ActionListener {
360 public void actionPerformed(ActionEvent event) {
361 if (!((JCheckBox)event.getSource()).isSelected()) {
362 // deselecting
363 options_model.removeOption(event.getActionCommand());
364 }
365 else {
366 // selecting a new one
367 options_model.addOption(event.getActionCommand());
368 }
369 }
370 }
371 }
372
373
374
375 /** This class creates a set of controls for editing the levels. */
376 private class LevelControl
377 extends JPanel
378 implements BuildTypeManager.BuildTypeListener
379 {
380
381 JCheckBox document_checkbox = null;
382 JCheckBox section_checkbox = null;
383 JRadioButton document_default_radio = null;
384 JRadioButton section_default_radio = null;
385
386 public LevelControl() {
387 this.setComponentOrientation(Dictionary.getOrientation());
388 JPanel checkbox_panel = new JPanel();
389 checkbox_panel.setComponentOrientation(Dictionary.getOrientation());
390 JPanel default_panel = new JPanel();
391 default_panel.setComponentOrientation(Dictionary.getOrientation());
392 document_checkbox = new JCheckBox();
393 document_checkbox.setComponentOrientation(Dictionary.getOrientation());
394 document_checkbox.setText(Dictionary.get("CDM.LevelManager.Document"));
395 document_checkbox.setActionCommand(StaticStrings.DOCUMENT_STR);
396 document_default_radio = new JRadioButton();
397 document_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
398 document_default_radio.setOpaque(false);
399 document_default_radio.setActionCommand(StaticStrings.DOCUMENT_STR);
400 document_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
401 document_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
402 document_default_radio.setComponentOrientation(Dictionary.getOrientation());
403
404 section_checkbox = new JCheckBox();
405 section_checkbox.setText(Dictionary.get("CDM.LevelManager.Section"));
406 section_checkbox.setActionCommand(StaticStrings.SECTION_STR);
407 section_checkbox.setComponentOrientation(Dictionary.getOrientation());
408
409 section_default_radio = new JRadioButton();
410 section_default_radio.setOpaque(true);
411 section_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
412 section_default_radio.setOpaque(false);
413 section_default_radio.setIcon(JarTools.getImage("radio_unselected.gif"));
414 section_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif"));
415 section_default_radio.setComponentOrientation(Dictionary.getOrientation());
416
417 section_default_radio.setActionCommand(StaticStrings.SECTION_STR);
418 ButtonGroup default_group = new ButtonGroup();
419 default_group.add(document_default_radio);
420 default_group.add(section_default_radio);
421
422
423
424 if (level_model.getSize()==0) {
425 // no levels yet, set document
426 document_checkbox.setSelected(true);
427 addLevel(StaticStrings.DOCUMENT_STR);
428 } else {
429 if (getLevel(StaticStrings.DOCUMENT_STR)!= null) {
430 document_checkbox.setSelected(true);
431 }
432 if (getLevel(StaticStrings.SECTION_STR) != null) {
433 section_checkbox.setSelected(true);
434 }
435 }
436
437 if (default_level.isAssigned()) {
438 // set the default based on specified default
439 if (default_level.getValue().equals(StaticStrings.DOCUMENT_STR) && document_checkbox.isSelected()) {
440 document_default_radio.setSelected(true);
441 }
442 else if (default_level.getValue().equals(StaticStrings.SECTION_STR) && section_checkbox.isSelected()) {
443 section_default_radio.setSelected(true);
444 } else {
445 default_level.setAssigned(false);
446 }
447 }
448 // if have no valid specified default
449 if (!default_level.isAssigned()) {
450 String default_l = StaticStrings.DOCUMENT_STR;
451 if (document_checkbox.isSelected()) {
452 document_default_radio.setSelected(true);
453 default_l = StaticStrings.DOCUMENT_STR;
454 } else if (section_checkbox.isSelected()) {
455 section_default_radio.setSelected(true);
456 default_l = StaticStrings.SECTION_STR;
457 }
458 setDefaultLevel(default_l);
459 }
460
461 validateControls();
462 JLabel checkbox_label = new JLabel(Dictionary.get("CDM.LevelManager.Level_Title"));
463 checkbox_panel.setLayout(new GridLayout(3,1));
464 checkbox_panel.setToolTipText(Dictionary.get("CDM.IndexManager.Level_Tooltip"));
465 checkbox_panel.add(checkbox_label);
466 checkbox_panel.add(document_checkbox);
467 checkbox_panel.add(section_checkbox);
468 checkbox_label.setComponentOrientation(Dictionary.getOrientation());
469
470 JLabel default_label = new JLabel(Dictionary.get("CDM.LevelManager.Default"));
471 default_panel.setLayout(new GridLayout(3,1));
472 default_panel.setToolTipText(Dictionary.get("CDM.LevelManager.Default_Tooltip"));
473 default_panel.add(default_label);
474 default_panel.add(document_default_radio);
475 default_panel.add(section_default_radio);
476 default_label.setComponentOrientation(Dictionary.getOrientation());
477
478 CheckBoxListener cbl = new CheckBoxListener();
479 document_checkbox.addActionListener(cbl);
480 section_checkbox.addActionListener(cbl);
481
482 // changing selected levels changes build settings
483 document_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
484 section_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener);
485
486 RadioListener rl = new RadioListener();
487 document_default_radio.addActionListener(rl);
488 section_default_radio.addActionListener(rl);
489 // changing the default doesn't need a rebuild
490
491 setLayout(new BorderLayout(10,10));
492 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
493 add(checkbox_panel, BorderLayout.LINE_START);
494 add(default_panel, BorderLayout.CENTER);
495 } // LevelControl
496
497 public void buildTypeChanged(String new_build_type) {};
498 public void gainFocus() {
499
500 }
501
502 public void loseFocus() {
503
504 }
505
506 public void destroy() {
507 }
508
509 private class RadioListener
510 implements ActionListener {
511 public void actionPerformed(ActionEvent event) {
512 String new_level = event.getActionCommand();
513 setDefaultLevel(new_level);
514 }
515 }
516 private class CheckBoxListener
517 implements ActionListener {
518
519 public void actionPerformed(ActionEvent event) {
520 if (!((JCheckBox)event.getSource()).isSelected()) {
521 // deselecting
522 if (noLevelsSelected()) {
523 // can't do this
524 ((JCheckBox)event.getSource()).setSelected(true);
525 } else {
526 // remove the level
527 removeLevel(event.getActionCommand());
528 }
529 } else {
530 // selecting a new one
531 addLevel(event.getActionCommand());
532 }
533 validateControls();
534 }
535 }
536
537 private boolean noLevelsSelected() {
538 if (!document_checkbox.isSelected() && !section_checkbox.isSelected()) {
539 return true;
540
541 }
542 return false;
543 }
544
545 private void validateControls() {
546
547 boolean document_enabled = document_checkbox.isSelected();
548 document_default_radio.setEnabled(document_enabled);
549
550 boolean section_enabled = section_checkbox.isSelected();
551 section_default_radio.setEnabled(section_enabled);
552
553 // have we disabled our default??
554 if (!document_enabled && document_default_radio.isSelected()) {
555 section_default_radio.setSelected(true);
556 setDefaultLevel(StaticStrings.SECTION_STR);
557
558 } else if (!section_enabled && section_default_radio.isSelected()) {
559 document_default_radio.setSelected(true);
560 setDefaultLevel(StaticStrings.DOCUMENT_STR);
561 }
562
563
564 }
565
566 }
567
568}
Note: See TracBrowser for help on using the repository browser.