home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / javax / swing / text / html / ImageView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  11.5 KB  |  593 lines

  1. package javax.swing.text.html;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.Graphics;
  8. import java.awt.Image;
  9. import java.awt.Point;
  10. import java.awt.Rectangle;
  11. import java.awt.Shape;
  12. import java.awt.Toolkit;
  13. import java.awt.event.InputEvent;
  14. import java.awt.event.MouseEvent;
  15. import java.awt.event.MouseListener;
  16. import java.awt.event.MouseMotionListener;
  17. import java.awt.image.ImageObserver;
  18. import java.io.BufferedInputStream;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.FilterInputStream;
  21. import java.io.IOException;
  22. import java.io.InputStream;
  23. import java.io.OutputStream;
  24. import java.net.MalformedURLException;
  25. import java.net.URL;
  26. import java.util.Dictionary;
  27. import javax.swing.Icon;
  28. import javax.swing.ImageIcon;
  29. import javax.swing.JEditorPane;
  30. import javax.swing.event.DocumentEvent;
  31. import javax.swing.text.AbstractDocument;
  32. import javax.swing.text.AttributeSet;
  33. import javax.swing.text.BadLocationException;
  34. import javax.swing.text.Document;
  35. import javax.swing.text.Element;
  36. import javax.swing.text.JTextComponent;
  37. import javax.swing.text.Position;
  38. import javax.swing.text.SimpleAttributeSet;
  39. import javax.swing.text.StyledDocument;
  40. import javax.swing.text.View;
  41. import javax.swing.text.ViewFactory;
  42. import javax.swing.text.Position.Bias;
  43. import javax.swing.text.html.HTML.Attribute;
  44. import javax.swing.text.html.HTML.Tag;
  45.  
  46. class ImageView extends View implements ImageObserver, MouseListener, MouseMotionListener {
  47.    public static final String TOP = "top";
  48.    public static final String TEXTTOP = "texttop";
  49.    public static final String MIDDLE = "middle";
  50.    public static final String ABSMIDDLE = "absmiddle";
  51.    public static final String CENTER = "center";
  52.    public static final String BOTTOM = "bottom";
  53.    private static boolean sIsInc = true;
  54.    private static int sIncRate = 100;
  55.    private AttributeSet attr;
  56.    private Element fElement;
  57.    private Image fImage;
  58.    private int fHeight;
  59.    private int fWidth;
  60.    private Container fContainer;
  61.    private Rectangle fBounds = new Rectangle();
  62.    private Component fComponent;
  63.    private Point fGrowBase;
  64.    private boolean fGrowProportionally;
  65.    private boolean loading;
  66.    private boolean isLink;
  67.    private int border;
  68.    private int xSpace;
  69.    private int ySpace;
  70.    private static Icon sPendingImageIcon;
  71.    private static Icon sMissingImageIcon;
  72.    private static final String PENDING_IMAGE_SRC = "icons/image-delayed.gif";
  73.    private static final String MISSING_IMAGE_SRC = "icons/image-failed.gif";
  74.    private static final boolean DEBUG = false;
  75.    static final String IMAGE_CACHE_PROPERTY = "imageCache";
  76.    private static final int DEFAULT_WIDTH = 32;
  77.    private static final int DEFAULT_HEIGHT = 32;
  78.    private static final int DEFAULT_BORDER = 2;
  79.    // $FF: synthetic field
  80.    static Class class$javax$swing$text$html$ImageView;
  81.  
  82.    public ImageView(Element var1) {
  83.       super(var1);
  84.       this.initialize(var1);
  85.       StyleSheet var2 = this.getStyleSheet();
  86.       this.attr = var2.getViewAttributes(this);
  87.    }
  88.  
  89.    private void initialize(Element var1) {
  90.       synchronized(this) {
  91.          this.loading = true;
  92.          this.fWidth = this.fHeight = 0;
  93.       }
  94.  
  95.       int var3 = 0;
  96.       int var4 = 0;
  97.       boolean var5 = false;
  98.       boolean var6 = false;
  99.  
  100.       try {
  101.          this.fElement = var1;
  102.          AttributeSet var7 = var1.getAttributes();
  103.          AttributeSet var8 = (AttributeSet)var7.getAttribute(Tag.A);
  104.          this.isLink = var8 != null && var8.isDefined(Attribute.HREF);
  105.          this.border = this.getIntAttr(Attribute.BORDER, this.isLink() ? 2 : 0);
  106.          this.xSpace = this.getIntAttr(Attribute.HSPACE, 0);
  107.          this.ySpace = this.getIntAttr(Attribute.VSPACE, 0);
  108.          URL var9 = this.getSourceURL();
  109.          if (var9 != null) {
  110.             Dictionary var10 = (Dictionary)((View)this).getDocument().getProperty("imageCache");
  111.             if (var10 != null) {
  112.                this.fImage = (Image)var10.get(var9);
  113.             } else {
  114.                this.fImage = Toolkit.getDefaultToolkit().getImage(var9);
  115.             }
  116.          }
  117.  
  118.          var4 = this.getIntAttr(Attribute.HEIGHT, -1);
  119.          var6 = var4 > 0;
  120.          if (!var6 && this.fImage != null) {
  121.             var4 = this.fImage.getHeight(this);
  122.          }
  123.  
  124.          if (var4 <= 0) {
  125.             var4 = 32;
  126.          }
  127.  
  128.          var3 = this.getIntAttr(Attribute.WIDTH, -1);
  129.          var5 = var3 > 0;
  130.          if (!var5 && this.fImage != null) {
  131.             var3 = this.fImage.getWidth(this);
  132.          }
  133.  
  134.          if (var3 <= 0) {
  135.             var3 = 32;
  136.          }
  137.  
  138.          if (this.fImage != null) {
  139.             if (var5 && var6) {
  140.                Toolkit.getDefaultToolkit().prepareImage(this.fImage, var4, var3, this);
  141.             } else {
  142.                Toolkit.getDefaultToolkit().prepareImage(this.fImage, -1, -1, this);
  143.             }
  144.          }
  145.       } finally {
  146.          synchronized(this) {
  147.             this.loading = false;
  148.             if (var5 || this.fWidth == 0) {
  149.                this.fWidth = var3;
  150.             }
  151.  
  152.             if (var6 || this.fHeight == 0) {
  153.                this.fHeight = var4;
  154.             }
  155.  
  156.          }
  157.       }
  158.  
  159.    }
  160.  
  161.    public AttributeSet getAttributes() {
  162.       return this.attr;
  163.    }
  164.  
  165.    boolean isLink() {
  166.       return this.isLink;
  167.    }
  168.  
  169.    int getBorder() {
  170.       return this.border;
  171.    }
  172.  
  173.    int getSpace(int var1) {
  174.       return var1 == 0 ? this.xSpace : this.ySpace;
  175.    }
  176.  
  177.    Color getBorderColor() {
  178.       StyledDocument var1 = (StyledDocument)((View)this).getDocument();
  179.       return var1.getForeground(this.getAttributes());
  180.    }
  181.  
  182.    boolean hasPixels(ImageObserver var1) {
  183.       return this.fImage != null && this.fImage.getHeight(var1) > 0 && this.fImage.getWidth(var1) > 0;
  184.    }
  185.  
  186.    private URL getSourceURL() {
  187.       String var1 = (String)this.fElement.getAttributes().getAttribute(Attribute.SRC);
  188.       if (var1 == null) {
  189.          return null;
  190.       } else {
  191.          URL var2 = ((HTMLDocument)((View)this).getDocument()).getBase();
  192.  
  193.          try {
  194.             URL var3 = new URL(var2, var1);
  195.             return var3;
  196.          } catch (MalformedURLException var4) {
  197.             return null;
  198.          }
  199.       }
  200.    }
  201.  
  202.    private int getIntAttr(HTML.Attribute var1, int var2) {
  203.       AttributeSet var3 = this.fElement.getAttributes();
  204.       if (var3.isDefined(var1)) {
  205.          String var5 = (String)var3.getAttribute(var1);
  206.          int var4;
  207.          if (var5 == null) {
  208.             var4 = var2;
  209.          } else {
  210.             try {
  211.                var4 = Math.max(0, Integer.parseInt(var5));
  212.             } catch (NumberFormatException var7) {
  213.                var4 = var2;
  214.             }
  215.          }
  216.  
  217.          return var4;
  218.       } else {
  219.          return var2;
  220.       }
  221.    }
  222.  
  223.    public void setParent(View var1) {
  224.       super.setParent(var1);
  225.       this.fContainer = var1 != null ? ((View)this).getContainer() : null;
  226.       if (var1 == null && this.fComponent != null) {
  227.          this.fComponent.getParent().remove(this.fComponent);
  228.          this.fComponent = null;
  229.       }
  230.  
  231.    }
  232.  
  233.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  234.       super.changedUpdate(var1, var2, var3);
  235.       int var4 = this.fHeight;
  236.       int var5 = this.fWidth;
  237.       this.initialize(((View)this).getElement());
  238.       boolean var6 = this.fHeight != var4;
  239.       boolean var7 = this.fWidth != var5;
  240.       if (var6 || var7) {
  241.          ((View)this).preferenceChanged((View)null, var6, var7);
  242.       }
  243.  
  244.    }
  245.  
  246.    public void paint(Graphics var1, Shape var2) {
  247.       Color var3 = var1.getColor();
  248.       Rectangle var4 = var2 instanceof Rectangle ? (Rectangle)var2 : var2.getBounds();
  249.       this.fBounds.setBounds(var4);
  250.       int var5 = this.getBorder();
  251.       int var6 = this.fBounds.x + var5 + this.getSpace(0);
  252.       int var7 = this.fBounds.y + var5 + this.getSpace(1);
  253.       int var8 = this.fWidth;
  254.       int var9 = this.fHeight;
  255.       int var10 = this.getSelectionState();
  256.       if (!this.hasPixels(this)) {
  257.          var1.setColor(Color.lightGray);
  258.          var1.drawRect(var6, var7, var8 - 1, var9 - 1);
  259.          var1.setColor(var3);
  260.          this.loadIcons();
  261.          Icon var11 = this.fImage == null ? sMissingImageIcon : sPendingImageIcon;
  262.          if (var11 != null) {
  263.             var11.paintIcon(((View)this).getContainer(), var1, var6, var7);
  264.          }
  265.       }
  266.  
  267.       if (this.fImage != null) {
  268.          var1.drawImage(this.fImage, var6, var7, var8, var9, this);
  269.       }
  270.  
  271.       Color var13 = this.getBorderColor();
  272.       if (var10 == 2) {
  273.          int var12 = 2 - var5;
  274.          if (var12 > 0) {
  275.             var6 += var12;
  276.             var7 += var12;
  277.             var8 -= var12 << 1;
  278.             var9 -= var12 << 1;
  279.             var5 = 2;
  280.          }
  281.  
  282.          var13 = null;
  283.          var1.setColor(Color.black);
  284.          var1.fillRect(var6 + var8 - 5, var7 + var9 - 5, 5, 5);
  285.       }
  286.  
  287.       if (var5 > 0) {
  288.          if (var13 != null) {
  289.             var1.setColor(var13);
  290.          }
  291.  
  292.          for(int var14 = 1; var14 <= var5; ++var14) {
  293.             var1.drawRect(var6 - var14, var7 - var14, var8 - 1 + var14 + var14, var9 - 1 + var14 + var14);
  294.          }
  295.  
  296.          var1.setColor(var3);
  297.       }
  298.  
  299.    }
  300.  
  301.    protected void repaint(long var1) {
  302.       if (this.fContainer != null && this.fBounds != null) {
  303.          this.fContainer.repaint(var1, this.fBounds.x, this.fBounds.y, this.fBounds.width, this.fBounds.height);
  304.       }
  305.  
  306.    }
  307.  
  308.    protected int getSelectionState() {
  309.       int var1 = this.fElement.getStartOffset();
  310.       int var2 = this.fElement.getEndOffset();
  311.       if (this.fContainer instanceof JTextComponent) {
  312.          JTextComponent var3 = (JTextComponent)this.fContainer;
  313.          int var4 = var3.getSelectionStart();
  314.          int var5 = var3.getSelectionEnd();
  315.          if (var4 <= var1 && var5 >= var2) {
  316.             if (var4 == var1 && var5 == var2 && this.isEditable()) {
  317.                return 2;
  318.             }
  319.  
  320.             return 1;
  321.          }
  322.       }
  323.  
  324.       return 0;
  325.    }
  326.  
  327.    protected boolean isEditable() {
  328.       return this.fContainer instanceof JEditorPane && ((JEditorPane)this.fContainer).isEditable();
  329.    }
  330.  
  331.    protected Color getHighlightColor() {
  332.       JTextComponent var1 = (JTextComponent)this.fContainer;
  333.       return var1.getSelectionColor();
  334.    }
  335.  
  336.    public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) {
  337.       if (this.fImage != null && this.fImage == var1) {
  338.          if ((var2 & 192) != 0) {
  339.             this.fImage = null;
  340.             this.repaint(0L);
  341.             return false;
  342.          } else {
  343.             short var7 = 0;
  344.             if ((var2 & 2) != 0 && !((View)this).getElement().getAttributes().isDefined(Attribute.HEIGHT)) {
  345.                var7 = (short)(var7 | 1);
  346.             }
  347.  
  348.             if ((var2 & 1) != 0 && !((View)this).getElement().getAttributes().isDefined(Attribute.WIDTH)) {
  349.                var7 = (short)(var7 | 2);
  350.             }
  351.  
  352.             synchronized(this) {
  353.                if ((var7 & 1) == 1) {
  354.                   this.fWidth = var5;
  355.                }
  356.  
  357.                if ((var7 & 2) == 2) {
  358.                   this.fHeight = var6;
  359.                }
  360.  
  361.                if (this.loading) {
  362.                   boolean var17 = true;
  363.                   return var17;
  364.                }
  365.             }
  366.  
  367.             if (var7 != 0) {
  368.                Document var9 = ((View)this).getDocument();
  369.  
  370.                try {
  371.                   if (var9 instanceof AbstractDocument) {
  372.                      ((AbstractDocument)var9).readLock();
  373.                   }
  374.  
  375.                   ((View)this).preferenceChanged((View)null, true, true);
  376.                } finally {
  377.                   if (var9 instanceof AbstractDocument) {
  378.                      ((AbstractDocument)var9).readUnlock();
  379.                   }
  380.  
  381.                }
  382.  
  383.                return true;
  384.             } else {
  385.                if ((var2 & 48) != 0) {
  386.                   this.repaint(0L);
  387.                } else if ((var2 & 8) != 0 && sIsInc) {
  388.                   this.repaint((long)sIncRate);
  389.                }
  390.  
  391.                return (var2 & 32) == 0;
  392.             }
  393.          }
  394.       } else {
  395.          return false;
  396.       }
  397.    }
  398.  
  399.    public float getPreferredSpan(int var1) {
  400.       int var2 = 2 * (this.getBorder() + this.getSpace(var1));
  401.       switch (var1) {
  402.          case 0:
  403.             return (float)(this.fWidth + var2);
  404.          case 1:
  405.             return (float)(this.fHeight + var2);
  406.          default:
  407.             throw new IllegalArgumentException("Invalid axis: " + var1);
  408.       }
  409.    }
  410.  
  411.    public float getAlignment(int var1) {
  412.       switch (var1) {
  413.          case 1:
  414.             return 1.0F;
  415.          default:
  416.             return super.getAlignment(var1);
  417.       }
  418.    }
  419.  
  420.    public Shape modelToView(int var1, Shape var2, Position.Bias var3) throws BadLocationException {
  421.       int var4 = ((View)this).getStartOffset();
  422.       int var5 = ((View)this).getEndOffset();
  423.       if (var1 >= var4 && var1 <= var5) {
  424.          Rectangle var6 = var2.getBounds();
  425.          if (var1 == var5) {
  426.             var6.x += var6.width;
  427.          }
  428.  
  429.          var6.width = 0;
  430.          return var6;
  431.       } else {
  432.          return null;
  433.       }
  434.    }
  435.  
  436.    public int viewToModel(float var1, float var2, Shape var3, Position.Bias[] var4) {
  437.       Rectangle var5 = (Rectangle)var3;
  438.       if (var1 < (float)(var5.x + var5.width)) {
  439.          var4[0] = Bias.Forward;
  440.          return ((View)this).getStartOffset();
  441.       } else {
  442.          var4[0] = Bias.Backward;
  443.          return ((View)this).getEndOffset();
  444.       }
  445.    }
  446.  
  447.    public void setSize(float var1, float var2) {
  448.    }
  449.  
  450.    protected void resize(int var1, int var2) {
  451.       if (var1 != this.fWidth || var2 != this.fHeight) {
  452.          this.fWidth = var1;
  453.          this.fHeight = var2;
  454.          SimpleAttributeSet var3 = new SimpleAttributeSet();
  455.          var3.addAttribute(Attribute.WIDTH, Integer.toString(var1));
  456.          var3.addAttribute(Attribute.HEIGHT, Integer.toString(var2));
  457.          ((StyledDocument)((View)this).getDocument()).setCharacterAttributes(this.fElement.getStartOffset(), this.fElement.getEndOffset(), var3, false);
  458.       }
  459.    }
  460.  
  461.    public void mousePressed(MouseEvent var1) {
  462.       Dimension var2 = this.fComponent.getSize();
  463.       if (var1.getX() >= var2.width - 7 && var1.getY() >= var2.height - 7 && this.getSelectionState() == 2) {
  464.          Point var8 = this.fComponent.getLocationOnScreen();
  465.          this.fGrowBase = new Point(var8.x + var1.getX() - this.fWidth, var8.y + var1.getY() - this.fHeight);
  466.          this.fGrowProportionally = ((InputEvent)var1).isShiftDown();
  467.       } else {
  468.          this.fGrowBase = null;
  469.          JTextComponent var3 = (JTextComponent)this.fContainer;
  470.          int var4 = this.fElement.getStartOffset();
  471.          int var5 = this.fElement.getEndOffset();
  472.          int var6 = var3.getCaret().getMark();
  473.          int var7 = var3.getCaret().getDot();
  474.          if (((InputEvent)var1).isShiftDown()) {
  475.             if (var6 <= var4) {
  476.                var3.moveCaretPosition(var5);
  477.             } else {
  478.                var3.moveCaretPosition(var4);
  479.             }
  480.          } else {
  481.             if (var6 != var4) {
  482.                var3.setCaretPosition(var4);
  483.             }
  484.  
  485.             if (var7 != var5) {
  486.                var3.moveCaretPosition(var5);
  487.             }
  488.          }
  489.       }
  490.  
  491.    }
  492.  
  493.    public void mouseDragged(MouseEvent var1) {
  494.       if (this.fGrowBase != null) {
  495.          Point var2 = this.fComponent.getLocationOnScreen();
  496.          int var3 = Math.max(2, var2.x + var1.getX() - this.fGrowBase.x);
  497.          int var4 = Math.max(2, var2.y + var1.getY() - this.fGrowBase.y);
  498.          if (((InputEvent)var1).isShiftDown() && this.fImage != null) {
  499.             float var5 = (float)this.fImage.getWidth(this);
  500.             float var6 = (float)this.fImage.getHeight(this);
  501.             if (var5 > 0.0F && var6 > 0.0F) {
  502.                float var7 = var6 / var5;
  503.                float var8 = (float)var4 / var7;
  504.                float var9 = (float)var3 * var7;
  505.                if (var8 > (float)var3) {
  506.                   var3 = (int)var8;
  507.                } else {
  508.                   var4 = (int)var9;
  509.                }
  510.             }
  511.          }
  512.  
  513.          this.resize(var3, var4);
  514.       }
  515.  
  516.    }
  517.  
  518.    public void mouseReleased(MouseEvent var1) {
  519.       this.fGrowBase = null;
  520.    }
  521.  
  522.    public void mouseClicked(MouseEvent var1) {
  523.       if (var1.getClickCount() == 2) {
  524.       }
  525.  
  526.    }
  527.  
  528.    public void mouseEntered(MouseEvent var1) {
  529.    }
  530.  
  531.    public void mouseMoved(MouseEvent var1) {
  532.    }
  533.  
  534.    public void mouseExited(MouseEvent var1) {
  535.    }
  536.  
  537.    private Icon makeIcon(String var1) throws IOException {
  538.       InputStream var2 = HTMLEditorKit.getResourceAsStream(var1);
  539.       if (var2 == null) {
  540.          System.err.println((class$javax$swing$text$html$ImageView == null ? (class$javax$swing$text$html$ImageView = class$("javax.swing.text.html.ImageView")) : class$javax$swing$text$html$ImageView).getName() + "/" + var1 + " not found.");
  541.          return null;
  542.       } else {
  543.          BufferedInputStream var3 = new BufferedInputStream(var2);
  544.          ByteArrayOutputStream var4 = new ByteArrayOutputStream(1024);
  545.          byte[] var5 = new byte[1024];
  546.  
  547.          int var6;
  548.          while((var6 = ((FilterInputStream)var3).read(var5)) > 0) {
  549.             var4.write(var5, 0, var6);
  550.          }
  551.  
  552.          var3.close();
  553.          ((OutputStream)var4).flush();
  554.          var5 = var4.toByteArray();
  555.          if (var5.length == 0) {
  556.             System.err.println("warning: " + var1 + " is zero-length");
  557.             return null;
  558.          } else {
  559.             return new ImageIcon(var5);
  560.          }
  561.       }
  562.    }
  563.  
  564.    private void loadIcons() {
  565.       try {
  566.          if (sPendingImageIcon == null) {
  567.             sPendingImageIcon = this.makeIcon("icons/image-delayed.gif");
  568.          }
  569.  
  570.          if (sMissingImageIcon == null) {
  571.             sMissingImageIcon = this.makeIcon("icons/image-failed.gif");
  572.          }
  573.       } catch (Exception var2) {
  574.          System.err.println("ImageView: Couldn't load image icons");
  575.       }
  576.  
  577.    }
  578.  
  579.    protected StyleSheet getStyleSheet() {
  580.       HTMLDocument var1 = (HTMLDocument)((View)this).getDocument();
  581.       return var1.getStyleSheet();
  582.    }
  583.  
  584.    // $FF: synthetic method
  585.    static Class class$(String var0) {
  586.       try {
  587.          return Class.forName(var0);
  588.       } catch (ClassNotFoundException var2) {
  589.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  590.       }
  591.    }
  592. }
  593.