/*
* FilterPreferencePanel.java
*
* Created on January 10, 2007, 6:31 PM
*/
package org.jmeld.ui.settings;
import org.jmeld.settings.FilterSettings;
import org.jmeld.settings.JMeldSettings;
import org.jmeld.settings.util.Filter;
import org.jmeld.settings.util.FilterRule;
import org.jmeld.ui.swing.table.JMTableModel;
import org.jmeld.ui.swing.table.util.JMComboBoxEditor;
import org.jmeld.ui.swing.table.util.JMComboBoxRenderer;
import org.jmeld.util.conf.ConfigurationListenerIF;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.List;
/**
*
* @author kees
*/
public class FilterSettingsPanel
extends FilterSettingsForm
implements ConfigurationListenerIF
{
JMTableModel filterTableModel;
JMTableModel filterRuleTableModel;
public FilterSettingsPanel()
{
initConfiguration();
init();
JMeldSettings.getInstance().addConfigurationListener(this);
}
private void init()
{
ListSelectionModel selectionModel;
filterTableModel = getFilterTableModel();
filterTable.setModel(filterTableModel);
filterTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectionModel = filterTable.getSelectionModel();
selectionModel.addListSelectionListener(getFilterSelectionAction());
filterRuleTableModel = getFilterRuleTableModel(0);
filterRuleTable.setModel(filterRuleTableModel);
filterRuleTable.setDefaultEditor(
Filter.class,
new JMComboBoxEditor(getFilters()));
filterRuleTable.setDefaultRenderer(
Filter.class,
new JMComboBoxRenderer(getFilters()));
filterRuleTable.setDefaultEditor(
FilterRule.Rule.class,
new JMComboBoxEditor(FilterRule.Rule.values()));
filterRuleTable.setDefaultRenderer(
FilterRule.Rule.class,
new JMComboBoxRenderer(FilterRule.Rule.values()));
filterRuleTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
newFilterButton.addActionListener(getNewFilterAction());
deleteFilterButton.addActionListener(getDeleteFilterAction());
newFilterRuleButton.addActionListener(getNewFilterRuleAction());
deleteFilterRuleButton.addActionListener(getDeleteFilterRuleAction());
if (filterTable.getRowCount() > 0)
{
filterTable.addRowSelectionInterval(0, 0);
;
}
}
private JMTableModel getFilterTableModel()
{
return new FilterTableModel();
}
private JMTableModel getFilterRuleTableModel(int filterIndex)
{
return new FilterRuleTableModel(filterIndex);
}
private ListSelectionListener getFilterSelectionAction()
{
return new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
int rowIndex;
Object value;
if (e.getValueIsAdjusting())
{
return;
}
rowIndex = filterTable.getSelectedRow();
value = filterTableModel.getValueAt(rowIndex, 0);
filterNameLabel.setText(value.toString());
filterRuleTableModel = getFilterRuleTableModel(rowIndex);
filterRuleTable.setModel(filterRuleTableModel);
filterRuleTable.doLayout();
}
};
}
private ActionListener getNewFilterAction()
{
return new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
getFilterSettings().addFilter(new Filter("Untitled"));
filterTableModel.fireTableDataChanged();
}
};
}
private ActionListener getDeleteFilterAction()
{
return new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
getFilterSettings().removeFilter(getSelectedFilter());
filterTableModel.fireTableDataChanged();
}
};
}
private ActionListener getNewFilterRuleAction()
{
return new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
Filter filter;
FilterRule newRule;
FilterRule selectedFilterRule;
filter = getSelectedFilter();
if (filter == null)
{
return;
}
newRule = new FilterRule("Untitled", FilterRule.Rule.excludes, "",
true);
selectedFilterRule = getSelectedFilterRule();
if (selectedFilterRule != null)
{
newRule.setDescription(selectedFilterRule.getDescription());
newRule.setRule(selectedFilterRule.getRule());
filter.insertRule(selectedFilterRule, newRule);
}
else
{
filter.addRule(newRule);
}
filterRuleTableModel.fireTableDataChanged();
}
};
}
private ActionListener getDeleteFilterRuleAction()
{
return new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
Filter filter;
FilterRule rule;
filter = getSelectedFilter();
if (filter == null)
{
return;
}
rule = getSelectedFilterRule();
if (rule == null)
{
return;
}
filter.removeRule(rule);
filterRuleTableModel.fireTableDataChanged();
}
};
}
public void configurationChanged()
{
initConfiguration();
}
private void initConfiguration()
{
}
private class FilterTableModel
extends JMTableModel
{
Column nameColumn;
FilterTableModel()
{
nameColumn = addColumn("name", null, "Name", String.class, -1, true);
}
public int getRowCount()
{
return getFilterSettings().getFilters().size();
}
public void setValueAt(
Object value,
int rowIndex,
Column column)
{
Filter filter;
filter = getFilter(rowIndex);
if (filter != null)
{
if (column == nameColumn)
{
filter.setName((String) value);
}
}
}
public Object getValueAt(
int rowIndex,
Column column)
{
Filter filter;
filter = getFilter(rowIndex);
if (filter != null)
{
if (column == nameColumn)
{
return filter.getName();
}
}
return "";
}
private Filter getFilter(int rowIndex)
{
return getFilters().get(rowIndex);
}
}
private class FilterRuleTableModel
extends JMTableModel
{
private int filterIndex;
private Column activeColumn;
private Column descriptionColumn;
private Column ruleColumn;
private Column patternColumn;
public FilterRuleTableModel(int filterIndex)
{
this.filterIndex = filterIndex;
init();
}
private void init()
{
activeColumn = addColumn("active", null, "Active", Boolean.class, 5, true);
descriptionColumn = addColumn("description", null, "Description",
String.class, 15, true);
ruleColumn = addColumn("rule", null, "Rule", FilterRule.Rule.class, 10,
true);
patternColumn = addColumn("pattern", null, "Pattern", String.class, -1,
true);
}
public int getRowCount()
{
return getRules(filterIndex).size();
}
public void setValueAt(
Object value,
int rowIndex,
Column column)
{
FilterRule rule;
rule = getRule(rowIndex);
if (rule != null)
{
if (column == activeColumn)
{
rule.setActive((Boolean) value);
}
if (column == descriptionColumn)
{
rule.setDescription((String) value);
}
if (column == ruleColumn)
{
rule.setRule((FilterRule.Rule) value);
fireTableCellUpdated(
rowIndex,
column.getColumnIndex());
}
if (column == patternColumn)
{
if (value instanceof Filter)
{
value = ((Filter) value).getName();
}
rule.setPattern((String) value);
}
}
}
public Object getValueAt(
int rowIndex,
Column column)
{
FilterRule rule;
rule = getRule(rowIndex);
if (rule != null)
{
if (column == activeColumn)
{
return rule.isActive();
}
if (column == descriptionColumn)
{
return rule.getDescription();
}
if (column == ruleColumn)
{
return rule.getRule();
}
if (column == patternColumn)
{
if (rule.getRule() == FilterRule.Rule.importFilter)
{
return getFilterSettings().getFilter(rule.getPattern());
}
return rule.getPattern();
}
}
return "??";
}
public Class getColumnClass(
int rowIndex,
Column column)
{
FilterRule rule;
if (column == patternColumn)
{
rule = getRule(rowIndex);
if (rule != null && rule.getRule() == FilterRule.Rule.importFilter)
{
return Filter.class;
}
}
return null;
}
private FilterRule getRule(int rowIndex)
{
return getRules(filterIndex).get(rowIndex);
}
}
private Filter getSelectedFilter()
{
int rowIndex;
rowIndex = filterTable.getSelectedRow();
if (rowIndex < 0 || rowIndex > getFilters().size())
{
return null;
}
return getFilters().get(rowIndex);
}
private FilterRule getSelectedFilterRule()
{
Filter filter;
int rowIndex;
filter = getSelectedFilter();
if (filter == null)
{
return null;
}
rowIndex = filterRuleTable.getSelectedRow();
if (rowIndex < 0 || rowIndex > filter.getRules().size())
{
return null;
}
return filter.getRules().get(rowIndex);
}
private List<FilterRule> getRules(int filterIndex)
{
int size;
size = getFilters().size();
if (filterIndex < 0 || filterIndex >= size)
{
return Collections.emptyList();
}
return getFilters().get(filterIndex).getRules();
}
private List<Filter> getFilters()
{
return getFilterSettings().getFilters();
}
private FilterSettings getFilterSettings()
{
return JMeldSettings.getInstance().getFilter();
}
}