import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.Timer;

import java.util.*;

/**
 * @author Remi Forax
 *
 */
public class Memory {

  private String card;
  private JToggleButton toggle;
  
  public void select(final JToggleButton button,final String cardText) {
    if (toggle==null) {
      assert card==null;
      
      toggle=button;
      card=cardText;  
    } else {
      
      final JToggleButton toggle=this.toggle;
      final String card=this.card;
      
      final Timer timer=new Timer(300,null);
      timer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          timer.stop();
          if (toggle!=button && card.equals(cardText)) {
            button.setEnabled(false);
            toggle.setEnabled(false);
          } else {
            button.setSelected(false);
            toggle.setSelected(false);
          }
        }
      });
      timer.start();
      
      this.toggle=null;
      this.card=null;
    }
  }

  private static Icon getIcon(String card) {
    ImageIcon icon=new ImageIcon("images/Min"+card+".jpg");
    Image image=icon.getImage().getScaledInstance(100, 166, Image.SCALE_SMOOTH);
    return new ImageIcon(image);
  }

  public static void main(String[] args) {
    
    String[] cards={
      "Chariot","Fool","Libra","Sun"
    };
    
    final Memory memory=new Memory();
    
    Icon back=getIcon("Back");
    
    JToggleButton[] buttons=new JToggleButton[cards.length*2];
    for(int i=0;i<buttons.length;i++) {
      final String card=cards[i/2];
      final JToggleButton button=new JToggleButton(back);
      button.setSelectedIcon(getIcon(card));
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          memory.select(button,card);
        }
      });
      buttons[i]=button;
    }
    
    Collections.shuffle(Arrays.asList(buttons));
    
    JPanel panel=new JPanel();
    for(int i=0;i<buttons.length;i++)
      panel.add(buttons[i]);
    
    JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(panel);
    frame.pack();
    frame.show();
  }
}
