package com.sap.furcas.ide.editor.dialogs; import java.util.Collection; import java.util.Iterator; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import com.sap.furcas.ide.editor.DialogsImages; /** * Dialog used to find and select an element of a desired type * within a composite. * * @author Roman Andrej * @author Stephan Erb */ public class SelectEObjectDialog extends TitleAreaDialog { private TreeViewer viewer; private EObject selection; private EObject rootOfSelection; private Button OKbutton, CANCELbutton; private final Collection<Class<?>> filterList; public SelectEObjectDialog(Shell parent, Object input, Collection<Class<?>> filterList, AdapterFactory adapterFactory) { super(parent); this.setShellStyle(SWT.RESIZE | SWT.MAX | SWT.CLOSE); this.filterList = filterList; create(); viewer.setContentProvider(new FilteredContentProvider(adapterFactory, filterList)); viewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); viewer.setInput(input); viewer.expandAll(); setTitle("Select Object"); setMessage(getMessageWithTypeInformation()); setTitleImage(DialogsImages.imageRegistry.get(DialogsImages.FURCAS_LOGO_SMALL)); } private String getMessageWithTypeInformation() { if (filterList.isEmpty()) { return "Please select an object of any type."; } StringBuilder builder = new StringBuilder(); builder.append("Please select an object of type "); for (Iterator<Class<?>> iterator = filterList.iterator(); iterator.hasNext();) { String name = iterator.next().getSimpleName(); builder.append(name); if (iterator.hasNext()) { builder.append(", "); } } return builder.toString(); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText("Select Object"); newShell.addShellListener(new ShellAdapter() { @Override public void shellClosed(ShellEvent e) { selection = null; } }); } @Override protected Control createDialogArea(Composite parent) { Composite area = (Composite) super.createDialogArea(parent); Composite container = new Composite(area, SWT.NONE); container.setLayout(new FormLayout()); container.setLayoutData(new GridData(GridData.FILL_BOTH)); /** create a treeviewer */ viewer = new TreeViewer(container, SWT.BORDER); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ITreeSelection sel = (ITreeSelection) event.getSelection(); if (sel.isEmpty()) { OKbutton.setEnabled(false); return; } // in the tree selected object selection = (EObject) sel.getFirstElement(); // root element of tree (tree contains the selected object) rootOfSelection = (EObject) sel.getPaths()[0].getFirstSegment(); if (selection != null && rootOfSelection != null && isInstanceOfProvidedService(selection)) { OKbutton.setEnabled(true); } else { OKbutton.setEnabled(false); } } }); viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { if (OKbutton.isEnabled()) { close(); } } }); final Tree tree = viewer.getTree(); final FormData fd_tree = new FormData(); fd_tree.bottom = new FormAttachment(100, -61); fd_tree.top = new FormAttachment(0, 5); fd_tree.left = new FormAttachment(0, 5); fd_tree.right = new FormAttachment(100, -5); tree.setLayoutData(fd_tree); /** Separator */ Label separator; separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); final FormData fd_separator = new FormData(); fd_separator.left = new FormAttachment(0, -2); fd_separator.right = new FormAttachment(100, 4); fd_separator.top = new FormAttachment(100, -7); fd_separator.bottom = new FormAttachment(100, 1); separator.setLayoutData(fd_separator); return area; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected void createButtonsForButtonBar(Composite parent) { CANCELbutton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); CANCELbutton.addSelectionListener(new SelectionAdapter() { /* (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { selection = null; } }); OKbutton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); OKbutton.setEnabled(false); } @Override protected void cancelPressed() { super.cancelPressed(); this.selection = null; } /** * Return the initial size of the dialog */ @Override protected Point getInitialSize() { return new Point(500, 400); } /** * True if the object is a candidate for return value */ private boolean isInstanceOfProvidedService(Object object) { for (Class<?> c : filterList) { if (c.isAssignableFrom(object.getClass())) { return true; } } return false; } public EObject getResult() { return selection; } public EObject getRootOfResult() { return rootOfSelection; } }