/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.uml.properties.modelelement; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.gef.EditPart; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.papyrus.infra.widgets.providers.AbstractStaticContentProvider; import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider; import org.eclipse.papyrus.uml.properties.Activator; import org.eclipse.papyrus.uml.properties.databinding.ElementCustomizationObservableValue; import org.eclipse.papyrus.uml.properties.databinding.ElementCustomizationObservableValue.Property; import org.eclipse.papyrus.uml.properties.messages.Messages; import org.eclipse.papyrus.uml.tools.utils.NamedElementUtil; import org.eclipse.papyrus.uml.tools.utils.UMLUtil; import org.eclipse.papyrus.views.properties.modelelement.AbstractModelElement; import org.eclipse.uml2.uml.NamedElement; /** * A ModelElement for handling UML-Specific appearance elements and properties * * @author Camille Letavernier * */ public class UMLNotationModelElement extends AbstractModelElement { /** * The labelCustomization property */ public static final String LabelCustomization = "labelCustomization"; //$NON-NLS-1$ /** * The stereotypeDisplay property */ public static final String StereotypeDisplay = "stereotypeDisplay"; //$NON-NLS-1$ /** * The elementIcon property */ public static final String ElementIcon = "elementIcon"; //$NON-NLS-1$ /** * The shadow property */ public static final String Shadow = "shadow"; //$NON-NLS-1$ /** * The qualifiedName property */ public static final String QualifiedName = "qualifiedName"; //$NON-NLS-1$ /** * The GMF EditPart represented by this ModelElement */ private EditPart sourceElement; /** * * Constructor. * * @param sourceElement * The GMF EditPart represented by this ModelElement */ public UMLNotationModelElement(EditPart sourceElement) { this.sourceElement = sourceElement; } @Override public IObservable doGetObservable(String propertyPath) { if(propertyPath.equals(LabelCustomization)) { return new ElementCustomizationObservableValue(sourceElement, Property.LABEL_CUSTOMIZATION); } else if(propertyPath.equals(StereotypeDisplay)) { //TODO : check if we need an observable in this case. For now, the Widget is responsible for updating the element //@see StereotypeDisplay return null; } else if(propertyPath.equals(ElementIcon)) { return new ElementCustomizationObservableValue(sourceElement, Property.ELEMENT_ICON); } else if(propertyPath.equals(Shadow)) { return new ElementCustomizationObservableValue(sourceElement, Property.SHADOW); } else if(propertyPath.equals(QualifiedName)) { return new ElementCustomizationObservableValue(sourceElement, Property.QUALIFIED_NAME); } Activator.log.warn("Unknown property : " + propertyPath); //$NON-NLS-1$ return null; } @Override public IStaticContentProvider getContentProvider(String propertyPath) { if(propertyPath.equals(QualifiedName)) { //maxDepth corresponds to "None" (The name is not qualified), while 0 corresponds to "Full" (Fully qualified name) return new AbstractStaticContentProvider() { public Object[] getElements() { int maxDepth = NamedElementUtil.getQualifiedNameMaxDepth((NamedElement)UMLUtil.resolveUMLElement(sourceElement)); if(maxDepth == 0) { return new Integer[]{ 0 }; } Integer[] result = new Integer[maxDepth + 1]; result[0] = maxDepth; //None result[1] = 0; //Full for(int i = 1; i < maxDepth; i++) { result[i + 1] = i; } return result; } }; } return null; } @Override public ILabelProvider getLabelProvider(String propertyPath) { //maxDepth corresponds to "None" (The name is not qualified), while 0 corresponds to "Full" (Fully qualified name) int depth = NamedElementUtil.getQualifiedNameMaxDepth((NamedElement)UMLUtil.resolveUMLElement(sourceElement)); final int maxDepth = depth == 0 ? 1 : depth; return new LabelProvider() { @Override public String getText(Object value) { if(value instanceof Integer) { Integer intValue = (Integer)value; if(intValue == maxDepth) { return Messages.UMLNotationModelElement_DepthNone; } else if(intValue == 0) { return Messages.UMLNotationModelElement_DepthFull; } else { return "-" + intValue; //$NON-NLS-1$ } } Activator.log.warn("Unknown value : " + value); //$NON-NLS-1$ return ""; //$NON-NLS-1$ } }; } /** * @return the GMF Notation model element associated to this edit part */ public EModelElement getEModelElement() { return (EModelElement)sourceElement.getModel(); } /** * @return the GMF Edit Part represented by this ModelElement */ public EditPart getEditPart() { return sourceElement; } @Override public boolean isMandatory(String propertyPath) { if(QualifiedName.equals(propertyPath)) { return true; } return super.isMandatory(propertyPath); } }