package org.eclipse.uml2.diagram.common.sheet.chooser; import java.util.List; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.uml2.diagram.common.Messages; import org.eclipse.uml2.diagram.common.sheet.chooser.ElementChooserPage.Validator; public class ReferencedElementChooserDialog extends TrayDialog { //#263278 'Unset' doesn't work public final static Object NULL_VALUE = new String(Messages.ReferencedElementChooserDialog_null_eobject); private final static int UNSET_BUTTON_ID = IDialogConstants.NO_TO_ALL_ID + 1; public Object myResult; private final EStructuralFeature myFeature; private AdapterFactoryLabelProvider labelProvider; private final EObject mySourceObject; protected TabbedElementChooser myChooser; protected final TransactionalEditingDomain myEditingDomain; public ReferencedElementChooserDialog(Shell shell, IDialogSettings settings, AdapterFactory itemProvidersAdapterFactory, EObject sourceObject, EStructuralFeature feature) { super(shell); mySourceObject = sourceObject; myFeature = feature; labelProvider = new AdapterFactoryLabelProvider(itemProvidersAdapterFactory); myEditingDomain = TransactionUtil.getEditingDomain(sourceObject); myChooser = new TabbedElementChooser(settings, itemProvidersAdapterFactory, sourceObject, feature, myEditingDomain); } @Override protected Control createDialogArea(Composite parent) { final Composite composite = (Composite) super.createDialogArea(parent); myChooser.createDialogArea(composite); myChooser.addSelectionListener(new OkButtonEnabler()); return composite; } @Override public void create() { super.create(); myChooser.initSelection(); } @Override protected void createButtonsForButtonBar(Composite parent) { // create OK and Cancel buttons by default createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, UNSET_BUTTON_ID, Messages.ReferencedElementChooserDialog_button_unset, false); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(NLS.bind(Messages.ReferencedElementChooserDialog_dialog_choose_element, new Object[] { myFeature.getName(), labelProvider.getText(mySourceObject) })); shell.setImage(labelProvider.getImage(mySourceObject)); } @Override protected void buttonPressed(int buttonId) { if (UNSET_BUTTON_ID == buttonId) { unsetPressed(); } else { super.buttonPressed(buttonId); } } private void unsetPressed() { myResult = NULL_VALUE; close(); } @Override protected void okPressed() { List<?> selection = myChooser.getSelection(); if (selection.size() == 1) { Object firstSelected = selection.get(0); myResult = myChooser.getValidator().validate(firstSelected); } super.okPressed(); } public Object getResult() { return myResult; } private void setOkButtonEnabled(boolean enabled) { getButton(IDialogConstants.OK_ID).setEnabled(enabled); } private class OkButtonEnabler implements ISelectionChangedListener { Validator myValidator = myChooser.getValidator(); public void selectionChanged(SelectionChangedEvent event) { List<?> selection = myChooser.getSelection(); if (selection.size() == 1) { Object firstSelected = selection.get(0); setOkButtonEnabled(myValidator.validate(firstSelected) != null); } else { setOkButtonEnabled(false); } } } }