intial source from ttp://www.sf.net/projects/wdte
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.js.core / src / net / sourceforge / phpeclipse / js / core / parser / NonRuleBasedDamagerRepairer.java
diff --git a/archive/net.sourceforge.phpeclipse.js.core/src/net/sourceforge/phpeclipse/js/core/parser/NonRuleBasedDamagerRepairer.java b/archive/net.sourceforge.phpeclipse.js.core/src/net/sourceforge/phpeclipse/js/core/parser/NonRuleBasedDamagerRepairer.java
new file mode 100644 (file)
index 0000000..0f99bfd
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * $RCSfile: NonRuleBasedDamagerRepairer.java,v $
+ *
+ * Copyright 2002
+ * CH-1700 Fribourg, Switzerland
+ * All rights reserved.
+ *
+ *========================================================================
+ * Modifications history
+ *========================================================================
+ * $Log: not supported by cvs2svn $
+ * Revision 1.1  2004/02/26 02:25:42  agfitzp
+ * renamed packages to match xml & css
+ *
+ * Revision 1.1  2004/02/05 03:10:08  agfitzp
+ * Initial Submission
+ *
+ * Revision 1.1.2.1  2003/12/12 21:37:24  agfitzp
+ * Experimental work for Classes view
+ *
+ * Revision 1.1  2003/05/28 15:17:11  agfitzp
+ * net.sourceforge.phpeclipse.js.core 0.0.1 code base
+ *
+ *========================================================================
+*/
+
+package net.sourceforge.phpeclipse.js.core.parser;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.presentation.IPresentationDamager;
+import org.eclipse.jface.text.presentation.IPresentationRepairer;
+//import org.eclipse.jface.util.Assert;
+import org.eclipse.swt.custom.StyleRange;
+
+
+/**
+ * 
+ *
+ * @author $Author: jsurfer $, $Date: 2004-09-02 18:14:38 $
+ *
+ * @version $Revision: 1.1 $
+ */
+public class NonRuleBasedDamagerRepairer implements IPresentationDamager, IPresentationRepairer
+{
+   /** The document this object works on */
+   protected IDocument fDocument;
+
+   /** The default text attribute if non is returned as data by the current token */
+   protected TextAttribute fDefaultTextAttribute;
+
+   /**
+    * Constructor for NonRuleBasedDamagerRepairer.
+    * @param defaultTextAttribute
+    */
+   public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute)
+   {
+//      Assert.isNotNull(defaultTextAttribute);
+
+      fDefaultTextAttribute = defaultTextAttribute;
+   }
+
+   /**
+    * @see IPresentationRepairer#setDocument(IDocument)
+    */
+   public void setDocument(IDocument document)
+   {
+      fDocument = document;
+   }
+
+   /**
+    * Returns the end offset of the line that contains the specified offset or if the offset is
+    * inside a line delimiter, the end offset of the next line.
+    * 
+    * @param offset the offset whose line end offset must be computed
+    * 
+    * @return the line end offset for the given offset
+    * 
+    * @exception BadLocationException if offset is invalid in the current document
+    */
+   protected int endOfLineOf(int offset) throws BadLocationException
+   {
+      IRegion info = fDocument.getLineInformationOfOffset(offset);
+
+      if(offset <= info.getOffset() + info.getLength())
+      {
+         return info.getOffset() + info.getLength();
+      }
+
+      int line = fDocument.getLineOfOffset(offset);
+
+      try
+      {
+         info = fDocument.getLineInformation(line + 1);
+
+         return info.getOffset() + info.getLength();
+      }
+      catch(BadLocationException x)
+      {
+         return fDocument.getLength();
+      }
+   }
+
+   /**
+    * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean)
+    */
+   public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent event, 
+                                  boolean documentPartitioningChanged)
+   {
+      if(!documentPartitioningChanged)
+      {
+         try
+         {
+            IRegion info = fDocument.getLineInformationOfOffset(event.getOffset());
+            int start = Math.max(partition.getOffset(), info.getOffset());
+
+            int end = event.getOffset() + 
+                      (event.getText() == null ? event.getLength()
+                                               : event.getText().length());
+
+            if(info.getOffset() <= end && end <= info.getOffset() + info.getLength())
+            {
+               // optimize the case of the same line
+               end = info.getOffset() + info.getLength();
+            }
+            else
+            {
+               end = endOfLineOf(end);
+            }
+
+            end = Math.min(partition.getOffset() + partition.getLength(), end);
+
+            return new Region(start, end - start);
+         }
+         catch(BadLocationException x)
+         {
+         }
+      }
+
+      return partition;
+   }
+
+   /**
+    * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion)
+    */
+   public void createPresentation(TextPresentation presentation, ITypedRegion region)
+   {
+      addRange(presentation, region.getOffset(), region.getLength(), fDefaultTextAttribute);
+   }
+
+   /**
+    * Adds style information to the given text presentation.
+    * 
+    * @param presentation the text presentation to be extended
+    * @param offset the offset of the range to be styled
+    * @param length the length of the range to be styled
+    * @param attr the attribute describing the style of the range to be styled
+    */
+   protected void addRange(TextPresentation presentation, int offset, int length, 
+                           TextAttribute attr)
+   {
+      if(attr != null)
+      {
+         presentation.addStyleRange(
+                new StyleRange(offset, length, attr.getForeground(), attr.getBackground(), 
+                               attr.getStyle()));
+      }
+   }
+}
\ No newline at end of file