org.eclipse.buildship.ui.launch.JavaHomeTab.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buildship.ui.launch.JavaHomeTab.java

Source

/*
 * Copyright (c) 2015 the original author or authors.
 * 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:
 *     Etienne Studer & Dont Csiks (Gradle Inc.) - initial API and implementation and initial documentation
 */

package org.eclipse.buildship.ui.launch;

import java.io.File;

import com.google.common.base.Optional;
import com.google.common.base.Strings;

import com.gradleware.tooling.toolingutils.binding.Validator;

import org.eclipse.buildship.ui.i18n.UiMessages;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.Group;
import org.eclipse.swt.widgets.Text;

import org.eclipse.buildship.core.i18n.CoreMessages;
import org.eclipse.buildship.core.launch.GradleRunConfigurationAttributes;
import org.eclipse.buildship.core.util.file.FileUtils;
import org.eclipse.buildship.core.util.variable.ExpressionUtils;
import org.eclipse.buildship.core.util.binding.Validators;
import org.eclipse.buildship.ui.util.file.DirectoryDialogSelectionListener;
import org.eclipse.buildship.ui.util.font.FontUtils;
import org.eclipse.buildship.ui.util.widget.UiBuilder;

/**
 * Specifies the Java home to apply when executing tasks via the run configurations.
 */
public final class JavaHomeTab extends AbstractLaunchConfigurationTab {

    private final Font defaultFont;
    private final UiBuilder.UiBuilderFactory builderFactory;
    private final Validator<File> javaHomeValidator;

    private Text javaHomeText;

    public JavaHomeTab() {
        this.defaultFont = FontUtils.getDefaultDialogFont();
        this.builderFactory = new UiBuilder.UiBuilderFactory(this.defaultFont);
        this.javaHomeValidator = Validators
                .optionalDirectoryValidator(CoreMessages.RunConfiguration_Label_JavaHome);
    }

    @Override
    public String getName() {
        return LaunchMessages.Tab_Name_JavaHome;
    }

    @Override
    public Image getImage() {
        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
    }

    @Override
    public void createControl(Composite parent) {
        Composite page = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        page.setLayout(layout);
        setControl(page);

        Group javaHomeGroup = createGroup(page, CoreMessages.RunConfiguration_Label_JavaHome + ":");
        createJavaHomeSelectionControl(javaHomeGroup);
    }

    private Group createGroup(Composite parent, String groupName) {
        Group group = new Group(parent, SWT.NONE);
        group.setText(groupName);
        group.setLayout(new GridLayout(2, false));
        group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        return group;
    }

    private void createJavaHomeSelectionControl(Composite root) {
        this.javaHomeText = this.builderFactory.newText(root).alignFillHorizontal().control();
        this.javaHomeText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent event) {
                updateLaunchConfigurationDialog();
            }
        });

        Button javaHomeBrowseButton = this.builderFactory.newButton(root).alignLeft()
                .text(UiMessages.Button_Label_Browse).control();
        javaHomeBrowseButton.addSelectionListener(new DirectoryDialogSelectionListener(root.getShell(),
                this.javaHomeText, CoreMessages.RunConfiguration_Label_JavaHome));
    }

    @Override
    public void initializeFrom(ILaunchConfiguration configuration) {
        GradleRunConfigurationAttributes configurationAttributes = GradleRunConfigurationAttributes
                .from(configuration);
        this.javaHomeText.setText(Strings.nullToEmpty(configurationAttributes.getJavaHomeExpression()));
    }

    @Override
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
        GradleRunConfigurationAttributes.applyJavaHomeExpression(Strings.emptyToNull(this.javaHomeText.getText()),
                configuration);
    }

    @SuppressWarnings("Contract")
    @Override
    public boolean isValid(ILaunchConfiguration launchConfig) {
        String javaHomeExpression = Strings.emptyToNull(this.javaHomeText.getText());

        String javaHomeResolved;
        try {
            javaHomeResolved = ExpressionUtils.decode(javaHomeExpression);
        } catch (CoreException e) {
            setErrorMessage(NLS.bind(LaunchMessages.ErrorMessage_CannotResolveExpression_0, javaHomeExpression));
            return false;
        }

        File javaHome = FileUtils.getAbsoluteFile(javaHomeResolved).orNull();
        Optional<String> error = this.javaHomeValidator.validate(javaHome);
        setErrorMessage(error.orNull());
        return !error.isPresent();
    }

    @Override
    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
        // leave the controls empty
    }

    @Override
    public void dispose() {
        this.defaultFont.dispose();
        super.dispose();
    }

}