/*
* Copyright 2013 Serdar.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.fub.maps.project.aggregator.factories.nodes.properties;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyEditor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import org.openide.explorer.propertysheet.InplaceEditor;
import org.openide.explorer.propertysheet.PropertyEnv;
import org.openide.explorer.propertysheet.PropertyModel;
import org.openide.util.Lookup;
/**
*
* @author Serdar
*/
public class InterfaceInplaceEditor implements InplaceEditor {
private final JComboBox<ClassWrapper> comboBox = new JComboBox<ClassWrapper>();
private PropertyEditor editor = null;
private PropertyModel model;
private final Class<?> clazz;
private final Set<ActionListener> actionListenerSet = Collections.synchronizedSet(new HashSet<ActionListener>());
public InterfaceInplaceEditor(Class<?> clazz) {
assert clazz != null && clazz.isInterface();
this.clazz = clazz;
comboBox.removeAllItems();
Lookup.Result<?> lookupResult = Lookup.getDefault().lookupResult(this.clazz);
ArrayList<Class<?>> list = new ArrayList<Class<?>>();
for (Class<?> c : lookupResult.allClasses()) {
list.add(c);
}
Collections.sort(list, new ClassComparator());
for (Class<?> c : list) {
comboBox.addItem(new ClassWrapper(c));
}
if (comboBox.getItemCount() > - 1) {
comboBox.setSelectedIndex(0);
}
comboBox.setForeground(Color.BLACK);
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (ActionListener listener : actionListenerSet) {
listener.actionPerformed(e);
}
}
});
}
JComboBox<ClassWrapper> getComboBox() {
return comboBox;
}
@Override
public void connect(PropertyEditor propertyEditor, PropertyEnv env) {
editor = propertyEditor;
reset();
}
@Override
public JComponent getComponent() {
return comboBox;
}
@Override
public void clear() {
editor = null;
model = null;
}
@Override
public Object getValue() {
// comboBox.repaint();
// comboBox.updateUI();
// ((JComponent) comboBox.getParent()).requestFocus();
Object selectedItem = comboBox.getSelectedItem();
return selectedItem;
}
@Override
public void setValue(Object object) {
comboBox.setSelectedItem(object);
comboBox.repaint();
editor.setValue(comboBox.getSelectedItem());
((JComponent) comboBox.getParent()).requestFocus();
}
@Override
public boolean supportsTextEntry() {
return false;
}
@SuppressWarnings("unchecked")
@Override
public void reset() {
Object value = editor.getValue();
if (value instanceof ClassWrapper) {
comboBox.setSelectedItem(value);
}
comboBox.repaint();
}
@Override
public void addActionListener(ActionListener al) {
actionListenerSet.add(al);
}
@Override
public void removeActionListener(ActionListener al) {
actionListenerSet.remove(al);
}
@Override
public KeyStroke[] getKeyStrokes() {
return new KeyStroke[0];
}
@Override
public PropertyEditor getPropertyEditor() {
return editor;
}
@Override
public PropertyModel getPropertyModel() {
return model;
}
@Override
public void setPropertyModel(PropertyModel pm) {
this.model = pm;
}
@Override
public boolean isKnownComponent(Component component) {
return component == comboBox || comboBox.isAncestorOf(component);
}
private static class ClassComparator implements Comparator<Class<?>>, Serializable {
private static final long serialVersionUID = 1L;
public ClassComparator() {
}
@Override
public int compare(Class<?> o1, Class<?> o2) {
return o1.getSimpleName().compareTo(o2.getSimpleName());
}
}
}