/*  This file is part of the source code for 3D-XplorMath-J, Version 1.0 (January 2008).
 *  Copyright (c) 2008 The 3D-XplorMath Consortium (http://3d-xplormath.org).
 *  This source code is released under a BSD License, which allows redistribution   
 *  in source and binary form, with or without modification, provided copyright
 *  and license information are included, and with no warranty or guarantee of
 *  any kind.  For details, see http://3d-xplormath.org/j/source/BSDLicense.txt
 */
 
 package vmm3d.xm3d;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.KeyStroke;

import vmm3d.core.Display;
import vmm3d.core.Exhibit;
import vmm3d.core.I18n;
import vmm3d.core.View;

/**
 * A Display class for use in the 3DXM application, with a few extra features.
 */
public class DisplayXM extends Display {
	
	private static String backgroundURL = "vmm3d/resources/splash_background.jpeg";
	   // The background image is loaded from this URL (which is
	   // meant to reference a resource file in the application's
	   // jar file.
	
	private static boolean firstWindow = true;
	private volatile Image splashBackground;
	
	/**
	 * This constructor sets up handlers for several keystrokes, which will
	 * be processed by a DisplayXM whenever it is in a focussed window.
	 * Control-period, Meta-period, and Escape will cause any ongoing
	 * animation to be stopped.  The space bar will pause/unpause any
	 * ongoing animation.  Also, the first DisplayXM that is created
	 * will show a background image and greeting message until the first
	 * exhibit is installed.
	 */
	public DisplayXM() {
		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
				KeyStroke.getKeyStroke("control PERIOD"), "reset");
		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
				KeyStroke.getKeyStroke("meta PERIOD"), "reset");
		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
				KeyStroke.getKeyStroke("ESCAPE"), "reset");
		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
				KeyStroke.getKeyStroke("SPACE"), "pause");
		getActionMap().put("reset",new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				stopAnimation();
			}
		});
		getActionMap().put("pause", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				toggleAnimationPaused();
			}
		});
		if (firstWindow) {
			try {
				java.net.URL imageURL = getClass().getClassLoader().getResource(backgroundURL);
				if (imageURL != null)
					splashBackground = Toolkit.getDefaultToolkit().createImage(imageURL);
			}
			catch (Exception e) {
			}
			firstWindow = false;
		}
	}
	
	public static void noSplash() {  // called from MainForWebStart.java, LauncherApplet.java, EmbeddedApplet.java to surpress the spassh screen in the first window.
		firstWindow = false;
	}
	
	public void install(View view, Exhibit exhibit) {
		super.install(view, exhibit);
		if (getExhibit() != null)
			splashBackground = null;
	}


	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (getStatus() == STATUS_EMPTY) {
			if (splashBackground != null) {
				g.drawImage(splashBackground,0,0,getWidth(),getHeight(),this);
				showWelcomeMessage(g);
			}
			else {
				g.setColor(Color.red);
				g.drawString(I18n.tr("3dxm.DisplayXM.SelectExhibitMessage"), 15, 30);
			}
		}
	}
	
	private void showWelcomeMessage(Graphics g) {
		g.setFont(new Font("Serif",Font.BOLD,18));
		String message = I18n.tr("3dxm.DisplayXM.WelcomeMessage");
		String version = I18n.tr("application.nameAndVersion");
		String[] msg = message.split("\n");
		String[] lines = new String[msg.length + 1];
		lines[0] = version;
		for (int i = 0; i < msg.length; i++)
			lines[i+1] = msg[i];
		FontMetrics fm = g.getFontMetrics();
		int lineheight = fm.getAscent() + fm.getDescent() + fm.getLeading() + 12;
		int y = fm.getAscent() + (getHeight() - lineheight*lines.length)/2;
		int width = 0;
		for (int i = 0; i < lines.length; i++) {
			int linewidth = fm.stringWidth(lines[i]);
			if (linewidth > width)
				width = linewidth;
		}
		int x = (getWidth() - width)/2;
		g.setColor(Color.RED);
		for (int i = 0; i < lines.length; i++) {
			g.drawString(lines[i], x + (width-fm.stringWidth(lines[i]))/2, y);
			y += lineheight;
		}
	}
	
	
	
	
}

 

Ads help maintain this website.