package jp.co.cybec.laxide.wizards;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

/**
 * 新規LAXファイル作成ウィザード1クラス.
 * 
 * <p>
 * 新規LAX作成用「ウィザード画面−１」クラスです。<br>
 * ウィザード画面の初期設定、画面入力値のバリデーション処理を保持するクラスです。
 * </p>
 * 
 * @author cybec
 */
public class LetsAjaxLoadWizardPage extends WizardPage {

	/** ページID */
	public static final String PAGE_ID = "jp.co.cybec.laxide.wizards.WebAppGenerationWizard";

	/** 読み込みファイルパス表示用テキストボックス */
	private Text filePath;

	/** ファイル読み込み用ボタン */
	private Button loadFileButton;

	/** 読み込みファイルパス表示用テキストボックス */
	private Text dataSourceFilePath;

	/** ファイル読み込み用ボタン */
	private Button loadDataSourceFileButton;

	/**
	 * コンストラクタ.
	 * 
	 * @param pageName
	 *            ウィザードページ名
	 */
	public LetsAjaxLoadWizardPage(String pageName) {
		super(pageName);
	}

	/**
	 * 読み込み元ファイルパスを取得して返します.
	 * 
	 * @return String 読み込み元ファイルパス
	 */
	public String getFilePath() {
		return filePath.getText();
	}

	/**
	 * @return dataSourceFilePath_
	 */
	public String getDataSourceFilePath() {
		return dataSourceFilePath.getText();
	}

