package org.objectstyle.wolips.baseforuiplugins.plist;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.objectstyle.wolips.baseforplugins.util.ComparisonUtils;
import org.objectstyle.wolips.baseforuiplugins.utils.KeyComboBoxCellEditor;
public class PropertyListTypeEditingSupport extends EditingSupport {
private IPropertyListChangeListener _listener;
private TreeViewer _treeViewer;
private KeyComboBoxCellEditor _typeCellEditor;
private boolean _canEditRoot;
public PropertyListTypeEditingSupport(TreeViewer viewer, IPropertyListChangeListener listener, boolean canEditRoot) {
super(viewer);
_listener = listener;
_treeViewer = viewer;
_canEditRoot = canEditRoot;
String[] items = new String[] { PropertyListPath.Type.Array.getName(), PropertyListPath.Type.Dictionary.getName(), PropertyListPath.Type.Boolean.getName(), PropertyListPath.Type.Data.getName(), PropertyListPath.Type.Date.getName(), PropertyListPath.Type.Number.getName(), PropertyListPath.Type.String.getName() };
_typeCellEditor = new KeyComboBoxCellEditor(_treeViewer.getTree(), items, SWT.READ_ONLY);
_typeCellEditor.getComboBox().setVisibleItemCount(items.length);
}
protected boolean canEdit(Object element) {
PropertyListPath path = (PropertyListPath) element;
return _canEditRoot || path.getParent() != null;
}
protected CellEditor getCellEditor(Object element) {
return _typeCellEditor;
}
protected Object getValue(Object element) {
String name = ((PropertyListPath) element).getType().getName();
return _typeCellEditor.getComboBox().indexOf(name);
}
protected void setValue(Object element, Object value) {
Integer selectedTypeIndex = (Integer) value;
if (selectedTypeIndex != -1) {
String selectedTypeName = _typeCellEditor.getComboBox().getItem(selectedTypeIndex);
PropertyListPath.Type selectedType = null;
for (PropertyListPath.Type type : PropertyListPath.Type.values()) {
if (type.getName().equals(selectedTypeName)) {
selectedType = type;
break;
}
}
if (selectedType != null) {
PropertyListPath path = (PropertyListPath) element;
Object oldValue = path.getValue();
PropertyListPath.Type oldType = path.getType();
if (!ComparisonUtils.equals(oldType, selectedType)) {
boolean parentChanged = path.setType(selectedType);
Object newValue = path.getValue();
_listener.pathChanged(path.getKeyPath(), oldValue, newValue);
if (parentChanged) {
_treeViewer.refresh(path.getParent());
} else {
_treeViewer.refresh(path);
}
}
}
}
}
}