/*******************************************************************************
 * Copyright (c) 2003, 2006 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
 * David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.wizard;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
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.DoNotUseMeThisWillBeDeletedPost15;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;

/**
 * This has been slated for removal post WTP 1.5. Do not use this class/interface
 * 
 * @deprecated
 */
public class DataModelAnnotationsStandaloneGroup implements DoNotUseMeThisWillBeDeletedPost15{

    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);
        Dialog.applyDialogFont(parent);
    }

    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));
        }
    }
}
