* java/awt/MediaTracker.java: Implemented.
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Mar 2002 08:11:06 +0000 (08:11 +0000)
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Mar 2002 08:11:06 +0000 (08:11 +0000)
        * Makefile.am: Add MediaTracker.
        * Makefile.in: Rebuilt.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50349 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/java/awt/MediaTracker.java

index 392d370..7260543 100644 (file)
@@ -1,3 +1,9 @@
+2002-03-06  Bryce McKinlay  <bryce@waitaki.otago.ac.nz>
+
+       * java/awt/MediaTracker.java: Implemented.
+       * Makefile.am: Add MediaTracker.
+       * Makefile.in: Rebuilt.
+
 2002-03-05  Tom Tromey  <tromey@redhat.com>
 
        * java/lang/natPosixProcess.cc (fail): Removed.
index bceb907..332f64f 100644 (file)
@@ -654,6 +654,7 @@ java/awt/Label.java \
 java/awt/LayoutManager.java \
 java/awt/LayoutManager2.java \
 java/awt/List.java \
+java/awt/MediaTracker.java \
 java/awt/Menu.java \
 java/awt/MenuBar.java \
 java/awt/MenuComponent.java \
index a87668f..ea1b798 100644 (file)
@@ -387,6 +387,7 @@ java/awt/Label.java \
 java/awt/LayoutManager.java \
 java/awt/LayoutManager2.java \
 java/awt/List.java \
+java/awt/MediaTracker.java \
 java/awt/Menu.java \
 java/awt/MenuBar.java \
 java/awt/MenuComponent.java \
@@ -2021,11 +2022,12 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .deps/java/awt/Insets.P .deps/java/awt/ItemSelectable.P \
 .deps/java/awt/Label.P .deps/java/awt/LayoutManager.P \
 .deps/java/awt/LayoutManager2.P .deps/java/awt/List.P \
-.deps/java/awt/Menu.P .deps/java/awt/MenuBar.P \
-.deps/java/awt/MenuComponent.P .deps/java/awt/MenuContainer.P \
-.deps/java/awt/MenuItem.P .deps/java/awt/MenuShortcut.P \
-.deps/java/awt/Paint.P .deps/java/awt/PaintContext.P \
-.deps/java/awt/Panel.P .deps/java/awt/Point.P .deps/java/awt/Polygon.P \
+.deps/java/awt/MediaTracker.P .deps/java/awt/Menu.P \
+.deps/java/awt/MenuBar.P .deps/java/awt/MenuComponent.P \
+.deps/java/awt/MenuContainer.P .deps/java/awt/MenuItem.P \
+.deps/java/awt/MenuShortcut.P .deps/java/awt/Paint.P \
+.deps/java/awt/PaintContext.P .deps/java/awt/Panel.P \
+.deps/java/awt/Point.P .deps/java/awt/Polygon.P \
 .deps/java/awt/PopupMenu.P .deps/java/awt/PrintGraphics.P \
 .deps/java/awt/PrintJob.P .deps/java/awt/Rectangle.P \
 .deps/java/awt/RenderingHints.P .deps/java/awt/ScrollPane.P \
index 04ecad5..a94d650 100644 (file)
@@ -1,5 +1,5 @@
 /* MediaTracker.java -- Class used for keeping track of images
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -38,14 +38,355 @@ exception statement from your version. */
 
 package java.awt;
 
