/*
* 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.
*/
/*
* FilterEditor.java
*
* Created on February 25, 2004, 10:56 AM
*/
package tufts.vue;
/**
*
* @author akumar03
*
* This class allows creation and edition of filters. Filters are stored in a vector
* in FilterTableModel.
*/
import tufts.vue.filter.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
public class FilterEditor extends JPanel {
public static final Key keyLabel = new Key("Label", TypeFactory.getStringType());
public static final Key keyAnywhere = new Key("Anywhere", TypeFactory.getStringType());
public static final Key keyNotes = new Key("Notes", TypeFactory.getStringType());
public static final JLabel triangleLabel = new JLabel(VueResources.getImageIcon("triangleDownIcon"));
JLabel questionLabel = new JLabel(tufts.vue.VueResources.getImageIcon("smallInfo"), JLabel.LEFT);
public static final String FILTER_INFO = tufts.vue.VueResources.getString("info.filter.create");
JButton addButton=new tufts.vue.gui.VueButton(VueResources.getString("button.add.label"));
JButton deleteButton=new tufts.vue.gui.VueButton(VueResources.getString("button.delete.label"));
FilterTableModel filterTableModel;
boolean editable = true;
JComboBox operatorEditor;
JTable filterTable;
Statement defaultStatement; // statement that is added when add(+) is clicked.
/** Creates a new instance ofFilterEditor */
public FilterEditor() {
filterTableModel = new FilterTableModel();
questionLabel.setToolTipText(FILTER_INFO);
setFilterEditorPanel();
}
public FilterTableModel getFilterTableModel() {
return this.filterTableModel;
}
/**
* public FilterEditor(FilterTableModel filterTableModel) {
* this.filterTableModel = filterTableModel;
* setFilterEditorPanel();
* }
**/
public void stopEditing() {
if(filterTable.isEditing()) {
filterTable.getCellEditor(filterTable.getEditingRow(),filterTable.getEditingColumn()).stopCellEditing();
}
filterTable.removeEditor();
}
private void setFilterEditorPanel() {
ButtonGroup criteriaSelectionGroup = new ButtonGroup();
filterTable = new JTable(filterTableModel);
filterTable.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
// stopEditing();
}
public void focusGained(FocusEvent e) {
}
});
filterTable.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(filterTable.getSelectedRow() == (filterTableModel.getRowCount()-1) && e.getKeyCode() == e.VK_ENTER){
filterTableModel.addStatement();
}
}
});
filterTable.setPreferredScrollableViewportSize(new Dimension(200,100));
filterTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
JScrollPane filterScrollPane=new JScrollPane(filterTable);
filterScrollPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
JPanel filterPanel=new JPanel();
filterPanel.setLayout(new BorderLayout());
filterPanel.add(filterScrollPane, BorderLayout.CENTER);
// GRID: addConditionButton
addButton.addActionListener(new AddButtonListener(filterTableModel));
addButton.setToolTipText("Add Criteria");
// GRID: deleteConditionButton
deleteButton.setEnabled(false);
deleteButton.setToolTipText("Delete Criteria");
// adding the delete functionality */
FilterSelectionListener sListener= new FilterSelectionListener(deleteButton, -1);
filterTable.getSelectionModel().addListSelectionListener(sListener);
deleteButton.addActionListener(new DeleteButtonListener(filterTable, sListener));
filterTable.getColumnModel().getColumn(FilterTableModel.KEY_COL).setCellEditor(new KeyCellEditor());
filterTable.getColumnModel().getColumn(FilterTableModel.KEY_COL).setCellRenderer(new KeyCellRenderer());
filterTable.getColumnModel().getColumn(FilterTableModel.OPERATOR_COL).setCellEditor(new OperatorCellEditor());
filterTable.getColumnModel().getColumn(FilterTableModel.OPERATOR_COL).setCellRenderer(new OperatorCellRenderer());
JPanel innerPanel=new JPanel();
innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.Y_AXIS));
//innerPanel.setBorder(BorderFactory.createEmptyBorder(2,6,6,6));
JPanel bottomPanel=new JPanel(new FlowLayout(FlowLayout.RIGHT,2,0));
//bottomPanel.setBorder(BorderFactory.createEmptyBorder(3,6,3,6));
bottomPanel.add(addButton);
bottomPanel.add(deleteButton);
bottomPanel.add(questionLabel);
innerPanel.add(bottomPanel);
innerPanel.add(filterPanel);
setLayout(new BorderLayout());
add(innerPanel,BorderLayout.CENTER);
//setSize(300, 300);
validate();
}
public class FilterTableModel extends AbstractTableModel implements MapFilterModel.Listener{
public static final int KEY_COL = 0;
public static final int OPERATOR_COL = 1;
public static final int VALUE_COL = 2;
public static final int TYPE_COL = 3;
boolean editable;
Vector filters;
public FilterTableModel() {
filters = new Vector();
}
public Vector getFilters() {
return this.filters;
}
public void setFilters(Vector filters) {
tufts.vue.VUE.getActiveMap().getMapFilterModel().addListener(this);
// this is a hack needs to be fixed. Filtermodel should be aware of map it belongs to
this.filters = filters;
fireTableDataChanged();
}
public void addStatement(Statement statement) {
filters.add(statement);
fireTableDataChanged();
}
public void addStatement() {
Statement stmt = new Statement();
Key key = keyAnywhere;
if(tufts.vue.VUE.getActiveMap().getMapFilterModel().size() > 0) {
key = (Key) tufts.vue.VUE.getActiveMap().getMapFilterModel().get(0);
}
stmt.setKey(key);
stmt.setOperator(key.getType().getDefaultOperator());
stmt.setValue(key.getDefaultValue());
addStatement(stmt);
}
public void mapFilterModelChanged(MapFilterModelEvent e) {
filterTableModel.fireTableDataChanged();
}
public boolean isEditable() {
return editable;
}
public String getColumnName(int col) {
if (col==0) {
return "Element Name";
} else if(col == 1) {
return "Operator";
} else
return "Value";
}
public int getRowCount() {
return filters.size();
}
public int getColumnCount() {
return 3;
}
public Object getValueAt(int row, int col) {
Statement statement = (Statement) filters.get(row);
if (col== KEY_COL)
return statement.getKey();
else if(col == OPERATOR_COL)
return statement.getOperator();
else
return statement.getValue();
}
public void setValueAt(Object value, int row, int col) {
Statement statement = (Statement) filters.get(row);
Key key = statement.getKey();
if(col == VALUE_COL) {
if(statement.getKey().getType().getDisplayName().equals(Type.INTEGER_TYPE)) {
statement.setValue(new Integer(value.toString()));
} else {
statement.setValue(value);
}
}else if(col == KEY_COL) {
if(value instanceof Key) {
statement.setKey((Key)value);
setValueAt(((Key)value).getType().getDefaultOperator(),row,OPERATOR_COL);
setValueAt(((Key)value).getDefaultValue(), row,VALUE_COL);
}
//statement.setOperator(((Key)value).getType().getDefaultOperator());
//statement.setValue(((Key)value).getDefaultValue());
// fireTableRowsUpdated(row,row);
}else if(col == OPERATOR_COL) {
if(value instanceof Operator) {
statement.setOperator((Operator)value);
}
}
// row = -1 adds new condions else replace the existing one.
fireTableCellUpdated(row, col);
fireTableDataChanged();
}
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
// return editable;
return true;
}
}
public class AddButtonListener implements ActionListener {
private FilterTableModel model;
public AddButtonListener(FilterTableModel model) {
this.model=model;
}
public void actionPerformed(ActionEvent e) {
//m_model.addProperty(DC_FIELDS[0], "");
// AddDialog addDialog = new AddDialog(model);
Statement stmt = new Statement();
Key key = keyAnywhere;
if(tufts.vue.VUE.getActiveMap().getMapFilterModel().size() > 0) {
key = (Key) tufts.vue.VUE.getActiveMap().getMapFilterModel().get(0);
}
stmt.setKey(key);
stmt.setOperator(key.getType().getDefaultOperator());
stmt.setValue(key.getDefaultValue());
model.addStatement(stmt);
model.fireTableDataChanged();
}
}
/** Tablecell editor for opertator columm. Needed to be redone to
* display the correct combobox based on the componet selected in the column.
*
*.
*
*/
public class OperatorCellEditor extends DefaultCellEditor {
/** setting the defaultCellEditor **/
JComboBox editor = null;
public OperatorCellEditor() {
super(new JComboBox());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
editor = new JComboBox((Vector)((Statement)(VUE.getActiveMap().getLWCFilter().getStatements().get(row))).getKey().getType().getOperators());
return editor;
}
public Object getCellEditorValue() {
if(editor!= null) {
return editor.getSelectedItem();
} else
throw new RuntimeException("No Keys present");
}
}
public class OperatorCellRenderer extends DefaultTableCellRenderer {
Vector keys = new Vector();;
JComboBox editor = null;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(value.toString().equals(""))
value = keyAnywhere.getType().getDefaultOperator().toString();
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(0, 2,0,0));
panel.add(new JLabel(value.toString()),BorderLayout.CENTER);
panel.add(triangleLabel,BorderLayout.EAST);
panel.setBackground(Color.WHITE);
return panel;
}
}
public class KeyCellEditor extends DefaultCellEditor {
/** setting the defaultCellEditor **/
Vector keys = new Vector();;
JComboBox editor = null;
public KeyCellEditor() {
super(new JComboBox());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
keys.removeAllElements();
keys.add(keyAnywhere);
keys.add(keyLabel);
keys.add(keyNotes);
keys.addAll(VUE.getActiveMap().getMapFilterModel().getKeyVector());
editor = new JComboBox(keys);
return editor;
}
public Object getCellEditorValue() {
if(editor!= null) {
return editor.getSelectedItem();
} else
throw new RuntimeException("No Keys present");
}
}
public class KeyCellRenderer extends DefaultTableCellRenderer {
Vector keys = new Vector();;
JComboBox editor = null;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(value.toString().equals(""))
value = keyAnywhere.toString();
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(0, 2,0,0));
panel.add(new JLabel(value.toString()),BorderLayout.CENTER);
panel.add(triangleLabel,BorderLayout.EAST);
panel.setBackground(Color.WHITE);
return panel;
}
}
/** not used currently. **/
public class FilterSelectionListener implements ListSelectionListener {
private int m_selectedRow;
private JButton m_deleteButton;
public FilterSelectionListener(JButton deleteButton, int selectedRow) {
m_selectedRow=selectedRow;
m_deleteButton=deleteButton;
updateButtons();
}
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
m_selectedRow=-1;
} else {
m_selectedRow=lsm.getMinSelectionIndex();
}
updateButtons();
}
public int getSelectedRow() {
return m_selectedRow;
}
public void setSelectedRow(int row) {
this.m_selectedRow = row;
}
private void updateButtons() {
if (getSelectedRow()==-1) {
m_deleteButton.setEnabled(false);
} else {
m_deleteButton.setEnabled(true);
}
}
}
public class DeleteButtonListener implements ActionListener {
private JTable table;
private FilterSelectionListener m_sListener;
public DeleteButtonListener(JTable table,FilterSelectionListener sListener) {
this.table = table;
m_sListener=sListener;
}
public void actionPerformed(ActionEvent e) {
// will only be invoked if an existing row is selected
int r=m_sListener.getSelectedRow();
((FilterTableModel) table.getModel()).getFilters().remove(r);
((FilterTableModel) table.getModel()).fireTableRowsDeleted(r,r);
if(r> 0)
table.setRowSelectionInterval(r-1, r-1);
else if(table.getRowCount() > 0)
table.setRowSelectionInterval(0,0);
}
}
}