/* BookFilterDialog.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.Component; import java.awt.GridLayout; import java.awt.Window; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.IOException; import java.net.URL; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import org.signalml.app.config.preset.Preset; import org.signalml.app.config.preset.managers.BookFilterPresetManager; import org.signalml.app.model.book.BookFilterDescriptor; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.util.IconUtils; import org.signalml.app.view.common.dialogs.AbstractPresetDialog; import org.signalml.domain.book.filter.AtomFilterChain; import org.signalml.plugin.export.SignalMLException; import org.springframework.core.io.ClassPathResource; import org.springframework.validation.BindException; import org.springframework.validation.Errors; /** BookFilterDialog * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class BookFilterDialog extends AbstractPresetDialog { private static final long serialVersionUID = 1L; private ParameterRangeFilterDialog parameterFilterDialog; private TagBasedFilterDialog tagBasedFilterDialog; private DelegatingFilterDialog delegatingFilterDialog; private JCheckBox filteringEnabledCheckBox; private ButtonGroup conditionButtonGroup; private JRadioButton alternativeRadioButton; private JRadioButton conjunctionRadioButton; private BookFilterTablePanel tablePanel; private AtomFilterChain currentChain; private URL contextHelpURL = null; public BookFilterDialog(BookFilterPresetManager presetManager, Window w, boolean isModal) { super(presetManager, w, isModal); } @Override protected void initialize() { setTitle(_("Edit book filter")); setIconImage(IconUtils.loadClassPathImage("org/signalml/app/icon/editbookfilter.png")); super.initialize(); } @Override protected URL getContextHelpURL() { if (contextHelpURL == null) { try { contextHelpURL = (new ClassPathResource("org/signalml/help/contents.html")).getURL(); contextHelpURL = new URL(contextHelpURL.toExternalForm() + "#bookFilter"); } catch (IOException ex) { logger.error("Failed to get help URL", ex); } } return contextHelpURL; } @Override public JComponent createInterface() { JPanel interfacePanel = new JPanel(new BorderLayout()); JPanel masterSwitchPanel = new JPanel(new BorderLayout(3,3)); masterSwitchPanel.setBorder(new CompoundBorder( new TitledBorder(_("Filtering master switch")), new EmptyBorder(3,3,3,3) )); JLabel filteringEnabledLabel = new JLabel(_("Enable book filtering")); masterSwitchPanel.add(filteringEnabledLabel, BorderLayout.CENTER); masterSwitchPanel.add(getFilteringEnabledCheckBox(), BorderLayout.EAST); JPanel conditionPanel = new JPanel(new GridLayout(1,2,3,3)); conditionPanel.setBorder(new CompoundBorder( new TitledBorder(_("Condition type")), new EmptyBorder(3,3,3,3) )); conditionPanel.add(getConjunctionRadioButton()); conditionPanel.add(getAlternativeRadioButton()); JPanel topPanel = new JPanel(new GridLayout(1,2,3,0)); topPanel.add(masterSwitchPanel); topPanel.add(conditionPanel); interfacePanel.add(topPanel, BorderLayout.NORTH); interfacePanel.add(getTablePanel(), BorderLayout.CENTER); return interfacePanel; } public BookFilterTablePanel getTablePanel() { if (tablePanel == null) { tablePanel = new BookFilterTablePanel(this); tablePanel.setParameterFilterDialog(getParameterFilterDialog()); tablePanel.setTagBasedFilterDialog(getTagBasedFilterDialog()); tablePanel.setDelegatingFilterDialog(getDelegatingFilterDialog()); } return tablePanel; } public JCheckBox getFilteringEnabledCheckBox() { if (filteringEnabledCheckBox == null) { filteringEnabledCheckBox = new JCheckBox(); filteringEnabledCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (currentChain != null) { boolean selected = getFilteringEnabledCheckBox().isSelected(); if (selected != currentChain.isFilteringEnabled()) { currentChain.setFilteringEnabled(selected); } } } }); } return filteringEnabledCheckBox; } public ButtonGroup getConditionButtonGroup() { if (conditionButtonGroup == null) { conditionButtonGroup = new ButtonGroup(); } return conditionButtonGroup; } public JRadioButton getConjunctionRadioButton() { if (conjunctionRadioButton == null) { conjunctionRadioButton = new JRadioButton(_("Satisfy all (AND)")); conjunctionRadioButton.setAlignmentX(Component.CENTER_ALIGNMENT); getConditionButtonGroup().add(conjunctionRadioButton); conjunctionRadioButton.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { if (currentChain.isAlternative()) { currentChain.setAlternative(false); } } } }); } return conjunctionRadioButton; } public JRadioButton getAlternativeRadioButton() { if (alternativeRadioButton == null) { alternativeRadioButton = new JRadioButton(_("Satisfy any (OR)")); alternativeRadioButton.setAlignmentX(Component.CENTER_ALIGNMENT); getConditionButtonGroup().add(alternativeRadioButton); alternativeRadioButton.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { if (!currentChain.isAlternative()) { currentChain.setAlternative(true); } } } }); } return alternativeRadioButton; } @Override public void fillDialogFromModel(Object model) throws SignalMLException { if (model instanceof AtomFilterChain) { // for presets currentChain = new AtomFilterChain((AtomFilterChain) model); } else { BookFilterDescriptor descriptor = (BookFilterDescriptor) model; currentChain = descriptor.getChain().duplicate(); } getTablePanel().fillPanelFromModel(currentChain); getFilteringEnabledCheckBox().setSelected(currentChain.isFilteringEnabled()); if (currentChain.isAlternative()) { getAlternativeRadioButton().setSelected(true); } else { getConjunctionRadioButton().setSelected(true); } } @Override public void fillModelFromDialog(Object model) throws SignalMLException { BookFilterDescriptor descriptor = (BookFilterDescriptor) model; // current chain was being edited in place getTablePanel().fillModelFromPanel(currentChain); descriptor.setChain(currentChain); } @Override public Preset getPreset() throws SignalMLException { AtomFilterChain preset = currentChain.duplicate(); ValidationErrors errors = new ValidationErrors(); validateDialog(preset, errors); if (errors.hasErrors()) { showValidationErrors(errors); return null; } return preset; } @Override public void setPreset(Preset preset) throws SignalMLException { fillDialogFromModel(preset); } @Override public void validateDialog(Object model, ValidationErrors errors) throws SignalMLException { super.validateDialog(model, errors); getTablePanel().validatePanel(errors); } @Override public boolean supportsModelClass(Class<?> clazz) { return BookFilterDescriptor.class.isAssignableFrom(clazz); } public ParameterRangeFilterDialog getParameterFilterDialog() { if (parameterFilterDialog == null) { parameterFilterDialog = new ParameterRangeFilterDialog(this,true); } return parameterFilterDialog; } public TagBasedFilterDialog getTagBasedFilterDialog() { if (tagBasedFilterDialog == null) { tagBasedFilterDialog = new TagBasedFilterDialog(this,true); tagBasedFilterDialog.setFileChooser(getFileChooser()); } return tagBasedFilterDialog; } public DelegatingFilterDialog getDelegatingFilterDialog() { if (delegatingFilterDialog == null) { delegatingFilterDialog = new DelegatingFilterDialog(this,true); delegatingFilterDialog.setFileChooser(getFileChooser()); } return delegatingFilterDialog; } }