X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java deleted file mode 100644 index 891f7f2..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java +++ /dev/null @@ -1,601 +0,0 @@ -package net.sourceforge.phpeclipse.phpeditor; - -/********************************************************************** -Copyright (c) 2000, 2002 IBM Corp. and others. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Common Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/cpl-v10.html - -Contributors: - IBM Corporation - Initial implementation - Klaus Hartlage - www.eclipseproject.de -**********************************************************************/ - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import net.sourceforge.phpdt.core.IProblemRequestor; -import net.sourceforge.phpdt.core.compiler.IProblem; -import net.sourceforge.phpdt.internal.ui.text.java.IProblemRequestorExtension; -import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants; -import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IMarkerDelta; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.DefaultLineTracker; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IDocumentPartitioner; -import org.eclipse.jface.text.ILineTracker; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.rules.DefaultPartitioner; -import org.eclipse.jface.text.source.Annotation; -import org.eclipse.jface.text.source.AnnotationModelEvent; -import org.eclipse.jface.text.source.IAnnotationModel; -import org.eclipse.jface.text.source.IAnnotationModelListener; -import org.eclipse.jface.text.source.IAnnotationModelListenerExtension; -import org.eclipse.jface.util.ListenerList; -import org.eclipse.ui.IFileEditorInput; -import org.eclipse.ui.editors.text.FileDocumentProvider; -import org.eclipse.ui.part.FileEditorInput; -import org.eclipse.ui.texteditor.MarkerAnnotation; -import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel; - -/** - * The PHPDocumentProvider provides the IDocuments used by java editors. - */ - -public class PHPDocumentProvider extends FileDocumentProvider { - - // private final static String[] TYPES= new String[] { PHPPartitionScanner.PHP, PHPPartitionScanner.JAVA_DOC, PHPPartitionScanner.JAVA_MULTILINE_COMMENT }; - private final static String[] TYPES = - new String[] { - IPHPPartitionScannerConstants.PHP, - IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT, - IPHPPartitionScannerConstants.HTML, - IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT, - IPHPPartitionScannerConstants.JAVASCRIPT, - IPHPPartitionScannerConstants.CSS, - IPHPPartitionScannerConstants.SMARTY, - IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT }; - - private static PHPPartitionScanner PHP_PARTITION_SCANNER = null; - private static PHPPartitionScanner HTML_PARTITION_SCANNER = null; - private static PHPPartitionScanner XML_PARTITION_SCANNER = null; - private static PHPPartitionScanner SMARTY_PARTITION_SCANNER = null; - - /** annotation model listener added to all created CU annotation models */ - // private GlobalAnnotationModelListener fGlobalAnnotationModelListener; - - /** - * Internal structure for mapping positions to some value. - * The reason for this specific structure is that positions can - * change over time. Thus a lookup is based on value and not - * on hash value. - */ - protected static class ReverseMap { - - static class Entry { - Position fPosition; - Object fValue; - }; - - private List fList = new ArrayList(2); - private int fAnchor = 0; - - public ReverseMap() { - } - - public Object get(Position position) { - - Entry entry; - - // behind anchor - int length = fList.size(); - for (int i = fAnchor; i < length; i++) { - entry = (Entry) fList.get(i); - if (entry.fPosition.equals(position)) { - fAnchor = i; - return entry.fValue; - } - } - - // before anchor - for (int i = 0; i < fAnchor; i++) { - entry = (Entry) fList.get(i); - if (entry.fPosition.equals(position)) { - fAnchor = i; - return entry.fValue; - } - } - - return null; - } - - private int getIndex(Position position) { - Entry entry; - int length = fList.size(); - for (int i = 0; i < length; i++) { - entry = (Entry) fList.get(i); - if (entry.fPosition.equals(position)) - return i; - } - return -1; - } - - public void put(Position position, Object value) { - int index = getIndex(position); - if (index == -1) { - Entry entry = new Entry(); - entry.fPosition = position; - entry.fValue = value; - fList.add(entry); - } else { - Entry entry = (Entry) fList.get(index); - entry.fValue = value; - } - } - - public void remove(Position position) { - int index = getIndex(position); - if (index > -1) - fList.remove(index); - } - - public void clear() { - fList.clear(); - } - }; - - /** - * Annotation model dealing with java marker annotations and temporary problems. - * Also acts as problem requestor for its compilation unit. Initialiy inactive. Must explicitly be - * activated. - */ - protected class CompilationUnitAnnotationModel - extends ResourceMarkerAnnotationModel - implements IProblemRequestor, IProblemRequestorExtension { - - private IFileEditorInput fInput; - private List fCollectedProblems; - private List fGeneratedAnnotations; - private IProgressMonitor fProgressMonitor; - private boolean fIsActive = false; - - private ReverseMap fReverseMap = new ReverseMap(); - private List fPreviouslyOverlaid = null; - private List fCurrentlyOverlaid = new ArrayList(); - - public CompilationUnitAnnotationModel(IFileEditorInput input) { - super(input.getFile()); - fInput = input; - } - - protected MarkerAnnotation createMarkerAnnotation(IMarker marker) { - return new JavaMarkerAnnotation(marker); - } - - protected Position createPositionFromProblem(IProblem problem) { - int start = problem.getSourceStart(); - if (start < 0) - return null; - - int length = problem.getSourceEnd() - problem.getSourceStart() + 1; - if (length < 0) - return null; - - return new Position(start, length); - } - - protected void update(IMarkerDelta[] markerDeltas) { - - super.update(markerDeltas); - - // if (markerDeltas != null && markerDeltas.length > 0) { - // try { - // ICompilationUnit workingCopy = getWorkingCopy(fInput); - // if (workingCopy != null) - // workingCopy.reconcile(true, null); - // } catch (JavaModelException ex) { - // handleCoreException(ex, ex.getMessage()); - // } - // } - } - - /* - * @see IProblemRequestor#beginReporting() - */ - public void beginReporting() { - // ICompilationUnit unit= getWorkingCopy(fInput); - // if (unit != null && unit.getJavaProject().isOnClasspath(unit)) - // fCollectedProblems= new ArrayList(); - // else - fCollectedProblems = null; - } - - /* - * @see IProblemRequestor#acceptProblem(IProblem) - */ - public void acceptProblem(IProblem problem) { - if (isActive()) - fCollectedProblems.add(problem); - } - - /* - * @see IProblemRequestor#endReporting() - */ - public void endReporting() { - if (!isActive()) - return; - - if (fProgressMonitor != null && fProgressMonitor.isCanceled()) - return; - - boolean isCanceled = false; - boolean temporaryProblemsChanged = false; - fPreviouslyOverlaid = fCurrentlyOverlaid; - fCurrentlyOverlaid = new ArrayList(); - - synchronized (fAnnotations) { - - if (fGeneratedAnnotations.size() > 0) { - temporaryProblemsChanged = true; - removeAnnotations(fGeneratedAnnotations, false, true); - fGeneratedAnnotations.clear(); - } - - if (fCollectedProblems != null && fCollectedProblems.size() > 0) { - - Iterator e = fCollectedProblems.iterator(); - while (e.hasNext()) { - - IProblem problem = (IProblem) e.next(); - - if (fProgressMonitor != null && fProgressMonitor.isCanceled()) { - isCanceled = true; - break; - } - - Position position = createPositionFromProblem(problem); - if (position != null) { - - // ProblemAnnotation annotation= new ProblemAnnotation(problem); - // overlayMarkers(position, annotation); - // fGeneratedAnnotations.add(annotation); - // addAnnotation(annotation, position, false); - - temporaryProblemsChanged = true; - } - } - - fCollectedProblems.clear(); - } - - removeMarkerOverlays(isCanceled); - fPreviouslyOverlaid.clear(); - fPreviouslyOverlaid = null; - } - - // if (temporaryProblemsChanged) - // fireModelChanged(new CompilationUnitAnnotationModelEvent(this, getResource(), false)); - } - - private void removeMarkerOverlays(boolean isCanceled) { - if (isCanceled) { - fCurrentlyOverlaid.addAll(fPreviouslyOverlaid); - } else if (fPreviouslyOverlaid != null) { - Iterator e = fPreviouslyOverlaid.iterator(); - while (e.hasNext()) { - JavaMarkerAnnotation annotation = (JavaMarkerAnnotation) e.next(); - annotation.setOverlay(null); - } - } - } - - /** - * Overlays value with problem annotation. - * @param problemAnnotation - */ - // private void setOverlay(Object value, ProblemAnnotation problemAnnotation) { - // if (value instanceof JavaMarkerAnnotation) { - // JavaMarkerAnnotation annotation= (JavaMarkerAnnotation) value; - // if (annotation.isProblem()) { - // annotation.setOverlay(problemAnnotation); - // fPreviouslyOverlaid.remove(annotation); - // fCurrentlyOverlaid.add(annotation); - // } - // } - // } - - // private void overlayMarkers(Position position, ProblemAnnotation problemAnnotation) { - // Object value= getAnnotations(position); - // if (value instanceof List) { - // List list= (List) value; - // for (Iterator e = list.iterator(); e.hasNext();) - // setOverlay(e.next(), problemAnnotation); - // } else { - // setOverlay(value, problemAnnotation); - // } - // } - - /** - * Tells this annotation model to collect temporary problems from now on. - */ - private void startCollectingProblems() { - fCollectedProblems = new ArrayList(); - fGeneratedAnnotations = new ArrayList(); - } - - /** - * Tells this annotation model to no longer collect temporary problems. - */ - private void stopCollectingProblems() { - if (fGeneratedAnnotations != null) { - removeAnnotations(fGeneratedAnnotations, true, true); - fGeneratedAnnotations.clear(); - } - fCollectedProblems = null; - fGeneratedAnnotations = null; - } - - /* - * @see AnnotationModel#fireModelChanged() - */ - // protected void fireModelChanged() { - // fireModelChanged(new CompilationUnitAnnotationModelEvent(this, getResource(), true)); - // } - - /* - * @see IProblemRequestor#isActive() - */ - public boolean isActive() { - return fIsActive && (fCollectedProblems != null); - } - - /* - * @see IProblemRequestorExtension#setProgressMonitor(IProgressMonitor) - */ - public void setProgressMonitor(IProgressMonitor monitor) { - fProgressMonitor = monitor; - } - - /* - * @see IProblemRequestorExtension#setIsActive(boolean) - */ - public void setIsActive(boolean isActive) { - if (fIsActive != isActive) { - fIsActive = isActive; - if (fIsActive) - startCollectingProblems(); - else - stopCollectingProblems(); - } - } - - private Object getAnnotations(Position position) { - return fReverseMap.get(position); - } - - /* - * @see AnnotationModel#addAnnotation(Annotation, Position, boolean) - */ - protected void addAnnotation(Annotation annotation, Position position, boolean fireModelChanged) { - super.addAnnotation(annotation, position, fireModelChanged); - - Object cached = fReverseMap.get(position); - if (cached == null) - fReverseMap.put(position, annotation); - else if (cached instanceof List) { - List list = (List) cached; - list.add(annotation); - } else if (cached instanceof Annotation) { - List list = new ArrayList(2); - list.add(cached); - list.add(annotation); - fReverseMap.put(position, list); - } - } - - /* - * @see AnnotationModel#removeAllAnnotations(boolean) - */ - protected void removeAllAnnotations(boolean fireModelChanged) { - super.removeAllAnnotations(fireModelChanged); - fReverseMap.clear(); - } - - /* - * @see AnnotationModel#removeAnnotation(Annotation, boolean) - */ - protected void removeAnnotation(Annotation annotation, boolean fireModelChanged) { - Position position = getPosition(annotation); - Object cached = fReverseMap.get(position); - if (cached instanceof List) { - List list = (List) cached; - list.remove(annotation); - if (list.size() == 1) { - fReverseMap.put(position, list.get(0)); - list.clear(); - } - } else if (cached instanceof Annotation) { - fReverseMap.remove(position); - } - - super.removeAnnotation(annotation, fireModelChanged); - } - }; - - protected static class GlobalAnnotationModelListener implements IAnnotationModelListener, IAnnotationModelListenerExtension { - - private ListenerList fListenerList; - - public GlobalAnnotationModelListener() { - fListenerList = new ListenerList(); - } - - /** - * @see IAnnotationModelListener#modelChanged(IAnnotationModel) - */ - public void modelChanged(IAnnotationModel model) { - Object[] listeners = fListenerList.getListeners(); - for (int i = 0; i < listeners.length; i++) { - ((IAnnotationModelListener) listeners[i]).modelChanged(model); - } - } - - /** - * @see IAnnotationModelListenerExtension#modelChanged(AnnotationModelEvent) - */ - public void modelChanged(AnnotationModelEvent event) { - Object[] listeners = fListenerList.getListeners(); - for (int i = 0; i < listeners.length; i++) { - Object curr = listeners[i]; - if (curr instanceof IAnnotationModelListenerExtension) { - ((IAnnotationModelListenerExtension) curr).modelChanged(event); - } - } - } - - public void addListener(IAnnotationModelListener listener) { - fListenerList.add(listener); - } - - public void removeListener(IAnnotationModelListener listener) { - fListenerList.remove(listener); - } - }; - - public PHPDocumentProvider() { - super(); - - // fGlobalAnnotationModelListener= new GlobalAnnotationModelListener(); - - } - - /* (non-Javadoc) - * Method declared on AbstractDocumentProvider - */ - protected IDocument createDocument(Object element) throws CoreException { - IDocument document = super.createDocument(element); - if (document != null) { - // int fileType = 0; // PHP - IDocumentPartitioner partitioner = null; - if (element instanceof FileEditorInput) { - IFile file = (IFile) ((FileEditorInput) element).getAdapter(IFile.class); - String filename = file.getLocation().toString(); - String extension = filename.substring(filename.lastIndexOf("."), filename.length()); - // System.out.println(extension); - if (extension.equalsIgnoreCase(".html") || extension.equalsIgnoreCase(".htm")) { - // html - partitioner = createHTMLPartitioner(); - } else if (extension.equalsIgnoreCase(".xml")) { - // xml - partitioner = createXMLPartitioner(); - } else if (extension.equalsIgnoreCase(".js")) { - // javascript - partitioner = createJavaScriptPartitioner(); - } else if (extension.equalsIgnoreCase(".css")) { - // cascading style sheets - partitioner = createCSSPartitioner(); - } else if (extension.equalsIgnoreCase(".tpl")) { - // smarty ? - partitioner = createSmartyPartitioner(); - } else if (extension.equalsIgnoreCase(".inc")) { - // php include files ? - partitioner = createIncludePartitioner(); - } - } - - if (partitioner == null) { - partitioner = createPHPPartitioner(); - } - document.setDocumentPartitioner(partitioner); - partitioner.connect(document); - } - return document; - } - - /** - * Return a partitioner for .php files. - */ - private IDocumentPartitioner createPHPPartitioner() { - return new DefaultPartitioner(getPHPPartitionScanner(), TYPES); - } - - /** - * Return a partitioner for .html files. - */ - private IDocumentPartitioner createHTMLPartitioner() { - return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES); - } - - private IDocumentPartitioner createXMLPartitioner() { - return new DefaultPartitioner(getXMLPartitionScanner(), TYPES); - } - - private IDocumentPartitioner createJavaScriptPartitioner() { - return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES); - } - - private IDocumentPartitioner createCSSPartitioner() { - return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES); - } - - private IDocumentPartitioner createSmartyPartitioner() { - return new DefaultPartitioner(getSmartyPartitionScanner(), TYPES); - } - - private IDocumentPartitioner createIncludePartitioner() { - return new DefaultPartitioner(getPHPPartitionScanner(), TYPES); - } - /** - * Return a scanner for creating php partitions. - */ - private PHPPartitionScanner getPHPPartitionScanner() { - if (PHP_PARTITION_SCANNER == null) - PHP_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.PHP_FILE); - return PHP_PARTITION_SCANNER; - } - - /** - * Return a scanner for creating html partitions. - */ - private PHPPartitionScanner getHTMLPartitionScanner() { - if (HTML_PARTITION_SCANNER == null) - HTML_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.HTML_FILE); - return HTML_PARTITION_SCANNER; - } - - /** - * Return a scanner for creating xml partitions. - */ - private PHPPartitionScanner getXMLPartitionScanner() { - if (XML_PARTITION_SCANNER == null) - XML_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.XML_FILE); - return XML_PARTITION_SCANNER; - } - - /** - * Return a scanner for creating smarty partitions. - */ - private PHPPartitionScanner getSmartyPartitionScanner() { - if (SMARTY_PARTITION_SCANNER == null) - SMARTY_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.SMARTY_FILE); - return SMARTY_PARTITION_SCANNER; - } - - /** - * Creates a line tracker working with the same line delimiters as the document - * of the given element. Assumes the element to be managed by this document provider. - * - * @param element the element serving as blue print - * @return a line tracker based on the same line delimiters as the element's document - */ - public ILineTracker createLineTracker(Object element) { - return new DefaultLineTracker(); - } -}