blob: 176ce6af592986967b04c8613c15fd41acecaa8d [file] [log] [blame]
package com.intellij.facet.impl.ui;
import com.intellij.facet.*;
import com.intellij.facet.ui.FacetDependentToolWindow;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.util.containers.ContainerUtil;
import java.util.List;
/**
* @author Dmitry Avdeev
*/
public class FacetDependentToolWindowManager extends AbstractProjectComponent {
private final ProjectWideFacetListenersRegistry myFacetListenersRegistry;
private final ProjectFacetManager myFacetManager;
private final ToolWindowManagerEx myToolWindowManager;
protected FacetDependentToolWindowManager(Project project,
ProjectWideFacetListenersRegistry facetListenersRegistry,
ProjectFacetManager facetManager,
ToolWindowManagerEx toolWindowManager) {
super(project);
myFacetListenersRegistry = facetListenersRegistry;
myFacetManager = facetManager;
myToolWindowManager = toolWindowManager;
}
@Override
public void projectOpened() {
myFacetListenersRegistry.registerListener(new ProjectWideFacetAdapter<Facet>() {
@Override
public void facetAdded(Facet facet) {
for (FacetDependentToolWindow extension : getDependentExtensions(facet)) {
ensureToolWindowExists(extension);
}
}
@Override
public void facetRemoved(Facet facet) {
if (!myFacetManager.hasFacets(facet.getTypeId())) {
for (FacetDependentToolWindow extension : getDependentExtensions(facet)) {
ToolWindow toolWindow = myToolWindowManager.getToolWindow(extension.id);
if (toolWindow != null) {
// check for other facets
List<FacetType> facetTypes = extension.getFacetTypes();
for (FacetType facetType : facetTypes) {
if (myFacetManager.hasFacets(facetType.getId())) return;
}
myToolWindowManager.unregisterToolWindow(extension.id);
}
}
}
}
});
FacetDependentToolWindow[] extensions = Extensions.getExtensions(FacetDependentToolWindow.EXTENSION_POINT_NAME);
loop: for (FacetDependentToolWindow extension : extensions) {
for (FacetType type : extension.getFacetTypes()) {
if (myFacetManager.hasFacets(type.getId())) {
ensureToolWindowExists(extension);
continue loop;
}
}
}
}
private void ensureToolWindowExists(FacetDependentToolWindow extension) {
ToolWindow toolWindow = myToolWindowManager.getToolWindow(extension.id);
if (toolWindow == null) {
myToolWindowManager.initToolWindow(extension);
}
}
private static List<FacetDependentToolWindow> getDependentExtensions(final Facet facet) {
FacetDependentToolWindow[] extensions = Extensions.getExtensions(FacetDependentToolWindow.EXTENSION_POINT_NAME);
return ContainerUtil.filter(extensions, new Condition<FacetDependentToolWindow>() {
@Override
public boolean value(FacetDependentToolWindow toolWindowEP) {
for (String id : toolWindowEP.getFacetIds()) {
if (facet.getType().getStringId().equals(id)) return true;
}
return false;
}
});
}
}