/*********************************************************************** * Copyright (c) 2007 Anyware Technologies * * 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: * Anyware Technologies - initial API and implementation * * $Id: EOperationParameterSection.java,v 1.8 2008/05/26 12:28:57 jlescot Exp $ **********************************************************************/ package org.eclipse.emf.ecoretools.properties.internal.sections; import java.util.Iterator; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EOperation; import org.eclipse.emf.ecore.EParameter; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; import org.eclipse.emf.ecoretools.properties.internal.Messages; import org.eclipse.emf.ecoretools.tabbedproperties.providers.TabbedPropertiesLabelProvider; import org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection; import org.eclipse.emf.ecoretools.tabbedproperties.sections.widgets.CSingleObjectChooser; import org.eclipse.emf.ecoretools.tabbedproperties.utils.TextChangeListener; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.provider.ItemProviderAdapter; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; /** * TODO Comment this class */ public class EOperationParameterSection extends AbstractListPropertySection { /** The widgets */ private Text parameterNameTxt; private CSingleObjectChooser typeChooser; /** * A boolean that store if refreshing is happening and no model * modifications should be performed */ private boolean isRefreshing = false; /** * The group Details */ private Group groupDetails; // /** // * @see // org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, // org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage) // */ // public void createControls(Composite parent, TabbedPropertySheetPage // aTabbedPropertySheetPage) // { // super.createControls(parent, aTabbedPropertySheetPage); // // Composite composite = getSectionComposite(); // FormData data; // // Group groupDetails = getWidgetFactory().createGroup(composite, "Parameter // Details"); // groupDetails.setLayout(new GridLayout()); // // data = new FormData(); // data.left = new FormAttachment(0, 0); // data.right = new FormAttachment(100, 0); // data.top = new FormAttachment(getTable(), // ITabbedPropertyConstants.VSPACE); // groupDetails.setLayoutData(data); // // createGroupContents(groupDetails); // hookListeners(); // } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#createWidgets(org.eclipse.swt.widgets.Composite) */ @Override protected void createWidgets(Composite composite) { super.createWidgets(composite); groupDetails = getWidgetFactory().createGroup(composite, Messages.EOperationParameterSection_ParameterDetails); groupDetails.setLayout(new GridLayout()); createGroupContents(groupDetails); } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#setSectionData(org.eclipse.swt.widgets.Composite) */ @Override protected void setSectionData(Composite composite) { super.setSectionData(composite); FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); data.top = new FormAttachment(getTable(), ITabbedPropertyConstants.VSPACE); groupDetails.setLayoutData(data); } /** * Create the group contents * * @param parent * the parent Composite */ protected void createGroupContents(Composite parent) { TabbedPropertySheetWidgetFactory widgetFactory = getWidgetFactory(); Composite composite = widgetFactory.createComposite(parent); composite.setLayout(new GridLayout(2, false)); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); widgetFactory.createLabel(composite, Messages.EOperationParameterSection_Name); parameterNameTxt = widgetFactory.createText(composite, "", SWT.BORDER); //$NON-NLS-1$ parameterNameTxt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); widgetFactory.createLabel(composite, Messages.EOperationParameterSection_Type); typeChooser = new CSingleObjectChooser(composite, getWidgetFactory(), SWT.NONE); typeChooser.setLabelProvider((ILabelProvider) getLabelProvider()); typeChooser.setSection(this); typeChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#hookListeners() */ @Override protected void hookListeners() { // Add the Listener for the eparameter name TextChangeListener parameterNameListener = new TextChangeListener() { @Override public void textChanged(Control control) { String newText = parameterNameTxt.getText(); EParameter parameter = (EParameter) getTable().getSelectionItem(); if (parameter != null && !newText.equals(parameter.getName())) { getEditingDomain().getCommandStack().execute(SetCommand.create(getEditingDomain(), parameter, EcorePackage.Literals.ENAMED_ELEMENT__NAME, newText)); } refresh(); } }; parameterNameListener.startListeningTo(parameterNameTxt); parameterNameListener.startListeningForEnter(parameterNameTxt); // Add a listener to the parameter type field typeChooser.addSelectionListener(new SelectionAdapter() { /** * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { handleComboModified(); } }); } /** * Update the model when the combo is modified */ protected void handleComboModified() { if (!isRefreshing && getParameterType() != typeChooser.getSelection()) { EditingDomain editingDomain = getEditingDomain(); EParameter parameter = (EParameter) getTable().getSelectionItem(); if (getEObjectList().size() == 1) { /* apply the property change to single selected object */ editingDomain.getCommandStack().execute(SetCommand.create(editingDomain, parameter, EcorePackage.Literals.ETYPED_ELEMENT__ETYPE, typeChooser.getSelection())); } else { CompoundCommand compoundCommand = new CompoundCommand(); /* apply the property change to all selected elements */ for (Iterator<EObject> i = getEObjectList().iterator(); i.hasNext();) { EObject nextObject = i.next(); compoundCommand.append(SetCommand.create(editingDomain, nextObject, EcorePackage.Literals.ETYPED_ELEMENT__ETYPE, typeChooser.getSelection())); } editingDomain.getCommandStack().execute(compoundCommand); } } } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#getLabelProvider() */ @Override protected IBaseLabelProvider getLabelProvider() { return new TabbedPropertiesLabelProvider(new EcoreItemProviderAdapterFactory()); } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#getListValues() */ @Override protected Object getListValues() { return ((EOperation) getEObject()).getEParameters(); } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#getFeature() */ @Override protected EStructuralFeature getFeature() { return EcorePackage.Literals.EOPERATION__EPARAMETERS; } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#getLabelText() */ @Override protected String getLabelText() { return Messages.EOperationParameterSection_Parameters; } /** * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh() */ @Override public void refresh() { isRefreshing = true; super.refresh(); typeChooser.setChoices(getComboFeatureValues()); typeChooser.setSelection(getParameterType()); EParameter parameter = (EParameter) getTable().getSelectionItem(); String nameToDisplay = getEParameterName(parameter); parameterNameTxt.setText(nameToDisplay); isRefreshing = false; } /** * @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#updateSelection(java.lang.Object) */ @Override public void updateSelection(Object data) { if (data instanceof EParameter) { EParameter parameter = (EParameter) data; String nameToDisplay = getEParameterName(parameter); parameterNameTxt.setText(nameToDisplay); typeChooser.setSelection(getParameterType()); } } /** * Returns the name of the given parameters * * @param parameter * The parameter to know the name * @return the parameters name */ private String getEParameterName(EParameter parameter) { return parameter == null ? "" : parameter.getName() != null ? parameter.getName() : ""; //$NON-NLS-1$ //$NON-NLS-2$ } /** * Search for all reachable events in the model * * @return An array ob events */ private Object[] getComboFeatureValues() { Iterator<Adapter> iter = getEObject().eAdapters().iterator(); while (iter.hasNext()) { Adapter adapter = iter.next(); if (adapter instanceof ItemProviderAdapter) { IItemPropertyDescriptor descriptor = ((ItemProviderAdapter) adapter).getPropertyDescriptor(getEObject(), EcorePackage.Literals.ETYPED_ELEMENT__ETYPE.getName()); if (descriptor != null) { return descriptor.getChoiceOfValues(getEObject()).toArray(); } } } return new String[] { "" }; //$NON-NLS-1$ } /** * Returns the parameters type * * @return the parameters type */ private Object getParameterType() { EParameter parameter = (EParameter) getTable().getSelectionItem(); if (parameter != null) { return parameter.getEType(); } return null; } }