EditorConfig documentation test
[idea/community.git] / java / execution / impl / src / com / intellij / execution / ui / AlternativeJREPanel.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.execution.ui;
3
4 import com.intellij.execution.ExecutionBundle;
5 import com.intellij.ide.util.BrowseFilesListener;
6 import com.intellij.openapi.projectRoots.ProjectJdkTable;
7 import com.intellij.openapi.projectRoots.Sdk;
8 import com.intellij.openapi.ui.ComponentWithBrowseButton;
9 import com.intellij.openapi.ui.TextComponentAccessor;
10 import com.intellij.openapi.util.SystemInfoRt;
11 import com.intellij.openapi.util.io.FileUtil;
12 import com.intellij.openapi.util.text.StringUtil;
13 import com.intellij.ui.GuiUtils;
14 import com.intellij.ui.InsertPathAction;
15 import com.intellij.ui.PanelWithAnchor;
16 import com.intellij.ui.TextFieldWithHistory;
17 import com.intellij.ui.components.JBCheckBox;
18 import com.intellij.util.PathUtil;
19 import net.miginfocom.swing.MigLayout;
20 import org.jetbrains.annotations.Nullable;
21
22 import javax.swing.*;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.io.File;
26 import java.util.ArrayList;
27
28 /**
29  * User: anna
30  *
31  * @deprecated use {@link JrePathEditor} instead
32  */
33 @Deprecated
34 public class AlternativeJREPanel extends JPanel implements PanelWithAnchor {
35   private final ComponentWithBrowseButton<TextFieldWithHistory> myPathField;
36   private final JBCheckBox myCbEnabled;
37   final TextFieldWithHistory myFieldWithHistory;
38   private JComponent myAnchor;
39
40   public AlternativeJREPanel() {
41     myCbEnabled = new JBCheckBox(ExecutionBundle.message("run.configuration.use.alternate.jre.checkbox"));
42
43     myFieldWithHistory = new TextFieldWithHistory();
44     myFieldWithHistory.setHistorySize(-1);
45     final ArrayList<String> foundJDKs = new ArrayList<>();
46     final Sdk[] allJDKs = ProjectJdkTable.getInstance().getAllJdks();
47
48     for (Sdk sdk : allJDKs) {
49       foundJDKs.add(sdk.getName());
50     }
51
52     for (JreProvider provider : JreProvider.EP_NAME.getExtensionList()) {
53       if (provider.isAvailable()) {
54         String path = provider.getJrePath();
55         if (!StringUtil.isEmpty(path)) {
56           foundJDKs.add(path);
57         }
58       }
59     }
60
61     for (Sdk jdk : allJDKs) {
62       String homePath = jdk.getHomePath();
63
64       if (!SystemInfoRt.isMac) {
65         final File jre = new File(jdk.getHomePath(), "jre");
66         if (jre.isDirectory()) {
67           homePath = jre.getPath();
68         }
69       }
70
71       if (!foundJDKs.contains(homePath)) {
72         foundJDKs.add(homePath);
73       }
74     }
75     myFieldWithHistory.setHistory(foundJDKs);
76     myPathField = new ComponentWithBrowseButton<>(myFieldWithHistory, null);
77     myPathField.addBrowseFolderListener(ExecutionBundle.message("run.configuration.select.alternate.jre.label"),
78                                         ExecutionBundle.message("run.configuration.select.jre.dir.label"),
79                                         null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR,
80                                         TextComponentAccessor.TEXT_FIELD_WITH_HISTORY_WHOLE_TEXT);
81
82     setLayout(new MigLayout("ins 0, gap 10, fill, flowx"));
83     add(myCbEnabled, "shrinkx");
84     add(myPathField, "growx, pushx");
85
86     InsertPathAction.addTo(myFieldWithHistory.getTextEditor());
87
88     myCbEnabled.addActionListener(new ActionListener() {
89       @Override
90       public void actionPerformed(ActionEvent e) {
91         enabledChanged();
92       }
93     });
94     enabledChanged();
95
96     setAnchor(myCbEnabled);
97
98     updateUI();
99   }
100
101   private void enabledChanged() {
102     final boolean pathEnabled = isPathEnabled();
103     GuiUtils.enableChildren(myPathField, pathEnabled);
104     myFieldWithHistory.invalidate(); //need to revalidate inner component
105   }
106
107   public String getPath() {
108     return FileUtil.toSystemIndependentName(myPathField.getChildComponent().getText().trim());
109   }
110
111   private void setPath(@Nullable String path) {
112     myPathField.getChildComponent().setText(StringUtil.notNullize(PathUtil.toSystemDependentName(path)));
113   }
114
115   public boolean isPathEnabled() {
116     return myCbEnabled.isSelected();
117   }
118
119   private void setPathEnabled(boolean b) {
120     myCbEnabled.setSelected(b);
121     enabledChanged();
122   }
123
124   public void init(@Nullable String path, boolean isEnabled){
125     setPathEnabled(isEnabled);
126     setPath(path);
127   }
128
129   @Override
130   public JComponent getAnchor() {
131     return myAnchor;
132   }
133
134   @Override
135   public void setAnchor(JComponent anchor) {
136     myAnchor = anchor;
137     myCbEnabled.setAnchor(anchor);
138   }
139 }