| /* |
| * Copyright 2016 The Bazel Authors. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.google.idea.blaze.base.wizard2.ui; |
| |
| import com.google.common.base.Strings; |
| import com.google.idea.blaze.base.async.process.ExternalTask; |
| import com.google.idea.blaze.base.io.FileAttributeProvider; |
| import com.google.idea.blaze.base.settings.BlazeUserSettings; |
| import com.google.idea.blaze.base.settings.ui.BlazeUserSettingsConfigurable; |
| import com.google.idea.blaze.base.ui.BlazeValidationResult; |
| import com.google.idea.blaze.base.ui.FileSelectorWithStoredHistory; |
| import com.google.idea.blaze.base.wizard2.BlazeNewProjectBuilder; |
| import com.intellij.ui.components.panels.VerticalLayout; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import javax.annotation.Nullable; |
| import javax.swing.JComponent; |
| import javax.swing.JLabel; |
| import javax.swing.JPanel; |
| import javax.swing.JSeparator; |
| import javax.swing.border.EmptyBorder; |
| |
| /** UI for selecting the build system binary during the import process. */ |
| public class SelectBazelBinaryControl { |
| |
| public final BlazeNewProjectBuilder builder; |
| |
| private boolean uiInitialized = false; |
| private JPanel component; |
| private FileSelectorWithStoredHistory bazelBinaryPath; |
| |
| public SelectBazelBinaryControl(BlazeNewProjectBuilder builder) { |
| this.builder = builder; |
| } |
| |
| public JComponent getUiComponent() { |
| if (!uiInitialized) { |
| initUi(); |
| uiInitialized = true; |
| } |
| return component; |
| } |
| |
| private void initUi() { |
| bazelBinaryPath = |
| FileSelectorWithStoredHistory.create( |
| BlazeUserSettingsConfigurable.BAZEL_BINARY_PATH_KEY, "Specify the bazel binary path"); |
| bazelBinaryPath.setText(getInitialBinaryPath()); |
| |
| component = new JPanel(new VerticalLayout(4)); |
| component.add(new JLabel("Select a bazel binary")); |
| component.add(new JSeparator()); |
| |
| JPanel content = new JPanel(new VerticalLayout(12)); |
| content.setBorder(new EmptyBorder(50, 100, 0, 100)); |
| component.add(content); |
| |
| content.add(new JLabel("Specify a bazel binary to be used for all bazel projects")); |
| content.add(bazelBinaryPath); |
| } |
| |
| public BlazeValidationResult validate() { |
| String binaryPath = getBazelPath(); |
| if (Strings.isNullOrEmpty(binaryPath)) { |
| return BlazeValidationResult.failure("Select a bazel binary"); |
| } |
| if (!FileAttributeProvider.getInstance().isFile(new File(binaryPath))) { |
| return BlazeValidationResult.failure("Invalid bazel binary: file does not exist"); |
| } |
| return BlazeValidationResult.success(); |
| } |
| |
| public void commit() { |
| if (!Strings.isNullOrEmpty(getBazelPath())) { |
| BlazeUserSettings.getInstance().setBazelBinaryPath(getBazelPath()); |
| } |
| } |
| |
| private String getBazelPath() { |
| String text = bazelBinaryPath.getText(); |
| return text != null ? text.trim() : ""; |
| } |
| |
| private static String getInitialBinaryPath() { |
| String existingPath = BlazeUserSettings.getInstance().getBazelBinaryPath(); |
| if (existingPath != null) { |
| return existingPath; |
| } |
| return guessBinaryPath(); |
| } |
| |
| /** Try to guess an initial binary path */ |
| @Nullable |
| private static String guessBinaryPath() { |
| ByteArrayOutputStream stdout = new ByteArrayOutputStream(); |
| int retVal = ExternalTask.builder().args("which", "bazel").stdout(stdout).build().run(); |
| if (retVal != 0) { |
| return null; |
| } |
| return stdout.toString().trim(); |
| } |
| } |