diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.kt index a50728e0042a..c2df7ebef1b1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.kt @@ -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, Disposable { + private var myState = MavenProjectsNavigatorState() -@State(name = "MavenProjectNavigator", storages = @Storage(StoragePathMacros.PRODUCT_WORKSPACE_FILE), getStateRequiresEdt = true) -public final class MavenProjectsNavigator extends MavenSimpleProjectComponent - implements PersistentStateComponent, 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 importedProjects, @NotNull List<@NotNull Module> newModules) { - scheduleStructureUpdate(); + .subscribe(MavenImportListener.TOPIC, object : MavenImportListener { + override fun importFinished(importedProjects: MutableCollection, newModules: MutableList) { + 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.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( + 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.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 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(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 ignored, - final List unignored, - boolean fromImport) { - scheduleStructureRequest(() -> myStructure.updateIgnored(ContainerUtil.concat(ignored, unignored))); + private inner class MyProjectsListener : MavenProjectsTree.Listener { + override fun projectsIgnoredStateChanged( + ignored: List, + unignored: List, + fromImport: Boolean + ) { + scheduleStructureRequest(Runnable { myStructure!!.updateIgnored(ContainerUtil.concat(ignored, unignored)) }) } - @Override - public void profilesChanged() { - scheduleStructureRequest(() -> myStructure.updateProfiles()); + override fun profilesChanged() { + scheduleStructureRequest(Runnable { myStructure!!.updateProfiles() }) } - @Override - public void projectsUpdated(List> updated, List deleted) { - scheduleUpdateProjects(MavenUtil.collectFirsts(updated), new ArrayList<>(deleted)); + override fun projectsUpdated(updated: List>, deleted: List) { + scheduleUpdateProjects(updated.map { it.first }, ArrayList(deleted)) } - @Override - public void projectResolved(@NotNull Pair projectWithChanges) { - scheduleUpdateProjects(Collections.singletonList(projectWithChanges.first), Collections.emptyList()); + override fun projectResolved(projectWithChanges: Pair) { + 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 projects, final List deleted) { - scheduleStructureRequest(() -> myStructure.updateProjects(projects, deleted)); + fun scheduleUpdateProjects(projects: List, deleted: List) { + 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) } } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/structure/MavenProjectsNavigatorTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/structure/MavenProjectsNavigatorTest.kt index 9bf72fd921cf..e6b96e242cc0 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/structure/MavenProjectsNavigatorTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/structure/MavenProjectsNavigatorTest.kt @@ -41,7 +41,7 @@ class MavenProjectsNavigatorTest : MavenMultiVersionImportingTestCase() { myNavigator!!.initForTests() myNavigator!!.groupModules = true - myStructure = myNavigator!!.structureForTests + myStructure = myNavigator!!.structureForTests() } }