/*******************************************************************************
 * 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
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.wizard;


import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
import org.eclipse.jst.j2ee.ui.project.facet.EarSelectionPanel;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.Display;
import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetInstallPage;

public abstract class J2EEModuleFacetInstallPage extends DataModelFacetInstallPage implements IJ2EEModuleFacetInstallDataModelProperties {

    private IDataModelListener facetVersionListener = null;
    protected Button addDD;
    
	public J2EEModuleFacetInstallPage(String pageName) {
		super(pageName);
	}

	/**
	 * @deprecated This member should not be used any more. The EAR Panel is moved to the first wizard page. 
	 */
	protected EarSelectionPanel earPanel;

	@Override
	public void dispose() {
		if (null != earPanel) {
			earPanel.dispose();
		}
		this.model.removeListener( this.facetVersionListener );
		super.dispose();
	}

	/**
	 * @deprecated This method should not be called any more. The EAR Panel is moved to the first wizard page. 
	 */
	protected void setupEarControl(final Composite parent) {
		Composite c = new Composite(parent, SWT.NONE);
		c.setLayoutData(gdhfill());
		final GridLayout layout = new GridLayout(3, false);
		layout.marginWidth = 0;
		layout.marginHeight = 0;
		c.setLayout(layout);
		this.earPanel = new EarSelectionPanel(model, c);
	}
	
	protected void createGenerateDescriptorControl(Composite parent) {
		createGenerateDescriptorControl(parent, null);
	}
	
	protected void createGenerateDescriptorControl(Composite parent, String ddFileName)	{
        this.addDD = new Button(parent, SWT.CHECK);
        if (ddFileName == null) {
        	this.addDD.setText(Resources.generateDeploymentDescriptor);
        } else {
        	this.addDD.setText(NLS.bind(Resources.generateDeploymentDescriptorWithFileName, ddFileName));
        }
        //synchHelper.synchCheckbox(addDD, GENERATE_DD, null); bug 215284 - see enter()
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        this.addDD.setLayoutData(gd);
	}
	
	protected void registerFacetVersionChangeListener()
	{
        this.facetVersionListener = new IDataModelListener()
        {
            public void propertyChanged( final DataModelEvent event )
            {
                if( event.getFlag() == DataModelEvent.VALUE_CHG &&
                    event.getPropertyName().equals( FACET_VERSION ) )
                {
                    final Runnable runnable = new Runnable()
                    {
                        public void run()
                        {
                            handleFacetVersionChangedEvent();
                        }
                    };
                    if(Thread.currentThread() == Display.getDefault().getThread()){
                    	runnable.run();
                    } else {
                    	Display.getDefault().asyncExec( runnable );
                    }
                }
            }
        };
        
        this.model.addListener( facetVersionListener );
        handleFacetVersionChangedEvent();
	}
	
    protected void handleFacetVersionChangedEvent()
    {
        // The default implementation doesn't do anything. The subclass should override
        // to handle this event.
    }

    private static final class Resources extends NLS {
        public static String generateDeploymentDescriptor;
        public static String generateDeploymentDescriptorWithFileName;

        static {
            initializeMessages(J2EEModuleFacetInstallPage.class.getName(), Resources.class);
        }
    }

    @Override
	protected void enter() {
    	if (isFirstTimeToPage() && addDD != null)
    	{
    		synchHelper.synchCheckbox(addDD, GENERATE_DD, null);
    	}
    	super.enter();
    }

}
