/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.wizards;

import java.util.Iterator;

import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.wizard.WizardPage;
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.wsdl.Definition;

/**
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Aug 14, 2006
 * 
 */
public class CreatePartnerLinkTypeWizardNamePage extends WizardPage {

	Text partnerLinkTypeName;

	Text hintText;

	Definition fDefinitions;

	// constants
	static final int SIZING_TEXT_FIELD_WIDTH = 250;

	/**
	 * @param pageName
	 */
	protected CreatePartnerLinkTypeWizardNamePage(String pageName) {
		super(pageName);
		setPageComplete(false);

		setTitle(Messages.CreatePartnerLinkTypeWizardNamePage_0);
		setDescription(Messages.CreatePartnerLinkTypeWizardNamePage_1);
		setImageDescriptor(BPELUIPlugin.INSTANCE.getImageDescriptor(
				IBPELUIConstants.ICON_WIZARD_BANNER));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createControl(Composite parent) {
		Composite composite = new Composite(parent, SWT.NULL);
		composite.setFont(parent.getFont());

		initializeDialogUnits(parent);

		composite.setLayout(new GridLayout());
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));

		createPartnerLinkName(composite);

		setPageComplete(validatePage());

		// no errors on opening up the wizard
		setErrorMessage(null);
		setMessage(null);
		setControl(composite);

		// figure out the what needs to go

	}

	Composite createPartnerLinkName(Composite parent) {

		Composite fields = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		fields.setLayout(layout);
		fields.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		// new project label
		Label label = new Label(fields, SWT.NONE);
		label.setText(Messages.CreatePartnerLinkTypeWizardNamePage_2);
		label.setFont(parent.getFont());

		// new project name entry field
		partnerLinkTypeName = new Text(fields, SWT.BORDER);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
		partnerLinkTypeName.setLayoutData(data);
		partnerLinkTypeName.setFont(parent.getFont());

		partnerLinkTypeName.addListener(SWT.Modify, new Listener() {
			public void handleEvent(Event event) {
				setPageComplete(validatePage());
			}
		});

		hintText = new Text(parent, SWT.READ_ONLY | SWT.WRAP | SWT.SCROLL_LINE);
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
		data.heightHint = 80;
		hintText.setLayoutData(data);
		hintText.setFont(parent.getFont());

		hintText
				.setText(Messages.CreatePartnerLinkTypeWizardNamePage_3);

		return fields;
	}

	/**
	 * Returns whether this page's controls currently all contain valid values.
	 * 
	 * @return <code>true</code> if all controls are valid, and
	 *         <code>false</code> if at least one is invalid
	 */
	protected boolean validatePage() {

		String pltName = partnerLinkTypeName.getText();

		IInputValidator validator = BPELUtil.getNCNameValidator();
		String pltMsg = validator.isValid(pltName);

		if (pltMsg != null) {
			// all is OK
			setMessage(pltMsg,ERROR);
			return false;
		}
		if (fDefinitions != null) {
			// This is silly, it has to belong someplace else.
			Iterator it = fDefinitions.getEExtensibilityElements().iterator();
			while (it.hasNext()) {
				Object element = it.next();
				if (element instanceof PartnerLinkType) {
					PartnerLinkType plt = (PartnerLinkType) element;
					if (pltName.equals( plt.getName())) {
						setMessage(Messages.CreatePartnerLinkTypeWizardNamePage_4,ERROR);
						return false;
					}
				}
				
			}
		}
		setMessage(null,NONE);

		return true;
	}
	
	
	public String getPartnerLinkTypeName () {
		return partnerLinkTypeName.getText();
	}

	/**
	 * @param artifactsDefinition
	 */
	public void setDefinitions(Definition defn) {
		fDefinitions = defn;
		
	}

}
