simplify GTDUCollector a bit more
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / LanguageLevelCombo.java
1 // Copyright 2000-2018 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.openapi.roots.ui.configuration;
3
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.projectRoots.JavaSdk;
6 import com.intellij.openapi.projectRoots.JavaSdkVersion;
7 import com.intellij.openapi.projectRoots.Sdk;
8 import com.intellij.openapi.roots.LanguageLevelProjectExtension;
9 import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
10 import com.intellij.openapi.ui.ComboBox;
11 import com.intellij.pom.java.AcceptedLanguageLevelsSettings;
12 import com.intellij.pom.java.LanguageLevel;
13 import com.intellij.ui.ColoredListCellRenderer;
14 import com.intellij.ui.SimpleTextAttributes;
15 import org.jetbrains.annotations.Nls;
16 import org.jetbrains.annotations.NotNull;
17
18 import javax.swing.*;
19
20 /**
21  * @author ven
22  */
23 public abstract class LanguageLevelCombo extends ComboBox<Object> {
24   private final @Nls String myDefaultItem;
25
26   public LanguageLevelCombo(@Nls String defaultItem) {
27     myDefaultItem = defaultItem;
28     insertItemAt(myDefaultItem, 0);
29     for (LanguageLevel level : LanguageLevel.values()) {
30       addItem(level);
31     }
32
33     setRenderer(new ColoredListCellRenderer<Object>() {
34       @Override
35       protected void customizeCellRenderer(@NotNull JList<?> list, Object value, int index, boolean selected, boolean hasFocus) {
36         if (value instanceof LanguageLevel) {
37           append(((LanguageLevel)value).getPresentableText());
38         }
39         else if (value instanceof String) {  // default for SDK or project
40           append((String)value);
41           LanguageLevel defaultLevel = getDefaultLevel();
42           if (defaultLevel != null) {
43             append(" (" + defaultLevel.getPresentableText() + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
44           }
45         }
46       }
47     });
48   }
49
50   private void checkAcceptedLevel(LanguageLevel selectedLevel) {
51     if (selectedLevel == null)
52       return;
53     LanguageLevel level = AcceptedLanguageLevelsSettings.checkAccepted(this, selectedLevel);
54     if (level == null) {
55       setSelectedItem(AcceptedLanguageLevelsSettings.getHighestAcceptedLevel());
56     }
57   }
58
59   public void reset(@NotNull Project project) {
60     Sdk sdk = ProjectRootManagerEx.getInstanceEx(project).getProjectSdk();
61     sdkUpdated(sdk, project.isDefault());
62
63     LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(project);
64     if (extension.isDefault()) {
65       setSelectedItem(myDefaultItem);
66     }
67     else {
68       setSelectedItem(extension.getLanguageLevel());
69     }
70   }
71
72   protected abstract LanguageLevel getDefaultLevel();
73
74   void sdkUpdated(Sdk sdk, boolean isDefaultProject) {
75     LanguageLevel newLevel = null;
76     if (sdk != null) {
77       JavaSdkVersion version = JavaSdk.getInstance().getVersion(sdk);
78       if (version != null) {
79         newLevel = version.getMaxLanguageLevel();
80       }
81     }
82     updateDefaultLevel(newLevel, isDefaultProject);
83     if (getSelectedItem() == myDefaultItem) {
84       checkAcceptedLevel(newLevel);
85     }
86   }
87
88   private void updateDefaultLevel(LanguageLevel newLevel, boolean isDefaultProject) {
89     if (newLevel == null && !isDefaultProject) {
90       if (getSelectedItem() == myDefaultItem) {
91         setSelectedItem(getDefaultLevel());
92       }
93     }
94     repaint();
95   }
96
97   public LanguageLevel getSelectedLevel() {
98     Object item = getSelectedItem();
99     return item instanceof LanguageLevel ? (LanguageLevel)item : getDefaultLevel();
100   }
101
102   public boolean isDefault() {
103     return !(getSelectedItem() instanceof LanguageLevel);
104   }
105
106   @Override
107   public void setSelectedItem(Object anObject) {
108     super.setSelectedItem(anObject == null || anObject == LanguageLevel.JDK_X ? myDefaultItem : anObject);
109     checkAcceptedLevel(getSelectedLevel());
110   }
111 }