/*
 * $Id: SomeItemInputDialog.java,v 1.3 2006-10-21 23:18:43 pombredanne Exp $
 * Copyright Narushima Hironori. All rights reserved.
 */
package net.sourceforge.phpeclipse.wizards.html;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * 
 */
public class SomeItemInputDialog extends Dialog {

	String dialogTitle;

	String[] inputMessages;

	IInputValidator[] validators;

	Text[] texts;

	Text error;

	String[] errorMsgs;

	String[] resultValues;

	public SomeItemInputDialog(Shell parentShell, String dialogTitle,
			String[] inputMessages, IInputValidator[] validators) {
		super(parentShell);
		if (inputMessages.length != validators.length) {
			throw new IllegalArgumentException(
					"Specify validator counts and input message count is not same.");
		}

		this.dialogTitle = dialogTitle;
		this.inputMessages = (String[]) inputMessages.clone();
		this.validators = (IInputValidator[]) validators.clone();
		this.errorMsgs = new String[validators.length];

		setShellStyle(SWT.RESIZE | getShellStyle());
	}

	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText(dialogTitle);
	}

	protected Control createDialogArea(Composite parent) {
		Composite base = (Composite) super.createDialogArea(parent);
		GridLayout gl = new GridLayout(2, false);
		gl.marginWidth = 4;
		gl.marginHeight = 6;
		base.setLayout(gl);

		texts = new Text[inputMessages.length];
		for (int i = 0; i < inputMessages.length; i++) {
			new Label(base, SWT.NONE).setText(inputMessages[i] + ":");

			final int index = i;
			Text t = new Text(base, SWT.BORDER);
			t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
			t.addModifyListener(new ModifyListener() {
				public void modifyText(ModifyEvent e) {
					refreshValidator(index);
				}
			});
			texts[i] = t;
		}

		error = new Text(base, SWT.READ_ONLY);
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		gd.horizontalSpan = 2;
		error.setLayoutData(gd);

		return base;
	}

	void refreshValidator(int index) {
		String data = texts[index].getText();
		IInputValidator validator = validators[index];
		if (validator != null) {
			errorMsgs[index] = validator.isValid(data);
		}

		Button okButton = getButton(IDialogConstants.OK_ID);
		for (int i = 0; i < errorMsgs.length; i++) {
			String msg = errorMsgs[i];
			if (msg != null) {
				error.setText(msg);
				okButton.setEnabled(false);
				return;
			}
		}
		error.setText("");
		okButton.setEnabled(true);
	}

	public String[] getValues() {
		return (String[]) resultValues.clone();
	}

	protected Point getInitialSize() {
		Point p = super.getInitialSize();
		return new Point(p.x * 2, (int) (p.y * 1.25));
	}

	protected void okPressed() {
		resultValues = new String[texts.length];
		for (int i = 0; i < texts.length; i++) {
			resultValues[i] = texts[i].getText();
		}
		super.okPressed();
	}

}