org.eclipse.ease.modules.modeling.ui.views.ModelRefactoringView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ease.modules.modeling.ui.views.ModelRefactoringView.java

Source

/*******************************************************************************
 * 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);
    }
}