/* BookFilterListPanel.java created 2008-03-04 * */ package org.signalml.app.view.book.filter; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.log4j.Logger; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.util.IconUtils; import org.signalml.app.view.TablePopupMenuProvider; import org.signalml.app.view.common.dialogs.AbstractPresetDialog; import org.signalml.domain.book.filter.AbstractAtomFilter; import org.signalml.domain.book.filter.AtomFilterChain; import org.signalml.domain.book.filter.DelegatingAtomFilter; import org.signalml.domain.book.filter.ParameterRangeAtomFilter; import org.signalml.domain.book.filter.TagBasedAtomFilter; import org.signalml.exception.SanityCheckException; import org.springframework.validation.Errors; /** BookFilterListPanel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class BookFilterTablePanel extends JPanel { private static final long serialVersionUID = 1L; protected static final Logger logger = Logger.getLogger(BookFilterTablePanel.class); private ParameterRangeFilterDialog parameterFilterDialog; private TagBasedFilterDialog tagBasedFilterDialog; private DelegatingFilterDialog delegatingFilterDialog; private AtomFilterChainTableModel tableModel; private AtomFilterChainTable table; private JScrollPane scrollPane; private AddParameterFilterAction addParameterFilterAction; private AddTagBasedFilterAction addTagBasedFilterAction; private AddDelegatingFilterAction addDelegatingFilterAction; private EditFilterAction editFilterAction; private RemoveFilterAction removeFilterAction; private JButton editFilterButton; private JButton removeFilterButton; private JButton addParameterFilterButton; private JButton addTagBasedFilterButton; private JButton addDelegatingFilterButton; private AtomFilterChain chain; private AbstractPresetDialog container; public BookFilterTablePanel(AbstractPresetDialog container) { super(); this.container = container; addParameterFilterAction = new AddParameterFilterAction(); addTagBasedFilterAction = new AddTagBasedFilterAction(); addDelegatingFilterAction = new AddDelegatingFilterAction(); editFilterAction = new EditFilterAction(); removeFilterAction = new RemoveFilterAction(); initialize(); } private void initialize() { setLayout(new BorderLayout(5,5)); setBorder(new CompoundBorder( new TitledBorder(_("Filter list")), new EmptyBorder(3,3,3,3) )); JPanel rightPanel = new JPanel(new BorderLayout()); JPanel topButtonPanel = new JPanel(new GridLayout(2,1,3,3)); topButtonPanel.add(getEditFilterButton()); topButtonPanel.add(getRemoveFilterButton()); rightPanel.add(topButtonPanel, BorderLayout.NORTH); rightPanel.add(Box.createVerticalGlue(), BorderLayout.CENTER); JPanel bottomPanel = new JPanel(new GridLayout(1,3,3,3)); bottomPanel.add(getAddParameterFilterButton()); bottomPanel.add(getAddTagBasedFilterButton()); bottomPanel.add(getAddDelegatingFilterButton()); JPanel leftPanel = new JPanel(new BorderLayout(5,5)); leftPanel.add(getScrollPane(), BorderLayout.CENTER); leftPanel.add(bottomPanel, BorderLayout.SOUTH); add(leftPanel, BorderLayout.CENTER); add(rightPanel, BorderLayout.EAST); } public AtomFilterChainTableModel getTableModel() { if (tableModel == null) { tableModel = new AtomFilterChainTableModel(); } return tableModel; } public AtomFilterChainTable getTable() { if (table == null) { table = new AtomFilterChainTable(getTableModel()); table.addMouseListener(new FiltersTableMouseHandler()); table.setPopupMenuProvider(new FiltersTablePopupProvider()); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { boolean selected = (table.getSelectedRow() >= 0); editFilterAction.setEnabled(selected); removeFilterAction.setEnabled(selected); } }); } return table; } public JScrollPane getScrollPane() { if (scrollPane == null) { scrollPane = new JScrollPane(getTable()); scrollPane.setPreferredSize(new Dimension(600,300)); } return scrollPane; } public JButton getAddParameterFilterButton() { if (addParameterFilterButton == null) { addParameterFilterButton = new JButton(addParameterFilterAction); } return addParameterFilterButton; } public JButton getAddTagBasedFilterButton() { if (addTagBasedFilterButton == null) { addTagBasedFilterButton = new JButton(addTagBasedFilterAction); } return addTagBasedFilterButton; } public JButton getAddDelegatingFilterButton() { if (addDelegatingFilterButton == null) { addDelegatingFilterButton = new JButton(addDelegatingFilterAction); } return addDelegatingFilterButton; } public JButton getEditFilterButton() { if (editFilterButton == null) { editFilterButton = new JButton(editFilterAction); } return editFilterButton; } public JButton getRemoveFilterButton() { if (removeFilterButton == null) { removeFilterButton = new JButton(removeFilterAction); } return removeFilterButton; } public void fillPanelFromModel(AtomFilterChain chain) { this.chain = chain; getTableModel().setChain(chain); getTable().clearSelection(); } public void fillModelFromPanel(AtomFilterChain chain) { // nothing to do } public void validatePanel(ValidationErrors errors) { // nothing to do } public ParameterRangeFilterDialog getParameterFilterDialog() { return parameterFilterDialog; } public void setParameterFilterDialog(ParameterRangeFilterDialog parameterFilterDialog) { this.parameterFilterDialog = parameterFilterDialog; } public TagBasedFilterDialog getTagBasedFilterDialog() { return tagBasedFilterDialog; } public void setTagBasedFilterDialog(TagBasedFilterDialog tagBasedFilterDialog) { this.tagBasedFilterDialog = tagBasedFilterDialog; } public DelegatingFilterDialog getDelegatingFilterDialog() { return delegatingFilterDialog; } public void setDelegatingFilterDialog(DelegatingFilterDialog delegatingFilterDialog) { this.delegatingFilterDialog = delegatingFilterDialog; } protected class AddParameterFilterAction extends AbstractAction { private static final long serialVersionUID = 1L; public AddParameterFilterAction() { super(_("Add parameter filter")); putValue(AbstractAction.SHORT_DESCRIPTION, _("Add a filter that filters based on parameter ranges")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/addparameterfilter.png")); } public void actionPerformed(ActionEvent ev) { if (chain == null) { return; } ParameterRangeAtomFilter filter = new ParameterRangeAtomFilter(); filter.setName(_("New parameter range filter")); boolean ok = getParameterFilterDialog().showDialog(filter, true); if (!ok) { return; } filter.setEnabled(true); int index = chain.addFilter(filter); getTableModel().onInsert(index); } } protected class AddTagBasedFilterAction extends AbstractAction { private static final long serialVersionUID = 1L; public AddTagBasedFilterAction() { super(_("Add tag based filter")); putValue(AbstractAction.SHORT_DESCRIPTION, _("Add a filter that filters based on a signal tag")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/addtagbasedfilter.png")); } public void actionPerformed(ActionEvent ev) { if (chain == null) { return; } TagBasedAtomFilter filter = new TagBasedAtomFilter(); filter.setName(_("New tag based filter")); boolean ok = getTagBasedFilterDialog().showDialog(filter, true); if (!ok) { return; } filter.setEnabled(true); int index = chain.addFilter(filter); getTableModel().onInsert(index); } } protected class AddDelegatingFilterAction extends AbstractAction { private static final long serialVersionUID = 1L; public AddDelegatingFilterAction() { super(_("Add custom filter")); putValue(AbstractAction.SHORT_DESCRIPTION, _("Add a filter that uses a custom class to determine matching atoms")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/adddelegatingfilter.png")); } public void actionPerformed(ActionEvent ev) { if (chain == null) { return; } DelegatingAtomFilter filter = new DelegatingAtomFilter(); filter.setName(_("New custom filter")); boolean ok = getDelegatingFilterDialog().showDialog(filter, true); if (!ok) { return; } filter.setEnabled(true); int index = chain.addFilter(filter); getTableModel().onInsert(index); } } protected class EditFilterAction extends AbstractAction { private static final long serialVersionUID = 1L; public EditFilterAction() { super(_("Configure")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/editfilter.png")); setEnabled(false); } public void actionPerformed(ActionEvent ev) { if (chain == null) { return; } int selectedRow = getTable().getSelectedRow(); if (selectedRow < 0) { return; } AbstractAtomFilter filter = chain.getFilterAt(selectedRow); if (filter instanceof ParameterRangeAtomFilter) { boolean ok = getParameterFilterDialog().showDialog(filter, true); if (!ok) { return; } } else if (filter instanceof TagBasedAtomFilter) { boolean ok = getTagBasedFilterDialog().showDialog(filter, true); if (!ok) { return; } } else if (filter instanceof DelegatingAtomFilter) { boolean ok = getDelegatingFilterDialog().showDialog(filter, true); if (!ok) { return; } } else { throw new SanityCheckException("Unsupported filter type [" + filter.getClass().getName() + "]"); } getTableModel().onUpdate(selectedRow); } } protected class RemoveFilterAction extends AbstractAction { private static final long serialVersionUID = 1L; public RemoveFilterAction() { super(_("Remove")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/removefilter.png")); setEnabled(false); } public void actionPerformed(ActionEvent ev) { if (chain == null) { return; } int selectedRow = getTable().getSelectedRow(); if (selectedRow < 0) { return; } chain.removeFilterAt(selectedRow); getTableModel().onDelete(selectedRow); } } protected class FiltersTablePopupProvider implements TablePopupMenuProvider { private JPopupMenu popupMenu; @Override public JPopupMenu getPopupMenu(int col, int row) { return getDefaultPopupMenu(); } @Override public JPopupMenu getPopupMenu() { return getPopupMenu(-1,-1); } private JPopupMenu getDefaultPopupMenu() { if (popupMenu == null) { popupMenu = new JPopupMenu(); popupMenu.add(editFilterAction); popupMenu.addSeparator(); popupMenu.add(removeFilterAction); } return popupMenu; } } protected class FiltersTableMouseHandler extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { AtomFilterChainTable table = (AtomFilterChainTable) e.getSource(); if (SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() % 2) == 0) { int selRow = table.rowAtPoint(e.getPoint()); if (selRow >= 0) { editFilterAction.actionPerformed(new ActionEvent(table,0,"edit")); } } } } }