Wrong partition length raises exception
[phpeclipse.git] / net.sourceforge.phpeclipse.ui / src / net / sourceforge / phpeclipse / ui / text / rules / MultiViewPartitioner.java
index d04d657..b33b381 100644 (file)
@@ -8,7 +8,7 @@
  * Contributors:
  *     Igor Malinin - initial contribution
  * 
- * $Id: MultiViewPartitioner.java,v 1.5 2004-11-10 20:39:32 axelcl Exp $
+ * $Id: MultiViewPartitioner.java,v 1.9 2005-05-13 20:17:31 axelcl Exp $
  */
 
 package net.sourceforge.phpeclipse.ui.text.rules;
@@ -119,16 +119,16 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
       int outerOffset = outerDocument.getLocalOffset(position.offset);
       // axelcl start
       DocumentEvent event = null;
-      if (outerOffset>=0) {
-      // axelcl end
+      if (outerOffset >= 0) {
+        // axelcl end
         event = new DocumentEvent(outerDocument, outerOffset, position.length, null);
 
         outerDocument.fireDocumentAboutToBeChanged(event);
       }
       super.addInnerRegion(position);
-//    axelcl start
+      //    axelcl start
       if (event != null) {
-      // axelcl end
+        // axelcl end
         outerDocument.fireDocumentChanged(event);
       }
     } else {
@@ -301,10 +301,12 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
 
       String text = event.getText();
 
-      if (left != right || text != null && text.length() > 0) {
-        outerDocumentEvent = new DocumentEvent(outerDocument, left, right - left, text);
+      if (left >= 0 && (right - left >= 0)) {
+        if (left != right || text != null && text.length() > 0) {
+          outerDocumentEvent = new DocumentEvent(outerDocument, left, right - left, text);
 
-        outerDocument.fireDocumentAboutToBeChanged(outerDocumentEvent);
+          outerDocument.fireDocumentAboutToBeChanged(outerDocumentEvent);
+        }
       }
     }
   }
@@ -436,7 +438,16 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
    */
   public ITypedRegion[] computePartitioning(int offset, int length) {
     List list = new ArrayList();
-
+//        if (DEBUG) {
+//          if (length>=9400) {
+//            length--;
+//          }
+//          System.out.print("MultiViewPartitioner::computePartitioning - Offset: ");
+//          System.out.print(offset);
+//          System.out.print(", Length: ");
+//          System.out.print(length);
+//          System.out.println("");
+//        }
     int end = offset + length;
 
     int index = computeFlatNodeIndex(offset);
@@ -465,10 +476,34 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
 
       ++index;
     }
+    //    if (DEBUG) {
+    //      showList(list);
+    //    }
 
     return (TypedRegion[]) list.toArray(new TypedRegion[list.size()]);
   }
 
+  private void showList(List list) {
+    try {
+      throw new NullPointerException();
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    System.out.println(">>>>>List start");
+    TypedRegion temp;
+    for (int i = 0; i < list.size(); i++) {
+      temp = (TypedRegion) list.get(i);
+      System.out.print("Offset: ");
+      System.out.print(temp.getOffset());
+      System.out.print(", Length: ");
+      System.out.print(temp.getLength());
+      System.out.print(", Type: ");
+      System.out.print(temp.getType());
+      System.out.println("");
+    }
+    System.out.println("<<<<<List end");
+  }
+
   private void addOuterPartitions(List list, int offset, int length, FlatNode prev, FlatNode next) {
     // limit region
     int start = offset;
@@ -487,17 +522,30 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
     }
 
     if (outerDocument == null) {
+      //      if (DEBUG) {
+      //        if (end - start<0) {
+      //          throw new IndexOutOfBoundsException();
+      //        }
+      //      }
       list.add(new TypedRegion(start, end - start, getContentType(null, IDocument.DEFAULT_CONTENT_TYPE)));
       return;
     }
 
-    try {
+   try {
       // convert to outer offsets
       start = outerDocument.getLocalOffset(start);
       end = outerDocument.getLocalOffset(end);
-      if (end - start >= 0) {//jsurfer insert line
-        ITypedRegion[] regions = outerDocument.computePartitioning(start, end - start);
-
+      int len = end - start;
+      if (len >= 0) {        
+        ITypedRegion[] regions = null;
+        try {
+          regions = outerDocument.computePartitioning(start, len);
+        } catch (Exception e) {
+          // nasty workaround, which prevents cursor from moveing backwards in the editor
+          // but doesn't solve the partitioning problem
+          regions = new ITypedRegion[0];
+          System.out.println("MultiViewerPartitioner#addOuterPartitions failure\n"+"start:"+start +" length:" +len+"\n"+outerDocument.get(start,len));
+        }
         for (int i = 0; i < regions.length; i++) {
           ITypedRegion region = regions[i];
 
@@ -518,7 +566,21 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
               end = offset;
             }
           }
-
+          //          if (DEBUG) {
+          //            if (end - start<0) {
+          //              showList(list);
+          //              System.out.print("MultiViewPartitioner::addOuterPartitions - Offset: ");
+          //              System.out.print(offset);
+          //              System.out.print(", Start: ");
+          //              System.out.print(start);
+          //              System.out.print(", End: ");
+          //              System.out.print(end);
+          //              System.out.print(", Type: ");
+          //              System.out.print(region.getType());
+          //              System.out.println("");
+          //              throw new IndexOutOfBoundsException();
+          //            }
+          //          }
           list.add(new TypedRegion(start, end - start, getContentType(null, region.getType())));
         }
       }
@@ -535,6 +597,11 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
 
     if (innerDocument == null) {
       // simple partition
+      //      if (DEBUG) {
+      //        if (position.length<0) {
+      //          throw new IndexOutOfBoundsException();
+      //        }
+      //      }
       list.add(new TypedRegion(position.offset, position.length, getContentType(position.type, null)));
       return;
     }
@@ -557,7 +624,11 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
         // convert back to parent offsets
         offset = innerDocument.getParentOffset(region.getOffset());
         length = region.getLength();
-
+        //        if (DEBUG) {
+        //          if (length<0) {
+        //            throw new IndexOutOfBoundsException();
+        //          }
+        //        }
         list.add(new TypedRegion(offset, length, getContentType(position.type, region.getType())));
       }
     } catch (BadLocationException x) {
@@ -619,7 +690,7 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
           end = document.getLength();
           type = getContentType(null, IDocument.DEFAULT_CONTENT_TYPE);
         } else {
-//        axelcl end
+          //        axelcl end
           ITypedRegion region = outerDocument.getPartition(outerOffset);
 
           start = region.getOffset();
@@ -649,6 +720,7 @@ public abstract class MultiViewPartitioner extends AbstractPartitioner {
 
       return new TypedRegion(start, end - start, type);
     } catch (BadLocationException x) {
+      x.printStackTrace();
       throw new IllegalArgumentException();
     }
   }