001    package org.util.html.objects;
002    
003    import java.util.*;
004    import java.io.*;
005    import java.net.*;
006    import java.awt.*;
007    import java.awt.image.*;
008    import java.awt.event.*;
009    import javax.swing.*;
010    import javax.swing.event.*;
011    
012    public class HTMLImg extends HTMLObject {
013    
014        private HTMLImg this_ = this;
015        private JComponent component_;
016        private URL url_;
017        private BufferedImage image_;
018        private Dimension preferred_size_;
019    
020        public HTMLImg(HTMLDocument root) {
021            super(root);
022            try{
023            SwingUtilities.invokeAndWait(new Runnable(){public void run(){
024            component_ = new JComponent() {
025                    public void paint(Graphics g) {
026                        int w = getWidth();
027                        int h = getHeight();
028                        if(image_ == null) {
029                            g.setColor(Color.black);
030                            g.setFont(new Font("monospace", Font.PLAIN, 8));
031                            URL url = getURL();
032                            if(url!=null) {
033                                String url_text = url.toString();
034                                int d = 15;
035                                for(int i=0; i<url_text.length()/d; i++)
036                                    g.drawString(url_text.substring(i*d, Math.min((i+1)*d, url_text.length())), 3 ,8*i+10);
037                            }
038                            g.setColor(Color.red);
039                            g.drawRect(0,0,w-1,h-1);
040                        } else {
041                            g.drawImage(image_, 0, 0, w, h, component_);
042                        }
043                    }
044                };
045            component_.setPreferredSize(new Dimension(100, 100));
046            }});
047            }catch(Exception exc){}
048        }
049        public void setURL(URL url) {
050            url_ = url;
051            new Thread(new Runnable(){
052                    public void run(){
053                        try{
054                            image_ = javax.imageio.ImageIO.read(url_);
055                            if(preferred_size_ != null) {
056                                int hint = Image.SCALE_FAST;
057                                image_ = (BufferedImage)image_.getScaledInstance((int)preferred_size_.getWidth(), (int)preferred_size_.getHeight(), hint);
058                            }
059                            component_.setPreferredSize(new Dimension(image_.getWidth(), image_.getHeight()));
060                            component_.revalidate();
061                            getRoot().changed(this_);
062                        }catch(Exception exc){
063                            exc.printStackTrace();
064                        }
065                        
066                    }
067                }).start();
068        }
069    
070        public void setPreferredSize(Dimension size) {
071            preferred_size_ = size;
072        }
073        public URL getURL() {
074            return url_;
075        }
076        public JComponent getPanel() {
077            return component_;
078        }
079    }