package org.openstreetmap.josm.plugins.rasterfilters.gui; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.rmi.server.UID; import java.util.HashSet; import java.util.Set; import javax.swing.ComboBoxModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.bric.swing.ColorPicker; import org.openstreetmap.josm.plugins.rasterfilters.model.FilterStateModel; import org.openstreetmap.josm.plugins.rasterfilters.model.StateChangeListener; import org.openstreetmap.josm.plugins.rasterfilters.values.BooleanValue; import org.openstreetmap.josm.plugins.rasterfilters.values.ColorValue; import org.openstreetmap.josm.plugins.rasterfilters.values.SelectValue; import org.openstreetmap.josm.plugins.rasterfilters.values.SliderValue; /** * This class is GUI listener which tracks all changes of GUI controls * elements: sliders, checkboxes, color pickers and select lists. * * @author Nipel-Crumple */ public class FilterGuiListener implements ChangeListener, ItemListener, ActionListener, PropertyChangeListener, FilterStateOwner { private StateChangeListener handler; private FilterStateModel filterState; private Set<ComboBoxModel<String>> models = new HashSet<>(); private UID filterId; public FilterGuiListener(StateChangeListener handler) { this.handler = handler; } public void setFilterState(FilterStateModel state) { this.filterState = state; } /** * Listener which responds on any changes of sliders values. */ @Override public void stateChanged(ChangeEvent e) { JSlider slider = (JSlider) e.getSource(); if (!slider.getValueIsAdjusting()) { slider.setToolTipText(String.valueOf((double) slider.getValue() / 100)); } String parameterName = slider.getName(); if (filterState.getParams().containsKey(parameterName)) { @SuppressWarnings("unchecked") SliderValue<Number> value = (SliderValue<Number>) filterState .getParams().get(parameterName); if (value.isDouble()) { value.setValue((double) slider.getValue() / 100); } else { value.setValue(slider.getValue()); } filterState.getParams().put(parameterName, value); } // notifies about state is changed now and sends msg to FiltersManager handler.filterStateChanged(filterId, filterState); } @Override public FilterStateModel getState() { return filterState; } public ComboBoxModel<String> addModel(ComboBoxModel<String> model) { models.add(model); return model; } public void setFilterId(UID filterId) { this.filterId = filterId; } public UID getFilterId() { return filterId; } /** * Method reacts on changes of checkbox GUI elements. */ @Override public void itemStateChanged(ItemEvent e) { JCheckBox box = (JCheckBox) e.getSource(); String parameterName = box.getName(); BooleanValue value = (BooleanValue) filterState.getParams().get( parameterName); value.setValue(box.isSelected()); handler.filterStateChanged(filterId, filterState); } /** * Methods tracks all changes of select lists */ @SuppressWarnings("unchecked") @Override public void actionPerformed(ActionEvent e) { JComboBox<String> box = (JComboBox<String>) e.getSource(); String parameterName = box.getName(); SelectValue<String> value = (SelectValue<String>) filterState .getParams().get(parameterName); ComboBoxModel<String> model = box.getModel(); String selectedItem = (String) model.getSelectedItem(); value.setValue(selectedItem); // notify about state is changed now so send msg to FiltersManager if (handler != null) { handler.filterStateChanged(filterId, filterState); } } /** * This listener's method is for responding on some * color pick changes. */ @Override public void propertyChange(PropertyChangeEvent evt) { ColorPicker picker = (ColorPicker) evt.getSource(); int r = picker.getColor().getRed(); int g = picker.getColor().getGreen(); int b = picker.getColor().getBlue(); String parameterName = picker.getName(); @SuppressWarnings("unchecked") ColorValue<Color> value = (ColorValue<Color>) filterState.getParams() .get(parameterName); value.setValue(new Color(r, g, b)); handler.filterStateChanged(filterId, filterState); } }