/******************************************************************************* * Copyright (c) 2001, 2004 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 * Jens Lukowski/Innoopract - initial renaming/restructuring * Exadel, Inc. * Red Hat, Inc. *******************************************************************************/ package org.jboss.tools.common.text.ext.hyperlink.xpl; import java.util.ArrayList; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.wst.sse.core.internal.provisional.IModelManager; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.StructuredModelManager; import org.jboss.tools.common.text.ext.hyperlink.AbstractHyperlink; import org.jboss.tools.common.text.ext.hyperlink.HyperlinkBuilder; import org.jboss.tools.common.text.ext.hyperlink.HyperlinkDetector; import org.jboss.tools.common.text.ext.hyperlink.IHyperlinkRegion; public class BaseHyperlinkDetector implements IHyperlinkDetector{ public IHyperlink[] getHyperlinks(ITextViewer textViewer, IRegion region) { IHyperlink[] hyperlinks = null; // determine the current partition if (textViewer != null && textViewer.getDocument() != null) { String contentType = getContentType(textViewer.getDocument()); IHyperlinkRegion partition = getPartition(textViewer.getDocument(), region.getOffset()); hyperlinks = partition == null ? null : getHyperlinks(textViewer, region, contentType, partition); } return hyperlinks; } /** * Returns IHyperlink array for the document and region type. */ public IHyperlink[] getHyperlinks(ITextViewer textViewer, IRegion region, String contentType, IHyperlinkRegion partition) { ArrayList<IHyperlink> hyperlinks = new ArrayList<IHyperlink>(); // determine the current partition if (textViewer != null && textViewer.getDocument() != null) { // query HyperlinkBuilder and get the list of open ons for the // current partition HyperlinkDefinition[] defs = HyperlinkBuilder.getInstance().getHyperlinkDefinitions(contentType, partition.getType()); if(defs==null) return null; for(int i=0; i<defs.length; i++) { IHyperlink hyperlink = defs[i].createHyperlink(); if(!hyperlinks.contains(hyperlink)) { if (hyperlink instanceof AbstractHyperlink) { ((AbstractHyperlink)hyperlink).setDocument(textViewer.getDocument()); ((AbstractHyperlink)hyperlink).setOffset(region.getOffset()); ((AbstractHyperlink)hyperlink).setRegion(partition); } hyperlinks.add(hyperlink); } } } return (hyperlinks.size() == 0 ? null : (IHyperlink[])hyperlinks.toArray(new IHyperlink[hyperlinks.size()])); } /** * Returns the content type of document * * @param document - * assumes document is not null * @return String content type of given document */ protected String getContentType(IDocument document) { String type = null; IModelManager mgr = StructuredModelManager.getModelManager(); IStructuredModel model = null; try { model = mgr.getExistingModelForRead(document); if (model != null) { type = model.getContentTypeIdentifier(); } } finally { if (model != null) { model.releaseFromRead(); } } return type; } /** * Returns the partition type located at offset in the document * * @param document - * assumes document is not null * @param offset * @return String partition type */ protected IHyperlinkRegion getPartition(IDocument document, int offset) { String type = null; IHyperlinkRegion[] regions = getPartitions(document, offset); // if more than 1 hyperlink partitioner type is returned just returning the first one. return (regions != null && regions.length > 0 ? regions[0] : null); } /** * */ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { IHyperlink[] hyperlinks = getHyperlinks(textViewer, region); // if more than 1 hyperlink is returned just returning the first one. if (hyperlinks != null && hyperlinks.length > 0) { if (!canShowMultipleHyperlinks) { hyperlinks = new IHyperlink[] {hyperlinks[0]}; } } return hyperlinks; } protected IHyperlinkRegion[] getPartitions(IDocument document, int offset) { return new IHyperlinkRegion[0]; } }