| /******************************************************************************* |
| * Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Alexandra Buzila - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.emf.ecp.ide.editor.view; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.util.FeatureMap; |
| import org.eclipse.emf.ecore.xml.type.AnyType; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.viewers.ArrayContentProvider; |
| import org.eclipse.jface.viewers.ColumnLabelProvider; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TableViewerColumn; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.layout.GridData; |
| 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.Shell; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.TableItem; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * @author Alexandra Buzila |
| * |
| */ |
| public class UnknownFeaturesDialog extends Dialog { |
| /** The unresolved features. */ |
| private final Map<EObject, AnyType> objects; |
| /** The dialog description. */ |
| private String description; |
| |
| private final String title; |
| |
| /** |
| * @param parentShell the shell for creating the dialog |
| * @param title the title of the dialog |
| * @param objects the map of unresolved {@link EObject}s and their corresponding {@link AnyType} |
| */ |
| protected UnknownFeaturesDialog(Shell parentShell, String title, Map<EObject, AnyType> objects) { |
| super(parentShell); |
| this.objects = objects; |
| this.title = title; |
| setDescription("The following features could not be migrated:"); //$NON-NLS-1$ |
| |
| } |
| |
| @Override |
| protected void configureShell(Shell shell) { |
| super.configureShell(shell); |
| shell.setText(title); |
| } |
| |
| @Override |
| protected Control createDialogArea(Composite parent) { |
| final Composite composite = (Composite) super.createDialogArea(parent); |
| |
| final Label label = new Label(composite, SWT.WRAP); |
| label.setText(getDescription()); |
| |
| final TableViewer viewer = new TableViewer(parent, SWT.H_SCROLL |
| | SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER); |
| final Table table = viewer.getTable(); |
| table.setHeaderVisible(true); |
| table.setLinesVisible(false); |
| table.setToolTipText(""); //$NON-NLS-1$ |
| final Listener tableListener = getTableListener(composite, table); |
| table.addListener(SWT.Dispose, tableListener); |
| table.addListener(SWT.KeyDown, tableListener); |
| table.addListener(SWT.MouseMove, tableListener); |
| table.addListener(SWT.MouseHover, tableListener); |
| |
| viewer.setContentProvider(ArrayContentProvider.getInstance()); |
| viewer.setInput(getInput()); |
| createColumns(parent, viewer); |
| |
| final GridData gridData = new GridData(); |
| gridData.verticalAlignment = GridData.FILL; |
| gridData.horizontalSpan = 2; |
| gridData.grabExcessHorizontalSpace = true; |
| gridData.grabExcessVerticalSpace = true; |
| gridData.horizontalAlignment = GridData.FILL; |
| viewer.getControl().setLayoutData(gridData); |
| |
| viewer.refresh(true); |
| composite.layout(); |
| return composite; |
| } |
| |
| private Listener getLabelListener(final Table table) { |
| return new Listener() { |
| @Override |
| public void handleEvent(Event event) { |
| final Text label = (Text) event.widget; |
| final Shell shell = label.getShell(); |
| switch (event.type) { |
| case SWT.MouseDown: |
| final Event e = new Event(); |
| e.item = (TableItem) label.getData("_TABLEITEM"); //$NON-NLS-1$ |
| table.setSelection(new TableItem[] { (TableItem) e.item }); |
| table.notifyListeners(SWT.Selection, e); |
| shell.dispose(); |
| table.setFocus(); |
| break; |
| case SWT.MouseExit: |
| shell.dispose(); |
| break; |
| default: |
| break; |
| } |
| } |
| }; |
| } |
| |
| private Listener getTableListener(final Composite composite, final Table table) { |
| return new TableListener(table, composite); |
| } |
| |
| /** |
| * @return |
| */ |
| private List<InputElement> getInput() { |
| final List<InputElement> input = new ArrayList<InputElement>(); |
| for (final Iterator<Entry<EObject, AnyType>> itr = getObjects().entrySet().iterator(); itr |
| .hasNext();) { |
| final Entry<EObject, AnyType> entry = itr.next(); |
| final AnyType value = entry.getValue(); |
| final FeatureMap mixed = value.getMixed(); |
| for (int i = 0; i < mixed.size(); i++) { |
| final AnyType object = (AnyType) mixed.getValue(i); |
| final FeatureMap anyAttribute2 = object.getAnyAttribute(); |
| final FeatureMap mixed2 = object.getMixed(); |
| for (int i1 = 0; i1 < anyAttribute2.size(); i1++) { |
| final String vvalue = (String) anyAttribute2.getValue(i1); |
| input.add(new InputElement(object.eClass().getName(), vvalue)); |
| vvalue.toString(); |
| } |
| for (int i1 = 0; i1 < mixed2.size(); i1++) { |
| if (AnyType.class.isInstance(mixed2.getValue(i1))) { |
| final String value2 = mixed2.getEStructuralFeature(i1).getName(); |
| final String object2 = mixed2.getValue(i1).toString(); |
| input.add(new InputElement(object2, value2)); |
| } |
| } |
| } |
| } |
| return input; |
| } |
| |
| /** |
| * @param parent |
| * @param viewer |
| */ |
| private void createColumns(Composite parent, TableViewer viewer) { |
| final String[] titles = { "Type", "Name", "" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| final int[] bounds = { 200, 200 }; |
| |
| for (final TableColumn column : viewer.getTable().getColumns()) { |
| column.dispose(); |
| } |
| |
| TableViewerColumn col = createTableViewerColumn(viewer, titles[0], bounds[0], 0); |
| col.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| final InputElement inputEl = (InputElement) element; |
| return inputEl.getObjectType(); |
| } |
| }); |
| |
| col = createTableViewerColumn(viewer, titles[1], bounds[1], 1); |
| col.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| final InputElement inputEl = (InputElement) element; |
| return inputEl.getObjectName(); |
| } |
| }); |
| } |
| |
| private TableViewerColumn createTableViewerColumn(TableViewer viewer, String title, int bound, final int colNumber) { |
| final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, |
| SWT.NONE); |
| final TableColumn column = viewerColumn.getColumn(); |
| column.setText(title); |
| column.setWidth(bound); |
| column.setResizable(true); |
| column.setMoveable(true); |
| return viewerColumn; |
| } |
| |
| @Override |
| public boolean close() { |
| // stuff goes here |
| // .... |
| return super.close(); |
| } |
| |
| /** |
| * @return the description |
| */ |
| public String getDescription() { |
| return description; |
| } |
| |
| /** |
| * @param description the description to set |
| */ |
| public void setDescription(String description) { |
| this.description = description; |
| } |
| |
| /** |
| * @return the objects |
| */ |
| public Map<EObject, AnyType> getObjects() { |
| return objects; |
| } |
| |
| /** |
| * @author Jonas |
| * |
| */ |
| private final class TableListener implements Listener { |
| private final Table table; |
| private final Composite composite; |
| private Shell tip; |
| private Text text; |
| |
| /** |
| * @param table |
| * @param composite |
| */ |
| private TableListener(Table table, Composite composite) { |
| this.table = table; |
| this.composite = composite; |
| } |
| |
| @Override |
| public void handleEvent(Event event) { |
| switch (event.type) { |
| case SWT.Dispose: { |
| break; |
| } |
| case SWT.KeyDown: { |
| break; |
| } |
| case SWT.MouseMove: { |
| if (tip == null) { |
| break; |
| } |
| tip.dispose(); |
| tip = null; |
| text = null; |
| break; |
| } |
| case SWT.MouseHover: { |
| final TableItem item = table.getItem(new Point(event.x, event.y)); |
| if (item != null) { |
| if (tip != null && !tip.isDisposed()) { |
| tip.dispose(); |
| } |
| tip = new Shell(composite.getShell(), SWT.ON_TOP | SWT.TOOL | SWT.NO_FOCUS); |
| tip.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); |
| final FillLayout layout = new FillLayout(); |
| layout.marginWidth = 2; |
| tip.setLayout(layout); |
| |
| text = new Text(tip, SWT.MULTI); |
| text.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); |
| text.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); |
| text.setData("_TABLEITEM", item); //$NON-NLS-1$ |
| text.setText(item.getText()); |
| text.setEditable(false); |
| |
| text.addListener(SWT.MouseExit, getLabelListener(table)); |
| final Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT); |
| final Rectangle rect = item.getBounds(0); |
| final Point pt = table.toDisplay(rect.x, rect.y); |
| tip.setBounds(pt.x, pt.y, size.x, size.y); |
| tip.setVisible(true); |
| } |
| break; |
| } |
| default: |
| break; |
| } |
| } |
| } |
| |
| /** The dialog's TableViewer's input elements. */ |
| private class InputElement { |
| private final String objectType; |
| |
| /** |
| * @return the objectType |
| */ |
| public String getObjectType() { |
| return objectType; |
| } |
| |
| private final String objectName; |
| |
| /** |
| * @return the objectName |
| */ |
| public String getObjectName() { |
| return objectName; |
| } |
| |
| InputElement(String type, String name) { |
| objectType = type; |
| objectName = name; |
| } |
| |
| } |
| |
| } |