home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / text / DefaultStyledDocument$ElementBuffer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  9.3 KB  |  450 lines

  1. package com.sun.java.swing.text;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Stack;
  5. import java.util.Vector;
  6.  
  7. public class DefaultStyledDocument$ElementBuffer implements Serializable {
  8.    // $FF: synthetic field
  9.    private final DefaultStyledDocument this$0;
  10.    Element root;
  11.    transient int pos;
  12.    transient int offset;
  13.    transient int length;
  14.    transient Vector endJoin;
  15.    transient Vector changes;
  16.    transient Stack path;
  17.    transient boolean insertOp;
  18.  
  19.    public DefaultStyledDocument$ElementBuffer(DefaultStyledDocument var1, Element var2) {
  20.       this.this$0 = var1;
  21.       this.this$0 = var1;
  22.       this.root = var2;
  23.       this.changes = new Vector();
  24.       this.path = new Stack();
  25.       this.endJoin = new Vector();
  26.    }
  27.  
  28.    public Element getRootElement() {
  29.       return this.root;
  30.    }
  31.  
  32.    public final void insert(int var1, int var2, DefaultStyledDocument.ElementSpec[] var3, AbstractDocument.DefaultDocumentEvent var4) {
  33.       this.insertOp = true;
  34.       this.beginEdits(var1, var2);
  35.       this.insertUpdate(var3);
  36.       this.endEdits(var4);
  37.       this.insertOp = false;
  38.    }
  39.  
  40.    public final void remove(int var1, int var2, AbstractDocument.DefaultDocumentEvent var3) {
  41.       this.beginEdits(var1, var2);
  42.       this.removeUpdate();
  43.       this.endEdits(var3);
  44.    }
  45.  
  46.    public final void change(int var1, int var2, AbstractDocument.DefaultDocumentEvent var3) {
  47.       this.beginEdits(var1, var2);
  48.       this.changeUpdate();
  49.       this.endEdits(var3);
  50.    }
  51.  
  52.    protected void insertUpdate(DefaultStyledDocument.ElementSpec[] var1) {
  53.       Element var2 = this.root;
  54.  
  55.       Element var4;
  56.       for(int var3 = var2.getElementIndex(this.offset); !var2.isLeaf(); var3 = var4.getElementIndex(this.offset)) {
  57.          var4 = var2.getElement(var3);
  58.          this.push(var2, var4.isLeaf() ? var3 : var3 + 1);
  59.          var2 = var4;
  60.       }
  61.  
  62.       this.open(var1);
  63.       int var6 = var1.length;
  64.  
  65.       for(int var5 = 0; var5 < var6; ++var5) {
  66.          this.insertElement(var1[var5]);
  67.       }
  68.  
  69.       this.close();
  70.  
  71.       while(this.path.size() != 0) {
  72.          this.pop();
  73.       }
  74.  
  75.    }
  76.  
  77.    protected void removeUpdate() {
  78.       this.removeElements(this.root, this.offset, this.offset + this.length);
  79.    }
  80.  
  81.    protected void changeUpdate() {
  82.       boolean var1 = this.split(this.offset, this.length);
  83.       if (!var1) {
  84.          while(this.path.size() != 0) {
  85.             this.pop();
  86.          }
  87.  
  88.          this.split(this.offset + this.length, 0);
  89.       }
  90.  
  91.       while(this.path.size() != 0) {
  92.          this.pop();
  93.       }
  94.  
  95.    }
  96.  
  97.    boolean split(int var1, int var2) {
  98.       boolean var3 = false;
  99.       Element var4 = this.root;
  100.  
  101.       for(int var5 = var4.getElementIndex(var1); !var4.isLeaf(); var5 = var4.getElementIndex(var1)) {
  102.          this.push(var4, var5);
  103.          var4 = var4.getElement(var5);
  104.       }
  105.  
  106.       DefaultStyledDocument.ElementBuffer.ElemChanges var6 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  107.       Element var7 = var6.parent.getElement(var6.index);
  108.       if (var7.getStartOffset() != var1) {
  109.          int var8 = var6.index;
  110.          int var9 = var8;
  111.          if (var1 + var2 < var6.parent.getEndOffset() && var2 != 0) {
  112.             var9 = var6.parent.getElementIndex(var1 + var2);
  113.             if (var9 == var8) {
  114.                var6.removed.addElement(var7);
  115.                var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), var7.getStartOffset(), var1);
  116.                var6.added.addElement(var4);
  117.                var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), var1, var1 + var2);
  118.                var6.added.addElement(var4);
  119.                var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), var1 + var2, var7.getEndOffset());
  120.                var6.added.addElement(var4);
  121.                return true;
  122.             }
  123.  
  124.             var7 = var6.parent.getElement(var9);
  125.             if (var1 + var2 == var7.getStartOffset()) {
  126.                var9 = var8;
  127.             }
  128.  
  129.             var3 = true;
  130.          }
  131.  
  132.          this.pos = var1;
  133.          var7 = var6.parent.getElement(var8);
  134.          var6.removed.addElement(var7);
  135.          var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), var7.getStartOffset(), this.pos);
  136.          var6.added.addElement(var4);
  137.          var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), this.pos, var7.getEndOffset());
  138.          var6.added.addElement(var4);
  139.  
  140.          for(int var10 = var8 + 1; var10 < var9; ++var10) {
  141.             var7 = var6.parent.getElement(var10);
  142.             var6.removed.addElement(var7);
  143.             var6.added.addElement(var7);
  144.          }
  145.  
  146.          if (var9 != var8) {
  147.             var7 = var6.parent.getElement(var9);
  148.             this.pos = var1 + var2;
  149.             var6.removed.addElement(var7);
  150.             var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), var7.getStartOffset(), this.pos);
  151.             var6.added.addElement(var4);
  152.             var4 = this.this$0.createLeafElement(var6.parent, var7.getAttributes(), this.pos, var7.getEndOffset());
  153.             var6.added.addElement(var4);
  154.          }
  155.       }
  156.  
  157.       return var3;
  158.    }
  159.  
  160.    void endEdits(AbstractDocument.DefaultDocumentEvent var1) {
  161.       int var2 = this.changes.size();
  162.  
  163.       for(int var3 = 0; var3 < var2; ++var3) {
  164.          DefaultStyledDocument.ElementBuffer.ElemChanges var4 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.changes.elementAt(var3);
  165.          Element[] var5 = new Element[var4.removed.size()];
  166.          var4.removed.copyInto(var5);
  167.          Element[] var6 = new Element[var4.added.size()];
  168.          var4.added.copyInto(var6);
  169.          int var7 = var4.index;
  170.          ((AbstractDocument.BranchElement)var4.parent).replace(var7, var5.length, var6);
  171.          AbstractDocument.ElementEdit var8 = new AbstractDocument.ElementEdit((AbstractDocument.BranchElement)var4.parent, var7, var5, var6);
  172.          var1.addEdit(var8);
  173.       }
  174.  
  175.    }
  176.  
  177.    void beginEdits(int var1, int var2) {
  178.       this.offset = var1;
  179.       this.length = var2;
  180.       this.pos = var1;
  181.       if (this.changes == null) {
  182.          this.changes = new Vector();
  183.       } else {
  184.          this.changes.removeAllElements();
  185.       }
  186.  
  187.       if (this.path == null) {
  188.          this.path = new Stack();
  189.       } else {
  190.          this.path.removeAllElements();
  191.       }
  192.  
  193.       if (this.endJoin == null) {
  194.          this.endJoin = new Vector();
  195.       } else {
  196.          this.endJoin.removeAllElements();
  197.       }
  198.    }
  199.  
  200.    void push(Element var1, int var2) {
  201.       DefaultStyledDocument.ElementBuffer.ElemChanges var10000 = (DefaultStyledDocument.ElementBuffer.ElemChanges)(this.path.size() != 0 ? this.path.peek() : null);
  202.       DefaultStyledDocument.ElementBuffer.ElemChanges var3 = new DefaultStyledDocument.ElementBuffer.ElemChanges(this, var1, var2);
  203.       this.path.push(var3);
  204.    }
  205.  
  206.    void pop() {
  207.       DefaultStyledDocument.ElementBuffer.ElemChanges var1 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  208.       this.path.pop();
  209.       if (var1.added.size() <= 0 && var1.removed.size() <= 0) {
  210.          if (!this.path.isEmpty()) {
  211.             Element var2 = var1.parent;
  212.             var1 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  213.             var1.added.removeElement(var2);
  214.          }
  215.  
  216.       } else {
  217.          this.changes.addElement(var1);
  218.       }
  219.    }
  220.  
  221.    void advance(int var1) {
  222.       this.pos += var1;
  223.    }
  224.  
  225.    void insertElement(DefaultStyledDocument.ElementSpec var1) {
  226.       DefaultStyledDocument.ElementBuffer.ElemChanges var2 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  227.       switch (var1.getType()) {
  228.          case 1:
  229.             Element var3 = this.this$0.createBranchElement(var2.parent, var1.getAttributes());
  230.             var2.added.addElement(var3);
  231.             this.push(var3, 0);
  232.             return;
  233.          case 2:
  234.             this.pop();
  235.             return;
  236.          case 3:
  237.             int var4 = var1.getLength();
  238.             if (var1.getDirection() != 4) {
  239.                Element var5 = this.this$0.createLeafElement(var2.parent, var1.getAttributes(), this.pos, this.pos + var4);
  240.                var2.added.addElement(var5);
  241.             }
  242.  
  243.             this.pos += var4;
  244.             return;
  245.          default:
  246.       }
  247.    }
  248.  
  249.    void removeElements(Element var1, int var2, int var3) {
  250.       if (!var1.isLeaf()) {
  251.          int var4 = var1.getElementIndex(var2);
  252.          int var5 = var1.getElementIndex(var3);
  253.          this.push(var1, var4);
  254.          if (var4 == var5) {
  255.             this.removeElements(var1.getElement(var4), var2, var3);
  256.          } else {
  257.             Element var6 = var1.getElement(var4);
  258.             Element var7 = var1.getElement(var5);
  259.             DefaultStyledDocument.ElementBuffer.ElemChanges var8 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  260.             if (this.canJoin(var6, var7)) {
  261.                for(int var12 = var4; var12 <= var5; ++var12) {
  262.                   var8.removed.addElement(var1.getElement(var12));
  263.                }
  264.  
  265.                Element var13 = this.join(var1, var6, var7, var2, var3);
  266.                var8.added.addElement(var13);
  267.             } else {
  268.                int var9 = var4 + 1;
  269.                int var10 = var5 - 1;
  270.                if (var6.getStartOffset() == var2) {
  271.                   var6 = null;
  272.                   var9 = var4;
  273.                }
  274.  
  275.                if (var7.getStartOffset() == var3) {
  276.                   var7 = null;
  277.                }
  278.  
  279.                if (var9 <= var10) {
  280.                   var8.index = var9;
  281.                }
  282.  
  283.                for(int var11 = var9; var11 <= var10; ++var11) {
  284.                   var8.removed.addElement(var1.getElement(var11));
  285.                }
  286.  
  287.                if (var6 != null) {
  288.                   this.removeElements(var6, var2, var3);
  289.                }
  290.  
  291.                if (var7 != null) {
  292.                   this.removeElements(var7, var2, var3);
  293.                }
  294.             }
  295.          }
  296.  
  297.          this.pop();
  298.       }
  299.  
  300.    }
  301.  
  302.    boolean canJoin(Element var1, Element var2) {
  303.       if (var1 != null && var2 != null) {
  304.          return var1.getName().equals("paragraph") && var2.getName().equals("paragraph") ? true : var1.getAttributes().isEqual(var2.getAttributes());
  305.       } else {
  306.          return false;
  307.       }
  308.    }
  309.  
  310.    Element join(Element var1, Element var2, Element var3, int var4, int var5) {
  311.       if (var2.isLeaf() && var3.isLeaf()) {
  312.          return this.this$0.createLeafElement(var1, var2.getAttributes(), var2.getStartOffset(), var3.getEndOffset());
  313.       } else if (!var2.isLeaf() && !var3.isLeaf()) {
  314.          Element var6 = this.this$0.createBranchElement(var1, var2.getAttributes());
  315.          int var7 = var2.getElementIndex(var4);
  316.          int var8 = var3.getElementIndex(var5);
  317.          Element var9 = var2.getElement(var7);
  318.          if (var9.getStartOffset() == var4) {
  319.             var9 = null;
  320.          }
  321.  
  322.          Element var10 = var3.getElement(var8);
  323.          if (var10.getStartOffset() == var5) {
  324.             var10 = null;
  325.          }
  326.  
  327.          Vector var11 = new Vector();
  328.  
  329.          for(int var12 = 0; var12 < var7; ++var12) {
  330.             var11.addElement(this.clone(var6, var2.getElement(var12)));
  331.          }
  332.  
  333.          if (this.canJoin(var9, var10)) {
  334.             Element var13 = this.join(var6, var9, var10, var4, var5);
  335.             var11.addElement(var13);
  336.          } else {
  337.             if (var9 != null) {
  338.                var11.addElement(this.clone(var6, var9));
  339.             }
  340.  
  341.             if (var10 != null) {
  342.                var11.addElement(this.clone(var6, var10));
  343.             }
  344.          }
  345.  
  346.          int var16 = var3.getElementCount();
  347.  
  348.          for(int var14 = var10 == null ? var8 : var8 + 1; var14 < var16; ++var14) {
  349.             var11.addElement(this.clone(var6, var3.getElement(var14)));
  350.          }
  351.  
  352.          Element[] var15 = new Element[var11.size()];
  353.          var11.copyInto(var15);
  354.          ((AbstractDocument.BranchElement)var6).replace(0, 0, var15);
  355.          return var6;
  356.       } else {
  357.          throw new StateInvariantError("No support to join leaf element with non-leaf element");
  358.       }
  359.    }
  360.  
  361.    public Element clone(Element var1, Element var2) {
  362.       if (var2.isLeaf()) {
  363.          return this.this$0.createLeafElement(var1, var2.getAttributes(), var2.getStartOffset(), var2.getEndOffset());
  364.       } else {
  365.          Element var3 = this.this$0.createBranchElement(var1, var2.getAttributes());
  366.          int var4 = var2.getElementCount();
  367.          Element[] var5 = new Element[var4];
  368.  
  369.          for(int var6 = 0; var6 < var4; ++var6) {
  370.             var5[var6] = this.clone(var3, var2.getElement(var6));
  371.          }
  372.  
  373.          ((AbstractDocument.BranchElement)var3).replace(0, 0, var5);
  374.          return var3;
  375.       }
  376.    }
  377.  
  378.    void open(DefaultStyledDocument.ElementSpec[] var1) {
  379.       int var2 = var1[0].getDirection() == 4 ? this.offset + var1[0].getLength() : this.offset;
  380.       int var3 = this.offset + this.length;
  381.       DefaultStyledDocument.ElementBuffer.ElemChanges var4 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  382.       Element var5 = var4.parent.getElement(var4.index);
  383.       boolean var6 = false;
  384.  
  385.       for(int var7 = 0; var7 < var1.length; ++var7) {
  386.          if (var1[var7].getType() == 2) {
  387.             var6 = true;
  388.             break;
  389.          }
  390.       }
  391.  
  392.       if (var6 || var2 != var3) {
  393.          var4.removed.addElement(var5);
  394.          if (var2 != var5.getStartOffset()) {
  395.             Element var8 = this.this$0.createLeafElement(var4.parent, var5.getAttributes(), var5.getStartOffset(), var2);
  396.             var4.added.addElement(var8);
  397.          }
  398.  
  399.          if (var5.getEndOffset() > var3) {
  400.             int var16 = var5.getEndOffset() - var3;
  401.             DefaultStyledDocument.ElementSpec var9 = new DefaultStyledDocument.ElementSpec(var5.getAttributes(), (short)3, var16);
  402.             this.endJoin.addElement(var9);
  403.          }
  404.  
  405.          if (var6) {
  406.             int var17 = var4.parent.getElementCount();
  407.  
  408.             for(int var19 = var4.index + 1; var19 < var17; ++var19) {
  409.                var5 = var4.parent.getElement(var19);
  410.                var4.removed.addElement(var5);
  411.                int var10 = var5.getEndOffset() - var5.getStartOffset();
  412.                DefaultStyledDocument.ElementSpec var11 = new DefaultStyledDocument.ElementSpec(var5.getAttributes(), (short)3, var10);
  413.                this.endJoin.addElement(var11);
  414.             }
  415.          }
  416.  
  417.          if (var6 && this.endJoin.size() == 0) {
  418.             var4 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.elementAt(this.path.size() - 2);
  419.             Element var18 = var4.parent.getElement(var4.index);
  420.             if (var18 != null) {
  421.                var4.removed.addElement(var18);
  422.                int var20 = var18.getElementCount();
  423.  
  424.                for(int var21 = 0; var21 < var20; ++var21) {
  425.                   var5 = var18.getElement(var21);
  426.                   int var22 = var5.getEndOffset() - var5.getStartOffset();
  427.                   DefaultStyledDocument.ElementSpec var12 = new DefaultStyledDocument.ElementSpec(var5.getAttributes(), (short)3, var22);
  428.                   this.endJoin.addElement(var12);
  429.                }
  430.             }
  431.          }
  432.       }
  433.  
  434.    }
  435.  
  436.    void close() {
  437.       DefaultStyledDocument.ElementBuffer.ElemChanges var1 = (DefaultStyledDocument.ElementBuffer.ElemChanges)this.path.peek();
  438.       int var2 = this.endJoin.size();
  439.  
  440.       for(int var3 = 0; var3 < var2; ++var3) {
  441.          DefaultStyledDocument.ElementSpec var4 = (DefaultStyledDocument.ElementSpec)this.endJoin.elementAt(var3);
  442.          int var5 = this.pos + var4.getLength();
  443.          Element var6 = this.this$0.createLeafElement(var1.parent, var4.getAttributes(), this.pos, var5);
  444.          var1.added.addElement(var6);
  445.          this.pos = var5;
  446.       }
  447.  
  448.    }
  449. }
  450.