/***************************************************************************** * Copyright (c) 2009 ATOS ORIGIN. * * * 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: * Thibault Landre (Atos Origin) - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.common.sheet; import java.util.LinkedList; import org.eclipse.emf.common.ui.celleditor.ExtendedDialogCellEditor; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.provider.IItemPropertySource; import org.eclipse.emf.edit.ui.provider.PropertyDescriptor; import org.eclipse.emf.edit.ui.provider.PropertySource; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.views.properties.IPropertyDescriptor; /** * A specific property source for Papyrus. It replaces the combo used to choose * a single reference by a {@link ElementListSelectionDialog} * */ public class UMLPropertySource extends PropertySource { /** * @param object * @param ips */ public UMLPropertySource(Object object, IItemPropertySource ips) { super(object, ips); } /* * (non-Javadoc) * * @see * org.eclipse.emf.edit.ui.provider.PropertySource#createPropertyDescriptor * (org.eclipse.emf.edit.provider.IItemPropertyDescriptor) */ @Override protected IPropertyDescriptor createPropertyDescriptor(IItemPropertyDescriptor itemPropertyDescriptor) { return new CustomPropertyDescriptor(object, itemPropertyDescriptor); } /** * A custom property descriptor. It replaces the Combo by the {@link ElementListSelectionDialog} */ private class CustomPropertyDescriptor extends PropertyDescriptor { public CustomPropertyDescriptor(Object object, IItemPropertyDescriptor itemPropertyDescriptor) { super(object, itemPropertyDescriptor); } @Override public CellEditor createPropertyEditor(Composite composite) { if(!itemPropertyDescriptor.canSetProperty(object)) { return null; } CellEditor result = null; Object genericFeature = itemPropertyDescriptor.getFeature(object); // If it is a single reference if(genericFeature instanceof EReference && !((EReference)genericFeature).isMany()) { final ILabelProvider editLabelProvider = getEditLabelProvider(); result = new ExtendedDialogCellEditor(composite, editLabelProvider) { @Override protected Object openDialogBox(Control cellEditorWindow) { ElementListSelectionDialog dialog = new ElementListSelectionDialog(cellEditorWindow.getShell(), editLabelProvider); dialog.setTitle("Element Selection"); dialog.setMessage("Select a String (* = any string, ? = any char):"); LinkedList<Object> result = new LinkedList<Object>(); result.add(""); result.addAll(itemPropertyDescriptor.getChoiceOfValues(object)); result.remove(null); dialog.setElements(result.toArray()); Object toReturn = null; if(dialog.open() == Dialog.OK) { toReturn = dialog.getFirstResult(); if("".equals(toReturn)) { toReturn = itemPropertyDescriptor.getPropertyValue(null); } } else { toReturn = itemPropertyDescriptor.getPropertyValue(object); } return toReturn; } }; } else { result = super.createPropertyEditor(composite); } return result; } } }