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

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

import javax.swing.JTextPane;

import asandatabasebrowser.AsanDatabaseBrowser;
import blanco.commons.sql.format.BlancoSqlParser;
import blanco.commons.sql.format.BlancoSqlTokenConstants;
import blanco.commons.sql.format.valueobject.BlancoSqlToken;
import net.sourceforge.swingx.SxAction;
import net.sourceforge.swingx.SxOptionPane;


public class SqlUnformatAction extends SxAction {
	final JTextPane pane;
	public SqlUnformatAction(JTextPane pane) {
		super("選択された範囲を1行に");
		putValue(SHORT_DESCRIPTION, "選択された範囲を1行にします(コメントは省きます)");
		putValue(LONG_DESCRIPTION, "選択された範囲を1行にします(コメントは省きます)");
		this.pane = pane;
	}

	private void unformat3() {
		String text = pane.getSelectedText();
		if (text == null) return;
		if (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:
				if (i == 0) {
					sb.append(t.getString());	// 最初のスペースは省かない。
				} else {
					// 前後に記号があれば省く。
					if (i>0 && ((BlancoSqlToken) tokens.get(i-1)).getType() == BlancoSqlTokenConstants.SYMBOL) {
						break;
					}
					if (i<tokens.size()-1 && ((BlancoSqlToken) tokens.get(i+1)).getType() == BlancoSqlTokenConstants.SYMBOL) {
						break;
					}
					sb.append(" ");
				}
				break;
			case BlancoSqlTokenConstants.SYMBOL:
			case BlancoSqlTokenConstants.KEYWORD:
			case BlancoSqlTokenConstants.NAME:
			case BlancoSqlTokenConstants.VALUE:
				sb.append(t.getString());
				break;
			case BlancoSqlTokenConstants.COMMENT:
				// 省く
				break;
			case BlancoSqlTokenConstants.END:
				break;
			case BlancoSqlTokenConstants.UNKNOWN:
			default:
				assert false: t.getType();
			}
		}
		pane.replaceSelection(sb.toString());
	}
	public void actionPerformed(ActionEvent ev) {
		unformat3();
	}
	public void updateStatus() {
		
	}
}
