diff --git a/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesComponent.java b/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesComponent.java index 87d8b4a89240..f022608750f4 100644 --- a/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesComponent.java +++ b/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesComponent.java @@ -21,35 +21,21 @@ package com.intellij.execution.configuration; 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.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Comparing; import com.intellij.ui.UserActivityProviderComponent; import com.intellij.util.ArrayUtil; -import com.intellij.util.StringBuilderSpinAllocator; -import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashMap; import org.jdom.Element; import org.jetbrains.annotations.NonNls; 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.io.File; -import java.util.*; -import java.util.List; +import java.util.HashMap; +import java.util.Map; public class EnvironmentVariablesComponent extends LabeledComponent implements UserActivityProviderComponent { - private boolean myPassParentEnvs; - private final Map myEnvs = new THashMap(); @NonNls private static final String ENVS = "envs"; @NonNls public static final String ENV = "env"; @NonNls public static final String NAME = "name"; @@ -57,52 +43,30 @@ public class EnvironmentVariablesComponent extends LabeledComponent myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); + private final EnvironmentVariablesTextField myEnvsTextField; public EnvironmentVariablesComponent() { super(); - final TextFieldWithBrowseButton envsTestField = new TextFieldWithBrowseButton(); - envsTestField.setEditable(false); - setComponent(envsTestField); + myEnvsTextField = new EnvironmentVariablesTextField(); + setComponent(myEnvsTextField.getComponent()); setText(ExecutionBundle.message("environment.variables.component.title")); - getComponent().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent e) { - new MyEnvironmentVariablesDialog().show(); - } - }); } public void setEnvs(@NotNull Map envs) { - myEnvs.clear(); - myEnvs.putAll(envs); - @NonNls final StringBuilder buf = StringBuilderSpinAllocator.alloc(); - try { - for (String variable : myEnvs.keySet()) { - buf.append(variable).append("=").append(myEnvs.get(variable)).append(";"); - } - if (buf.length() > 0) buf.deleteCharAt(buf.length() - 1); //trim last ; - getComponent().setText(buf.toString()); - } - finally { - StringBuilderSpinAllocator.dispose(buf); - } + myEnvsTextField.setEnvs(envs); } @NotNull public Map getEnvs() { - return myEnvs; + return myEnvsTextField.getEnvs(); } public boolean isPassParentEnvs() { - return myPassParentEnvs; + return myEnvsTextField.isPassParentEnvs(); } - public void setPassParentEnvs(final boolean passDefaultVariables) { - if (myPassParentEnvs != passDefaultVariables) { - myPassParentEnvs = passDefaultVariables; - fireStateChanged(); - } + public void setPassParentEnvs(final boolean passParentEnvs) { + myEnvsTextField.setPassParentEnvs(passParentEnvs); } public static void readExternal(Element element, Map envs) { @@ -170,56 +134,11 @@ public class EnvironmentVariablesComponent extends LabeledComponent envVariables = new ArrayList(); - for (String envVariable : myEnvs.keySet()) { - envVariables.add(new EnvironmentVariable(envVariable, myEnvs.get(envVariable), 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 envs = new LinkedHashMap(); - for (EnvironmentVariable variable : myEnvVariablesTable.getEnvironmentVariables()) { - envs.put(variable.getName(), variable.getValue()); - } - setEnvs(envs); - setPassParentEnvs(myUseDefaultCb.isSelected()); - super.doOKAction(); - } + myEnvsTextField.removeChangeListener(changeListener); } } diff --git a/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesTextField.java b/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesTextField.java new file mode 100644 index 000000000000..8dd201913ffb --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/configuration/EnvironmentVariablesTextField.java @@ -0,0 +1,150 @@ +/* + * 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.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.util.containers.ContainerUtil; +import gnu.trove.THashMap; +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.*; +import java.util.List; + +public class EnvironmentVariablesTextField { + + private final TextFieldWithBrowseButton myEnvsTextField; + private final Map myEnvs = new THashMap(); + private boolean myPassParentEnvs; + private final List myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); + + public EnvironmentVariablesTextField() { + myEnvsTextField = new TextFieldWithBrowseButton(); + myEnvsTextField.setEditable(false); + myEnvsTextField.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent e) { + new MyEnvironmentVariablesDialog().show(); + } + }); + } + + @NotNull + public TextFieldWithBrowseButton getComponent() { + return myEnvsTextField; + } + + @NotNull + public Map getEnvs() { + return myEnvs; + } + + public void setEnvs(@NotNull Map envs) { + myEnvs.clear(); + myEnvs.putAll(envs); + String envsStr = stringifyEnvs(myEnvs); + myEnvsTextField.setText(envsStr); + } + + @NotNull + private static String stringifyEnvs(@NotNull Map envs) { + if (envs.isEmpty()) { + return ""; + } + StringBuilder buf = new StringBuilder(); + for (Map.Entry 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(); + } + } + + public void addChangeListener(ChangeListener changeListener) { + myListeners.add(changeListener); + } + + 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(myEnvsTextField, true); + myEnvVariablesTable = new EnvVariablesTable(); + List envVariables = ContainerUtil.newArrayList(); + for (Map.Entry entry : myEnvs.entrySet()) { + envVariables.add(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 envs = new LinkedHashMap(); + for (EnvironmentVariable variable : myEnvVariablesTable.getEnvironmentVariables()) { + envs.put(variable.getName(), variable.getValue()); + } + setEnvs(envs); + setPassParentEnvs(myUseDefaultCb.isSelected()); + super.doOKAction(); + } + } +}