blob: b0875ed3ee876e09c2bdb6adbee62d99cdaab491 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}