This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

java.awt.MediaTracker


Believed complete, but untested.


2002-03-06  Bryce McKinlay  <bryce@waitaki.otago.ac.nz>

	* java/awt/MediaTracker.java: Implemented.
	* Makefile.am: Add MediaTracker.
	* Makefile.in: Rebuilt.

Index: java/awt/MediaTracker.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MediaTracker.java,v
retrieving revision 1.2
diff -u -r1.2 MediaTracker.java
--- MediaTracker.java	2002/01/22 22:58:08	1.2
+++ MediaTracker.java	2002/03/06 08:08:52
@@ -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 @@
 
 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
 {
-
-} // class MediaTracker 
-
+  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;
+      }
+  }
+
+  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;
+      }
+  }
+}
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.203
diff -u -r1.203 Makefile.am
--- Makefile.am	2002/03/04 01:00:16	1.203
+++ Makefile.am	2002/03/06 08:08:53
@@ -654,6 +654,7 @@
 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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]