	/**
	 * 画面項目を作成します.
	 * 
	 * @param parent
	 *            ウィジェット格納コンテナ
	 */
	public void createControl(Composite parent) {

		// ---------------
		// 子コンテナ生成
		// ---------------

		// 子コンテナ生成
		Composite composite = new Composite(parent, SWT.NULL);
		// レイアウト設定
		composite.setLayout(new GridLayout(3, false));
		// 親コンテナに子コンテナを格納
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));

		// ---------------
		// 画面表示ラベル
		// ---------------

		// ラベル生成
		Label label = new Label(composite, SWT.NULL);
		// ラベルCaption設定
		label.setText("LAXファイルの場所:");

		// -----------------------
		// ファイルパス格納エリア
		// -----------------------
		// テキストボックス生成
		filePath = new Text(composite, SWT.BORDER);
		filePath.setSize(100, 20);
		// テキストボックスをコンテナに格納
		filePath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		// -----------------------------------
		// ファイルパス取得用ダイアログボタン
		// -----------------------------------

		// ボタン生成
		loadFileButton = new Button(composite, SWT.PUSH);
		// フォント設定
		loadFileButton.setFont(composite.getFont());
		// ボタンCaption設定
		loadFileButton.setText("LAXファイル読み込み");
		// ボタンをコンテナに格納
		setButtonLayoutData(loadFileButton);
		
		// ボタンにダイアログオープン時のリスナーを登録
		loadFileButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				handleBrowseButtonPressed();
			}
		});
		// テキストボックスが変更された時のリスナー登録
		filePath.addModifyListener(fLocationModifyListener);

		// データソース選択ダイアログ
		Label label2 = new Label(composite, SWT.NULL);
		// ラベルCaption設定
		label2.setText("データソースファイルの場所:");

		// -----------------------
		// データソースファイルパス格納エリア
		// -----------------------
		// テキストボックス生成
		this.dataSourceFilePath = new Text(composite, SWT.BORDER);
		// テキストボックスをコンテナに格納
		this.dataSourceFilePath.setLayoutData(new GridData(
				GridData.FILL_HORIZONTAL));

		// -----------------------------------
		// ファイルパス取得用ダイアログボタン
		// -----------------------------------
		// ボタン生成
		this.loadDataSourceFileButton = new Button(composite, SWT.PUSH);
		// フォント設定
		this.loadDataSourceFileButton.setFont(composite.getFont());
		// ボタンCaption設定
		this.loadDataSourceFileButton.setText("データソースファイル読み込み");
		// ボタンをコンテナに格納
		setButtonLayoutData(this.loadDataSourceFileButton);
		
		// ボタンにダイアログオープン時のリスナーを登録
		this.loadDataSourceFileButton
				.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent event) {
						handleDataSourceFileBrowseButtonPressed();
					}
				});

		// テキストボックスが変更された時のリスナー登録
		this.dataSourceFilePath.addModifyListener(fLocationModifyListener);

		// ウィジェット積み込み
		setControl(composite);
	}

	/**
	 * ダイアログオープン時の挙動制御.
	 * <p>
	 * 「読み込みファイルパス」取得ダイアログの制御を行います。 </p
	 */
	private void handleBrowseButtonPressed() {

		String lastUsedPath = "";
		FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE);
		dialog.setFilterExtensions(new String[] { "*.lax" });
		dialog.setFilterPath(lastUsedPath);

		String result = dialog.open();
		if (result == null) {
			return;
		}

		IPath filterPath = new Path(dialog.getFilterPath());
		String buildFileName = dialog.getFileName();
		IPath path = filterPath.append(buildFileName).makeAbsolute();

		filePath.setText(path.toOSString());
	}

	/**
	 * ダイアログオープン時の挙動制御.
	 * <p>
	 * 「読み込みファイルパス」取得ダイアログの制御を行います。 </p
	 */
	private void handleDataSourceFileBrowseButtonPressed() {

		String lastUsedPath = "";
		FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE);
		dialog.setFilterExtensions(new String[] { "*.xml" });
		dialog.setFilterPath(lastUsedPath);

		String result = dialog.open();
		if (result == null) {
			return;
		}

		IPath filterPath = new Path(dialog.getFilterPath());
		String buildFileName = dialog.getFileName();
		IPath path = filterPath.append(buildFileName).makeAbsolute();

		dataSourceFilePath.setText(path.toOSString());
	}

	/**
	 * ファイルパスフィールドのリスナー.
	 * <p>
	 * 「読み込みファイルパス表示用テキストボックス」の値が変更した場合のアクションリスナーです。
	 * </p>
	 */
	private ModifyListener fLocationModifyListener = new ModifyListener() {
		public void modifyText(ModifyEvent e) {
			// バリデーションの実行⇒「次へ」ボタン活性化
			setPageComplete(validatePage());
			// // ファイル名設定
			// int i = filePath_.getText().lastIndexOf( "\\" );
			// if ( i == -1 ) {
			// i = filePath_.getText().lastIndexOf( "/" );
			// }
			// outputFileName_ = filePath_.getText().substring( i + 1,
			// filePath_.getText().indexOf( "." ) );
			// 注意書き
			setCaution(validatePage());
		}
	};

	/**
	 * 終了ボタンがアクティブな場合にの画面注意書きを設定します.
	 * 
	 * @param valid
	 *            バリデータの結果
	 */
	private void setCaution(boolean valid) {
		if (valid) {
			// setMessage( "読み込みファイルと同じディレクトリに出力します。\r\n" +
			// "ファイル名は「" + outputFileName_ +
			// "」となります。\r\n出力ディレクトリ、ファイル名を変更する場合は「次へ」ボタンをクリックしてください。",
			// org.eclipse.jface.dialogs.IMessageProvider.INFORMATION );
			// setMessage( "読み込みファイルと同じディレクトリに出力します。\r\n" +
			// "ファイル名は「" + GenerateWizard.DEFAULT_FILE_NAME +
			// "」となります。\r\n出力ディレクトリ、ファイル名を変更する場合は「次へ」ボタンをクリックしてください。",
			// org.eclipse.jface.dialogs.IMessageProvider.INFORMATION );
		} else {
			setMessage(null);
		}
	}

	/**
	 * 画面の入力チェックをします.
	 * <p>
	 * ここではサンプルとして、ファイルパスに文字が入力されていた場合に正常を返しています。
	 * </p>
	 * 
	 * @return boolean 画面入力た正しい場合は<code>true</code>を、そうでない場合は<code>false</code>を返します
	 */
	private boolean validatePage() {
		if (filePath.getText().length() == 0) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * ページ内部が正常に入力完了しているか判定します.
	 * <p>
	 * <bold>（注意）</bold><br>
	 * スーパークラスでは、ここで<code>true</code>を返すと「次へ」ボタンと「終了」ボタンの両方が活性化するようになっています。<br>
	 * 本クラスでは「次へ」ボタンのみ活性化制御をする必要があるため、 本メソッドをオーバーライドし、「次へ」ボタンは{@link LetsAjaxLoadWizardPage#canFlipToNextPage()}}で制御するようにしています。
	 * </p>
	 * 
	 * @return boolean ウィザード入力チェックが正常な場合は<code>true</code>を、そうでない場合は<code>false</code>を返します
	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
	 */
	public boolean isPageComplete() {
		return validatePage();
	}

	/**
	 * 次へボタンを活性化させて良いか判定します.
	 * <p>
	 * 「次へ」ボタンの活性・非活性判定を行います。<br>
	 * 本メソッドをオーバーライドした経緯は{@link LetsAjaxLoadWizardPage#isPageComplete()}を参照してください。
	 * </p>
	 * 
	 * @return boolean ウィザード入力チェックが正常な場合は<code>true</code>を、そうでない場合は<code>false</code>を返します
	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
	 */
	public boolean canFlipToNextPage() {
		return validatePage();
	}

}