/*******************************************************************************
 * Copyright (c) 2007 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.server.http.ui.internal;

import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.http.core.internal.HttpRuntime;
import org.eclipse.wst.server.ui.wizard.IWizardHandle;
/**
 * Wizard page to set the server install directory.
 */
public class HttpRuntimeComposite extends Composite {
	protected IRuntimeWorkingCopy runtimeWC;
	protected HttpRuntime runtime;
	protected Text name;
	protected Text publishDir;
	protected Button browseButton;
	protected IWizardHandle wizard;

	/**
	 * HttpRuntimeComposite
	 * 
	 * @param parent the parent composite
	 * @param wizard the wizard handle
	 */
	public HttpRuntimeComposite(Composite parent, IWizardHandle wizard) {
		super(parent, SWT.NONE);
		this.wizard = wizard;
		wizard.setTitle(Messages.wizardTitle);
		wizard.setDescription(Messages.wizardDescription);
		wizard.setImageDescriptor(HttpUIPlugin.getImageDescriptor(HttpUIPlugin.IMG_WIZ_SERVER));

		createControl();
	}

	protected void setRuntime(IRuntimeWorkingCopy newRuntime) {
		if (newRuntime == null) {
			runtimeWC = null;
			runtime = null;
		} else {
			runtimeWC = newRuntime;
			runtime = (HttpRuntime) newRuntime.loadAdapter(HttpRuntime.class, null);
		}
		
		init();
		validate();
	}

	/**
	 * Provide a wizard page to change the Apache installation directory.
	 */
	protected void createControl() {
		GridLayout layout = new GridLayout(1, true);
		setLayout(layout);
		setLayoutData(new GridData(GridData.FILL_BOTH));
		
		Composite nameGroup = new Composite(this, SWT.NONE);
		layout = new GridLayout();
		layout.numColumns = 2;
		layout.marginWidth = 0;
		layout.marginHeight = 0;
		nameGroup.setLayout(layout);
		nameGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, ContextIds.RUNTIME_COMPOSITE);
		
		Label label = new Label(nameGroup, SWT.NONE);
		label.setText(Messages.runtimeName);
		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END);
		data.horizontalSpan = 2;
		label.setLayoutData(data);
		
		name = new Text(nameGroup, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.horizontalSpan = 2;
		name.setLayoutData(data);
		name.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				runtimeWC.setName(name.getText());
				validate();
			}
		});
		
		createPublishLocationGroup(nameGroup);
		
		init();
		validate();
		
		Dialog.applyDialogFont(this);
		
		name.forceFocus();
	}

	protected void init() {
		if (name == null || runtimeWC == null || runtime == null)
			return;
		
		name.setText(runtimeWC.getName());
		if (runtimeWC.getLocation() != null)
			publishDir.setText(runtimeWC.getLocation().toOSString());
	}

	protected void validate() {
		if (runtime == null) {
			wizard.setMessage("", IMessageProvider.ERROR);
			return;
		}
		
		wizard.setMessage(null, IMessageProvider.NONE);
		
		if (runtimeWC != null) {
			String name2 = runtimeWC.getName();
			if (name2 == null || name2.trim().equals("")) {
				wizard.setMessage(Messages.wizardMissingRuntimeName, IMessageProvider.ERROR);
			} else {
				boolean ok = checkRuntimeName(name2);
				if (!ok) {
					wizard.setMessage(Messages.wizardDuplicateName, IMessageProvider.ERROR);
				}
			}
		}
	}

	private void createPublishLocationGroup(Composite publishInfoGroup) {
		Font font = publishInfoGroup.getFont();
		// location label
		Label locationLabel = new Label(publishInfoGroup, SWT.NONE);
		locationLabel.setFont(font);
		locationLabel.setText(Messages.publishDir);
		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END);
		data.horizontalSpan = 2;
		locationLabel.setLayoutData(data);
		
		// project location entry field
		publishDir = new Text(publishInfoGroup, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL);
		publishDir.setLayoutData(data);
		publishDir.setFont(font);
		publishDir.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				runtimeWC.setLocation(new Path(publishDir.getText()));
				validate();
			}
		});
		
		// browse button
		browseButton = new Button(publishInfoGroup, SWT.PUSH);
		browseButton.setFont(font);
		browseButton.setText(Messages.browse);
		browseButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				DirectoryDialog dialog = new DirectoryDialog(HttpRuntimeComposite.this.getShell());
				dialog.setMessage(Messages.selectInstallDir);
				dialog.setFilterPath(publishDir.getText());
				String selectedDirectory = dialog.open();
				if (selectedDirectory != null)
					publishDir.setText(selectedDirectory);
			}
		});
	}

	private boolean checkRuntimeName(String name2) {
		name2 = name2.trim();
		if (name2.equals(runtimeWC.getName())) {
			return true;
		}
		IRuntime[] allRuntimes = ServerCore.getRuntimes();
		
		if (allRuntimes != null) {
			int size = allRuntimes.length;
			for (int i = 0; i < size; i++) {
				IRuntime runtime2 = allRuntimes[i];
				if (name2.equals(runtime2.getName()))
					return false;
			}
		}
		return true;
	}
}