mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			593 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			593 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* Applet.java -- Java base applet class
 | |
|    Copyright (C) 1999, 2002, 2004, 2005  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package java.applet;
 | |
| 
 | |
| import java.awt.Component;
 | |
| import java.awt.Dimension;
 | |
| import java.awt.GraphicsEnvironment;
 | |
| import java.awt.HeadlessException;
 | |
| import java.awt.Image;
 | |
| import java.awt.Panel;
 | |
| import java.io.IOException;
 | |
| import java.io.ObjectInputStream;
 | |
| import java.net.MalformedURLException;
 | |
| import java.net.URL;
 | |
| import java.util.Locale;
 | |
| 
 | |
| import javax.accessibility.AccessibleContext;
 | |
| import javax.accessibility.AccessibleRole;
 | |
| import javax.accessibility.AccessibleState;
 | |
| import javax.accessibility.AccessibleStateSet;
 | |
| import javax.sound.sampled.AudioSystem;
 | |
| import javax.sound.sampled.Clip;
 | |
| import javax.sound.sampled.LineUnavailableException;
 | |
| import javax.sound.sampled.UnsupportedAudioFileException;
 | |
| 
 | |
| /**
 | |
|  * This is the base applet class.  An applet is a Java program that
 | |
|  * runs inside a web browser or other applet viewer in a restricted
 | |
|  * environment.
 | |
|  *
 | |
|  * <p>To be useful, a subclass should override at least start(). Also useful
 | |
|  * are init, stop, and destroy for control purposes, and getAppletInfo and
 | |
|  * getParameterInfo for descriptive purposes.
 | |
|  *
 | |
|  * @author Aaron M. Renn (arenn@urbanophile.com)
 | |
|  * @author Eric Blake (ebb9@email.byu.edu)
 | |
|  * @since 1.0
 | |
|  * @status updated to 1.4
 | |
|  */
 | |
| public class Applet extends Panel
 | |
| {
 | |
|   /**
 | |
|    * Compatible with JDK 1.0+.
 | |
|    */
 | |
|   private static final long serialVersionUID = -5836846270535785031L;
 | |
| 
 | |
|   /** The applet stub for this applet. */
 | |
|   private transient AppletStub stub;
 | |
| 
 | |
|   /** Some applets call setSize in their constructors.  In that case,
 | |
|       these fields are used to store width and height values until a
 | |
|       stub is set. */
 | |
|   private transient int width;
 | |
|   private transient int height;
 | |
| 
 | |
|   /**
 | |
|    * The accessibility context for this applet.
 | |
|    *
 | |
|    * @serial the accessibleContext for this
 | |
|    * @since 1.2
 | |
|    */
 | |
|   private AccessibleContext accessibleContext;
 | |
| 
 | |
|   /**
 | |
|    * Default constructor for subclasses.
 | |
|    *
 | |
|    * @throws HeadlessException if in a headless environment
 | |
|    */
 | |
|   public Applet()
 | |
|   {
 | |
|     if (GraphicsEnvironment.isHeadless())
 | |
|       throw new HeadlessException();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * The browser calls this method to set the applet's stub, which is the
 | |
|    * low level interface to the browser. Manually setting this to null is
 | |
|    * asking for problems down the road.
 | |
|    *
 | |
|    * @param stub the applet stub for this applet
 | |
|    */
 | |
|   public final void setStub(AppletStub stub)
 | |
|   {
 | |
|     this.stub = stub;
 | |
| 
 | |
|     if (width != 0 && height != 0)
 | |
|       stub.appletResize (width, height);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Tests whether or not this applet is currently active. An applet is active
 | |
|    * just before the browser invokes start(), and becomes inactive just
 | |
|    * before the browser invokes stop().
 | |
|    *
 | |
|    * @return <code>true</code> if this applet is active
 | |
|    */
 | |
|   public boolean isActive()
 | |
|   {
 | |
|     return stub.isActive();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the basename URL of the document this applet is embedded in. This
 | |
|    * is everything up to the final '/'.
 | |
|    *
 | |
|    * @return the URL of the document this applet is embedded in
 | |
|    * @see #getCodeBase()
 | |
|    */
 | |
|   public URL getDocumentBase()
 | |
|   {
 | |
|     return stub.getDocumentBase();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the URL of the code base for this applet.
 | |
|    *
 | |
|    * @return the URL of the code base for this applet
 | |
|    */
 | |
|   public URL getCodeBase()
 | |
|   {
 | |
|     return stub.getCodeBase();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the value of the specified parameter that was specified in
 | |
|    * the <code><APPLET></code> tag for this applet.
 | |
|    *
 | |
|    * @param name the parameter name
 | |
|    * @return the parameter value, or null if the parameter does not exist
 | |
|    * @throws NullPointerException if name is null
 | |
|    */
 | |
|   public String getParameter(String name)
 | |
|   {
 | |
|     return stub.getParameter(name);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the applet context for this applet.
 | |
|    *
 | |
|    * @return the applet context for this applet
 | |
|    */
 | |
|   public AppletContext getAppletContext()
 | |
|   {
 | |
|     return stub.getAppletContext();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Requests that the applet window for this applet be resized.
 | |
|    *
 | |
|    * @param width the new width in pixels
 | |
|    * @param height the new height in pixels
 | |
|    */
 | |
|   public void resize(int width, int height)
 | |
|   {
 | |
|     if (stub == null)
 | |
|       {
 | |
|         this.width = width;
 | |
|         this.height = height;
 | |
|       }
 | |
|     else
 | |
|       stub.appletResize(width, height);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Requests that the applet window for this applet be resized.
 | |
|    *
 | |
|    * @param dim the requested dimensions
 | |
|    * @throws NullPointerException if dim is null
 | |
|    */
 | |
|   public void resize(Dimension dim)
 | |
|   {
 | |
|     resize(dim.width, dim.height);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Displays the specified message in the status window if that window
 | |
|    * exists.
 | |
|    *
 | |
|    * @param message the status message, may be null
 | |
|    */
 | |
|   public void showStatus(String message)
 | |
|   {
 | |
|     getAppletContext().showStatus(message);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an image from the specified URL.  Note that the image is not
 | |
|    * actually retrieved until the applet attempts to display it, so this
 | |
|    * method returns immediately.
 | |
|    *
 | |
|    * @param url the URL of the image
 | |
|    * @return the retrieved image
 | |
|    * @throws NullPointerException if url is null
 | |
|    */
 | |
|   public Image getImage(URL url)
 | |
|   {
 | |
|     return getAppletContext().getImage(url);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an image from the specified absolute URL, and relative path
 | |
|    * from that URL.  Note that the image is not actually retrieved until the
 | |
|    * applet attempts to display it, so this method returns immediately.
 | |
|    * This calls <code>getImage(new URL(url, name))</code>, but if building
 | |
|    * the new URL fails, this returns null.
 | |
|    *
 | |
|    * @param url the base URL of the image
 | |
|    * @param name the name of the image relative to the URL
 | |
|    * @return the retrieved image, or null on failure
 | |
|    * @see #getImage(URL)
 | |
|    */
 | |
|   public Image getImage(URL url, String name)
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         return getImage(new URL(url, name));
 | |
|       }
 | |
|     catch (MalformedURLException e)
 | |
|       {
 | |
|         return null;
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an audio clip from the specified URL. This clip is not tied to
 | |
|    * any particular applet.
 | |
|    *
 | |
|    * @param url the URL of the audio clip
 | |
|    * @return the retrieved audio clip
 | |
|    * @throws NullPointerException if url is null
 | |
|    * @see #getAudioClip(URL)
 | |
|    * @since 1.2
 | |
|    */
 | |
|   public static final AudioClip newAudioClip(URL url)
 | |
|   {
 | |
|     return new URLAudioClip(url);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an audio clip from the specified URL. Note that the clip is not
 | |
|    * actually retrieved until the applet attempts to play it, so this method
 | |
|    * returns immediately.
 | |
|    *
 | |
|    * @param url the URL of the audio clip
 | |
|    * @return the retrieved audio clip
 | |
|    * @throws NullPointerException if url is null
 | |
|    */
 | |
|   public AudioClip getAudioClip(URL url)
 | |
|   {
 | |
|     return getAppletContext().getAudioClip(url);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns an audio clip from the specified absolute URL, and relative path
 | |
|    * from that URL.  Note that the clip is not actually retrieved until the
 | |
|    * applet attempts to play it, so this method returns immediately. This
 | |
|    * calls <code>getAudioClip(new URL(url, name))</code>, but if building
 | |
|    * the new URL fails, this returns null.
 | |
|    *
 | |
|    * @param url the base URL of the audio clip
 | |
|    * @param name the name of the clip relative to the URL
 | |
|    * @return the retrieved audio clip, or null on failure
 | |
|    * @see #getAudioClip(URL)
 | |
|    */
 | |
|   public AudioClip getAudioClip(URL url, String name)
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         return getAudioClip(new URL(url, name));
 | |
|       }
 | |
|     catch (MalformedURLException e)
 | |
|       {
 | |
|         return null;
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a descriptive string with applet defined information.  The
 | |
|    * implementation in this class returns <code>null</code>, so subclasses
 | |
|    * must override to return information.
 | |
|    *
 | |
|    * @return a string describing the author, version, and applet copyright
 | |
|    */
 | |
|   public String getAppletInfo()
 | |
|   {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the locale for this applet, if it has been set.  If no applet
 | |
|    * specific locale has been set, the default locale is returned.
 | |
|    *
 | |
|    * @return the locale for this applet
 | |
|    * @see Component#setLocale(Locale)
 | |
|    * @since 1.1
 | |
|    */
 | |
|   public Locale getLocale()
 | |
|   {
 | |
|     return super.getLocale();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a list of parameters this applet supports.  Each element of
 | |
|    * the outer array is an array of three strings with the name of the
 | |
|    * parameter, the data type or valid values, and a description.  This
 | |
|    * method is optional and the default implementation returns null.
 | |
|    *
 | |
|    * @return the list of parameters supported by this applet
 | |
|    */
 | |
|   public String[][] getParameterInfo()
 | |
|   {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Loads and plays the audio clip pointed to by the specified URL. This does
 | |
|    * nothing if the URL does not point to a valid audio clip.
 | |
|    *
 | |
|    * @param url the URL of the audio clip
 | |
|    * @throws NullPointerException if url is null
 | |
|    * @see #getAudioClip(URL)
 | |
|    */
 | |
|   public void play(URL url)
 | |
|   {
 | |
|     AudioClip ac = getAudioClip(url);
 | |
|     try
 | |
|       {
 | |
|         ac.play();
 | |
|       }
 | |
|     catch (Exception ignored)
 | |
|       {
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Loads and plays the audio clip pointed to by the specified absolute URL,
 | |
|    * and relative path from that URL. This does nothing if the URL cannot be
 | |
|    * constructed, or if it does not point to a valid audio clip.
 | |
|    *
 | |
|    * @param url the base URL of the audio clip
 | |
|    * @param name the name of the audio clip relative to the URL
 | |
|    * @see #getAudioClip(URL, String)
 | |
|    * @see #play(URL)
 | |
|    */
 | |
|   public void play(URL url, String name)
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         getAudioClip(url, name).play();
 | |
|       }
 | |
|     catch (Exception ignored)
 | |
|       {
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method is called when the applet is first loaded, before start().
 | |
|    * The default implementation does nothing; override to do any one-time
 | |
|    * initialization.
 | |
|    *
 | |
|    * @see #start()
 | |
|    * @see #stop()
 | |
|    * @see #destroy()
 | |
|    */
 | |
|   public void init()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method is called when the applet should start running.  This is
 | |
|    * normally each time a web page containing it is loaded.  The default
 | |
|    * implemention does nothing; override for your applet to be useful.
 | |
|    *
 | |
|    * @see #init()
 | |
|    * @see #stop()
 | |
|    * @see #destroy()
 | |
|    */
 | |
|   public void start()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method is called when the applet should stop running.  This is
 | |
|    * normally when the next web page is loaded.  The default implementation
 | |
|    * does nothing; override for your applet to stop using resources when
 | |
|    * it is no longer visible, but may be restarted soon.
 | |
|    *
 | |
|    * @see #init()
 | |
|    * @see #start()
 | |
|    * @see #destroy()
 | |
|    */
 | |
|   public void stop()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method is called when the applet is being unloaded.  The default
 | |
|    * implementation does nothing; override for your applet to clean up
 | |
|    * resources on exit.
 | |
|    *
 | |
|    * @see #init()
 | |
|    * @see #start()
 | |
|    * @see #stop()
 | |
|    */
 | |
|   public void destroy()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Gets the AccessibleContext associated with this applet, creating one if
 | |
|    * necessary. This always returns an instance of {@link AccessibleApplet}.
 | |
|    *
 | |
|    * @return the accessibility context of this applet
 | |
|    * @since 1.3
 | |
|    */
 | |
|   public AccessibleContext getAccessibleContext()
 | |
|   {
 | |
|     if (accessibleContext == null)
 | |
|       accessibleContext = new AccessibleApplet();
 | |
|     return accessibleContext;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Read an applet from an object stream. This checks for a headless
 | |
|    * environment, then does the normal read.
 | |
|    *
 | |
|    * @param s the stream to read from
 | |
|    * @throws ClassNotFoundException if a class is not found
 | |
|    * @throws IOException if deserialization fails
 | |
|    * @throws HeadlessException if this is a headless environment
 | |
|    * @see GraphicsEnvironment#isHeadless()
 | |
|    * @since 1.4
 | |
|    */
 | |
|   private void readObject(ObjectInputStream s)
 | |
|     throws ClassNotFoundException, IOException
 | |
|   {
 | |
|     if (GraphicsEnvironment.isHeadless())
 | |
|       throw new HeadlessException();
 | |
|     s.defaultReadObject();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This class provides accessibility support for Applets, and is the
 | |
|    * runtime type returned by {@link #getAccessibleContext()}.
 | |
|    *
 | |
|    * @author Eric Blake (ebb9@email.byu.edu)
 | |
|    * @since 1.3
 | |
|    */
 | |
|   protected class AccessibleApplet extends AccessibleAWTPanel
 | |
|   {
 | |
|     /**
 | |
|      * Compatible with JDK 1.4+.
 | |
|      */
 | |
|     private static final long serialVersionUID = 8127374778187708896L;
 | |
| 
 | |
|     /**
 | |
|      * The default constructor.
 | |
|      */
 | |
|     protected AccessibleApplet()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the role of this accessible object, a frame.
 | |
|      *
 | |
|      * @return the role of the object
 | |
|      * @see AccessibleRole#FRAME
 | |
|      */
 | |
|     public AccessibleRole getAccessibleRole()
 | |
|     {
 | |
|       return AccessibleRole.FRAME;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the state set of this accessible object. In addition to the default
 | |
|      * states of a Component, the applet can also be active.
 | |
|      *
 | |
|      * @return the role of the object
 | |
|      * @see AccessibleState
 | |
|      */
 | |
|     public AccessibleStateSet getAccessibleStateSet()
 | |
|     {
 | |
|       AccessibleStateSet s = super.getAccessibleStateSet();
 | |
|       if (isActive())
 | |
|         s.add(AccessibleState.ACTIVE);
 | |
|       return s;
 | |
|     }
 | |
|   } // class AccessibleApplet
 | |
| 
 | |
|   private static class URLAudioClip implements AudioClip
 | |
|   {
 | |
|     // The URL we will try to play.
 | |
|     // This is null if we have already tried to create an
 | |
|     // audio input stream from this URL.
 | |
|     private URL url;
 | |
| 
 | |
|     // The real audio clip.  This is null before the URL is read,
 | |
|     // and might be null afterward if we were unable to read the URL
 | |
|     // for some reason.
 | |
|     private Clip clip;
 | |
| 
 | |
|     public URLAudioClip(URL url)
 | |
|     {
 | |
|       this.url = url;
 | |
|     }
 | |
| 
 | |
|     private synchronized Clip getClip()
 | |
|     {
 | |
|       if (url == null)
 | |
|         return clip;
 | |
|       try
 | |
|         {
 | |
|           clip = AudioSystem.getClip();
 | |
|           clip.open(AudioSystem.getAudioInputStream(url));
 | |
|         }
 | |
|       catch (LineUnavailableException _)
 | |
|         {
 | |
|           // Ignore.
 | |
|         }
 | |
|       catch (IOException _)
 | |
|         {
 | |
|           // Ignore.
 | |
|         }
 | |
|       catch (UnsupportedAudioFileException _)
 | |
|         {
 | |
|           // Ignore.
 | |
|         }
 | |
|       url = null;
 | |
|       return clip;
 | |
|     }
 | |
| 
 | |
|     public void loop()
 | |
|     {
 | |
|       Clip myclip = getClip();
 | |
|       if (myclip != null)
 | |
|         myclip.loop(Clip.LOOP_CONTINUOUSLY);
 | |
|     }
 | |
| 
 | |
|     public void play()
 | |
|     {
 | |
|       Clip myclip = getClip();
 | |
|       if (myclip != null)
 | |
|         myclip.start();
 | |
|     }
 | |
| 
 | |
|     public void stop()
 | |
|     {
 | |
|       Clip myclip = getClip();
 | |
|       if (myclip != null)
 | |
|         {
 | |
|           myclip.stop();
 | |
|           myclip.setFramePosition(0);
 | |
|         }
 | |
|     }
 | |
|   }
 | |
| } // class Applet
 |