blob: 89f24f622638d958f13b58d568b21b60a5feb90f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation.
* 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:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.context.structureddocument.internal.impl;
import java.util.Iterator;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jst.jsf.context.structureddocument.AbstractStructuredDocumentContextFactory;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* @author cbateman
*
*/
public class StructuredDocumentContextFactory extends AbstractStructuredDocumentContextFactory
implements IStructuredDocumentContextFactory, IStructuredDocumentContextFactory2
{
/* static attributes */
private static StructuredDocumentContextFactory INSTANCE;
/**
* @param supportedDelegateTypes
*/
public StructuredDocumentContextFactory(Class[] supportedDelegateTypes)
{
super(supportedDelegateTypes);
}
/**
* @return an instance (possibly shared) of the this factory
*/
public synchronized static StructuredDocumentContextFactory getInstance()
{
if (INSTANCE == null)
{
INSTANCE = new StructuredDocumentContextFactory();
}
return INSTANCE;
}
/**
* Construct the factory
*/
protected StructuredDocumentContextFactory()
{
super(new Class[] {IStructuredDocumentContextFactory.class});
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.ITextViewer, int)
*/
public final IStructuredDocumentContext getContext(ITextViewer textViewer, int documentPosition)
{
// first see if I know how to make one
IStructuredDocumentContext context = internalGetContext(textViewer, documentPosition);
// if I don't know, ask my delegates
if (context == null)
{
context = delegateGetContext(textViewer, documentPosition);
}
return context;
}
private IStructuredDocumentContext internalGetContext(ITextViewer textViewer, int documentPosition)
{
if (textViewer instanceof StructuredTextViewer)
{
IDocument document = ((StructuredTextViewer)textViewer).getDocument();
return internalGetContext(document, documentPosition);
}
return null;
}
private IStructuredDocumentContext internalGetContext(IDocument document, int documentPosition)
{
if (document instanceof IStructuredDocument)
{
return new DefaultStructuredDocumentContext((IStructuredDocument)document, documentPosition);
}
return null;
}
private IStructuredDocumentContext delegateGetContext(ITextViewer textViewer, int documentPosition)
{
synchronized(_delegates)
{
for (final Iterator it = _delegates.iterator(); it.hasNext();)
{
IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
IStructuredDocumentContext context = delegateFactory.getContext(textViewer, documentPosition);
if (context != null)
{
return context;
}
}
return null;
}
}
/**
* @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.IDocument, int)
*/
public IStructuredDocumentContext getContext(IDocument document, int documentPosition) {
// first see if I know how to make one
IStructuredDocumentContext context = internalGetContext(document, documentPosition);
// if I don't know, ask my delegates
if (context == null)
{
context = delegateGetContext(document, documentPosition);
}
return context;
}
private IStructuredDocumentContext delegateGetContext(IDocument document, int documentPosition)
{
synchronized(_delegates)
{
for (final Iterator it = _delegates.iterator(); it.hasNext();)
{
IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
IStructuredDocumentContext context = delegateFactory.getContext(document, documentPosition);
if (context != null)
{
return context;
}
}
return null;
}
}
public IStructuredDocumentContext getContext(IDocument document, Node node)
{
// first see if I know how to make one
IStructuredDocumentContext context = internalGetContext(document, node);
// if I don't know, ask my delegates
if (context == null)
{
context = delegateGetContext(document, node);
}
return context;
}
private IStructuredDocumentContext internalGetContext(IDocument document, Node node)
{
if (document instanceof IStructuredDocument)
{
final IStructuredDocument sDoc = (IStructuredDocument) document;
if (node instanceof IndexedRegion)
{
final int position = ((IndexedRegion)node).getStartOffset();
return new DefaultStructuredDocumentContext(sDoc, position);
}
else if (node instanceof IDOMAttr)
{
IDOMAttr attr = (IDOMAttr) node;
final int position = attr.getValueRegionStartOffset();
return new DefaultStructuredDocumentContext(sDoc, position);
}
}
return null;
}
private IStructuredDocumentContext delegateGetContext(IDocument document, Node node)
{
synchronized(_delegates)
{
for (final Iterator it = _delegates.iterator(); it.hasNext();)
{
IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
IStructuredDocumentContext context = delegateFactory.getContext(document, node);
if (context != null)
{
return context;
}
}
return null;
}
}
public IStructuredDocumentContext getContext(Element element)
{
// first see if I know how to make one
IStructuredDocumentContext context = internalGetContext(element);
// if I don't know, ask my delegates
if (context == null)
{
context = delegateGetContext(element);
}
return context;
}
private IStructuredDocumentContext internalGetContext(Element element) {
if (element instanceof IDOMNode){
final IDOMNode node = (IDOMNode)element;
final IStructuredDocument sDoc = node.getStructuredDocument();
final int position = node.getStartOffset();
return new DefaultStructuredDocumentContext(sDoc, position);
}
return null;
}
private IStructuredDocumentContext delegateGetContext(Element element) {
synchronized(_delegates)
{
for (final Iterator it = _delegates.iterator(); it.hasNext();)
{
IStructuredDocumentContextFactory2 delegateFactory = (IStructuredDocumentContextFactory2) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory2.class);
if (delegateFactory != null)
{
IStructuredDocumentContext context = delegateFactory.getContext(element);
if (context != null)
{
return context;
}
}
}
return null;
}
}
}