/***************************************************************************************************
 * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
 * accompanying materials are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 **************************************************************************************************/

package org.eclipse.wst.web.ui.internal.wizards;

import java.util.Vector;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.web.internal.ResourceHandler;
import org.eclipse.wst.web.internal.WebPropertiesUtil;

public class SimpleContextRootComposite extends Composite {
	protected Text contextRootField;
	private String errorMessage = null;

	// listeners interested in the event when the context root
	// value is modified.
	private java.util.List modifyListeners;

	protected Listener contextRootModifyListener = new Listener() {
		public void handleEvent(Event e) {
			if (contextRootField != null)
				contextRootModified();
		}
	};

	public SimpleContextRootComposite(Composite parent) {
		super(parent, SWT.NONE);
		createControls();
		modifyListeners = new Vector(1);
	}

	protected void createControls() {
		// container specification group
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		setLayout(layout);
		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
		data.horizontalSpan = 2;
		setLayoutData(data);

		// New Context Root Label
		Label contextRootLabel = new Label(this, SWT.CHECK);
		contextRootLabel.setText(ResourceHandler.getString("StaticContextRootComposite.Context_Root_Label")); //$NON-NLS-1$

		// New Context Root Entryfield
		contextRootField = new Text(this, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
		data.grabExcessHorizontalSpace = true;
		contextRootField.setLayoutData(data);

		contextRootField.addListener(SWT.Modify, contextRootModifyListener);

	}

	public String getContextRoot() {
		return contextRootField.getText();
	}

	public void setEnabled(boolean enabled) {
		if (contextRootField != null)
			contextRootField.setEnabled(enabled);
	}

	protected void contextRootModified() {
		errorMessage = WebPropertiesUtil.validateContextRoot(getContextRoot());
		// notify listeners
		Event e = new Event();
		e.type = SWT.Modify;
		e.widget = contextRootField;
		for (int i = 0; i < modifyListeners.size(); i++) {
			((Listener) modifyListeners.get(i)).handleEvent(e);
		}
	}

	public void setContextRoot(String cr) {
		contextRootField.setText(cr);
	}

	/**
	 * There is a default context root validation listener provided by the
	 * composite, adding external listeners will replace the default listener.
	 */
	public void addModifyListener(Listener l) {
		modifyListeners.add(l);
	}

	public void removeModifyListener(Listener l) {
		modifyListeners.remove(l);
	}

	/**
	 * validate the context root value and return the error message
	 */
	public String getErrorMessage() {
		return errorMessage;
	}

	public boolean setFocus() {
		return contextRootField.setFocus();
	}
}