/*
 * Copyright (C) 2005 NTT DATA Corporation
 * 
 */
package org.postgresforest.tool.dialog;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.PlatformUI;

/**
 * 共通的に利用できるダイアログクラスです。<p>
 * 
 * 基本的には、getInitialSizeとcustomizeDialogを実装して下さい。<br>
 * 入力値チェックを実施する場合、validateを実装して下さい。
 * 
 * @version 1.0
 * @since 1.0
 */
abstract public class CommonDialog extends Dialog {
	
// ----- コンストラクタ ----- //
	
	
	/**
	 * parentに連なるダイアログのインスタンスを返します。
	 * 
	 * @param parent Shellオブジェクト
	 */
	public CommonDialog() {
		super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
	}

	
// ----- instance メソッド ----- //
	

	/**
	 * ダイアログのカスタマイズを行います。<p>
	 * 
	 * @param composite ダイアログエリアのコンポジットオブジェクト
	 */
	abstract protected void customizeDialog(Composite composite) ;
	
	
	/**
	 * ＯＫボタンのテキストを返します。
	 * 
	 * @return ＯＫボタンのテキスト
	 */
	protected String getOkButtonText() {
		return null;
	}
	
	/**
	 * キャンセルボタンのテキストを返します。
	 * 
	 * @return キャンセルボタンのテキスト
	 */
	protected String getCancelButtonText(){
		return null;
	}
	
	
	/**
	 * ダイアログの入力値チェックを行います。<p>
	 * 
	 * 必要に応じて、入力値チェックを実装して下さい。
	 * 
	 * @return ValidateResultオブジェクト
	 */
	protected ValidateResult validate() {
		return null;
	}
	
	
	/**
	 * ＯＫボタンが押された場合に呼ばれるメソッドで、入力値チェックを実施します。<p>
	 * 
	 * エラーの場合、ダイアログを閉じずにエラー内容を通知します。
	 */
	protected void okPressed() {
		ValidateResult result = this.validate();
		
		if (result == null || result.isValid()) {
			super.okPressed();
		} else {
			this.displayError(result);
		}
	}

	
	/**
	 * エラー内容を通知します。<p>
	 * 
	 * 警告メッセージボックスにて、クライアントに通知します。
	 * 
	 * @param result ValidateResultオブジェクト
	 */
	protected void displayError(ValidateResult result) {
		MessageBox messageBox = 
			new MessageBox(this.getShell(), SWT.OK | SWT.ICON_WARNING);
		
		messageBox.setText(result.getID());
		messageBox.setMessage(result.getMessage());
		
		messageBox.open();
	}
	
	
// ----- Dialogクラスのオーバーライドメソッド ----- //
	
	
	protected Control createContents(Composite parent) {
		Composite composite = (Composite)super.createContents(parent);
		
		
		// ダイアログエリアのカスタマイズ
		this.customizeDialog((Composite)this.getDialogArea());
		
		
		// ＯＫボタンのテキスト変更
		String okText = this.getOkButtonText();
		if (okText != null) {
			Button button = this.getButton(IDialogConstants.OK_ID);
			if (button != null) {
				button.setText(okText);
			}
		}
		
		// キャンセルボタンのテキスト変更
		String cancelText = this.getCancelButtonText();
		if (cancelText != null) {
			Button button = this.getButton(IDialogConstants.CANCEL_ID);
			if (button != null) {
				button.setText(cancelText);
			}
		}
		
		
		return composite;
	}
}