/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * 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 * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.new_plotter.gui.groupingpanel; import com.rapidminer.gui.new_plotter.configuration.DimensionConfig; import com.rapidminer.gui.new_plotter.configuration.DimensionConfig.PlotDimension; import com.rapidminer.gui.new_plotter.configuration.EquidistantFixedBinCountBinning; import com.rapidminer.gui.new_plotter.configuration.ValueGrouping; import com.rapidminer.gui.new_plotter.configuration.ValueGrouping.GroupingType; import com.rapidminer.gui.new_plotter.data.PlotInstance; import com.rapidminer.gui.new_plotter.utility.DataStructureUtils; import com.rapidminer.gui.tools.ResourceLabel; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * A configuration Panel for {@link EquidistantFixedBinCountBinning}s. * * @author Nils Woehler * */ public class EquidistantFixedBinCountCardPanel extends AbstractGroupingCardPanel { private static final long serialVersionUID = 1L; private JCheckBox autoRangeCheckBox; private JLabel upperBoundLabel; private JSpinner upperBoundSpinner; private JLabel lowerBoundLabel; private JSpinner lowerBoundSpinner; private JSpinner binCountSpinner; private boolean changingAutoRange; public EquidistantFixedBinCountCardPanel(final PlotInstance plotInstance, final PlotDimension dimension) { super(plotInstance, dimension); adaptGUI(); } @Override protected void createComponents() { super.createComponents(); { final JLabel binCountLabel = new ResourceLabel("plotter.configuration_dialog.bin_count"); // create input text field binCountSpinner = new JSpinner(new SpinnerNumberModel(5, 1, null, 1)); binCountLabel.setLabelFor(binCountSpinner); binCountSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(final ChangeEvent e) { binCountChanged(); } }); addTwoComponentRow(this, binCountLabel, binCountSpinner); } // add auto range selection { final JLabel autoRangeLabel = new ResourceLabel("plotter.configuration_dialog.auto_range"); autoRangeCheckBox = new JCheckBox(); autoRangeLabel.setLabelFor(autoRangeCheckBox); autoRangeCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { autoRangeChanged(); } }); addTwoComponentRow(this, autoRangeLabel, autoRangeCheckBox); } // add upper bound spinner { upperBoundLabel = new ResourceLabel("plotter.configuration_dialog.upper_bound"); upperBoundSpinner = new JSpinner(new SpinnerNumberModel(10.1, null, null, 0.1)); upperBoundLabel.setLabelFor(upperBoundSpinner); upperBoundSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(final ChangeEvent e) { upperBoundChanged(); } }); addTwoComponentRow(this, upperBoundLabel, upperBoundSpinner); } // add lower bound spinner { lowerBoundLabel = new ResourceLabel("plotter.configuration_dialog.lower_bound"); lowerBoundSpinner = new JSpinner(new SpinnerNumberModel(0.1, null, null, 0.1)); lowerBoundLabel.setLabelFor(lowerBoundSpinner); lowerBoundSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(final ChangeEvent e) { lowerBoundChanged(); } }); addTwoComponentRow(this, lowerBoundLabel, lowerBoundSpinner); } final JPanel spacerPanel = new JPanel(); final GridBagConstraints itemConstraint = new GridBagConstraints(); itemConstraint.fill = GridBagConstraints.BOTH; itemConstraint.weightx = 1; itemConstraint.weighty = 1; itemConstraint.gridwidth = GridBagConstraints.REMAINDER; this.add(spacerPanel, itemConstraint); } private void binCountChanged() { final DimensionConfig dimensionConfig = getPlotConfiguration().getDimensionConfig(getDimension()); if (dimensionConfig != null) { final EquidistantFixedBinCountBinning grouping = (EquidistantFixedBinCountBinning) dimensionConfig.getGrouping(); if (grouping != null) { final int oldBinCount = grouping.getBinCount(); final int newBinCount = (Integer) binCountSpinner.getValue(); if (oldBinCount != newBinCount) { grouping.setBinCount(newBinCount); } } } } protected void upperBoundChanged() { final DimensionConfig dimensionConfig = getPlotConfiguration().getDimensionConfig(getDimension()); if (dimensionConfig != null) { final EquidistantFixedBinCountBinning grouping = (EquidistantFixedBinCountBinning) dimensionConfig.getGrouping(); if (grouping != null) { final double oldUpperBound = grouping.getMaxValue(); final double newUpperBound = (Double) upperBoundSpinner.getValue(); if (oldUpperBound != newUpperBound) { final double currentLowerBound = (Double) lowerBoundSpinner.getValue(); if (DataStructureUtils.almostEqual(currentLowerBound, newUpperBound, 1E-6) || newUpperBound <= currentLowerBound) { upperBoundSpinner.setValue(oldUpperBound); return; } if (!changingAutoRange) { grouping.setMaxValue(newUpperBound); } } } } } protected void lowerBoundChanged() { final DimensionConfig dimensionConfig = getPlotConfiguration().getDimensionConfig(getDimension()); if (dimensionConfig != null) { final EquidistantFixedBinCountBinning grouping = (EquidistantFixedBinCountBinning) dimensionConfig.getGrouping(); if (grouping != null) { final double oldLowerBound = grouping.getMinValue(); final double newLowerBound = (Double) lowerBoundSpinner.getValue(); if (oldLowerBound != newLowerBound) { final double currentUpperBound = (Double) upperBoundSpinner.getValue(); if (DataStructureUtils.almostEqual(currentUpperBound, newLowerBound, 1E-6) || currentUpperBound <= newLowerBound) { lowerBoundSpinner.setValue(oldLowerBound); return; } if (!changingAutoRange) { grouping.setMinValue(newLowerBound); } } } } } private void autoRangeChanged() { final DimensionConfig dimensionConfig = getPlotConfiguration().getDimensionConfig(getDimension()); if (dimensionConfig != null) { final EquidistantFixedBinCountBinning grouping = (EquidistantFixedBinCountBinning) dimensionConfig.getGrouping(); if (grouping != null) { final boolean selected = autoRangeCheckBox.isSelected(); final boolean autoRanging = grouping.isAutoRanging(); if (selected != autoRanging) { changingAutoRange = true; grouping.setAutoRange(selected); } } } } @Override protected void adaptGUI() { super.adaptGUI(); final DimensionConfig dimensionConfig = getPlotConfiguration().getDimensionConfig(getDimension()); if (dimensionConfig != null) { final ValueGrouping grouping = dimensionConfig.getGrouping(); if (grouping != null && grouping.getGroupingType() == GroupingType.EQUIDISTANT_FIXED_BIN_COUNT) { final EquidistantFixedBinCountBinning equidistantFixedBinCountBinning = (EquidistantFixedBinCountBinning) grouping; binCountSpinner.setValue(equidistantFixedBinCountBinning.getBinCount()); upperBoundSpinner.setValue(equidistantFixedBinCountBinning.getMaxValue()); lowerBoundSpinner.setValue(equidistantFixedBinCountBinning.getMinValue()); final boolean autoRanging = equidistantFixedBinCountBinning.isAutoRanging(); autoRangeCheckBox.setSelected(autoRanging); lowerBoundLabel.setEnabled(!autoRanging); lowerBoundSpinner.setEnabled(!autoRanging); upperBoundLabel.setEnabled(!autoRanging); upperBoundSpinner.setEnabled(!autoRanging); if (changingAutoRange) { changingAutoRange = false; } } } } }