import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

/**
 * Das Fenster, in dem das Hanoi-Spiel dargestellt wird.
 * Hier sollte nichts verändert werden.
 *
 * @version 10.10.2020
 * @author Rainer Helfrich
 */
public class HanoiFrame extends JFrame {

    JPanel jPanel1;

    public HanoiFrame(HanoiGame g) { 
        // Frame-Initialisierung
        super();
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        int frameWidth = 900; 
        int frameHeight = 500;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2;
        setLocation(x, y);
        setTitle("Türme von Hanoi");
        setResizable(false);
        Container cp = getContentPane();
        cp.setLayout(null);
        // Anfang Komponenten

        jPanel1 = new HanoiPanel(g);
        jPanel1.setBounds(0, 0, frameWidth, frameHeight);
        jPanel1.setOpaque(true);
        cp.add(jPanel1);

        // Ende Komponenten

        setVisible(true);
    } // end of public FreecellFrame

    

    public void neuZeichnen()
    {
        jPanel1.paintImmediately(0, 0, getWidth(), getHeight());
        try
        {
            Thread.sleep(100);
        }
        catch(Exception x)
        {
        }
    }
    // Ende Methoden
    private class HanoiPanel extends JPanel implements MouseListener{

        HanoiGame dasSpiel;
        Scheibe markiert;
        int fromStack;

        public HanoiPanel(HanoiGame g)
        {
            super( null, true);
            dasSpiel = g;
            addMouseListener(this);
            markiert = null;
        }
        
        

        public void paint(Graphics g) {

            g.setColor(new Color(180, 180, 180));
            g.fillRect(0,0,getWidth(),getHeight());
            g.setColor(Color.BLACK);
            g.fillRect(10, getHeight()-100, 840, 20);
            for (int i = 0; i < 3; i++)
            {
                g.setColor(Color.BLACK);
                g.fillRect(145+i*280, 60, 10, getHeight()-160);
                int hoehe = dasSpiel.getTurmHoehe(i);
                hoehe--;
                int baseY = getHeight()-120-20*hoehe;
                while(hoehe >= 0)
                {
                    Scheibe s = dasSpiel.getNteScheibe(i, hoehe);
                    int y = baseY + 20*hoehe;
                    if (markiert == s)
                    {
                        y = 30;
                    }
                    s.zeichne(g, 150+280*i, y);
                    hoehe--;
                }
            }
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mouseClicked(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e){
        }

        public void mousePressed(MouseEvent e){
        }

        private int getArea(Point p)
        {
            return (int)p.getX()/(getWidth()/3);
        }

        public void mouseReleased(MouseEvent e)
        {
            int stack = getArea(e.getPoint());
            if (markiert == null)
            {
                if (dasSpiel.getTurmHoehe(stack) > 0)
                {
                    markiert = dasSpiel.getNteScheibe(stack, 0);
                    fromStack = stack;
                    repaint();
                }
            }
            else
            {
                if (fromStack == stack || dasSpiel.bewegeScheibe(fromStack, stack))
                {
                    markiert = null;
                }
                repaint();
            }
        }
    }
} 
