| /******************************************************************************* |
| * Copyright (c) 2015 CNES and others. |
| * All rights reserved. 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-2.0/ |
| * |
| * SPDX-License_Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * JF Rolland (Atos) - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ease.modules.modeling.ui.views; |
| |
| import java.util.Collection; |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.ease.modules.modeling.ui.Activator; |
| import org.eclipse.ease.modules.modeling.ui.MatcherRegistry; |
| import org.eclipse.ease.modules.modeling.ui.Messages; |
| import org.eclipse.ease.modules.modeling.ui.exceptions.MatcherException; |
| import org.eclipse.ease.modules.modeling.ui.matchers.IMatcher; |
| import org.eclipse.ease.modules.modeling.ui.utils.SelectionUtils; |
| import org.eclipse.emf.common.ui.viewer.IViewerProvider; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EValidator; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.emf.edit.domain.IEditingDomainProvider; |
| import org.eclipse.emf.edit.provider.ComposedAdapterFactory; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; |
| import org.eclipse.jface.dialogs.IMessageProvider; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.ArrayContentProvider; |
| import org.eclipse.jface.viewers.ComboViewer; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.IDoubleClickListener; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.ISelectionProvider; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITableLabelProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredViewer; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TableViewerColumn; |
| import org.eclipse.jface.viewers.TreePath; |
| import org.eclipse.jface.viewers.TreeSelection; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.KeyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Image; |
| 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.Display; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.TabFolder; |
| import org.eclipse.swt.widgets.TabItem; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.ui.ISelectionListener; |
| import org.eclipse.ui.ISelectionService; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.forms.widgets.Form; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| import org.eclipse.ui.ide.IGotoMarker; |
| import org.eclipse.ui.part.ViewPart; |
| import org.eclipse.ui.plugin.AbstractUIPlugin; |
| |
| import com.google.common.collect.Lists; |
| |
| public class ModelRefactoringView extends ViewPart implements ISelectionListener { |
| |
| /** |
| * |
| */ |
| private static final String ICONS_START_TASK_1_GIF = "icons/start_task-1.gif"; |
| /** |
| * |
| */ |
| private static final String ICONS_DELETE_OBJ_GIF = "icons/delete_obj.gif"; |
| /** |
| * The ID of the view as specified by the extension. |
| */ |
| public static final String ID = "org.eclipse.ease.modules.modeling.ui.view"; //$NON-NLS-1$ |
| private final FormToolkit formToolkit = new FormToolkit(Display.getDefault()); |
| List<StructuredViewer> viewers = new LinkedList<StructuredViewer>(); |
| ComposedAdapterFactory factory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); |
| private Text text; |
| private Form frmNavigation; |
| private Text selectionId; |
| private Table table_Search; |
| private TableViewer tableViewer_Search; |
| private ComboViewer comboViewer; |
| |
| /** |
| * The constructor. |
| */ |
| public ModelRefactoringView() { |
| } |
| |
| @Override |
| public void dispose() { |
| ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); |
| service.removeSelectionListener(this); |
| super.dispose(); |
| } |
| |
| protected boolean gotoInEditor(IEditingDomainProvider editor, EObject e) throws MatcherException { |
| if (editor == null) { |
| return false; |
| } |
| if (e != null) { |
| if (editor instanceof IViewerProvider) { |
| IViewerProvider provider = (IViewerProvider) editor; |
| provider.getViewer().setSelection(new TreeSelection(getTreePath(e)), true); |
| return true; |
| } else if (editor instanceof IGotoMarker) { |
| IGotoMarker gotoMarker = (IGotoMarker) editor; |
| EObject root = SelectionUtils.getSelection(editor); |
| Resource r = root.eResource(); |
| IFile f = WorkspaceSynchronizer.getFile(r); |
| IMarker marker = null; |
| try { |
| marker = f.createMarker(EValidator.MARKER); |
| marker.setAttribute(EValidator.URI_ATTRIBUTE, EcoreUtil.getURI(e).toString()); |
| marker.setAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$ |
| marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO); |
| gotoMarker.gotoMarker(marker); |
| } catch (CoreException e1) { |
| e1.printStackTrace(); |
| } finally { |
| if (marker != null) { |
| try { |
| marker.delete(); |
| } catch (CoreException e1) { |
| } |
| } |
| } |
| |
| } |
| } |
| return false; |
| } |
| |
| private TreePath getTreePath(EObject e) { |
| LinkedList<Object> result = new LinkedList<Object>(); |
| while (e != null) { |
| result.addFirst(e); |
| e = e.eContainer(); |
| } |
| return new TreePath(result.toArray()); |
| } |
| |
| protected IEditingDomainProvider getCurrentEditor() { |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window != null) { |
| IWorkbenchPage activePage = window.getActivePage(); |
| if (activePage != null) { |
| if (activePage.getActiveEditor() instanceof IEditingDomainProvider) { |
| IEditingDomainProvider editor = (IEditingDomainProvider) activePage.getActiveEditor(); |
| return editor; |
| } |
| } |
| } |
| return null; |
| } |
| |
| protected void handleGoto() { |
| String theText = text.getText(); |
| frmNavigation.setMessage(null); |
| ISelection selec = comboViewer.getSelection(); |
| if (selec instanceof IStructuredSelection) { |
| IStructuredSelection structured = (IStructuredSelection) selec; |
| if (structured.getFirstElement() instanceof IMatcher) { |
| IMatcher matcher = (IMatcher) structured.getFirstElement(); |
| Collection<EObject> toUse; |
| try { |
| toUse = matcher.getElements(theText, getCurrentEditor()); |
| toUse.remove(null); |
| if (toUse.isEmpty()) { |
| if (frmNavigation.getMessage() == null) { |
| frmNavigation.setMessage(Messages.ModelRefactoringView_NO_ELEMENTS, IMessageProvider.WARNING); |
| } |
| } |
| tableViewer_Search.setInput(toUse); |
| frmNavigation.setMessage(toUse.size() + Messages.ModelRefactoringView_NB_ELEMENTS_FOUND, IMessageProvider.INFORMATION); |
| } catch (MatcherException e) { |
| frmNavigation.setMessage(e.getMessage(), IMessageProvider.ERROR); |
| e.printStackTrace(); |
| } |
| |
| } |
| } |
| |
| } |
| |
| private Image getFromRegistry(String key, ImageDescriptor desc) { |
| Image i = Activator.getDefault().getImageRegistry().get(key); |
| if (i == null) { |
| Activator.getDefault().getImageRegistry().put(key, desc); |
| i = Activator.getDefault().getImageRegistry().get(key); |
| } |
| return i; |
| } |
| |
| /** |
| * This is a callback that will allow us to create the viewer and initialize it. |
| */ |
| @Override |
| public void createPartControl(Composite parent) { |
| ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); |
| service.addSelectionListener(this); |
| frmNavigation = formToolkit.createForm(parent); |
| formToolkit.paintBordersFor(frmNavigation); |
| frmNavigation.setText(Messages.ModelRefactoringView_NAVIGATION); |
| frmNavigation.getBody().setLayout(new GridLayout(1, false)); |
| |
| TabFolder tabFolder = new TabFolder(frmNavigation.getBody(), SWT.NONE); |
| tabFolder.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); |
| tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| formToolkit.adapt(tabFolder); |
| formToolkit.paintBordersFor(tabFolder); |
| |
| TabItem tbtmSearch = new TabItem(tabFolder, SWT.NONE); |
| tbtmSearch.setText(Messages.ModelRefactoringView_SEARCH); |
| |
| Composite composite_2 = formToolkit.createComposite(tabFolder, SWT.NONE); |
| tbtmSearch.setControl(composite_2); |
| formToolkit.paintBordersFor(composite_2); |
| composite_2.setLayout(new GridLayout(4, false)); |
| |
| Label lblSelectionId = new Label(composite_2, SWT.NONE); |
| lblSelectionId.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); |
| formToolkit.adapt(lblSelectionId, true, true); |
| lblSelectionId.setText(Messages.ModelRefactoringView_SELECTION_ID); |
| |
| selectionId = new Text(composite_2, SWT.BORDER); |
| selectionId.setEditable(false); |
| selectionId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1)); |
| formToolkit.adapt(selectionId, true, true); |
| |
| comboViewer = new ComboViewer(composite_2, SWT.READ_ONLY); |
| comboViewer.setLabelProvider(new LabelProvider() { |
| @Override |
| public String getText(Object element) { |
| return ((IMatcher) element).getText(); |
| } |
| }); |
| comboViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| if (event.getSelection() instanceof IStructuredSelection) { |
| IStructuredSelection selec = (IStructuredSelection) event.getSelection(); |
| if (selec.getFirstElement() instanceof IMatcher) { |
| final IMatcher matcher = (IMatcher) selec.getFirstElement(); |
| Display.getDefault().syncExec(new Runnable() { |
| |
| @Override |
| public void run() { |
| text.setToolTipText(matcher.getHelp()); |
| } |
| }); |
| } |
| } |
| } |
| }); |
| comboViewer.setContentProvider(ArrayContentProvider.getInstance()); |
| comboViewer.setInput(MatcherRegistry.getMatchers()); |
| comboViewer.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); |
| formToolkit.adapt(comboViewer.getCombo(), true, true); |
| |
| Button btnGo = new Button(composite_2, SWT.NONE); |
| btnGo.setImage(getFromRegistry(ICONS_START_TASK_1_GIF, |
| AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ease.modules.modeling.ui", ICONS_START_TASK_1_GIF))); |
| btnGo.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| handleGoto(); |
| } |
| |
| }); |
| formToolkit.adapt(btnGo, true, true); |
| Button btnDel = new Button(composite_2, SWT.NONE); |
| btnDel.setImage(getFromRegistry(ICONS_DELETE_OBJ_GIF, |
| AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ease.modules.modeling.ui", ICONS_DELETE_OBJ_GIF))); |
| btnDel.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| clearResult(); |
| } |
| |
| }); |
| formToolkit.adapt(btnDel, true, true); |
| |
| text = new Text(composite_2, SWT.BORDER); |
| text.addKeyListener(new KeyListener() { |
| |
| @Override |
| public void keyPressed(KeyEvent e) { |
| } |
| |
| @Override |
| public void keyReleased(KeyEvent e) { |
| if ((e.keyCode == SWT.KEYPAD_CR || e.keyCode == SWT.CR)) { |
| handleGoto(); |
| } |
| } |
| |
| }); |
| text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1)); |
| formToolkit.adapt(text, true, true); |
| |
| tableViewer_Search = new TableViewer(composite_2, SWT.BORDER | SWT.MULTI | SWT.VIRTUAL); |
| tableViewer_Search.addDoubleClickListener(new IDoubleClickListener() { |
| @Override |
| public void doubleClick(DoubleClickEvent event) { |
| if (event.getSelection() instanceof IStructuredSelection) { |
| IStructuredSelection structured = (IStructuredSelection) event.getSelection(); |
| if (structured.getFirstElement() instanceof EObject) { |
| EObject eo = (EObject) structured.getFirstElement(); |
| try { |
| gotoInEditor(getCurrentEditor(), eo); |
| } catch (MatcherException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| |
| } |
| }); |
| table_Search = tableViewer_Search.getTable(); |
| table_Search.setHeaderVisible(true); |
| table_Search.setLinesVisible(true); |
| table_Search.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1)); |
| formToolkit.paintBordersFor(table_Search); |
| |
| TableViewerColumn tableViewerColumn_5 = new TableViewerColumn(tableViewer_Search, SWT.NONE); |
| TableColumn tblclmnElement_1 = tableViewerColumn_5.getColumn(); |
| tblclmnElement_1.setWidth(100); |
| tblclmnElement_1.setText(Messages.ModelRefactoringView_ELEMENT); |
| |
| TableViewerColumn tableViewerColumn_6 = new TableViewerColumn(tableViewer_Search, SWT.NONE); |
| TableColumn tblclmnPath = tableViewerColumn_6.getColumn(); |
| tblclmnPath.setWidth(229); |
| tblclmnPath.setText(Messages.ModelRefactoringView_PATH); |
| |
| tableViewer_Search.setContentProvider(ArrayContentProvider.getInstance()); |
| tableViewer_Search.setLabelProvider(new DefaultTableLabelProvider() { |
| @Override |
| public Image getColumnImage(Object element, int columnIndex) { |
| switch (columnIndex) { |
| case 0: |
| return p.getImage(element); |
| } |
| return super.getColumnImage(element, columnIndex); |
| } |
| |
| @Override |
| public String getColumnText(Object element, int columnIndex) { |
| switch (columnIndex) { |
| case 0: |
| return p.getText(element); |
| case 1: |
| if (element instanceof EObject) { |
| EObject e = ((EObject) element).eContainer(); |
| StringBuilder result = new StringBuilder(); |
| while (e != null) { |
| result = new StringBuilder(p.getText(e)).append("\\").append(result); //$NON-NLS-1$ |
| e = e.eContainer(); |
| } |
| return result.toString(); |
| } |
| } |
| return super.getColumnText(element, columnIndex); |
| } |
| }); |
| getSite().setSelectionProvider(new ISelectionProvider() { |
| |
| @Override |
| public void setSelection(ISelection selection) { |
| tableViewer_Search.setSelection(selection); |
| } |
| |
| @Override |
| public void removeSelectionChangedListener(ISelectionChangedListener listener) { |
| tableViewer_Search.removeSelectionChangedListener(listener); |
| } |
| |
| @Override |
| public ISelection getSelection() { |
| return tableViewer_Search.getSelection(); |
| } |
| |
| @Override |
| public void addSelectionChangedListener(ISelectionChangedListener listener) { |
| tableViewer_Search.addSelectionChangedListener(listener); |
| } |
| }); |
| } |
| |
| protected void clearResult() { |
| frmNavigation.setMessage(null); |
| tableViewer_Search.setInput(Lists.newArrayList()); |
| } |
| |
| /** |
| * Passing the focus request to the viewer's control. |
| */ |
| @Override |
| public void setFocus() { |
| tableViewer_Search.getControl().setFocus(); |
| } |
| |
| public ISelection getSelection() { |
| return tableViewer_Search.getSelection(); |
| } |
| |
| @Override |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| frmNavigation.setMessage(null); |
| if (part != this) { |
| if (selection instanceof IStructuredSelection) { |
| IStructuredSelection structured = (IStructuredSelection) selection; |
| if (structured.getFirstElement() instanceof EObject) { |
| EObject eobject = (EObject) structured.getFirstElement(); |
| handleSelectionCHanged(eobject); |
| } else if (structured.getFirstElement() instanceof IAdaptable) { |
| IAdaptable iadaptable = (IAdaptable) structured.getFirstElement(); |
| EObject eobject = (EObject) iadaptable.getAdapter(EObject.class); |
| if (eobject != null) { |
| handleSelectionCHanged(eobject); |
| } |
| } |
| } |
| } |
| } |
| |
| private void handleSelectionCHanged(EObject eobject) { |
| selectionId.setText(eobject.eResource().getURIFragment(eobject).toString()); |
| for (StructuredViewer v : viewers) { |
| v.setInput(eobject); |
| } |
| } |
| |
| public class DefaultContentProvider implements IStructuredContentProvider { |
| |
| @Override |
| public void dispose() { |
| } |
| |
| @Override |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| } |
| |
| @Override |
| public Object[] getElements(Object inputElement) { |
| return null; |
| } |
| |
| } |
| |
| public class DefaultTableLabelProvider implements ITableLabelProvider { |
| protected AdapterFactoryLabelProvider p = new AdapterFactoryLabelProvider(factory); |
| |
| @Override |
| public void addListener(ILabelProviderListener listener) { |
| } |
| |
| @Override |
| public void dispose() { |
| } |
| |
| @Override |
| public boolean isLabelProperty(Object element, String property) { |
| return true; |
| } |
| |
| @Override |
| public void removeListener(ILabelProviderListener listener) { |
| } |
| |
| @Override |
| public Image getColumnImage(Object element, int columnIndex) { |
| if (columnIndex == 0) { |
| return p.getImage(element); |
| } |
| return null; |
| } |
| |
| @Override |
| public String getColumnText(Object element, int columnIndex) { |
| if (columnIndex == 0) { |
| return p.getText(element); |
| } |
| return ""; //$NON-NLS-1$ |
| } |
| } |
| |
| public void setSelectionProvider() { |
| getSite().setSelectionProvider(tableViewer_Search); |
| } |
| } |