/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.properties; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.DialogCellEditor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.dialogs.ListDialog; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.xsd.XSDEnumerationFacet; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.teiid.core.designer.util.I18nUtil; import org.teiid.designer.core.metamodel.aspect.MetamodelAspect; import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; class EnumeratedValuesPropertyDescriptor implements ITransientPropertyDescriptor, UiConstants { static final String PREFIX = I18nUtil.getPropertyPrefix(EnumeratedValuesPropertyDescriptor.class); private EObject obj; private ILabelProvider labelProvider; List enumeratedValues; /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite) * @since 4.3 */ @Override public CellEditor createPropertyEditor( Composite theParent ) { CellEditor editor = new DialogCellEditor(theParent) { @Override protected Object openDialogBox( Control cellEditorWindow ) { ListDialog dialog = new ListDialog(cellEditorWindow.getShell()); dialog.setInput(enumeratedValues); dialog.setContentProvider(new ListSCP()); dialog.setLabelProvider(getLabelProvider()); dialog.setTitle(Util.getStringOrKey(PREFIX + "displayName")); //$NON-NLS-1$ dialog.open(); return null; } }; return editor; } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory() * @since 4.3 */ @Override public String getCategory() { return Util.getStringOrKey(PREFIX + "category"); //$NON-NLS-1$ } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription() * @since 4.3 */ @Override public String getDescription() { return Util.getStringOrKey(PREFIX + "description"); //$NON-NLS-1$ } @Override public String getDisplayName() { return Util.getStringOrKey(PREFIX + "displayName"); //$NON-NLS-1$ } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags() * @since 4.3 */ @Override public String[] getFilterFlags() { return null; } /** * @see org.teiid.designer.ui.properties.ITransientPropertyDescriptor#getPropertyValue() * @since 4.3 */ @Override public Object getPropertyValue() { if (this.obj == null) { throw new IllegalStateException(Util.getStringOrKey(PREFIX + "errorMsg.objectNotSet")); //$NON-NLS-1$ } MetamodelAspect mmAspect = ModelObjectUtilities.getSqlAspect(this.obj); if (mmAspect instanceof SqlColumnAspect) { SqlColumnAspect colAspect = (SqlColumnAspect)mmAspect; Object originalValue = colAspect.getDatatype(this.obj); if (originalValue instanceof XSDSimpleTypeDefinition) { this.enumeratedValues = new ArrayList(); List enums = ((XSDSimpleTypeDefinition)originalValue).getEnumerationFacets(); Iterator iter = enums.iterator(); while (iter.hasNext()) { XSDEnumerationFacet ef = (XSDEnumerationFacet)iter.next(); List value = ef.getValue(); if (value.size() > 1) { // skip this, it is a multi-element this.enumeratedValues.addAll(value); } else if (value.size() == 1) { // single entry, use it: this.enumeratedValues.add(value.get(0)); } else { // no elements; try the lex value: this.enumeratedValues.add(ef.getLexicalValue()); } // endif } } } if (enumeratedValues != null && !enumeratedValues.isEmpty()) { return enumeratedValues.get(0); } return null; } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds() * @since 4.3 */ @Override public Object getHelpContextIds() { return null; } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId() * @since 4.3 */ @Override public Object getId() { return Util.getStringOrKey(PREFIX + "id"); //$NON-NLS-1$ } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider() * @since 4.3 */ @Override public ILabelProvider getLabelProvider() { if (labelProvider == null) { labelProvider = new LabelProvider(); } // endif return labelProvider; } /** * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor) * @since 4.3 */ @Override public boolean isCompatibleWith( IPropertyDescriptor theAnotherProperty ) { return false; } /** * @see org.teiid.designer.ui.properties.ITransientPropertyDescriptor#setObject(java.lang.Object) * @since 4.3 */ @Override public void setObject( Object theObject ) { if ((theObject != null) && supports(theObject)) { this.obj = (EObject)theObject; } else { throw new IllegalArgumentException(Util.getString(PREFIX + "errorMsg.objectNotSupported", this.obj)); //$NON-NLS-1$ } } /** * @see org.teiid.designer.ui.properties.ITransientPropertyDescriptor#supports(java.lang.Object) * @since 4.3 */ @Override public boolean supports( Object theObject ) { if (theObject != null && theObject instanceof EObject) { EObject eObj = (EObject)theObject; MetamodelAspect mmAspect = ModelObjectUtilities.getSqlAspect(eObj); if (mmAspect instanceof SqlColumnAspect) { SqlColumnAspect colAspect = (SqlColumnAspect)mmAspect; Object originalValue = colAspect.getDatatype(eObj); if (originalValue instanceof XSDSimpleTypeDefinition) { List enums = ((XSDSimpleTypeDefinition)originalValue).getEnumerationFacets(); if (enums != null && !enums.isEmpty()) { return true; } } } } return false; } class ListSCP implements IStructuredContentProvider { @Override public Object[] getElements( Object inputElement ) { if (inputElement != null) { return ((Collection)inputElement).toArray(); } // endif return new Object[0]; } @Override public void dispose() { // ignore } @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { // ignore } } // endclass ListSCP }