package asandatabasebrowser.view;

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

import asandatabasebrowser.Global;


import java.awt.Toolkit;
import java.awt.datatransfer.*;

/**
 * 通常のJTableに、全選択(Control-A)とクリップボードへのコピー(Control-C)ができるようにした.
 * 
 * @author Asan
 */
public class RitchTable extends JTable {


	public RitchTable() {
		init();
	}
	/** 2 次元配列 rowData の値を表示する JTable を、列名 columnNames で構築します。 */
	public RitchTable(Object[][] rowData, Object[] columnNames) {
		super(rowData, columnNames);
		init();
	}
	void init() {
//		getTableHeader().addMouseListener(new DbTableMouseListener());
		// アクションマップとインプットマップを登録
		ActionMap actionmap = new ActionMap();
		actionmap.put("copy", new CopyClipboardAction(this));
		actionmap.put("select-all", new SelectAllAction(this));
		SwingUtilities.replaceUIActionMap(this, actionmap);
		InputMap inputmap = new InputMap();
		inputmap.put(KeyStroke.getKeyStroke('C', Event.CTRL_MASK), "copy");   // Ctrl+C
		inputmap.put(KeyStroke.getKeyStroke('A', Event.CTRL_MASK), "select-all");   // Ctrl+A
		SwingUtilities.replaceUIInputMap(this, JComponent.WHEN_FOCUSED, inputmap);
	}
/*
JTable() {
          デフォルトデータモデル、デフォルト列モデル、およびデフォルト選択モデルで初期化される、デフォルトの JTable を構築します。 
JTable(int numRows, int numColumns) 
          DefaultTableModel を使って、空のセルの numRows と numColumns で JTable を構築します。 
JTable(TableModel dm) 
          データモデル dm、デフォルト列モデル、およびデフォルト選択モデルで初期化される JTable を構築します。 
JTable(TableModel dm, TableColumnModel cm) 
          データモデル dm、列モデル cm、およびデフォルト選択モデルで初期化される JTable を構築します。 
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) 
          データモデル dm、列モデル cm、および選択モデル sm で初期化される JTable を構築します。 
JTable(Vector rowData, Vector columnNames)  
*/

	class CopyClipboardAction extends AbstractAction {
		JTable table;
		public CopyClipboardAction(JTable table) {
			super("コピー(C)");
			putValue(SHORT_DESCRIPTION, "コピー");
			putValue(LONG_DESCRIPTION, "コピー");
			putValue(MNEMONIC_KEY, new Integer('C'));
			putValue(SMALL_ICON, Global.getImageIcon("/resources/eclipse_EditCopy.png"));
			this.table = table;
		}

		public void actionPerformed(ActionEvent ev) {
			System.out.println("CopyClipboardAction");
			String data = "";
			int[] cols = table.getSelectedColumns();
			int[] rows = table.getSelectedRows();
			for (int row=0; row<rows.length; row++) {
				String line = null;
				for (int col=0; col<cols.length; col++) {
					if (table.isCellSelected(rows[row], cols[col])) {
						Object val = table.getValueAt(rows[row], cols[col]);
						if (line==null) line = ""+val; else line += "\t" + val;
System.out.println(val);
					}
				}
				data += line + "\n";
			}
			// クリップボードにコピー
			StringSelection ss = new StringSelection(data);
			Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,ss);
		}
	}

	public class SelectAllAction extends AbstractAction {
		JTable table;
		public SelectAllAction(JTable table) {
			super("すべてを選択(A)");
			putValue(MNEMONIC_KEY, new Integer('A'));
			putValue(SHORT_DESCRIPTION, "全選択");
			putValue(LONG_DESCRIPTION, "全選択");
			this.table = table;
		}

		public void actionPerformed(ActionEvent ev) {
			System.out.println("SelectAllAction");
			table.selectAll();
		}
	}


}


