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