package org.geogebra.desktop; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.ImageObserver; import org.geogebra.common.GeoGebraConstants; import geogebra.GeoGebraApplet; /** * Loading screen in applet that shows the GeoGebra logo and a percentage * progress while downloading jar files. */ public class AppletSplashScreen implements ImageObserver { // splash screen settings private static final int SPLASH_IMAGE_WIDTH = 320; private static final int SPLASH_IMAGE_HEIGHT = 106; private static final int PROGRESS_IMAGE_WIDTH = 16; private static final int PROGRESS_IMAGE_HEIGHT = 16; // splash screen stuff private Image splashImage, progressImage; private Image splashScreenImage; private Graphics splashScreenImageGraphics; private int width, height; private GeoGebraApplet parentApplet; private boolean dispose = false; public AppletSplashScreen(GeoGebraApplet parentApplet) { this.parentApplet = parentApplet; // update splash screen image and paint it update(); parentApplet.repaint(); } public void dispose() { dispose = true; splashScreenImage = null; splashScreenImageGraphics = null; splashImage = null; progressImage = null; } /** * 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(GeoGebraConstants.SPLASH_STRING)); 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 Image getImage() { return splashScreenImage; } public boolean isReady() { return splashScreenImageGraphics != null; } /** * Updates the progress image (animated gif) in the SplashScreen loading. * Implements ImageObserver. */ @Override 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; } }