/***************************************************************************** * 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.views.properties.creation; import java.util.Arrays; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.papyrus.infra.widgets.editors.AbstractEditor; import org.eclipse.papyrus.infra.widgets.editors.ICommitListener; import org.eclipse.papyrus.infra.widgets.editors.ReferenceDialog; import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider; import org.eclipse.papyrus.views.properties.Activator; import org.eclipse.papyrus.views.properties.widgets.layout.PropertiesLayout; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; public class CreateInDialog extends TrayDialog { /** * The ContentProvider for browsing potential container EObjects */ protected IStaticContentProvider containerContentProvider; /** * The ContentProvider for browsing potential containment EReferences. * The input of this content provider is the object selected through the * containerContentProvider */ protected IStaticContentProvider referenceContentProvider; /** * The LabelProvider for displaying potential container EObjects */ protected ILabelProvider containerLabelProvider; /** * The LabelProvider for displaying potential containment EReferences */ protected ILabelProvider referenceLabelProvider; /** * This dialog's shell's title */ protected String title; protected EObject container; protected EReference containmentReference; protected ReferenceDialog referenceDialog; /** * The instance of object being created */ protected Object input; public CreateInDialog(Shell parentShell, Object input) { super(parentShell); this.input = input; } @Override public void create() { super.create(); getShell().setText(title); getShell().setImage(Activator.getDefault().getImage(org.eclipse.papyrus.infra.widgets.Activator.PLUGIN_ID, "icons/papyrus.png")); //$NON-NLS-1$ Label label = new Label(getDialogArea(), SWT.NONE); label.setText("Choose the parent element for the new object:"); GridData data = new GridData(SWT.FILL, SWT.FILL, true, false); data.horizontalIndent = 5; data.verticalIndent = 5; label.setLayoutData(data); final ReferenceDialog containerDialog = new ReferenceDialog(getDialogArea(), SWT.NONE); containerDialog.setLabel("Container : "); containerDialog.setLabelProvider(containerLabelProvider); containerDialog.setContentProvider(containerContentProvider); containerDialog.setInput(input); referenceDialog = new ReferenceDialog(getDialogArea(), SWT.NONE); referenceDialog.setLabel("Reference : "); referenceDialog.setLabelProvider(referenceLabelProvider); referenceDialog.setContentProvider(referenceContentProvider); containerDialog.addCommitListener(new ICommitListener() { public void commit(AbstractEditor editor) { container = (EObject)containerDialog.getValue(); referenceDialog.setInput(container); referenceContentProvider.inputChanged(null, null, container); if(referenceContentProvider.getElements().length == 0) { referenceDialog.setValue(null); } else if(referenceContentProvider.getElements().length == 1) { referenceDialog.setValue(referenceContentProvider.getElements()[0]); } else { if(!Arrays.asList(referenceContentProvider.getElements()).contains(referenceDialog.getValue())) { referenceDialog.setValue(null); } } updateControls(); } }); referenceDialog.addCommitListener(new ICommitListener() { public void commit(AbstractEditor editor) { containmentReference = (EReference)referenceDialog.getValue(); updateControls(); } }); updateControls(); getShell().setSize(450, 180); } protected void updateControls() { referenceDialog.setReadOnly(referenceContentProvider.getElements().length < 2); if(container == null || containmentReference == null) { getButton(OK).setEnabled(false); return; } getButton(OK).setEnabled(container.eClass().getEAllReferences().contains(containmentReference)); } @Override protected Composite getDialogArea() { return (Composite)super.getDialogArea(); } public EObject getContainer() { return container; } public EReference getContainmentReference() { return containmentReference; } public void setTitle(String title) { this.title = title; } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); composite.setLayout(new PropertiesLayout(true)); return composite; } @Override protected boolean isResizable() { return true; } public void setProviders(IStaticContentProvider containerContentProvider, IStaticContentProvider referenceContentProvider, ILabelProvider containerLabelProvider, ILabelProvider referenceLabelProvider) { this.containerContentProvider = containerContentProvider; this.referenceContentProvider = referenceContentProvider; this.containerLabelProvider = containerLabelProvider; this.referenceLabelProvider = referenceLabelProvider; } }