/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.studio.controls;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashSet;
import javax.swing.JComboBox;
/**
* A combo box which is editable by default and which defines a listener that
* listens for any change what-so-ever.,
*
* @author Phil
*
* @param <T>
*/
public class EditableComboBox<T> extends JComboBox<T> {
private HashSet<ValueChangedListener<T>> listeners = new HashSet<>();
public EditableComboBox() {
setEditable(true);
addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
fireChangedListeners();
}
});
getEditor().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireChangedListeners();
}
});
getEditor().getEditorComponent().addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
fireChangedListeners();
}
@Override
public void keyReleased(KeyEvent e) {
fireChangedListeners();
}
@Override
public void keyPressed(KeyEvent e) {
fireChangedListeners();
}
});
}
public static interface ValueChangedListener <T>{
void comboValueChanged(T newValue);
}
private void fireChangedListeners() {
for (ValueChangedListener<T> listener : listeners) {
listener.comboValueChanged((T) getValue());
}
}
@SuppressWarnings("unchecked")
public T getValue() {
return (T)getEditor().getItem();
}
public void addValueChangedListener(ValueChangedListener<T> valueChangedListener) {
listeners.add(valueChangedListener);
}
}