blob: 67ecbb1e8168ff13a34757e2d6e014b754b1362f [file] [log] [blame]
/**
* Copyright (c) 2002-2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.edit.ui.provider;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.emf.common.ui.celleditor.ExtendedComboBoxCellEditor;
import org.eclipse.emf.common.ui.celleditor.ExtendedDialogCellEditor;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog;
/**
* This is used to encapsulate an {@link IItemPropertyDescriptor} along with the object for which it is an item property source
* and make it behave like an {@link org.eclipse.ui.views.properties.IPropertyDescriptor}.
*/
public class PropertyDescriptor implements IPropertyDescriptor
{
/**
* This is the object for which this class is a property source.
*/
protected Object object;
/**
* This is the descriptor to which we will delegate all the {@link org.eclipse.ui.views.properties.IPropertyDescriptor} methods.
*/
protected IItemPropertyDescriptor itemPropertyDescriptor;
/**
* An instance is constructed from an object and its item property source.
*/
public PropertyDescriptor(Object object, IItemPropertyDescriptor itemPropertyDescriptor)
{
this.object = object;
this.itemPropertyDescriptor = itemPropertyDescriptor;
}
public String getCategory()
{
return itemPropertyDescriptor.getCategory(object);
}
public String getDescription()
{
return itemPropertyDescriptor.getDescription(object);
}
public String getDisplayName()
{
return itemPropertyDescriptor.getDisplayName(object);
}
public String[] getFilterFlags()
{
return itemPropertyDescriptor.getFilterFlags(object);
}
public Object getHelpContextIds()
{
return itemPropertyDescriptor.getHelpContextIds(object);
}
/**
* Provides direct access to the underlying feature object.
*
* @since 2.9
*/
public Object getFeature()
{
return itemPropertyDescriptor.getFeature(object);
}
public Object getId()
{
return itemPropertyDescriptor.getId(object);
}
public ILabelProvider getLabelProvider()
{
final IItemLabelProvider itemLabelProvider = itemPropertyDescriptor.getLabelProvider(object);
return
new LabelProvider()
{
@Override
public String getText(Object object)
{
return itemLabelProvider.getText(object);
}
@Override
public Image getImage(Object object)
{
return ExtendedImageRegistry.getInstance().getImage(itemLabelProvider.getImage(object));
}
};
}
protected ILabelProvider getEditLabelProvider()
{
return getLabelProvider();
}
public boolean isCompatibleWith(IPropertyDescriptor anotherProperty)
{
return false;
}
/**
* A delegate for handling validation and conversion for data type values.
*/
protected static class EDataTypeValueHandler implements ICellEditorValidator, IInputValidator, ExtendedComboBoxCellEditor.ValueHandler
{
protected EDataType eDataType;
/**
* @since 2.14
*/
protected IItemPropertyDescriptor.ValueHandler valueHandler;
public EDataTypeValueHandler(EDataType eDataType)
{
this(eDataType, new ItemPropertyDescriptor.DataTypeValueHandler(eDataType));
}
/**
* @since 2.14
*/
public EDataTypeValueHandler(EDataType eDataType, IItemPropertyDescriptor.ValueHandler valueHandler)
{
this.eDataType = eDataType;
this.valueHandler = valueHandler;
}
public String isValid(Object object)
{
return escape(valueHandler.isValid((String)object));
}
/**
* JFace {@link MessageFormat#format(String, Object...) formats} messages, so special pattern characters need to be escaped.
*
* @since 2.14
*/
protected String escape(String message)
{
return message == null ? null : message.replaceAll("'","''").replaceAll("\\{", "'{'"); // }}
}
public String isValid(String text)
{
return isValid((Object)text);
}
public Object toValue(String string)
{
return valueHandler.toValue(string);
}
public String toString(Object value)
{
String result = valueHandler.toString(value);
return result == null ? "" : result;
}
}
public static class EDataTypeCellEditor extends TextCellEditor
{
protected EDataType eDataType;
protected EDataTypeValueHandler valueHandler;
public EDataTypeCellEditor(EDataType eDataType, Composite parent)
{
this(eDataType, new EDataTypeValueHandler(eDataType), parent);
}
/**
* @since 2.14
*/
public EDataTypeCellEditor(EDataType eDataType, EDataTypeValueHandler valueHandler, Composite parent)
{
super(parent);
this.eDataType = eDataType;
this.valueHandler = valueHandler;
setValidator(valueHandler);
}
@Override
public Object doGetValue()
{
return valueHandler.toValue((String)super.doGetValue());
}
@Override
public void doSetValue(Object value)
{
value = valueHandler.toString(value);
super.doSetValue(value);
}
// CellEditor.setValue() calls isCorrect() to validate the value that is about to be set. We are doing conversion
// between the value and a corresponding string, and we would usually like to validate the string. Because
// setValue() is final, we cannot do that conversion there, so we need to record what we're trying to validate and
// work around the problem in isCorrect().
//
protected boolean validateAsValue = true;
@Override
protected void editOccured(ModifyEvent e)
{
validateAsValue = false;
super.editOccured(e);
validateAsValue = true;
}
@Override
protected boolean isCorrect(Object value)
{
if (validateAsValue)
{
value = valueHandler.toString(value);
}
return super.isCorrect(value);
}
}
/**
* @since 2.14
*/
public static class MultiLineEDataTypeCellEditor extends EDataTypeCellEditor
{
private static final EDataTypeValueHandler NO_OP_VALUE_HANDLER = new EDataTypeValueHandler(EcorePackage.Literals.ESTRING);
protected Text text;
protected Button button;
protected boolean doEscape;
private String value;
private String dialogTitle;
private MouseListener mouseListener = new MouseAdapter()
{
@Override
public void mouseUp(MouseEvent e)
{
showDialog();
}
@Override
public void mouseDoubleClick(MouseEvent e)
{
showDialog();
}
};
private VerifyListener verifyListener = new VerifyListener()
{
public void verifyText(VerifyEvent e)
{
e.doit = false;
showDialog();
}
};
public MultiLineEDataTypeCellEditor(EDataType eDataType, EDataTypeValueHandler valueHandler, String dialogTitle, Composite parent)
{
super(eDataType, valueHandler, parent);
this.dialogTitle = dialogTitle;
}
private void showDialog()
{
button.setFocus();
button.getDisplay().asyncExec(new Runnable()
{
public void run()
{
button.notifyListeners(SWT.Selection, null);
}
});
}
@Override
public Object doGetValue()
{
String str = value != null ? value : (String)super.doGetValue();
if (doEscape)
{
str = unescape(str);
}
return str;
}
@Override
public void doSetValue(Object value)
{
text.removeMouseListener(mouseListener);
text.removeVerifyListener(verifyListener);
String literal = valueHandler.toString(value);
if (literal != null)
{
for (char c : literal.toCharArray())
{
if (Character.isISOControl(c))
{
doEscape = true;
button.setImage(ExtendedImageRegistry.INSTANCE.getImage(EMFEditUIPlugin.INSTANCE.getImage("full/ctool16/EncodedEllipses")));
literal = escape(literal);
break;
}
}
}
EDataTypeValueHandler oldValueHandler = valueHandler;
try
{
boolean isVeryLong = literal.length() > 2000;
if (isVeryLong)
{
this.value = literal;
literal = literal.substring(0, 2000);
}
else
{
this.value = null;
}
valueHandler = NO_OP_VALUE_HANDLER;
super.doSetValue(literal);
if (isVeryLong)
{
text.addMouseListener(mouseListener);
text.addVerifyListener(verifyListener);
}
}
finally
{
valueHandler = oldValueHandler;
}
}
@Override
protected Control createControl(Composite parent)
{
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.horizontalSpacing = 0;
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(layout);
composite.setFont(parent.getFont());
composite.setBackground(parent.getBackground());
text = (Text)super.createControl(composite);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
button = new Button(composite, SWT.PUSH);
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, false, true);
if (parent instanceof Tree)
{
layoutData.widthHint = ((Tree)parent).getItemHeight();
}
else if (parent instanceof Table)
{
layoutData.widthHint = ((Table)parent).getItemHeight();
}
button.setLayoutData(layoutData);
button.setImage(ExtendedImageRegistry.INSTANCE.getImage(EMFEditUIPlugin.INSTANCE.getImage("full/ctool16/Ellipses")));
button.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
String stringValue = valueHandler.toString(getValue());
boolean containsNull = stringValue.indexOf('\u0000') != -1;
if (containsNull)
{
stringValue = stringValue.replace('\u0000', '\n');
}
MultiLineInputDialog dialog = new MultiLineInputDialog(
composite.getShell(),
dialogTitle,
EMFEditUIPlugin.INSTANCE.getString("_UI_MultiLineInputDialog_message"),
stringValue,
valueHandler);
if (dialog.open() == Window.OK)
{
String value = dialog.getValue();
value = value.replace("\r\n", "\n");
if (containsNull)
{
value = value.replace('\n', '\u0000');
}
Object newValue = valueHandler.toValue(value);
if (newValue != null)
{
boolean newValidState = isCorrect(newValue);
if (newValidState)
{
markDirty();
doSetValue(newValue);
fireApplyEditorValue();
}
}
}
else
{
fireCancelEditor();
}
}
});
button.addKeyListener(new KeyAdapter()
{
@Override
public void keyReleased(KeyEvent e)
{
if (e.character == '\u001b')
{
fireCancelEditor();
}
}
});
return composite;
}
@Override
protected void focusLost()
{
if (isActivated())
{
button.getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
if (button.isFocusControl())
{
return;
}
}
catch (Exception ex)
{
// Ignore.
}
try
{
fireApplyEditorValue();
deactivate();
}
catch (Exception ex)
{
// Ignore.
}
}
});
}
}
protected String escape(String literal)
{
if (literal == null)
{
return null;
}
int len = literal.length();
StringBuilder builder = new StringBuilder(len);
for (int i = 0; i < len; i++)
{
char c = literal.charAt(i);
if (c < 32)
{
switch (c)
{
case '\r':
builder.append('\\');
builder.append('r');
break;
case '\n':
builder.append('\\');
builder.append('n');
break;
case '\t':
builder.append('\\');
builder.append('t');
break;
case '\f':
builder.append('\\');
builder.append('f');
break;
case '\b':
builder.append('\\');
builder.append('b');
break;
default:
if (c > 0xf)
{
builder.append("\\u00" + charToHex(c));
}
else
{
builder.append("\\u000" + charToHex(c));
}
}
}
else if (c == '\\')
{
builder.append('\\');
builder.append('\\');
}
else
{
builder.append(c);
}
}
return builder.toString();
}
protected String unescape(String literal)
{
if (literal == null)
{
return null;
}
int len = literal.length();
StringBuilder builder = new StringBuilder(len);
StringBuilder unicodeBuilder = new StringBuilder(4);
boolean unicode = false;
boolean slash = false;
for (int i = 0; i < len; i++)
{
char c = literal.charAt(i);
if (unicode)
{
unicodeBuilder.append(c);
if (unicodeBuilder.length() == 4)
{
try
{
char value = hexToChar(unicodeBuilder.toString());
builder.append(value);
unicodeBuilder.setLength(0);
unicode = false;
slash = false;
}
catch (NumberFormatException ex)
{
builder.append('\\');
builder.append('u');
builder.append(unicodeBuilder);
}
}
continue;
}
if (slash)
{
slash = false;
switch (c)
{
case '\\':
builder.append('\\');
break;
case 'r':
builder.append('\r');
break;
case 'n':
builder.append('\n');
break;
case 't':
builder.append('\t');
break;
case 'f':
builder.append('\f');
break;
case 'b':
builder.append('\b');
break;
case 'u':
unicode = true;
break;
case '0':
case '1':
case '2':
case '3':
if (i + 2 < len && literal.charAt(i + 1) >= '0' && literal.charAt(i + 1) <= '7' && literal.charAt(i + 2) >= '0' && literal.charAt(i + 2) <= '7')
{
builder.append((char)Integer.parseInt(literal.substring(i, i + 3), 8));
i += 2;
continue;
}
//$FALL-THROUGH$
default:
{
builder.append(c);
}
}
continue;
}
else if (c == '\\')
{
slash = true;
continue;
}
builder.append(c);
}
if (slash)
{
builder.append('\\');
}
return builder.toString();
}
protected String charToHex(char ch)
{
return Integer.toHexString(ch).toUpperCase(Locale.ENGLISH);
}
protected char hexToChar(String s)
{
return (char)Integer.parseInt(s, 16);
}
}
private static class MultiLineInputDialog extends InputDialog
{
public MultiLineInputDialog(Shell parentShell, String title, String message, String initialValue, IInputValidator validator)
{
super(parentShell, title, message, initialValue, validator);
setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
}
@Override
protected Text createText(Composite composite)
{
Text text = new Text(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
data.heightHint = 5 * text.getLineHeight();
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
text.setLayoutData(data);
return text;
}
}
/**
* Unlike {@link CheckboxCellEditor} this really creates a check box.
*
* @since 2.14
*/
public static class CheckBoxCellEditor extends CellEditor
{
private Button checkButton;
private boolean isTriState;
private Label label;
public CheckBoxCellEditor(Composite parent, int style, boolean isTriState)
{
super(parent, style);
this.isTriState = isTriState;
}
@Override
protected Control createControl(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
RowLayout layout = new RowLayout();
layout.marginTop = 1;
layout.marginBottom = 0;
layout.marginLeft = 5;
layout.center = true;
composite.setLayout(layout);
checkButton = new Button(composite, SWT.CHECK | getStyle());
checkButton.addFocusListener(new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
CheckBoxCellEditor.this.focusLost();
}
});
checkButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
changeState(false);
}
});
checkButton.addTraverseListener(new TraverseListener()
{
public void keyTraversed(TraverseEvent e)
{
if (e.detail == SWT.TRAVERSE_ESCAPE)
{
fireCancelEditor();
}
else if (e.detail == SWT.TRAVERSE_RETURN)
{
focusLost();
}
}
});
label = new Label(composite, SWT.NONE);
MouseAdapter mouseListener = new MouseAdapter()
{
@Override
public void mouseUp(MouseEvent e)
{
changeState(true);
}
};
label.addMouseListener(mouseListener);
composite.addMouseListener(mouseListener);
Color background = parent.getBackground();
label.setBackground(background);
composite.setBackground(background);
return composite;
}
private void changeState(boolean toggle)
{
markDirty();
if (isTriState)
{
if (checkButton.getGrayed())
{
checkButton.setGrayed(false);
checkButton.setSelection(false);
}
else if (checkButton.getSelection() == toggle)
{
checkButton.setSelection(false);
checkButton.setGrayed(true);
}
else
{
checkButton.setSelection(true);
}
}
else if (toggle)
{
checkButton.setSelection(!checkButton.getSelection());
}
doSetValue(doGetValue());
}
@Override
protected Object doGetValue()
{
return checkButton.getGrayed() ? null : checkButton.getSelection();
}
@Override
protected void doSetValue(Object value)
{
checkButton.setSelection(Boolean.TRUE.equals(value));
checkButton.setGrayed(value == null);
label.setText(value == null ? "null" : Boolean.TRUE.equals(value) ? "true" : "false");
label.setEnabled(value != null);
label.getParent().layout();
}
@Override
protected void doSetFocus()
{
if (checkButton != null)
{
checkButton.setFocus();
}
}
}
/**
* @since 2.14
*/
protected CellEditor createEDataTypeCellEditor(final EDataType eDataType, final IItemPropertyDescriptor.ValueHandler specializedValueHandler, Composite composite)
{
if (itemPropertyDescriptor.isMultiLine(object))
{
EDataTypeValueHandler valueHandler = new EDataTypeValueHandler(eDataType, specializedValueHandler);
return new MultiLineEDataTypeCellEditor(
eDataType,
valueHandler,
EMFEditUIPlugin.INSTANCE.getString("_UI_FeatureEditorDialog_title", new Object []{ getDisplayName(), getEditLabelProvider().getText(object) }),
composite);
}
return specializedValueHandler == null
? new EDataTypeCellEditor(eDataType, composite) : new EDataTypeCellEditor(eDataType, new EDataTypeValueHandler(eDataType, specializedValueHandler), composite);
}
protected CellEditor createEDataTypeCellEditor(final EDataType eDataType, Composite composite)
{
return createEDataTypeCellEditor(eDataType, null, composite);
}
/**
* This cell editor ensures that only Integer values are supported
* @deprecated
*/
@Deprecated
public static class IntegerCellEditor extends TextCellEditor
{
public IntegerCellEditor(Composite composite)
{
super(composite);
setValidator
(new ICellEditorValidator()
{
public String isValid(Object object)
{
if (object instanceof Integer)
{
return null;
}
else
{
String string = (String)object;
try
{
Integer.parseInt(string);
return null;
}
catch (NumberFormatException exception)
{
return exception.getMessage();
}
}
}
});
}
@Override
public Object doGetValue()
{
return Integer.parseInt((String)super.doGetValue());
}
@Override
public void doSetValue(Object value)
{
super.doSetValue(value.toString());
}
}
/**
* This cell editor ensures that only Float values are supported
* @deprecated
*/
@Deprecated
public static class FloatCellEditor extends TextCellEditor
{
public FloatCellEditor(Composite composite)
{
super(composite);
setValidator
(new ICellEditorValidator()
{
public String isValid(Object object)
{
if (object instanceof Float)
{
return null;
}
else
{
String string = (String)object;
try
{
Float.parseFloat(string);
return null;
}
catch (NumberFormatException exception)
{
return exception.getMessage();
}
}
}
});
}
@Override
public Object doGetValue()
{
return new Float(Float.parseFloat((String)super.doGetValue()));
}
@Override
public void doSetValue(Object value)
{
super.doSetValue(value.toString());
}
}
protected static final EcorePackage ecorePackage = EcorePackage.eINSTANCE;
/**
* This returns the cell editor that will be used to edit the value of this property.
* This default implementation determines the type of cell editor from the nature of the structural feature.
*/
public CellEditor createPropertyEditor(Composite composite)
{
if (!itemPropertyDescriptor.canSetProperty(object))
{
return null;
}
CellEditor result = null;
Object genericFeature = itemPropertyDescriptor.getFeature(object);
if (genericFeature instanceof EReference[])
{
result = new ExtendedComboBoxCellEditor(
composite,
new ArrayList<Object>(itemPropertyDescriptor.getChoiceOfValues(object)),
getEditLabelProvider(),
itemPropertyDescriptor.isSortChoices(object),
SWT.READ_ONLY,
null,
true);
}
else if (genericFeature instanceof EStructuralFeature)
{
final EStructuralFeature feature = (EStructuralFeature)genericFeature;
final EClassifier eType = feature.getEType();
final Collection<?> choiceOfValues = itemPropertyDescriptor.getChoiceOfValues(object);
if (choiceOfValues != null)
{
if (itemPropertyDescriptor.isMany(object))
{
boolean valid = true;
for (Object choice : choiceOfValues)
{
if (!eType.isInstance(choice))
{
valid = false;
break;
}
}
if (valid)
{
final ILabelProvider editLabelProvider = getEditLabelProvider();
result =
new ExtendedDialogCellEditor(composite, editLabelProvider)
{
@Override
protected Object openDialogBox(Control cellEditorWindow)
{
FeatureEditorDialog dialog = new FeatureEditorDialog(
cellEditorWindow.getShell(),
editLabelProvider,
object,
feature.getEType(),
(List<?>)doGetValue(),
getDisplayName(),
new ArrayList<Object>(choiceOfValues),
false,
itemPropertyDescriptor.isSortChoices(object),
feature.isUnique() || feature instanceof EReference,
itemPropertyDescriptor instanceof IItemPropertyDescriptor.ValueHandlerProvider &&
((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).isChoiceArbitrary(object) ?
((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).getValueHandler(object) :
null);
dialog.open();
return dialog.getResult();
}
};
}
}
if (result == null)
{
ArrayList<Object> values = new ArrayList<Object>(choiceOfValues);
if (itemPropertyDescriptor instanceof IItemPropertyDescriptor.ValueHandlerProvider &&
((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).isChoiceArbitrary(object))
{
result =
new ExtendedComboBoxCellEditor
(composite,
values,
getEditLabelProvider(),
itemPropertyDescriptor.isSortChoices(object),
SWT.NONE,
new EDataTypeValueHandler((EDataType)eType, ((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).getValueHandler(object)),
false);
}
else
{
result =
new ExtendedComboBoxCellEditor
(composite, values, getEditLabelProvider(), itemPropertyDescriptor.isSortChoices(object), SWT.READ_ONLY, null, true);
}
}
}
else if (eType instanceof EDataType)
{
final EDataType eDataType = (EDataType)eType;
if (eDataType.isSerializable())
{
if (itemPropertyDescriptor.isMany(object))
{
final ILabelProvider editLabelProvider = getEditLabelProvider();
result =
new ExtendedDialogCellEditor(composite, editLabelProvider)
{
@Override
protected Object openDialogBox(Control cellEditorWindow)
{
FeatureEditorDialog dialog = new FeatureEditorDialog(
cellEditorWindow.getShell(),
editLabelProvider,
object,
feature.getEType(),
(List<?>)doGetValue(),
getDisplayName(),
null,
itemPropertyDescriptor.isMultiLine(object),
false,
feature.isUnique(),
itemPropertyDescriptor instanceof IItemPropertyDescriptor.ValueHandlerProvider ?
((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).getValueHandler(object) :
null);
dialog.open();
return dialog.getResult();
}
};
}
else if (eDataType.getInstanceClass() == Boolean.class)
{
return new CheckBoxCellEditor(composite, SWT.NONE, true);
}
else if (eDataType.getInstanceClass() == Boolean.TYPE)
{
return new CheckBoxCellEditor(composite, SWT.NONE, false);
}
else if (itemPropertyDescriptor instanceof IItemPropertyDescriptor.ValueHandlerProvider)
{
result = createEDataTypeCellEditor(eDataType, ((IItemPropertyDescriptor.ValueHandlerProvider)itemPropertyDescriptor).getValueHandler(object), composite);
}
else
{
result = createEDataTypeCellEditor(eDataType, composite);
}
}
}
}
return result;
}
}