package asandatabasebrowser.view;

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JToolBar;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

import asandatabasebrowser.Global;
import asandatabasebrowser.action.ExecuteQueryAction;
import asandatabasebrowser.action.FavoriteSqlAction;
import asandatabasebrowser.action.TabAddAction;
import asandatabasebrowser.action.TabRemoveAction;
import asandatabasebrowser.model.DbData;
import asandatabasebrowser.model.DbException;
import asandatabasebrowser.model.VvDatabase;




/**
 * クエリー結果ビュー
 * <<view>>
 */
public class DbSqlFrame extends JFrame {
	/** null不可 */
	public final VvDatabase db;
	/** null可 */
	public DbData data = null;
	// view
	DbResultSetView tableView = null;
	DbRecordView recordView = null;
	public JTabbedTextArea textarea;
	ExecuteQueryAction queryAction = new ExecuteQueryAction(this);
	
	public DbSqlFrame(VvDatabase db) throws DbException {
		assert db != null;
		setIconImage(Global.getImage("/resources/SQLView.png"));
		this.db = db;

		// ３つのビューを作成。レイアウトする。
		tableView = new DbResultSetView();
		recordView = new DbRecordView(db);
		textarea = new JTabbedTextArea(db, new SqlKeyListener());
		JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		sp2.setLeftComponent(new JScrollPane(tableView));
		sp2.setRightComponent(new JScrollPane(recordView));
		sp2.setDividerLocation(400);	// 70%
		sp2.setOneTouchExpandable(true);

		JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		sp1.setTopComponent(textarea);
		sp1.setBottomComponent(sp2);
		sp1.setDividerLocation(100);	// 30%
		sp1.setOneTouchExpandable(true);

		this.getContentPane().setLayout(new BorderLayout());
		this.getContentPane().add(sp1, BorderLayout.CENTER);
		// ツールバーを作る
		JToolBar toolbar = new JToolBar();
        toolbar.setFloatable(false);
        toolbar.setRollover(true);
		toolbar.add(queryAction);
        toolbar.addSeparator();
		toolbar.add(new TabAddAction(textarea));
		toolbar.add(new TabRemoveAction(textarea));
		if (System.getProperty("debug") != null) {
	        toolbar.addSeparator();
			toolbar.add(new FavoriteSqlAction(this));
		}
		this.getContentPane().add(toolbar, BorderLayout.NORTH);
		// 連動
		tableView.getSelectionModel().addListSelectionListener(new TableSelectionListener());
		// 表示。
		setTitle(db.name);
		setSize(640, 480);
		//setVisible(true);
	}
	// TODO:こいつは何もしていない。排除を考察せよ
	public void addSqlTab(String sql) {
		textarea.addTextArea(sql);
	}
	public String getCurrentSql() { return textarea.getCurrentText(); }
	public void updateData(DbData data) {
		// カラム情報が変わったか？
		boolean changed = false;
		if ((this.data == null) != (data == null)) {
			changed = true;	// 一方のみがnullのときは、変わった！
		}
		if (this.data != null && data != null) {
			if (! this.data.tableInfo.equals(data.tableInfo)) {
				changed = true;
			}
		}
		// データをセット
		this.data = data;
		tableView.updateData(data);
		// カラム情報が変わったとき、
		if (changed) {
			int index = tableView.getSelectionModel().getAnchorSelectionIndex();
			Object[] rec = (index != -1) ? data.getRecord(index) : null;
			recordView.setRecord(data.tableInfo, rec);
		}
		setTitle(db.name+"("+data.getRecordCount()+" records)");
	}

	/** 再描画する。 */
	public void refresh() {
		((AbstractTableModel) tableView.getModel()).fireTableStructureChanged();
		((AbstractTableModel) recordView.getModel()).fireTableDataChanged();
	}

	/** Shift+Enterが押されたらSQLを実行します。*/
	class SqlKeyListener extends KeyAdapter {
		public void keyReleased(KeyEvent e) {
			//System.out.println(e);
			if (e.getKeyCode() == KeyEvent.VK_ENTER && e.isShiftDown()) {
				queryAction.executeQuery();
			}
		}
	}
	/** テーブルの行が選択されたとき */
	class TableSelectionListener implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent e) {
			//System.out.println(e);
			if (e.getValueIsAdjusting()==false) {
				int index = tableView.getSelectionModel().getAnchorSelectionIndex();
				//System.out.println("index="+index);
				if (0 <= index && index < data.getRecordCount()) {
					Object[] rec = data.getRecord(index);
					recordView.setRecord(data.tableInfo, rec);
				}
				else if (data.getRecordCount() == 0) {
					recordView.setRecord(data.tableInfo, null);
				} else {
					Object[] rec = data.getRecord(0);
					recordView.setRecord(data.tableInfo, rec);
				}
			}
		}
	}
}


