diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 6e59693d1c3..7bc2eb532dc 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -289,6 +289,7 @@
+
diff --git a/idea/src/org/jetbrains/jet/plugin/versions/UnsupportedAbiVersionNotificationPanelProvider.java b/idea/src/org/jetbrains/jet/plugin/versions/UnsupportedAbiVersionNotificationPanelProvider.java
index 0e76555ff19..1f7f8d6839e 100644
--- a/idea/src/org/jetbrains/jet/plugin/versions/UnsupportedAbiVersionNotificationPanelProvider.java
+++ b/idea/src/org/jetbrains/jet/plugin/versions/UnsupportedAbiVersionNotificationPanelProvider.java
@@ -16,30 +16,66 @@
package org.jetbrains.jet.plugin.versions;
+import com.intellij.ProjectTopics;
import com.intellij.icons.AllIcons;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.compiler.CompilerManager;
+import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleUtilCore;
+import com.intellij.openapi.progress.ProcessCanceledException;
+import com.intellij.openapi.project.DumbService;
+import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ModuleRootAdapter;
+import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.EditorNotificationPanel;
+import com.intellij.ui.EditorNotifications;
+import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.plugin.JetFileType;
+import org.jetbrains.jet.plugin.configuration.ConfigureKotlinInProjectUtils;
+import org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator;
+import org.jetbrains.jet.plugin.configuration.KotlinProjectConfigurator;
import javax.swing.*;
import java.awt.*;
import java.text.MessageFormat;
import java.util.Collection;
-public class UnsupportedAbiVersionNotificationPanelProvider {
+public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifications.Provider {
+ private static final Key KEY = Key.create("unsupported.abi.version");
+
private final Project project;
public UnsupportedAbiVersionNotificationPanelProvider(@NotNull Project project) {
this.project = project;
+ MessageBusConnection connection = project.getMessageBus().connect();
+ connection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter() {
+ @Override
+ public void rootsChanged(ModuleRootEvent event) {
+ updateNotifications();
+ }
+ });
+ connection.subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() {
+ @Override
+ public void enteredDumbMode() {}
+
+ @Override
+ public void exitDumbMode() {
+ updateNotifications();
+ }
+ });
}
@Nullable
@@ -117,6 +153,40 @@ public class UnsupportedAbiVersionNotificationPanelProvider {
label.set(answer.createActionLabel(labelText, action));
}
+ @Override
+ public Key getKey() {
+ return KEY;
+ }
+
+ @Nullable
+ @Override
+ public EditorNotificationPanel createNotificationPanel(VirtualFile file, FileEditor fileEditor) {
+ try {
+ if (file.getFileType() != JetFileType.INSTANCE) return null;
+
+ if (CompilerManager.getInstance(project).isExcludedFromCompilation(file)) return null;
+
+ Module module = ModuleUtilCore.findModuleForFile(file, project);
+ if (module == null) return null;
+
+ KotlinProjectConfigurator configurator = ConfigureKotlinInProjectUtils.getConfiguratorByName(KotlinJavaModuleConfigurator.NAME);
+ assert configurator != null : "Configurator should exists " + KotlinJavaModuleConfigurator.NAME;
+ if (!configurator.isConfigured(module)) {
+ return null;
+ }
+
+ return checkAndCreate(project);
+ }
+ catch (ProcessCanceledException e) {
+ // Ignore
+ }
+ catch (IndexNotReadyException e) {
+ DumbService.getInstance(project).runWhenSmart(updateNotifications);
+ }
+
+ return null;
+ }
+
private static class LibraryRootsPopupModel extends BaseListPopupStep {
private final Project project;
@@ -157,4 +227,21 @@ public class UnsupportedAbiVersionNotificationPanelProvider {
myLabel.setIcon(AllIcons.General.Error);
}
}
+
+ private final Runnable updateNotifications = new Runnable() {
+ @Override
+ public void run() {
+ updateNotifications();
+ }
+ };
+
+ private void updateNotifications() {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ EditorNotifications.getInstance(project).updateAllNotifications();
+ }
+ });
+ }
+
}