/**
*
*/
package org.korsakow.ide.resources.widget;
import java.awt.Component;
import java.util.Collection;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.EventListenerList;
/**
* Basic implementation of EditorModelHandler.
* Takes care of such things that are unlikely to change (or are more likely to be just tweaked) in subclasses
* such as committing and reading properties, managing event listeners.
*
* Commonly only initializeEditor and formatProperty need to be overridden.
*
* @author d
*
*/
public abstract class DefaultPropertyHandler extends DefaultListCellRenderer implements EditorModelHandler
{
protected EventListenerList listenerList = new EventListenerList();
protected String editingName;
public void addEditorListener(CellEditorListener listener)
{
listenerList.add(CellEditorListener.class, listener);
}
public void removeEditorListener(CellEditorListener listener)
{
listenerList.remove(CellEditorListener.class, listener);
}
public void notifyEditingStopped()
{
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener listener : listenerList.getListeners(CellEditorListener.class))
listener.editingStopped(event);
}
public void notifyEditingCanceled()
{
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener listener : listenerList.getListeners(CellEditorListener.class))
listener.editingCanceled(event);
}
protected String formatProperty(String propertyName, Object propertyValue)
{
return propertyValue != null ? propertyValue.toString() : "";
}
public void commitProperty(Collection<? extends WidgetModel> widgets, String propertyName, Object value)
{
for (WidgetModel widget : widgets)
widget.setDynamicProperty(propertyName, value);
}
protected Object getCommonValue(Collection<? extends WidgetModel> widgets, String propertyName)
{
Object value = widgets.isEmpty()?null:widgets.iterator().next().getDynamicProperty(propertyName);
for (WidgetModel widget : widgets) {
Object o = widget.getDynamicProperty(propertyName);
if (value != null && !value.equals(o)) {
value = null;
break;
}
}
return value;
}
@Override
public void initializeEditor(Collection<? extends WidgetModel> widgets, final JComboBox editor, String propertyName) {
editingName = propertyName;
editor.setEditable(true);
Object value = getCommonValue(widgets, propertyName);
editor.getModel().setSelectedItem(value);
}
public Component getPropertyRenderer(String propertyName, Object propertyValue)
{
setIcon(null);
setText(formatProperty(propertyName, propertyValue));
return this;
}
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
value = formatProperty(editingName, value);
if (value != null && value.toString().length() == 0) // wierd combo rendering bug
value = " " + value;
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
return this;
}
}