Cleanup: NotNull/Nullable
[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.SystemInfo;
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       String path = provider.getJrePath();
54       if (!StringUtil.isEmpty(path)) {
55         foundJDKs.add(path);
56       }
57     }
58
59     for (Sdk jdk : allJDKs) {
60       String homePath = jdk.getHomePath();
61
62       if (!SystemInfo.isMac) {
63         final File jre = new File(jdk.getHomePath(), "jre");
64         if (jre.isDirectory()) {
65           homePath = jre.getPath();
66         }
67       }
68
69       if (!foundJDKs.contains(homePath)) {
70         foundJDKs.add(homePath);
71       }
72     }
73     myFieldWithHistory.setHistory(foundJDKs);
74     myPathField = new ComponentWithBrowseButton<>(myFieldWithHistory, null);
75     myPathField.addBrowseFolderListener(ExecutionBundle.message("run.configuration.select.alternate.jre.label"),
76                                         ExecutionBundle.message("run.configuration.select.jre.dir.label"),
77                                         null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR,
78                                         TextComponentAccessor.TEXT_FIELD_WITH_HISTORY_WHOLE_TEXT);
79
80     setLayout(new MigLayout("ins 0, gap 10, fill, flowx"));
81     add(myCbEnabled, "shrinkx");
82     add(myPathField, "growx, pushx");
83
84     InsertPathAction.addTo(myFieldWithHistory.getTextEditor());
85
86     myCbEnabled.addActionListener(new ActionListener() {
87       @Override
88       public void actionPerformed(ActionEvent e) {
89         enabledChanged();
90       }
91     });
92     enabledChanged();
93
94     setAnchor(myCbEnabled);
95
96     updateUI();
97   }
98
99   private void enabledChanged() {
100     final boolean pathEnabled = isPathEnabled();
101     GuiUtils.enableChildren(myPathField, pathEnabled);
102     myFieldWithHistory.invalidate(); //need to revalidate inner component
103   }
104
105   public String getPath() {
106     return FileUtil.toSystemIndependentName(myPathField.getChildComponent().getText().trim());
107   }
108
109   private void setPath(@Nullable String path) {
110     myPathField.getChildComponent().setText(StringUtil.notNullize(PathUtil.toSystemDependentName(path)));
111   }
112
113   public boolean isPathEnabled() {
114     return myCbEnabled.isSelected();
115   }
116
117   private void setPathEnabled(boolean b) {
118     myCbEnabled.setSelected(b);
119     enabledChanged();
120   }
121
122   public void init(@Nullable String path, boolean isEnabled){
123     setPathEnabled(isEnabled);
124     setPath(path);
125   }
126
127   @Override
128   public JComponent getAnchor() {
129     return myAnchor;
130   }
131
132   @Override
133   public void setAnchor(JComponent anchor) {
134     myAnchor = anchor;
135     myCbEnabled.setAnchor(anchor);
136   }
137 }