/*******************************************************************************
 * Copyright (c) 2003, 2005 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
 *******************************************************************************/
/*
 * Created on Mar 8, 2004
 *
 * To change the template for this generated file go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
package org.eclipse.jst.j2ee.internal.wizard;

import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.jst.j2ee.project.datamodel.properties.IJ2EEProjectServerTargetDataModelProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;


/**
 * @author vijayb
 * 
 * To change the template for this generated type comment go to Window - Preferences - Java - Code
 * Generation - Code and Comments
 */
public class ServerTargetGroup implements IJ2EEProjectServerTargetDataModelProperties{
	private IDataModel model;
	private DataModelSynchHelper synchHelper;
	private Combo targetServerCombo;
	private Button newTargetServerButton;
	public Composite parentUI;

	/**
	 *  
	 */
	public ServerTargetGroup() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param parent
	 * @param style
	 */
	public ServerTargetGroup(Composite parent, int style, IDataModel model, DataModelSynchHelper helper) {
		this.model = model;
		this.parentUI = parent;
		synchHelper = helper;
		buildComposites(parent);
	}

	/**
	 * Create the controls within this composite
	 */
	public void buildComposites(Composite parent) {
		createServerTargetGroup(parent);
	}

	/**
	 * @param parent
	 */
	private void createServerTargetGroup(Composite parent) {
		Label serverTargetLabel = new Label(parent, SWT.NONE);
		serverTargetLabel.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.TARGET_RUNTIME_LBL));
		GridData data = new GridData();
		serverTargetLabel.setLayoutData(data);


		targetServerCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
		targetServerCombo.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));

		newTargetServerButton = new Button(parent, SWT.NONE);
		newTargetServerButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		newTargetServerButton.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.NEW_THREE_DOTS_E));
		newTargetServerButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				handleNewTargetServerButtonPressed();
			}
		});
		newTargetServerButton.setEnabled(true);

		Control[] deps = new Control[]{serverTargetLabel, newTargetServerButton};
		synchHelper.synchCombo(targetServerCombo, RUNTIME_TARGET_ID, deps);
	}

	/**
	 *  
	 */
	protected void handleNewTargetServerButtonPressed() {
		FlexibleProjectCreationWizardPage.launchNewRuntimeWizard(parentUI.getShell(), model);
	}

	public void dispose() {
		model.removeListener(synchHelper);
		model = null;
	}

	/**
	 * @return Returns the targetServerCombo.
	 */
	public Combo getTargetServerCombo() {
		return targetServerCombo;
	}

	/**
	 * @param targetServerCombo
	 *            The targetServerCombo to set.
	 */
	public void setTargetServerCombo(Combo targetServerCombo) {
		this.targetServerCombo = targetServerCombo;
	}

	/**
	 * @return Returns the newTargetServerButton.
	 */
	public Button getNewTargetServerButton() {
		return newTargetServerButton;
	}

	/**
	 * @param newTargetServerButton
	 *            The newTargetServerButton to set.
	 */
	public void setNewTargetServerButton(Button newTargetServerButton) {
		this.newTargetServerButton = newTargetServerButton;
	}
}
