/******************************************************************************* * Copyright (c) 2012, 2014 Willink Transformations 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: * E.D.Willink - initial API and implementation *******************************************************************************/ package org.eclipse.ocl.xtext.markup.ui.hover; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextUtilities; import org.eclipse.xtext.nodemodel.ILeafNode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.parser.IParseResult; import org.eclipse.xtext.resource.ILocationInFileProvider; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.hover.AbstractEObjectHover; import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider; import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider.IInformationControlCreatorProvider; import org.eclipse.xtext.util.ITextRegion; import org.eclipse.xtext.util.Pair; import org.eclipse.xtext.util.TextRegion; import org.eclipse.xtext.util.Tuples; import com.google.inject.Inject; //Reimplements DispatchingEObjectTextHover to suppress 'standard' Ecore' support public class MarkupHover extends AbstractEObjectHover { @Inject private ILocationInFileProvider locationInFileProvider; @Inject IEObjectHoverProvider hoverProvider; private IInformationControlCreatorProvider lastCreatorProvider; @Override public IInformationControlCreator getHoverControlCreator() { return this.lastCreatorProvider==null?null:lastCreatorProvider.getHoverControlCreator(); } @Override public Object getHoverInfo(EObject first, ITextViewer textViewer, IRegion hoverRegion) { // IEObjectHoverProvider hoverProvider = serviceProvider.findService(first, IEObjectHoverProvider.class); // if (hoverProvider==null) // return null; IInformationControlCreatorProvider creatorProvider = hoverProvider.getHoverInfo(first, textViewer, hoverRegion); if (creatorProvider==null) return null; this.lastCreatorProvider = creatorProvider; return lastCreatorProvider.getInfo(); } @Override protected Pair<EObject, IRegion> getXtextElementAt(XtextResource resource, int offset) { // // Overrides to return the CS node so that the MetamodelManager is accessible for documentation. // TextRegion textRegion = new TextRegion(offset, 0); IParseResult parseResult = resource.getParseResult(); if (parseResult == null) { return null; } ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), textRegion.getOffset()); if (leaf == null) { return null; } EObject o = leaf.getSemanticElement(); if (o != null) { ITextRegion region = locationInFileProvider.getSignificantTextRegion(o); final IRegion region2 = new Region(region.getOffset(), region.getLength()); if (TextUtilities.overlaps(region2, new Region(offset, 0))) return Tuples.create(o, region2); } return super.getXtextElementAt(resource, offset); } }