+import java.util.ArrayList;
+import java.awt.image.ImageObserver;
+
 /**
   * This class is used for keeping track of the status of various media
   * objects.
   *
   * @author Aaron M. Renn (arenn@urbanophile.com)
+  * @author Bryce McKinlay
   */
 public class MediaTracker implements java.io.Serializable
 {
+  public static final int LOADING = 1 << 0;
+  public static final int ABORTED = 1 << 1;
+  public static final int ERRORED = 1 << 2;
+  public static final int COMPLETE = 1 << 3;
+  
+  Component target;
+  MediaEntry head;
+
+  static final long serialVersionUID = -483174189758638095L;
+
+  // 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
+  {
+    int id;
+    Image image;
+    MediaEntry next;
+    int status;
+    int width;
+    int height;
+    
+    public boolean imageUpdate(Image img, int flags, int x, int y, 
+                              int width, int height)
+    {
+      if ((flags & ABORT) != 0)
+        status = ABORTED & COMPLETE;
+      else if ((flags & ERROR) != 0)
+        status = ERRORED & COMPLETE;
+      else if ((flags & ALLBITS) != 0)
+        status = COMPLETE;
+      else
+        status = LOADING;
+      
+      synchronized (MediaTracker.this)
+      {
+       MediaTracker.this.notifyAll();
+      }
+      
+      return ((status & COMPLETE) != 0);
+    }
+  }
+
+  public MediaTracker(Component c)
+  {
+    target = c;
+  }
+
+  public void addImage(Image image, int id)
+  {
+    MediaEntry e = new MediaEntry();
+    e.id = id;
+    e.image = image;
+    e.next = head;
+    head = e;
+    // Start tracking image status.
+    target.checkImage(image, e);
+  }
+
+  public void addImage(Image image, int id, int width, int height)
+  {
+    MediaEntry e = new MediaEntry();
+    e.id = id;
+    e.image = image;
+    e.next = head;
+    e.width = width;
+    e.height = height;
+    head = e;
+    // Start tracking image status.
+    target.checkImage(image, width, height, e);
+  }
+
+  public boolean checkAll()
+  {
+    return checkAll(false);
+  }
+
+  public boolean checkAll(boolean load)
+  {
+    MediaEntry e = head;
+    boolean result = true;
+    
+    while (e != null)
+      {
+       if ((e.status & COMPLETE) == 0)
+         {
+           if (load)
+             {
+               result = false;
+               if (e.status == 0)
+                 {
+                   target.prepareImage(e.image, e);
+                   e.status = LOADING;
+                 }
+             }
+           else
+             return false;
+         }
+       e = e.next;
+      }
+    return result;
+  }
+
+  public boolean isErrorAny()
+  {
+    MediaEntry e = head;    
+    while (e != null)
+      {
+        if ((e.status & ERRORED) != 0)
+         return true;
+        e = e.next;
+      }
+    return false;
+  }
+
+  public Object[] getErrorsAny()
+  {
+    MediaEntry e = head;
+    ArrayList result = null;
+    while (e != null)
+      {
+        if ((e.status & ERRORED) != 0)
+         {
+           if (result == null)
+             result = new ArrayList();
+           result.add(e.image);
+         }
+        e = e.next;
+      }
+    if (result == null)
+      return null;
+    else
+      return result.toArray();
+  }
+
+  public void waitForAll() throws InterruptedException
+  {
+    synchronized (this)
+    {
+      while (checkAll(true) == false)
+        wait();
+    }
+  }
+
+  public boolean waitForAll(long ms) throws InterruptedException
+  {
+    long start = System.currentTimeMillis();
+    synchronized (this)
+    {
+      while (!checkAll(true))
+        wait(ms);
+    }
+    if ((System.currentTimeMillis() - start) < ms)
+      return true;
+    else
+      return false;
+  }
+
+  public int statusAll(boolean load)
+  {
+    int result = 0;
+    MediaEntry e = head;
+    while (e != null)
+      {
+        if (load && e.status == 0)
+         {
+           target.prepareImage(e.image, e);
+           e.status = LOADING;
+         }
+        result |= e.status;
+       e = e.next;
+      }
+    return result;
+  }
+
+  public boolean checkID(int id)
+  {
+    return checkID(id, false);
+  }
+
+  public boolean checkID(int id, boolean load)
+  {
+    MediaEntry e = head;
+    boolean result = true;
+    
+    while (e != null)
+      {
+       if (e.id == id && ((e.status & COMPLETE) == 0))
+         {
+           if (load)
+             {
+               result = false;
+               if (e.status == 0)
+                 {
+                   target.prepareImage(e.image, e);
+                   e.status = LOADING;
+                 }
+             }
+           else
+             return false;
+         }
+       e = e.next;
+      }
+    return result;
+  }
+
+  public boolean isErrorID(int id)
+  {
+    MediaEntry e = head;    
+    while (e != null)
+      {
+        if (e.id == id && ((e.status & ERRORED) != 0))
+         return true;
+        e = e.next;
+      }
+    return false;
+  }
+
+  public Object[] getErrorsID(int id)
+  {
+    MediaEntry e = head;
+    ArrayList result = null;
+    while (e != null)
+      {
+        if (e.id == id && ((e.status & ERRORED) != 0))
+         {
+           if (result == null)
+             result = new ArrayList();
+           result.add(e.image);
+         }
+        e = e.next;
+      }
+    if (result == null)
+      return null;
+    else
+      return result.toArray();
+  }
+
+  public void waitForID(int id) throws InterruptedException
+  {
+    MediaEntry e = head;
+    synchronized (this)
+    {
+      while (checkID (id, true) == false)
+        wait();
+    }
+  }
+
+  public boolean waitForID(int id, long ms) throws InterruptedException
+  {
+    MediaEntry e = head;
+    long start = System.currentTimeMillis();
+    synchronized (this)
+    {
+      while (checkID (id, true) == false)
+        wait(ms);
+    }  
+    if ((System.currentTimeMillis() - start) < ms)
+      return true;
+    else
+      return false;
+  }
+
+  public int statusID(int id, boolean load)
+  {
+    int result = 0;
+    MediaEntry e = head;
+    while (e != null)
+      {
+        if (e.id == id)
+         {
+            if (load && e.status == 0)
+             {
+               target.prepareImage(e.image, e);
+               e.status = LOADING;
+             }
+            result |= e.status;
+         }
+       e = e.next;
+      }
+    return result;
+  }
+
+  public void removeImage(Image image)
+  {
+    MediaEntry e = head;
+    MediaEntry prev = null;
+    while (e != null)
+      {
+        if (e.image == image)
+         {
+           if (prev == null)
+             head = e.next;
+           else
+             prev.next = e.next;
+         }
+       prev = e;
+       e = e.next;
+      }
+  }
 
-} // class MediaTracker 
+  public void removeImage(Image image, int id)
+  {
+    MediaEntry e = head;
+    MediaEntry prev = null;
+    while (e != null)
+      {
+        if (e.id == id && e.image == image)
+         {
+           if (prev == null)
+             head = e.next;
+           else
+             prev.next = e.next;
+         }
+       else
+         prev = e;
+       e = e.next;
+      }  
+  }
 
+  public void removeImage(Image image, int id, int width, int height)
+  {
+    MediaEntry e = head;
+    MediaEntry prev = null;
+    while (e != null)
+      {
+        if (e.id == id && e.image == image
+           && e.width == width && e.height == height)
+         {
+           if (prev == null)
+             head = e.next;
+           else
+             prev.next = e.next;
+         }
+       else
+         prev = e;
+       e = e.next;
+      }
+  }
+}