/*******************************************************************************
 * Copyright (c) 2005, 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 implementation as prop page heirarchy
 * rfrost@bea.com - conversion to single property page impl
 *******************************************************************************/

package org.eclipse.jst.j2ee.internal;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.project.EarUtilities;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;

/**
 * Primary project property page for J2EE dependencies; content is dynamically 
 * generated based on the project facets and will be comprised by a
 * set of IJ2EEDependenciesControl implementations.
 * 
 */
public class J2EEDependenciesPage extends PropertyPage {
	
	public String DESCRIPTION = J2EEUIMessages.getResourceString("DESCRIPTION"); //$NON-NLS-1$

	private IProject project;
	private IJ2EEDependenciesControl[] controls = new IJ2EEDependenciesControl[0];
	
	public J2EEDependenciesPage() {
		super();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
	 */
	@Override
	protected Control createContents(Composite parent) {
		
		// Need to find out what type of project we are handling
		project = (IProject) getElement().getAdapter(IResource.class);
		boolean isEAR = false;
		boolean isWEB = false;
		try {
			final IFacetedProject facetedProject = ProjectFacetsManager.create(project);
			if (facetedProject == null) {
				return getFacetErrorComposite(parent);
			}
			isEAR = facetedProject.hasProjectFacet(ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EAR_MODULE)); 
			isWEB = facetedProject.hasProjectFacet(ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE));
		} catch (CoreException ce) {
			return getFacetErrorComposite(parent);
		}
		
		if (isEAR) {
			return createEARContent(parent);
		} else if (isWEB) {
			return createWebContent(parent);
		} else {
			return createNonEARContent(parent);
		}
	}
	
	private Composite getFacetErrorComposite(final Composite parent) {
		final String errorCheckingFacet = ManifestUIResourceHandler.Error_Checking_Project_Facets;
		setErrorMessage(errorCheckingFacet);
		setValid(false);
		return getErrorComposite(parent, errorCheckingFacet);		
	}
	
	private Composite getErrorComposite(final Composite parent, final String error) {
		final Composite composite = new Composite(parent, SWT.NONE);
		final GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		final Label label= new Label(composite, SWT.NONE);
		label.setText(error);
		return composite;
	}
	
	private Composite createEARContent(final Composite parent) {
		controls = new IJ2EEDependenciesControl[1];
		controls[0] = new AddModulestoEARPropertiesPage(project, this);
		return controls[0].createContents(parent);
	}
	
	private Composite createWebContent(final Composite parent) {
		final boolean standalone = EarUtilities.isStandaloneProject(project);
		
		if (standalone) {
			// only need to create the Web Libraries page
			controls = new IJ2EEDependenciesControl[1];
			controls[0] = new WebLibDependencyPropertiesPage(project, this);
			return controls[0].createContents(parent);
		}
		// Create a tabbed folder with both "J2EE Modules" and "Web Libraries"
		final TabFolder folder = new TabFolder(parent, SWT.LEFT);
		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
		folder.setFont(parent.getFont());

		// Create the two tabs 
		controls = new IJ2EEDependenciesControl[2];
	
		controls[0] = new JARDependencyPropertiesPage(project, this);
		TabItem tab = new TabItem(folder, SWT.NONE);
		tab.setControl(controls[0].createContents(folder));
		tab.setText(ManifestUIResourceHandler.J2EE_Modules);
		controls[1] = new WebLibDependencyPropertiesPage(project, this);		
		tab = new TabItem(folder, SWT.NONE);
		tab.setControl(controls[1].createContents(folder));
		tab.setText(ManifestUIResourceHandler.Web_Libraries);
	
		folder.setSelection(0);
		return folder;
	}
	
	private Composite createNonEARContent(final Composite parent) {
		controls = new IJ2EEDependenciesControl[1];
		final boolean standalone = EarUtilities.isStandaloneProject(project);
		if (standalone) {
			// if not referenced by an EAR, check if referenced by a dynamic web project
			if (J2EEProjectUtilities.getReferencingWebProjects(project).length > 0) {
				controls[0] = new WebRefDependencyPropertiesPage(project, this);
			} else {
				return getUnreferencedErrorComposite(parent);
			}
		} else { 
			controls[0] = new JARDependencyPropertiesPage(project, this);			
		}

		return controls[0].createContents(parent);
	}
	
	private Composite getUnreferencedErrorComposite(final Composite parent) {
		final String msg = ManifestUIResourceHandler.Unreferenced_Module_Error;
		setErrorMessage(msg);
		return getErrorComposite(parent, msg);		
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
	 */
	@Override
	public boolean performOk() {
		for (int i = 0; i < controls.length; i++) {
			if (controls[i] != null) {
				if (!controls[i].performOk()) {
					return false;
				}
			}
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
	 */
	@Override
	public void performDefaults() {
		for (int i = 0; i < controls.length; i++) {
			if (controls[i] != null) {
				controls[i].performDefaults();
			}
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.preference.IPreferencePage#performCancel()
	 */
	@Override
	public boolean performCancel() {
		for (int i = 0; i < controls.length; i++) {
			if (controls[i] != null) {
				if (!controls[i].performCancel()) {
					return false;
				}
			}
		}
		return super.performCancel();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
	 */
	@Override
	public void setVisible(boolean visible) {
		super.setVisible(visible);
		for (int i = 0; i < controls.length; i++) {
			if (controls[i] != null) {
				controls[i].setVisible(visible);
			}
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
	 */
	@Override
	public void dispose() {
		super.dispose();
		for (int i = 0; i < controls.length; i++) {
			if(controls[i] != null){
				controls[i].dispose();
			}
		}
	}

	protected static void createDescriptionComposite(final Composite parent, final String description) {
		Composite descriptionComp = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 1;
		descriptionComp.setLayout(layout);
		descriptionComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		fillDescription(descriptionComp, description);
	}
	
	private static void fillDescription(Composite c, String s) {
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = 250;
		Text text = new Text(c, SWT.READ_ONLY | SWT.WRAP);
		text.setLayoutData(data);
		text.setText(s);
	}
}
