/*
* 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 tufts.vue.VueResources;
import fedora.server.types.gen.*;
public class AdvancedQueryEditor
extends javax.swing.JPanel
implements edu.tufts.vue.fsm.QueryEditor,
java.awt.event.ActionListener
{
private javax.swing.JTextField partField = new javax.swing.JTextField(12);
private javax.swing.JTextField valueField = new javax.swing.JTextField(20);
private java.io.Serializable criteria = null;
private org.osid.shared.Properties searchProperties = null;
private javax.swing.JPanel AdvancedSearch = new javax.swing.JPanel(new java.awt.BorderLayout());
private ConditionsTableModel m_model=new ConditionsTableModel();
private javax.swing.JTable conditionsTable = new javax.swing.JTable(m_model);
private javax.swing.JComboBox endusersComboBox;
private javax.swing.CellEditor defaultCellEditor;
private javax.swing.JComboBox maxReturnsAdvancedSearch; // combobox for advanced search.
private String[] maxReturnItems = {"10","20",};
protected javax.swing.event.EventListenerList listenerList = new javax.swing.event.EventListenerList();
private org.osid.shared.Type searchType = null;
public AdvancedQueryEditor()
{
try {
searchProperties = new edu.tufts.vue.util.SharedProperties();
maxReturnsAdvancedSearch = new javax.swing.JComboBox(maxReturnItems);
maxReturnsAdvancedSearch.setEditable(true);
} catch (Throwable t) {
}
conditionsTable.setPreferredScrollableViewportSize(new java.awt.Dimension(100,100));
conditionsTable.addFocusListener(new java.awt.event.FocusListener() {
public void focusLost(java.awt.event.FocusEvent e) {
if(conditionsTable.isEditing()) {
conditionsTable.getCellEditor(conditionsTable.getEditingRow(),conditionsTable.getEditingColumn()).stopCellEditing();
}
conditionsTable.removeEditor();
}
public void focusGained(java.awt.event.FocusEvent e) {
}
});
javax.swing.JScrollPane conditionsScrollPane = new javax.swing.JScrollPane(conditionsTable);
conditionsScrollPane.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.DARK_GRAY));
javax.swing.JPanel innerConditionsPanel = new javax.swing.JPanel();
innerConditionsPanel.setLayout(new java.awt.BorderLayout());
innerConditionsPanel.add(conditionsScrollPane, java.awt.BorderLayout.CENTER);
// GRID: addConditionButton
javax.swing.JButton addConditionButton = new javax.swing.JButton(VueResources.getString("button.add.label"));
addConditionButton.setBackground(this.getBackground());
addConditionButton.setToolTipText(VueResources.getString("advancedqueryeditor.addcondition"));
// GRID: deleteConditionButton
javax.swing.JButton deleteConditionButton=new javax.swing.JButton(VueResources.getString("button.delete.label"));
deleteConditionButton.setBackground(this.getBackground());
deleteConditionButton.setToolTipText(VueResources.getString("advancedqueryeditor.deletecondition"));
// javax.swing.JLabel questionLabel = new javax.swing.JLabel(VueResources.getImageIcon("smallInfo"), JLabel.LEFT);
// questionLabel.setPreferredSize(new Dimension(22, 17));
// questionLabel.setToolTipText("Add or Delete conditions using +/- buttons. Click on table cell to modify conditions");
// Now that buttons are available, register the
// list selection listener that sets their enabled state.
conditionsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
// setting editors for columns
// field column.
try {
String fields[] = { "identifier","title","language","description","end user", "age range" };
String endusers[] = { "author","counsellor","learner","manager","parent","teacher","other" };
String operators[] = { "eq","lt","lte","gt","gte" };
javax.swing.JComboBox fieldsComboBox = new javax.swing.JComboBox(fields);
fieldsComboBox.addActionListener(this);
this.endusersComboBox = new javax.swing.JComboBox(endusers);
javax.swing.JComboBox operatorsComboBox = new javax.swing.JComboBox(operators);
conditionsTable.getColumnModel().getColumn(0).setCellEditor(new javax.swing.DefaultCellEditor(fieldsComboBox));
conditionsTable.getColumnModel().getColumn(1).setCellEditor(new javax.swing.DefaultCellEditor(operatorsComboBox));
this.defaultCellEditor = conditionsTable.getColumnModel().getColumn(2).getCellEditor();
} catch(Exception ex) {
System.out.println("Can't set the editors"+ex);
}
ConditionSelectionListener sListener= new ConditionSelectionListener(deleteConditionButton, -1);
conditionsTable.getSelectionModel().addListSelectionListener(sListener);
// ..and add listeners to the buttons
addConditionButton.addActionListener(new AddConditionButtonListener(m_model));
deleteConditionButton.addActionListener(new DeleteConditionButtonListener(m_model, sListener));
javax.swing.JPanel topPanel=new javax.swing.JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT,2,0));
topPanel.add(addConditionButton);
topPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(3,6,3,0));
topPanel.add(deleteConditionButton);
// topPanel.add(questionLabel);
javax.swing.JPanel returnPanel = new javax.swing.JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT,2, 0));
returnPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(4,6,6,0));
// returnPanel.add(returnLabelAdvancedSearch);
returnPanel.add(maxReturnsAdvancedSearch);
// javax.swing.JPanel bottomPanel=new javax.swing.JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT,2,0));
// bottomPanel.add(advancedSearchButton);
// bottomPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(6,6,6,0));
javax.swing.JPanel advancedSearchPanel=new javax.swing.JPanel();
advancedSearchPanel.setLayout(new javax.swing.BoxLayout(advancedSearchPanel, javax.swing.BoxLayout.Y_AXIS));
advancedSearchPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(2,6,6,6));
advancedSearchPanel.add(topPanel);
advancedSearchPanel.add(innerConditionsPanel);
advancedSearchPanel.add(returnPanel);
// advancedSearchPanel.add(bottomPanel);
add(advancedSearchPanel,java.awt.BorderLayout.NORTH);
validate();
//advancedSearchPanel.add(advancedSearchButton,BorderLayout.SOUTH);
}
// return the criteria, no longer than 20 characters worth
public String getSearchDisplayName() {
String s = (String)getCriteria();
if (s.length() > 20) s = s.substring(0,20) + "...";
return s;
}
public void refresh() {
}
public void actionPerformed(java.awt.event.ActionEvent ae) {
this.criteria = partField.getText() + "::" + valueField.getText();
}
public java.io.Serializable getCriteria() {
return partField.getText() + "::" + valueField.getText();
}
public void setCriteria(java.io.Serializable searchCriteria) {
if (searchCriteria instanceof String) {
String part = "";
String value = "";
String criteria = (String)searchCriteria;
int index = criteria.indexOf("::");
if (index != -1) {
part = criteria.substring(0,index);
value = criteria.substring(index+2);
}
this.criteria = searchCriteria;
partField.setText(part);
valueField.setText(value);
} else {
this.criteria = null;
partField.setText("");
valueField.setText("");
}
}
public void setSearchType(org.osid.shared.Type searchType)
{
this.searchType = searchType;
}
public org.osid.shared.Type getSearchType()
{
return this.searchType;
}
public org.osid.shared.Properties getProperties() {
return this.searchProperties;
}
public void setProperties(org.osid.shared.Properties searchProperties) {
this.searchProperties = searchProperties;
}
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)
{
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);
}
}
}
public class ConditionsTableModel extends javax.swing.table.AbstractTableModel {
java.util.List m_conditions;
public ConditionsTableModel() {
m_conditions=new java.util.ArrayList();
Condition cond = new Condition();
cond.setProperty("");
cond.setOperator(ComparisonOperator.eq);
cond.setValue("");
m_conditions.add(cond);
}
public ConditionsTableModel(java.util.List conditions) {
m_conditions=conditions;
}
public java.util.List getConditions() {
return m_conditions;
}
public String getColumnName(int col) {
if (col==0) {
return "Field";
} else if (col==1) {
return "Operator";
} else {
return "Value";
}
}
public int getRowCount() {
return m_conditions.size();
}
public int getColumnCount() {
return 3;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public Object getValueAt(int row, int col) {
Condition cond=(Condition) m_conditions.get(row);
if (col==0) {
return cond.getProperty();
} else if (col==1) {
return getNiceName(cond.getOperator().toString());
} else {
return cond.getValue();
}
}
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
return true;
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
Condition cond;
if(row == -1)
cond = new Condition();
else
cond = (Condition) m_conditions.get(row);
if(col == 0)
cond.setProperty((String)value);
/*
if(col == 1) {
try {
cond.setOperator(ComparisonOperator.fromValue(FedoraUtils.getAdvancedSearchOperatorsActuals((tufts.oki.dr.fedora.DR)dr,(String)value)));
} catch (Exception ex) {
System.out.println("Value = "+value+": Not supported -"+ex);
cond.setOperator(ComparisonOperator.ge);
}
}
*/
if(col == 2)
cond.setValue((String)value);
// row = -1 adds new condions else replace the existing one.
if (row==-1)
m_conditions.add(cond);
else
m_conditions.set(row, cond);
fireTableCellUpdated(row, col);
}
private String getNiceName(String operString) {
if (operString.equals("has")) return "contains";
if (operString.equals("eq")) return "eq";
if (operString.equals("lt")) return "lt";
if (operString.equals("lte")) return "lte";
if (operString.equals("gt")) return "gt";
return "gte";
}
}
//todo: need to have single thread for all searches
public class SearchThread extends Thread {
public void run() {
}
}
public class ConditionSelectionListener implements javax.swing.event.ListSelectionListener {
private int m_selectedRow;
private javax.swing.JButton m_deleteButton;
public ConditionSelectionListener(javax.swing.JButton deleteButton, int selectedRow) {
m_selectedRow=selectedRow;
m_deleteButton=deleteButton;
updateButtons();
}
public void valueChanged(javax.swing.event.ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;
javax.swing.ListSelectionModel lsm = (javax.swing.ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
m_selectedRow=-1;
} else {
m_selectedRow=lsm.getMinSelectionIndex();
}
updateButtons();
}
public int getSelectedRow() {
return m_selectedRow;
}
private void updateButtons() {
if (getSelectedRow()==-1) {
m_deleteButton.setEnabled(false);
} else {
m_deleteButton.setEnabled(true);
}
}
}
public class AddConditionButtonListener
implements java.awt.event.ActionListener {
private ConditionsTableModel m_model;
public AddConditionButtonListener(ConditionsTableModel model) {
m_model=model;
}
public void actionPerformed(java.awt.event.ActionEvent e) {
Condition cond=new Condition();
/*
try {
cond.setProperty(FedoraUtils.getAdvancedSearchFields((tufts.oki.dr.fedora.DR)dr)[0]);
} catch (Exception ex) {
*/
cond.setProperty("label");
// }
cond.setOperator(ComparisonOperator.has);
cond.setValue("");
m_model.getConditions().add(cond);
m_model.fireTableDataChanged();
}
}
public class DeleteConditionButtonListener
implements java.awt.event.ActionListener {
private ConditionsTableModel m_model;
private ConditionSelectionListener m_sListener;
public DeleteConditionButtonListener(ConditionsTableModel model,
ConditionSelectionListener sListener) {
m_model=model;
m_sListener=sListener;
}
public void actionPerformed(java.awt.event.ActionEvent e) {
// will only be invoked if an existing row is selected
int r=m_sListener.getSelectedRow();
m_model.getConditions().remove(r);
m_model.fireTableRowsDeleted(r,r);
}
}
}