blob: 26864b326b12cb9c31a04d1dfef2c7abdbaee3c7 [file] [log] [blame]
package com.intellij.openapi.wm.impl;
import com.intellij.ProjectTopics;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootAdapter;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.openapi.wm.ext.LibraryDependentToolWindow;
import com.intellij.psi.PsiManager;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
public class LibraryDependentToolWindowManager extends AbstractProjectComponent {
private final ToolWindowManagerEx myToolWindowManager;
protected LibraryDependentToolWindowManager(Project project,
ToolWindowManagerEx toolWindowManager) {
super(project);
myToolWindowManager = toolWindowManager;
}
@Override
public void projectOpened() {
final ModuleRootListener rootListener = new ModuleRootAdapter() {
public void rootsChanged(ModuleRootEvent event) {
if (!myProject.isDisposed()) {
checkToolWindowStatuses(myProject);
}
}
};
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new Runnable() {
public void run() {
if (!myProject.isDisposed()) {
checkToolWindowStatuses(myProject);
final MessageBusConnection connection = myProject.getMessageBus().connect(myProject);
connection.subscribe(ProjectTopics.PROJECT_ROOTS, rootListener);
}
}
});
}
private void checkToolWindowStatuses(@NotNull final Project project) {
assert !project.isDisposed();
DumbService.getInstance(project).smartInvokeLater(new Runnable() {
public void run() {
final PsiManager psiManager = PsiManager.getInstance(myProject);
if (psiManager.isDisposed()) {
return;
}
for (LibraryDependentToolWindow libraryToolWindow : Extensions.getExtensions(LibraryDependentToolWindow.EXTENSION_POINT_NAME)) {
if (libraryToolWindow.getLibrarySearchHelper().isLibraryExists(project)) {
ensureToolWindowExists(libraryToolWindow);
}
else {
ToolWindow toolWindow = myToolWindowManager.getToolWindow(libraryToolWindow.id);
if (toolWindow != null) {
myToolWindowManager.unregisterToolWindow(libraryToolWindow.id);
}
}
}
}
});
}
private void ensureToolWindowExists(LibraryDependentToolWindow extension) {
ToolWindow toolWindow = myToolWindowManager.getToolWindow(extension.id);
if (toolWindow == null) {
myToolWindowManager.initToolWindow(extension);
}
}
}