package jp.co.cybec.laxide.wizards;

import java.io.IOException;

import lax.LetsAjaxActivator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;

/**
 * LAXプロパティページ.
 * 
 * <p>
 * LAX用プロパティ情報管理オブジェクトです。<br>
 * ここで定義された内容は、LAXプロジェクトの「(root)/.settings/Wizard.prefs」ファイルに保存されます。<br>
 * <br>
 * ここではノーマルプロパティページにLAX用サンプルプロパティ「laxSampleProperty」を付与しています。<br>
 * </p>
 * 
 * @author katoh
 *
 */
public class LetsAjaxPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {

	/** LAXプロジェクトオブジェクト */
	private IProject project;

	/** サンプルテキストボックス */
	private Text laxSampleProperty;

	/**
	 * LAXプロジェクト情報を取得します.
	 * 
	 * @see org.eclipse.ui.dialogs.PropertyPage#setElement(IAdaptable)
	 */
	public void setElement( IAdaptable element ) {

		super.setElement( element );
		project = ( ( IProject ) element ).getProject();
	}

	/**
	 * プロパティページに表示するウィジェットを生成します.
	 * 
	 * <p>
	 * サンプルプロパティとして、<code>laxSampleProperty</code>を定義しています。
	 * </p>
	 * 
	 * @return org.eclipse.swt.widgets.Control ウィジェットコンテナ
	 * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
	 */
	protected Control createContents( Composite parent ) {

		// コンテナ生成
		Composite comp = new Composite( parent, SWT.NULL );
		// レイアウト設定
		comp.setLayout( new FormLayout() );

		// 設定情報(プリファレンスストア)をLAXプロジェクトから取得する
		IPreferenceStore store = getProjectStore();

		// サンプル用のプロパティ設定フィールドウィジェットを作成する
		laxSampleProperty = new Text( comp, SWT.BORDER | SWT.SINGLE );
		laxSampleProperty.setText( store.getString( "laxSampleProperty" ) );

		// [Restore Defaults]ボタンと[Apply]ボタンは（今のところ）不要なので、下記メソッドをコールすることで表示しないようにしている
		noDefaultAndApplyButton();

		// コンテナ返却
		return comp;
	}

	/**
	 * OKボタン処理.
	 * <p>
	 * プロパティページで「OK」ボタンが押下された場合の処理になります。<br>
	 * このメソッドで<code>false</code>が返ると、プロパティページは閉じません。
	 * </p>
	 * 
	 * @return boolean 画面設定内容が正しい場合は<code>true</code>を、そうでない場合は<code>false</code>を返します
	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
	 */
	public boolean performOk() {

		// 設定情報(プリファレンスストア)をLAXプロジェクトから取得する
		IPreferenceStore store = getProjectStore();
		// プロパティ「laxSampleProperty」に入力値を設定する
		store.setValue( "laxSampleProperty", laxSampleProperty.getText() );

		try {

			// 設定情報(プリファレンスストア)を更新
			( ( IPersistentPreferenceStore ) store ).save();

		} catch ( IOException ioe ) {

			ioe.printStackTrace();
			// 異常終了を返却して、プロパティページを閉じないようにする
			return false;
		}

		// 正常終了を返す
		return super.performOk();
	}

	/**
	 * LAX設定情報(プリファレンスストア)を取得して返します.
	 * 
	 * @return org.eclipse.jface.preference.IPreferenceStore LAX設定情報(プリファレンスストア)
	 */
	IPreferenceStore getProjectStore() {

		try {

			// LAXプラグインIDでLAXプロジェクトを取得⇒設定情報を取得して返す
			return new ScopedPreferenceStore( new ProjectScope( project ), LetsAjaxActivator.getDefault().getBundle().getSymbolicName() );

		} catch ( Exception ex ) {

			ex.printStackTrace();
			return null;
		}
	}
}