/*
 * The MIT License
 *
 * Copyright 2013 Dra0211.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package kinugasa.ui;

import kinugasa.util.TimeCounter;

/**
 * プレイヤーに2択の選択肢を与えて回答を得る、
 * 簡易的な選択メッセージウインドウの拡張です.
 * <br>
 * このメッセージウインドウの実装は、「問い合わせメッセージウインドウ」を呼びます。<br>
 * このメッセージウインドウにはyesの場合の選択肢とnoの場合の選択肢を与えることができます。<br>
 * それぞれ便宜的にyes、noという名前が付けられていますが、他のメッセージであっても構いません。<br>
 * 質問文および選択肢の表示形式はスーパークラスに従います。つまり、質問文は改行"\n"を許可し、
 * 選択肢は1行のみです。<br>
 * <br>
 * それぞれの選択肢には見やすくするために先頭にスペースが付与された状態でラベル化されます。<br>
 * このクラスのオプションとして表示する文字列を取得するメソッドでは、このスペースが消去された状態の
 * 文字列を返します。<br>
 * したがって、ラベルから取得した文字列と問い合わせメッセージウインドウのインスタンスから取得したオプションに表示される
 * 文字列は異なります。<br>
 * <br>
 *
 * @version 1.0.0 - 2012/11/23_21:28:36.<br>
 * @author Dra0211<br>
 * <br>
 */
public class ConfirmMessageWindow extends SelectableMessageWindow {

	private static final long serialVersionUID = -8448581906646818648L;

	/**
	 * 問い合わせ用の2択メッセージウインドウを作成します.
	 * <br>
	 * 問い合わせ文は複数行でも表示可能です。オプションは1行でなければなりません。<br>
	 *
	 * @param x      ウインドウのX座標を指定します。<br>
	 * @param y      ウインドウのY座標を指定します。<br>
	 * @param width  ウインドウの幅を指定します。<br>
	 * @param height ウインドウの高さを指定します。<br>
	 * @param wm     ウインドウの表示モデルを指定します。<Br>
	 * @param lm     ウインドウ内のラベルに適用されるラベルモデルを指定します。<br>
	 * @param tc     ラベルに適用するタイムカウンタを指定します。実際はクローンが使用されます。<br>
	 * @param text   質問文です。改行"\n"を利用できます。<br>
	 * @param yes    選択可能なオプションの1つ目です。このオプションはデフォルトで選択されています。<br>
	 * @param no     選択可能なオプションの2つ目です。このオプションはyesの下に表示されます。<br>
	 * @param ce     選択エフェクトを指定します。nullを許容します。<br>
	 *
	 * @throws NullPointerException テキストがnullである場合に投げられます。<br>
	 */
	public ConfirmMessageWindow(float x, float y, float width, float height,
			MessageWindowModel wm, LabelModel lm, TimeCounter tc, String text,
			String yes, String no, ChoiceEffect ce)
			throws NullPointerException {
		super(x, y, width, height, wm, lm, tc, text + "\n" + "   " + yes + "\n" + "   " + no, 0, 0, 1, ce);
		this.yesMessage = yes;
		this.noMessage = no;
		String message = text + "\n" + "   " + yes + "\n" + "   " + no;
		String[] texts = message.split(MessageWindow.getSeparator());
		for (int i = 0; i < texts.length; i++) {
			if (texts[i].replaceAll(" ", "").equals(yes)) {
				setMinIndex(i);
				setMaxIndex(i + 1);
				select(i);
			}
		}
	}
	/** 1つ目のオプションの文字列です. */
	private String yesMessage;
	/** 2つ目のオプションの文字列です. */
	private String noMessage;

	/**
	 * この問い合わせメッセージウインドウの1つ目のオプションとして表示される文字列を取得します.
	 *
	 * @return 1つ目のオプションとして表示される文字列を返します。<br>
	 */
	public String getYesMessage() {
		return yesMessage;
	}

	/**
	 * この問い合わせメッセージウインドウの2つ目のオプションとして表示される文字列を取得します.
	 *
	 * @return 2つ目のオプションとして表示される文字列を返します。<br>
	 */
	public String getNoMessage() {
		return noMessage;
	}

	/**
	 * 現在選択中の選択肢が1つ目のオプションであるかを調べます.
	 *
	 * @return yesが選択されている場合はtrue、noが選択されている場合はfalseを返します。<br>
	 */
	public boolean isYesOption() {
		return getSelectedLabel().getText().replaceAll(" ", "").equals(yesMessage);
	}

	@Override
	public ConfirmMessageWindow clone() {
		return (ConfirmMessageWindow) super.clone();
	}
}
