Java tutorial
/******************************************************************************* * 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 v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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.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.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.wb.swt.ResourceManager; import com.google.common.collect.Lists; public class ModelRefactoringView extends ViewPart implements ISelectionListener { /** * 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(); } } } } /** * 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( ResourceManager.getPluginImage("org.eclipse.ease.modules.modeling.ui", "icons/start_task-1.gif")); //$NON-NLS-1$ //$NON-NLS-2$ 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( ResourceManager.getPluginImage("org.eclipse.ease.modules.modeling.ui", "icons/delete_obj.gif")); //$NON-NLS-1$ //$NON-NLS-2$ 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); } }