blob: ec202fbe7f9a34551038ba8cbf753447f4289209 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.ui.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.egf.core.EGFCorePlugin;
import org.eclipse.egf.core.epackage.IProxyEClass;
import org.eclipse.egf.core.epackage.IProxyEClassifier;
import org.eclipse.egf.core.epackage.IProxyEDataType;
import org.eclipse.egf.core.epackage.IProxyEObject;
import org.eclipse.egf.core.epackage.IProxyEPackage;
import org.eclipse.egf.core.epackage.IProxyERoot;
import org.eclipse.egf.core.ui.EGFCoreUIPlugin;
import org.eclipse.egf.core.ui.IEGFCoreUIImages;
import org.eclipse.egf.core.ui.l10n.CoreUIMessages;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.provider.EcoreEditPlugin;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ActiveShellExpression;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
/**
* @author Xavier Maysonnave
*
*/
public class TargetPlatformEcoreSelectionDialog extends SelectionStatusDialog {
private static final String DIALOG_SETTINGS = "org.eclipse.egf.core.ui.dialogs.TargetPlatformEcoreSelectionDialog"; //$NON-NLS-1$
private static final String SHOW_STATUS_LINE = "ShowStatusLine"; //$NON-NLS-1$
private ExtendedImageRegistry registry = ExtendedImageRegistry.INSTANCE;
private class ToggleStatusLineAction extends Action {
/**
* Creates a new instance of the class.
*/
public ToggleStatusLineAction() {
super(CoreUIMessages.TargetPlatformEcoreSelectionDialog_toggleStatusAction, IAction.AS_CHECK_BOX);
}
@Override
public void run() {
_details.setVisible(isChecked());
}
}
/**
* A content provider that does nothing.
*/
private class NullContentProvider implements IContentProvider {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// Nothing to do
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Nothing to do
}
}
protected class EcoreLabelProvider implements ITableLabelProvider, ILabelProvider {
public EcoreLabelProvider() {
// Nothing to do
}
public Image getColumnImage(Object element, int columnIndex) {
if (element instanceof IProxyEPackage) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EPackage")); //$NON-NLS-1$
} else if (element instanceof IProxyEClass) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EClass")); //$NON-NLS-1$
} else if (element instanceof IProxyEDataType) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EDataType")); //$NON-NLS-1$
}
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IProxyEObject) {
return ((IProxyEObject) element).getName();
}
return ""; //$NON-NLS-1$
}
public void addListener(ILabelProviderListener listener) {
// Nothing to do
}
public void dispose() {
// Nothing to do
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
// Nothing to do
}
public Image getImage(Object element) {
return getColumnImage(element, 0);
}
public String getText(Object element) {
return getColumnText(element, 0);
}
}
protected class EcoreContentProvider implements ITreeContentProvider {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Nothing to do
}
public void dispose() {
// Nothing to do
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object getParent(Object element) {
if (element instanceof IProxyEObject) {
return ((IProxyEObject) element).getParent();
}
return null;
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IProxyERoot) {
IProxyERoot wrapper = (IProxyERoot) parentElement;
return wrapper.getChildren();
} else if (parentElement instanceof IProxyEPackage) {
IProxyEPackage wrapper = (IProxyEPackage) parentElement;
return wrapper.getChildren();
} else if (parentElement instanceof List<?>) {
return ((List<?>) parentElement).toArray();
}
return new Object[0];
}
}
/**
* DetailsContentViewer objects are wrappers for labels.
* DetailsContentViewer provides means to change label's image and text when
* the attached LabelProvider is updated.
*/
private class DetailsContentViewer extends ContentViewer {
private CLabel label;
/**
* Unfortunately, it was impossible to delegate displaying border to
* label. The <code>ViewForm</code> is used because
* <code>CLabel</code> displays shadow when border is present.
*/
private ViewForm viewForm;
/**
* Constructs a new instance of this class given its parent and a style
* value describing its behavior and appearance.
*
* @param parent
* the parent component
* @param style
* SWT style bits
*/
public DetailsContentViewer(Composite parent, int style) {
viewForm = new ViewForm(parent, style);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
viewForm.setLayoutData(gd);
label = new CLabel(viewForm, SWT.FLAT);
label.setFont(parent.getFont());
viewForm.setContent(label);
hookControl(label);
}
/**
* Shows/hides the content viewer.
*
* @param visible
* if the content viewer should be visible.
*/
public void setVisible(boolean visible) {
GridData gd = (GridData) viewForm.getLayoutData();
gd.exclude = !visible;
viewForm.getParent().layout();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object,
* java.lang.Object)
*/
@Override
protected void inputChanged(Object input, Object oldInput) {
if (oldInput == null) {
if (input == null) {
return;
}
refresh();
return;
}
refresh();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ContentViewer#handleLabelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
*/
@Override
protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
if (event != null) {
refresh(event.getElements());
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.Viewer#getControl()
*/
@Override
public Control getControl() {
return label;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.Viewer#getSelection()
*/
@Override
public ISelection getSelection() {
// not supported
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.Viewer#refresh()
*/
@Override
public void refresh() {
Object input = this.getInput();
if (input != null) {
ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
doRefresh(labelProvider.getText(input), labelProvider.getImage(input));
} else {
doRefresh(null, null);
}
}
/**
* Sets the given text and image to the label.
*
* @param text
* the new text or null
* @param image
* the new image
*/
private void doRefresh(String text, Image image) {
label.setText(text);
label.setImage(image);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection,
* boolean)
*/
@Override
public void setSelection(ISelection selection, boolean reveal) {
// not supported
}
/**
* Refreshes the label if currently chosen element is on the list.
*
* @param objs
* list of changed object
*/
private void refresh(Object[] objs) {
if (objs == null || getInput() == null) {
return;
}
Object input = getInput();
for (int i = 0; i < objs.length; i++) {
if (objs[i].equals(input)) {
refresh();
break;
}
}
}
}
private class EcoreDetailsLabelProvider extends LabelProvider {
public EcoreDetailsLabelProvider() {
// Nothing to do
}
@Override
public Image getImage(Object element) {
if (element instanceof IProxyEPackage) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EPackage")); //$NON-NLS-1$
} else if (element instanceof IProxyEClass) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EClass")); //$NON-NLS-1$
} else if (element instanceof IProxyEDataType) {
return registry.getImage(EcoreEditPlugin.INSTANCE.getImage("full/obj16/EDataType")); //$NON-NLS-1$
}
return null;
}
@Override
public String getText(Object element) {
if (element instanceof IProxyEObject) {
return ((IProxyEObject) element).getURI().toString();
}
return ""; //$NON-NLS-1$
}
}
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private MenuManager _menuManager;
private ToolBar _toolBar;
private ToolItem _toolItem;
private boolean _multi;
protected TreeViewer _ecoreTypeTreeViewer;
private IStatus _status;
private Object[] _currentSelection;
private DetailsContentViewer _details;
private ToggleStatusLineAction _toggleStatusLineAction;
private IHandlerActivation _showViewHandler;
/**
* It is a duplicate of a field in the CLabel class in DetailsContentViewer.
* It is maintained, because the <code>setDetailsLabelProvider()</code>
* could be called before content area is created.
*/
private ILabelProvider _detailsLabelProvider;
private List<ISelectionDialogListener> _selectionListeners = new UniqueEList<ISelectionDialogListener>();
/**
* Creates a new instance of the class.
*
* @param shell
* shell to parent the dialog on
* @param multi
* indicates whether dialog allows to select more than one
* position in its list of items
*/
public TargetPlatformEcoreSelectionDialog(Shell shell, boolean multi) {
super(shell);
_multi = multi;
}
/**
* Creates a new instance of the class. Created dialog won't allow to select
* more than one item.
*
* @param shell
* shell to parent the dialog on
*/
public TargetPlatformEcoreSelectionDialog(Shell shell) {
this(shell, false);
}
/**
* Restores dialog using persisted settings. The default implementation
* restores the status of the details line and the selection history.
*
* @param settings
* settings used to restore dialog
*/
protected void restoreDialog(IDialogSettings settings) {
boolean toggleStatusLine = true;
if (settings.get(SHOW_STATUS_LINE) != null) {
toggleStatusLine = settings.getBoolean(SHOW_STATUS_LINE);
}
_toggleStatusLineAction.setChecked(toggleStatusLine);
_details.setVisible(toggleStatusLine);
}
/**
* Stores dialog settings.
*
* @param settings
* settings used to store dialog
*/
protected void storeDialog(IDialogSettings settings) {
settings.put(SHOW_STATUS_LINE, _toggleStatusLineAction.isChecked());
}
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = EGFCoreUIPlugin.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS);
if (settings == null) {
settings = EGFCoreUIPlugin.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS);
}
return settings;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#close()
*/
@Override
public boolean close() {
if (_showViewHandler != null) {
IHandlerService service = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
service.deactivateHandler(_showViewHandler);
_showViewHandler.getHandler().dispose();
_showViewHandler = null;
}
storeDialog(getDialogSettings());
return super.close();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
Composite content = new Composite(container, SWT.NONE);
content.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout();
layout.marginWidth = 5;
layout.marginWidth = 0;
layout.marginHeight = 0;
content.setLayout(layout);
createHeader(content);
Composite viewer = new Composite(content, SWT.NONE);
viewer.setLayoutData(new GridData(GridData.FILL_BOTH));
layout = new GridLayout();
layout.marginWidth = 5;
layout.marginWidth = 0;
layout.marginHeight = 0;
viewer.setLayout(layout);
Tree tree = new Tree(viewer, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | (_multi ? SWT.MULTI : SWT.SINGLE));
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = tree.getItemHeight() * 11;
tree.setLayoutData(gd);
_ecoreTypeTreeViewer = new TreeViewer(tree);
_ecoreTypeTreeViewer.setContentProvider(new EcoreContentProvider());
_ecoreTypeTreeViewer.setLabelProvider(new EcoreLabelProvider());
_ecoreTypeTreeViewer.setComparator(new ViewerComparator() {
@Override
public int category(Object element) {
if (element instanceof IProxyEObject) {
if (element instanceof IProxyEClassifier) {
return 2;
} else if (element instanceof IProxyEPackage) {
return 1;
}
}
return 10;
}
});
_ecoreTypeTreeViewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer innerViewer, Object parentElement, Object element) {
// TODO at present time, we don't support DataType as type for
// PatternParameter
return element instanceof IProxyERoot || element instanceof IProxyEClass || element instanceof IProxyEPackage;
}
});
_ecoreTypeTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection) event.getSelection();
handleSelected(selection);
}
});
_ecoreTypeTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleDoubleClick();
}
});
Button button = new Button(viewer, SWT.PUSH);
button.setText(CoreUIMessages.TargetPlatformEcoreSelectionDialog_choose_model_button_title);
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
TargetPlatformEcoreDialog chooseModelDialog = new TargetPlatformEcoreDialog(getShell(), true, false, _multi, false, false);
if (chooseModelDialog.open() == Window.OK) {
searchTypeModel(chooseModelDialog.getURIText());
}
}
});
_details = new DetailsContentViewer(content, SWT.BORDER | SWT.FLAT);
_details.setVisible(_toggleStatusLineAction.isChecked());
_details.setContentProvider(new NullContentProvider());
_details.setLabelProvider(getDetailsLabelProvider());
applyDialogFont(content);
restoreDialog(getDialogSettings());
return container;
}
/**
* Create a new header which is labelled by headerLabel.
*
* @param parent
* @return Label the label of the header
*/
private Label createHeader(Composite parent) {
Composite header = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
layout.marginHeight = 0;
header.setLayout(layout);
Label headerLabel = new Label(header, SWT.NONE);
headerLabel.setText((getMessage() != null && getMessage().trim().length() > 0) ? getMessage() : CoreUIMessages.TargetPlatformEcoreSelectionDialog_select);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
headerLabel.setLayoutData(gd);
createViewMenu(header);
header.setLayoutData(gd);
return headerLabel;
}
private void createViewMenu(Composite parent) {
_toolBar = new ToolBar(parent, SWT.FLAT);
_toolItem = new ToolItem(_toolBar, SWT.PUSH, 0);
GridData data = new GridData();
data.horizontalAlignment = GridData.END;
_toolBar.setLayoutData(data);
_toolBar.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
showViewMenu();
}
});
_toolItem.setImage(EGFCoreUIPlugin.getDefault().getImage(IEGFCoreUIImages.IMG_VIEW_MENU));
_toolItem.setToolTipText(CoreUIMessages.TargetPlatformEcoreSelectionDialog_menu);
_toolItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
showViewMenu();
}
});
_menuManager = new MenuManager();
fillViewMenu(_menuManager);
IHandlerService service = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
IHandler handler = new AbstractHandler() {
public Object execute(ExecutionEvent event) {
showViewMenu();
return null;
}
};
_showViewHandler = service.activateHandler("org.eclipse.egf.core.ui.dialogs.EcoreSelectionDialog", handler, new ActiveShellExpression(getShell())); //$NON-NLS-1$
}
/**
* Fills the menu of the dialog.
*
* @param menuManager
* the menu manager
*/
protected void fillViewMenu(IMenuManager menuManager) {
_toggleStatusLineAction = new ToggleStatusLineAction();
menuManager.add(_toggleStatusLineAction);
}
private void showViewMenu() {
Menu menu = _menuManager.createContextMenu(getShell());
Rectangle bounds = _toolItem.getBounds();
Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
topLeft = _toolBar.toDisplay(topLeft);
menu.setLocation(topLeft.x, topLeft.y);
menu.setVisible(true);
}
/**
* Sets label provider for the details field.
*
* For a single selection, the element sent to {@link ILabelProvider#getImage(Object)} and {@link ILabelProvider#getText(Object)} is the selected object, for
* multiple selection a {@link String} with amount of selected items is the
* element.
*
* @see #getSelectedItems() getSelectedItems() can be used to retrieve
* selected items and get the items count.
*
* @param detailsLabelProvider
* the label provider for the details field
*/
public void setDetailsLabelProvider(ILabelProvider detailsLabelProvider) {
this._detailsLabelProvider = detailsLabelProvider;
if (_details != null) {
_details.setLabelProvider(detailsLabelProvider);
}
}
private ILabelProvider getDetailsLabelProvider() {
if (_detailsLabelProvider == null) {
_detailsLabelProvider = new EcoreDetailsLabelProvider();
}
return _detailsLabelProvider;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult()
*/
@Override
@SuppressWarnings("unchecked")
protected void computeResult() {
List<Object> selectedElements = ((StructuredSelection) _ecoreTypeTreeViewer.getSelection()).toList();
List<Object> objectsToReturn = new ArrayList<Object>();
for (Object object : selectedElements) {
URI uri = null;
if (object instanceof IProxyEObject) {
uri = ((IProxyEObject) object).getURI();
}
if (uri != null && uri.isEmpty() == false && "#//".equals(uri.toString()) == false) { //$NON-NLS-1$
objectsToReturn.add(uri.toString());
}
}
setResult(objectsToReturn);
}
protected void searchTypeModel(String buffer) {
if (buffer == null || buffer.trim().length() == 0) {
return;
}
String[] textUris = buffer.split(" "); //$NON-NLS-1$
IProxyERoot root = null;
for (String textUri : textUris) {
try {
if (textUri == null || textUri.trim().length() == 0) {
continue;
}
URI uri = URI.createURI(textUri.trim());
root = EGFCorePlugin.getTargetPlatformIProxyERoot(uri);
if (root != null) {
break;
}
} catch (Throwable t) {
EGFCoreUIPlugin.getDefault().logError(NLS.bind(CoreUIMessages.ModelSelection_errorMessage, textUri));
}
}
if (root != null) {
_ecoreTypeTreeViewer.setInput(root);
_ecoreTypeTreeViewer.expandToLevel(2);
}
}
/**
* Handle selection in the items list by updating labels of selected and
* unselected items and refresh the details field using the selection.
*
* @param selection
* the new selection
*/
protected void handleSelected(StructuredSelection selection) {
IStatus status = new Status(IStatus.OK, EGFCoreUIPlugin.getDefault().getPluginID(), IStatus.OK, EMPTY_STRING, null);
Object[] lastSelection = _currentSelection;
_currentSelection = selection.toArray();
if (selection.size() == 0) {
status = new Status(IStatus.ERROR, EGFCoreUIPlugin.getDefault().getPluginID(), IStatus.ERROR, EMPTY_STRING, null);
if (lastSelection != null) {
_ecoreTypeTreeViewer.update(lastSelection, null);
}
_currentSelection = null;
} else {
status = new Status(IStatus.ERROR, EGFCoreUIPlugin.getDefault().getPluginID(), IStatus.ERROR, EMPTY_STRING, null);
List<?> items = selection.toList();
IStatus tempStatus = null;
for (Object item : items) {
tempStatus = validateItem(item);
if (tempStatus.isOK()) {
status = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, EMPTY_STRING, null);
} else {
status = tempStatus;
// if any selected element is not valid status is set to
// ERROR
break;
}
}
notifySelectionListeners(items.toArray());
if (lastSelection != null) {
_ecoreTypeTreeViewer.update(lastSelection, null);
}
}
refreshDetails();
updateStatus(status);
}
/*
* @see org.eclipse.ui.dialogs.SelectionStatusDialog#updateStatus(org.eclipse.core.runtime.IStatus)
*/
@Override
protected void updateStatus(IStatus status) {
_status = status;
super.updateStatus(status);
}
/*
* @see Dialog#okPressed()
*/
@Override
protected void okPressed() {
if (_status != null && (_status.isOK() || _status.getCode() == IStatus.INFO)) {
super.okPressed();
}
}
/**
* Hack to use a dialog in a wizard page
*
* @return the current shell or its parent shell
*/
@Override
public Shell getShell() {
return super.getShell() != null ? super.getShell() : getParentShell();
}
/**
* This method is a hook for subclasses to override default dialog behavior.
* The <code>handleDoubleClick()</code> method handles double clicks on
* the list of filtered elements.
* <p>
* Current implementation makes double-clicking on the list do the same as
* pressing <code>OK</code> button on the dialog.
*/
protected void handleDoubleClick() {
okPressed();
}
protected IStatus validateItem(Object item) {
return new Status(IStatus.OK, EGFCoreUIPlugin.getDefault().getPluginID(), 0, "", null); //$NON-NLS-1$
}
/**
* Returns the current selection.
*
* @return the current selection
*/
protected StructuredSelection getSelectedItems() {
return new StructuredSelection(((StructuredSelection) _ecoreTypeTreeViewer.getSelection()).toList());
}
/**
* Refreshes the details field according to the current selection in the
* items list.
*/
private void refreshDetails() {
StructuredSelection selection = getSelectedItems();
switch (selection.size()) {
case 0:
_details.setInput(null);
break;
case 1:
_details.setInput(selection.getFirstElement());
break;
default:
_details.setInput(NLS.bind(CoreUIMessages.TargetPlatformEcoreSelectionDialog_nItemsSelected, new Integer(selection.size())));
break;
}
}
/**
* Hack to use a dialog in a wizard page
*
* @return Control
*
*/
public Control createPage(Composite parent) {
return dialogArea = createDialogArea(parent);
}
public boolean addSelectionListeners(ISelectionDialogListener listener) {
if (listener == null) {
return false;
}
return _selectionListeners.add(listener);
}
public boolean removeSelectionListeners(ISelectionDialogListener listener) {
if (listener == null) {
return false;
}
return _selectionListeners.remove(listener);
}
public void notifySelectionListeners(Object[] selected) {
for (ISelectionDialogListener listener : _selectionListeners) {
listener.handleSelected(selected);
}
}
}