/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.intellij.ideabuck.ui;
import com.facebook.buck.intellij.ideabuck.config.BuckSettingsProvider;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.ui.TextComponentAccessor;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.components.JBTextField;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** Buck Setting GUI, located in "Preference > Tools > Buck". */
public class BuckSettingsUI extends JPanel {
public static final String CUSTOMIZED_INSTALL_FLAGS_HINT =
"input your additional install flags here: eg. --no-cache";
private TextFieldWithBrowseButton buckPathField;
private TextFieldWithBrowseButton adbPathField;
private JBTextField customizedInstallSettingField;
private JCheckBox showDebug;
private JCheckBox enableAutoDeps;
private JCheckBox runAfterInstall;
private JCheckBox multiInstallMode;
private JCheckBox uninstallBeforeInstall;
private JCheckBox customizedInstallSetting;
private BuckSettingsProvider optionsProvider;
public BuckSettingsUI() {
optionsProvider = BuckSettingsProvider.getInstance();
init();
}
private void init() {
setLayout(new BorderLayout());
JPanel container = this;
buckPathField = new TextFieldWithBrowseButton();
FileChooserDescriptor buckFileChooserDescriptor =
new FileChooserDescriptor(true, false, false, false, false, false);
buckPathField.addBrowseFolderListener(
"",
"Buck Executable Path",
null,
buckFileChooserDescriptor,
TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT,
false);
adbPathField = new TextFieldWithBrowseButton();
FileChooserDescriptor adbFileChooserDescriptor =
new FileChooserDescriptor(true, false, false, false, false, false);
adbPathField.addBrowseFolderListener(
"",
"Adb Executable Path",
null,
adbFileChooserDescriptor,
TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT,
false);
customizedInstallSettingField = new JBTextField();
customizedInstallSettingField.getEmptyText().setText(CUSTOMIZED_INSTALL_FLAGS_HINT);
customizedInstallSettingField.setEnabled(false);
showDebug = new JCheckBox("Show debug in tool window");
enableAutoDeps = new JCheckBox("Enable auto dependencies");
runAfterInstall = new JCheckBox("Run after install (-r)");
multiInstallMode = new JCheckBox("Multi-install mode (-x)");
uninstallBeforeInstall = new JCheckBox("Uninstall before installing (-u)");
customizedInstallSetting = new JCheckBox("Use customized install setting: ");
initCustomizedInstallCommandListener();
JPanel buckSettings = new JPanel(new GridBagLayout());
buckSettings.setBorder(IdeBorderFactory.createTitledBorder("Buck Settings", true));
container.add(container = new JPanel(new BorderLayout()), BorderLayout.NORTH);
container.add(buckSettings, BorderLayout.NORTH);
final GridBagConstraints constraints =
new GridBagConstraints(
0,
0,
1,
1,
0,
0,
GridBagConstraints.WEST,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0),
0,
0);
buckSettings.add(new JLabel("Buck Executable Path:"), constraints);
constraints.gridx = 1;
constraints.weightx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
buckSettings.add(buckPathField, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.weightx = 1;
buckSettings.add(new JLabel("Adb Executable Path:"), constraints);
constraints.gridx = 1;
constraints.gridy = 1;
constraints.weightx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
buckSettings.add(adbPathField, constraints);
constraints.gridx = 0;
constraints.gridy = 2;
buckSettings.add(showDebug, constraints);
constraints.gridx = 0;
constraints.gridy = 3;
buckSettings.add(enableAutoDeps, constraints);
JPanel installSettings = new JPanel(new BorderLayout());
installSettings.setBorder(IdeBorderFactory.createTitledBorder("Buck Install Settings", true));
container.add(container = new JPanel(new BorderLayout()), BorderLayout.SOUTH);
container.add(installSettings, BorderLayout.NORTH);
installSettings.add(runAfterInstall, BorderLayout.NORTH);
installSettings.add(installSettings = new JPanel(new BorderLayout()), BorderLayout.SOUTH);
installSettings.add(multiInstallMode, BorderLayout.NORTH);
installSettings.add(installSettings = new JPanel(new BorderLayout()), BorderLayout.SOUTH);
installSettings.add(uninstallBeforeInstall, BorderLayout.NORTH);
installSettings.add(installSettings = new JPanel(new BorderLayout()), BorderLayout.SOUTH);
final GridBagConstraints customConstraints =
new GridBagConstraints(
0,
0,
1,
1,
0,
0,
GridBagConstraints.WEST,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0),
0,
0);
JPanel customizedInstallSetting = new JPanel(new GridBagLayout());
customizedInstallSetting.add(this.customizedInstallSetting, customConstraints);
customConstraints.gridx = 1;
customConstraints.weightx = 1;
customConstraints.fill = GridBagConstraints.HORIZONTAL;
customizedInstallSetting.add(customizedInstallSettingField, customConstraints);
installSettings.add(customizedInstallSetting, BorderLayout.NORTH);
}
public boolean isModified() {
return !Comparing.equal(buckPathField.getText(), optionsProvider.getState().buckExecutable)
|| !Comparing.equal(adbPathField.getText(), optionsProvider.getState().adbExecutable)
|| optionsProvider.getState().runAfterInstall != runAfterInstall.isSelected()
|| optionsProvider.getState().showDebug != showDebug.isSelected()
|| optionsProvider.getState().enableAutoDeps != enableAutoDeps.isSelected()
|| optionsProvider.getState().multiInstallMode != multiInstallMode.isSelected()
|| optionsProvider.getState().uninstallBeforeInstalling
!= uninstallBeforeInstall.isSelected()
|| optionsProvider.getState().customizedInstallSetting
!= customizedInstallSetting.isSelected()
|| !optionsProvider
.getState()
.customizedInstallSettingCommand
.equals(customizedInstallSettingField.getText());
}
public void apply() {
optionsProvider.getState().buckExecutable = buckPathField.getText();
optionsProvider.getState().adbExecutable = adbPathField.getText();
optionsProvider.getState().showDebug = showDebug.isSelected();
optionsProvider.getState().enableAutoDeps = enableAutoDeps.isSelected();
optionsProvider.getState().runAfterInstall = runAfterInstall.isSelected();
optionsProvider.getState().multiInstallMode = multiInstallMode.isSelected();
optionsProvider.getState().uninstallBeforeInstalling = uninstallBeforeInstall.isSelected();
optionsProvider.getState().customizedInstallSetting = customizedInstallSetting.isSelected();
optionsProvider.getState().customizedInstallSettingCommand =
customizedInstallSettingField.getText();
}
public void reset() {
buckPathField.setText(optionsProvider.getState().buckExecutable);
adbPathField.setText(optionsProvider.getState().adbExecutable);
showDebug.setSelected(optionsProvider.getState().showDebug);
enableAutoDeps.setSelected(optionsProvider.getState().enableAutoDeps);
runAfterInstall.setSelected(optionsProvider.getState().runAfterInstall);
multiInstallMode.setSelected(optionsProvider.getState().multiInstallMode);
uninstallBeforeInstall.setSelected(optionsProvider.getState().uninstallBeforeInstalling);
customizedInstallSetting.setSelected(optionsProvider.getState().customizedInstallSetting);
customizedInstallSettingField.setText(
optionsProvider.getState().customizedInstallSettingCommand);
}
private void initCustomizedInstallCommandListener() {
customizedInstallSetting.addItemListener(
new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
customizedInstallSettingField.setEnabled(true);
runAfterInstall.setEnabled(false);
multiInstallMode.setEnabled(false);
uninstallBeforeInstall.setEnabled(false);
} else {
customizedInstallSettingField.setEnabled(false);
runAfterInstall.setEnabled(true);
multiInstallMode.setEnabled(true);
uninstallBeforeInstall.setEnabled(true);
}
}
});
}
}