home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / text / BoxView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  7.9 KB  |  477 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.  
  10. public class BoxView extends CompositeView {
  11.    int axis;
  12.    int width;
  13.    int height;
  14.    boolean xValid;
  15.    boolean yValid;
  16.    int[] preferredSpan = new int[2];
  17.    int[] resizeWeight = new int[2];
  18.    float[] alignment = new float[2];
  19.    boolean xAllocValid;
  20.    int[] xOffsets;
  21.    int[] xSpans;
  22.    boolean yAllocValid;
  23.    int[] yOffsets;
  24.    int[] ySpans;
  25.  
  26.    public BoxView(Element var1, int var2) {
  27.       super(var1);
  28.       this.axis = var2;
  29.    }
  30.  
  31.    protected void paintChild(Graphics var1, Rectangle var2, int var3) {
  32.       View var4 = ((CompositeView)this).getView(var3);
  33.       var4.paint(var1, var2);
  34.    }
  35.  
  36.    public void replace(int var1, int var2, View[] var3) {
  37.       super.replace(var1, var2, var3);
  38.       this.xOffsets = null;
  39.       this.xSpans = null;
  40.       this.xValid = false;
  41.       this.xAllocValid = false;
  42.       this.yOffsets = null;
  43.       this.ySpans = null;
  44.       this.yValid = false;
  45.       this.yAllocValid = false;
  46.    }
  47.  
  48.    public void preferenceChanged(View var1, boolean var2, boolean var3) {
  49.       if (var2) {
  50.          this.xValid = false;
  51.          this.xAllocValid = false;
  52.       }
  53.  
  54.       if (var3) {
  55.          this.yValid = false;
  56.          this.yAllocValid = false;
  57.       }
  58.  
  59.       super.preferenceChanged(var1, var2, var3);
  60.    }
  61.  
  62.    public void setSize(float var1, float var2) {
  63.       if ((int)var1 != this.width) {
  64.          this.xAllocValid = false;
  65.       }
  66.  
  67.       if ((int)var2 != this.height) {
  68.          this.yAllocValid = false;
  69.       }
  70.  
  71.       if (!this.xAllocValid || !this.yAllocValid) {
  72.          this.width = (int)var1;
  73.          this.height = (int)var2;
  74.          this.layout(this.width - ((CompositeView)this).getLeftInset() - ((CompositeView)this).getRightInset(), this.height - ((CompositeView)this).getTopInset() - ((CompositeView)this).getBottomInset());
  75.       }
  76.  
  77.    }
  78.  
  79.    public void paint(Graphics var1, Shape var2) {
  80.       Rectangle var3 = var2.getBounds();
  81.       this.setSize((float)var3.width, (float)var3.height);
  82.       int var4 = ((CompositeView)this).getViewCount();
  83.       int var5 = var3.x + ((CompositeView)this).getLeftInset();
  84.       int var6 = var3.y + ((CompositeView)this).getTopInset();
  85.       Rectangle var7 = var1.getClipBounds();
  86.  
  87.       for(int var8 = 0; var8 < var4; ++var8) {
  88.          var3.x = var5 + this.xOffsets[var8];
  89.          var3.y = var6 + this.yOffsets[var8];
  90.          var3.width = this.xSpans[var8];
  91.          var3.height = this.ySpans[var8];
  92.          if (var3.intersects(var7)) {
  93.             this.paintChild(var1, var3, var8);
  94.          }
  95.       }
  96.  
  97.    }
  98.  
  99.    public Shape modelToView(int var1, Shape var2) throws BadLocationException {
  100.       if (!this.isAllocationValid()) {
  101.          Rectangle var3 = var2.getBounds();
  102.          this.setSize((float)var3.width, (float)var3.height);
  103.       }
  104.  
  105.       return super.modelToView(var1, var2);
  106.    }
  107.  
  108.    public int viewToModel(float var1, float var2, Shape var3) {
  109.       if (!this.isAllocationValid()) {
  110.          Rectangle var4 = var3.getBounds();
  111.          this.setSize((float)var4.width, (float)var4.height);
  112.       }
  113.  
  114.       return super.viewToModel(var1, var2, var3);
  115.    }
  116.  
  117.    public float getAlignment(int var1) {
  118.       this.checkRequests();
  119.       switch (var1) {
  120.          case 0:
  121.          case 1:
  122.             return this.alignment[var1];
  123.          default:
  124.             throw new IllegalArgumentException("Invalid axis: " + var1);
  125.       }
  126.    }
  127.  
  128.    public int getResizeWeight(int var1) {
  129.       this.checkRequests();
  130.       switch (var1) {
  131.          case 0:
  132.          case 1:
  133.             return this.resizeWeight[var1];
  134.          default:
  135.             throw new IllegalArgumentException("Invalid axis: " + var1);
  136.       }
  137.    }
  138.  
  139.    public float getPreferredSpan(int var1) {
  140.       this.checkRequests();
  141.       switch (var1) {
  142.          case 0:
  143.             return (float)(this.preferredSpan[var1] + ((CompositeView)this).getLeftInset() + ((CompositeView)this).getRightInset());
  144.          case 1:
  145.             return (float)(this.preferredSpan[var1] + ((CompositeView)this).getTopInset() + ((CompositeView)this).getBottomInset());
  146.          default:
  147.             throw new IllegalArgumentException("Invalid axis: " + var1);
  148.       }
  149.    }
  150.  
  151.    public void insertUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  152.       Element var4 = ((View)this).getElement();
  153.       DocumentEvent.ElementChange var5 = var1.getChange(var4);
  154.       if (var5 != null) {
  155.          Element[] var6 = var5.getChildrenRemoved();
  156.          Element[] var7 = var5.getChildrenAdded();
  157.          View[] var8 = new View[var7.length];
  158.  
  159.          for(int var9 = 0; var9 < var7.length; ++var9) {
  160.             var8[var9] = var3.create(var7[var9]);
  161.          }
  162.  
  163.          this.replace(var5.getIndex(), var6.length, var8);
  164.          if (var2 != null) {
  165.             this.preferenceChanged((View)null, true, true);
  166.             ((View)this).getContainer().repaint();
  167.          }
  168.       }
  169.  
  170.       Rectangle var10 = var2 != null && this.isAllocationValid() ? ((CompositeView)this).getInsideAllocation(var2) : null;
  171.       int var11 = var1.getOffset();
  172.       View var12 = ((CompositeView)this).getViewAtPosition(var11, var10);
  173.       if (var12 != null) {
  174.          var12.insertUpdate(var1, var10, var3);
  175.          if (var12.getStartOffset() == var11) {
  176.             var12 = ((CompositeView)this).getViewAtPosition(var11 - 1, var10);
  177.             var12.insertUpdate(var1, var10, var3);
  178.          }
  179.       }
  180.  
  181.    }
  182.  
  183.    public void removeUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  184.       Element var4 = ((View)this).getElement();
  185.       DocumentEvent.ElementChange var5 = var1.getChange(var4);
  186.       boolean var6 = true;
  187.       if (var5 != null) {
  188.          Element[] var7 = var5.getChildrenRemoved();
  189.          Element[] var8 = var5.getChildrenAdded();
  190.          View[] var9 = new View[var8.length];
  191.  
  192.          for(int var10 = 0; var10 < var8.length; ++var10) {
  193.             var9[var10] = var3.create(var8[var10]);
  194.          }
  195.  
  196.          this.replace(var5.getIndex(), var7.length, var9);
  197.          if (var9.length != 0) {
  198.             var6 = false;
  199.          }
  200.  
  201.          if (var2 != null) {
  202.             this.preferenceChanged((View)null, true, true);
  203.             ((View)this).getContainer().repaint();
  204.          }
  205.       }
  206.  
  207.       if (var6) {
  208.          Rectangle var11 = var2 != null && this.isAllocationValid() ? ((CompositeView)this).getInsideAllocation(var2) : null;
  209.          int var12 = var1.getOffset();
  210.          View var13 = ((CompositeView)this).getViewAtPosition(var12, var11);
  211.          if (var13 != null) {
  212.             var13.removeUpdate(var1, var11, var3);
  213.          }
  214.       }
  215.  
  216.    }
  217.  
  218.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  219.       Element var4 = ((View)this).getElement();
  220.       Rectangle var5 = var2 != null && this.isAllocationValid() ? ((CompositeView)this).getInsideAllocation(var2) : null;
  221.       int var6 = 0;
  222.       int var7 = 0;
  223.       int var8 = 0;
  224.       int var9 = 0;
  225.       if (var5 != null) {
  226.          var6 = var5.x;
  227.          var7 = var5.y;
  228.          var8 = var5.width;
  229.          var9 = var5.height;
  230.       }
  231.  
  232.       int var10 = var4.getElementIndex(var1.getOffset());
  233.       int var11 = var4.getElementIndex(var1.getOffset() + var1.getLength() - 1);
  234.  
  235.       for(int var12 = var10; var12 <= var11; ++var12) {
  236.          View var13 = ((CompositeView)this).getView(var12);
  237.          if (var5 != null) {
  238.             var5.x = var6 + this.xOffsets[var12];
  239.             var5.y = var7 + this.yOffsets[var12];
  240.             var5.width = this.xSpans[var12];
  241.             var5.height = this.ySpans[var12];
  242.          }
  243.  
  244.          var13.changedUpdate(var1, var5, var3);
  245.       }
  246.  
  247.       DocumentEvent.ElementChange var18 = var1.getChange(var4);
  248.       if (var18 != null) {
  249.          Element[] var14 = var18.getChildrenRemoved();
  250.          Element[] var15 = var18.getChildrenAdded();
  251.          View[] var16 = new View[var15.length];
  252.  
  253.          for(int var17 = 0; var17 < var15.length; ++var17) {
  254.             var16[var17] = var3.create(var15[var17]);
  255.          }
  256.  
  257.          this.replace(var18.getIndex(), var14.length, var16);
  258.       }
  259.  
  260.       if (var2 != null && !this.isAllocationValid()) {
  261.          Container var19 = ((View)this).getContainer();
  262.          ((Component)var19).repaint(var6, var7, var8, var9);
  263.       }
  264.  
  265.    }
  266.  
  267.    protected boolean isAllocationValid() {
  268.       return this.xAllocValid && this.yAllocValid;
  269.    }
  270.  
  271.    protected boolean isBefore(int var1, int var2, Rectangle var3) {
  272.       if (this.axis == 0) {
  273.          return var1 < var3.x;
  274.       } else {
  275.          return var2 < var3.y;
  276.       }
  277.    }
  278.  
  279.    protected boolean isAfter(int var1, int var2, Rectangle var3) {
  280.       if (this.axis == 0) {
  281.          return var1 > var3.width + var3.x;
  282.       } else {
  283.          return var2 > var3.height + var3.y;
  284.       }
  285.    }
  286.  
  287.    protected View getViewAtPoint(int var1, int var2, Rectangle var3) {
  288.       int var4 = ((CompositeView)this).getViewCount();
  289.       if (this.axis == 0) {
  290.          if (var1 < var3.x + this.xOffsets[0]) {
  291.             this.childAllocation(0, var3);
  292.             return ((CompositeView)this).getView(0);
  293.          } else {
  294.             for(int var6 = 0; var6 < var4; ++var6) {
  295.                if (var1 < var3.x + this.xOffsets[var6]) {
  296.                   this.childAllocation(var6 - 1, var3);
  297.                   return ((CompositeView)this).getView(var6 - 1);
  298.                }
  299.             }
  300.  
  301.             this.childAllocation(var4 - 1, var3);
  302.             return ((CompositeView)this).getView(var4 - 1);
  303.          }
  304.       } else if (var2 < var3.y + this.yOffsets[0]) {
  305.          this.childAllocation(0, var3);
  306.          return ((CompositeView)this).getView(0);
  307.       } else {
  308.          for(int var5 = 0; var5 < var4; ++var5) {
  309.             if (var2 < var3.y + this.yOffsets[var5]) {
  310.                this.childAllocation(var5 - 1, var3);
  311.                return ((CompositeView)this).getView(var5 - 1);
  312.             }
  313.          }
  314.  
  315.          this.childAllocation(var4 - 1, var3);
  316.          return ((CompositeView)this).getView(var4 - 1);
  317.       }
  318.    }
  319.  
  320.    protected void childAllocation(int var1, Rectangle var2) {
  321.       var2.x += this.xOffsets[var1];
  322.       var2.y += this.yOffsets[var1];
  323.       var2.width = this.xSpans[var1];
  324.       var2.height = this.ySpans[var1];
  325.    }
  326.  
  327.    protected void layout(int var1, int var2) {
  328.       this.checkRequests();
  329.       if (this.xSpans == null) {
  330.          int var3 = ((CompositeView)this).getViewCount();
  331.          this.xSpans = new int[var3];
  332.          this.ySpans = new int[var3];
  333.          this.xOffsets = new int[var3];
  334.          this.yOffsets = new int[var3];
  335.       }
  336.  
  337.       if (this.axis == 0) {
  338.          if (!this.xAllocValid) {
  339.             this.calculateTiledPositions(var1, 0);
  340.          }
  341.  
  342.          if (!this.yAllocValid) {
  343.             this.calculateAlignedPositions(var2, 1);
  344.          }
  345.       } else {
  346.          if (!this.xAllocValid) {
  347.             this.calculateAlignedPositions(var1, 0);
  348.          }
  349.  
  350.          if (!this.yAllocValid) {
  351.             this.calculateTiledPositions(var2, 1);
  352.          }
  353.       }
  354.  
  355.       this.xAllocValid = true;
  356.       this.yAllocValid = true;
  357.       int var6 = ((CompositeView)this).getViewCount();
  358.  
  359.       for(int var4 = 0; var4 < var6; ++var4) {
  360.          View var5 = ((CompositeView)this).getView(var4);
  361.          var5.setSize((float)this.xSpans[var4], (float)this.ySpans[var4]);
  362.       }
  363.  
  364.    }
  365.  
  366.    void checkRequests() {
  367.       if (this.axis == 0) {
  368.          if (!this.xValid) {
  369.             this.calculateTiledSizeRequirements(0);
  370.          }
  371.  
  372.          if (!this.yValid) {
  373.             this.calculateAlignedSizeRequirements(1);
  374.          }
  375.       } else {
  376.          if (!this.xValid) {
  377.             this.calculateAlignedSizeRequirements(0);
  378.          }
  379.  
  380.          if (!this.yValid) {
  381.             this.calculateTiledSizeRequirements(1);
  382.          }
  383.       }
  384.  
  385.       this.yValid = true;
  386.       this.xValid = true;
  387.    }
  388.  
  389.    void calculateTiledSizeRequirements(int var1) {
  390.       this.alignment[var1] = 0.5F;
  391.       this.preferredSpan[var1] = 0;
  392.       this.resizeWeight[var1] = 0;
  393.       int var2 = ((CompositeView)this).getViewCount();
  394.  
  395.       for(int var3 = 0; var3 < var2; ++var3) {
  396.          View var4 = ((CompositeView)this).getView(var3);
  397.          int[] var10000 = this.preferredSpan;
  398.          var10000[var1] = (int)((float)var10000[var1] + var4.getPreferredSpan(var1));
  399.          var10000 = this.resizeWeight;
  400.          var10000[var1] += var4.getResizeWeight(var1);
  401.       }
  402.  
  403.    }
  404.  
  405.    void calculateAlignedSizeRequirements(int var1) {
  406.       int var2 = 0;
  407.       int var3 = 0;
  408.       int var4 = ((CompositeView)this).getViewCount();
  409.  
  410.       for(int var5 = 0; var5 < var4; ++var5) {
  411.          View var6 = ((CompositeView)this).getView(var5);
  412.          int var7 = (int)var6.getPreferredSpan(var1);
  413.          int var8 = (int)(var6.getAlignment(var1) * (float)var7);
  414.          int var9 = var7 - var8;
  415.          var2 = Math.max(var9, var2);
  416.          var3 = Math.max(var8, var3);
  417.          int[] var10000 = this.resizeWeight;
  418.          var10000[var1] += var6.getResizeWeight(var1);
  419.       }
  420.  
  421.       this.preferredSpan[var1] = var2 + var3;
  422.       this.alignment[var1] = 0.5F;
  423.       if (this.preferredSpan[var1] > 0) {
  424.          this.alignment[var1] = (float)var3 / (float)this.preferredSpan[var1];
  425.       }
  426.  
  427.    }
  428.  
  429.    void calculateAlignedPositions(int var1, int var2) {
  430.       int[] var3 = var2 == 0 ? this.xOffsets : this.yOffsets;
  431.       int[] var4 = var2 == 0 ? this.xSpans : this.ySpans;
  432.       int var5 = (int)((float)var1 * this.alignment[var2]);
  433.       int var6 = var1 - var5;
  434.       int var7 = ((CompositeView)this).getViewCount();
  435.  
  436.       for(int var8 = 0; var8 < var7; ++var8) {
  437.          View var9 = ((CompositeView)this).getView(var8);
  438.          float var10 = var9.getAlignment(var2);
  439.          int var11 = (int)var9.getPreferredSpan(var2);
  440.          int var12 = (int)((float)var11 * var10);
  441.          int var13 = var11 - var12;
  442.          if (var9.getResizeWeight(var2) > 0) {
  443.             var12 = var5;
  444.             var13 = var6;
  445.          }
  446.  
  447.          var3[var8] = var5 - var12;
  448.          var4[var8] = var12 + var13;
  449.       }
  450.  
  451.    }
  452.  
  453.    void calculateTiledPositions(int var1, int var2) {
  454.       int[] var3 = var2 == 0 ? this.xOffsets : this.yOffsets;
  455.       int[] var4 = var2 == 0 ? this.xSpans : this.ySpans;
  456.       int var5 = var1 - this.preferredSpan[var2];
  457.       int var6 = this.resizeWeight[var2];
  458.       int var7 = 0;
  459.       int var8 = ((CompositeView)this).getViewCount();
  460.  
  461.       for(int var9 = 0; var9 < var8; ++var9) {
  462.          View var10 = ((CompositeView)this).getView(var9);
  463.          var3[var9] = var7;
  464.          int var11 = (int)var10.getPreferredSpan(var2);
  465.          int var12 = var10.getResizeWeight(var2);
  466.          if (var12 != 0 && var6 != 0) {
  467.             float var13 = (float)(var12 / var6);
  468.             var11 = (int)((float)var11 + (float)var5 * var13);
  469.          }
  470.  
  471.          var4[var9] = var11;
  472.          var7 += var11;
  473.       }
  474.  
  475.    }
  476. }
  477.