blob: ff65f5f470ec30556c3aec4204e6758d08713c63 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.plugin;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.ischema.IMetaAttribute;
import org.eclipse.pde.internal.core.ischema.ISchemaAttribute;
import org.eclipse.pde.internal.core.schema.SchemaRootElement;
import org.eclipse.pde.internal.core.text.*;
import org.eclipse.pde.internal.ui.editor.PDEHyperlinkDetector;
import org.eclipse.pde.internal.ui.editor.PDESourcePage;
import org.eclipse.pde.internal.ui.editor.text.*;
public class ManifestHyperlinkDetector extends PDEHyperlinkDetector {
/**
* @param editor the editor in which to detect the hyperlink
*/
public ManifestHyperlinkDetector(PDESourcePage page) {
super(page);
}
protected IHyperlink[] detectAttributeHyperlink(IDocumentAttributeNode attr) {
String attrValue = attr.getAttributeValue();
if (attrValue.length() == 0)
return null;
IPluginObject node = XMLUtil.getTopLevelParent(attr);
if (node == null || !node.getModel().isEditable())
return null;
IPluginModelBase base = node.getPluginModel();
IResource res = base.getUnderlyingResource();
IRegion linkRegion = new Region(attr.getValueOffset(), attr.getValueLength());
IHyperlink[] link = new IHyperlink[1];
if (node instanceof IPluginExtensionPoint) {
if (attr.getAttributeName().equals(IPluginExtensionPoint.P_SCHEMA))
link[0] = new SchemaHyperlink(linkRegion, attrValue, res);
else if (attr.getAttributeName().equals(IPluginObject.P_NAME))
if (attrValue.charAt(0) == '%')
link[0] = new TranslationHyperlink(linkRegion, attrValue, base);
} else if (node instanceof IPluginExtension) {
ISchemaAttribute sAttr = XMLUtil.getSchemaAttribute(attr, ((IPluginExtension) node).getPoint());
if (sAttr == null)
return null;
if (sAttr.getKind() == IMetaAttribute.JAVA) {
link[0] = new JavaHyperlink(linkRegion, attrValue, res);
} else if (sAttr.getKind() == IMetaAttribute.RESOURCE) {
link[0] = new ResourceHyperlink(linkRegion, attrValue, res);
} else if (sAttr.getParent() instanceof SchemaRootElement) {
if (attr.getAttributeName().equals(IPluginExtension.P_POINT))
link[0] = new ExtensionHyperLink(linkRegion, attrValue);
} else if (sAttr.isTranslatable()) {
if (attrValue.charAt(0) == '%')
link[0] = new TranslationHyperlink(linkRegion, attrValue, base);
}
}
if (link[0] != null)
return link;
return null;
}
protected IHyperlink[] detectNodeHyperlink(IDocumentElementNode node) {
// TODO what can we do here?
// suggestions:
// - use SchemaEditor.openToElement(IPath path, ISchemaElement element)
// to directly highlight this particular element in a schema editor
// ? too fancy ?
/*
IPluginObject parent = XMLUtil.getTopLevelParent(node);
if (parent == null || !parent.getModel().isEditable())
return null;
if (parent instanceof IPluginExtension) {
ISchemaElement sElement = XMLUtil.getSchemaElement(node, ((IPluginExtension)parent).getPoint());
if (sElement == null)
return null;
URL url = sElement.getSchema().getURL();
// only have access to URL now - extend SchemaEditor?
SchemaEditor.openToElement(url, sElement);
}
*/
return null;
}
protected IHyperlink[] detectTextNodeHyperlink(IDocumentTextNode node) {
IDocumentElementNode enclosing = node.getEnclosingElement();
if (!(enclosing instanceof IPluginObject))
return null;
IPluginModelBase base = ((IPluginObject) enclosing).getPluginModel();
if (node.getText().charAt(0) == '%')
return new IHyperlink[] {new TranslationHyperlink(new Region(node.getOffset(), node.getLength()), node.getText(), base)};
return null;
}
}