/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.xpathchooser;
import java.lang.reflect.Field;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import de.rcenvironment.core.gui.xpathchooser.model.XSDElement;
/**
* Provides the editor for the attributes and values.
*
* @author Arne Bachmann
* @author Markus Kunde
*/
public class XSDEditingSupport extends EditingSupport {
/**
* Index constant.
*/
private static final int NOT_FOUND = -1;
/**
* The column (1 = attribute name, 2 = attribute value).
*/
private final int column;
/**
* The helper.
*/
private final XPathChooserHelper helper;
/**
* The tree.
*/
private final Tree tree;
/**
* The editor.
*/
private ComboBoxCellEditor editor;
/**
* Constructor.
*
* @param aHelper The main class
* @param viewer The tree column viewer
* @param aColumn The column number (1..2)
*/
public XSDEditingSupport(final XPathChooserHelper aHelper, final ColumnViewer viewer, final int aColumn) {
super(viewer);
assert aHelper != null;
assert viewer != null;
assert aColumn > 0;
this.column = aColumn;
this.helper = aHelper;
tree = ((TreeViewer) viewer).getTree();
}
@Override
protected boolean canEdit(final Object element) {
assert element instanceof XSDElement;
return (element != null) && (column >= 1);
}
@Override
protected CellEditor getCellEditor(final Object element) {
assert element instanceof XSDElement;
assert column >= 1;
final XSDElement elem = (XSDElement) element;
final String[] values = helper.getAttributeValuesForCurrentTreeItem(elem, column);
assert values != null;
editor = new ComboBoxCellEditor(tree, values);
final CCombo control = ((CCombo) editor.getControl());
control.setEditable(true);
if (values.length >= 1) {
final String value = XPathChooserHelper.getCurrentElementValue(elem, column);
final int index = control.indexOf(value);
if (index >= 0) { // preselect item
control.select(index);
}
}
editor.setFocus();
return editor;
}
@Override
protected Object getValue(final Object element) {
assert element instanceof XSDElement;
final XSDElement elem = (XSDElement) element;
String value = XPathChooserHelper.getCurrentElementValue(elem, column);
final String[] values = helper.getAttributeValuesForCurrentTreeItem(elem, column);
for (int i = 0; i < values.length; i++) {
if (values[i].equals(value)) {
return i;
}
}
return NOT_FOUND;
}
@Override
protected void setValue(final Object element, final Object value) {
assert element instanceof XSDElement;
final XSDElement elem = (XSDElement) element;
try {
final CCombo control = ((CCombo) editor.getControl());
final Field textField = control.getClass().getDeclaredField("text"); // private widget
textField.setAccessible(true);
final Text text = (Text) textField.get(control);
final String newValue = text.getText(); // just entered value
XPathChooserHelper.setCurrentElementValue(elem, column, newValue);
getViewer().update(element, null);
} catch (final SecurityException e) {
LogFactory.getLog(getClass()).debug("Catched SecurityException");
} catch (final NoSuchFieldException e) {
LogFactory.getLog(getClass()).debug("Catched NoSuchFieldException");
} catch (final IllegalArgumentException e) {
LogFactory.getLog(getClass()).debug("Catched IllegalArgumentException");
} catch (final IllegalAccessException e) {
LogFactory.getLog(getClass()).debug("Catched IllegalAccessException");
}
}
}