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

import java.io.*;
import java.awt.event.*;



public class MineSweeper {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		fenster f = new fenster();
         f.setVisible(true);

	}

}

class fenster extends JFrame implements IVerwaltung {
	int zus=19;//Anzahl der Zeilen und Spalten
	int banz=8;//Bombenanzahl
	Button[][] c; //buttons

    public fenster() {
      this.setSize(800,600);
      setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      System.out.println("fenster");
      this.setTitle("MineSweeper");
      setGUI();
    }

	void setGUI(){
		//eintragen der Gui-elemente
		this.getContentPane().setLayout( new GridBagLayout() );

	//create && add jpanel
		JPanel pan = new JPanel();
		pan.setLayout(new GridBagLayout());
		this.getContentPane().add(pan,
				new GridBagConstraints(0, 0, 1, 1, 100.0, 100.0
						,GridBagConstraints.SOUTH , GridBagConstraints.HORIZONTAL,
						new Insets(0,0,0,0), 0, 0));
  //erzeugen und zeichnen der JButtons
  /*
  JButton myFeld[] = new JButton[4];
  for (int i=0; i<4; i++)
    myFeld[i] = new JButton("Hallo");
  */
		c= new Button[zus][zus];
		for(int i=0;i<zus;i++)
		{
			for(int j=0;j<zus;j++)
			{
				c[i][j]= new Button(this);
				c[i][j].setx(i);
				c[i][j].sety(j);
				pan.add(c[i][j],
						new GridBagConstraints(i, j, 1, 1, 1.0, 1.0
								,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
								new Insets(0,0,0,0), 0, 0));
			}
		}
		setbombs();

	}

  public void setKlick(int x, int y) {
    // x y  zeigen auf gedrückten Schalter
    if ( c[x][y].isBomb() ) {
        for(int i=0;i<zus;i++)
        {
          for(int j=0;j<zus;j++)
          {
            if ( c[i][j].isBomb() ) {
             c[i][j].setLabel();
             System.out.println(i+"  "+j);
             c[i][j].setForeground( Color.blue );  // Font
             c[i][j].setBackground( Color.yellow );  // Hintergrund
            }   // if

          }  // for
        }  // for
   }
   else {
        for(int i=-1;i<2;i++)
        {
          for(int j=-1;j<2;j++)
          {
            if ( ! c[x+i][y+j].isBomb() )
             c[x+i][y+j].setLabel();
          }
        }
   }
  } // setKlick


	public void setbombs(){
		int n, p;
		for(int a=0;a<banz;a++){
			n=(int)((zus-1)*Math.random());
			p=(int)((zus-1)*Math.random());
			if(c[n][p].isBomb()){
				a--;
			}
			else
			{
			c[n][p].setBomb();
			if(n>0)
			{
				c[n-1][p].incrementZahl();
				if(p>0)
					c[n-1][p-1].incrementZahl();
				if(p<zus-1)
					c[n-1][p+1].incrementZahl();
			}

			if(n<zus-1)
			{
				c[n+1][p].incrementZahl();
				if(p>0)
					c[n+1][p-1].incrementZahl();
				if(p<zus-1)
					c[n+1][p+1].incrementZahl();
			}
			if(p>0)
				c[n][p-1].incrementZahl();
			if(p<zus-1)
				c[n][p+1].incrementZahl();
		}
		}//for-schleife

	}



}


interface IVerwaltung {
  public void setKlick(int x, int y);
}


class Button extends JButton{
	private boolean bombe,locked;
	private int zahl;
	private int x , y;
  private IVerwaltung verw;

	public void setx(int a){
	x=a;
	}

	public void sety(int a){
	y=a;
	}


  public	Button(IVerwaltung verw){

    this.verw = verw;
		bombe=false;
		zahl=0;
		locked=false;
		this.setLabel(" ");
		/*this.addActionListener(new java.awt.event.ActionListener() {
		    public void actionPerformed(ActionEvent e) {
		      setLabel();
		    }
		  });
      */
    this.addMouseListener(new java.awt.event.MouseAdapter() {

          public void mouseClicked(MouseEvent e) {
            button_mouseClicked(e);
          }
        });
	}


  public int getButton(MouseEvent e) {
        int mode = e.getModifiers();
        if ((mode & e.BUTTON2_MASK) > 0) {
            return 2;
        }
        if ((mode & e.BUTTON3_MASK) > 0) {
            return 3;
        }
        return 1;
    } // getButton

      void button_mouseClicked(MouseEvent e) {
        if (  getButton(e) == 1) {
           if ( e.getClickCount() == 2) {
            //System.out.println("links doppelt");
           }
           if ( e.getClickCount() == 1) {
            System.out.println("links einfach");
            // setLabel();
            verw.setKlick(x,y);
           }
         }
        if (  getButton(e) == 3) {
            popupMenu( e ) ;
            System.out.println("rechts");
         }

      }

  public void setBomb(){
	bombe=true;
}


    	public void popupMenu( MouseEvent me ) {
      		JPopupMenu popup = new JPopupMenu();
	  		//Menueeintrag Oeffnen
      		JMenuItem lkOpen = new JMenuItem("Öffnen");

                    lkOpen.addActionListener(new java.awt.event.ActionListener() {
                      public void actionPerformed(ActionEvent e) {
                        //lk_openFile();
                    }
                     });

      		popup.add(lkOpen);
           popup.show(me.getComponent(),me.getX()+10,me.getY()+100);
       	}//popupMenu



public void setLabel(){
	if (bombe==true){
		this.setLabel("*");
	}
	else{
		this.setLabel(Integer.toString(zahl));
/*		if(zahl==0){
			for(int i=-1;i<2;i=i+2){
				for(int j=-1;j<2;j=j+2){
					super.c[x+i][x+j].setLabel();
				}
			}

		}
		*/
		}


}
public void incrementZahl(){
	zahl++;
}

public boolean isBomb(){
	return bombe;
}

public void lock(){
	locked=true;
}



}  // Button


