mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[maven] IDEA-343042 convert MavenProjectsNavigator to kotlin
GitOrigin-RevId: 101c84cf3009139847da7c3b4c2725026a5edf79
This commit is contained in:
committed by
intellij-monorepo-bot
parent
21c8e9f1e0
commit
2a944c0839
+326
-361
@@ -1,499 +1,464 @@
|
||||
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package org.jetbrains.idea.maven.navigator;
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package org.jetbrains.idea.maven.navigator
|
||||
|
||||
import com.intellij.execution.RunManagerListener;
|
||||
import com.intellij.execution.RunnerAndConfigurationSettings;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.ide.util.treeView.TreeState;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.actionSystem.ActionManager;
|
||||
import com.intellij.openapi.actionSystem.CommonShortcuts;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.ex.ActionUtil;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.components.PersistentStateComponent;
|
||||
import com.intellij.openapi.components.State;
|
||||
import com.intellij.openapi.components.Storage;
|
||||
import com.intellij.openapi.components.StoragePathMacros;
|
||||
import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
|
||||
import com.intellij.openapi.startup.StartupManager;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.openapi.wm.ToolWindowAnchor;
|
||||
import com.intellij.openapi.wm.ToolWindowFactory;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
|
||||
import com.intellij.openapi.wm.ex.ToolWindowManagerListener;
|
||||
import com.intellij.ui.AppUIUtil;
|
||||
import com.intellij.ui.RemoteTransferUIManager;
|
||||
import com.intellij.ui.content.Content;
|
||||
import com.intellij.ui.content.ContentFactory;
|
||||
import com.intellij.ui.content.ContentManager;
|
||||
import com.intellij.ui.treeStructure.SimpleTree;
|
||||
import com.intellij.util.concurrency.ThreadingAssertions;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import icons.MavenIcons;
|
||||
import kotlin.Unit;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.TestOnly;
|
||||
import org.jetbrains.idea.maven.MavenDisposable;
|
||||
import org.jetbrains.idea.maven.execution.MavenRunner;
|
||||
import org.jetbrains.idea.maven.execution.MavenRunnerSettings;
|
||||
import org.jetbrains.idea.maven.indices.IndexChangeProgressListener;
|
||||
import org.jetbrains.idea.maven.indices.MavenSystemIndicesManager;
|
||||
import org.jetbrains.idea.maven.navigator.structure.MavenProjectsNavigatorPanel;
|
||||
import org.jetbrains.idea.maven.navigator.structure.MavenProjectsStructure;
|
||||
import org.jetbrains.idea.maven.project.*;
|
||||
import org.jetbrains.idea.maven.server.MavenIndexUpdateState;
|
||||
import org.jetbrains.idea.maven.tasks.MavenShortcutsManager;
|
||||
import org.jetbrains.idea.maven.tasks.MavenTasksManager;
|
||||
import org.jetbrains.idea.maven.utils.MavenEelUtil;
|
||||
import org.jetbrains.idea.maven.utils.MavenLog;
|
||||
import org.jetbrains.idea.maven.utils.MavenSimpleProjectComponent;
|
||||
import org.jetbrains.idea.maven.utils.MavenUtil;
|
||||
import com.intellij.execution.RunManagerListener
|
||||
import com.intellij.execution.RunnerAndConfigurationSettings
|
||||
import com.intellij.icons.AllIcons
|
||||
import com.intellij.ide.util.treeView.TreeState
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.actionSystem.ActionManager
|
||||
import com.intellij.openapi.actionSystem.CommonShortcuts
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup
|
||||
import com.intellij.openapi.actionSystem.ex.ActionUtil.wrap
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.components.PersistentStateComponent
|
||||
import com.intellij.openapi.components.State
|
||||
import com.intellij.openapi.components.Storage
|
||||
import com.intellij.openapi.components.StoragePathMacros
|
||||
import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.project.DumbService
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.roots.ex.ProjectRootManagerEx
|
||||
import com.intellij.openapi.roots.ex.ProjectRootManagerEx.ProjectJdkListener
|
||||
import com.intellij.openapi.startup.StartupManager
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.openapi.util.Pair
|
||||
import com.intellij.openapi.util.WriteExternalException
|
||||
import com.intellij.openapi.wm.*
|
||||
import com.intellij.openapi.wm.ex.ToolWindowManagerEx
|
||||
import com.intellij.openapi.wm.ex.ToolWindowManagerListener
|
||||
import com.intellij.ui.AppUIUtil.invokeLaterIfProjectAlive
|
||||
import com.intellij.ui.RemoteTransferUIManager.forceDirectTransfer
|
||||
import com.intellij.ui.content.ContentFactory
|
||||
import com.intellij.ui.treeStructure.SimpleTree
|
||||
import com.intellij.util.concurrency.ThreadingAssertions
|
||||
import com.intellij.util.containers.ContainerUtil
|
||||
import icons.MavenIcons
|
||||
import org.jdom.Element
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import org.jetbrains.annotations.TestOnly
|
||||
import org.jetbrains.idea.maven.MavenDisposable
|
||||
import org.jetbrains.idea.maven.execution.MavenRunner
|
||||
import org.jetbrains.idea.maven.execution.MavenRunnerSettings
|
||||
import org.jetbrains.idea.maven.indices.IndexChangeProgressListener
|
||||
import org.jetbrains.idea.maven.indices.MavenSystemIndicesManager
|
||||
import org.jetbrains.idea.maven.navigator.structure.MavenProjectsNavigatorPanel
|
||||
import org.jetbrains.idea.maven.navigator.structure.MavenProjectsStructure
|
||||
import org.jetbrains.idea.maven.project.*
|
||||
import org.jetbrains.idea.maven.server.MavenIndexUpdateState
|
||||
import org.jetbrains.idea.maven.tasks.MavenShortcutsManager
|
||||
import org.jetbrains.idea.maven.tasks.MavenTasksManager
|
||||
import org.jetbrains.idea.maven.utils.MavenEelUtil.checkJdkAndShowNotification
|
||||
import org.jetbrains.idea.maven.utils.MavenEelUtil.restartMavenConnectorsIfJdkIncorrect
|
||||
import org.jetbrains.idea.maven.utils.MavenLog
|
||||
import org.jetbrains.idea.maven.utils.MavenSimpleProjectComponent
|
||||
import org.jetbrains.idea.maven.utils.MavenUtil.invokeLater
|
||||
import java.awt.Graphics
|
||||
import javax.swing.JPanel
|
||||
import javax.swing.JTextPane
|
||||
import javax.swing.text.SimpleAttributeSet
|
||||
import javax.swing.text.StyleConstants
|
||||
import javax.swing.tree.TreeSelectionModel
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.SimpleAttributeSet;
|
||||
import javax.swing.text.StyleConstants;
|
||||
import javax.swing.text.StyledDocument;
|
||||
import javax.swing.tree.TreeSelectionModel;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@State(name = "MavenProjectNavigator", storages = [Storage(StoragePathMacros.PRODUCT_WORKSPACE_FILE)], getStateRequiresEdt = true)
|
||||
class MavenProjectsNavigator(project: Project) : MavenSimpleProjectComponent(
|
||||
project), PersistentStateComponent<MavenProjectsNavigatorState?>, Disposable {
|
||||
private var myState = MavenProjectsNavigatorState()
|
||||
|
||||
@State(name = "MavenProjectNavigator", storages = @Storage(StoragePathMacros.PRODUCT_WORKSPACE_FILE), getStateRequiresEdt = true)
|
||||
public final class MavenProjectsNavigator extends MavenSimpleProjectComponent
|
||||
implements PersistentStateComponent<MavenProjectsNavigatorState>, Disposable {
|
||||
public static final String TOOL_WINDOW_ID = "Maven";
|
||||
public static final String TOOL_WINDOW_PLACE_ID = "Maven tool window";
|
||||
private var myTree: SimpleTree? = null
|
||||
@TestOnly fun structureForTests(): MavenProjectsStructure? = myStructure
|
||||
|
||||
private MavenProjectsNavigatorState myState = new MavenProjectsNavigatorState();
|
||||
private var myStructure: MavenProjectsStructure? = null
|
||||
|
||||
private SimpleTree myTree;
|
||||
private MavenProjectsStructure myStructure;
|
||||
|
||||
public static MavenProjectsNavigator getInstance(Project project) {
|
||||
return project.getService(MavenProjectsNavigator.class);
|
||||
}
|
||||
|
||||
public MavenProjectsNavigator(@NotNull Project project) {
|
||||
super(project);
|
||||
init {
|
||||
project.getMessageBus()
|
||||
.connect(MavenDisposable.getInstance(project))
|
||||
.subscribe(MavenImportListener.TOPIC, new MavenImportListener() {
|
||||
|
||||
@Override
|
||||
public void importFinished(@NotNull Collection<MavenProject> importedProjects, @NotNull List<@NotNull Module> newModules) {
|
||||
scheduleStructureUpdate();
|
||||
.subscribe<MavenImportListener>(MavenImportListener.TOPIC, object : MavenImportListener {
|
||||
override fun importFinished(importedProjects: MutableCollection<MavenProject?>, newModules: MutableList<Module>) {
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
@Override
|
||||
public MavenProjectsNavigatorState getState() {
|
||||
ThreadingAssertions.assertEventDispatchThread();
|
||||
if (myStructure != null) {
|
||||
override fun getState(): MavenProjectsNavigatorState {
|
||||
ThreadingAssertions.assertEventDispatchThread()
|
||||
if (this.myStructure != null) {
|
||||
try {
|
||||
myState.treeState = new Element("root");
|
||||
TreeState.createOn(myTree).writeExternal(myState.treeState);
|
||||
myState.treeState = Element("root")
|
||||
TreeState.createOn(myTree!!).writeExternal(myState.treeState)
|
||||
}
|
||||
catch (WriteExternalException e) {
|
||||
MavenLog.LOG.warn(e);
|
||||
catch (e: WriteExternalException) {
|
||||
MavenLog.LOG.warn(e)
|
||||
}
|
||||
}
|
||||
return myState;
|
||||
return myState
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadState(@NotNull MavenProjectsNavigatorState state) {
|
||||
myState = state;
|
||||
scheduleStructureUpdate();
|
||||
override fun loadState(state: MavenProjectsNavigatorState) {
|
||||
myState = state
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
|
||||
public boolean getGroupModules() {
|
||||
return myState.groupStructurally;
|
||||
}
|
||||
|
||||
public void setGroupModules(boolean value) {
|
||||
if (myState.groupStructurally != value) {
|
||||
myState.groupStructurally = value;
|
||||
scheduleStructureUpdate();
|
||||
var groupModules: Boolean
|
||||
get() = myState.groupStructurally
|
||||
set(value) {
|
||||
if (myState.groupStructurally != value) {
|
||||
myState.groupStructurally = value
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getShowIgnored() {
|
||||
return myState.showIgnored;
|
||||
}
|
||||
|
||||
public void setShowIgnored(boolean value) {
|
||||
if (myState.showIgnored != value) {
|
||||
myState.showIgnored = value;
|
||||
scheduleStructureUpdate();
|
||||
var showIgnored: Boolean
|
||||
get() = myState.showIgnored
|
||||
set(value) {
|
||||
if (myState.showIgnored != value) {
|
||||
myState.showIgnored = value
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getShowBasicPhasesOnly() {
|
||||
return myState.showBasicPhasesOnly;
|
||||
}
|
||||
|
||||
public void setShowBasicPhasesOnly(boolean value) {
|
||||
if (myState.showBasicPhasesOnly != value) {
|
||||
myState.showBasicPhasesOnly = value;
|
||||
scheduleStructureUpdate();
|
||||
var showBasicPhasesOnly: Boolean
|
||||
get() = myState.showBasicPhasesOnly
|
||||
set(value) {
|
||||
if (myState.showBasicPhasesOnly != value) {
|
||||
myState.showBasicPhasesOnly = value
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getAlwaysShowArtifactId() {
|
||||
return myState.alwaysShowArtifactId;
|
||||
}
|
||||
|
||||
public void setAlwaysShowArtifactId(boolean value) {
|
||||
if (myState.alwaysShowArtifactId != value) {
|
||||
myState.alwaysShowArtifactId = value;
|
||||
scheduleStructureUpdate();
|
||||
var alwaysShowArtifactId: Boolean
|
||||
get() = myState.alwaysShowArtifactId
|
||||
set(value) {
|
||||
if (myState.alwaysShowArtifactId != value) {
|
||||
myState.alwaysShowArtifactId = value
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getShowVersions() {
|
||||
return myState.showVersions;
|
||||
}
|
||||
|
||||
public void setShowVersions(boolean value) {
|
||||
if (myState.showVersions != value) {
|
||||
myState.showVersions = value;
|
||||
scheduleStructureUpdate();
|
||||
var showVersions: Boolean
|
||||
get() = myState.showVersions
|
||||
set(value) {
|
||||
if (myState.showVersions != value) {
|
||||
myState.showVersions = value
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initializeComponent() {
|
||||
override fun initializeComponent() {
|
||||
if (isNormalProject()) {
|
||||
doInit();
|
||||
doInit()
|
||||
}
|
||||
}
|
||||
|
||||
@TestOnly
|
||||
public void initForTests() {
|
||||
doInit();
|
||||
initTree();
|
||||
initStructure();
|
||||
fun initForTests() {
|
||||
doInit()
|
||||
initTree()
|
||||
initStructure()
|
||||
}
|
||||
|
||||
private void doInit() {
|
||||
MavenProjectsManager.getInstance(myProject).addManagerListener(new MavenProjectsManager.Listener() {
|
||||
@Override
|
||||
public void activated() {
|
||||
AppUIUtil.invokeLaterIfProjectAlive(myProject, () -> initToolWindow());
|
||||
listenForProjectsChanges();
|
||||
scheduleStructureUpdate();
|
||||
private fun doInit() {
|
||||
MavenProjectsManager.getInstance(myProject).addManagerListener(object : MavenProjectsManager.Listener {
|
||||
override fun activated() {
|
||||
invokeLaterIfProjectAlive(myProject, Runnable { initToolWindow() })
|
||||
listenForProjectsChanges()
|
||||
scheduleStructureUpdate()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
override fun dispose() {
|
||||
}
|
||||
|
||||
private void listenForProjectsChanges() {
|
||||
MavenProjectsManager.getInstance(myProject).addProjectsTreeListener(new MyProjectsListener(), this);
|
||||
private fun listenForProjectsChanges() {
|
||||
MavenProjectsManager.getInstance(myProject).addProjectsTreeListener(MyProjectsListener(), this)
|
||||
|
||||
MavenShortcutsManager.getInstance(myProject).addListener(() -> scheduleStructureRequest(() -> myStructure.updateGoals()), this);
|
||||
MavenShortcutsManager.getInstance(myProject).addListener(MavenShortcutsManager.Listener {
|
||||
scheduleStructureRequest(
|
||||
Runnable { myStructure!!.updateGoals() })
|
||||
}, this)
|
||||
|
||||
MavenTasksManager.getInstance(myProject).addListener(new MavenTasksManager.Listener() {
|
||||
@Override
|
||||
public void compileTasksChanged() {
|
||||
scheduleStructureRequest(() -> myStructure.updateGoals());
|
||||
MavenTasksManager.getInstance(myProject).addListener(object : MavenTasksManager.Listener {
|
||||
override fun compileTasksChanged() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateGoals() })
|
||||
}
|
||||
}, this);
|
||||
}, this)
|
||||
|
||||
MavenRunner.getInstance(myProject).getSettings().addListener(new MavenRunnerSettings.Listener() {
|
||||
@Override
|
||||
public void skipTestsChanged() {
|
||||
scheduleStructureRequest(() -> myStructure.updateGoals());
|
||||
MavenRunner.getInstance(myProject).getSettings().addListener(object : MavenRunnerSettings.Listener {
|
||||
override fun skipTestsChanged() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateGoals() })
|
||||
}
|
||||
}, this);
|
||||
}, this)
|
||||
|
||||
myProject.getMessageBus().connect().subscribe(RunManagerListener.TOPIC, new RunManagerListener() {
|
||||
private void changed() {
|
||||
scheduleStructureRequest(() -> myStructure.updateRunConfigurations());
|
||||
myProject.getMessageBus().connect().subscribe<RunManagerListener>(RunManagerListener.TOPIC, object : RunManagerListener {
|
||||
fun changed() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateRunConfigurations() })
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runConfigurationAdded(@NotNull RunnerAndConfigurationSettings settings) {
|
||||
changed();
|
||||
override fun runConfigurationAdded(settings: RunnerAndConfigurationSettings) {
|
||||
changed()
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runConfigurationRemoved(@NotNull RunnerAndConfigurationSettings settings) {
|
||||
changed();
|
||||
override fun runConfigurationRemoved(settings: RunnerAndConfigurationSettings) {
|
||||
changed()
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runConfigurationChanged(@NotNull RunnerAndConfigurationSettings settings) {
|
||||
changed();
|
||||
override fun runConfigurationChanged(settings: RunnerAndConfigurationSettings) {
|
||||
changed()
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeRunTasksChanged() {
|
||||
scheduleStructureRequest(() -> myStructure.updateGoals());
|
||||
override fun beforeRunTasksChanged() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateGoals() })
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
ApplicationManager.getApplication().getMessageBus().connect(this).subscribe(
|
||||
MavenSystemIndicesManager.TOPIC, new IndexChangeProgressListener() {
|
||||
@Override
|
||||
public void indexStatusChanged(@NotNull MavenIndexUpdateState state) {
|
||||
doScheduleStructureRequest(() -> {
|
||||
myStructure.updateRepositoryStatus(state);
|
||||
});
|
||||
ApplicationManager.getApplication().getMessageBus().connect(this).subscribe<IndexChangeProgressListener>(
|
||||
MavenSystemIndicesManager.TOPIC, object : IndexChangeProgressListener {
|
||||
override fun indexStatusChanged(state: MavenIndexUpdateState) {
|
||||
doScheduleStructureRequest(Runnable {
|
||||
myStructure!!.updateRepositoryStatus(state)
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
ProjectRootManagerEx.getInstanceEx(myProject).addProjectJdkListener(() -> {
|
||||
MavenEelUtil.checkJdkAndShowNotification(myProject);
|
||||
MavenEelUtil.restartMavenConnectorsIfJdkIncorrect(myProject);
|
||||
});
|
||||
ProjectRootManagerEx.getInstanceEx(myProject).addProjectJdkListener(ProjectJdkListener {
|
||||
checkJdkAndShowNotification(myProject)
|
||||
restartMavenConnectorsIfJdkIncorrect(myProject)
|
||||
})
|
||||
|
||||
StartupManager.getInstance(myProject).runAfterOpened(() -> {
|
||||
DumbService.getInstance(myProject).runWhenSmart(() -> {
|
||||
MavenEelUtil.checkJdkAndShowNotification(myProject);
|
||||
});
|
||||
});
|
||||
StartupManager.getInstance(myProject).runAfterOpened(Runnable {
|
||||
DumbService.getInstance(myProject).runWhenSmart(Runnable {
|
||||
checkJdkAndShowNotification(myProject)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
void initToolWindow() {
|
||||
initTree();
|
||||
ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject);
|
||||
toolWindowManager.invokeLater(() -> initializeToolWindow(toolWindowManager));
|
||||
fun initToolWindow() {
|
||||
initTree()
|
||||
val toolWindowManager = ToolWindowManager.getInstance(myProject)
|
||||
toolWindowManager.invokeLater(Runnable { initializeToolWindow(toolWindowManager) })
|
||||
}
|
||||
|
||||
private void initializeToolWindow(ToolWindowManager toolWindowManager) {
|
||||
JPanel panel = new MavenProjectsNavigatorPanel(myProject, myTree);
|
||||
private fun initializeToolWindow(toolWindowManager: ToolWindowManager) {
|
||||
val panel: JPanel = MavenProjectsNavigatorPanel(myProject, myTree)
|
||||
|
||||
ActionUtil.wrap("Maven.RemoveRunConfiguration").registerCustomShortcutSet(CommonShortcuts.getDelete(), myTree, this);
|
||||
ActionUtil.wrap("Maven.EditRunConfiguration").registerCustomShortcutSet(CommonShortcuts.getEditSource(), myTree, this);
|
||||
wrap("Maven.RemoveRunConfiguration").registerCustomShortcutSet(CommonShortcuts.getDelete(), myTree, this)
|
||||
wrap("Maven.EditRunConfiguration").registerCustomShortcutSet(CommonShortcuts.getEditSource(), myTree, this)
|
||||
|
||||
ToolWindow toolWindow = toolWindowManager.registerToolWindow(TOOL_WINDOW_ID, builder -> {
|
||||
builder.icon = MavenIcons.ToolWindowMaven;
|
||||
builder.anchor = ToolWindowAnchor.RIGHT;
|
||||
builder.canCloseContent = false;
|
||||
builder.contentFactory = new ToolWindowFactory() {
|
||||
@Override
|
||||
public void createToolWindowContent(@NotNull Project project,
|
||||
@NotNull ToolWindow toolWindow) {
|
||||
val toolWindow = toolWindowManager.registerToolWindow(TOOL_WINDOW_ID) {
|
||||
icon = MavenIcons.ToolWindowMaven
|
||||
anchor = ToolWindowAnchor.RIGHT
|
||||
canCloseContent = false
|
||||
contentFactory = object : ToolWindowFactory {
|
||||
override fun createToolWindowContent(
|
||||
project: Project,
|
||||
toolWindow: ToolWindow
|
||||
) {
|
||||
}
|
||||
};
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ContentManager contentManager = toolWindow.getContentManager();
|
||||
Disposer.register(this, () -> {
|
||||
val contentManager = toolWindow.getContentManager()
|
||||
Disposer.register(this, Disposable {
|
||||
// fire content removed events, so subscribers could clean up caches
|
||||
if (!myProject.isDisposed()) {
|
||||
contentManager.removeAllContents(true);
|
||||
contentManager.removeAllContents(true)
|
||||
}
|
||||
Disposer.dispose(contentManager);
|
||||
Disposer.dispose(contentManager)
|
||||
if (!myProject.isDisposed()) {
|
||||
toolWindow.remove();
|
||||
toolWindow.remove()
|
||||
}
|
||||
});
|
||||
final ContentFactory contentFactory = ContentFactory.getInstance();
|
||||
final Content content = contentFactory.createContent(panel, "", false);
|
||||
contentManager.addContent(content);
|
||||
contentManager.setSelectedContent(content, false);
|
||||
})
|
||||
val contentFactory = ContentFactory.getInstance()
|
||||
val content = contentFactory.createContent(panel, "", false)
|
||||
contentManager.addContent(content)
|
||||
contentManager.setSelectedContent(content, false)
|
||||
|
||||
myProject.getMessageBus().connect(content).subscribe(ToolWindowManagerListener.TOPIC, new ToolWindowManagerListener() {
|
||||
boolean wasVisible = false;
|
||||
myProject.getMessageBus().connect(content).subscribe<ToolWindowManagerListener>(ToolWindowManagerListener.TOPIC,
|
||||
object : ToolWindowManagerListener {
|
||||
var wasVisible: Boolean = false
|
||||
|
||||
@Override
|
||||
public void stateChanged(@NotNull ToolWindowManager toolWindowManager) {
|
||||
if (toolWindow.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
override fun stateChanged(toolWindowManager: ToolWindowManager) {
|
||||
if (toolWindow.isDisposed()) {
|
||||
return
|
||||
}
|
||||
|
||||
boolean visible = ((ToolWindowManagerEx)toolWindowManager).shouldUpdateToolWindowContent(toolWindow);
|
||||
if (!visible || wasVisible) {
|
||||
return;
|
||||
}
|
||||
scheduleStructureUpdate();
|
||||
wasVisible = true;
|
||||
}
|
||||
});
|
||||
val visible = (toolWindowManager as ToolWindowManagerEx).shouldUpdateToolWindowContent(
|
||||
toolWindow)
|
||||
if (!visible || wasVisible) {
|
||||
return
|
||||
}
|
||||
scheduleStructureUpdate()
|
||||
wasVisible = true
|
||||
}
|
||||
})
|
||||
|
||||
ActionManager actionManager = ActionManager.getInstance();
|
||||
val actionManager = ActionManager.getInstance()
|
||||
|
||||
DefaultActionGroup group = new DefaultActionGroup();
|
||||
group.add(actionManager.getAction("Maven.GroupProjects"));
|
||||
group.add(actionManager.getAction("Maven.ShowIgnored"));
|
||||
group.add(actionManager.getAction("Maven.ShowBasicPhasesOnly"));
|
||||
group.add(actionManager.getAction("Maven.AlwaysShowArtifactId"));
|
||||
group.add(actionManager.getAction("Maven.ShowVersions"));
|
||||
val group = DefaultActionGroup()
|
||||
group.add(actionManager.getAction("Maven.GroupProjects"))
|
||||
group.add(actionManager.getAction("Maven.ShowIgnored"))
|
||||
group.add(actionManager.getAction("Maven.ShowBasicPhasesOnly"))
|
||||
group.add(actionManager.getAction("Maven.AlwaysShowArtifactId"))
|
||||
group.add(actionManager.getAction("Maven.ShowVersions"))
|
||||
|
||||
toolWindow.setAdditionalGearActions(group);
|
||||
RemoteTransferUIManager.forceDirectTransfer(panel);
|
||||
toolWindow.setAdditionalGearActions(group)
|
||||
forceDirectTransfer(panel)
|
||||
}
|
||||
|
||||
private void initTree() {
|
||||
MavenProjectsManager mavenProjectManager = MavenProjectsManager.getInstance(myProject);
|
||||
myTree = new SimpleTree() {
|
||||
private final JTextPane myPane = new JTextPane();
|
||||
private fun initTree() {
|
||||
val mavenProjectManager = MavenProjectsManager.getInstance(myProject)
|
||||
myTree = object : SimpleTree() {
|
||||
private val myPane = JTextPane()
|
||||
|
||||
{
|
||||
myPane.setOpaque(false);
|
||||
String addIconText = "'+'";
|
||||
String refreshIconText = "'Reimport'";
|
||||
String message = MavenProjectBundle.message("maven.navigator.nothing.to.display", addIconText, refreshIconText);
|
||||
int firstEol = message.indexOf("\n");
|
||||
int addIconMarkerIndex = message.indexOf(addIconText);
|
||||
myPane.replaceSelection(message.substring(0, addIconMarkerIndex));
|
||||
myPane.insertIcon(AllIcons.General.Add);
|
||||
int refreshIconMarkerIndex = message.indexOf(refreshIconText);
|
||||
myPane.replaceSelection(message.substring(addIconMarkerIndex + addIconText.length(), refreshIconMarkerIndex));
|
||||
myPane.insertIcon(AllIcons.Actions.Refresh);
|
||||
myPane.replaceSelection(message.substring(refreshIconMarkerIndex + refreshIconText.length()));
|
||||
init {
|
||||
myPane.setOpaque(false)
|
||||
val addIconText = "'+'"
|
||||
val refreshIconText = "'Reimport'"
|
||||
val message = MavenProjectBundle.message("maven.navigator.nothing.to.display", addIconText, refreshIconText)
|
||||
val firstEol = message.indexOf("\n")
|
||||
val addIconMarkerIndex = message.indexOf(addIconText)
|
||||
myPane.replaceSelection(message.take(addIconMarkerIndex))
|
||||
myPane.insertIcon(AllIcons.General.Add)
|
||||
val refreshIconMarkerIndex = message.indexOf(refreshIconText)
|
||||
myPane.replaceSelection(message.substring(addIconMarkerIndex + addIconText.length, refreshIconMarkerIndex))
|
||||
myPane.insertIcon(AllIcons.Actions.Refresh)
|
||||
myPane.replaceSelection(message.substring(refreshIconMarkerIndex + refreshIconText.length))
|
||||
|
||||
StyledDocument document = myPane.getStyledDocument();
|
||||
SimpleAttributeSet centerAlignment = new SimpleAttributeSet();
|
||||
StyleConstants.setAlignment(centerAlignment, StyleConstants.ALIGN_CENTER);
|
||||
SimpleAttributeSet justifiedAlignment = new SimpleAttributeSet();
|
||||
StyleConstants.setAlignment(justifiedAlignment, StyleConstants.ALIGN_JUSTIFIED);
|
||||
val document = myPane.getStyledDocument()
|
||||
val centerAlignment = SimpleAttributeSet()
|
||||
StyleConstants.setAlignment(centerAlignment, StyleConstants.ALIGN_CENTER)
|
||||
val justifiedAlignment = SimpleAttributeSet()
|
||||
StyleConstants.setAlignment(justifiedAlignment, StyleConstants.ALIGN_JUSTIFIED)
|
||||
|
||||
document.setParagraphAttributes(0, firstEol, centerAlignment, false);
|
||||
document.setParagraphAttributes(firstEol + 2, document.getLength(), justifiedAlignment, false);
|
||||
document.setParagraphAttributes(0, firstEol, centerAlignment, false)
|
||||
document.setParagraphAttributes(firstEol + 2, document.getLength(), justifiedAlignment, false)
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
override fun paintComponent(g: Graphics) {
|
||||
super.paintComponent(g)
|
||||
|
||||
if (mavenProjectManager.hasProjects()) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
myPane.setFont(getFont());
|
||||
myPane.setBackground(getBackground());
|
||||
myPane.setForeground(getForeground());
|
||||
Rectangle bounds = getBounds();
|
||||
myPane.setBounds(0, 0, bounds.width - 10, bounds.height);
|
||||
myPane.setFont(getFont())
|
||||
myPane.setBackground(getBackground())
|
||||
myPane.setForeground(getForeground())
|
||||
val bounds = getBounds()
|
||||
myPane.setBounds(0, 0, bounds.width - 10, bounds.height)
|
||||
|
||||
Graphics g2 = g.create(bounds.x + 10, bounds.y + 20, bounds.width, bounds.height);
|
||||
val g2 = g.create(bounds.x + 10, bounds.y + 20, bounds.width, bounds.height)
|
||||
try {
|
||||
myPane.paint(g2);
|
||||
myPane.paint(g2)
|
||||
}
|
||||
finally {
|
||||
g2.dispose();
|
||||
g2.dispose()
|
||||
}
|
||||
}
|
||||
};
|
||||
myTree.getEmptyText().clear();
|
||||
}
|
||||
myTree!!.getEmptyText().clear()
|
||||
|
||||
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
|
||||
myTree!!.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION)
|
||||
}
|
||||
|
||||
@TestOnly
|
||||
public MavenProjectsStructure getStructureForTests() {
|
||||
return myStructure;
|
||||
fun selectInTree(project: MavenProject?) {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.select(project) })
|
||||
}
|
||||
|
||||
public void selectInTree(final MavenProject project) {
|
||||
scheduleStructureRequest(() -> myStructure.select(project));
|
||||
}
|
||||
|
||||
private void scheduleStructureRequest(final Runnable r) {
|
||||
private fun scheduleStructureRequest(r: Runnable) {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
if (null != myStructure) {
|
||||
r.run();
|
||||
if (null != this.myStructure) {
|
||||
r.run()
|
||||
}
|
||||
}
|
||||
else {
|
||||
doScheduleStructureRequest(r);
|
||||
doScheduleStructureRequest(r)
|
||||
}
|
||||
}
|
||||
|
||||
private void doScheduleStructureRequest(final Runnable r) {
|
||||
ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(TOOL_WINDOW_ID);
|
||||
if (toolWindow == null) return;
|
||||
private fun doScheduleStructureRequest(r: Runnable) {
|
||||
val toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(TOOL_WINDOW_ID)
|
||||
if (toolWindow == null) return
|
||||
|
||||
MavenUtil.invokeLater(myProject, () -> {
|
||||
List<String> files = MavenProjectsManager.getInstance(myProject).getState().originalFiles;
|
||||
boolean hasMavenProjects = files != null && !files.isEmpty();
|
||||
invokeLater(myProject, Runnable {
|
||||
val files = MavenProjectsManager.getInstance(myProject).getState().originalFiles
|
||||
val hasMavenProjects = files != null && !files.isEmpty()
|
||||
if (toolWindow.isAvailable() != hasMavenProjects) {
|
||||
MavenLog.LOG.info("Set MavenToolWindow availability: " + hasMavenProjects);
|
||||
toolWindow.setAvailable(hasMavenProjects);
|
||||
MavenLog.LOG.info("Set MavenToolWindow availability: $hasMavenProjects")
|
||||
toolWindow.setAvailable(hasMavenProjects)
|
||||
if (hasMavenProjects
|
||||
&& myProject.getUserData(ExternalSystemDataKeys.NEWLY_CREATED_PROJECT) == null) {
|
||||
toolWindow.activate(null);
|
||||
&& myProject.getUserData<Boolean?>(ExternalSystemDataKeys.NEWLY_CREATED_PROJECT) == null
|
||||
) {
|
||||
toolWindow.activate(null)
|
||||
}
|
||||
}
|
||||
|
||||
boolean shouldCreate = myStructure == null;
|
||||
val shouldCreate = this.myStructure == null
|
||||
if (shouldCreate) {
|
||||
initStructure();
|
||||
initStructure()
|
||||
}
|
||||
|
||||
r.run();
|
||||
|
||||
r.run()
|
||||
if (shouldCreate) {
|
||||
TreeState.createFrom(myState.treeState).applyTo(myTree);
|
||||
TreeState.createFrom(myState.treeState).applyTo(myTree!!)
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
private void initStructure() {
|
||||
myStructure = new MavenProjectsStructure(myProject,
|
||||
MavenProjectsStructure.MavenStructureDisplayMode.SHOW_ALL,
|
||||
MavenProjectsManager.getInstance(myProject),
|
||||
MavenTasksManager.getInstance(myProject),
|
||||
MavenShortcutsManager.getInstance(myProject),
|
||||
this,
|
||||
myTree);
|
||||
private fun initStructure() {
|
||||
this.myStructure = MavenProjectsStructure(myProject,
|
||||
MavenProjectsStructure.MavenStructureDisplayMode.SHOW_ALL,
|
||||
MavenProjectsManager.getInstance(myProject),
|
||||
MavenTasksManager.getInstance(myProject),
|
||||
MavenShortcutsManager.getInstance(myProject),
|
||||
this,
|
||||
myTree)
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public void scheduleStructureUpdate() {
|
||||
scheduleStructureRequest(() -> myStructure.update());
|
||||
fun scheduleStructureUpdate() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.update() })
|
||||
}
|
||||
|
||||
private final class MyProjectsListener implements MavenProjectsTree.Listener {
|
||||
@Override
|
||||
public void projectsIgnoredStateChanged(final List<MavenProject> ignored,
|
||||
final List<MavenProject> unignored,
|
||||
boolean fromImport) {
|
||||
scheduleStructureRequest(() -> myStructure.updateIgnored(ContainerUtil.concat(ignored, unignored)));
|
||||
private inner class MyProjectsListener : MavenProjectsTree.Listener {
|
||||
override fun projectsIgnoredStateChanged(
|
||||
ignored: List<MavenProject>,
|
||||
unignored: List<MavenProject>,
|
||||
fromImport: Boolean
|
||||
) {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateIgnored(ContainerUtil.concat<MavenProject?>(ignored, unignored)) })
|
||||
}
|
||||
|
||||
@Override
|
||||
public void profilesChanged() {
|
||||
scheduleStructureRequest(() -> myStructure.updateProfiles());
|
||||
override fun profilesChanged() {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateProfiles() })
|
||||
}
|
||||
|
||||
@Override
|
||||
public void projectsUpdated(List<? extends Pair<MavenProject, MavenProjectChanges>> updated, List<MavenProject> deleted) {
|
||||
scheduleUpdateProjects(MavenUtil.collectFirsts(updated), new ArrayList<>(deleted));
|
||||
override fun projectsUpdated(updated: List<Pair<MavenProject, MavenProjectChanges>>, deleted: List<MavenProject>) {
|
||||
scheduleUpdateProjects(updated.map { it.first }, ArrayList(deleted))
|
||||
}
|
||||
|
||||
@Override
|
||||
public void projectResolved(@NotNull Pair<MavenProject, MavenProjectChanges> projectWithChanges) {
|
||||
scheduleUpdateProjects(Collections.singletonList(projectWithChanges.first), Collections.emptyList());
|
||||
override fun projectResolved(projectWithChanges: Pair<MavenProject, MavenProjectChanges>) {
|
||||
scheduleUpdateProjects(listOf(projectWithChanges.first), emptyList())
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pluginsResolved(@NotNull MavenProject project) {
|
||||
scheduleUpdateProjects(Collections.singletonList(project), Collections.emptyList());
|
||||
override fun pluginsResolved(project: MavenProject) {
|
||||
scheduleUpdateProjects(listOf(project), emptyList())
|
||||
}
|
||||
|
||||
private void scheduleUpdateProjects(final List<MavenProject> projects, final List<MavenProject> deleted) {
|
||||
scheduleStructureRequest(() -> myStructure.updateProjects(projects, deleted));
|
||||
fun scheduleUpdateProjects(projects: List<MavenProject>, deleted: List<MavenProject>) {
|
||||
scheduleStructureRequest(Runnable { myStructure!!.updateProjects(projects, deleted) })
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TOOL_WINDOW_ID: String = "Maven"
|
||||
const val TOOL_WINDOW_PLACE_ID: String = "Maven tool window"
|
||||
|
||||
@JvmStatic
|
||||
fun getInstance(project: Project): MavenProjectsNavigator {
|
||||
return project.getService(MavenProjectsNavigator::class.java)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ class MavenProjectsNavigatorTest : MavenMultiVersionImportingTestCase() {
|
||||
myNavigator!!.initForTests()
|
||||
myNavigator!!.groupModules = true
|
||||
|
||||
myStructure = myNavigator!!.structureForTests
|
||||
myStructure = myNavigator!!.structureForTests()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user