package jp.co.cybec.laxide.wizards;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.dialogs.CreateLinkedResourceGroup;
import org.eclipse.ui.internal.ide.misc.ContainerSelectionGroup;
import org.eclipse.ui.internal.ide.misc.ResourceAndContainerGroup;

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

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

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

	private String generateDir;

	// widgets
	private ResourceAndContainerGroup resourceGroup;

	private ContainerSelectionGroup containerSelectionGroup;

	// 終了ボタン押下に関連あり
	private CreateLinkedResourceGroup linkedResourceGroup;

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

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

	public void setFilePath(String filePath) {
		this.htmlFileName.setText(filePath);
	}

	public void setGenerateDir(String dir) {
		this.generateDir = dir;
	}

	public String getGenerateDir() {
		return this.generateDir;
	}

	/**
	 * 画面項目を作成します.
	 * 
	 * @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("HTMLファイル名：");

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

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

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

		// バリデーションの実行
		validatePage();

		// メッセージ初期化、コンテナの登録
		setErrorMessage(null);
		setMessage(null);

	}

	/**
	 * ファイルパスフィールドのリスナー.
	 * <p>
	 * 「読み込みファイルパス表示用テキストボックス」の値が変更した場合のアクションリスナーです。
	 * </p>
	 */
	private ModifyListener fLocationModifyListener = new ModifyListener() {
		public void modifyText(ModifyEvent e) {
			setPageComplete(validatePage());
			setCaution(validatePage());
		}
	};

	/**
	 * 終了ボタンがアクティブな場合にの画面注意書きを設定します.
	 * 
	 * @param valid
	 *            バリデータの結果
	 */
	private void setCaution(boolean valid) {
		if (valid) {
		} else {
			setMessage(null);
		}
	}

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

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

	/**
	 * Creates a file resource handle for the file with the given workspace
	 * path. This method does not create the file resource; this is the
	 * responsibility of <code>createFile</code>.
	 * 
	 * @param filePath
	 *            the path of the file resource to create a handle for
	 * @return the new file resource handle
	 * @see #createFile
	 */
	protected IFile createFileHandle(IPath filePath) {
		return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFile(
				filePath);
	}

	/**
	 * Returns the scheduling rule to use when creating the resource at the
	 * given container path. The rule should be the creation rule for the
	 * top-most non-existing parent.
	 * 
	 * @param resource
	 *            The resource being created
	 * @return The scheduling rule for creating the given resource
	 * @since 3.1
	 */
	protected ISchedulingRule createRule(IResource resource) {

		IResource parent = resource.getParent();
		while (parent != null) {
			if (parent.exists()) {
				return resource.getWorkspace().getRuleFactory().createRule(
						resource);
			}
			resource = parent;
			parent = parent.getParent();
		}
		return resource.getWorkspace().getRoot();
	}
}