// $Id: Puzzle.java,v 1.5 2004/06/14 20:48:27 m31 Exp $
//
// This file is part of the program suite "Principia Mathematica II"
// which is a working prototype for the main project:
// "Hilbert II" - http://www.qedeq.org
//
// Copyright 2001-2004  Michael Meyling <mime@qedeq.org>.
//
// "Principia Mathematica II" 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 of the License, or (at your option) any later version.
//
// This program 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.

package com.meyling.principia.gui.puzzle;


import java.awt.Color;
import java.awt.Dimension;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.meyling.principia.log.Trace;


/**
 * Info window.
 *
 * @version     $Revision: 1.5 $
 * @author      Michael Meyling
 */
public class Puzzle extends JFrame {

    private final Field field;
    private final RollingMessages wow1;
    private final RollingMessages wow2;
    private final JLabel label;


    public Puzzle() {

        final int w = 600;
        final int h = 400;
        this.setSize(new Dimension(w, h + 45));

        this.getContentPane().setLayout(null);
        addNotify();

        field = new Field(this, w / 20, h / 20, w * 18/20, h * 16 / 20 );
        this.getContentPane().add(field);

        wow1 = new RollingMessages(new String[] {
                "Daniel Ehlke",
                "Michael Meyling",
            });
/*
        wow2 = new RollingMessages("Die graue Fläche muss mit den bunten Teilen gefüllt werden. "
            + "Dabei können die Teile mit einem linken Mausklick angehoben und abgesetzt werden. "
            + "Ein angehobenenes Teil kann durch einen rechten Mausklick gedreht werden. "
            + "Wenn alle Teile ihre Endposition eingenommen haben und alles Grau "
            + "verschwunden ist, dann ist das Ziel erreicht...                             "
            + "                                                                            "
            + "Viel Erfolg!");
*/
        wow2 = new RollingMessages("Die graue Fläche muss mit den bunten Teilen gefüllt werden. "
        + "Dabei können die Teile mit einem linken Mausklick angehoben und abgesetzt werden. "
        + "Ein angehobenenes Teil kann durch einen rechten Mausklick gedreht werden. "
        + "Wenn alle Teile ihre Endposition eingenommen haben und alles Grau "
        + "verschwunden ist, dann ist das Ziel erreicht...                             ");
        wow1.reshape(w / 20 + (int) field.getSize().getWidth() - 150, h * 18 / 20, 150, 30);
        wow2.reshape(w / 20, h * 18 / 20, (int) field.getSize().getWidth() - 230, 30);
        this.getContentPane().add(wow1);
        this.getContentPane().add(wow2);
        wow1.start();
        wow2.start();

        label = new JLabel("Team");
        label.setForeground(Color.yellow);
        label.reshape(w / 20 + (int) field.getSize().getWidth() - 200, h * 18 / 20 - 1, 70, 30);
        this.getContentPane().add(label);
        setTitle("Belege alle grauen Felder.");
        this.getContentPane().repaint();

        final String METHOD = "Constructor";
        try {
            Sequence sequence = MidiSystem.getSequence(
                this.getClass().getResource(
                "/com/meyling/principia/resources/slow_drag_joplin.mid"));
        
            // Create a sequencer for the sequence
            Sequencer sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequencer.setSequence(sequence);
        
            // Start playing
            sequencer.start();
        } catch (MalformedURLException e) {
            Trace.trace(this, METHOD, e);
        } catch (IOException e) {
            Trace.trace(this, METHOD, e);
        } catch (MidiUnavailableException e) {
            Trace.trace(this, METHOD, e);
        } catch (InvalidMidiDataException e) {
            Trace.trace(this, METHOD, e);
        } catch (RuntimeException e) {
            Trace.trace(this, METHOD, e);
        }
    }


    public static final void main(final String args[]) {
        final Puzzle puzzle = new Puzzle();
        puzzle.show();
    }


    public void repaint() {
        final int w = getSize().width;
        final int h = getSize().height - 45;
        field.reshape(w/20 , h/20 , w * 18 / 20, h * 16 / 20 );
        label.reshape(w / 20 + (int) field.getSize().getWidth() - 200, h * 18 / 20 - 1, 70, 30);
        wow1.reshape(w / 20 + (int) field.getSize().getWidth() - 150, h * 18 / 20, 150, 30);
        wow2.reshape(w / 20, h * 18 / 20, (int) field.getSize().getWidth() - 230, 30);
        super.repaint();
    }


 }
