All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.datacleaner.widgets.DCComboBox Maven / Gradle / Ivy

/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Free Software Foundation, Inc.
 *
 * 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.widgets;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.datacleaner.util.LookAndFeelManager;

/**
 * Defines a common combobox class that has a more convenient listening
 * mechanism (the JComboBox can be quite confusing because of the cycle of
 * {@link ActionListener}s and {@link ItemListener}s).
 *
 * @param 
 *            the type of element in the combo
 */
public class DCComboBox extends JComboBox implements ItemListener {

    public interface Listener {
        void onItemSelected(E item);
    }

    private static final long serialVersionUID = 1L;
    private final List> _listeners = new ArrayList<>();

    public DCComboBox() {
        this(new DefaultComboBoxModel<>());
    }

    public DCComboBox(final Collection items) {
        this(new DefaultComboBoxModel<>(new Vector<>(items)));
    }

    public DCComboBox(final E[] items) {
        this(new DefaultComboBoxModel<>(items));
    }

    public DCComboBox(final ComboBoxModel model) {
        super(model);
        super.addItemListener(this);
    }

    @SuppressWarnings("unchecked")
    @Override
    public E getSelectedItem() {
        return (E) super.getSelectedItem();
    }

    @Override
    public void setSelectedItem(final Object newItem) {
        final E previousItem = getSelectedItem();
        if (previousItem == newItem) {
            return;
        }

        @SuppressWarnings("unchecked") final E item = (E) newItem;

        // super.setSelectedItem(...) will notify all listeners (through of the
        // item listener)
        super.setSelectedItem(item);
    }

    public void addListener(final Listener listener) {
        _listeners.add(listener);
    }

    public void removeListener(final Listener listener) {
        _listeners.remove(listener);
    }

    /**
     * @deprecated use {@link #addListener(Listener)} instead
     */
    @Deprecated
    @Override
    public void addItemListener(final ItemListener newListener) {
        super.addItemListener(newListener);
    }

    /**
     * @deprecated use {@link #addListener(Listener)} instead
     */
    @Deprecated
    @Override
    public void addActionListener(final ActionListener listener) {
        super.addActionListener(listener);
    }

    @Override
    public void itemStateChanged(final ItemEvent e) {
        final int stateChange = e.getStateChange();
        if (stateChange == ItemEvent.SELECTED) {
            @SuppressWarnings("unchecked") final E newItem = (E) e.getItem();
            notifyListeners(newItem);
        } else if (stateChange == ItemEvent.DESELECTED && getSelectedItem() == null) {
            // special case of selecting a "null" value. Even though "null" can
            // be added to the model of a combo, it does not get a SELECTED
            // event when chosen.
            notifyListeners(null);
        }
    }

    public void notifyListeners() {
        notifyListeners(getSelectedItem());
    }

    private void notifyListeners(final E item) {
        // notify listeners
        for (final Listener listener : _listeners) {
            listener.onItemSelected(item);
        }
    }

    public boolean containsItem(final E item) {
        final int itemCount = getItemCount();
        for (int i = 0; i < itemCount; i++) {
            final Object anItem = getItemAt(i);
            if (anItem == null) {
                if (item == null) {
                    return true;
                }
            } else if (anItem.equals(item)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public String toString() {
        return "DCComboBox[items=" + getItemCount() + ", selected=" + getSelectedItem() + "]";
    }

    public static void main(final String[] args) {
        LookAndFeelManager.get().init();
        final JPanel comboPanel = new JPanel();
        comboPanel.setLayout(new BorderLayout());
        comboPanel.add(new DCComboBox<>(new String[] { "a", "b", "c" }), BorderLayout.NORTH);

        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(640, 480));
        frame.add(comboPanel, BorderLayout.PAGE_START);

        frame.pack();
        frame.setVisible(true);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy