OSDN Git Service

Imported GNU Classpath 0.90
[pf3gnuchains/gcc-fork.git] / libjava / classpath / examples / gnu / classpath / examples / awt / AnimationApplet.java
diff --git a/libjava/classpath/examples/gnu/classpath/examples/awt/AnimationApplet.java b/libjava/classpath/examples/gnu/classpath/examples/awt/AnimationApplet.java
new file mode 100644 (file)
index 0000000..9d3b7ce
--- /dev/null
@@ -0,0 +1,233 @@
+/* AnimationApplet.java -- An example of an old-style AWT applet
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath examples.
+
+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. */
+
+package gnu.classpath.examples.awt;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+
+/**
+ * AnimationApplet demonstrates the need for Xflush calls in
+ * GdkGraphics.c.  To see how this demo can fail in their absence,
+ * remove the contents of schedule_flush in GdkGraphics.c.  The
+ * animation will be so choppy that it is effectively stopped.
+ */
+public class AnimationApplet
+  extends Applet
+  implements Runnable
+{
+  boolean going = false;
+  Thread animThread = null;
+  int SPEED = 5;
+  int circleX = 0;
+  int circleY = 0;
+  int circleXold = 0;
+  int circleYold = 0;
+  int circleXdelta = 0;
+  int circleYdelta = 0;
+  int circleDiameter = 0;
+  int autoCircleX = 0;
+  int autoCircleY = 0;
+  int autoCircleXold = 0;
+  int autoCircleYold = 0;
+  int autoCircleXdelta = (int) (0.66 * SPEED);
+  int autoCircleYdelta = (int) (1.33 * SPEED);
+  int boardWidth = 0;
+  int boardHeight = 0;
+  int CIRCLE_SIZE = 5;
+
+  private Graphics appletGraphics;
+
+  // Update the circles' location values.
+  private void moveCircles()
+  {
+    circleX += circleXdelta;
+    if (circleX < 0)
+      circleX = 0;
+    if (circleX > boardWidth - circleDiameter)
+      circleX = boardWidth - circleDiameter;
+
+    circleY += circleYdelta;
+    if (circleY < 0)
+      circleY = 0;
+    if (circleY > boardHeight - circleDiameter)
+      circleY = boardHeight - circleDiameter;
+
+    autoCircleX += autoCircleXdelta;
+    if (autoCircleX < 0)
+      {
+        autoCircleX = 0;
+        autoCircleXdelta = -autoCircleXdelta;
+      }
+    if (autoCircleX > boardWidth - circleDiameter)
+      {
+        autoCircleX = boardWidth - circleDiameter;
+        autoCircleXdelta = -autoCircleXdelta;
+      }
+
+    autoCircleY += autoCircleYdelta;
+    if (autoCircleY < 0)
+      {
+        autoCircleY = 0;
+        autoCircleYdelta = -autoCircleYdelta;
+      }
+    if (autoCircleY > boardHeight - circleDiameter)
+      {
+        autoCircleY = boardHeight - circleDiameter;
+        autoCircleYdelta = -autoCircleYdelta;
+      }
+  }
+
+  // Clear the circle in the old location and paint a new circle
+  // in the new location.
+  private void paintCircles()
+  {
+    appletGraphics.setColor(Color.BLUE);
+    appletGraphics.fillOval(circleXold, circleYold, circleDiameter,
+                            circleDiameter);
+    appletGraphics.setColor(Color.YELLOW);
+    appletGraphics.fillOval(circleX, circleY, circleDiameter,
+                            circleDiameter);
+
+    appletGraphics.setColor(Color.BLUE);
+    appletGraphics.fillOval(autoCircleXold, autoCircleYold, circleDiameter,
+                            circleDiameter);
+    appletGraphics.setColor(Color.WHITE);
+    appletGraphics.fillOval(autoCircleX, autoCircleY, circleDiameter,
+                            circleDiameter);
+  }
+
+  // Override Applet.run.
+  public void run()
+  {
+    while (animThread != null)
+      {
+        circleXold = circleX;
+        circleYold = circleY;
+        autoCircleXold = autoCircleX;
+        autoCircleYold = autoCircleY;
+
+        moveCircles();
+        paintCircles();
+
+        if (animThread != null)
+          {
+            try
+              {
+                Thread.sleep(20);
+              }
+            catch (InterruptedException e)
+              {
+              }
+          }
+      }
+  }
+
+  // Override Applet.paint.
+  public void paint(Graphics g)
+  {
+    boardWidth = this.getSize().width;
+    boardHeight = this.getSize().height;
+    g.setColor(Color.BLUE);
+    g.fillRect(0, 0, boardWidth, boardHeight);
+    if (!going)
+      {
+        FontMetrics fm = appletGraphics.getFontMetrics();
+        appletGraphics.setColor(Color.WHITE);
+        String msg = "Click to Start";
+        appletGraphics.drawString(msg,
+                                  (boardWidth >> 1) - (fm.stringWidth(msg) >> 1),
+                                  (boardHeight >> 1) - (fm.getHeight() >> 1));
+      }
+  }
+
+  // Override Applet.destroy.
+  public void destroy()
+  {
+    // animThread.stop();
+    animThread = null;
+  }
+
+  // Override Applet.init.
+  public void init()
+  {
+    boardWidth = this.getSize().width;
+    boardHeight = this.getSize().height;
+    going = false;
+    appletGraphics = getGraphics();
+    appletGraphics.setFont(new Font(appletGraphics.getFont().getName(),
+                                    Font.BOLD, 15));
+  }
+
+  // Override Component.preferredSize for when we're run standalone.
+  public Dimension preferredSize ()
+  {
+    return new Dimension (400, 400);
+  }
+
+  // Override Applet.handleEvent, the old-style AWT-event handler.
+  public boolean handleEvent(Event event)
+  {
+    switch (event.id)
+      {
+      case Event.MOUSE_DOWN:
+        if (!going)
+          {
+            going = true;
+            circleDiameter = boardWidth / CIRCLE_SIZE;
+            circleX = (boardWidth - circleDiameter) >> 1;
+            circleY = (boardHeight - circleDiameter) >> 1;
+            circleXdelta = 0;
+            circleYdelta = 0;
+            repaint();
+            animThread = new Thread(this);
+            animThread.start();
+          }
+        break;
+      case Event.KEY_ACTION:
+      case Event.KEY_PRESS:
+        if (event.key == Event.LEFT)
+          circleXdelta = -SPEED;
+        else if (event.key == Event.RIGHT)
+          circleXdelta = SPEED;
+        else if (event.key == Event.UP)
+          circleYdelta = -SPEED;
+        else if (event.key == Event.DOWN)
+          circleYdelta = SPEED;
+        break;
+      case Event.KEY_ACTION_RELEASE:
+      case Event.KEY_RELEASE:
+        if (event.key == Event.LEFT && circleXdelta < 0)
+          circleXdelta = 0;
+        else if (event.key == Event.RIGHT && circleXdelta > 0)
+          circleXdelta = 0;
+        else if (event.key == Event.UP && circleYdelta < 0)
+          circleYdelta = 0;
+        else if (event.key == Event.DOWN && circleYdelta > 0)
+          circleYdelta = 0;
+        break;
+      default:
+        break;
+      }
+    return false;
+  }
+}