/*******************************************************************************
 *  Copyright (c) 2010  Oracle. 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: 
 *  	Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.ui.internal.wizards.proj;

import static org.eclipse.jpt.ui.internal.wizards.proj.model.JpaProjectCreationDataModelProperties.*;
import static org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FACET_RUNTIME;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.ui.internal.JptUiMessages;
import org.eclipse.jst.j2ee.ui.project.facet.EarProjectWizard;
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.layout.GridLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;

public class AddToEarComposite {
	
	private final Button addToEar;
	private final Combo combo;
	private final Button newButton;
	private final Label label;
	
	private final IDataModel model;
	private DataModelSynchHelper synchhelper;
	
	public AddToEarComposite(IDataModel model, Composite parent) {
		this.model = model;
		this.synchhelper = new DataModelSynchHelper(model);
		
		Group group = new Group(parent, SWT.NONE);
		group.setLayoutData(gdhfill());
		group.setLayout(new GridLayout(3, false));
		group.setText(JptUiMessages.AddToEarComposite_earMemberShip);
		
		this.addToEar = new Button(group, SWT.CHECK);
		this.addToEar.setText(JptUiMessages.AddToEarComposite_addToEarLabel);
		GridDataFactory.defaultsFor(this.addToEar).span(3, 1).applyTo(this.addToEar);
		this.synchhelper.synchCheckbox(addToEar, ADD_TO_EAR, null);
		
		this.label = new Label(group, SWT.NULL);
		this.label.setText(JptUiMessages.AddToEarComposite_earProjectLabel);
		this.combo = new Combo(group, SWT.NONE);
		this.combo.setLayoutData(gdhfill());
		
		this.newButton = new Button(group, SWT.PUSH);
		this.newButton.setText(JptUiMessages.AddToEarComposite_newButtonLabel);
		GridDataFactory.defaultsFor(this.newButton).applyTo(this.newButton);
		
		this.newButton.addSelectionListener(
			new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent event) {
					handleAddButton();
				}
			});
		
		this.synchhelper.synchCombo(combo, EAR_PROJECT_NAME, new Control[]{label, newButton});
		Dialog.applyDialogFont(parent);
	}
	
	private void handleAddButton() {
		EarProjectWizard wizard = new EarProjectWizard();
		
		WizardDialog dialog = new WizardDialog(newButton.getShell(), wizard);
		
		IRuntime runtime = (IRuntime) this.model.getProperty(FACET_RUNTIME);
		wizard.setRuntimeInDataModel(runtime);
		
		if (dialog.open() != Window.CANCEL) {
			this.model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
			String earproj = wizard.getProjectName();
			this.model.setProperty(EAR_PROJECT_NAME, earproj);
		}
	}
	
	private static GridData gdhfill() {
		return new GridData(GridData.FILL_HORIZONTAL);
	}
	
	public static final GridData gdhspan(GridData gd, int span) {
		gd.horizontalSpan = span;
		return gd;
	}
	
	public void dispose() {
		if (this.synchhelper != null){
			this.synchhelper.dispose();
			this.synchhelper = null;
		}
	}
	
	public String getComboText(){
		return this.combo.getText();
	}
}
