/*
 * 作成日: 2007/11/07
 */
package asandatabasebrowser.action;

import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.JTextPane;

import net.sourceforge.swingx.SxAction;
import net.sourceforge.swingx.SxOptionPane;

import asandatabasebrowser.AsanDatabaseBrowser;
import blanco.commons.sql.format.BlancoSqlParser;
import blanco.commons.sql.format.BlancoSqlTokenConstants;
import blanco.commons.sql.format.valueobject.BlancoSqlToken;

/** SQLのコメントを省く. */
public class SqlExcludeCommentAction extends SxAction {
	final JTextPane pane;
	public SqlExcludeCommentAction(JTextPane pane) {
		super("選択された範囲のコメントを削除");
		putValue(SHORT_DESCRIPTION, "選択された範囲のコメントを削除します");
		putValue(LONG_DESCRIPTION, "選択された範囲のコメントを削除します");
		this.pane = pane;
	}
	public void actionPerformed(ActionEvent ev) {
		String text = pane.getSelectedText();
		if (text == null || text.length() == 0) return;
		// SQL文を字句解析し、字句ごとにぶった切る。
		ArrayList tokens = null;
		try {
			tokens = new BlancoSqlParser().parse(text);
		} catch (RuntimeException e) {
            AsanDatabaseBrowser.theApp.showMessage(pane, 
            		"SQLが不正と思われます",
            		e, SxOptionPane.ERROR_MESSAGE);
			return;	// 不完全なSQLだと起こりえる。
		}    	
    	// コメントを削除する。
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<tokens.size(); i++) {
			BlancoSqlToken t = (BlancoSqlToken) tokens.get(i);
			switch (t.getType()) {
			case BlancoSqlTokenConstants.SPACE:
			case BlancoSqlTokenConstants.SYMBOL:
			case BlancoSqlTokenConstants.KEYWORD:
			case BlancoSqlTokenConstants.NAME:
			case BlancoSqlTokenConstants.VALUE:
				sb.append(t.getString());
				break;
			case BlancoSqlTokenConstants.COMMENT:
				if (t.getString().startsWith("--")) {
					// シングルラインコメントの時には、改行を残す
					sb.append("\n");
				} else {
					// マルチラインコメントのときには、削除
				}
				break;
			case BlancoSqlTokenConstants.END:
				break;
			case BlancoSqlTokenConstants.UNKNOWN:
			default:
				assert false: t.getType();
			}
		}
		pane.replaceSelection(sb.toString());
	}
	public void updateStatus() {
	}
}
