[coverage] Convert CoverageViewManager to Kotlin

GitOrigin-RevId: fd2c82ea274ab2d34c7bb7eef916f87f4af2d0a9
This commit is contained in:
Maksim Zuev
2024-01-18 10:57:47 +01:00
committed by intellij-monorepo-bot
parent 5c445223e2
commit 6b4bc8b15c

View File

@@ -1,234 +1,218 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.coverage.view;
package com.intellij.coverage.view
import com.intellij.coverage.CoverageBundle;
import com.intellij.coverage.CoverageOptionsProvider;
import com.intellij.coverage.CoverageSuitesBundle;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.Disposable;
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.NlsSafe;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.AppUIUtil;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.util.containers.DisposableWrapperList;
import kotlin.Unit;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import com.intellij.coverage.CoverageBundle
import com.intellij.coverage.CoverageOptionsProvider
import com.intellij.coverage.CoverageSuitesBundle
import com.intellij.coverage.view.CoverageViewManager.StateBean
import com.intellij.icons.AllIcons
import com.intellij.openapi.Disposable
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.NlsSafe
import com.intellij.openapi.wm.ToolWindowAnchor
import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.ui.AppUIUtil.invokeLaterIfProjectAlive
import com.intellij.ui.content.Content
import com.intellij.ui.content.ContentManager
import com.intellij.util.containers.DisposableWrapperList
import org.jetbrains.annotations.NonNls
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@State(name = "CoverageViewManager", storages = @Storage(StoragePathMacros.PRODUCT_WORKSPACE_FILE))
@State(name = "CoverageViewManager", storages = [Storage(StoragePathMacros.PRODUCT_WORKSPACE_FILE)])
@Service(Service.Level.PROJECT)
public final class CoverageViewManager implements PersistentStateComponent<CoverageViewManager.StateBean>, Disposable.Default {
private static final Logger LOG = Logger.getInstance(CoverageViewManager.class);
public static final @NonNls String TOOLWINDOW_ID = "Coverage";
private final Project myProject;
private ContentManager myContentManager;
private StateBean myStateBean = new StateBean();
private final Map<CoverageSuitesBundle, CoverageView> myViews = new HashMap<>();
class CoverageViewManager(private val myProject: Project) : PersistentStateComponent<StateBean?>, Disposable.Default {
private var myContentManager: ContentManager? = null
var stateBean = StateBean()
private set
private val myViews: MutableMap<CoverageSuitesBundle, CoverageView> = HashMap()
public CoverageViewManager(@NotNull Project project) {
myProject = project;
AppUIUtil.invokeLaterIfProjectAlive(myProject, () -> {
ToolWindow toolWindow = ToolWindowManager.getInstance(project).registerToolWindow(TOOLWINDOW_ID, builder -> {
builder.sideTool = true;
builder.icon = AllIcons.Toolwindows.ToolWindowCoverage;
builder.anchor = ToolWindowAnchor.RIGHT;
builder.stripeTitle = CoverageBundle.messagePointer("coverage.view.title");
return Unit.INSTANCE;
});
toolWindow.setHelpId(CoverageView.HELP_ID);
myContentManager = toolWindow.getContentManager();
});
}
public static CoverageViewManager getInstance(@NotNull Project project) {
return project.getService(CoverageViewManager.class);
}
@Override
public StateBean getState() {
if (!myViews.isEmpty()) {
final CoverageView view = myViews.values().iterator().next();
view.saveSize();
}
return myStateBean;
}
@Override
public void loadState(@NotNull StateBean state) {
myStateBean = state;
}
public StateBean getStateBean() {
return myStateBean;
}
public synchronized CoverageView getView(CoverageSuitesBundle suitesBundle) {
return myViews.get(suitesBundle);
}
public CoverageSuitesBundle getOpenedSuite() {
ContentManager manager = myContentManager;
if (manager == null) return null;
Content selectedContent = manager.getSelectedContent();
if (selectedContent == null) return null;
for (var entry : myViews.entrySet()) {
Content content = manager.getContent(entry.getValue());
if (content == selectedContent) {
return entry.getKey();
init {
invokeLaterIfProjectAlive(myProject) {
val toolWindow = ToolWindowManager.getInstance(myProject).registerToolWindow(TOOLWINDOW_ID) {
sideTool = true
icon = AllIcons.Toolwindows.ToolWindowCoverage
anchor = ToolWindowAnchor.RIGHT
stripeTitle = CoverageBundle.messagePointer("coverage.view.title")
}
toolWindow.helpId = CoverageView.HELP_ID
myContentManager = toolWindow.contentManager
}
return null;
}
public void activateToolwindow(@NotNull CoverageView view) {
myContentManager.setSelectedContent(myContentManager.getContent(view));
ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(TOOLWINDOW_ID);
LOG.assertTrue(toolWindow != null);
toolWindow.activate(null, false);
override fun getState(): StateBean {
if (!myViews.isEmpty()) {
val view = myViews.values.iterator().next()
view.saveSize()
}
return stateBean
}
public synchronized void createView(CoverageSuitesBundle suitesBundle, boolean activate) {
CoverageView coverageView = myViews.get(suitesBundle);
Content content;
override fun loadState(state: StateBean) {
stateBean = state
}
@Synchronized
fun getView(suitesBundle: CoverageSuitesBundle): CoverageView? {
return myViews[suitesBundle]
}
val openedSuite: CoverageSuitesBundle?
get() {
val manager = myContentManager
if (manager == null) return null
val selectedContent = manager.selectedContent
if (selectedContent == null) return null
for ((key, value) in myViews) {
val content = manager.getContent(value)
if (content === selectedContent) {
return key
}
}
return null
}
fun activateToolwindow(view: CoverageView) {
myContentManager!!.setSelectedContent(myContentManager!!.getContent(view))
val toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(TOOLWINDOW_ID)
LOG.assertTrue(toolWindow != null)
toolWindow!!.activate(null, false)
}
@Synchronized
fun createView(suitesBundle: CoverageSuitesBundle, activate: Boolean) {
var coverageView = myViews[suitesBundle]
val content: Content
if (coverageView == null) {
coverageView = new CoverageView(myProject, suitesBundle, myStateBean);
myViews.put(suitesBundle, coverageView);
content = myContentManager.getFactory().createContent(coverageView, getDisplayName(suitesBundle), false);
myContentManager.addContent(content);
coverageView = CoverageView(myProject, suitesBundle, stateBean)
myViews[suitesBundle] = coverageView
content = myContentManager!!.factory.createContent(coverageView, getDisplayName(suitesBundle), false)
myContentManager!!.addContent(content)
}
else {
content = myContentManager.getContent(coverageView);
content = myContentManager!!.getContent(coverageView)
}
myContentManager.setSelectedContent(content);
myContentManager!!.setSelectedContent(content)
if (CoverageOptionsProvider.getInstance(myProject).activateViewOnRun() && activate) {
activateToolwindow(coverageView);
activateToolwindow(coverageView)
}
}
public void closeView(CoverageSuitesBundle suitesBundle) {
CoverageView oldView = myViews.remove(suitesBundle);
fun closeView(suitesBundle: CoverageSuitesBundle) {
val oldView = myViews.remove(suitesBundle)
if (oldView != null) {
oldView.saveSize();
ApplicationManager.getApplication().invokeLater(() -> {
Content content = myContentManager.getContent(oldView);
oldView.saveSize()
ApplicationManager.getApplication().invokeLater {
val content = myContentManager!!.getContent(oldView)
if (content != null) {
myContentManager.removeContent(content, false);
myContentManager!!.removeContent(content, false)
}
});
}
}
}
@NlsSafe
public static String getDisplayName(@NotNull CoverageSuitesBundle suitesBundle) {
RunConfigurationBase<?> configuration = suitesBundle.getRunConfiguration();
return configuration != null ? configuration.getName() : suitesBundle.getPresentableName();
@Deprecated("Use getView(CoverageSuitesBundle) instead", ReplaceWith("getView(suitesBundle)"))
fun getToolwindow(suitesBundle: CoverageSuitesBundle): CoverageView? {
return getView(suitesBundle)
}
/**
* @deprecated Use {@link #getView(CoverageSuitesBundle)} instead
*/
@Deprecated
public CoverageView getToolwindow(CoverageSuitesBundle suitesBundle) {
return getView(suitesBundle);
}
/**
* @deprecated Use {@link #activateToolwindow(CoverageView)} instead
*/
@Deprecated
public void activateToolwindow(@NotNull CoverageView view, boolean activate) {
@Deprecated("Use activateToolwindow(CoverageView) instead", ReplaceWith("if (activate) activateToolwindow(view)"))
fun activateToolwindow(view: CoverageView, activate: Boolean) {
if (activate) {
activateToolwindow(view);
activateToolwindow(view)
}
}
/**
* @deprecated Use {@link #createView(CoverageSuitesBundle, boolean)} instead
*/
@Deprecated
public void createToolWindow(CoverageSuitesBundle suitesBundle, boolean activate) {
createView(suitesBundle, activate);
@Deprecated("Use createView instead", ReplaceWith("createView(suitesBundle, activate)"))
fun createToolWindow(suitesBundle: CoverageSuitesBundle, activate: Boolean) {
createView(suitesBundle, activate)
}
public static final class StateBean {
private boolean myFlattenPackages = false;
public boolean myAutoScrollToSource = false;
public boolean myAutoScrollFromSource = false;
public List<Integer> myColumnSize;
public boolean myAscendingOrder = true;
public int mySortingColumn = 0;
private boolean myHideFullyCovered = false;
private boolean myShowOnlyModified = true;
private boolean myDefaultFilters = true;
class StateBean {
private var myFlattenPackages = false
private final DisposableWrapperList<CoverageViewSettingsListener> myListeners = new DisposableWrapperList<>();
@JvmField
var myAutoScrollToSource: Boolean = false
public boolean isFlattenPackages() {
return myFlattenPackages;
}
@JvmField
var myAutoScrollFromSource: Boolean = false
public void setFlattenPackages(boolean flattenPackages) {
if (myFlattenPackages != flattenPackages) {
myFlattenPackages = flattenPackages;
fireChanged();
@JvmField
var myColumnSize: List<Int>? = null
@JvmField
var myAscendingOrder: Boolean = true
@JvmField
var mySortingColumn: Int = 0
private var myHideFullyCovered = false
private var myShowOnlyModified = true
var isDefaultFilters: Boolean = true
private set
private val myListeners = DisposableWrapperList<CoverageViewSettingsListener>()
var isFlattenPackages: Boolean
get() = myFlattenPackages
set(flattenPackages) {
if (myFlattenPackages != flattenPackages) {
myFlattenPackages = flattenPackages
fireChanged()
}
}
}
public boolean isHideFullyCovered() {
return myHideFullyCovered;
}
public void setHideFullyCovered(boolean hideFullyCovered) {
if (myHideFullyCovered != hideFullyCovered) {
myHideFullyCovered = hideFullyCovered;
myDefaultFilters = false;
fireChanged();
var isHideFullyCovered: Boolean
get() = myHideFullyCovered
set(hideFullyCovered) {
if (myHideFullyCovered != hideFullyCovered) {
myHideFullyCovered = hideFullyCovered
isDefaultFilters = false
fireChanged()
}
}
}
public boolean isShowOnlyModified() {
return myShowOnlyModified;
}
public void setShowOnlyModified(boolean showOnlyModified) {
if (myShowOnlyModified != showOnlyModified) {
myShowOnlyModified = showOnlyModified;
myDefaultFilters = false;
fireChanged();
var isShowOnlyModified: Boolean
get() = myShowOnlyModified
set(showOnlyModified) {
if (myShowOnlyModified != showOnlyModified) {
myShowOnlyModified = showOnlyModified
isDefaultFilters = false
fireChanged()
}
}
}
public boolean isDefaultFilters() {
return myDefaultFilters;
}
public void addListener(Disposable disposable, CoverageViewSettingsListener listener) {
myListeners.add(listener, disposable);
fun addListener(disposable: Disposable, listener: CoverageViewSettingsListener) {
myListeners.add(listener, disposable)
}
private void fireChanged() {
for (CoverageViewSettingsListener listener : myListeners) {
listener.onSettingsChanged(this);
private fun fireChanged() {
for (listener in myListeners) {
listener.onSettingsChanged(this)
}
}
}
public interface CoverageViewSettingsListener {
void onSettingsChanged(StateBean stateBean);
fun interface CoverageViewSettingsListener {
fun onSettingsChanged(stateBean: StateBean?)
}
companion object {
private val LOG = Logger.getInstance(CoverageViewManager::class.java)
const val TOOLWINDOW_ID: @NonNls String = "Coverage"
@JvmStatic
fun getInstance(project: Project): CoverageViewManager = project.service()
fun getDisplayName(suitesBundle: CoverageSuitesBundle): @NlsSafe String? {
val configuration = suitesBundle.runConfiguration
return configuration?.name ?: suitesBundle.presentableName
}
}
}