decouple TextFieldWithBrowseButton logic from EnvironmentVariablesComponent

This commit is contained in:
Sergey Simonchik
2014-06-17 02:08:33 +04:00
parent 36662d5ade
commit 88a63ceca1
2 changed files with 162 additions and 93 deletions
@@ -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<TextFieldWithBrowseButton> implements UserActivityProviderComponent {
private boolean myPassParentEnvs;
private final Map<String, String> myEnvs = new THashMap<String, String>();
@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<TextFieldWit
@NonNls private static final String OPTION = "option";
@NonNls private static final String ENV_VARIABLES = "ENV_VARIABLES";
private final List<ChangeListener> 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<String, String> 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<String, String> 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<String, String> envs) {
@@ -170,56 +134,11 @@ public class EnvironmentVariablesComponent extends LabeledComponent<TextFieldWit
@Override
public void addChangeListener(final ChangeListener changeListener) {
myListeners.add(changeListener);
myEnvsTextField.addChangeListener(changeListener);
}
@Override
public void removeChangeListener(final 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(EnvironmentVariablesComponent.this, true);
myEnvVariablesTable = new EnvVariablesTable();
final List<EnvironmentVariable> envVariables = new ArrayList<EnvironmentVariable>();
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<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();
}
myEnvsTextField.removeChangeListener(changeListener);
}
}
@@ -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<String, String> myEnvs = new THashMap<String, String>();
private boolean myPassParentEnvs;
private final List<ChangeListener> 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<String, String> getEnvs() {
return myEnvs;
}
public void setEnvs(@NotNull Map<String, String> envs) {
myEnvs.clear();
myEnvs.putAll(envs);
String envsStr = stringifyEnvs(myEnvs);
myEnvsTextField.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();
}
}
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<EnvironmentVariable> envVariables = ContainerUtil.newArrayList();
for (Map.Entry<String, String> 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<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();
}
}
}