001    package org.util.xml.renderer.html;
002    
003    import org.util.xml.parse.policy.*;
004    import org.util.xml.parse.*;
005    import org.util.xml.element.*;
006    import java.awt.*;
007    import java.awt.event.*;
008    import java.awt.geom.*;
009    import javax.swing.*;
010    import javax.swing.event.*;
011    import java.util.*;
012    import java.awt.font.*;
013    import java.awt.image.*;
014    
015    public class HTMLObject implements ParserPolicy {
016    
017            protected boolean init_ = false;
018            private boolean changed_view_ = true;
019            private boolean changed_layout_ = true;
020            protected double preferred_width_ = 100;
021            protected double preferred_height_ = 100;
022            protected double preferred_x_ = 100;
023            protected double preferred_y_ = 100;
024            protected double offset_x_ = 0;
025            protected double offset_y_ = 0;
026            protected boolean preferred_location_ = false;
027            protected double width_ = 100;
028            protected double height_ = 100;
029            protected double x_ = 100;
030            protected double y_ = 100;
031            protected Color background_ = Color.white;
032            protected Color foreground_ = Color.black;
033            public boolean is_mouse_over_;
034            private ArrayList<ChangeListener> listener_list_ = new ArrayList<ChangeListener>();
035            private ArrayList<HTMLObject> html_object_list_ = new ArrayList<HTMLObject>();
036            protected double write_point_x_ = 0;
037            protected double write_point_y_ = 0;
038            protected double margin_up_ = 1;
039            protected double margin_bottom_ = 1;
040            protected double margin_right_ = 5;
041            protected double margin_left_ = 5;
042    //      private ArrayList<HTMLObject> children_ = new ArrayList<HTMLObject>();
043            private BufferedImage buf_;
044            protected String html_text = "";
045            protected double now_y_ = 0;
046    
047            public Rectangle2D rect_;
048            
049            public HTMLObject() {
050            }
051            public static void alert(Object message) {
052                    alert(null, message);
053            }
054            public static void alert(JComponent parent, Object message) {
055                    JOptionPane.showMessageDialog(parent, message);
056            }
057            public boolean hit(double x, double y) {
058    /*
059    System.out.println(x_+","+y_+","+width_+","+height_);
060    System.out.println(x+"x"+y);
061                    if(x-x_<0 || x-x_>width_) return false;
062                    if(y-y_<0 || y-y_>height_) return false;
063    */
064                    return true;
065            }
066    
067            public void addChangeListener(ChangeListener listener) {
068                    listener_list_.add(listener);
069            }
070            public void fireChanged() {
071                    ChangeEvent event = new ChangeEvent(this);
072                    for(int i=0;i<listener_list_.size();i++)
073                            listener_list_.get(i).stateChanged(event);
074            }
075    
076            private Thread test_thread = null;
077            public void mousePressed(MouseEvent e) {
078    /*              
079                    if(false)
080                    if(test_thread == null) {
081                            final double[] c = new double[1];
082                            test_thread = new Thread(new Runnable(){
083                                    public void run() {
084                                            while(true) {
085                                                    try{Thread.sleep(10);}catch(Exception e){}
086                                                    long time = System.currentTimeMillis();
087                                                    c[0] = (double)time/1000;
088                                                    setPreferredLocation(100+50*Math.cos(c[0]), 100+50*Math.sin(c[0]));
089                                            }
090                                    }
091                            });
092                            test_thread.start();
093                    }
094    */
095                    int x = e.getX();
096                    int y = e.getY();
097                    for(int i=0;i<html_object_list_.size();i++) {
098                            HTMLObject htmlo = html_object_list_.get(i);
099                            if(htmlo.hit(x, y))
100                                    htmlo.mousePressed(e);
101                    }
102                    setBackground(Color.blue);
103            }
104    
105            public void mouseReleased(MouseEvent e) {
106                    int x = e.getX();
107                    int y = e.getY();
108                    for(int i=0;i<html_object_list_.size();i++) {
109                            HTMLObject htmlo = html_object_list_.get(i);
110                            if(htmlo.hit(x, y))
111                                    htmlo.mouseReleased(e);
112                    }
113                    setBackground(Color.red);
114            }
115            public void mouseClicked(MouseEvent e) {
116            }
117            public void mouseEntered(MouseEvent e) {
118                    setBackground(Color.red);
119            }
120            public void mouseExited(MouseEvent e) {
121                    setBackground(Color.white);
122            }
123            int count = 0;
124            public void mouseMoved(MouseEvent e) {
125                    for(int i=0;i<html_object_list_.size();i++) {
126                            HTMLObject htmlo = html_object_list_.get(i);
127                            if(htmlo.hit(e.getX(), e.getY())) {
128                                    htmlo.mouseMoved(e);
129                                    if(!htmlo.is_mouse_over_) {
130                                            htmlo.is_mouse_over_ = true;
131                                            htmlo.mouseEntered(e);
132                                    }
133                            } else {
134                                    if(htmlo.is_mouse_over_) {
135                                            htmlo.is_mouse_over_ = false;
136                                            htmlo.mouseExited(e);
137                                    }
138                            }
139                    }
140            }
141            public void mouseWheelMoved(MouseWheelEvent e) {
142                    offset_y_ -= 30*e.getWheelRotation();
143                    fireChanged();
144            }
145            public void mouseDragged(MouseEvent e) {}
146    
147            public void setBackground(Color background) {
148                    background_ = background;
149                    changed_view_ = true;
150                    fireChanged();
151            }
152            public void setForeground(Color foreground) {
153                    foreground_ = foreground;
154            }
155            public void setPreferredSize(double width, double height) {
156                    preferred_width_ = width;
157                    preferred_height_ = height;
158                    fireChanged();
159            }
160            public void setPreferredLocation(double x, double y) {
161                    preferred_x_ = x;
162                    preferred_y_ = y;
163                    fireChanged();
164            }
165            public double getPreferredWidth() {
166                    return preferred_width_;
167            }
168            public double getPreferredHeight() {
169                    return preferred_height_;
170            }
171            public double getPreferredX() {
172                    return preferred_x_;
173            }
174            public double getPreferredY() {
175                    return preferred_y_;
176            }
177            public double getX() {
178                    return x_;
179            }
180            public double getY() {
181                    return y_;
182            }
183            public double getWidth() {
184                    return width_;
185            }
186            public double getHeight() {
187                    return height_;
188            }
189            public void setLocation(double x, double y) {
190                    x_ = x;
191                    y_ = y;
192            }
193            public void setSize(double width, double height) {
194                    width_ = width;
195                    height_ = height;
196            }
197            
198            private int paint_count_ = 0;
199            public void paint(final Graphics g) {
200                    debug("paint method start"+(paint_count_++));
201                    if(buf_ == null) {
202                            g.drawString("now rendering...", 10, 15);
203                    }
204                    if(changed_view_ || changed_layout_) {
205    //                      new Thread(new Runnable(){public void run(){
206                                    debug("thread start");
207                                    doLayout();
208                                    doRenderer();
209    for(int i=0;i<html_object_list_.size();i++) {
210            HTMLObject htmlo = html_object_list_.get(i);
211            htmlo.paint(g);
212    }
213    //                              g.drawImage(buf_, (int)x_, (int)y_, null);
214                                    debug("thread end");
215    //                      }}).start();
216                    } else {
217                            debug("copy start");
218                            g.drawImage(buf_, (int)x_, (int)y_, null);
219                            debug("copy end");
220                    }
221                    debug("paint method end");
222            }
223            public void doLayout() {
224                    now_y_ = offset_y_;
225                    for(int i=0;i<html_object_list_.size();i++) {
226                            HTMLObject htmlo = html_object_list_.get(i);
227                            double x = htmlo.getPreferredX();
228                            double y = htmlo.getPreferredY();
229                            double w = htmlo.getPreferredWidth();
230                            double h = htmlo.getPreferredHeight();
231                            htmlo.setSize(w, h);
232                            if(htmlo.preferred_location_) {
233                                    htmlo.setLocation(x, y);
234                            } else {
235    //                      System.out.println("tset");
236                                    htmlo.setLocation(0, now_y_);
237                                    now_y_ += htmlo.getHeight();
238                            }
239                    }
240    //              changed_layout_ = false;
241            }
242            public void doRenderer() {
243                    if(changed_view_) {
244                            debug("rendering start");
245                            clearTmpImage();
246                            Graphics g = tmp_image_.getGraphics();
247                            draw(g);
248                            buf_ = tmp_image_.getSubimage((int)x_, (int)y_, (int)preferred_width_, (int)preferred_height_);
249                            debug("rendering end");
250                    }
251                    changed_view_ = false;
252            }
253            public void write(HTMLObject html_object) {
254                    html_object_list_.add(html_object);
255            }
256            private static void clearTmpImage() {
257                    for(int i=0;i<tmp_image_.getHeight();i++)
258                            for(int j=0;j<tmp_image_.getWidth();j++)
259                                    tmp_image_.setRGB(i, j, 0x00000000);
260            }
261            private static BufferedImage tmp_image_ = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
262            public void draw(Graphics g) {
263                    debug("draw start");
264                    for(int i=0;i<html_object_list_.size();i++) {
265                            HTMLObject htmlo = html_object_list_.get(i);
266                            htmlo.paint(g);
267                    }
268                    
269                    //g.drawRect((int)(rect.getX()+x_),(int)(rect.getY()+y_+d),(int)rect.getWidth(),(int)rect.getHeight());
270                    g.drawRect((int)x_,(int)(y_),(int)(width_-1),(int)(height_-1));
271                    debug("draw end");
272            }
273            
274            public void debug(String message) {
275                    //System.out.println(message);
276            }
277            public boolean throwExceptionIfDocumentHasError() {
278                    return false;
279            }
280            public boolean checkEndTag() {
281                    return false;
282            }
283            public ParserPolicy getInnerPolicy(Element element) {
284                    return this;
285            }
286            public String selectEncoding(String last_tag_key) {
287                    return "shift-jis";//"utf-8";
288            }
289            public boolean forceEmptyTag(String key) {
290                    return false;
291            }
292            public Element startElement(Element element) {
293                    return element;
294            }
295            public Element allowElement(Element element) {
296                    
297                    if(element.isTagElement()) {
298                            TagElement tag = (TagElement)element;
299                            if(tag.getKey().equals("img")) {
300                                    HTMLImage hi = new HTMLImage(tag);
301                                    write(hi);
302    //                              alert("image");
303                            } else if(tag.getKey().equals("script")) {
304    //                              alert(tag.getValue());
305                                    return null;
306                            } else if(tag.getKey().equals("link")) {
307    //                              alert(tag.getValue());
308                                    return null;
309                            } else {
310                                    System.out.println("skip tag["+tag.getKey()+"]");
311                            }
312                    } else {
313                            TextElement text_element = (TextElement)element;
314    //                      System.out.println("text["+element+"]");
315                            HTMLText ht = new HTMLText(text_element.getValue());
316                            ht.addChangeListener(new ChangeListener(){
317                                    public void stateChanged(ChangeEvent e){
318                                            fireChanged();
319                                    }
320                            });
321                            write(ht);
322                            return null;
323                    }
324                    return element;
325            }
326    }