| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * 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.intellij.execution.configuration; |
| |
| import com.google.common.collect.ImmutableMap; |
| import com.intellij.execution.ExecutionBundle; |
| import com.intellij.execution.util.EnvVariablesTable; |
| import com.intellij.execution.util.EnvironmentVariable; |
| import com.intellij.openapi.ui.DialogWrapper; |
| import com.intellij.openapi.ui.TextFieldWithBrowseButton; |
| import com.intellij.ui.UserActivityProviderComponent; |
| import com.intellij.util.Function; |
| import com.intellij.util.containers.ContainerUtil; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import javax.swing.event.ChangeEvent; |
| import javax.swing.event.ChangeListener; |
| import java.awt.*; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.util.Collections; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class EnvironmentVariablesTextFieldWithBrowseButton extends TextFieldWithBrowseButton implements UserActivityProviderComponent { |
| |
| private Map<String, String> myEnvs = Collections.emptyMap(); |
| private boolean myPassParentEnvs; |
| private final List<ChangeListener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); |
| |
| public EnvironmentVariablesTextFieldWithBrowseButton() { |
| super(); |
| setEditable(false); |
| addActionListener(new ActionListener() { |
| @Override |
| public void actionPerformed(final ActionEvent e) { |
| new MyEnvironmentVariablesDialog().show(); |
| } |
| }); |
| } |
| |
| /** |
| * @return unmodifiable Map instance, use {@link #setEnvs(java.util.Map)} to update env vars |
| */ |
| @NotNull |
| public Map<String, String> getEnvs() { |
| return myEnvs; |
| } |
| |
| /** |
| * @param envs Map instance with reliable user-specified iteration order, |
| * like {@link java.util.LinkedHashMap} or {@link com.google.common.collect.ImmutableMap} |
| */ |
| public void setEnvs(@NotNull Map<String, String> envs) { |
| myEnvs = ImmutableMap.copyOf(envs); |
| String envsStr = stringifyEnvs(myEnvs); |
| setText(envsStr); |
| } |
| |
| @NotNull |
| private static String stringifyEnvs(@NotNull Map<String, String> envs) { |
| if (envs.isEmpty()) { |
| return ""; |
| } |
| StringBuilder buf = new StringBuilder(); |
| for (Map.Entry<String, String> entry : envs.entrySet()) { |
| if (buf.length() > 0) { |
| buf.append(";"); |
| } |
| buf.append(entry.getKey()).append("=").append(entry.getValue()); |
| } |
| return buf.toString(); |
| } |
| |
| public boolean isPassParentEnvs() { |
| return myPassParentEnvs; |
| } |
| |
| public void setPassParentEnvs(boolean passParentEnvs) { |
| if (myPassParentEnvs != passParentEnvs) { |
| myPassParentEnvs = passParentEnvs; |
| fireStateChanged(); |
| } |
| } |
| |
| @Override |
| public void addChangeListener(ChangeListener changeListener) { |
| myListeners.add(changeListener); |
| } |
| |
| @Override |
| public void removeChangeListener(ChangeListener changeListener) { |
| myListeners.remove(changeListener); |
| } |
| |
| private void fireStateChanged() { |
| for (ChangeListener listener : myListeners) { |
| listener.stateChanged(new ChangeEvent(this)); |
| } |
| } |
| |
| private class MyEnvironmentVariablesDialog extends DialogWrapper { |
| private final EnvVariablesTable myEnvVariablesTable; |
| private final JCheckBox myUseDefaultCb = new JCheckBox(ExecutionBundle.message("env.vars.checkbox.title")); |
| private final JPanel myWholePanel = new JPanel(new BorderLayout()); |
| |
| protected MyEnvironmentVariablesDialog() { |
| super(EnvironmentVariablesTextFieldWithBrowseButton.this, true); |
| myEnvVariablesTable = new EnvVariablesTable(); |
| List<EnvironmentVariable> envVariables = ContainerUtil.map(myEnvs.entrySet(), new Function<Map.Entry<String, String>, EnvironmentVariable>() { |
| @Override |
| public EnvironmentVariable fun(Map.Entry<String, String> entry) { |
| return new EnvironmentVariable(entry.getKey(), entry.getValue(), false); |
| } |
| }); |
| myEnvVariablesTable.setValues(envVariables); |
| myUseDefaultCb.setSelected(isPassParentEnvs()); |
| myWholePanel.add(myEnvVariablesTable.getComponent(), BorderLayout.CENTER); |
| myWholePanel.add(myUseDefaultCb, BorderLayout.SOUTH); |
| setTitle(ExecutionBundle.message("environment.variables.dialog.title")); |
| init(); |
| } |
| |
| @Override |
| @Nullable |
| protected JComponent createCenterPanel() { |
| return myWholePanel; |
| } |
| |
| @Override |
| protected void doOKAction() { |
| myEnvVariablesTable.stopEditing(); |
| final Map<String, String> envs = new LinkedHashMap<String, String>(); |
| for (EnvironmentVariable variable : myEnvVariablesTable.getEnvironmentVariables()) { |
| envs.put(variable.getName(), variable.getValue()); |
| } |
| setEnvs(envs); |
| setPassParentEnvs(myUseDefaultCb.isSelected()); |
| super.doOKAction(); |
| } |
| } |
| } |