package de.roboshock.gui.util;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;


public class InputDialog extends JDialog {
	
	private static final long serialVersionUID = 1L;
	private boolean retOK = false;

	public InputDialog(Frame parent, String title, JPanel mainPanel) {
		super(parent, true);
		setTitle(title);

		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new FlowLayout());

		JButton go = new JButton("Ok");
		go.addActionListener(new AbstractAction () {
			private static final long serialVersionUID = 1L;
			public void actionPerformed(ActionEvent e) {
	    		closeOK();
	    	}});
		buttonPanel.add(go);
		
		JButton cancel = new JButton("Cancel");
		cancel.addActionListener(new AbstractAction () {
			private static final long serialVersionUID = 1L;
	    	public void actionPerformed(ActionEvent e) {
	    		closeCancel();
	    	}});
		buttonPanel.add(cancel);
		
		JPanel p = new JPanel();
		p.setLayout(new BorderLayout());
		p.add(buttonPanel, BorderLayout.SOUTH);
		p.add(mainPanel, BorderLayout.CENTER);
		
		getContentPane().add(p);
		
		addCloseOnEscape();
		setupUIManager();
		
		pack();
		this.setLocationRelativeTo(null); // location may be changed again before setVisible()
	}

	
	public void closeOK() {
		retOK = true;
		setVisible(false);
		dispose();
	}
	
	public void closeCancel() {
		retOK = false;
		setVisible(false);
		dispose();
	}
	
	public boolean getInput() {
		setVisible(true);
		return retOK;
	}

	
	// TODO possible via look n feel ?
	private void addCloseOnEscape() {
		ActionListener cancelListener = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				closeCancel();
			}
		};

		int menuShortcutKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        KeyStroke w = KeyStroke.getKeyStroke(KeyEvent.VK_W, menuShortcutKey);
        KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
		JRootPane rootPane = this.getRootPane();
		rootPane.registerKeyboardAction(cancelListener, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
		rootPane.registerKeyboardAction(cancelListener, w, JComponent.WHEN_IN_FOCUSED_WINDOW);
	}
		
	private void setupUIManager() {
		InputMap im = (InputMap)UIManager.get("Button.focusInputMap");
		im.put( KeyStroke.getKeyStroke( "ENTER" ), "pressed" );
		im.put( KeyStroke.getKeyStroke( "released ENTER" ), "released" );
	}
	
	
	
	/**
	 *  Testing / Usage Example
	 */
	public static void main(String[] args) {
		final JTextField name = new JTextField();
		name.setColumns(20);
		final JPasswordField pwd = new JPasswordField();
		pwd.setColumns(20);
		final JTextField nochwas = new JTextField();

		JPanel mp = TablePanel.createTwoColumnPanel(new Component[]{
						new JLabel("Login Data:"), null,
						new JLabel("Name:"), name,
						new JLabel("Passwort:"), pwd,
						new JLabel(""), null,
						new JLabel(""), null,
						new JLabel("A long section headline:"), null,
						new JLabel("Some more:"), nochwas,
						new JLabel(""), null});
						
		boolean ret =  new InputDialog(null, "Dialog", mp).getInput(); 

		if (! ret) {
			System.out.println("Canceled");
		}
		else {
			System.out.println("User: " + name.getText());
			System.out.println("PWD : " + new String(pwd.getPassword()));
		}
	}
}
