/******************************************************************************* * Copyright (c) 2007-2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.text.ext.hyperlink; import java.util.ArrayList; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.ITypedRegion; import org.jboss.tools.common.text.ext.hyperlink.xpl.BaseHyperlinkDetector; import org.jboss.tools.common.text.ext.util.AxisUtil; public class HyperlinkDetector extends BaseHyperlinkDetector { private static HyperlinkDetector fInstance; /** * returns singleton instance of HyperlinkDetector * * @return HyperlinkDetector */ public static HyperlinkDetector getInstance() { return HyperlinkDetectorHolder.INSTANCE; } /** * Returns the partition types located at offset in the document * * @param document - * assumes document is not null * @param offset * @return String partition types */ protected IHyperlinkRegion[] getPartitions(IDocument document, int offset) { String documentRegionType = null; ITypedRegion region = null; ArrayList<IHyperlinkRegion> regions = new ArrayList<IHyperlinkRegion>(); region = (document instanceof IDocumentExtension3 ? ((IDocumentExtension3)document).getDocumentPartitioner("org.eclipse.wst.sse.core.default_structured_text_partitioning").getPartition(offset) : //$NON-NLS-1$ document.getDocumentPartitioner().getPartition(offset)); if (region != null) { documentRegionType = region.getType(); String contentType = getContentType(document); IHyperlinkRegion documentRegion = new HyperlinkRegion(region.getOffset(), region.getLength(), null, contentType, region.getType()); HyperlinkPartitionerDefinition[] defs = HyperlinkPartitionerBuilder.getInstance().getHyperlinkPartitionerDefinitions(contentType, documentRegionType, null); if(defs==null || defs.length==0) { regions.add(documentRegion); } else { for(int i=0; i<defs.length; i++) { final ITypedRegion finalDocumentRegion = region; final IDocument finalDocument = document; final String finalContentType = contentType; IHyperlinkPartitioner hyperlinkPartitioner = defs[i].createHyperlinkPartitioner(); IHyperlinkRegion startHyperlinkRegion = new HyperlinkRegion( finalDocumentRegion.getOffset(), finalDocumentRegion.getLength(), AxisUtil.getAxis(finalDocument, finalDocumentRegion.getOffset()), finalContentType, finalDocumentRegion.getType()); if((!(hyperlinkPartitioner instanceof IHyperlinkPartitionRecognizer)) || ((IHyperlinkPartitionRecognizer)hyperlinkPartitioner).recognize(document, offset, startHyperlinkRegion)) { IHyperlinkRegion childRegion = hyperlinkPartitioner.getChildPartitionRegion(document, offset, startHyperlinkRegion); if(childRegion!=null && !regions.contains(childRegion)) { regions.add(childRegion); } } } } } return regions.toArray(new IHyperlinkRegion[regions.size()]); } static class HyperlinkDetectorHolder { static HyperlinkDetector INSTANCE = new HyperlinkDetector(); } }