Index: java/awt/MediaTracker.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/MediaTracker.java,v retrieving revision 1.10 diff -u -r1.10 MediaTracker.java --- java/awt/MediaTracker.java 8 Apr 2005 18:25:47 -0000 1.10 +++ java/awt/MediaTracker.java 11 Apr 2005 07:37:31 -0000 @@ -45,33 +45,86 @@ * This class is used for keeping track of the status of various media * objects. * + * Media objects are tracked by assigning them an ID. It is possible + * to assign the same ID to mutliple objects, effectivly grouping them + * together. In this case the status flags (address@hidden #statusID}) and error flag + * (@link #isErrorID} and address@hidden #getErrorId}) are ORed together. This + * means that you cannot say exactly which media object has which status, + * at most you can say that there are certain media objects with + * some certain status. + * + * At the moment only images are supported by this class. + * * @author Aaron M. Renn (address@hidden) * @author Bryce McKinlay */ public class MediaTracker implements java.io.Serializable { + /** Indicates that the media is still loading. */ public static final int LOADING = 1 << 0; + + /** Indicates that the loading operation has been aborted. */ public static final int ABORTED = 1 << 1; + + /** Indicates that an error has occured during loading of the media. */ public static final int ERRORED = 1 << 2; + + /** Indicates that the media has been successfully and completely loaded. */ public static final int COMPLETE = 1 << 3; - + + /** The component on which the media is eventually been drawn. */ Component target; + + /** The head of the linked list of tracked media objects. */ MediaEntry head; + /** Our serialVersionUID for serialization. */ static final long serialVersionUID = -483174189758638095L; + /** + * This represents a media object that is tracked by a MediaTracker. + * It also implements a simple linked list. + */ // FIXME: The serialized form documentation says MediaEntry is a // serializable field, but the serialized form of MediaEntry itself // doesn't appear to be documented. class MediaEntry implements ImageObserver { + /** The ID of the media object. */ int id; + + /** The media object. (only images are supported ATM). */ Image image; + + /** The link to the next entry in the list. */ MediaEntry next; + + /** The tracking status. */ int status; + + /** The width of the image. */ int width; + + /** The height of the image. */ int height; + /** + * Receives notification from an address@hidden java.awt.image.ImageProducer} + * that more data of the image is available. + * + * @param img the image that is updated + * @param flags flags from the ImageProducer that indicate the status + * of the loading process + * @param x the X coordinate of the upper left corner of the image + * @param y the Y coordinate of the upper left corner of the image + * @param width the width of the image + * @param height the height of the image + * + * @return true if more data is needed, false + * otherwise + * + * @see address@hidden java.awt.image.ImageObserver} + */ public boolean imageUpdate(Image img, int flags, int x, int y, int width, int height) { @@ -96,11 +149,23 @@ } } + /** + * Constructs a new MediaTracker for the component c. The + * component should be the component that uses the media (i.e. draws it). + * + * @param c the Component that wants to use the media + */ public MediaTracker(Component c) { target = c; } + /** + * Adds an image to the tracker with the specified ID. + * + * @param image the image to be added + * @param id the ID of the tracker list to which the image is added + */ public void addImage(Image image, int id) { MediaEntry e = new MediaEntry(); @@ -113,6 +178,16 @@ e.imageUpdate(image, flags, -1, -1, -1, -1); } + /** + * Adds an image to the tracker with the specified ID. + * The image is expected to be rendered with the specified width and + * height. + * + * @param image the image to be added + * @param id the ID of the tracker list to which the image is added + * @param width the width of the image + * @param height the height of the image + */ public void addImage(Image image, int id, int width, int height) { MediaEntry e = new MediaEntry(); @@ -127,11 +202,36 @@ e.imageUpdate(image, flags, -1, -1, width, height); } + /** + * Checks if all media objects have finished loading, i.e. are + * address@hidden #COMPLETE}, address@hidden #ABORTED} or address@hidden #ERRORED}. + * + * If the media objects are not already loading, a call to this + * method does not start loading. This is equivalent to + * a call to checkAll(false). + * + * @return if all media objects have finished loading either by beeing + * complete, have been aborted or errored. + */ public boolean checkAll() { return checkAll(false); } + /** + * Checks if all media objects have finished loading, i.e. are + * address@hidden #COMPLETE}, address@hidden #ABORTED} or address@hidden #ERRORED}. + * + * If the media objects are not already loading, and load + * is true then a call to this + * method starts loading the media objects. + * + * @param load if true this method starts loading objects + * that are not already loading + * + * @return if all media objects have finished loading either by beeing + * complete, have been aborted or errored. + */ public boolean checkAll(boolean load) { MediaEntry e = head; @@ -158,6 +258,14 @@ return result; } + /** + * Checks if any of the registered media objects has encountered an error + * during loading. + * + * @return true if at least one media object has encountered + * an error during loading, false otherwise + * + */ public boolean isErrorAny() { MediaEntry e = head; @@ -170,6 +278,12 @@ return false; } + /** + * Returns all media objects that have encountered errors during loading. + * + * @return an array of all media objects that have encountered errors + * or null if there were no errors at all + */ public Object[] getErrorsAny() { MediaEntry e = head; @@ -190,6 +304,13 @@ return result.toArray(); } + /** + * Waits for all media objects to finish loading, either by completing + * successfully or by aborting or encountering an error. + * + * @throws InterruptedException if another thread interrupted the + * current thread while waiting + */ public void waitForAll() throws InterruptedException { synchronized (this) @@ -199,6 +320,23 @@ } } + /** + * Waits for all media objects to finish loading, either by completing + * successfully or by aborting or encountering an error. + * + * This method waits at most ms milliseconds. If the + * media objects have not completed loading within this timeframe, this + * method returns false, otherwise true. + * + * @param ms timeframe in milliseconds to wait for the media objects to + * finish + * + * @return true if all media objects have successfully loaded + * within the timeframe, false otherwise + * + * @throws InterruptedException if another thread interrupted the + * current thread while waiting + */ public boolean waitForAll(long ms) throws InterruptedException { long start = System.currentTimeMillis(); @@ -217,6 +355,16 @@ return result; } + /** + * Returns the status flags of all registered media objects ORed together. + * If load is true then media objects that + * are not already loading will be started to load. + * + * @param load if set to true then media objects that are + * not already loading are started + * + * @return the status flags of all tracked media objects ORed together + */ public int statusAll(boolean load) { int result = 0; @@ -234,11 +382,31 @@ return result; } + /** + * Checks if the media objects with ID have completed loading. + * + * @param id the ID of the media objects to check + * + * @return true if all media objects with ID + * have successfully finished + */ public boolean checkID(int id) { return checkID(id, false); } + /** + * Checks if the media objects with ID have completed loading. + * If load is true then media objects that + * are not already loading will be started to load. + * + * @param id the ID of the media objects to check + * @param load if set to true then media objects that are + * not already loading are started + * + * @return true if all media objects with ID + * have successfully finished + */ public boolean checkID(int id, boolean load) { MediaEntry e = head; @@ -265,6 +433,15 @@ return result; } + /** + * Returns true if any of the media objects with ID + * have encountered errors during loading, false otherwise. + * + * @param id the ID of the media objects to check + * + * @return true if any of the media objects with ID + * have encountered errors during loading, false otherwise + */ public boolean isErrorID(int id) { MediaEntry e = head; @@ -277,6 +454,15 @@ return false; } + /** + * Returns all media objects with the specified ID that have encountered + * an error. + * + * @param id the ID of the media objects to check + * + * @return an array of all media objects with the specified ID that + * have encountered an error + */ public Object[] getErrorsID(int id) { MediaEntry e = head; @@ -297,6 +483,15 @@ return result.toArray(); } + /** + * Waits for all media objects with the specified ID to finish loading, + * either by completing successfully or by aborting or encountering an error. + * + * @param id the ID of the media objects to wait for + * + * @throws InterruptedException if another thread interrupted the + * current thread while waiting + */ public void waitForID(int id) throws InterruptedException { MediaEntry e = head; @@ -307,6 +502,24 @@ } } + /** + * Waits for all media objects with the specified ID to finish loading, + * either by completing successfully or by aborting or encountering an error. + * + * This method waits at most ms milliseconds. If the + * media objects have not completed loading within this timeframe, this + * method returns false, otherwise true. + * + * @param id the ID of the media objects to wait for + * @param ms timeframe in milliseconds to wait for the media objects to + * finish + * + * @return true if all media objects have successfully loaded + * within the timeframe, false otherwise + * + * @throws InterruptedException if another thread interrupted the + * current thread while waiting + */ public boolean waitForID(int id, long ms) throws InterruptedException { MediaEntry e = head; @@ -327,6 +540,18 @@ return result; } + /** + * Returns the status flags of the media objects with the specified ID + * ORed together. + * + * If load is true then media objects that + * are not already loading will be started to load. + * + * @param load if set to true then media objects that are + * not already loading are started + * + * @return the status flags of all tracked media objects ORed together + */ public int statusID(int id, boolean load) { int result = 0; @@ -347,6 +572,11 @@ return result; } + /** + * Removes an image from this MediaTracker. + * + * @param image the image to be removed + */ public void removeImage(Image image) { MediaEntry e = head; @@ -365,6 +595,11 @@ } } + /** + * Removes an image with the specified ID from this MediaTracker. + * + * @param image the image to be removed + */ public void removeImage(Image image, int id) { MediaEntry e = head; @@ -384,6 +619,11 @@ } } + /** + * Removes an image with the specified ID and scale from this MediaTracker. + * + * @param image the image to be removed + */ public void removeImage(Image image, int id, int width, int height) { MediaEntry e = head;