/*******************************************************************************
 * 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.core.resources.IProject;
import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;

public class DataModelAnnotationsStandaloneGroup {

    protected IDataModel model;
    protected DataModelSynchHelper synchHelper;
    protected Button useAnnotations;
    private boolean isForBean;
    private boolean useServletString = false;

    public static final String EJBTAGSET = "ejb"; //$NON-NLS-1$
    public static boolean shouldBeanDefaultUseAnnotations = false;
    public static boolean shouldProjectDefaultUseAnnotations = false;


    private class CheckboxSelectionListener implements SelectionListener {
        public void widgetSelected(SelectionEvent e) {
            Button button = (Button) e.getSource();
            if (isForBean)
                shouldBeanDefaultUseAnnotations = button.getSelection();
            else
                shouldProjectDefaultUseAnnotations = button.getSelection();
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            //do nothing
        }
    }

    private CheckboxSelectionListener checkboxSelectionListener = new CheckboxSelectionListener();

    /**
     * Constructor
     */
    public DataModelAnnotationsStandaloneGroup(Composite parent, IDataModel model, boolean forBean, DataModelSynchHelper syncHelp) {
        this(parent, model, forBean, false, syncHelp);
    }

    /**
     * Constructor
     */
    public DataModelAnnotationsStandaloneGroup(Composite parent, IDataModel model, boolean forBean, boolean useServlet, DataModelSynchHelper syncHelp) {
        super();
        this.model = model;
        this.isForBean = forBean;
        this.useServletString = useServlet;
        synchHelper = syncHelp;
        buildComposites(parent);
    }

    /**
     * @param parent
     */
    protected void buildComposites(Composite parent) {
        // Add separator
        Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 3;
        separator.setLayoutData(gd);
        // Add spacer
        Label spacer = new Label(parent, SWT.NONE);
        GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
        gd1.horizontalSpan = 3;
        spacer.setLayoutData(gd1);
        // Add annotations checkbox and label
        useAnnotations = new Button(parent, SWT.CHECK);
        String labelText;
        if (useServletString)
            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.USE_ANNOTATIONS_SERVLET);
        else if (isForBean)
            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.USE_ANNOTATIONS);
        else
            labelText = J2EEUIMessages.getResourceString(J2EEUIMessages.ADD_ANNOTATIONS_SUPPORT);
        useAnnotations.setText(labelText);
        synchHelper.synchCheckbox(useAnnotations, IAnnotationsDataModel.USE_ANNOTATIONS, null);
        useAnnotations.addSelectionListener(checkboxSelectionListener);
        GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
        gd2.horizontalSpan = 2;
        useAnnotations.setLayoutData(gd2);
        // If for project, set the global annotations supported
        if (!isForBean)
            setEnablement(null);
    }

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

    public boolean isAnnotationsSupported(IProject project) {
        //TODO clean up to be module based, not project based
        try {
            //          if (isForBean) {
            //              AnnotationsController controller =
            // AnnotationsControllerManager.INSTANCE.getAnnotationsController(project);
            //              return (controller !=null && controller.isTagHandlerInstalled(EJBTAGSET));
            //          }
//          J2EEModuleNature nature = null;
//          if (project != null && project.hasNature(IWebNatureConstants.J2EE_NATURE_ID))
//              nature = (J2EEModuleNature) project.getNature(IWebNatureConstants.J2EE_NATURE_ID);
//          else if (project != null && project.hasNature(IEJBNatureConstants.NATURE_ID))
//              nature = (J2EEModuleNature) project.getNature(IEJBNatureConstants.NATURE_ID);
//
//          if (!isForBean || (nature != null && nature.getJ2EEVersion() > J2EEVersionConstants.VERSION_1_2))
                return true;
//          return false;
        } catch (Throwable t) {
            t.printStackTrace();
            return false;
        }
    }

    public void setEnablement(IProject project) {
        //TODO
        //boolean isEnabled = isAnnotationsSupported(project);
        useAnnotations.setEnabled(true);
//      if (!isEnabled || (!isForBean && !shouldProjectDefaultUseAnnotations) || (isForBean && !shouldBeanDefaultUseAnnotations)) {
//          useAnnotations.setSelection(false);
//          model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, Boolean.FALSE);
//      } else {
//          useAnnotations.setSelection(true);
//          model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, Boolean.TRUE);
//      }
    }

    public void setUseServlet(boolean aBoolean) {
        useServletString = aBoolean;
    }
    
    public void setUseAnnotations(boolean aBoolean) {
        if (useAnnotations != null) {
            useAnnotations.setSelection(aBoolean);
            model.setProperty(IAnnotationsDataModel.USE_ANNOTATIONS, new Boolean(aBoolean));
        }
    }
}
