/*
Datei............: Aufg1420.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 26.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.20
Kommentare.......:

Dieses Programm zeigt die Implementierung eines einfachen
Splashscreens, der für 4 Sekunden auf dem Bildschirm angezeigt
wird. Die Darstellung erfolgt mit Hilfe der aus Window abgeleiteten
Klasse SplashScreen, die in der Methode showSplashScreen 
instanziert wird. Um das Event-Handling des SplashScreens während
der Wartezeit nicht zu beeinträchtigen und auch ein Beenden mit
der Maus oder Tastatur zu ermöglichen, wird durch Instanziren 
eines Objekts der Klasse WindowKiller ein Hintergrundprozess
gestartet, der nach Ablauf der Zeit den SplashScreen vom Bildschirm
entfernt.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1420
extends Frame
{
  public static void main(String[] args)
  {
	Aufg1420 wnd = new Aufg1420();
	wnd.setSize(300, 200);
	wnd.setVisible(true);
	wnd.showSplashScreen();
  }

  public Aufg1420()
  {
	super("Aufg1420");
	addWindowListener(
      new WindowAdapter() {
	    public void windowClosing(WindowEvent event) {
		  System.exit(0);
		}
	  }
	);
	setBackground(Color.lightGray);
  }

  public void showSplashScreen()
  {
	SplashScreen wnd = new SplashScreen(this);
	wnd.setVisible(true);
  }
}

/**
 * Die Klasse SplashScreen ist eine Ableitung aus der Klasse und
 * stellt damit zunächst ein rahmenloses Fenster dar, das dazu
 * verwendet, den Namen des Programms, seiner Version und diverse
 * andere Informationen auszugeben. Zur Verbesserung der Optik 
 * wurde das Fenster mit einem eigenen 3D-Rahmen versehen. Der
 * SplashScreen kann durch Mausklick oder Tastendruck beendet
 * werden. Ohne Anwenderaktivitäten wird er nach spätestens 
 * 4 Sekunden durch den WindowKiller-Task beendet.
 */
class SplashScreen
extends Window
{
  //Ausgabetexte, -größen und -farben
  static final String STRINGS[] = {
	"SplashScreen",
	"Version 1.0",
	"",
	"Copyright (C) 1997",
	"Guido Krüger, Itzehoe",
	"",
	"Alle Rechte vorbehalten."
  };
  static final int SIZES[] = {
	48,
	24,
	14,
	14,
	14,
	10,
	10
  };
  static final Color COLORS[] = {
	Color.blue,
	Color.blue,
	Color.black,
	Color.black,
	Color.black,
	Color.black,
	Color.black
  };

  public SplashScreen(Frame owner)
  {
	super(owner);
	//Größe und Position des Fensters bestimmen
	Dimension screensize = getToolkit().getScreenSize();
	setLocation(screensize.width / 3, screensize.height / 6);
	setSize(screensize.width / 3, screensize.height / 3);
	//Fenster auf Tastendruck entfernen
    addKeyListener(
       new KeyAdapter() {
          public void keyPressed(KeyEvent event) {
            setVisible(false);
            dispose();
          }
       }
    );
	//Fenster auf Mausklick entfernen
    addMouseListener(
       new MouseAdapter() {
          public void mouseClicked(MouseEvent event) {
            setVisible(false);
            dispose();
          }
       }
    );
	//Hintergrundfarbe ist grau
	setBackground(Color.lightGray);
  }

  public void setVisible(boolean b)
  {
	super.setVisible(true);
	requestFocus();
	new WindowKiller(this, 4000);
  }

  public void paint(Graphics g)
  {

	int width = getSize().width;
	int height = getSize().height;
	//Rahmen zeichnen
	twoColorFrame(g, 0, Color.lightGray, Color.lightGray);
	twoColorFrame(g, 1, Color.white, Color.darkGray);
	twoColorFrame(g, 4, Color.darkGray, Color.white);
	//Beschriftung ausgeben
	int ypos = 10;
	for (int i = 0; i < STRINGS.length; ++i) {
	  g.setColor(COLORS[i]);
	  g.setFont(new Font("Serif", Font.PLAIN, SIZES[i]));
	  FontMetrics fm = g.getFontMetrics();
	  g.drawString(STRINGS[i], 10, ypos + fm.getAscent());
	  ypos += fm.getHeight();
	}
  }

  /**
   * Zeichnet einen zweifarbigen Rahmen, der auf der oberen und linken
   * Seite die Farbe col1 und auf der unteren und rechten Seite die
   * Farbe col2 hat, im Abstand von offs Pixeln vom Fensterrand entfernt.
   */
  private void twoColorFrame(Graphics g, int offs, Color col1, Color col2)
  {
	int width = getSize().width;
	int height = getSize().height;
	
	g.setColor(col1);
	g.drawLine(offs, offs, width - offs, offs); //oben
	g.drawLine(offs, offs, offs, height - offs); //links
	g.setColor(col2);
	g.drawLine(width - offs, offs, width - offs, height - offs); //rechts
	g.drawLine(offs, height - offs, width - offs, height - offs); //unten
  }
}


/**
 * Die Klasse WindowKiller dient dazu, ein Fenster nach eine vorgegebenen
 * Zeit vom Bildschirm zu entfernen. Dazu instanziert sie einen Thread,
 * der im Hintergrund wartet, bis die eingestellte Zeit abgelaufen ist
 * und dann das Fenster durch Aufruf von setVisible und dispose vom
 * Bildschirm entfernt.
 */
class WindowKiller
extends Thread
{
  Window wnd;
  int time;

  public WindowKiller(Window wnd, int time)
  {
	this.wnd = wnd;
	this.time = time;
	start();
  }

  public void run()
  {
	try {
	  Thread.sleep(time);
	} catch (InterruptedException e) {
	  //nothing
	}
	if (wnd.isVisible()) {
	  wnd.setVisible(false);
	  wnd.dispose();
	}
  }
}

