org.eclipse.jet.internal.ui.prefs.CompilePreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jet.internal.ui.prefs.CompilePreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 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 - Initial API and implementation
 *
 * </copyright>
 *
 * $Id$
 * /
 *******************************************************************************/

package org.eclipse.jet.internal.ui.prefs;

import java.net.URI;
import java.net.URISyntaxException;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jet.JET2Platform;
import org.eclipse.jet.core.compiler.JETCompilerOptions;
import org.eclipse.jet.core.parser.ast.JETAST;
import org.eclipse.jet.internal.JETPreferences;
import org.eclipse.jet.internal.ui.l10n.Messages;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.PropertyChangeEvent;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;

/**
 * @author pelder
 *
 */
public class CompilePreferencePage extends FieldEditorPreferencePage
        implements IWorkbenchPreferencePage, IWorkbenchPropertyPage {

    private IProject element;
    private StringFieldEditor packageFieldEditor;
    private ExtensionListEditor extFieldEditor;
    private StringFieldEditor srcFolderFieldEditor;
    private StringFieldEditor templatesFolderFieldEditor;
    private BooleanFieldEditor derivedJavaFieldEditor;
    private BooleanFieldEditor projectSpecificSettingsEditor = null;
    private RadioGroupFieldEditor jetVersionFieldEditor;
    private BooleanFieldEditor compileBaseTemplatesFieldEditor = null;
    private StringFieldEditor baseTransformationFieldEditor = null;
    private Composite javaGenerationGroup;
    private Composite v1OptionsGroup;
    private Composite v2OptionsGroup;
    private boolean v1OptionsEnabled;
    private BooleanFieldEditor useJava5FieldEditor;

    /**
     * @param style
     */
    public CompilePreferencePage() {
        super(GRID);
        //      setDescription(Messages.CompilePreferencePage_Description);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
     */
    protected void createFieldEditors() {

        // determine whether the page is showing the workspace scope (Windows > Preferences)
        // or in project scope (Project properties)
        final boolean projectSettings = element != null;
        if (projectSettings) {
            setPreferenceStore(new ScopedPreferenceStore(new ProjectScope(element), JET2Platform.PLUGIN_ID));
        } else {
            setPreferenceStore(new ScopedPreferenceStore(new InstanceScope(), JET2Platform.PLUGIN_ID));
        }

        if (projectSettings) {
            // add a check box to use project specific settings
            projectSpecificSettingsEditor = new BooleanFieldEditor(JETPreferences.PROJECT_SPECIFIC_SETTINGS,
                    Messages.CompilePreferencePage_EnableProjectSettings, getFieldEditorParent());
            addField(projectSpecificSettingsEditor);
            Label horizontalLine = new Label(getFieldEditorParent(), SWT.SEPARATOR | SWT.HORIZONTAL);
            horizontalLine.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
            horizontalLine.setFont(getFieldEditorParent().getFont());
        }

        // create "global" option editors...
        jetVersionFieldEditor = new RadioGroupFieldEditor(JETCompilerOptions.OPTION_JET_SPECIFICATION_VERSION,
                Messages.CompilePreferencePage_JETComformanceGroupLabel, 1,
                new String[][] { { Messages.CompilePreferencePage_JET1_OPTION, String.valueOf(JETAST.JET_SPEC_V1) },
                        { Messages.CompilePreferencePage_JET2_Option, String.valueOf(JETAST.JET_SPEC_V2) }, },
                getFieldEditorParent(), true);
        addField(jetVersionFieldEditor);

        v1OptionsEnabled = getPreferenceStore()
                .getInt(JETCompilerOptions.OPTION_JET_SPECIFICATION_VERSION) == JETAST.JET_SPEC_V1;

        // common generation group
        javaGenerationGroup = createGroup(Messages.CompilePreferencePage_JavaGenerationGroupLabel);

        srcFolderFieldEditor = new StringFieldEditor(JETCompilerOptions.OPTION_COMPILED_TEMPLATE_SRC_DIR,
                Messages.CompilePreferencePage_SourceFolder, javaGenerationGroup);
        addField(srcFolderFieldEditor);

        derivedJavaFieldEditor = new BooleanFieldEditor(JETCompilerOptions.OPTION_SET_JAVA_FILES_AS_DERIVED,
                Messages.CompilePreferencePage_DeriveJavaFiles, javaGenerationGroup);
        addField(derivedJavaFieldEditor);

        useJava5FieldEditor = new BooleanFieldEditor(JETCompilerOptions.OPTION_USE_JAVA5,
                Messages.CompilePreferencePage_use_java5, javaGenerationGroup);
        addField(useJava5FieldEditor);

        // v1 options group
        v1OptionsGroup = createGroup(Messages.CompilePreferencePage_JET1OptionsGroupLabel);
        templatesFolderFieldEditor = new StringFieldEditor(JETCompilerOptions.OPTION_V1_TEMPLATES_DIR,
                Messages.CompilePreferencePage_TemplatesDirLabel, v1OptionsGroup);
        addField(templatesFolderFieldEditor);
        if (projectSettings) {
            baseTransformationFieldEditor = new StringFieldEditor(JETCompilerOptions.OPTION_V1_BASE_TRANSFORMATION,
                    Messages.CompilePreferencePage_BaseLocationsLabel, StringFieldEditor.UNLIMITED,
                    StringFieldEditor.VALIDATE_ON_KEY_STROKE, v1OptionsGroup) {
                protected boolean doCheckState() {
                    String trimmedValue = getStringValue().trim();
                    return trimmedValue.length() == 0 || isValidURIList(trimmedValue);
                }

            };
            baseTransformationFieldEditor.setErrorMessage(Messages.CompilePreferencePage_InvalidBaseLocations);
            addField(baseTransformationFieldEditor);

            compileBaseTemplatesFieldEditor = new BooleanFieldEditor(
                    JETCompilerOptions.OPTION_V1_COMPILE_BASE_TEMPLATES,
                    Messages.CompilePreferencePage_CompileBaseTemplates, v1OptionsGroup);
            addField(compileBaseTemplatesFieldEditor);

        }

        // v2 options group
        v2OptionsGroup = createGroup(Messages.CompilePreferencePage_JET2_OPTIONS_GROUP_LABEL);

        extFieldEditor = new ExtensionListEditor(JETCompilerOptions.OPTION_TEMPLATE_EXT,
                Messages.CompilePreferencePage_FileExtensions, v2OptionsGroup);
        addField(extFieldEditor);

        packageFieldEditor = new StringFieldEditor(JETCompilerOptions.OPTION_COMPILED_TEMPLATE_PACKAGE,
                Messages.CompilePreferencePage_JavaPackage, v2OptionsGroup);
        addField(packageFieldEditor);

    }

    private boolean isValidURIList(String uriList) {
        String[] uriStrings = uriList.split(","); //$NON-NLS-1$
        boolean ok = true;
        for (int i = 0; i < uriStrings.length; i++) {
            try {
                new URI(uriStrings[i]);
            } catch (URISyntaxException e) {
                ok = false;
            }
        }
        return ok;
    }

    /**
     * @param groupTitle
     * @return
     */
    private Composite createGroup(final String groupTitle) {

        final Group group = new Group(getFieldEditorParent(), SWT.NONE);
        group.setFont(getFieldEditorParent().getFont());
        group.setText(groupTitle);
        group.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
        setGroupLayout(group, 2);

        return group;
    }

    /**
     * @param group
     * @param numColumns TODO
     */
    private void setGroupLayout(final Composite group, int numColumns) {
        GridLayout layout = new GridLayout();
        layout.numColumns = numColumns;
        group.setLayout(layout);
    }

    /**
     * 
     */
    private void updateControlEnablement() {
        final boolean projectSettings = projectSpecificSettingsEditor != null;
        // enable "global" options
        boolean enabledGlobalSettings = !projectSettings || projectSpecificSettingsEditor.getBooleanValue();
        jetVersionFieldEditor.setEnabled(enabledGlobalSettings, getFieldEditorParent());
        srcFolderFieldEditor.setEnabled(enabledGlobalSettings, javaGenerationGroup);
        derivedJavaFieldEditor.setEnabled(enabledGlobalSettings, javaGenerationGroup);
        useJava5FieldEditor.setEnabled(enabledGlobalSettings, javaGenerationGroup);
        if (!enabledGlobalSettings) {
            srcFolderFieldEditor.loadDefault();
            derivedJavaFieldEditor.loadDefault();
            jetVersionFieldEditor.loadDefault();
            useJava5FieldEditor.loadDefault();
        }

        // Enable JET1 options
        if (projectSettings) {
            boolean enableV1Options = v1OptionsEnabled && enabledGlobalSettings;
            baseTransformationFieldEditor.setEnabled(enableV1Options, v1OptionsGroup);
            compileBaseTemplatesFieldEditor.setEnabled(enableV1Options, v1OptionsGroup);
            templatesFolderFieldEditor.setEnabled(enableV1Options, v1OptionsGroup);
            if (!enableV1Options) {
                baseTransformationFieldEditor.loadDefault();
                compileBaseTemplatesFieldEditor.loadDefault();
                templatesFolderFieldEditor.loadDefault();
            }
        }

        // Enable JET2 options
        if (projectSettings) {
            boolean enableV2Options = !v1OptionsEnabled && enabledGlobalSettings;
            extFieldEditor.setEnabled(enableV2Options, v2OptionsGroup);
            packageFieldEditor.setEnabled(enableV2Options, v2OptionsGroup);
            if (!enableV2Options) {
                extFieldEditor.loadDefault();
                packageFieldEditor.loadDefault();
            }
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
    }

    public IAdaptable getElement() {
        return element;
    }

    public void setElement(IAdaptable element) {
        this.element = (IProject) element;
    }

    protected void initialize() {
        super.initialize();
        if (projectSpecificSettingsEditor != null) {
            updateControlEnablement();
        }
    }

    public void propertyChange(PropertyChangeEvent event) {
        super.propertyChange(event);
        if (event.getSource() == projectSpecificSettingsEditor && FieldEditor.VALUE.equals(event.getProperty())) {
            updateControlEnablement();
        } else if (event.getSource() == jetVersionFieldEditor && FieldEditor.VALUE.equals(event.getProperty())) {
            v1OptionsEnabled = String.valueOf(JETAST.JET_SPEC_V1).equals(event.getNewValue());
            updateControlEnablement();
        }
    }

    protected void performDefaults() {
        super.performDefaults();
        if (projectSpecificSettingsEditor != null) {
            updateControlEnablement();
        }

    }

    public boolean performOk() {
        final boolean ok = super.performOk();
        if (ok) {
            try {
                if (element != null) {
                    element.build(IncrementalProjectBuilder.CLEAN_BUILD, null);
                } else {
                    ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.CLEAN_BUILD, null);
                }
            } catch (CoreException e) {
                // build failed, we don't care
            }
        }
        return ok;
    }
}