blob: 57addb2a263b068f2096f9357ee7574ff016707e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2018 Willink Transformations 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
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.xtext.base.ui.utilities;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.EObjectNode;
import org.eclipse.xtext.ui.editor.outline.impl.EStructuralFeatureNode;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
public class BaseUIUtil
{
public static @Nullable IXtextDocument getActiveDocument(@Nullable IWorkbenchSite site) {
try {
if (site == null) {
return null;
}
IWorkbenchWindow workbenchWindow = site.getWorkbenchWindow();
if (workbenchWindow == null) {
return null;
}
IWorkbenchPage activePage = workbenchWindow.getActivePage();
if (activePage == null) {
return null;
}
IEditorPart activeEditor = activePage.getActiveEditor();
if (!(activeEditor instanceof XtextEditor)) {
return null;
}
IXtextDocument xtextDocument = ((XtextEditor)activeEditor).getDocument();
return xtextDocument;
}
catch (Exception e) {
return null;
}
}
public static @Nullable ISelection getActiveSelection(@Nullable IWorkbenchSite site) {
try {
if (site == null) {
return null;
}
IWorkbenchWindow workbenchWindow = site.getWorkbenchWindow();
if (workbenchWindow == null) {
return null;
}
IWorkbenchPage activePage = workbenchWindow.getActivePage();
if (activePage == null) {
return null;
}
IEditorPart activeEditor = activePage.getActiveEditor();
if (activeEditor == null) {
return null;
}
IEditorSite editorSite = activeEditor.getEditorSite();
if (editorSite == null) {
return null;
}
ISelectionProvider selectionProvider = editorSite.getSelectionProvider();
if (selectionProvider == null) {
return null;
}
return selectionProvider.getSelection();
}
catch (Exception e) {
return null;
}
}
public static @Nullable Object getSelectedObject(@Nullable ISelection sel, @Nullable IWorkbenchSite site) {
Object selectedObject = null;
if (sel instanceof ITextSelection) {
selectedObject = BaseUIUtil.getXtextTextSelection((ITextSelection)sel, site);
}
else {
if (sel instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) sel;
if (!ssel.isEmpty()) {
selectedObject = ssel.getFirstElement();
}
}
if (selectedObject instanceof IOutlineNode) {
selectedObject = BaseUIUtil.getXtextOutlineSelection((IOutlineNode)selectedObject, site);
}
}
return selectedObject;
}
public static @Nullable Object getXtextOutlineSelection(@NonNull IOutlineNode outlineNodeSelection, @Nullable IWorkbenchSite site) {
if (outlineNodeSelection instanceof EObjectNode) {
final EObjectNode selectedObjectNode = (EObjectNode) outlineNodeSelection;
IXtextDocument xtextDocument = getActiveDocument(site);
if (xtextDocument != null) {
final URI eObjectURI = selectedObjectNode.getEObjectURI();
if (eObjectURI != null) {
return xtextDocument.readOnly(new IUnitOfWork<EObject, XtextResource>()
{
@Override
public EObject exec(@Nullable XtextResource resource) throws Exception {
if (resource == null) {
return null;
}
String fragment = eObjectURI.fragment();
if (fragment == null) {
return null;
}
return resource.getEObject(fragment);
}
});
}
}
}
else if (outlineNodeSelection instanceof EStructuralFeatureNode) {
// return null;
}
return null;
}
public static @Nullable Object getXtextTextSelection(final @NonNull ITextSelection textSelection, @Nullable IWorkbenchSite site) {
IXtextDocument xtextDocument = getActiveDocument(site);
if (xtextDocument == null) {
return null;
}
return xtextDocument.readOnly(new IUnitOfWork<EObject, XtextResource>()
{
@Override
public EObject exec(@Nullable XtextResource resource) throws Exception {
if (resource == null) {
return null;
}
if (resource.getContents().size() <= 0) {
return null;
}
EObject rootObject = resource.getContents().get(0);
INode rootNode = NodeModelUtils.getNode(rootObject);
if (rootNode == null) {
return null;
}
ILeafNode leafNode = NodeModelUtils.findLeafNodeAtOffset(rootNode, textSelection.getOffset());
if (leafNode == null) {
return null;
}
return leafNode.getSemanticElement();
}
});
}
public static void toggleNature(@NonNull IProjectDescription description, @NonNull String natureId) {
String[] natures = description.getNatureIds();
for (int i = 0; i < natures.length; ++i) {
if (natureId.equals(natures[i])) {
// Remove the nature
String[] newNatures = new String[natures.length - 1];
System.arraycopy(natures, 0, newNatures, 0, i);
System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1);
description.setNatureIds(newNatures);
return;
}
}
// Add the nature
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = natureId;
description.setNatureIds(newNatures);
}
}