package org.greenstone.gatherer.cdm; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import org.greenstone.gatherer.Configuration; import org.greenstone.gatherer.DebugStream; import org.greenstone.gatherer.Dictionary; import org.greenstone.gatherer.Gatherer; import org.greenstone.gatherer.util.JarTools; import org.greenstone.gatherer.util.StaticStrings; import org.w3c.dom.*; public class IndexOptionManager implements BuildTypeManager.BuildTypeListener { // we have an IndexOptionList (DOMProxyListModel) for each option type private IndexOptionList level_model = null; private IndexOptionList stem_model = null; /** the default level option - for mgpp and lucene */ private IndexOption default_level = null; private String build_type = null; private Control controls = null; public IndexOptionManager(String current_build_type) { level_model = new IndexOptionList(CollectionDesignManager.collect_config.getLevels()); stem_model = new IndexOptionList(CollectionDesignManager.collect_config.getStemOptions()); DebugStream.println("IndexOptionManager: " + level_model.getSize() + " levels parsed."); DebugStream.println("IndexOptionManager: " + stem_model.getSize() + " stem options parsed."); build_type = current_build_type; if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { level_model.setAssigned(false); } else if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) { stem_model.setAssigned(false); } // Parse and retrieve the default level Element default_level_element = CollectionDesignManager.collect_config.getLevelDefault(); default_level = new IndexOption(default_level_element); if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { default_level.setAssigned(false); } } public void buildTypeChanged(String new_build_type) { boolean levels_enabled = true; boolean stem_enabled = true; if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { levels_enabled = false; } else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) { stem_enabled = false; } level_model.setAssigned(levels_enabled); default_level.setAssigned(levels_enabled); stem_model.setAssigned(stem_enabled); ((IndexOptionControl)controls).buildTypeChanged(new_build_type); build_type = new_build_type; } /** Method to acquire the controls for editing the indexes. * @return the Control */ public Control getControls() { if(controls == null) { // Build controls controls = new IndexOptionControl(); } return controls; } public int getNumLevels() { return level_model.getSize(); } public ArrayList getLevels() { return level_model.children(); } private void addLevel(String level) { if (level_model.getOption(level) == null) { int position = 0; if (level.equals(StaticStrings.SECTION_STR) && level_model.getSize()==1) { position = 1; } level_model.add(position, new IndexOption(level)); // add in a default collection meta CollectionMeta meta = new CollectionMeta(StaticStrings.STOP_CHARACTER + level); meta.setAssigned(true); meta.setValue(level); CollectionDesignManager.collectionmeta_manager.addMetadatum(meta); } } private IndexOption getLevel(String level) { return level_model.getOption(level); } private void removeLevel(String level_name) { // Remove any current metadata from this level CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + level_name); // Remove the level level_model.removeOption(level_name); } /** Method to set the default level * @param level the new default level */ private void setDefaultLevel(String level) { if(level != null) { default_level.setValue(level); if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { default_level.setAssigned(true); } } else { default_level.setAssigned(false); } } private class IndexOptionControl extends JPanel implements Control { public StemmingControl stem_control = null; public LevelControl level_control = null; public IndexOptionControl() { stem_control = new StemmingControl(); level_control = new LevelControl(); setLayout(new BorderLayout()); if (!build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) { add(stem_control, BorderLayout.NORTH); } if (!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { add(level_control, BorderLayout.CENTER); } } public void destroy() {} public void gainFocus() {} public void loseFocus() {} public void buildTypeChanged(String new_build_type) { if (build_type.equals(new_build_type)) { // shouldn't happen return; } // tell our sub parts about the change in build type stem_control.buildTypeChanged(new_build_type); level_control.buildTypeChanged(new_build_type); // then display/hide as appropriate if (build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) { // Changing to MG/MGPP add(stem_control, BorderLayout.NORTH); } else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_LUCENE)) { // Changing to Lucene remove(stem_control); } if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { // changing from MG add(level_control, BorderLayout.CENTER); } else if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { // changing to MG remove(level_control); } } } private class StemmingControl extends JPanel implements BuildTypeManager.BuildTypeListener { private JCheckBox stem_checkbox = new JCheckBox(); private JCheckBox casefold_checkbox = new JCheckBox(); private JCheckBox accentfold_checkbox = new JCheckBox(); public StemmingControl() { setLayout(new BorderLayout(10,10)); setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); stem_checkbox.setText(Dictionary.get("CDM.IndexingManager.Stem")); stem_checkbox.setActionCommand(StaticStrings.STEM_OPTION_STR); casefold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Casefold")); casefold_checkbox.setActionCommand(StaticStrings.CASEFOLD_OPTION_STR); accentfold_checkbox.setText(Dictionary.get("CDM.IndexingManager.Accent_fold")); accentfold_checkbox.setActionCommand(StaticStrings.ACCENTFOLD_OPTION_STR); // Accent-folding is currently not available for MG accentfold_checkbox.setEnabled(!build_type.equals(BuildTypeManager.BUILD_TYPE_MG)); JPanel checkbox_panel = new JPanel(); checkbox_panel.setLayout(new GridLayout(1, 3)); checkbox_panel.add(stem_checkbox); checkbox_panel.add(casefold_checkbox); checkbox_panel.add(accentfold_checkbox); add(new JLabel(Dictionary.get("CDM.IndexingManager.Options")), BorderLayout.WEST); add(checkbox_panel, BorderLayout.CENTER); // set up the checked/unchecked boxes if (stem_model.getSize()==0) { // select all stem_checkbox.setSelected(true); stem_model.addOption(StaticStrings.STEM_OPTION_STR); casefold_checkbox.setSelected(true); stem_model.addOption(StaticStrings.CASEFOLD_OPTION_STR); if (accentfold_checkbox.isEnabled()) { accentfold_checkbox.setSelected(true); stem_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR); } } else { if (stem_model.getOption(StaticStrings.STEM_OPTION_STR)!=null) { stem_checkbox.setSelected(true); } if (stem_model.getOption(StaticStrings.CASEFOLD_OPTION_STR)!=null) { casefold_checkbox.setSelected(true); } if (stem_model.getOption(StaticStrings.ACCENTFOLD_OPTION_STR)!=null) { accentfold_checkbox.setSelected(true); } } CheckBoxListener cbl = new CheckBoxListener(); stem_checkbox.addActionListener(cbl); casefold_checkbox.addActionListener(cbl); accentfold_checkbox.addActionListener(cbl); // changing stem indexes changes build settings stem_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener); casefold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener); accentfold_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener); } public void buildTypeChanged(String new_build_type) { // Accent-folding is currently not available for MG if (new_build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { //changing to MG accentfold_checkbox.setEnabled(false); if (accentfold_checkbox.isSelected()) { stem_model.removeOption(StaticStrings.ACCENTFOLD_OPTION_STR); } } else if (build_type.equals(BuildTypeManager.BUILD_TYPE_MG)) { //Changing from MG accentfold_checkbox.setEnabled(true); if (accentfold_checkbox.isSelected()) { stem_model.addOption(StaticStrings.ACCENTFOLD_OPTION_STR); } } } private class CheckBoxListener implements ActionListener { public void actionPerformed(ActionEvent event) { if (!((JCheckBox)event.getSource()).isSelected()) { // deselecting stem_model.removeOption(event.getActionCommand()); } else { // selecting a new one stem_model.addOption(event.getActionCommand()); } } } } /** This class creates a set of controls for editing the levels. */ private class LevelControl extends JPanel implements BuildTypeManager.BuildTypeListener { JCheckBox document_checkbox = null; JCheckBox section_checkbox = null; JRadioButton document_default_radio = null; JRadioButton section_default_radio = null; public LevelControl() { JPanel checkbox_panel = new JPanel(); JPanel default_panel = new JPanel(); document_checkbox = new JCheckBox(); document_checkbox.setText(Dictionary.get("CDM.LevelManager.Document")); document_default_radio = new JRadioButton(); document_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false)); document_default_radio.setOpaque(false); document_default_radio.setActionCommand(StaticStrings.DOCUMENT_STR); document_default_radio.setIcon(JarTools.getImage("radio_unselected.gif")); document_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif")); section_checkbox = new JCheckBox(); section_checkbox.setText(Dictionary.get("CDM.LevelManager.Section")); section_default_radio = new JRadioButton(); section_default_radio.setOpaque(true); section_default_radio.setBackground(Configuration.getColor("coloring.collection_tree_background", false)); section_default_radio.setOpaque(false); section_default_radio.setIcon(JarTools.getImage("radio_unselected.gif")); section_default_radio.setSelectedIcon(JarTools.getImage("radio_selected.gif")); section_default_radio.setActionCommand(StaticStrings.SECTION_STR); ButtonGroup default_group = new ButtonGroup(); default_group.add(document_default_radio); default_group.add(section_default_radio); if (level_model.getSize()==0) { // no levels yet, set document document_checkbox.setSelected(true); addLevel(StaticStrings.DOCUMENT_STR); } else { if (getLevel(StaticStrings.DOCUMENT_STR)!= null) { document_checkbox.setSelected(true); } if (getLevel(StaticStrings.SECTION_STR) != null) { section_checkbox.setSelected(true); } } if (default_level.isAssigned()) { // set the default based on specified default if (default_level.getValue().equals(StaticStrings.DOCUMENT_STR) && document_checkbox.isSelected()) { document_default_radio.setSelected(true); } else if (default_level.getValue().equals(StaticStrings.SECTION_STR) && section_checkbox.isSelected()) { section_default_radio.setSelected(true); } else { default_level.setAssigned(false); } } // if have no valid specified default if (!default_level.isAssigned()) { String default_l = StaticStrings.DOCUMENT_STR; if (document_checkbox.isSelected()) { document_default_radio.setSelected(true); default_l = StaticStrings.DOCUMENT_STR; } else if (section_checkbox.isSelected()) { section_default_radio.setSelected(true); default_l = StaticStrings.SECTION_STR; } setDefaultLevel(default_l); } validateControls(); JLabel checkbox_label = new JLabel(Dictionary.get("CDM.LevelManager.Level_Title")); checkbox_panel.setLayout(new GridLayout(3,1)); checkbox_panel.setToolTipText(Dictionary.get("CDM.IndexManager.Level_Tooltip")); checkbox_panel.add(checkbox_label); checkbox_panel.add(document_checkbox); checkbox_panel.add(section_checkbox); JLabel default_label = new JLabel(Dictionary.get("CDM.LevelManager.Default")); default_panel.setLayout(new GridLayout(3,1)); default_panel.setToolTipText(Dictionary.get("CDM.LevelManager.Default_Tooltip")); default_panel.add(default_label); default_panel.add(document_default_radio); default_panel.add(section_default_radio); CheckBoxListener cbl = new CheckBoxListener(); document_checkbox.addActionListener(cbl); section_checkbox.addActionListener(cbl); // changing selected levels changes build settings document_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener); section_checkbox.addActionListener(CollectionDesignManager.buildcol_change_listener); RadioListener rl = new RadioListener(); document_default_radio.addActionListener(rl); section_default_radio.addActionListener(rl); // changing the default doesn't need a rebuild setLayout(new BorderLayout(10,10)); setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); add(checkbox_panel, BorderLayout.WEST); add(default_panel, BorderLayout.CENTER); } // LevelControl public void buildTypeChanged(String new_build_type) {}; public void gainFocus() { } public void loseFocus() { } public void destroy() { } private class RadioListener implements ActionListener { public void actionPerformed(ActionEvent event) { String new_level = event.getActionCommand(); setDefaultLevel(new_level); } } private class CheckBoxListener implements ActionListener { public void actionPerformed(ActionEvent event) { if (!((JCheckBox)event.getSource()).isSelected()) { // deselecting if (noLevelsSelected()) { // can't do this ((JCheckBox)event.getSource()).setSelected(true); } else { // remove the level removeLevel(event.getActionCommand()); } } else { // selecting a new one addLevel(event.getActionCommand()); } validateControls(); } } private boolean noLevelsSelected() { if (!document_checkbox.isSelected() && !section_checkbox.isSelected()) { return true; } return false; } private void validateControls() { boolean document_enabled = document_checkbox.isSelected(); document_default_radio.setEnabled(document_enabled); boolean section_enabled = section_checkbox.isSelected(); section_default_radio.setEnabled(section_enabled); // have we disabled our default?? if (!document_enabled && document_default_radio.isSelected()) { section_default_radio.setSelected(true); setDefaultLevel(StaticStrings.SECTION_STR); } else if (!section_enabled && section_default_radio.isSelected()) { document_default_radio.setSelected(true); setDefaultLevel(StaticStrings.DOCUMENT_STR); } } } }