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

  1. package com.sun.java.swing.text;
  2.  
  3. import com.sun.java.swing.event.DocumentEvent;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Graphics;
  7. import java.awt.Rectangle;
  8. import java.awt.Shape;
  9. import java.util.Vector;
  10.  
  11. public class ParagraphView extends BoxView implements TabExpander {
  12.    private int justification;
  13.    private int lineSpacing;
  14.    private int tabBase;
  15.    private int layoutSpan;
  16.    private Vector layoutPool;
  17.    static char[] tabChars = new char[1];
  18.    static char[] tabDecimalChars;
  19.  
  20.    public ParagraphView(Element var1) {
  21.       super(var1, 1);
  22.       AttributeSet var2 = var1.getAttributes();
  23.       ((CompositeView)this).setParagraphInsets(var2);
  24.       this.justification = StyleConstants.getAlignment(var2);
  25.       this.lineSpacing = (int)StyleConstants.getLineSpacing(var2);
  26.       this.layoutSpan = Integer.MAX_VALUE;
  27.    }
  28.  
  29.    protected void loadChildren(ViewFactory var1) {
  30.       this.layoutPool = new Vector();
  31.       Element var2 = ((View)this).getElement();
  32.       int var3 = var2.getElementCount();
  33.  
  34.       for(int var4 = 0; var4 < var3; ++var4) {
  35.          this.layoutPool.addElement(var1.create(var2.getElement(var4)));
  36.       }
  37.  
  38.    }
  39.  
  40.    protected View getViewAtPosition(int var1, Rectangle var2) {
  41.       int var3 = ((CompositeView)this).getViewCount();
  42.  
  43.       for(int var4 = 0; var4 < var3; ++var4) {
  44.          View var5 = ((CompositeView)this).getView(var4);
  45.          int var6 = var5.getStartOffset();
  46.          int var7 = var5.getEndOffset();
  47.          if (var1 >= var6 && var1 < var7) {
  48.             ((BoxView)this).childAllocation(var4, var2);
  49.             return var5;
  50.          }
  51.       }
  52.  
  53.       return null;
  54.    }
  55.  
  56.    protected void layout(int var1, int var2) {
  57.       if (this.layoutSpan != var1) {
  58.          int var3 = (int)this.getPreferredSpan(1);
  59.          this.rebuildRows(var1);
  60.          int var4 = (int)this.getPreferredSpan(1);
  61.          if (var3 != var4) {
  62.             View var5 = ((View)this).getParent();
  63.             var5.preferenceChanged(this, false, true);
  64.          }
  65.       }
  66.  
  67.       super.layout(var1, var2);
  68.    }
  69.  
  70.    void rebuildRows(int var1) {
  71.       this.layoutSpan = var1;
  72.       int var2 = ((View)this).getStartOffset();
  73.       int var3 = ((View)this).getEndOffset();
  74.       ((CompositeView)this).removeAll();
  75.  
  76.       while(var2 < var3) {
  77.          int var4 = var2;
  78.          Row var5 = new Row(this, ((View)this).getElement());
  79.          ((CompositeView)this).append(var5);
  80.          this.layoutRow(var5, var2);
  81.          var2 = var5.getEndOffset();
  82.          if (var2 <= var4) {
  83.             throw new StateInvariantError("infinite loop in formatting");
  84.          }
  85.       }
  86.  
  87.    }
  88.  
  89.    void layoutRow(Row var1, int var2) {
  90.       int var3 = this.tabBase;
  91.       int var4 = this.layoutSpan;
  92.  
  93.       View var6;
  94.       for(int var5 = ((View)this).getEndOffset(); var2 < var5 && var4 > 0; var2 = var6.getEndOffset()) {
  95.          var6 = this.createView(var2);
  96.          int var7;
  97.          if (var6 instanceof TabableView) {
  98.             var7 = (int)((TabableView)var6).getTabbedSpan((float)var3, this);
  99.          } else {
  100.             var7 = (int)var6.getPreferredSpan(0);
  101.          }
  102.  
  103.          var4 -= var7;
  104.          var3 += var7;
  105.          ((CompositeView)var1).append(var6);
  106.       }
  107.  
  108.       if (var4 < 0) {
  109.          this.adjustRow(var1, this.layoutSpan);
  110.       } else {
  111.          if (((CompositeView)var1).getViewCount() == 0) {
  112.             var6 = this.createView(var2);
  113.             ((CompositeView)var1).append(var6);
  114.          }
  115.  
  116.       }
  117.    }
  118.  
  119.    protected void adjustRow(Row var1, int var2) {
  120.       int var3 = ((CompositeView)var1).getViewCount();
  121.       int var4 = 0;
  122.       int var5 = 0;
  123.       int var6 = 0;
  124.       int var7 = -1;
  125.  
  126.       for(int var9 = 0; var9 < var3; ++var9) {
  127.          View var8 = ((CompositeView)var1).getView(var9);
  128.          int var10 = var2 - var4;
  129.          int var11 = var8.getBreakWeight(0, (float)var4, (float)var10);
  130.          if (var11 >= var5) {
  131.             var5 = var11;
  132.             var7 = var9;
  133.             var6 = var4;
  134.             if (var11 >= 3000) {
  135.                break;
  136.             }
  137.          }
  138.  
  139.          var4 = (int)((float)var4 + var8.getPreferredSpan(0));
  140.       }
  141.  
  142.       if (var7 >= 0) {
  143.          int var14 = var2 - var6;
  144.          View var12 = ((CompositeView)var1).getView(var7);
  145.          var12 = var12.breakView(0, var12.getStartOffset(), (float)var6, (float)var14);
  146.          View[] var15 = new View[]{var12};
  147.          ((BoxView)var1).replace(var7, var3 - var7, var15);
  148.       }
  149.    }
  150.  
  151.    View createView(int var1) {
  152.       int var2 = ((View)this).getElement().getElementIndex(var1);
  153.       View var3 = (View)this.layoutPool.elementAt(var2);
  154.       if (var1 == var3.getStartOffset()) {
  155.          return var3;
  156.       } else {
  157.          var3 = var3.createFragment(var1, var3.getEndOffset());
  158.          return var3;
  159.       }
  160.    }
  161.  
  162.    public float nextTabStop(float var1, int var2) {
  163.       var1 -= (float)this.tabBase;
  164.       TabSet var3 = StyleConstants.getTabSet(((View)this).getElement().getAttributes());
  165.       if (var3 == null) {
  166.          return (float)(this.tabBase + ((int)var1 / 72 + 1) * 72);
  167.       } else {
  168.          TabStop var4 = var3.getTabAfter(var1 + 0.01F);
  169.          if (var4 == null) {
  170.             return (float)this.tabBase + var1 + 5.0F;
  171.          } else {
  172.             int var5 = var4.getAlignment();
  173.             int var6;
  174.             switch (var5) {
  175.                case 0:
  176.                case 3:
  177.                default:
  178.                   return (float)this.tabBase + var4.getPosition();
  179.                case 1:
  180.                case 2:
  181.                   var6 = this.findOffsetToCharactersInString(tabChars, var2 + 1);
  182.                   break;
  183.                case 4:
  184.                   var6 = this.findOffsetToCharactersInString(tabDecimalChars, var2 + 1);
  185.                   break;
  186.                case 5:
  187.                   return (float)this.tabBase + var4.getPosition();
  188.             }
  189.  
  190.             if (var6 == -1) {
  191.                var6 = ((View)this).getEndOffset();
  192.             }
  193.  
  194.             float var7 = this.getPartialSize(var2 + 1, var6);
  195.             switch (var5) {
  196.                case 1:
  197.                case 4:
  198.                   return (float)this.tabBase + Math.max(var1, var4.getPosition() - var7);
  199.                case 2:
  200.                   return (float)this.tabBase + Math.max(var1, var4.getPosition() - var7 / 2.0F);
  201.                case 3:
  202.                default:
  203.                   return var1;
  204.             }
  205.          }
  206.       }
  207.    }
  208.  
  209.    protected float getPartialSize(int var1, int var2) {
  210.       float var3 = 0.0F;
  211.       int var5 = ((CompositeView)this).getViewCount();
  212.       int var4 = ((View)this).getElement().getElementIndex(var1);
  213.  
  214.       int var7;
  215.       for(int var9 = this.layoutPool.size(); var1 < var2 && var4 < var9; var1 = var7) {
  216.          View var6 = (View)this.layoutPool.elementAt(var4++);
  217.          var7 = var6.getEndOffset();
  218.          int var8 = Math.min(var2, var7);
  219.          if (var6 instanceof TabableView) {
  220.             var3 += ((TabableView)var6).getPartialSpan(var1, var8);
  221.          } else {
  222.             if (var1 != var6.getStartOffset() || var8 != var6.getEndOffset()) {
  223.                return 0.0F;
  224.             }
  225.  
  226.             var3 += var6.getPreferredSpan(0);
  227.          }
  228.       }
  229.  
  230.       return var3;
  231.    }
  232.  
  233.    protected int findOffsetToCharactersInString(char[] var1, int var2) {
  234.       int var3 = var1.length;
  235.       int var4 = ((View)this).getEndOffset();
  236.       Segment var5 = new Segment();
  237.  
  238.       try {
  239.          ((View)this).getDocument().getText(var2, var4 - var2, var5);
  240.       } catch (BadLocationException var10) {
  241.          return -1;
  242.       }
  243.  
  244.       int var6 = var5.offset;
  245.  
  246.       for(int var7 = var5.offset + var5.count; var6 < var7; ++var6) {
  247.          char var8 = var5.array[var6];
  248.  
  249.          for(int var9 = 0; var9 < var3; ++var9) {
  250.             if (var8 == var1[var9]) {
  251.                return var6 - var5.offset + var2;
  252.             }
  253.          }
  254.       }
  255.  
  256.       return -1;
  257.    }
  258.  
  259.    public void paint(Graphics var1, Shape var2) {
  260.       Rectangle var3 = var2.getBounds();
  261.       this.tabBase = var3.x + ((CompositeView)this).getLeftInset();
  262.       super.paint(var1, var2);
  263.    }
  264.  
  265.    public float getPreferredSpan(int var1) {
  266.       switch (var1) {
  267.          case 0:
  268.             int var2 = (int)Math.min((long)this.layoutSpan + (long)((CompositeView)this).getLeftInset() + (long)((CompositeView)this).getRightInset(), 2147483647L);
  269.             if (this.layoutSpan != Integer.MAX_VALUE) {
  270.                return (float)var2;
  271.             }
  272.  
  273.             return super.getPreferredSpan(var1);
  274.          case 1:
  275.             return super.getPreferredSpan(var1);
  276.          default:
  277.             throw new IllegalArgumentException("Invalid axis: " + var1);
  278.       }
  279.    }
  280.  
  281.    public float getAlignment(int var1) {
  282.       switch (var1) {
  283.          case 1:
  284.             int var2 = (int)this.getPreferredSpan(1);
  285.             View var3 = ((CompositeView)this).getView(0);
  286.             int var4 = (int)var3.getPreferredSpan(1);
  287.             float var5 = var2 != 0 ? (float)(var4 / 2) / (float)var2 : 0.0F;
  288.             return var5;
  289.          default:
  290.             return super.getAlignment(var1);
  291.       }
  292.    }
  293.  
  294.    public int getResizeWeight(int var1) {
  295.       switch (var1) {
  296.          case 0:
  297.             return 1;
  298.          case 1:
  299.             return 0;
  300.          default:
  301.             throw new IllegalArgumentException("Invalid axis: " + var1);
  302.       }
  303.    }
  304.  
  305.    public View breakView(int var1, float var2, Shape var3) {
  306.       if (var1 == 1) {
  307.          if (var3 != null) {
  308.             Rectangle var4 = var3.getBounds();
  309.             ((BoxView)this).setSize((float)var4.width, (float)var4.height);
  310.          }
  311.  
  312.          return this;
  313.       } else {
  314.          return this;
  315.       }
  316.    }
  317.  
  318.    public int getBreakWeight(int var1, float var2) {
  319.       return var1 == 1 ? 0 : 0;
  320.    }
  321.  
  322.    public void insertUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  323.       Element var4 = ((View)this).getElement();
  324.       DocumentEvent.ElementChange var5 = var1.getChange(var4);
  325.       if (var5 != null) {
  326.          this.updateLogicalChildren(var5, var3);
  327.       }
  328.  
  329.       if (var5 == null || var5.getChildrenRemoved().length == 0) {
  330.          int var6 = var1.getOffset();
  331.          int var7 = var4.getElementIndex(var6);
  332.          View var8 = (View)this.layoutPool.elementAt(var7);
  333.          var8.insertUpdate(var1, (Shape)null, var3);
  334.       }
  335.  
  336.       this.layoutSpan = Integer.MAX_VALUE;
  337.       ((BoxView)this).preferenceChanged((View)null, false, true);
  338.       Rectangle var9 = ((CompositeView)this).getInsideAllocation(var2);
  339.       if (var9 != null) {
  340.          this.layout(var9.width, var9.height);
  341.          Container var10 = ((View)this).getContainer();
  342.          ((Component)var10).repaint(var9.x, var9.y, var9.width, var9.height);
  343.       }
  344.  
  345.    }
  346.  
  347.    void updateLogicalChildren(DocumentEvent.ElementChange var1, ViewFactory var2) {
  348.       int var3 = var1.getIndex();
  349.       Element[] var4 = var1.getChildrenRemoved();
  350.  
  351.       for(int var5 = 0; var5 < var4.length; ++var5) {
  352.          View var6 = (View)this.layoutPool.elementAt(var3);
  353.          var6.setParent((View)null);
  354.          this.layoutPool.removeElementAt(var3);
  355.       }
  356.  
  357.       Element[] var8 = var1.getChildrenAdded();
  358.  
  359.       for(int var7 = 0; var7 < var8.length; ++var7) {
  360.          this.layoutPool.insertElementAt(var2.create(var8[var7]), var3 + var7);
  361.       }
  362.  
  363.    }
  364.  
  365.    public void removeUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  366.       Element var4 = ((View)this).getElement();
  367.       DocumentEvent.ElementChange var5 = var1.getChange(var4);
  368.       if (var5 != null) {
  369.          this.updateLogicalChildren(var5, var3);
  370.       }
  371.  
  372.       if (var5 == null || var5.getChildrenAdded().length == 0) {
  373.          int var6 = var1.getOffset();
  374.          int var7 = var4.getElementIndex(var6);
  375.          View var8 = (View)this.layoutPool.elementAt(var7);
  376.          var8.removeUpdate(var1, (Shape)null, var3);
  377.       }
  378.  
  379.       this.layoutSpan = Integer.MAX_VALUE;
  380.       ((BoxView)this).preferenceChanged((View)null, false, true);
  381.       if (var2 != null) {
  382.          Rectangle var9 = ((CompositeView)this).getInsideAllocation(var2);
  383.          this.layout(var9.width, var9.height);
  384.          Container var10 = ((View)this).getContainer();
  385.          ((Component)var10).repaint(var9.x, var9.y, var9.width, var9.height);
  386.       }
  387.  
  388.    }
  389.  
  390.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  391.       AttributeSet var4 = ((View)this).getElement().getAttributes();
  392.       ((CompositeView)this).setParagraphInsets(var4);
  393.       this.justification = StyleConstants.getAlignment(var4);
  394.       this.lineSpacing = (int)StyleConstants.getLineSpacing(var4);
  395.       Element var5 = ((View)this).getElement();
  396.       DocumentEvent.ElementChange var6 = var1.getChange(var5);
  397.       if (var6 != null) {
  398.          this.updateLogicalChildren(var6, var3);
  399.       }
  400.  
  401.       int var7 = var1.getOffset();
  402.       int var8 = var7 + var1.getLength();
  403.       int var9 = var5.getElementIndex(var7);
  404.       int var10 = var5.getElementIndex(var8 - 1);
  405.  
  406.       for(int var11 = var9; var11 <= var10; ++var11) {
  407.          View var12 = (View)this.layoutPool.elementAt(var11);
  408.          var12.changedUpdate(var1, (Shape)null, var3);
  409.       }
  410.  
  411.       this.layoutSpan = Integer.MAX_VALUE;
  412.       ((BoxView)this).preferenceChanged((View)null, false, true);
  413.       if (var2 != null) {
  414.          Rectangle var14 = ((CompositeView)this).getInsideAllocation(var2);
  415.          this.layout(var14.width, var14.height);
  416.          Container var13 = ((View)this).getContainer();
  417.          ((Component)var13).repaint(var14.x, var14.y, var14.width, var14.height);
  418.       }
  419.  
  420.    }
  421.  
  422.    // $FF: synthetic method
  423.    static int access$0(ParagraphView var0) {
  424.       return var0.justification;
  425.    }
  426.  
  427.    static {
  428.       tabChars[0] = '\t';
  429.       tabDecimalChars = new char[2];
  430.       tabDecimalChars[0] = '\t';
  431.       tabDecimalChars[1] = '.';
  432.    }
  433. }
  434.