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

  1. package com.sun.java.swing.text;
  2.  
  3. import com.sun.java.swing.event.DocumentEvent;
  4. import java.awt.Color;
  5. import java.awt.Component;
  6. import java.awt.Container;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.Graphics;
  10. import java.awt.Rectangle;
  11. import java.awt.Shape;
  12.  
  13. public class PlainView extends View implements TabExpander {
  14.    protected FontMetrics metrics;
  15.    Segment lineBuffer = new Segment();
  16.    int width;
  17.    int tabSize;
  18.    int tabBase;
  19.    JTextComponent host;
  20.    int sel0;
  21.    int sel1;
  22.    Color unselected;
  23.    Color selected;
  24.  
  25.    public PlainView(Element var1) {
  26.       super(var1);
  27.    }
  28.  
  29.    protected int getTabSize() {
  30.       Integer var1 = (Integer)((View)this).getDocument().getProperty("tabSize");
  31.       int var2 = var1 != null ? var1 : 8;
  32.       return var2;
  33.    }
  34.  
  35.    protected int getLineLimit() {
  36.       Integer var1 = (Integer)((View)this).getDocument().getProperty("lineLimit");
  37.       if (var1 == null) {
  38.          int var2 = 0;
  39.          int var3 = ((View)this).getElement().getElementCount();
  40.  
  41.          for(int var4 = 0; var4 < var3; ++var4) {
  42.             Element var5 = ((View)this).getElement().getElement(var4);
  43.             int var6 = var5.getStartOffset();
  44.             int var7 = var5.getEndOffset();
  45.             if (var7 - var6 > var2) {
  46.                var2 = var7 - var6;
  47.             }
  48.          }
  49.  
  50.          var1 = new Integer(var2);
  51.          ((View)this).getDocument().putProperty("lineLimit", var1);
  52.       }
  53.  
  54.       return var1;
  55.    }
  56.  
  57.    protected void drawLine(int var1, Graphics var2, int var3, int var4) {
  58.       try {
  59.          Element var5 = ((View)this).getElement().getElement(var1);
  60.          int var6 = var5.getStartOffset();
  61.          int var7 = var5.getEndOffset();
  62.          var7 = Math.min(((View)this).getDocument().getLength(), var7);
  63.          if (this.sel0 == this.sel1) {
  64.             this.drawUnselectedText(var2, var3, var4, var6, var7);
  65.          } else if (var6 >= this.sel0 && var6 <= this.sel1 && var7 >= this.sel0 && var7 <= this.sel1) {
  66.             this.drawSelectedText(var2, var3, var4, var6, var7);
  67.          } else if (this.sel0 >= var6 && this.sel0 <= var7) {
  68.             if (this.sel1 >= var6 && this.sel1 <= var7) {
  69.                var3 = this.drawUnselectedText(var2, var3, var4, var6, this.sel0);
  70.                var3 = this.drawSelectedText(var2, var3, var4, this.sel0, this.sel1);
  71.                this.drawUnselectedText(var2, var3, var4, this.sel1, var7);
  72.             } else {
  73.                var3 = this.drawUnselectedText(var2, var3, var4, var6, this.sel0);
  74.                this.drawSelectedText(var2, var3, var4, this.sel0, var7);
  75.             }
  76.          } else if (this.sel1 >= var6 && this.sel1 <= var7) {
  77.             var3 = this.drawSelectedText(var2, var3, var4, var6, this.sel1);
  78.             this.drawUnselectedText(var2, var3, var4, this.sel1, var7);
  79.          } else {
  80.             this.drawUnselectedText(var2, var3, var4, var6, var7);
  81.          }
  82.       } catch (BadLocationException var8) {
  83.          throw new StateInvariantError("Can't render line: " + var1);
  84.       }
  85.    }
  86.  
  87.    protected int drawUnselectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  88.       var1.setColor(this.unselected);
  89.       Document var6 = ((View)this).getDocument();
  90.       var6.getText(var4, var5 - var4, this.lineBuffer);
  91.       return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
  92.    }
  93.  
  94.    protected int drawSelectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  95.       var1.setColor(this.selected);
  96.       Document var6 = ((View)this).getDocument();
  97.       var6.getText(var4, var5 - var4, this.lineBuffer);
  98.       return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
  99.    }
  100.  
  101.    protected final Segment getLineBuffer() {
  102.       return this.lineBuffer;
  103.    }
  104.  
  105.    final void updateMetrics() {
  106.       Container var1 = ((View)this).getContainer();
  107.       Font var2 = ((Component)var1).getFont();
  108.       this.metrics = ((Component)var1).getFontMetrics(var2);
  109.       int var3 = this.metrics.charWidth('m');
  110.       this.width = this.getLineLimit() * var3;
  111.       this.tabSize = this.getTabSize() * var3;
  112.    }
  113.  
  114.    public void setParent(View var1) {
  115.       super.setParent(var1);
  116.       this.host = (JTextComponent)((View)this).getContainer();
  117.    }
  118.  
  119.    public float getPreferredSpan(int var1) {
  120.       this.updateMetrics();
  121.       switch (var1) {
  122.          case 0:
  123.             return (float)this.width;
  124.          case 1:
  125.             return (float)(((View)this).getElement().getElementCount() * this.metrics.getHeight());
  126.          default:
  127.             throw new IllegalArgumentException("Invalid axis: " + var1);
  128.       }
  129.    }
  130.  
  131.    public void paint(Graphics var1, Shape var2) {
  132.       Rectangle var3 = var2.getBounds();
  133.       this.tabBase = var3.x;
  134.       var1.setFont(this.host.getFont());
  135.       this.sel0 = this.host.getSelectionStart();
  136.       this.sel1 = this.host.getSelectionEnd();
  137.       this.unselected = this.host.isEnabled() ? this.host.getForeground() : this.host.getDisabledTextColor();
  138.       Caret var4 = this.host.getCaret();
  139.       this.selected = var4.isSelectionVisible() ? this.host.getSelectedTextColor() : this.unselected;
  140.       this.updateMetrics();
  141.       Rectangle var5 = var1.getClipBounds();
  142.       int var6 = this.metrics.getHeight();
  143.       int var7 = var3.y + var3.height - (var5.y + var5.height);
  144.       int var8 = Math.max(0, var7 / var6);
  145.       int var9 = var5.y - var3.y;
  146.       int var10 = Math.max(0, var9 / var6);
  147.       int var11 = var3.height / var6;
  148.       Rectangle var12 = this.lineToRect(var2, var10);
  149.       int var13 = var12.y + this.metrics.getAscent();
  150.       int var14 = var12.x;
  151.       Element var15 = ((View)this).getElement();
  152.       int var16 = Math.min(var15.getElementCount(), var11 - var8);
  153.  
  154.       for(int var17 = var10; var17 < var16; ++var17) {
  155.          this.drawLine(var17, var1, var14, var13);
  156.          var13 += var6;
  157.       }
  158.  
  159.    }
  160.  
  161.    public void preferenceChanged(View var1, boolean var2, boolean var3) {
  162.       ((View)this).getDocument().putProperty("lineLimit", (Object)null);
  163.       super.preferenceChanged(var1, var2, var3);
  164.    }
  165.  
  166.    public Shape modelToView(int var1, Shape var2) throws BadLocationException {
  167.       Document var3 = ((View)this).getDocument();
  168.       Element var4 = ((View)this).getElement();
  169.       int var5 = var4.getElementIndex(var1);
  170.       Rectangle var6 = this.lineToRect(var2, var5);
  171.       this.tabBase = var6.x;
  172.       this.tabBase = var6.x;
  173.       Element var7 = var4.getElement(var5);
  174.       int var8 = var7.getStartOffset();
  175.       var3.getText(var8, var1 - var8, this.lineBuffer);
  176.       int var9 = Utilities.getTabbedTextWidth(this.lineBuffer, this.metrics, 0, this, var8);
  177.       var6.x += var9;
  178.       var6.width = 1;
  179.       var6.height = this.metrics.getHeight();
  180.       return var6;
  181.    }
  182.  
  183.    public int viewToModel(float var1, float var2, Shape var3) {
  184.       Rectangle var4 = var3.getBounds();
  185.       Document var5 = ((View)this).getDocument();
  186.       int var6 = (int)var1;
  187.       int var7 = (int)var2;
  188.       if (var7 < var4.y) {
  189.          return ((View)this).getStartOffset();
  190.       } else if (var7 > var4.y + var4.height) {
  191.          return ((View)this).getEndOffset() - 1;
  192.       } else {
  193.          Element var8 = var5.getDefaultRootElement();
  194.          int var9 = Math.abs((var7 - var4.y) / this.metrics.getHeight());
  195.          if (var9 >= var8.getElementCount()) {
  196.             return ((View)this).getEndOffset() - 1;
  197.          } else {
  198.             Element var10 = var8.getElement(var9);
  199.             if (var6 < var4.x) {
  200.                return var10.getStartOffset();
  201.             } else if (var6 > var4.x + var4.width) {
  202.                return var10.getEndOffset() - 1;
  203.             } else {
  204.                try {
  205.                   int var11 = var10.getStartOffset();
  206.                   int var12 = var10.getEndOffset() - 1;
  207.                   var5.getText(var11, var12 - var11, this.lineBuffer);
  208.                   this.tabBase = var4.x;
  209.                   int var13 = var11 + Utilities.getTabbedTextOffset(this.lineBuffer, this.metrics, this.tabBase, var6, this, var11);
  210.                   return var13;
  211.                } catch (BadLocationException var14) {
  212.                   return -1;
  213.                }
  214.             }
  215.          }
  216.       }
  217.    }
  218.  
  219.    public void insertUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  220.       this.updateDamage(var1, var2, var3);
  221.    }
  222.  
  223.    public void removeUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  224.       this.updateDamage(var1, var2, var3);
  225.    }
  226.  
  227.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  228.       this.updateDamage(var1, var2, var3);
  229.    }
  230.  
  231.    public float nextTabStop(float var1, int var2) {
  232.       int var3 = ((int)var1 - this.tabBase) / this.tabSize;
  233.       return (float)((var3 + 1) * this.tabSize);
  234.    }
  235.  
  236.    void updateDamage(DocumentEvent var1, Shape var2, ViewFactory var3) {
  237.       if (this.host.isShowing()) {
  238.          this.updateMetrics();
  239.          Element var4 = ((View)this).getElement();
  240.          DocumentEvent.ElementChange var5 = var1.getChange(var4);
  241.          Element[] var6 = var5 != null ? var5.getChildrenAdded() : null;
  242.          Element[] var7 = var5 != null ? var5.getChildrenRemoved() : null;
  243.          if (var6 != null && var6.length > 0 || var7 != null && var7.length > 0) {
  244.             this.preferenceChanged((View)null, true, true);
  245.             this.host.repaint();
  246.             return;
  247.          }
  248.  
  249.          this.preferenceChanged((View)null, true, false);
  250.          Element var8 = ((View)this).getElement();
  251.          int var9 = var8.getElementIndex(var1.getOffset());
  252.          this.damageLineRange(var9, var9, var2, this.host);
  253.       }
  254.  
  255.    }
  256.  
  257.    private void damageLineRange(int var1, int var2, Shape var3, Component var4) {
  258.       if (var3 != null) {
  259.          Rectangle var5 = this.lineToRect(var3, var1);
  260.          Rectangle var6 = this.lineToRect(var3, var2);
  261.          if (var5 != null && var6 != null) {
  262.             Rectangle var7 = var5.union(var6);
  263.             var4.repaint(var7.x, var7.y, var7.width, var7.height);
  264.             return;
  265.          }
  266.  
  267.          var4.repaint();
  268.       }
  269.  
  270.    }
  271.  
  272.    private Rectangle lineToRect(Shape var1, int var2) {
  273.       Rectangle var3 = null;
  274.       if (this.metrics != null) {
  275.          Rectangle var4 = var1.getBounds();
  276.          var3 = new Rectangle(var4.x, var4.y + var2 * this.metrics.getHeight(), var4.width, this.metrics.getHeight());
  277.       }
  278.  
  279.       return var3;
  280.    }
  281. }
  282.