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 278 279 280 281 282 283 public boolean throwExceptionIfDocumentHasError() { 284 return false; 285 } 286 public boolean checkEndTag() { 287 return false; 288 } 289 public ParserPolicy getInnerPolicy(Element element) { 290 291 return this; 292 } 293 public String selectEncoding(String last_tag_key) { 294 return "shift-jis";//"utf-8"; 295 } 296 public boolean forceEmptyTag(String key) { 297 return false; 298 } 299 public Element startElement(Element element) { 300 return element; 301 } 302 @Override public boolean finished() { 303 return false; 304 } 305 public Element allowElement(Element element) { 306 307 if(element.isTagElement()) { 308 TagElement tag = (TagElement)element; 309 if(tag.getKey().equals("img")) { 310 HTMLImage hi = new HTMLImage(tag); 311 write(hi); 312 // alert("image"); 313 } else if(tag.getKey().equals("script")) { 314 // alert(tag.getValue()); 315 return null; 316 } else if(tag.getKey().equals("link")) { 317 // alert(tag.getValue()); 318 return null; 319 } else { 320 System.out.println("skip tag["+tag.getKey()+"]"); 321 } 322 } else { 323 TextElement text_element = (TextElement)element; 324 // System.out.println("text["+element+"]"); 325 HTMLText ht = new HTMLText(text_element.getValue()); 326 ht.addChangeListener(new ChangeListener(){ 327 public void stateChanged(ChangeEvent e){ 328 fireChanged(); 329 } 330 }); 331 write(ht); 332 return null; 333 } 334 return element; 335 } 336 }