/**
* DataCleaner (community edition)
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.datacleaner.panels;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Image;
import java.util.Set;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import org.datacleaner.actions.DisplayOptionsForFilterOutcomeActionListener;
import org.datacleaner.api.Filter;
import org.datacleaner.bootstrap.WindowContext;
import org.datacleaner.job.builder.FilterChangeListener;
import org.datacleaner.job.builder.FilterComponentBuilder;
import org.datacleaner.util.IconUtils;
import org.datacleaner.util.ImageManager;
import org.datacleaner.util.WidgetFactory;
import org.datacleaner.widgets.Alignment;
import org.datacleaner.widgets.ChangeRequirementMenuBuilder;
import org.datacleaner.widgets.DCLabel;
import org.datacleaner.widgets.PopupButton;
import org.datacleaner.widgets.properties.FormPanel;
import org.datacleaner.widgets.properties.PropertyWidgetFactory;
/**
* Specialization of {@link AbstractComponentBuilderPanel} for {@link Filter}s.
*/
public class FilterComponentBuilderPanel extends AbstractComponentBuilderPanel
implements FilterComponentBuilderPresenter, FilterChangeListener {
private static final long serialVersionUID = 1L;
private static final ImageManager imageManager = ImageManager.get();
private final FilterComponentBuilder<?, ?> _filterComponentBuilder;
private final DCPanel _outcomePanel;
public FilterComponentBuilderPanel(final FilterComponentBuilder<?, ?> filterJobBuilder,
final WindowContext windowContext, final PropertyWidgetFactory propertyWidgetFactory) {
this(null, 95, 95, filterJobBuilder, windowContext, propertyWidgetFactory);
}
protected FilterComponentBuilderPanel(final Image watermarkImage, final int watermarkHorizontalPosition,
final int watermarkVerticalPosition, final FilterComponentBuilder<?, ?> filterComponentBuilder,
final WindowContext windowContext, final PropertyWidgetFactory propertyWidgetFactory) {
super(watermarkImage, watermarkHorizontalPosition, watermarkVerticalPosition, filterComponentBuilder,
propertyWidgetFactory);
_filterComponentBuilder = filterComponentBuilder;
_outcomePanel = new DCPanel();
_outcomePanel.setLayout(new FlowLayout(Alignment.LEFT.getFlowLayoutAlignment(), 0, 0));
final Set<String> categoryNames = _filterComponentBuilder.getDescriptor().getOutcomeCategoryNames();
for (final String categoryName : categoryNames) {
final PopupButton outcomeButton =
WidgetFactory.createDefaultPopupButton(categoryName, IconUtils.FILTER_OUTCOME_PATH);
outcomeButton.addActionListener(
new DisplayOptionsForFilterOutcomeActionListener(outcomeButton, _filterComponentBuilder,
categoryName));
_outcomePanel.add(outcomeButton);
_outcomePanel.add(Box.createHorizontalStrut(4));
}
final JButton helpButton = WidgetFactory.createSmallButton(IconUtils.ACTION_HELP);
helpButton.addActionListener(e -> {
final DCPanel messagePanel = new DCPanel();
messagePanel.setLayout(new BorderLayout());
messagePanel.add(new JLabel(imageManager.getImageIcon("images/help/help_requirement_mapping.png")),
BorderLayout.WEST);
messagePanel.add(DCLabel.darkMultiLine(
"Filter outcomes can be set as requirements<br>" + "for other components, using the<br>" + "\""
+ ChangeRequirementMenuBuilder.NO_REQUIREMENT_TEXT + "\" buttons.<br><br>"
+ "You can also click the categories directly to eg.<br>"
+ "write categorized records or to map them<br>"
+ "as requirements for existing or new components."));
JOptionPane.showMessageDialog(FilterComponentBuilderPanel.this, messagePanel,
"Help: Filter categories / outcomes", JOptionPane.PLAIN_MESSAGE);
});
_outcomePanel.add(helpButton);
}
@Override
public void addNotify() {
super.addNotify();
_filterComponentBuilder.addChangeListener(this);
}
@Override
public void removeNotify() {
super.removeNotify();
_filterComponentBuilder.removeChangeListener(this);
}
protected JComponent decorateMainPanel(final DCPanel panel) {
final JComponent result = super.decorateMainPanel(panel);
final FormPanel outcomeFormPanel = new FormPanel();
outcomeFormPanel.addFormEntry("This filter categorizes records as", null, _outcomePanel);
addTaskPane(IconUtils.FILTER_OUTCOME_PATH, "Outcomes", outcomeFormPanel);
return result;
}
@Override
public FilterComponentBuilder<?, ?> getComponentBuilder() {
return _filterComponentBuilder;
}
@Override
public void onAdd(final FilterComponentBuilder<?, ?> fjb) {
}
@Override
public void onConfigurationChanged(final FilterComponentBuilder<?, ?> fjb) {
onConfigurationChanged();
}
@Override
public void onRemove(final FilterComponentBuilder<?, ?> fjb) {
}
@Override
public void onRequirementChanged(final FilterComponentBuilder<?, ?> filterJobBuilder) {
}
}