X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/text/XMLReconcileStep.java b/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/text/XMLReconcileStep.java
new file mode 100644
index 0000000..3b54d70
--- /dev/null
+++ b/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/text/XMLReconcileStep.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2003-2004 Christopher Lenz 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:
+ * Christopher Lenz - initial API and implementation
+ *
+ * $Id: XMLReconcileStep.java,v 1.1 2004-09-02 18:28:03 jsurfer Exp $
+ */
+
+package net.sourceforge.phpeclipse.xml.ui.internal.text;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.xml.core.model.IXMLDocument;
+import net.sourceforge.phpeclipse.xml.core.parser.IProblem;
+import net.sourceforge.phpeclipse.xml.core.parser.IProblemCollector;
+import net.sourceforge.phpeclipse.xml.ui.internal.editor.XMLDocumentProvider;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.reconciler.AbstractReconcileStep;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilableModel;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * Implementation of a reconcile step for building the XML parse tree on changes
+ * to the editor content.
+ */
+public class XMLReconcileStep extends AbstractReconcileStep {
+
+ // Inner Classes -----------------------------------------------------------
+
+ /**
+ * Adapts an IXMLDocument
to the
+ * IReconcilableModel
interface.
+ */
+ private class XMLDocumentAdapter implements IReconcilableModel {
+ private IXMLDocument document;
+
+ public XMLDocumentAdapter(IXMLDocument document) {
+ this.document = document;
+ }
+
+ public IXMLDocument getDocument() {
+ return document;
+ }
+
+ }
+
+ /**
+ * Implementation of the problem collector interface for creating problem
+ * annotations when there are problems parsing the style sheet.
+ */
+ private class ProblemCollector implements IProblemCollector {
+ /**
+ * The list of problems added to this collector.
+ */
+ private List collectedProblems = new ArrayList();
+
+ /**
+ * @see IProblemCollector#addProblem(IProblem)
+ */
+ public void addProblem(IProblem problem) {
+ collectedProblems.add(problem);
+ }
+
+ /**
+ * Returns the list of problems collected while the CSS source has been
+ * parsed, in the order they were reported. The list returned is
+ * immutable.
+ *
+ * @return the list of collected problems (of type {@link IProblem})
+ */
+ public List getProblems() {
+ return Collections.unmodifiableList(collectedProblems);
+ }
+ }
+
+ /**
+ * Adapter that adapts an {@link IProblem} to an {@link Annotation}.
+ */
+ private class ProblemAdapter extends AnnotationAdapter {
+ private IProblem problem;
+ private Position position;
+
+ public ProblemAdapter(IProblem problem) {
+ this.problem = problem;
+ }
+
+ public Position getPosition() {
+ if (position == null) {
+ position = createPositionFromProblem();
+ }
+
+ return position;
+ }
+
+ public Annotation createAnnotation() {
+ int start = problem.getSourceStart();
+ if (start < 0) {
+ return null;
+ }
+
+ int length = problem.getSourceEnd() - start + 1;
+ if (length < 0) {
+ return null;
+ }
+
+ String type;
+ if (problem.isWarning()) {
+ type = XMLAnnotation.TYPE_ERROR;
+ } else if (problem.isError()) {
+ type = XMLAnnotation.TYPE_WARNING;
+ } else {
+ type = XMLAnnotation.TYPE_INFO;
+ }
+
+ return new XMLAnnotation(type, false, problem.getMessage());
+ }
+
+ private Position createPositionFromProblem() {
+ 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);
+ }
+
+ }
+
+ // Instance Variables ------------------------------------------------------
+
+ private ITextEditor editor;
+
+ private XMLDocumentAdapter xmlDocumentAdapter;
+
+ // Constructors ------------------------------------------------------------
+
+ /**
+ * Default constructor.
+ */
+ public XMLReconcileStep(ITextEditor editor) {
+ this.editor = editor;
+
+ xmlDocumentAdapter = new XMLDocumentAdapter(getXMLDocument());
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param step the step to add to the pipe
+ * @param editor the associated text editor
+ */
+ public XMLReconcileStep(IReconcileStep step, ITextEditor editor) {
+ super(step);
+
+ this.editor = editor;
+
+ xmlDocumentAdapter = new XMLDocumentAdapter(getXMLDocument());
+ }
+
+ // AbstractReconcileStep Implementation ------------------------------------
+
+ /*
+ * @see AbstractReconcileStep#reconcileModel(DirtyRegion, IRegion)
+ */
+ protected IReconcileResult[] reconcileModel(
+ DirtyRegion dirtyRegion, IRegion subRegion
+ ) {
+ IXMLDocument model = xmlDocumentAdapter.getDocument();
+
+
+ IEditorInput editorInput = null;
+ IFile file = null;
+ if (editor != null) {
+ editorInput = editor.getEditorInput();
+ }
+
+ if (editorInput instanceof IFileEditorInput)
+ file = ((IFileEditorInput) editorInput).getFile();
+ ProblemCollector problemCollector = new ProblemCollector();
+ model.reconcile(problemCollector, file);
+
+ List problems = problemCollector.getProblems();
+ IReconcileResult[] retVal = new IReconcileResult[problems.size()];
+ for (int i = 0; i < problems.size(); i++) {
+ IProblem problem = (IProblem) problems.get(i);
+ retVal[i] = new ProblemAdapter(problem);
+ }
+
+ return retVal;
+ }
+
+ /*
+ * @see AbstractReconcileStep#getModel()
+ */
+ public IReconcilableModel getModel() {
+ return xmlDocumentAdapter;
+ }
+
+ // Private Methods Implementation ------------------------------------------
+
+ /**
+ * Retrieve the style sheet associated with the editor input.
+ */
+ private IXMLDocument getXMLDocument() {
+ IDocumentProvider documentProvider = editor.getDocumentProvider();
+ if (documentProvider instanceof XMLDocumentProvider) {
+ XMLDocumentProvider xmlDocumentProvider =
+ (XMLDocumentProvider) documentProvider;
+ return xmlDocumentProvider.getModel(editor.getEditorInput());
+ }
+
+ return null;
+ }
+}