/** Paints a loading screen to show progress with downloading jar files. */
  private synchronized void update() {
    if (splashScreenImageGraphics == null) {
      // create splash screen image for fast drawing
      width = parentApplet.getWidth();
      height = parentApplet.getHeight();
      if (width <= 0 || height <= 0) return;

      splashScreenImage = parentApplet.createImage(width, height);
      if (splashScreenImage != null) {
        splashScreenImageGraphics = splashScreenImage.getGraphics();

        // load splash image and animated progress image
        splashImage = parentApplet.getImage(AppletSplashScreen.class.getResource("splash.png"));
        progressImage = parentApplet.getImage(AppletSplashScreen.class.getResource("spinner.gif"));
      } else {
        // we couldn't get splashScreenImageGraphics
        return;
      }
    }

    Graphics2D g = (Graphics2D) splashScreenImageGraphics;

    // white background
    g.setColor(Color.white);
    g.clearRect(0, 0, width, height);

    // splash image position
    int splashX = -1;
    int splashY = -1;
    if (splashImage != null) {
      splashX = (width - SPLASH_IMAGE_WIDTH) / 2;
      splashY = (height - SPLASH_IMAGE_HEIGHT) / 2 - (int) (1.5 * PROGRESS_IMAGE_HEIGHT);
    }

    // progress image position
    int progressX = (width - PROGRESS_IMAGE_WIDTH) / 2;
    int progressY = (height - PROGRESS_IMAGE_HEIGHT) / 2;

    // Splash image fits into content pane: draw splash image
    if (splashX >= 0 && splashY >= 0) {
      g.drawImage(splashImage, splashX, splashY, this);

      // put progress image below splash image
      progressY = splashY + SPLASH_IMAGE_HEIGHT;
    }

    // draw progress image
    g.drawImage(progressImage, progressX, progressY, this);
  }
  public AppletSplashScreen(GeoGebraApplet parentApplet) {
    this.parentApplet = parentApplet;

    // update splash screen image and paint it
    update();
    parentApplet.repaint();
  }
  /**
   * Updates the progress image (animated gif) in the SplashScreen loading. Implements
   * ImageObserver.
   */
  public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
    // stop after dispose() was called
    if (dispose) return false;

    // repaint applet to update progress image
    update();
    parentApplet.repaint();
    return true;
  }