/*
* 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.
*/
/*
* MapFilterModelEditor.java
*
* Created on February 15, 2004, 7:10 PM
*/
package tufts.vue.filter;
/**
*
* @author akumar03
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import tufts.vue.VueResources;
public class MapFilterModelEditor extends JPanel {
public static final String MAP_FILTER_INFO = tufts.vue.VueResources.getString("info.filter.map");
MapFilterModel mapFilterModel;
JTable mapFilterTable;
AddButtonListener addButtonListener = null;
DeleteButtonListener deleteButtonListener = null;
MapFilterModelSelectionListener sListener = null;
boolean editable = false;
JButton addButton=new tufts.vue.gui.VueButton(VueResources.getString("button.add.label"));
JButton deleteButton=new tufts.vue.gui.VueButton(VueResources.getString("button.delete.label"));
JLabel questionLabel = new JLabel(tufts.vue.VueResources.getImageIcon("smallInfo"), JLabel.LEFT);
/** Creates a new instance of MapFilterModelEditor */
public MapFilterModelEditor(MapFilterModel mapFilterModel) {
this.mapFilterModel = mapFilterModel;
questionLabel.setToolTipText(MAP_FILTER_INFO);
setMapFilterModelPanel();
}
private void setMapFilterModelPanel() {
addButton.setToolTipText(VueResources.getString("mapfiltermodelpanel.addbutton.tooltip"));
deleteButton.setToolTipText(VueResources.getString("mapfiltermodelpanel.delbutton.tooltip"));
mapFilterTable = new JTable(mapFilterModel);
mapFilterTable.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
if(mapFilterTable.isEditing()) {
mapFilterTable.getCellEditor(mapFilterTable.getEditingRow(),mapFilterTable.getEditingColumn()).stopCellEditing();
}
mapFilterTable.removeEditor();
}
public void focusGained(FocusEvent e) {
}
});
mapFilterTable.setPreferredScrollableViewportSize(new Dimension(200,100));
JScrollPane mapFilterScrollPane=new JScrollPane(mapFilterTable);
mapFilterScrollPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
JPanel mapFilterPanel=new JPanel();
mapFilterPanel.setLayout(new BorderLayout());
mapFilterPanel.add( mapFilterScrollPane, BorderLayout.CENTER);
//mapFilterPanel.setBorder(BorderFactory.createEmptyBorder(3,6,3,6));
// addConditionButton
addButtonListener = new AddButtonListener(mapFilterModel);
addButton.addActionListener(addButtonListener);
sListener= new MapFilterModelSelectionListener(deleteButton, -1);
mapFilterTable.getSelectionModel().addListSelectionListener(sListener);
deleteButtonListener = new DeleteButtonListener(mapFilterTable, sListener);
deleteButton.addActionListener(deleteButtonListener);
deleteButton.setEnabled(false);
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(labelPanel);
innerPanel.add(bottomPanel);
innerPanel.add(mapFilterPanel);
setLayout(new BorderLayout());
add(innerPanel,BorderLayout.CENTER);
//setSize(300, 300);
validate();
}
public void setMapFilterModel(MapFilterModel mapFilterModel) {
this.mapFilterModel = mapFilterModel;
mapFilterTable.setModel(mapFilterModel);
addButton.removeActionListener(addButtonListener);
addButtonListener = new AddButtonListener(mapFilterModel);
addButton.addActionListener(addButtonListener);
deleteButton.removeActionListener(deleteButtonListener);
deleteButtonListener = new DeleteButtonListener(mapFilterTable, sListener);
deleteButton.addActionListener(deleteButtonListener);
}
public class AddButtonListener implements ActionListener {
private MapFilterModel model;
public AddButtonListener(MapFilterModel model) {
this.model=model;
}
public void actionPerformed(ActionEvent e) {
AddDialog addDialog = new AddDialog(model);
}
}
public class AddDialog extends JDialog {
MapFilterModel model;
JLabel keyLabel;
JLabel typeLabel;
JTextField keyEditor;
JComboBox typeEditor;
Vector allTypes;
public AddDialog(MapFilterModel model) {
super(tufts.vue.VUE.getDialogParentAsFrame(),VueResources.getString("dialog.addkey.title"),true);
this.model = model;
allTypes = (Vector)TypeFactory.getAllTypes();
keyLabel = new JLabel(VueResources.getString("nodefilter.field.label"));
typeLabel = new JLabel(VueResources.getString("nodefilter.type.label"));
keyEditor = new JTextField();
typeEditor = new JComboBox(allTypes);
keyEditor.setPreferredSize(new Dimension(80,20));
JPanel keyPanel=new JPanel();
keyPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
keyPanel.setBorder(BorderFactory.createEmptyBorder(6,6,6,6));
keyPanel.add(keyLabel);
keyPanel.add(keyEditor);
JPanel typePanel=new JPanel();
typePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
typePanel.setBorder(BorderFactory.createEmptyBorder(6,6,6,6));
typePanel.add(typeLabel);
typePanel.add(typeEditor);
// SOUTH: southPanel(cancelButton, okButton)
JButton okButton=new JButton(VueResources.getString("button.ok.label"));
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateModelAndNotify();
setVisible(false);
}
});
JButton cancelButton=new JButton(VueResources.getString("button.cancel.lable"));
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
JPanel southPanel=new JPanel();
southPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
southPanel.add(okButton);
southPanel.add(cancelButton);
BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
getContentPane().setLayout(layout);
getContentPane().add(keyPanel);
getContentPane().add(typePanel);
getContentPane().add(southPanel);
pack();
setLocation(MapFilterModelEditor.this.getLocationOnScreen());
setVisible(true);
}
private void updateModelAndNotify(){
tufts.vue.filter.Key key = new tufts.vue.filter.Key(keyEditor.getText(),(tufts.vue.filter.Type)typeEditor.getSelectedItem());
model.addKey(key);
System.out.println("ADDED KEY of Type = "+((tufts.vue.filter.Type)typeEditor.getSelectedItem()).getDisplayName());
model.fireTableDataChanged();
}
}
public class MapFilterModelSelectionListener implements ListSelectionListener {
private int m_selectedRow;
private JButton m_deleteButton;
public MapFilterModelSelectionListener(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 MapFilterModelSelectionListener m_sListener;
public DeleteButtonListener(JTable table,MapFilterModelSelectionListener sListener) {
this.table = table;
m_sListener=sListener;
}
public void actionPerformed(ActionEvent e) {
// will only be invoked if an existing row is selected
if (JOptionPane
.showConfirmDialog(tufts.vue.VUE.getDialogParentAsFrame(),
VueResources.getString("dialog.delcustommetdata.message"),
VueResources.getString("dialog.delcustommetdata.title"),
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
tufts.vue.VueResources.getImageIcon("vueIcon32x32")) == JOptionPane.YES_OPTION) {
int r=m_sListener.getSelectedRow();
((MapFilterModel) table.getModel()).remove(r);
((MapFilterModel) table.getModel()).fireTableRowsDeleted(r,r);
if(r> 0)
table.setRowSelectionInterval(r-1, r-1);
else if(table.getRowCount() > 0)
table.setRowSelectionInterval(0,0);
}
}
}
}