package kandata.launcher;

import java.io.*;
import java.util.*;
import java.awt.Image;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;

/**
 * サイトのプロパティ.
 * JPanelとして作成し、JOptionPaneを使って表示する。
 */
class SiteInfoPane extends JPanel implements ChangeListener {
	JTextField nameField;
	JTextField descField;
	JTextField urlField;
	JTextField clientTypeField;
	JTextField versionField;
	JCheckBox clientTypeCheck;
	JCheckBox versionCheck;
	JButton ok;
	JButton cancel;
	Image image;
	Site site;

	SiteInfoPane() {
		nameField       = new JTextField();
		descField       = new JTextField();
		urlField        = new JTextField();
		clientTypeField = new JTextField();
		versionField    = new JTextField();
		clientTypeCheck = new JCheckBox("クライアントタイプ");
		clientTypeCheck.addChangeListener(this);
		versionCheck    = new JCheckBox("バージョン");
		versionCheck.addChangeListener(this);
		setLayout(new GridLayout(11, 1, 5,5));
		add(new JLabel("名前"));
		add(nameField);
		add(new JLabel("詳細な説明"));
		add(descField);
		add(new JLabel("URL"));
		add(urlField);
		add(clientTypeCheck);
		add(clientTypeField);
		add(versionCheck);
		add(versionField);
//		add(new JLabel("セキュリティ管理"));
//		add(new JLabel("意匠製作中 (^^;"));
//		add(new JButton(new RegistFromClipboard(this)));	// 親切な構想
//		setBorder(new EmptyBorder(10,10,10,10));
	}
	void setSite(Site site) {
		this.site = site;
		nameField.setText(site.getName());
		descField.setText(site.getDesc());
		urlField.setText(site.getUrl());
		if (site.getClientType() != null) {
			clientTypeCheck.setSelected(true);
			clientTypeField.setText(site.getClientType());
			clientTypeField.setEditable(true);
		}
		else {
			clientTypeCheck.setSelected(false);
			clientTypeField.setText("");
			clientTypeField.setEditable(false);
		}
		if (site.getVersion() != null) {
			versionCheck.setSelected(true);
			versionField.setText(site.getVersion());
			versionField.setEditable(true);
		}
		else {
			versionCheck.setSelected(false);
			versionField.setText("");
			versionField.setEditable(false);
		}
		image = site.getIcon();
	}
	Site getSite() {
		return new Site(
			urlField.getText(),
			(clientTypeCheck.isSelected() ? clientTypeField.getText() : null),
			(versionCheck.isSelected() ? versionField.getText() : null),
			nameField.getText(),
			descField.getText(),
			image);
	}

	/** リスナーの対象の状態が変更されたときに呼び出されます。ChangeListener interface */
	public void stateChanged(ChangeEvent e) {
		if ( e.getSource() == clientTypeCheck ) {
			clientTypeField.setEditable(clientTypeCheck.isSelected());
		}
		else if ( e.getSource() == versionCheck ) {
			versionField.setEditable(versionCheck.isSelected());
		}
	}
	/** JOptionPaneを使ってダイアログを表示する. */
	static Site showModal(Component parent, String title, Site site) {
		SiteInfoPane pane = new SiteInfoPane();
		if (site != null) {
			pane.setSite(site);
		}
//		int rc = JOptionPane.showConfirmDialog(parent, pane, title,
//						JOptionPane.OK_CANCEL_OPTION,
//						JOptionPane.PLAIN_MESSAGE, null);
		pane.setBorder(new EmptyBorder(10, 10, 10,10));
		JTabbedPane tab = new JTabbedPane();
		tab.addTab("一般", pane);
		tab.addTab("セキュリティ", new JLabel("FIXME", JLabel.CENTER));
		int rc = JOptionPane.showConfirmDialog(parent, tab, title,
						JOptionPane.OK_CANCEL_OPTION,
						JOptionPane.PLAIN_MESSAGE, null);
		if (rc == JOptionPane.CANCEL_OPTION) return null;
		return pane.getSite();
	}

	/** クリップボードから一発登録 */
	class RegistFromClipboard extends AbstractAction {
		SiteInfoPane pane;
		public RegistFromClipboard(SiteInfoPane pane) {
			super("クリップボードから一発登録");
			this.pane = pane;
			
		}
		/** アクションが発生すると呼び出されます。 */
		public void actionPerformed(ActionEvent e) {
			// クリップボードから文字列を取得
			Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
			Transferable t = c.getContents(this); // ほとんどの場合、thisでよい。
			try {
				String s = (String) t.getTransferData(DataFlavor.stringFlavor);
				System.out.println("ペーストされた文字列は:"+s);
				// 文字列をプロパティに入れる
				Properties prop = new Properties();
				BufferedReader reader = null;
				try {
					reader = new BufferedReader(new StringReader(s));
					while (reader.ready()) {
						String line = reader.readLine();
						if (line == null) break;
						int pos = line.indexOf('=');
						String key   = line.substring(0, pos);
						String value = line.substring(pos+1);
						System.out.println("key=["+key+"] value=["+value+"]");
						prop.put(key, value);
					}
				}
				finally {
					if (reader == null) reader.close();
				}
				// 必要な情報を取得
				String name = prop.getProperty("Name");
				String desc = prop.getProperty("Desc");
				String url  = prop.getProperty("Url");
				String clientType = prop.getProperty("ClientType");
				String version = prop.getProperty("Version");
				String iconUrl = prop.getProperty("IconUrl");
				System.out.println(name);
				System.out.println(desc);
				System.out.println(url);
				System.out.println(clientType);
				System.out.println(version);
				System.out.println(iconUrl);
				if (name==null || url==null ) {
					JOptionPane.showMessageDialog(pane, "クリップボードからの読み込みに失敗しました", 
							"クリップボードから一発登録", JOptionPane.ERROR_MESSAGE);
					return;
				}
				// 取得した文字列を各コンポーネントに設定する
				setSite(new Site(url, clientType, version, name, desc, null));	// TODO: iconUrlからIconを取得する
			}
			catch (Exception ex) {
				ex.printStackTrace();
				//Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(pane, "クリップボードからの読み込みに失敗しました", "クリップボードから一発登録", JOptionPane.ERROR_MESSAGE);
			}
		}
	}



}

/*
	クリップボードの文字列のサンプル
Name=会議室予約システム(localhost)
Desc=ちょっと役に立ちそうなサンプルです
Url=http://localhost:8080/kandata-roomreservation/servlet/kandata.server.http.ServletServer
Icon=
*/
