blob: 517d6b1b61f9df36272798c6a94bb7e28593b6e8 [file] [log] [blame]
package com.intellij.coverage.view;
import com.intellij.coverage.CoverageDataManager;
import com.intellij.coverage.CoverageOptionsProvider;
import com.intellij.coverage.CoverageSuitesBundle;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.icons.AllIcons;
import com.intellij.ide.impl.ContentManagerWatcher;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
/**
* User: anna
* Date: 1/2/12
*/
@State(
name = "CoverageViewManager",
storages = {@Storage( file = StoragePathMacros.WORKSPACE_FILE)}
)
public class CoverageViewManager implements PersistentStateComponent<CoverageViewManager.StateBean> {
private static final Logger LOG = Logger.getInstance("#" + CoverageViewManager.class.getName());
public static final String TOOLWINDOW_ID = "Coverage";
private Project myProject;
private final CoverageDataManager myDataManager;
private ContentManager myContentManager;
private StateBean myStateBean = new StateBean();
private Map<String, CoverageView> myViews = new HashMap<String, CoverageView>();
private boolean myReady;
public CoverageViewManager(Project project, ToolWindowManager toolWindowManager, CoverageDataManager dataManager) {
myProject = project;
myDataManager = dataManager;
ToolWindow toolWindow = toolWindowManager.registerToolWindow(TOOLWINDOW_ID, true, ToolWindowAnchor.RIGHT, myProject);
toolWindow.setIcon(AllIcons.Toolwindows.ToolWindowCoverage);
toolWindow.setSplitMode(true, null);
myContentManager = toolWindow.getContentManager();
new ContentManagerWatcher(toolWindow, myContentManager);
}
public StateBean getState() {
return myStateBean;
}
public void loadState(StateBean state) {
myStateBean = state;
}
public CoverageView getToolwindow(CoverageSuitesBundle suitesBundle) {
return myViews.get(getDisplayName(suitesBundle));
}
public void activateToolwindow(CoverageView view, boolean requestFocus) {
ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(TOOLWINDOW_ID);
if (requestFocus) {
myContentManager.setSelectedContent(myContentManager.getContent(view));
LOG.assertTrue(toolWindow != null);
toolWindow.activate(null, false);
}
}
public static CoverageViewManager getInstance(@NotNull Project project) {
return ServiceManager.getService(project, CoverageViewManager.class);
}
public void createToolWindow(String displayName, boolean defaultFileProvider) {
closeView(displayName);
final CoverageView coverageView = new CoverageView(myProject, myDataManager, myStateBean);
myViews.put(displayName, coverageView);
Content content = myContentManager.getFactory().createContent(coverageView, displayName, true);
myContentManager.addContent(content);
myContentManager.setSelectedContent(content);
if (CoverageOptionsProvider.getInstance(myProject).activateViewOnRun() && defaultFileProvider) {
activateToolwindow(coverageView, true);
}
}
void closeView(String displayName) {
final CoverageView oldView = myViews.get(displayName);
if (oldView != null) {
final Content content = myContentManager.getContent(oldView);
final Runnable runnable = new Runnable() {
public void run() {
if (content != null) {
myContentManager.removeContent(content, true);
}
Disposer.dispose(oldView);
}
};
ApplicationManager.getApplication().invokeLater(runnable);
}
setReady(false);
}
public boolean isReady() {
return myReady;
}
public void setReady(boolean ready) {
myReady = ready;
}
public static String getDisplayName(CoverageSuitesBundle suitesBundle) {
final RunConfigurationBase configuration = suitesBundle.getRunConfiguration();
return configuration != null ? configuration.getName() : suitesBundle.getPresentableName();
}
public static class StateBean {
public boolean myFlattenPackages = false;
public boolean myAutoScrollToSource = false;
public boolean myAutoScrollFromSource = false;
}
}