blob: 81222bb8036321552fa8d127fdd59fb3abe918de [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 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.outline;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.CallExp;
import org.eclipse.ocl.pivot.Constraint;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.Operation;
import org.eclipse.ocl.pivot.Parameter;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.ocl.pivot.utilities.Pivotable;
import org.eclipse.ocl.pivot.utilities.TracingOption;
import org.eclipse.ocl.xtext.base.ui.BaseUiPluginHelper;
import org.eclipse.ocl.xtext.base.utilities.ElementUtil;
import org.eclipse.ocl.xtext.basecs.ElementCS;
import org.eclipse.ocl.xtext.basecs.ModelElementCS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
import org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode;
import org.eclipse.xtext.ui.editor.outline.impl.EObjectNode;
/**
* customization of the default outline structure
*
*/
public class BaseOutlineTreeProvider extends DefaultOutlineTreeProvider
{
public static final @NonNull TracingOption CREATE = new TracingOption(
BaseUiPluginHelper.PLUGIN_ID, "outline/create"); //$NON-NLS-1$
@Override
protected EObjectNode createEObjectNode(IOutlineNode parentNode, EObject modelElement, Image image, Object text, boolean isLeaf) {
EObject asElement = modelElement;
if (modelElement instanceof Pivotable) {
Pivotable pivotable = (Pivotable) modelElement;
Element pivot = pivotable.getPivot();
if (pivot != null) {
asElement = pivot;
}
}
EObjectNode eObjectNode;
if (asElement instanceof Element) {
boolean isImplicit = false;
ElementCS csElement = ElementUtil.getCsElement((Element)asElement);
if (csElement == null) {
csElement = getImplicitCsElement((Element)asElement);
isImplicit = csElement != null;
}
eObjectNode = new BaseOutlineNode((Element)asElement, isImplicit, csElement, parentNode, image, text, isLeaf);
}
else {
eObjectNode = new EObjectNode(modelElement, parentNode, image, text, isLeaf);
}
if ((asElement != null) /*&& isLocalElement(parentNode, asElement)*/) {
eObjectNode.setTextRegion(locationInFileProvider.getFullTextRegion(asElement));
eObjectNode.setShortTextRegion(locationInFileProvider.getSignificantTextRegion(asElement));
}
if (CREATE.isActive()) {
StringBuilder s = new StringBuilder();
s.append(modelElement.eClass().getName());
s.append(" ");
ElementUtil.appendTextRegion(s, eObjectNode.getFullTextRegion(), false);
s.append(" ");
ElementUtil.appendTextRegion(s, eObjectNode.getSignificantTextRegion(), true);
s.append(" " + NameUtil.debugSimpleName(eObjectNode) + " " + String.valueOf(eObjectNode.getText()).replace("\n", "\\n"));
CREATE.println(s.toString());
}
return eObjectNode;
}
/**
* The default creation of outline children is refined to create a node for an implicit
* element such as oclAsSet and to ignore null model elements.
*/
@Override
public void createChildren(IOutlineNode parent, EObject modelElement) {
if (modelElement != null) {
super.createChildren(parent, modelElement);
}
}
/**
* The default creation of outline node is refined to ignore null model elements.
*/
@Override
protected void createNode(IOutlineNode parent, EObject modelElement) {
if (modelElement != null) {
super.createNode(parent, modelElement);
}
}
protected @Nullable ElementCS getImplicitCsElement(@NonNull Element asElement) {
return null;
}
/**
* In the absence of a declarative override, creation of the children an outline node for a CS element
* is redirected to its AS counterpart and if this is an implicit node the AS element is corrected to be
* the implicit AS element.
*/
protected void _createChildren(IOutlineNode parent, ModelElementCS csElement) {
Element asElement = csElement.getPivot();
if ((parent instanceof BaseOutlineNode) && ((BaseOutlineNode)parent).isImplicit() && (asElement instanceof CallExp)) {
asElement = ((CallExp)asElement).getOwnedSource();
}
createChildren(parent, asElement);
}
/**
* In the absence of a declarative override, creation of an outline node for a CS element
* is redirected to its AS counterpart.
*/
protected void _createNode(DocumentRootNode parentNode, ModelElementCS csElement) {
createNode(parentNode, csElement.getPivot());
}
/**
* In the absence of a declarative override, creation of an outline node for a CS element
* is redirected to its AS counterpart.
*/
protected void _createNode(IOutlineNode parent, ModelElementCS csElement) {
createNode(parent, csElement.getPivot());
}
protected void _createChildren(IOutlineNode parentNode, Constraint constraint) {
createNode(parentNode, constraint.getOwnedSpecification());
}
protected void _createChildren(IOutlineNode parentNode, Operation ele) {
for (Parameter parameter : ele.getOwnedParameters()) {
createNode(parentNode, parameter);
}
createNode(parentNode, ele.getBodyExpression());
}
// protected void _createNode(IOutlineNode parentNode, TemplateParameter
// templateParameter) {
// createNode(parentNode, templateParameter.getParameteredElement());
// }
// protected void _createNode(IOutlineNode parentNode, TemplateSignature
// templateSignature) {
// createChildren(parentNode, templateSignature);
// }
// protected boolean _isLeaf(Variable csExp) {
// return true;
// }
}