/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package edu.tufts.vue.ui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import tufts.vue.LWSelection; import tufts.vue.VUE; import tufts.vue.VueResources; import tufts.vue.gui.GUI; public class DefaultQueryEditor extends javax.swing.JPanel implements edu.tufts.vue.fsm.QueryEditor, java.awt.event.ActionListener, LWSelection.Listener { //private edu.tufts.vue.fsm.FederatedSearchManager fsm = edu.tufts.vue.fsm.impl.VueFederatedSearchManager.getInstance(); private edu.tufts.vue.fsm.SourcesAndTypesManager sourcesAndTypesManager = edu.tufts.vue.fsm.impl.VueSourcesAndTypesManager.getInstance(); private java.awt.GridBagLayout gbLayout = new java.awt.GridBagLayout(); private java.awt.GridBagConstraints gbConstraints = new java.awt.GridBagConstraints(); private static javax.swing.JTextField field = new javax.swing.JTextField(15); private java.io.Serializable criteria = null; private org.osid.shared.Properties searchProperties = null; private org.osid.shared.Type searchType = null; private org.osid.shared.Type keywordSearchType = new edu.tufts.vue.util.Type("mit.edu","search","keyword"); private org.osid.shared.Type multiFieldSearchType = new edu.tufts.vue.util.Type("mit.edu","search","multiField"); protected javax.swing.event.EventListenerList listenerList = new javax.swing.event.EventListenerList(); private static org.osid.repository.Repository[] repositories; private final static String SearchLabel = VueResources.getString("defaultqueryeditor.search"); private final static String StopLabel = VueResources.getString("defaultqueryeditor.stopsearch"); private static final javax.swing.JButton searchButton1 = new javax.swing.JButton(SearchLabel); private static final javax.swing.JButton searchButton2 = new javax.swing.JButton(SearchLabel); private static final String SELECT_A_LIBRARY = VueResources.getString("defaultqueryeditor.pleaseselect"); //private static final String NO_MESSAGE = ""; private final javax.swing.JLabel selectMessage = new javax.swing.JLabel(SELECT_A_LIBRARY, javax.swing.JLabel.CENTER); private javax.swing.JButton moreOptionsButton = new tufts.vue.gui.VueButton("advancedSearchMore"); //private static final String MORE_OPTIONS = ""; //private javax.swing.JLabel moreOptionsLabel = new javax.swing.JLabel(MORE_OPTIONS); private javax.swing.JPanel moreOptionsButtonPanel = new javax.swing.JPanel(); private javax.swing.JButton fewerOptionsButton = new tufts.vue.gui.VueButton("advancedSearchLess"); //private static final String FEWER_OPTIONS = ""; //private javax.swing.JLabel fewerOptionsLabel = new javax.swing.JLabel(FEWER_OPTIONS); private javax.swing.JPanel fewerOptionsButtonPanel = new javax.swing.JPanel(); //private javax.swing.JPanel moreFewerPanel = new javax.swing.JPanel(); private static final int NOTHING_SELECTED = 0; private static final int BASIC = 1; private static final int ADVANCED_INTERSECTION = 2; private static final int ADVANCED_UNION = 3; private int currentStyle = BASIC; private javax.swing.JTextField[] advancedFields = null; private java.util.Vector typesVector = null; // advanced search universe of types private java.util.Vector advancedSearchUniverseOfTypeStringsVector = new java.util.Vector(); private java.util.Vector advancedSearchPromptsVector = new java.util.Vector(); // maintain a vector for current values private String[] advancedSearchFieldsText = null; //map based searching controls private final static javax.swing.JCheckBox mapBasedSearchCheckBox = new javax.swing.JCheckBox(VueResources.getString("defaultQueryEditor.mapBasedSearchLabel")); public DefaultQueryEditor() { // for mac leopard: would need to handle whatever event clicking the 'x' in the search field delivers // for stopping the search //field.putClientProperty("JTextField.variant", "search"); try { gbConstraints.anchor = java.awt.GridBagConstraints.WEST; gbConstraints.insets = new java.awt.Insets(2,2,2,2); gbConstraints.weighty = 0; gbConstraints.ipadx = 0; gbConstraints.ipady = 0; setLayout(gbLayout); // make button panels java.awt.GridBagLayout moreOptionsButtonPanelgbLayout = new java.awt.GridBagLayout(); java.awt.GridBagConstraints moreOptionsButtonPanelgbConstraints = new java.awt.GridBagConstraints(); moreOptionsButtonPanel.setLayout(moreOptionsButtonPanelgbLayout); searchButton1.setEnabled(false); searchButton2.setEnabled(false); field.addKeyListener(new KeyAdapter(){ public void keyReleased(KeyEvent ke){ searchButton1.setEnabled(field.getText().equals("")==false); searchButton2.setEnabled(field.getText().equals("")==false); } }); moreOptionsButtonPanelgbConstraints.gridx = 0; moreOptionsButtonPanelgbConstraints.gridy = 0; moreOptionsButtonPanelgbConstraints.fill = java.awt.GridBagConstraints.NONE; moreOptionsButtonPanelgbConstraints.weightx = 0; moreOptionsButtonPanel.add(moreOptionsButton,moreOptionsButtonPanelgbConstraints); moreOptionsButtonPanelgbConstraints.gridx = 1; moreOptionsButtonPanelgbConstraints.fill = java.awt.GridBagConstraints.NONE; moreOptionsButtonPanelgbConstraints.anchor= java.awt.GridBagConstraints.EAST; moreOptionsButtonPanelgbConstraints.weightx = 1; moreOptionsButtonPanelgbConstraints.ipadx=20; moreOptionsButtonPanel.add(searchButton1,moreOptionsButtonPanelgbConstraints); java.awt.GridBagLayout fewerOptionsButtonPanelgbLayout = new java.awt.GridBagLayout(); java.awt.GridBagConstraints fewerOptionsButtonPanelgbConstraints = new java.awt.GridBagConstraints(); fewerOptionsButtonPanel.setLayout(fewerOptionsButtonPanelgbLayout); fewerOptionsButtonPanelgbConstraints.gridx = 0; fewerOptionsButtonPanelgbConstraints.gridy = 0; fewerOptionsButtonPanelgbConstraints.fill = java.awt.GridBagConstraints.NONE; fewerOptionsButtonPanelgbConstraints.weightx = 0; fewerOptionsButtonPanel.add(fewerOptionsButton,fewerOptionsButtonPanelgbConstraints); fewerOptionsButtonPanelgbConstraints.gridx = 1; fewerOptionsButtonPanelgbConstraints.fill = java.awt.GridBagConstraints.NONE; fewerOptionsButtonPanelgbConstraints.anchor= java.awt.GridBagConstraints.EAST; fewerOptionsButtonPanelgbConstraints.ipadx=20; fewerOptionsButtonPanelgbConstraints.weightx = 1; fewerOptionsButtonPanel.add(this.searchButton2,fewerOptionsButtonPanelgbConstraints); searchButton1.addActionListener(this); searchButton2.addActionListener(this); moreOptionsButton.addActionListener(this); fewerOptionsButton.addActionListener(this); field.addActionListener(this); searchProperties = new edu.tufts.vue.util.SharedProperties(); populateAdvancedSearchUniverseOfTypeStringsVector(); repositories = sourcesAndTypesManager.getRepositoriesToSearch(); if (repositories.length == 0) { makePanel(NOTHING_SELECTED); } else { makePanel(BASIC); } //add(new javax.swing.JScrollPane(this.panel)); //map based searching requires me to listen to selection VUE.getSelection().addListener(this); } catch (Throwable t) { } } public static int getSelectedRepositoryCount() { if (repositories !=null) return repositories.length; else return 0; } public void refresh() { org.osid.repository.Repository[] oldRepositories = repositories.clone(); //if the repository list has changed we need to set the panel back to basic... //because the state can get confused, looks like this has probably happened all along //but just got noticed now. -MK 8/28 repositories = sourcesAndTypesManager.getRepositoriesToSearch(); if (oldRepositories.length ==repositories.length) { if (repositories.length == 0) { makePanel(NOTHING_SELECTED); } else { makePanel(this.currentStyle); } } else { if (repositories.length == 0) { makePanel(NOTHING_SELECTED); } else { makePanel(BASIC); } } } private void makePanel(int kind) { this.removeAll(); switch (kind) { case NOTHING_SELECTED: //System.out.println("NOTHING SEL"); makeNothingSelectedPanel(); this.searchType = this.keywordSearchType; break; case BASIC: //System.out.println("BASIC SEL"); makeBasicPanel(); this.searchType = this.keywordSearchType; break; case ADVANCED_INTERSECTION: //System.out.println("ADVNCED SEL"); makeAdvancedIntersectionPanel(); this.searchType = this.multiFieldSearchType; break; //default: //System.out.println("DEFAULT SEL"); //break; // case ADVANCED_UNION: // makeAdvancedUnionPanel(); // this.searchType = this.multiFieldSearchType; // break; } this.revalidate(); } private void makeNothingSelectedPanel() { gbConstraints.gridx = 0; gbConstraints.gridy = 0; /* add(new javax.swing.JLabel("Keyword:"),gbConstraints); gbConstraints.gridx = 1; gbConstraints.gridy = 0; add(field,gbConstraints); //field.addActionListener(this); gbConstraints.gridx = 0; gbConstraints.gridy = 1; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; */ gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; selectMessage.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); // it will be in a panel with a GUI.WidgetInsetBorder selectMessage.setForeground(java.awt.Color.darkGray); selectMessage.setFont(tufts.vue.gui.GUI.StatusFace); add(selectMessage,gbConstraints); } private void makeBasicPanel() { gbConstraints.gridx = 0; gbConstraints.gridy = 0; gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; gbConstraints.anchor = java.awt.GridBagConstraints.EAST; javax.swing.JLabel searchTypeLabel = new javax.swing.JLabel(VueResources.getString("defaultQueryEditor.searchTypeLabel")); searchTypeLabel.setFont(tufts.vue.gui.GUI.LabelFace); add(searchTypeLabel,gbConstraints); gbConstraints.gridx = 1; gbConstraints.gridy = 0; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; mapBasedSearchCheckBox.setFont(GUI.LabelFace); mapBasedSearchCheckBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (mapBasedSearchCheckBox.isSelected()) { field.setEditable(false); field.setEnabled(false);} else { field.setText(""); field.setEnabled(true); field.setEditable(true); searchButton1.setEnabled(false); searchButton2.setEnabled(false); } LWSelection selection = VUE.getSelection(); if (mapBasedSearchCheckBox.isSelected() && !(selection.size() == 1 && selection.get(0) instanceof tufts.vue.LWNode)) { field.setText(VueResources.getString("analyzeraction.selectnode")); } else if (mapBasedSearchCheckBox.isSelected() && (selection.size() == 1 && selection.get(0) instanceof tufts.vue.LWNode)) { searchButton1.setEnabled(true); searchButton2.setEnabled(true); } } }); add(mapBasedSearchCheckBox,gbConstraints); gbConstraints.gridx = 0; gbConstraints.gridy = 1; gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; gbConstraints.anchor = java.awt.GridBagConstraints.EAST; javax.swing.JLabel keywordLbl = new javax.swing.JLabel(VueResources.getString("jlabel.keyword")); keywordLbl.setFont(tufts.vue.gui.GUI.LabelFace); add(keywordLbl,gbConstraints); gbConstraints.gridx = 1; gbConstraints.gridy = 1; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; add(field,gbConstraints); //field.addActionListener(this); gbConstraints.gridx = 0; gbConstraints.gridy = 2; gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; gbConstraints.ipadx = 10; javax.swing.JLabel moreOptionLbl = new javax.swing.JLabel(VueResources.getString("jlabel.moreoption")); moreOptionLbl.setFont(tufts.vue.gui.GUI.LabelFace); add(moreOptionLbl,gbConstraints); gbConstraints.gridx = 1; gbConstraints.weightx = 1; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; add(moreOptionsButtonPanel,gbConstraints); this.currentStyle = BASIC; // enable the more options button only if there are Dublin Core fields other than // Keywords available java.util.Vector intersection = getIntersectionSearchFields(); moreOptionsButton.setEnabled(intersection.size() > 1); } private class AdvancedFieldKeyListener extends KeyAdapter { public void keyReleased(KeyEvent ke) { int len = advancedFields.length; int sum = 0; for (int i=0;i < len; i++) { sum +=((String)(advancedFields[i].getText())).replaceAll(" ","").length(); } searchButton2.setEnabled(sum > 0 ? true:false); searchButton1.setEnabled(sum > 0 ? true:false); } } private void makeAdvancedIntersectionPanel() { gbConstraints.gridx = 0; gbConstraints.gridy = 0; AdvancedFieldKeyListener advancedKeyListener = new AdvancedFieldKeyListener(); this.typesVector = getIntersectionSearchFields(); java.util.Collections.sort(typesVector); // always add a keyword field typesVector.insertElementAt("Keyword",0); int size = typesVector.size(); if (size > 0) { this.advancedFields = new javax.swing.JTextField[size]; for (int i=0; i < size; i++) { gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; String prompt = (String)typesVector.elementAt(i);//+":"; add(new javax.swing.JLabel(prompt +":"),gbConstraints); gbConstraints.gridx = 1; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; advancedFields[i] = new javax.swing.JTextField(8); advancedFields[i].addKeyListener(advancedKeyListener); if (prompt.equals("Keyword")) { advancedFields[i].setText(this.field.getText()); } else { int index = advancedSearchPromptsVector.indexOf(prompt); advancedFields[i].setText(this.advancedSearchFieldsText[index]); } add(advancedFields[i],gbConstraints); gbConstraints.gridx = 0; gbConstraints.gridy++; } //searchButton2.setEnabled(true); } gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; gbConstraints.gridx = 0; add(new javax.swing.JLabel(VueResources.getString("jlabel.feweroption")),gbConstraints); gbConstraints.gridx = 1; gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; add(fewerOptionsButtonPanel,gbConstraints); this.currentStyle = ADVANCED_INTERSECTION; } private void makeAdvancedUnionPanel() { gbConstraints.gridx = 0; gbConstraints.gridy = 0; java.util.Vector typesVector = getUnionSearchFields(); java.util.Collections.sort(typesVector); int size = typesVector.size(); if (size == 0) { // no Dublin Core Types found add(new javax.swing.JLabel(VueResources.getString("jlabel.nodublin")),gbConstraints); gbConstraints.gridy++; //searchButton2.setEnabled(false); } else { this.advancedFields = new javax.swing.JTextField[size]; for (int i=0; i < size; i++) { gbConstraints.fill = java.awt.GridBagConstraints.NONE; gbConstraints.weightx = 0; add(new javax.swing.JLabel((String)typesVector.elementAt(i)),gbConstraints); gbConstraints.gridx = 1; advancedFields[i] = new javax.swing.JTextField(8); gbConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1; add(advancedFields[i],gbConstraints); gbConstraints.gridx = 0; gbConstraints.gridy++; } //searchButton2.setEnabled(true); } gbConstraints.gridx = 0; add(fewerOptionsButton,gbConstraints); gbConstraints.gridx = 1; gbConstraints.gridy++; //add(searchButton,gbConstraints); this.currentStyle = ADVANCED_UNION; } public void actionPerformed(java.awt.event.ActionEvent ae) { if (ae.getSource() == this.moreOptionsButton) { if (this.currentStyle == BASIC) { makePanel(ADVANCED_INTERSECTION); } else { makePanel(ADVANCED_UNION); } } else if (ae.getSource() == this.fewerOptionsButton) { if (this.currentStyle == ADVANCED_UNION) { // never happens under current impl makePanel(ADVANCED_INTERSECTION); } else { // make sure keywords is sticky, and so are other fields int size = this.typesVector.size(); for (int i=0; i < size; i++) { String prompt = (String)this.typesVector.elementAt(i); if (prompt.equals("Keyword")) { field.setText(advancedFields[i].getText()); } else { int index = advancedSearchPromptsVector.indexOf(prompt); advancedSearchFieldsText[index] = advancedFields[i].getText(); } makePanel(BASIC); } } } else { if (this.mapBasedSearchCheckBox.isSelected()) { if (searchButton1.getText() == StopLabel) { // If we already have the StopLabel, this means abort the search. // null event currently means abort search Object[] listeners = listenerList.getListenerList(); for (int i=0; i<listeners.length; i+=2) { if (listeners[i] == edu.tufts.vue.fsm.event.SearchListener.class) { ((edu.tufts.vue.fsm.event.SearchListener)listeners[i+1]).searchPerformed(null); } } completeSearch(); } else { tufts.vue.AnalyzerAction.calais.act(); } } else { this.criteria = field.getText(); //System.out.println("\n\nFIRESEARCH " + ae); fireSearch(new edu.tufts.vue.fsm.event.SearchEvent(this)); } } } public void addSearchListener(edu.tufts.vue.fsm.event.SearchListener listener) { listenerList.add(edu.tufts.vue.fsm.event.SearchListener.class, listener); } public void removeSearchListener(edu.tufts.vue.fsm.event.SearchListener listener) { listenerList.remove(edu.tufts.vue.fsm.event.SearchListener.class, listener); } private void fireSearch(edu.tufts.vue.fsm.event.SearchEvent evt) { if (searchButton1.getText() == StopLabel) { // If we already have the StopLabel, this means abort the search. // null event currently means abort search evt = null; } else { searchButton1.setText(StopLabel); searchButton2.setText(StopLabel); } field.setEnabled(false); Object[] listeners = listenerList.getListenerList(); for (int i=0; i<listeners.length; i+=2) { if (listeners[i] == edu.tufts.vue.fsm.event.SearchListener.class) { ((edu.tufts.vue.fsm.event.SearchListener)listeners[i+1]).searchPerformed(evt); } } if (evt == null) completeSearch(); } public static void setStopLabels() { searchButton1.setEnabled(true); searchButton2.setEnabled(true); searchButton1.setText(StopLabel); searchButton2.setText(StopLabel); field.setEnabled(false); mapBasedSearchCheckBox.setSelected(true); } public void completeSearch() { searchButton1.setText(SearchLabel); searchButton2.setText(SearchLabel); field.setEnabled(true); } public java.io.Serializable getCriteria() { if (this.searchType.isEqual(this.keywordSearchType)) { return field.getText(); } else { return multiFieldXML(); } } public void setCriteria(java.io.Serializable searchCriteria) { if (searchCriteria instanceof String) { this.criteria = searchCriteria; field.setText((String)this.criteria); } else { this.criteria = null; field.setText(""); } } public org.osid.shared.Properties getProperties() { return this.searchProperties; } public void setProperties(org.osid.shared.Properties searchProperties) { this.searchProperties = searchProperties; } public void setSearchType(org.osid.shared.Type searchType) { this.searchType = searchType; } public org.osid.shared.Type getSearchType() { return this.searchType; } public String getSearchDisplayName() { // return the criteria, no longer than 20 characters worth String s = (String)getCriteria(); if (s.length() > 20) s = s.substring(0,20) + "..."; return s; } private java.util.Vector getUnionSearchFields() { /* Find each repository that will be searched. Get all the asset types and for each the mandatory record structures. For each structure find the part structures and their types. Check these again the VUE set (based on Dublin Core). Return the VUE names for all that match. */ java.util.Vector union = new java.util.Vector(); try { org.osid.repository.Repository[] repositories = sourcesAndTypesManager.getRepositoriesToSearch(); for (int i=0; i < repositories.length; i++) { // not all these methods may be implemented -- in which case we are out of luck try { org.osid.shared.TypeIterator typeIterator = repositories[i].getAssetTypes(); while (typeIterator.hasNextType()) { org.osid.shared.Type nextAssetType = typeIterator.nextType(); org.osid.repository.RecordStructureIterator recordStructureIterator = repositories[i].getMandatoryRecordStructures(nextAssetType); while (recordStructureIterator.hasNextRecordStructure()) { org.osid.repository.PartStructureIterator partStructureIterator = recordStructureIterator.nextRecordStructure().getPartStructures(); while (partStructureIterator.hasNextPartStructure()) { org.osid.shared.Type nextType = partStructureIterator.nextPartStructure().getType(); String nextTypeString = edu.tufts.vue.util.Utilities.typeToString(nextType); int index = advancedSearchUniverseOfTypeStringsVector.indexOf(nextTypeString); if (index != -1) { String prompt = (String)advancedSearchPromptsVector.elementAt(index); if (!union.contains(prompt)) { union.addElement(prompt); } } } } } } catch (Throwable t) { edu.tufts.vue.util.Logger.log(t); } } } catch (Throwable t1) { edu.tufts.vue.util.Logger.log(t1); } return union; } private java.util.Vector getIntersectionSearchFields() { /* Find each repository that will be searched. Get all the asset types and for each the mandatory record structures. For each structure find the part structures and their types. Check these again the VUE set (based on Dublin Core). Return the VUE names for all that match. */ java.util.Vector intersections = new java.util.Vector(); try { org.osid.repository.Repository[] repositories = sourcesAndTypesManager.getRepositoriesToSearch(); for (int i=0; i < repositories.length; i++) { // System.out.println("QueryEditor: Respository:"+repositories[i].getDisplayName()); java.util.Vector intersection = new java.util.Vector(); // not all these methods may be implemented -- in which case we are out of luck try { // must support the multi-field search type boolean supportsMultiField = false; org.osid.shared.TypeIterator typeIterator = repositories[i].getSearchTypes(); while ( (!supportsMultiField) && typeIterator.hasNextType() ) { org.osid.shared.Type nextSearchType = typeIterator.nextType(); // System.out.println("QueryEditor: Respository:"+repositories[i].getDisplayName()+" search type:"+nextSearchType.getKeyword()+" check:"+nextSearchType.isEqual(this.multiFieldSearchType)); if (nextSearchType.isEqual(this.multiFieldSearchType)) { supportsMultiField = true; } } if (!supportsMultiField) { // some repository did not have the multi-field search, so stop return new java.util.Vector(); } typeIterator = repositories[i].getAssetTypes(); while (typeIterator.hasNextType()) { org.osid.shared.Type nextAssetType = typeIterator.nextType(); // System.out.println("QueryEditor(AssetTypes): Respository:"+repositories[i].getDisplayName()+" asset type:"+nextAssetType.getKeyword()); org.osid.repository.RecordStructureIterator recordStructureIterator = repositories[i].getMandatoryRecordStructures(nextAssetType); while (recordStructureIterator.hasNextRecordStructure()) { org.osid.repository.PartStructureIterator partStructureIterator = recordStructureIterator.nextRecordStructure().getPartStructures(); while (partStructureIterator.hasNextPartStructure()) { org.osid.shared.Type nextType = partStructureIterator.nextPartStructure().getType(); String nextTypeString = edu.tufts.vue.util.Utilities.typeToString(nextType); int index = advancedSearchUniverseOfTypeStringsVector.indexOf(nextTypeString); // System.out.println("QueryEditor(PartType): Respository:"+repositories[i].getDisplayName()+" part type:"+nextTypeString+" index: "+index); if (index != -1) { String prompt = (String)advancedSearchPromptsVector.elementAt(index); if (!intersection.contains(prompt)) { intersection.addElement(prompt); } } } } } intersections.addElement(intersection); } catch (Throwable t) { edu.tufts.vue.util.Logger.log(t); t.printStackTrace(); } } // now find what is common accross intersections int numIntersections = intersections.size(); if (numIntersections == 0) { return intersections; } else { java.util.Vector intersection = (java.util.Vector)intersections.firstElement(); for (int j=1; j < numIntersections; j++) { java.util.Vector nextIntersection = (java.util.Vector)intersections.elementAt(j); java.util.Vector newIntersection = new java.util.Vector(); int numCandidates = intersection.size(); for (int k=0; k < numCandidates; k++) { String nextType = (String)intersection.elementAt(k); if (nextIntersection.contains(nextType)) { newIntersection.addElement(nextType); } } intersection = newIntersection; } return intersection; } } catch (Throwable t1) { edu.tufts.vue.util.Logger.log(t1); } return new java.util.Vector(); } private void populateAdvancedSearchUniverseOfTypeStringsVector() { advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/contributor@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/coverage@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/creator@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/date@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/description@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/format@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/identifier@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/language@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/publisher@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/relation@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/rights@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/source@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/subject@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/title@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/type@mit.edu"); advancedSearchUniverseOfTypeStringsVector.addElement("partStructure/course@mit.edu"); advancedSearchFieldsText = new String[16]; int index = 0; advancedSearchPromptsVector.addElement("Contributor"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Coverage"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Creator"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Date"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Description"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Format"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Identifier"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Language"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Publisher"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Relation"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Rights"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Source"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Subject"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Title"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Type"); advancedSearchFieldsText[index++] = null; advancedSearchPromptsVector.addElement("Course"); advancedSearchFieldsText[index++] = null; } private String multiFieldXML() { // make XML for all non-blank entries StringBuffer buffer = new StringBuffer(); buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><criteria>"); for (int i =0; i < advancedFields.length; i++) { String value = advancedFields[i].getText(); if (value.trim().length() > 0) { buffer.append("<field><type>"); // determine type String prompt = (String)typesVector.elementAt(i); String typeString = null; int index = advancedSearchPromptsVector.indexOf(prompt); if (index == -1) { typeString = "partStructure/keywords@mit.edu"; } else { typeString = (String)advancedSearchUniverseOfTypeStringsVector.elementAt(index); } // append elements buffer.append(typeString); buffer.append("</type><value>"); buffer.append(value); buffer.append("</value><operator>contains</operator></field>"); if (i > 0) buffer.append("<boolean>and</boolean>"); } } buffer.append("</criteria>"); return buffer.toString(); } public void selectionChanged(LWSelection selection) { if (mapBasedSearchCheckBox.isSelected() && !(selection.size() == 1 && selection.get(0) instanceof tufts.vue.LWNode)) { this.searchButton1.setEnabled(false); field.setText(VueResources.getString("analyzeraction.selectnode")); } else if (mapBasedSearchCheckBox.isSelected()) { if (searchButton1.getText() != StopLabel) { this.searchButton1.setEnabled(true); field.setText(""); } } } }