[maven] IDEA-343042 convert MavenProjectsNavigator to kotlin

GitOrigin-RevId: 101c84cf3009139847da7c3b4c2725026a5edf79
This commit is contained in:
Dmitry Kichinsky
2025-11-14 00:05:28 +00:00
committed by intellij-monorepo-bot
parent 21c8e9f1e0
commit 2a944c0839
2 changed files with 327 additions and 362 deletions
@@ -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)
}
}
}
@@ -41,7 +41,7 @@ class MavenProjectsNavigatorTest : MavenMultiVersionImportingTestCase() {
myNavigator!!.initForTests()
myNavigator!!.groupModules = true
myStructure = myNavigator!!.structureForTests
myStructure = myNavigator!!.structureForTests()
}
}