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