/*
 * $Id: DocumentBrowserPanel.java,v 1.5 2006/01/26 16:38:10 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.koike.rss.tools.docb;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.common.swing.WindowPanel;
import org.logical_paradox.koike.rss.tools.DataSourceException;

/**
 * ドキュメントブラウザパネル
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class DocumentBrowserPanel extends WindowPanel implements ActionListener {
	/** シリアルバージョンUID */
	private static final long serialVersionUID = -2498385689102308503L;

	/** ロガー */
	private static final Log log = LogFactory.getLog(DocumentBrowserPanel.class);

	/** URL入力域 */
	public JTextField url;
	/** 文書番号入力域 */
	public JTextField docno;
	/** コンテンツ表示領域 */
	public JTextArea document;
	/** 検索ボタン */
	public JButton btnSearch;
	/** 消去ボタン */
	public JButton btnClear;

	/** ドキュメント選択ロジック */
	private Select select;

	/**
	 * コンストラクタ．
	 */
	public DocumentBrowserPanel() {
		init();
	}
	/**
	 * このパネルを初期化する．
	 */
	protected void init() {
		setLayout(new BorderLayout());
		JPanel searchControlPanel = new JPanel();
		searchControlPanel.setBorder(BorderFactory.createTitledBorder("search condition"));
		searchControlPanel.setLayout(new BoxLayout(searchControlPanel, BoxLayout.X_AXIS));

		url = new JTextField();
		url.setColumns(30);
		docno = new JTextField();
		docno.setColumns(10);

		// 検索条件
		searchControlPanel.add(new JLabel("  URL : "));
		searchControlPanel.add(url);
		searchControlPanel.add(new JLabel("  docno : "));
		searchControlPanel.add(docno);
		btnSearch = new JButton("retrieve");
		btnSearch.addActionListener(this);
		searchControlPanel.add(btnSearch);

		// 照会結果画面
		document = new JTextArea();
		document.setEditable(false);
		document.setLineWrap(true);
		JScrollPane documentPane = new JScrollPane(document);

		// 消去ボタン
		JPanel controlPanel = new JPanel();
		controlPanel.setLayout(new BorderLayout());
		btnClear = new JButton("clear");
		btnClear.addActionListener(this);
		controlPanel.add(btnClear, BorderLayout.EAST);

		add(searchControlPanel, BorderLayout.NORTH);
		add(documentPane, BorderLayout.CENTER);
		add(controlPanel, BorderLayout.SOUTH);
		validate();
		setVisible(true);
	}
	/**
	 * ボタン押下時のイベントハンドラ
	 * @param e イベントオブジェクト
	 */
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == btnClear) {
			// 消去処理
			document.setText("");
		} else if(e.getSource() == btnSearch) {
			// 検索開始
			log.trace("検索処理を開始します");
			if(select == null) {
				try {
					select = (Select)Class.forName(BrowserProperties.getProperty("select.class")).newInstance();
					select.open(BrowserProperties.getProperty("select.param.init"));
				} catch(Exception ex) {
					log.error("ドキュメントセレクタのインスタンス化に失敗:", ex);
				}
			}

			// 検索条件の作成
			Query q = new Query();
			String digest = url.getText();
			int cid = -1;
			try {
				if(docno.getText() != null && docno.getText().trim().length() > 0) {
					// 文書番号が指定されている場合は数字に変換する
					cid = Integer.parseInt(docno.getText());
				}
			} catch(NumberFormatException ne) {
			}

			q.setUrl(digest);
			q.setDocno(cid);

			// 照会処理を実行する
			try {
				String contents = select.executeQuery(q);
				if(contents == null) {
					// 何も発見できなかったのでダイアログを表示する
					JOptionPane.showMessageDialog(this, "contents not found", "inquiry error", JOptionPane.ERROR_MESSAGE);
				} else {
					// 発見できた文字列をデコードして表示する
					log.trace(contents);
					document.setText(contents);
				}
			} catch(DataSourceException dse) {
				log.error("何らかの理由で照会処理に失敗しました:", dse);
			}
		}
	}
	/**
	 * このパネルで使用している全てのリソースを解放して，終了する．
	 */
	public void close() {
		log.trace("終了処理を開始します");
		if(select != null) {
			try {
				select.close();
			} catch(DataSourceException e) {
				log.warn("データソースとの接続終了処理中に例外が発生:", e);
			}
		}
		log.trace("終了処理を完了しました");
	}
}
