package asandatabasebrowser.view;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPopupMenu;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;

import net.sourceforge.swingx.SxOptionPane;

import asandatabasebrowser.AsanDatabaseBrowser;
import asandatabasebrowser.model.ColumnInfo;
import asandatabasebrowser.model.ITableInfo;
import asandatabasebrowser.model.ResultInfo;
import asandatabasebrowser.model.ResultSetInfo;
import asandatabasebrowser.model.TableInfo;
import asandatabasebrowser.model.VvDatabase;


/**
 * プロパティのように縦に表示するビュー.
 * 
 * @author Asan
 */
public class DbRecordView extends RitchTable {
	static final Object NO_RECORD = "NO_RECORD";
	// <<model>>
	/** テーブル情報. null可 */
	ITableInfo tableInfo = null;
	/** レコードの値の配列. null可 */
	private Object[] rec = null;	// １レコードのデータ
	
	private DefaultTableModel model = new DefaultTableModel();
	private DbColumnNameRenderer columnNameRenderer;
	private DbColumnValueRenderer columnValueRenderer;

	DbRecordView(final VvDatabase db) {
		assert db != null;
		this.setModel(model);
		addMouseListener(new RecordMouseListener());
		this.getTableHeader().setReorderingAllowed(false); // ヘッダのドラッグは無効 
		this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		this.setColumnSelectionAllowed(true);
		this.setRowSelectionAllowed(true);
		model.addColumn("name");
		model.addColumn("value");
		setToolTipText("れこーど");
		// レンダラー
		columnNameRenderer = new DbColumnNameRenderer(db);
		columnValueRenderer = new DbColumnValueRenderer();
		this.getColumnModel().getColumn(0).setCellRenderer(columnNameRenderer);
		this.getColumnModel().getColumn(1).setCellRenderer(columnValueRenderer);
	}
	/**
	 * 表示するレコードを設定する.
	 * @param tableInfo	レコードの型などの情報。null不可
	 * @param rec		レコードの値の配列。null可
	 */
	public void setRecord(ITableInfo tableInfo, Object[] rec) {
		assert tableInfo != null;
		this.tableInfo = tableInfo;
		this.rec = rec;
		model.setRowCount(tableInfo.getColumnCount());
		for (int i=0; i<tableInfo.getColumnCount(); i++) {
			String name = tableInfo.getColumnName(i);
			model.setValueAt(name, i, 0);
			model.setValueAt(rec!=null ? rec[i]: NO_RECORD, i, 1);
		}
		//model.fireTableDataChanged();	// TODO:これは必要？
	}
	/** マウス位置のセルごとにツールチップの文字列を返す。*/
	public String getToolTipText(MouseEvent e) {
		int col = columnAtPoint(e.getPoint());
		if (col == -1) return null;
		int row = rowAtPoint(e.getPoint());
		if (row == -1) return null;
		//System.out.println("col="+col+" row="+row);
		if (col == 0) {
			if (tableInfo instanceof TableInfo) {
				TableInfo table = (TableInfo) tableInfo;
				ColumnInfo info = table.getColumnInfo(row);
				return table.getDatabase().getToolTipText(table, info);
			}
			else {
				ResultSetInfo table = (ResultSetInfo) tableInfo;
				ResultInfo info = table.getResultInfo(row);
				return table.getDatabase().getToolTipText(info);
			}
		} else {
			if (rec == null) return null;
			Object value = model.getValueAt(row, col);
			if (value == null) return "<html><font color=\"GRAY\">NULL</font></html>";
			return value.toString();
		}
	}
	public boolean 	isCellEditable(int row, int column) {
		 return false;
	}
	/**
	 * カラム名をダブルクリックしたら、カラム情報を開く。
	 */
	class RecordMouseListener extends MouseAdapter {
		public void mouseClicked(MouseEvent e) {
			//System.out.println(e);
			try {
				// 左ボタンがダブルクリックされたら、LargeObjectの場合、その内容を表示する。
				if (e.getClickCount()==2 && (e.getModifiers()&MouseEvent.BUTTON1_MASK)!=0) {
					int col = columnAtPoint(e.getPoint());
					if (col == -1) return;
					int row = rowAtPoint(e.getPoint());
					if (row == -1) return;
					//System.out.println("col="+col+" row="+row);
					if (col==1) {
						Object data = getValueAt(row, col);
						//　BLOB/CLOBなどのとき、内容を表示する。 
						AsanDatabaseBrowser.theApp.openLargeObject(data, tableInfo, rec, row);
					}
				}
			}
			catch (Exception ex) {
				AsanDatabaseBrowser.theApp.showMessage(DbRecordView.this, "エラーが発生しました", ex, SxOptionPane.ERROR_MESSAGE);
			}
		}
		public void mouseReleased(MouseEvent e) {
			// ポップアップメニューを表示する。
			if (e.isPopupTrigger()) {
				mousePopup(e);
			}
		}
		public void mousePressed(MouseEvent e) {
			// ポップアップメニューを表示する。
			if (e.isPopupTrigger()) {
				mousePopup(e);
			}
		}
		void mousePopup(MouseEvent e) {
			//System.out.println("Popup!");
			JPopupMenu popup = new JPopupMenu();
			popup.add(new CopyClipboardAction(DbRecordView.this));
			popup.add(new SelectAllAction(DbRecordView.this));
//			if (data.tableInfo instanceof TableInfo) {
//				popup.addSeparator();
//				popup.add(new CreateInsertAction(VerticalViewer.theApp, DbRecordView.this));
//				popup.add(new CreateUpdateAction(VerticalViewer.theApp, DbRecordView.this));
//			}
			popup.show(DbRecordView.this, e.getX(), e.getY());
		}
	}
}


