1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.user.client.DOM; 19 import com.google.gwt.user.client.DeferredCommand; 20 import com.google.gwt.user.client.Command; 21 import com.google.gwt.user.client.Element; 22 import com.google.gwt.user.client.Event; 23 import com.google.gwt.user.client.ui.impl.ClippedImageImpl; 24 import com.google.gwt.core.client.GWT; 25 26 import java.util.HashMap ; 27 28 64 public class Image extends Widget implements SourcesClickEvents, 65 SourcesLoadEvents, SourcesMouseEvents, SourcesMouseWheelEvents { 66 67 71 private abstract static class State { 72 73 public abstract int getHeight(Image image); 74 75 public abstract int getOriginLeft(); 76 77 public abstract int getOriginTop(); 78 79 public abstract String getUrl(Image image); 80 81 public abstract int getWidth(Image image); 82 83 public abstract void setUrl(Image image, String url); 84 85 public abstract void setUrlAndVisibleRect(Image image, String url, 86 int left, int top, int width, int height); 87 88 public abstract void setVisibleRect(Image image, int left, int top, 89 int width, int height); 90 91 protected abstract String getStateName(); 93 } 94 95 99 private static class UnclippedState extends State { 100 101 UnclippedState(Image image) { 102 image.setElement(DOM.createImg()); 103 image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONLOAD 104 | Event.ONERROR | Event.ONMOUSEWHEEL); 105 } 106 107 UnclippedState(Image image, String url) { 108 this(image); 109 setUrl(image, url); 110 } 111 112 public int getHeight(Image image) { 113 return DOM.getElementPropertyInt(image.getElement(), "height"); 114 } 115 116 public int getOriginLeft() { 117 return 0; 118 } 119 120 public int getOriginTop() { 121 return 0; 122 } 123 124 public String getUrl(Image image) { 125 return DOM.getImgSrc(image.getElement()); 126 } 127 128 public int getWidth(Image image) { 129 return DOM.getElementPropertyInt(image.getElement(), "width"); 130 } 131 132 public void setUrl(Image image, String url) { 133 DOM.setImgSrc(image.getElement(), url); 134 } 135 136 public void setUrlAndVisibleRect(Image image, String url, int left, 137 int top, int width, int height) { 138 image.changeState(new ClippedState(image, url, left, top, width, height)); 139 } 140 141 public void setVisibleRect(Image image, int left, int top, int width, 142 int height) { 143 image.changeState(new ClippedState(image, getUrl(image), left, top, 144 width, height)); 145 } 146 147 protected String getStateName() { 149 return "unclipped"; 150 } 151 } 152 153 156 private static class ClippedState extends State { 157 158 private static final ClippedImageImpl impl = (ClippedImageImpl) GWT.create(ClippedImageImpl.class); 159 160 private int left = 0; 161 private int top = 0; 162 private int width = 0; 163 private int height = 0; 164 private String url = null; 165 166 ClippedState(Image image, String url, int left, int top, int width, 167 int height) { 168 this.left = left; 169 this.top = top; 170 this.width = width; 171 this.height = height; 172 this.url = url; 173 image.setElement(impl.createStructure(url, left, top, width, height)); 174 image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONMOUSEWHEEL); 175 fireSyntheticLoadEvent(image); 176 } 177 178 private void fireSyntheticLoadEvent(final Image image) { 179 192 DeferredCommand.addCommand(new Command() { 193 public void execute() { 194 if (image.loadListeners != null) { 195 image.loadListeners.fireLoad(image); 196 } 197 } 198 }); 199 } 200 201 public int getHeight(Image image) { 202 return height; 203 } 204 205 public int getOriginLeft() { 206 return left; 207 } 208 209 public int getOriginTop() { 210 return top; 211 } 212 213 public String getUrl(Image image) { 214 return url; 215 } 216 217 public int getWidth(Image image) { 218 return width; 219 } 220 221 public void setUrl(Image image, String url) { 222 image.changeState(new UnclippedState(image, url)); 223 } 224 225 public void setUrlAndVisibleRect(Image image, String url, int left, 226 int top, int width, int height) { 227 if (!url.equals(url) || this.left != left || this.top != top 228 || this.width != width || this.height != height) { 229 230 this.url = url; 231 this.left = left; 232 this.top = top; 233 this.width = width; 234 this.height = height; 235 236 impl.adjust(image.getElement(), url, left, top, width, height); 237 fireSyntheticLoadEvent(image); 238 } 239 } 240 241 public void setVisibleRect(Image image, int left, int top, int width, 242 int height) { 243 248 if (this.left != left || this.top != top || this.width != width 249 || this.height != height) { 250 251 this.left = left; 252 this.top = top; 253 this.width = width; 254 this.height = height; 255 256 impl.adjust(image.getElement(), url, left, top, width, height); 257 fireSyntheticLoadEvent(image); 258 } 259 } 260 261 262 protected String getStateName() { 263 return "clipped"; 264 } 265 } 266 267 272 private static HashMap prefetchImages = new HashMap (); 273 274 279 public static void prefetch(String url) { 280 Element img = DOM.createImg(); 281 DOM.setImgSrc(img, url); 282 prefetchImages.put(url, img); 283 } 284 285 private ClickListenerCollection clickListeners; 286 private LoadListenerCollection loadListeners; 287 private MouseListenerCollection mouseListeners; 288 private MouseWheelListenerCollection mouseWheelListeners; 289 290 private State state; 291 292 295 public Image() { 296 changeState(new UnclippedState(this)); 297 setStyleName("gwt-Image"); 298 } 299 300 306 public Image(String url) { 307 changeState(new UnclippedState(this, url)); 308 setStyleName("gwt-Image"); 309 } 310 311 329 public Image(String url, int left, int top, int width, int height) { 330 changeState(new ClippedState(this, url, left, top, width, height)); 331 setStyleName("gwt-Image"); 332 } 333 334 public void addClickListener(ClickListener listener) { 335 if (clickListeners == null) { 336 clickListeners = new ClickListenerCollection(); 337 } 338 clickListeners.add(listener); 339 } 340 341 public void addLoadListener(LoadListener listener) { 342 if (loadListeners == null) { 343 loadListeners = new LoadListenerCollection(); 344 } 345 loadListeners.add(listener); 346 } 347 348 public void addMouseListener(MouseListener listener) { 349 if (mouseListeners == null) { 350 mouseListeners = new MouseListenerCollection(); 351 } 352 mouseListeners.add(listener); 353 } 354 355 public void addMouseWheelListener(MouseWheelListener listener) { 356 if (mouseWheelListeners == null) { 357 mouseWheelListeners = new MouseWheelListenerCollection(); 358 } 359 mouseWheelListeners.add(listener); 360 } 361 362 369 public int getHeight() { 370 return state.getHeight(this); 371 } 372 373 382 public int getOriginLeft() { 383 return state.getOriginLeft(); 384 } 385 386 395 public int getOriginTop() { 396 return state.getOriginTop(); 397 } 398 399 406 public String getUrl() { 407 return state.getUrl(this); 408 } 409 410 417 public int getWidth() { 418 return state.getWidth(this); 419 } 420 421 public void onBrowserEvent(Event event) { 422 switch (DOM.eventGetType(event)) { 423 case Event.ONCLICK: { 424 if (clickListeners != null) { 425 clickListeners.fireClick(this); 426 } 427 break; 428 } 429 case Event.ONMOUSEDOWN: 430 case Event.ONMOUSEUP: 431 case Event.ONMOUSEMOVE: 432 case Event.ONMOUSEOVER: 433 case Event.ONMOUSEOUT: { 434 if (mouseListeners != null) { 435 mouseListeners.fireMouseEvent(this, event); 436 } 437 break; 438 } 439 case Event.ONMOUSEWHEEL: 440 if (mouseWheelListeners != null) { 441 mouseWheelListeners.fireMouseWheelEvent(this, event); 442 } 443 break; 444 case Event.ONLOAD: { 445 if (loadListeners != null) { 446 loadListeners.fireLoad(this); 447 } 448 break; 449 } 450 case Event.ONERROR: { 451 if (loadListeners != null) { 452 loadListeners.fireError(this); 453 } 454 break; 455 } 456 } 457 } 458 459 public void removeClickListener(ClickListener listener) { 460 if (clickListeners != null) { 461 clickListeners.remove(listener); 462 } 463 } 464 465 public void removeLoadListener(LoadListener listener) { 466 if (loadListeners != null) { 467 loadListeners.remove(listener); 468 } 469 } 470 471 public void removeMouseListener(MouseListener listener) { 472 if (mouseListeners != null) { 473 mouseListeners.remove(listener); 474 } 475 } 476 477 public void removeMouseWheelListener(MouseWheelListener listener) { 478 if (mouseWheelListeners != null) { 479 mouseWheelListeners.remove(listener); 480 } 481 } 482 483 491 public void setUrl(String url) { 492 state.setUrl(this, url); 493 } 494 495 511 public void setUrlAndVisibleRect(String url, int left, int top, int width, 512 int height) { 513 state.setUrlAndVisibleRect(this, url, left, top, width, height); 514 } 515 516 533 public void setVisibleRect(int left, int top, int width, int height) { 534 state.setVisibleRect(this, left, top, width, height); 535 } 536 537 private void changeState(State newState) { 538 state = newState; 539 } 540 } 541 | Popular Tags |