package org.elixir_lang.inspection; import com.intellij.ProjectTopics; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootAdapter; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.ui.EditorNotificationPanel; import com.intellij.ui.EditorNotifications; import org.elixir_lang.ElixirFileType; import org.elixir_lang.ElixirLanguage; import org.elixir_lang.sdk.ElixirSdkRelease; import org.elixir_lang.sdk.ElixirSdkType; import org.elixir_lang.sdk.ElixirSystemUtil; import org.elixir_lang.settings.ElixirExternalToolsConfigurable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Created by zyuyou on 15/7/10. * https://github.com/ignatov/intellij-erlang/blob/master/src/org/intellij/erlang/inspection/SetupSDKNotificationProvider.java * todo: extract the common one */ public class SetupSDKNotificationProvider extends EditorNotifications.Provider<EditorNotificationPanel>{ private static final Key<EditorNotificationPanel> KEY = Key.create("Setup Elixir SDK"); private final Project myProject; public SetupSDKNotificationProvider(Project project, final EditorNotifications notifications){ myProject = project; myProject.getMessageBus().connect(project).subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter() { @Override public void rootsChanged(ModuleRootEvent event) { notifications.updateAllNotifications(); } }); } @NotNull @Override public Key<EditorNotificationPanel> getKey() { return KEY; } @Nullable @Override public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file, @NotNull FileEditor fileEditor) { if(!(file.getFileType() instanceof ElixirFileType)) return null; PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file); if(psiFile == null || psiFile.getLanguage() != ElixirLanguage.INSTANCE) return null; ElixirSdkRelease sdkRelease = ElixirSdkType.getRelease(psiFile); if(sdkRelease != null) return null; return createPanel(myProject, psiFile); } @NotNull private static EditorNotificationPanel createPanel(@NotNull final Project project, @NotNull final PsiFile file) { EditorNotificationPanel panel = new EditorNotificationPanel(); // project.sdk.not.defined -> "Project SDK is not defined" // project.sdk.setup -> "Setup SDK" panel.setText(ProjectBundle.message("project.sdk.not.defined")); panel.createActionLabel(ProjectBundle.message("project.sdk.setup"), new Runnable() { @Override public void run() { if(ElixirSystemUtil.isSmallIde()){ ShowSettingsUtil.getInstance().showSettingsDialog(project, ElixirExternalToolsConfigurable.ELIXIR_RELATED_TOOLS); return; } Sdk projectSdk = ProjectSettingsService.getInstance(project).chooseAndSetSdk(); if(projectSdk == null) return; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { Module module = ModuleUtilCore.findModuleForPsiElement(file); if(module != null){ ModuleRootModificationUtil.setSdkInherited(module); } } }); } }); return panel; } }