/* * Copyright (c) 2016 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 */ package org.eclipse.buildship.ui.preferences; 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.core.runtime.CoreException; import org.eclipse.jface.preference.PreferencePage; 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.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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.buildship.core.CorePlugin; import org.eclipse.buildship.core.configuration.ConfigurationManager; import org.eclipse.buildship.core.configuration.WorkspaceConfiguration; import org.eclipse.buildship.core.i18n.CoreMessages; import org.eclipse.buildship.core.util.binding.Validators; import org.eclipse.buildship.core.util.file.FileUtils; import org.eclipse.buildship.core.util.variable.ExpressionUtils; import org.eclipse.buildship.ui.i18n.UiMessages; import org.eclipse.buildship.ui.launch.LaunchMessages; import org.eclipse.buildship.ui.util.file.DirectoryDialogSelectionListener; import org.eclipse.buildship.ui.util.font.FontUtils; import org.eclipse.buildship.ui.util.widget.HoverText; import org.eclipse.buildship.ui.util.widget.UiBuilder; /** * The main workspace preference page for Buildship. Currently only used to configure the Gradle * User Home. */ public class GradleWorkbenchPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private final Font defaultFont; private final UiBuilder.UiBuilderFactory builderFactory; private final Validator<File> gradleUserHomeValidator; private Text gradleUserHomeText; private Button offlineModeCheckbox; private Button buildScansCheckbox; public GradleWorkbenchPreferencePage() { this.defaultFont = FontUtils.getDefaultDialogFont(); this.builderFactory = new UiBuilder.UiBuilderFactory(this.defaultFont); this.gradleUserHomeValidator = Validators.optionalDirectoryValidator(CoreMessages.Preference_Label_GradleUserHome); } @Override protected Control createContents(Composite parent) { Composite page = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); page.setLayout(layout); Group gradleUserHomeGroup = createGroup(page, CoreMessages.Preference_Label_GradleUserHome + ":"); createGradleUserHomeSelectionControl(gradleUserHomeGroup); createOfflineModeCheckbox(page); createBuildScansCheckbox(page); initFields(); return page; } private void createOfflineModeCheckbox(Composite parent) { this.offlineModeCheckbox = new Button(parent, SWT.CHECK); this.offlineModeCheckbox.setText(CoreMessages.Preference_Label_OfflineMode); } private void createBuildScansCheckbox(Composite parent) { this.buildScansCheckbox = new Button(parent, SWT.CHECK); this.buildScansCheckbox.setText(CoreMessages.Preference_Label_BuildScans); HoverText.createAndAttach(this.buildScansCheckbox, CoreMessages.Preference_Label_BuildScansHover); } 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 createGradleUserHomeSelectionControl(Composite root) { this.gradleUserHomeText = this.builderFactory.newText(root).alignFillHorizontal().control(); this.gradleUserHomeText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validate(); } }); Button gradleUserHomeBrowseButton = this.builderFactory.newButton(root).alignLeft().text(UiMessages.Button_Label_Browse).control(); DirectoryDialogSelectionListener directoryDialogListener = new DirectoryDialogSelectionListener(root.getShell(), this.gradleUserHomeText, CoreMessages.Preference_Label_GradleUserHome); gradleUserHomeBrowseButton.addSelectionListener(directoryDialogListener); } private void validate() { String resolvedGradleUserHome = getResolvedGradleUserHome(); File gradleUserHome = FileUtils.getAbsoluteFile(resolvedGradleUserHome).orNull(); Optional<String> error = this.gradleUserHomeValidator.validate(gradleUserHome); setValid(!error.isPresent()); setErrorMessage(error.orNull()); } private String getResolvedGradleUserHome() { String gradleUserHomeExpression = Strings.emptyToNull(this.gradleUserHomeText.getText()); String gradleUserHomeResolved = null; try { gradleUserHomeResolved = ExpressionUtils.decode(gradleUserHomeExpression); } catch (CoreException e) { setErrorMessage(NLS.bind(LaunchMessages.ErrorMessage_CannotResolveExpression_0, gradleUserHomeExpression)); setValid(false); } return gradleUserHomeResolved; } private void initFields() { WorkspaceConfiguration config = CorePlugin.configurationManager().loadWorkspaceConfiguration(); File gradleUserHome = config.getGradleUserHome(); this.gradleUserHomeText.setText(gradleUserHome == null ? "" : gradleUserHome.getPath()); this.offlineModeCheckbox.setSelection(config.isOffline()); this.buildScansCheckbox.setSelection(config.isBuildScansEnabled()); } @Override public boolean performOk() { String gradleUserHome = this.gradleUserHomeText.getText(); ConfigurationManager manager = CorePlugin.configurationManager(); WorkspaceConfiguration workspaceConfig = new WorkspaceConfiguration(gradleUserHome.isEmpty() ? null : new File(gradleUserHome), this.offlineModeCheckbox.getSelection(), this.buildScansCheckbox.getSelection()); manager.saveWorkspaceConfiguration(workspaceConfig); return super.performOk(); } @Override protected void performDefaults() { this.gradleUserHomeText.setText(""); super.performDefaults(); } @Override public void dispose() { this.defaultFont.dispose(); super.dispose(); } @Override public void init(IWorkbench workbench) { } }