/*
* 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 & Donát Csikós (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();
}
}