Sort & format in preparation for element wrapping patch. git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2866 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/Image.java b/user/src/com/google/gwt/user/client/ui/Image.java index e5942f1..0031214 100644 --- a/user/src/com/google/gwt/user/client/ui/Image.java +++ b/user/src/com/google/gwt/user/client/ui/Image.java
@@ -1,12 +1,12 @@ /* * Copyright 2007 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -34,19 +34,19 @@ * image is constructed, and how it is transformed after construction. Methods * will operate differently depending on the mode that the image is in. These * differences are detailed in the documentation for each method. - * + * * <p> * If an image transitions between clipped mode and unclipped mode, any * {@link Element}-specific attributes added by the user (including style * attributes, style names, and style modifiers), except for event listeners, * will be lost. * </p> - * + * * <h3>CSS Style Rules</h3> * <ul class="css"> * <li>.gwt-Image { }</li> * </ul> - * + * * Tranformations between clipped and unclipped state will result in a loss of * any style names that were set/added; the only style names that are preserved * are those that are mentioned in the static CSS style rules. Due to @@ -55,7 +55,7 @@ * expected when an image is in clipped mode. These limitations can usually be * easily worked around by encapsulating the image in a container widget that * can itself be styled. - * + * * <p> * <h3>Example</h3> * {@example com.google.gwt.examples.ImageExample} @@ -65,6 +65,129 @@ SourcesLoadEvents, SourcesMouseEvents, SourcesMouseWheelEvents { /** + * Implementation of behaviors associated with the clipped state of an image. + */ + private static class ClippedState extends State { + + private static final ClippedImageImpl impl = GWT.create(ClippedImageImpl.class); + + private int height = 0; + private int left = 0; + private int top = 0; + private String url = null; + private int width = 0; + + ClippedState(Image image, String url, int left, int top, int width, + int height) { + this.left = left; + this.top = top; + this.width = width; + this.height = height; + this.url = url; + image.replaceElement(impl.createStructure(url, left, top, width, height)); + image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONMOUSEWHEEL); + fireSyntheticLoadEvent(image); + } + + @Override + public int getHeight(Image image) { + return height; + } + + @Override + public int getOriginLeft() { + return left; + } + + @Override + public int getOriginTop() { + return top; + } + + @Override + public String getUrl(Image image) { + return url; + } + + @Override + public int getWidth(Image image) { + return width; + } + + @Override + public void setUrl(Image image, String url) { + image.changeState(new UnclippedState(image, url)); + } + + @Override + public void setUrlAndVisibleRect(Image image, String url, int left, + int top, int width, int height) { + if (!this.url.equals(url) || this.left != left || this.top != top + || this.width != width || this.height != height) { + + this.url = url; + this.left = left; + this.top = top; + this.width = width; + this.height = height; + + impl.adjust(image.getElement(), url, left, top, width, height); + fireSyntheticLoadEvent(image); + } + } + + @Override + public void setVisibleRect(Image image, int left, int top, int width, + int height) { + /* + * In the event that the clipping rectangle has not changed, we want to + * skip all of the work required with a getImpl().adjust, and we do not + * want to fire a load event. + */ + if (this.left != left || this.top != top || this.width != width + || this.height != height) { + + this.left = left; + this.top = top; + this.width = width; + this.height = height; + + impl.adjust(image.getElement(), url, left, top, width, height); + fireSyntheticLoadEvent(image); + } + } + + /* This method is used only by unit tests */ + @Override + protected String getStateName() { + return "clipped"; + } + + private void fireSyntheticLoadEvent(final Image image) { + /* + * We need to synthesize a load event, because the native events that are + * fired would correspond to the loading of clear.cache.gif, which is + * incorrect. A native event would not even fire in Internet Explorer, + * because the root element is a wrapper element around the <img> element. + * Since we are synthesizing a load event, we do not need to sink the + * onload event. + * + * We use a deferred command here to simulate the native version of the + * load event as closely as possible. In the native event case, it is + * unlikely that a second load event would occur while you are in the load + * event handler. + */ + DeferredCommand.addCommand(new Command() { + public void execute() { + if (image.loadListeners != null) { + image.loadListeners.fireLoad(image); + } + } + }); + } + } + + /** * Abstract class which is used to hold the state associated with an image * object. */ @@ -160,129 +283,6 @@ } /** - * Implementation of behaviors associated with the clipped state of an image. - */ - private static class ClippedState extends State { - - private static final ClippedImageImpl impl = GWT.create(ClippedImageImpl.class); - - private int left = 0; - private int top = 0; - private int width = 0; - private int height = 0; - private String url = null; - - ClippedState(Image image, String url, int left, int top, int width, - int height) { - this.left = left; - this.top = top; - this.width = width; - this.height = height; - this.url = url; - image.replaceElement(impl.createStructure(url, left, top, width, height)); - image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONMOUSEWHEEL); - fireSyntheticLoadEvent(image); - } - - private void fireSyntheticLoadEvent(final Image image) { - /* - * We need to synthesize a load event, because the native events that are - * fired would correspond to the loading of clear.cache.gif, which is - * incorrect. A native event would not even fire in Internet Explorer, - * because the root element is a wrapper element around the <img> element. - * Since we are synthesizing a load event, we do not need to sink the - * onload event. - * - * We use a deferred command here to simulate the native version of the - * load event as closely as possible. In the native event case, it is - * unlikely that a second load event would occur while you are in the load - * event handler. - */ - DeferredCommand.addCommand(new Command() { - public void execute() { - if (image.loadListeners != null) { - image.loadListeners.fireLoad(image); - } - } - }); - } - - @Override - public int getHeight(Image image) { - return height; - } - - @Override - public int getOriginLeft() { - return left; - } - - @Override - public int getOriginTop() { - return top; - } - - @Override - public String getUrl(Image image) { - return url; - } - - @Override - public int getWidth(Image image) { - return width; - } - - @Override - public void setUrl(Image image, String url) { - image.changeState(new UnclippedState(image, url)); - } - - @Override - public void setUrlAndVisibleRect(Image image, String url, int left, - int top, int width, int height) { - if (!this.url.equals(url) || this.left != left || this.top != top - || this.width != width || this.height != height) { - - this.url = url; - this.left = left; - this.top = top; - this.width = width; - this.height = height; - - impl.adjust(image.getElement(), url, left, top, width, height); - fireSyntheticLoadEvent(image); - } - } - - @Override - public void setVisibleRect(Image image, int left, int top, int width, - int height) { - /* - * In the event that the clipping rectangle has not changed, we want to - * skip all of the work required with a getImpl().adjust, and we do not - * want to fire a load event. - */ - if (this.left != left || this.top != top || this.width != width - || this.height != height) { - - this.left = left; - this.top = top; - this.width = width; - this.height = height; - - impl.adjust(image.getElement(), url, left, top, width, height); - fireSyntheticLoadEvent(image); - } - } - - /* This method is used only by unit tests */ - @Override - protected String getStateName() { - return "clipped"; - } - } - - /** * This map is used to store prefetched images. If a reference is not kept to * the prefetched image objects, they can get garbage collected, which * sometimes keeps them from getting fully fetched. @@ -291,7 +291,7 @@ /** * Causes the browser to pre-fetch the image at a given URL. - * + * * @param url the URL of the image to be prefetched */ public static void prefetch(String url) { @@ -318,7 +318,7 @@ /** * Creates an image with a specified URL. The load event will be fired once * the image at the given URL has been retrieved by the browser. - * + * * @param url the URL of the image to be displayed */ public Image(String url) { @@ -335,7 +335,7 @@ * the width and height are specified explicitly by the user, this behavior * will not cause problems with retrieving the width and height of a clipped * image in a load event handler. - * + * * @param url the URL of the image to be displayed * @param left the horizontal co-ordinate of the upper-left vertex of the * visibility rectangle @@ -381,7 +381,7 @@ * Gets the height of the image. When the image is in the unclipped state, the * height of the image is not known until the image has been loaded (i.e. load * event has been fired for the image). - * + * * @return the height of the image, or 0 if the height is unknown */ public int getHeight() { @@ -393,7 +393,7 @@ * visibility rectangle. If the image is in the unclipped state, then the * visibility rectangle is assumed to be the rectangle which encompasses the * entire image, which has an upper-left vertex of (0,0). - * + * * @return the horizontal co-ordinate of the upper-left vertex of the image's * visibility rectangle */ @@ -406,7 +406,7 @@ * visibility rectangle. If the image is in the unclipped state, then the * visibility rectangle is assumed to be the rectangle which encompasses the * entire image, which has an upper-left vertex of (0,0). - * + * * @return the vertical co-ordinate of the upper-left vertex of the image's * visibility rectangle */ @@ -418,7 +418,7 @@ * Gets the URL of the image. The URL that is returned is not necessarily the * URL that was passed in by the user. It may have been transformed to an * absolute URL. - * + * * @return the image URL */ public String getUrl() { @@ -429,7 +429,7 @@ * Gets the width of the image. When the image is in the unclipped state, the * width of the image is not known until the image has been loaded (i.e. load * event has been fired for the image). - * + * * @return the width of the image, or 0 if the width is unknown */ public int getWidth() { @@ -504,7 +504,7 @@ * state, a call to this method will cause a transition of the image to the * unclipped state. Regardless of whether or not the image is in the clipped * or unclipped state, a load event will be fired. - * + * * @param url the image URL */ public void setUrl(String url) { @@ -518,7 +518,7 @@ * visibility rectangle co-ordinates. If the image is currently in the * unclipped state, a call to this method will cause a transition to the * clipped state. - * + * * @param url the image URL * @param left the horizontal coordinate of the upper-left vertex of the * visibility rectangle @@ -541,7 +541,7 @@ * is in the unclipped state, a call to this method will cause a transition of * the image to the clipped state. This transition will cause a load event to * fire. - * + * * @param left the horizontal coordinate of the upper-left vertex of the * visibility rectangle * @param top the vertical coordinate of the upper-left vertex of the