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

  1. package com.sun.java.swing.text.html;
  2.  
  3. import com.sun.java.swing.Icon;
  4. import com.sun.java.swing.ImageIcon;
  5. import com.sun.java.swing.SwingUtilities;
  6. import com.sun.java.swing.event.DocumentEvent;
  7. import com.sun.java.swing.text.BadLocationException;
  8. import com.sun.java.swing.text.Element;
  9. import com.sun.java.swing.text.Highlighter;
  10. import com.sun.java.swing.text.JTextComponent;
  11. import com.sun.java.swing.text.MutableAttributeSet;
  12. import com.sun.java.swing.text.SimpleAttributeSet;
  13. import com.sun.java.swing.text.StyledDocument;
  14. import com.sun.java.swing.text.View;
  15. import com.sun.java.swing.text.ViewFactory;
  16. import java.awt.Color;
  17. import java.awt.Component;
  18. import java.awt.Container;
  19. import java.awt.Cursor;
  20. import java.awt.Dimension;
  21. import java.awt.Graphics;
  22. import java.awt.Image;
  23. import java.awt.Point;
  24. import java.awt.Rectangle;
  25. import java.awt.Shape;
  26. import java.awt.event.InputEvent;
  27. import java.awt.event.MouseEvent;
  28. import java.awt.event.MouseListener;
  29. import java.awt.event.MouseMotionListener;
  30. import java.awt.image.ImageObserver;
  31. import java.io.BufferedInputStream;
  32. import java.io.ByteArrayOutputStream;
  33. import java.io.FilterInputStream;
  34. import java.io.IOException;
  35. import java.io.InputStream;
  36. import java.io.OutputStream;
  37.  
  38. class ImageView extends View implements ImageObserver, MouseListener, MouseMotionListener, Runnable, HTMLDefs {
  39.    public static final String TOP = "top";
  40.    public static final String TEXTTOP = "texttop";
  41.    public static final String MIDDLE = "middle";
  42.    public static final String ABSMIDDLE = "absmiddle";
  43.    public static final String CENTER = "center";
  44.    public static final String BOTTOM = "bottom";
  45.    private static boolean sIsInc;
  46.    private static int sIncRate;
  47.    private ImageInfo fIMG;
  48.    private int fHeight;
  49.    private int fWidth;
  50.    private Container fContainer;
  51.    private Rectangle fBounds;
  52.    private Component fComponent;
  53.    private Point fGrowBase;
  54.    private boolean fGrowProportionally;
  55.    private static Icon sPendingImageIcon;
  56.    private static Icon sMissingImageIcon;
  57.    private static final String PENDING_IMAGE_SRC = "icons/image-delayed.gif";
  58.    private static final String MISSING_IMAGE_SRC = "icons/image-failed.gif";
  59.    private static final boolean DEBUG = false;
  60.    // $FF: synthetic field
  61.    static Class class$com$sun$java$swing$text$html$ImageView;
  62.  
  63.    static void addImageDataAttribute(MutableAttributeSet var0) {
  64.       ImageInfo var1 = new ImageInfo();
  65.       var0.addAttribute("$IMGObject", var1);
  66.    }
  67.  
  68.    public ImageView(Element var1) {
  69.       super(var1);
  70.       this.fIMG = (ImageInfo)var1.getAttributes().getAttribute("$IMGObject");
  71.       this.fIMG.initialize(this, var1);
  72.       this.fHeight = this.fIMG.fHeight;
  73.       this.fWidth = this.fIMG.fWidth;
  74.    }
  75.  
  76.    public void setParent(View var1) {
  77.       super.setParent(var1);
  78.       this.fContainer = var1 != null ? ((View)this).getContainer() : null;
  79.       if (var1 == null && this.fComponent != null) {
  80.          this.fComponent.getParent().remove(this.fComponent);
  81.          this.fComponent = null;
  82.       }
  83.  
  84.    }
  85.  
  86.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  87.       super.changedUpdate(var1, var2, var3);
  88.       float var4 = this.fIMG.getVerticalAlignment();
  89.       this.fIMG.changedUpdate(this, ((View)this).getElement());
  90.       boolean var5 = false;
  91.       boolean var6 = false;
  92.       if (this.fHeight != this.fIMG.fHeight) {
  93.          this.fHeight = this.fIMG.fHeight;
  94.          var5 = true;
  95.       }
  96.  
  97.       if (this.fWidth != this.fIMG.fWidth) {
  98.          this.fWidth = this.fIMG.fWidth;
  99.          var6 = true;
  100.       }
  101.  
  102.       if (var5 || var6 || this.fIMG.getVerticalAlignment() != var4) {
  103.          ((View)this).getParent().preferenceChanged(this, var5, var6);
  104.       }
  105.  
  106.    }
  107.  
  108.    public void paint(Graphics var1, Shape var2) {
  109.       Color var3 = var1.getColor();
  110.       this.fBounds = var2.getBounds();
  111.       int var4 = this.fIMG.getBorder();
  112.       int var5 = this.fBounds.x + var4 + this.fIMG.getSpace(0);
  113.       int var6 = this.fBounds.y + var4 + this.fIMG.getSpace(1);
  114.       int var7 = this.fIMG.fWidth;
  115.       int var8 = this.fIMG.fHeight;
  116.       int var9 = this.getSelectionState();
  117.       if (this.fComponent == null) {
  118.          this.fComponent = new 1();
  119.          this.fComponent.addMouseListener(this);
  120.          this.fComponent.addMouseMotionListener(this);
  121.          this.fComponent.setCursor(Cursor.getDefaultCursor());
  122.          this.fContainer.add(this.fComponent);
  123.       }
  124.  
  125.       this.fComponent.setBounds(var5, var6, var7, var8);
  126.       if (!this.fIMG.hasPixels(this)) {
  127.          var1.setColor(Color.lightGray);
  128.          var1.drawRect(var5, var6, var7 - 1, var8 - 1);
  129.          var1.setColor(var3);
  130.          this.loadIcons();
  131.          Icon var10 = this.fIMG.fImage == null ? sMissingImageIcon : sPendingImageIcon;
  132.          if (var10 != null) {
  133.             var10.paintIcon(((View)this).getContainer(), var1, var5, var6);
  134.          }
  135.       }
  136.  
  137.       if (this.fIMG.fImage != null) {
  138.          if (var9 > 0) {
  139.             var1.setXORMode(Color.white);
  140.          }
  141.  
  142.          var1.drawImage(this.fIMG.fImage, var5, var6, var7, var8, this);
  143.          if (var9 > 0) {
  144.             var1.setPaintMode();
  145.          }
  146.       }
  147.  
  148.       Color var12 = this.fIMG.getBorderColor();
  149.       if (var9 == 2) {
  150.          int var11 = 2 - var4;
  151.          if (var11 > 0) {
  152.             var5 += var11;
  153.             var6 += var11;
  154.             var7 -= var11 << 1;
  155.             var8 -= var11 << 1;
  156.             var4 = 2;
  157.          }
  158.  
  159.          var12 = null;
  160.          var1.setColor(Color.black);
  161.          var1.fillRect(var5 + var7 - 5, var6 + var8 - 5, 5, 5);
  162.       }
  163.  
  164.       if (var4 > 0) {
  165.          if (var12 != null) {
  166.             var1.setColor(var12);
  167.          }
  168.  
  169.          for(int var13 = 1; var13 <= var4; ++var13) {
  170.             var1.drawRect(var5 - var13, var6 - var13, var7 - 1 + var13 + var13, var8 - 1 + var13 + var13);
  171.          }
  172.  
  173.          var1.setColor(var3);
  174.       }
  175.  
  176.    }
  177.  
  178.    protected void repaint(long var1) {
  179.       if (this.fContainer != null && this.fBounds != null) {
  180.          this.fContainer.repaint(var1, this.fBounds.x, this.fBounds.y, this.fBounds.width, this.fBounds.height);
  181.       }
  182.  
  183.    }
  184.  
  185.    protected int getSelectionState() {
  186.       int var1 = this.fIMG.fElement.getStartOffset();
  187.       int var2 = this.fIMG.fElement.getEndOffset();
  188.       JTextComponent var3 = (JTextComponent)this.fContainer;
  189.       Highlighter var4 = var3.getHighlighter();
  190.       Highlighter.Highlight[] var5 = var4.getHighlights();
  191.  
  192.       for(int var6 = var5.length - 1; var6 >= 0; --var6) {
  193.          Highlighter.Highlight var7 = var5[var6];
  194.          int var8 = var7.getStartOffset();
  195.          int var9 = var7.getEndOffset();
  196.          if (var8 <= var1 && var9 >= var2) {
  197.             if (var8 == var1 && var9 == var2) {
  198.                return 2;
  199.             }
  200.  
  201.             return 1;
  202.          }
  203.       }
  204.  
  205.       return 0;
  206.    }
  207.  
  208.    protected Color getHighlightColor() {
  209.       JTextComponent var1 = (JTextComponent)this.fContainer;
  210.       return var1.getSelectionColor();
  211.    }
  212.  
  213.    public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) {
  214.       if (this.fIMG.fImage == null) {
  215.          return false;
  216.       } else if ((var2 & 192) != 0) {
  217.          this.fIMG.fImage = null;
  218.          this.repaint(0L);
  219.          return false;
  220.       } else {
  221.          if ((var2 & 2) != 0 && !((View)this).getElement().getAttributes().isDefined("height")) {
  222.             this.fIMG.fHeight = var6;
  223.          }
  224.  
  225.          if ((var2 & 1) != 0 && !((View)this).getElement().getAttributes().isDefined("width")) {
  226.             this.fIMG.fWidth = var5;
  227.          }
  228.  
  229.          if (this.fHeight == this.fIMG.fHeight && this.fWidth == this.fIMG.fWidth) {
  230.             if ((var2 & 48) != 0) {
  231.                this.repaint(0L);
  232.             } else if ((var2 & 8) != 0 && sIsInc) {
  233.                this.repaint((long)sIncRate);
  234.             }
  235.  
  236.             return true;
  237.          } else {
  238.             this.fHeight = this.fIMG.fHeight;
  239.             this.fWidth = this.fIMG.fWidth;
  240.             SwingUtilities.invokeLater(this);
  241.             return true;
  242.          }
  243.       }
  244.    }
  245.  
  246.    public void run() {
  247.       ((View)this).preferenceChanged(this, true, true);
  248.    }
  249.  
  250.    public float getPreferredSpan(int var1) {
  251.       int var2 = 2 * (this.fIMG.getBorder() + this.fIMG.getSpace(var1));
  252.       switch (var1) {
  253.          case 0:
  254.             return (float)(this.fIMG.fWidth + var2);
  255.          case 1:
  256.             return (float)(this.fIMG.fHeight + var2);
  257.          default:
  258.             throw new IllegalArgumentException("Invalid axis: " + var1);
  259.       }
  260.    }
  261.  
  262.    public float getAlignment(int var1) {
  263.       switch (var1) {
  264.          case 1:
  265.             return this.fIMG.getVerticalAlignment();
  266.          default:
  267.             return super.getAlignment(var1);
  268.       }
  269.    }
  270.  
  271.    public Shape modelToView(int var1, Shape var2) throws BadLocationException {
  272.       int var3 = ((View)this).getStartOffset();
  273.       int var4 = ((View)this).getEndOffset();
  274.       if (var1 >= var3 && var1 < var4) {
  275.          Rectangle var5 = new Rectangle(var2.getBounds());
  276.          var5.width = 0;
  277.          return var5;
  278.       } else {
  279.          return null;
  280.       }
  281.    }
  282.  
  283.    public int viewToModel(float var1, float var2, Shape var3) {
  284.       return ((View)this).getStartOffset();
  285.    }
  286.  
  287.    public void setSize(float var1, float var2) {
  288.    }
  289.  
  290.    protected void resize(int var1, int var2) {
  291.       if (var1 != this.fIMG.fWidth || var2 != this.fIMG.fHeight) {
  292.          this.fWidth = this.fIMG.fWidth = var1;
  293.          this.fHeight = this.fIMG.fHeight = var2;
  294.          SimpleAttributeSet var3 = new SimpleAttributeSet();
  295.          var3.addAttribute("width", Integer.toString(var1));
  296.          var3.addAttribute("height", Integer.toString(var2));
  297.          ((StyledDocument)((View)this).getDocument()).setCharacterAttributes(this.fIMG.fElement.getStartOffset(), this.fIMG.fElement.getEndOffset(), var3, false);
  298.       }
  299.    }
  300.  
  301.    public void mousePressed(MouseEvent var1) {
  302.       Dimension var2 = this.fComponent.getSize();
  303.       if (var1.getX() >= var2.width - 7 && var1.getY() >= var2.height - 7 && this.getSelectionState() == 2) {
  304.          Point var8 = this.fComponent.getLocationOnScreen();
  305.          this.fGrowBase = new Point(var8.x + var1.getX() - this.fWidth, var8.y + var1.getY() - this.fHeight);
  306.          this.fGrowProportionally = ((InputEvent)var1).isShiftDown();
  307.       } else {
  308.          this.fGrowBase = null;
  309.          JTextComponent var3 = (JTextComponent)this.fContainer;
  310.          int var4 = this.fIMG.fElement.getStartOffset();
  311.          int var5 = this.fIMG.fElement.getEndOffset();
  312.          int var6 = var3.getCaret().getMark();
  313.          int var7 = var3.getCaret().getDot();
  314.          if (((InputEvent)var1).isShiftDown()) {
  315.             if (var6 <= var4) {
  316.                var3.moveCaretPosition(var5);
  317.             } else {
  318.                var3.moveCaretPosition(var4);
  319.             }
  320.          } else {
  321.             if (var6 != var4) {
  322.                var3.setCaretPosition(var4);
  323.             }
  324.  
  325.             if (var7 != var5) {
  326.                var3.moveCaretPosition(var5);
  327.             }
  328.  
  329.          }
  330.       }
  331.    }
  332.  
  333.    public void mouseDragged(MouseEvent var1) {
  334.       if (this.fGrowBase != null) {
  335.          Point var2 = this.fComponent.getLocationOnScreen();
  336.          int var3 = Math.max(2, var2.x + var1.getX() - this.fGrowBase.x);
  337.          int var4 = Math.max(2, var2.y + var1.getY() - this.fGrowBase.y);
  338.          if (((InputEvent)var1).isShiftDown() && this.fIMG.fImage != null) {
  339.             int var5 = this.fIMG.fImage.getWidth(this);
  340.             int var6 = this.fIMG.fImage.getHeight(this);
  341.             if (var5 > 0 && var6 > 0) {
  342.                float var7 = (float)var6 / (float)var5;
  343.                float var8 = (float)var4 / var7;
  344.                float var9 = (float)var3 * var7;
  345.                if (var8 > (float)var3) {
  346.                   var3 = (int)var8;
  347.                } else {
  348.                   var4 = (int)var9;
  349.                }
  350.             }
  351.          }
  352.  
  353.          this.resize(var3, var4);
  354.       }
  355.  
  356.    }
  357.  
  358.    public void mouseReleased(MouseEvent var1) {
  359.       this.fGrowBase = null;
  360.    }
  361.  
  362.    public void mouseClicked(MouseEvent var1) {
  363.       if (var1.getClickCount() == 2) {
  364.          System.out.println("ImageView: Double-click!");
  365.       }
  366.  
  367.    }
  368.  
  369.    public void mouseEntered(MouseEvent var1) {
  370.    }
  371.  
  372.    public void mouseMoved(MouseEvent var1) {
  373.    }
  374.  
  375.    public void mouseExited(MouseEvent var1) {
  376.    }
  377.  
  378.    private Icon makeIcon(String var1) throws IOException {
  379.       InputStream var2 = (class$com$sun$java$swing$text$html$ImageView != null ? class$com$sun$java$swing$text$html$ImageView : (class$com$sun$java$swing$text$html$ImageView = class$("com.sun.java.swing.text.html.ImageView"))).getResourceAsStream(var1);
  380.       if (var2 == null) {
  381.          System.err.println((class$com$sun$java$swing$text$html$ImageView != null ? class$com$sun$java$swing$text$html$ImageView : (class$com$sun$java$swing$text$html$ImageView = class$("com.sun.java.swing.text.html.ImageView"))).getName() + "/" + var1 + " not found.");
  382.          return null;
  383.       } else {
  384.          BufferedInputStream var3 = new BufferedInputStream(var2);
  385.          ByteArrayOutputStream var4 = new ByteArrayOutputStream(1024);
  386.          byte[] var5 = new byte[1024];
  387.  
  388.          int var6;
  389.          while((var6 = ((FilterInputStream)var3).read(var5)) > 0) {
  390.             var4.write(var5, 0, var6);
  391.          }
  392.  
  393.          ((FilterInputStream)var3).close();
  394.          ((OutputStream)var4).flush();
  395.          var5 = var4.toByteArray();
  396.          if (var5.length == 0) {
  397.             System.err.println("warning: " + var1 + " is zero-length");
  398.             return null;
  399.          } else {
  400.             return new ImageIcon(var5);
  401.          }
  402.       }
  403.    }
  404.  
  405.    private void loadIcons() {
  406.       try {
  407.          if (sPendingImageIcon == null) {
  408.             sPendingImageIcon = this.makeIcon("icons/image-delayed.gif");
  409.          }
  410.  
  411.          if (sMissingImageIcon == null) {
  412.             sMissingImageIcon = this.makeIcon("icons/image-failed.gif");
  413.             return;
  414.          }
  415.       } catch (Exception var1) {
  416.          System.err.println("ImageView: Couldn't load image icons");
  417.       }
  418.  
  419.    }
  420.  
  421.    // $FF: synthetic method
  422.    static Class class$(String var0) {
  423.       try {
  424.          return Class.forName(var0);
  425.       } catch (ClassNotFoundException var2) {
  426.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  427.       }
  428.    }
  429.  
  430.    // $FF: synthetic method
  431.    static boolean access$0() {
  432.       return false;
  433.    }
  434.  
  435.    static {
  436.       String var0 = System.getProperty("awt.image.incrementaldraw");
  437.       sIsInc = var0 == null || var0.equals("true");
  438.       var0 = System.getProperty("awt.image.redrawrate");
  439.       sIncRate = var0 != null ? Integer.parseInt(var0) : 100;
  440.    }
  441. }
  442.