blob: 4609ff9d985e9ef9728c0d18a5010a8b3401170c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 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
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.sse.ui.internal.openon;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.wst.sse.core.StructuredModelManager;
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.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
/**
* Determines the appropriate IOpenOn to call based on current partition.
*
* @deprecated Use base support for hyperlink navigation
*/
public class OpenOnProvider {
private static OpenOnProvider fInstance;
/**
* returns singleton instance of OpenOnProvider
*
* @return OpenOnProvider
*/
public synchronized static OpenOnProvider getInstance() {
if (fInstance == null) {
fInstance = new OpenOnProvider();
}
return fInstance;
}
/**
* 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 appropriate IOpenOn for the current partition
*
* @return
*/
public IOpenOn getOpenOn(IDocument document, int offset) {
IOpenOn openOn = null;
// determine the current partition
if (document != null) {
String contentTypeID = getContentType(document);
String partitionType = getPartitionType(document, offset);
IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
while (openOn == null && contentType != null) {
// Query OpenOnBuilder and get the list of OpenOns for the
// current partition
OpenOnDefinition[] defs = OpenOnBuilder.getInstance().getOpenOnDefinitions(contentType.getId(), partitionType);
contentType = contentType.getBaseType();
// If more than 1 openon is returned, need to further check
// which OpenOn is the appropriate one to return
// for now just returning the first one
if (defs != null && defs.length > 0) {
openOn = defs[0].createOpenOn();
}
}
}
return openOn;
}
/**
* Returns the partition type located at offset in the document
*
* @param document -
* assumes document is not null
* @param offset
* @return String partition type
*/
protected String getPartitionType(IDocument document, int offset) {
String type = null;
try {
// TODO: provide partitioning information so we're not using a default like this
if (document instanceof IStructuredDocument) {
type = TextUtilities.getContentType(document, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);
}
}
catch (BadLocationException e1) {
}
finally {
if (type == null) {
try {
ITypedRegion region = document.getPartition(offset);
if (region != null) {
type = region.getType();
}
}
catch (BadLocationException e) {
type = null;
}
}
}
return type;
}
}