From c168d96b998c26ad1e86dc2fd625c43e3eefd599 Mon Sep 17 00:00:00 2001 From: Denis Lisenkov Date: Mon, 20 Mar 2023 16:38:40 +0300 Subject: [PATCH 1/8] IJMP-997: updated to build 231 --- build.gradle.kts | 8 ++++---- .../analytics/AnalyticsStartupActivity.kt | 6 +++--- .../editor/status/MfEncodingPanel.kt | 5 +++-- .../status/MfEncodingPanelWidgetFactory.kt | 16 +++++++++++----- .../editor/status/MfLineSeparatorPanel.kt | 5 +++-- .../status/MfLineSeparatorWidgetFactory.kt | 16 +++++++++++----- .../ibagroup/formainframe/utils/openapiUtils.kt | 12 ++++++------ src/main/resources/META-INF/plugin.xml | 4 ++-- 8 files changed, 43 insertions(+), 29 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c15224a82..d41115ca0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,7 +21,7 @@ apply(plugin = "kotlin") apply(plugin = "org.jetbrains.intellij") group = "eu.ibagroup" -version = "1.0.1" +version = "1.0.1-231" val remoteRobotVersion = "0.11.16" repositories { @@ -73,7 +73,7 @@ dependencies { } intellij { - version.set("2022.3") + version.set("LATEST-EAP-SNAPSHOT") } tasks { @@ -85,8 +85,8 @@ tasks { } patchPluginXml { - sinceBuild.set("223.7571") - untilBuild.set("223.*") + sinceBuild.set("231.8109") + untilBuild.set("231.*") changeNotes.set( """ WARNING: version 1.0 introduces breaking change. You won't be able to use the plugin with IntelliJ version less than 2022.3 diff --git a/src/main/kotlin/eu/ibagroup/formainframe/analytics/AnalyticsStartupActivity.kt b/src/main/kotlin/eu/ibagroup/formainframe/analytics/AnalyticsStartupActivity.kt index bb6e42dc9..3a2ff49fc 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/analytics/AnalyticsStartupActivity.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/analytics/AnalyticsStartupActivity.kt @@ -12,7 +12,7 @@ package eu.ibagroup.formainframe.analytics import com.intellij.openapi.components.service import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity +import com.intellij.openapi.startup.ProjectActivity import eu.ibagroup.formainframe.analytics.ui.AnalyticsPolicyDialog /** @@ -20,10 +20,10 @@ import eu.ibagroup.formainframe.analytics.ui.AnalyticsPolicyDialog * It shows the analytics policy dialog before starting events tracking. * @author Valiantsin Krus. */ -class AnalyticsStartupActivity : StartupActivity { +class AnalyticsStartupActivity : ProjectActivity { /** Shows analytics policy dialog if user was not aware of it. */ - override fun runActivity(project: Project) { + override suspend fun execute(project: Project) { val analyticsService = service() val policyProvider = service() if (!analyticsService.isUserAcknowledged) { diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanel.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanel.kt index 6b303e937..c481704ea 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanel.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanel.kt @@ -16,13 +16,14 @@ import com.intellij.openapi.wm.StatusBar import com.intellij.openapi.wm.StatusBarWidget import com.intellij.openapi.wm.impl.status.EncodingPanel import eu.ibagroup.formainframe.vfs.MFVirtualFile +import kotlinx.coroutines.CoroutineScope const val MF_ENCODING_PANEL_WIDGET = "MF" + StatusBar.StandardWidgets.ENCODING_PANEL /** * Encoding panel in status bar with correctly display for MF files. */ -class MfEncodingPanel(project: Project): EncodingPanel(project) { +class MfEncodingPanel(project: Project, scope: CoroutineScope): EncodingPanel(project, scope) { /** * Returns the state of the widget for correct display in the status bar. @@ -38,7 +39,7 @@ class MfEncodingPanel(project: Project): EncodingPanel(project) { } override fun createInstance(project: Project): StatusBarWidget { - return MfEncodingPanel(project) + return MfEncodingPanel(project, scope) } /** Widget is not enabled for MF files. */ diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanelWidgetFactory.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanelWidgetFactory.kt index f2d5b2679..21941a850 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanelWidgetFactory.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfEncodingPanelWidgetFactory.kt @@ -13,20 +13,26 @@ package eu.ibagroup.formainframe.editor.status import com.intellij.openapi.project.Project import com.intellij.openapi.wm.StatusBar import com.intellij.openapi.wm.StatusBarWidget -import com.intellij.openapi.wm.impl.status.EncodingPanelWidgetFactory +import com.intellij.ui.UIBundle +import com.intellij.openapi.wm.impl.status.widget.StatusBarEditorBasedWidgetFactory import eu.ibagroup.formainframe.vfs.MFVirtualFile +import kotlinx.coroutines.CoroutineScope /** * Status bar widget factory for [MfEncodingPanel]. */ -class MfEncodingPanelWidgetFactory: EncodingPanelWidgetFactory() { +class MfEncodingPanelWidgetFactory: StatusBarEditorBasedWidgetFactory() { override fun getId(): String { return MF_ENCODING_PANEL_WIDGET } - override fun createWidget(project: Project): StatusBarWidget { - return MfEncodingPanel(project) + override fun getDisplayName(): String { + return UIBundle.message("status.bar.encoding.widget.name") + } + + override fun createWidget(project: Project, scope: CoroutineScope): StatusBarWidget { + return MfEncodingPanel(project, scope) } /** Enabled only for MF file opened in editor. */ @@ -34,4 +40,4 @@ class MfEncodingPanelWidgetFactory: EncodingPanelWidgetFactory() { val file = getFileEditor(statusBar)?.file return file is MFVirtualFile } -} \ No newline at end of file +} diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorPanel.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorPanel.kt index 852ce61c6..5fc389b9d 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorPanel.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorPanel.kt @@ -19,13 +19,14 @@ import com.intellij.openapi.wm.impl.status.LineSeparatorPanel import eu.ibagroup.formainframe.dataops.DataOpsManager import eu.ibagroup.formainframe.dataops.attributes.RemoteUssAttributes import eu.ibagroup.formainframe.vfs.MFVirtualFile +import kotlinx.coroutines.CoroutineScope const val MF_LINE_SEPARATOR_PANEL_WIDGET = "MF" + StatusBar.StandardWidgets.LINE_SEPARATOR_PANEL /** * Line separator panel in status bar with correctly display for MF files. */ -class MfLineSeparatorPanel(project: Project): LineSeparatorPanel(project) { +class MfLineSeparatorPanel(project: Project, scope: CoroutineScope): LineSeparatorPanel(project, scope) { /** * Returns the state of the widget for correct display in the status bar. @@ -41,7 +42,7 @@ class MfLineSeparatorPanel(project: Project): LineSeparatorPanel(project) { } override fun createInstance(project: Project): StatusBarWidget { - return MfLineSeparatorPanel(project) + return MfLineSeparatorPanel(project, scope) } /** Widget is not enabled for all MF files except USS files. */ diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorWidgetFactory.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorWidgetFactory.kt index 84af39a31..563de6939 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorWidgetFactory.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/status/MfLineSeparatorWidgetFactory.kt @@ -13,20 +13,26 @@ package eu.ibagroup.formainframe.editor.status import com.intellij.openapi.project.Project import com.intellij.openapi.wm.StatusBar import com.intellij.openapi.wm.StatusBarWidget -import com.intellij.openapi.wm.impl.status.LineSeparatorWidgetFactory +import com.intellij.openapi.wm.impl.status.widget.StatusBarEditorBasedWidgetFactory +import com.intellij.ui.UIBundle import eu.ibagroup.formainframe.vfs.MFVirtualFile +import kotlinx.coroutines.CoroutineScope /** * Status bar widget factory for [MfLineSeparatorPanel]. */ -class MfLineSeparatorWidgetFactory: LineSeparatorWidgetFactory() { +class MfLineSeparatorWidgetFactory: StatusBarEditorBasedWidgetFactory() { override fun getId(): String { return MF_LINE_SEPARATOR_PANEL_WIDGET } - override fun createWidget(project: Project): StatusBarWidget { - return MfLineSeparatorPanel(project) + override fun getDisplayName(): String { + return UIBundle.message("status.bar.line.separator.widget.name") + } + + override fun createWidget(project: Project, scope: CoroutineScope): StatusBarWidget { + return MfLineSeparatorPanel(project, scope) } /** Enabled only for MF file opened in editor. */ @@ -34,4 +40,4 @@ class MfLineSeparatorWidgetFactory: LineSeparatorWidgetFactory() { val file = getFileEditor(statusBar)?.file return file is MFVirtualFile } -} \ No newline at end of file +} diff --git a/src/main/kotlin/eu/ibagroup/formainframe/utils/openapiUtils.kt b/src/main/kotlin/eu/ibagroup/formainframe/utils/openapiUtils.kt index 74a0bcae9..51731cc6b 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/utils/openapiUtils.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/utils/openapiUtils.kt @@ -44,7 +44,7 @@ val cachesDir by lazy { * @param topic the topic to get sync publisher for * @param componentManager the component manager to get the topic sync publisher */ -fun sendTopic( +fun sendTopic( topic: Topic, componentManager: ComponentManager = ApplicationManager.getApplication() ): L { @@ -117,9 +117,9 @@ fun submitOnWriteThread(block: () -> T): T { } @Suppress("UnstableApiUsage") -inline fun runWriteActionOnWriteThread(crossinline block: () -> T): T { +fun runWriteActionOnWriteThread(block: () -> T): T { val app = ApplicationManager.getApplication() - return if (app.isWriteThread) { + return if (app.isWriteIntentLockAcquired) { if (app.isWriteAccessAllowed) { block() } else { @@ -131,7 +131,7 @@ inline fun runWriteActionOnWriteThread(crossinline block: () -> T): T { } } -inline fun runReadActionInEdtAndWait(crossinline block: () -> T): T { +fun runReadActionInEdtAndWait(block: () -> T): T { return invokeAndWaitIfNeeded { runReadAction(block) } } @@ -194,13 +194,13 @@ inline fun runTask( }) } -inline fun runWriteActionInEdt(crossinline block: () -> Unit) { +fun runWriteActionInEdt(block: () -> Unit) { runInEdt { runWriteAction(block) } } -inline fun runWriteActionInEdtAndWait(crossinline block: () -> Unit) { +fun runWriteActionInEdtAndWait(block: () -> Unit) { invokeAndWaitIfNeeded { runWriteAction(block) } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 8dc2d570b..fb5c6ef6b 100755 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -352,11 +352,11 @@ Example of how to see the output:
+ order="after Position"/> + order="after eu.ibagroup.formainframe.editor.status.MfLineSeparatorWidgetFactory, before PowerSaveMode"/> From f89311ee2ad17651e75c2c32df8ede998a3d16a8 Mon Sep 17 00:00:00 2001 From: Uladzislau Date: Mon, 3 Apr 2023 18:18:38 +0200 Subject: [PATCH 2/8] IJMP-1047 Changed IntelliJ build version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index d41115ca0..f480aa66e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -73,7 +73,7 @@ dependencies { } intellij { - version.set("LATEST-EAP-SNAPSHOT") + version.set("2023.1") } tasks { From 1a224e3d06cb101d1102ee5aa7d3e4e64ffce7fe Mon Sep 17 00:00:00 2001 From: Arseni Tsikhamirau Date: Wed, 24 May 2023 11:56:39 +0200 Subject: [PATCH 3/8] IJMP-1140-Fix-ExplorerPasteProvider-tests-231 1) fixed tests + added support for IDEA version 231 --- .../ui/ExplorerPasteProviderTestSpec.kt | 26 ++++++++++++++++--- .../formainframe/explorer/ui/dummyClasses.kt | 8 ++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ExplorerPasteProviderTestSpec.kt b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ExplorerPasteProviderTestSpec.kt index f6ccb257d..127c52cd3 100644 --- a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ExplorerPasteProviderTestSpec.kt +++ b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ExplorerPasteProviderTestSpec.kt @@ -99,11 +99,11 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ every { mockedCopyPasterProvider.getSourceFilesFromClipboard() } returns mockedClipboardBuffer every { mockedFileExplorerView.isCut } returns AtomicBoolean(true) - every { mockedFileExplorerView.ignoreVFileDeleteEvents } returns AtomicBoolean(false) + every { mockedFileExplorerView.ignoreVFSChangeEvents } returns AtomicBoolean(false) every { mockedFileExplorerView.copyPasteSupport } returns mockedCopyPasterProvider mockkObject(FileExplorerContentProvider) - mockkObject(FileExplorerContentProvider::getInstance) + //mockkObject(FileExplorerContentProvider::getInstance) every { FileExplorerContentProvider.getInstance().getExplorerView(any() as Project) } returns mockedFileExplorerView var isPastePerformed : Boolean @@ -538,6 +538,7 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ ) } returns mutableListOf(Pair(mockedSourceFile, mockedSourceFile)) + every { mockedSourceFile.findChild(any() as String) } returns null mockedExplorerPasteProvider.performPaste(mockedDataContext) assertSoftly { @@ -728,6 +729,7 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ val mockedSourceFile1 = mockk() val mockedSourceAttributes1 = mockk() every { mockedSourceFile1.name } returns "test1" + every { mockedSourceFile1.isDirectory } returns false every { mockedSourceAttributes1.isPastePossible } returns false every { mockedSourceAttributes1.isDirectory } returns false every { mockedSourceNodeData1.node } returns mockedSourceNode1 @@ -740,6 +742,7 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ val mockedSourceFile2 = mockk() val mockedSourceAttributes2 = mockk() every { mockedSourceFile2.name } returns "test2" + every { mockedSourceFile2.isDirectory } returns true every { mockedSourceAttributes2.isPastePossible } returns false every { mockedSourceAttributes2.isDirectory } returns false every { mockedSourceNodeData2.node } returns mockedSourceNode2 @@ -752,6 +755,7 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ val mockedSourceFile3 = mockk() val mockedSourceAttributes3 = mockk() every { mockedSourceFile3.name } returns "test1" + every { mockedSourceFile3.isDirectory } returns false every { mockedSourceAttributes3.isPastePossible } returns false every { mockedSourceAttributes3.isDirectory } returns false every { mockedSourceNodeData3.node } returns mockedSourceNode3 @@ -788,8 +792,9 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ val mockedSourceFile6 = mockk() val mockedSourceAttributes6 = mockk() every { mockedSourceFile6.name } returns "test1" + every { mockedSourceFile6.isDirectory } returns true every { mockedSourceAttributes6.isPastePossible } returns false - every { mockedSourceAttributes6.isDirectory } returns false + every { mockedSourceAttributes6.isDirectory } returns true every { mockedSourceNodeData6.node } returns mockedSourceNode6 every { mockedSourceNodeData6.file } returns mockedSourceFile6 every { mockedSourceNodeData6.attributes } returns mockedSourceAttributes6 @@ -797,18 +802,25 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ // children of target val childDestinationVirtualFile1 = mockk() every { childDestinationVirtualFile1.name } returns "test1" + every { childDestinationVirtualFile1.isDirectory } returns true val childDestinationVirtualFile2 = mockk() every { childDestinationVirtualFile2.name } returns "test_mf_file" val childDestMFFile2Attr = mockk() + val childDestinationVirtualFile3 = mockk() + every { childDestinationVirtualFile3.name } returns "test2" + every { childDestinationVirtualFile3.isDirectory } returns false // target to paste val mockedTargetFile1 = mockk() val mockedTargetFile2 = mockk() + val mockedTargetFile3 = mockk() val mockedTargetFile2Attributes = mockk() val mockedStructureTreeModelNodeTarget = mockk() val mockedNodeTarget = mockk() every { mockedTargetFile1.name } returns "test_folder" every { mockedTargetFile1.children } returns arrayOf(childDestinationVirtualFile1) + every { mockedTargetFile3.name } returns "test_folder2" + every { mockedTargetFile3.children } returns arrayOf(childDestinationVirtualFile3) every { mockedTargetFile2.name } returns "test_mf_folder" every { mockedTargetFile2.children } returns arrayOf(childDestinationVirtualFile2) every { mockedStructureTreeModelNodeTarget.userObject } returns mockedNodeTarget @@ -856,11 +868,16 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ } returns mutableListOf(Pair(mockedTargetFile1, mockedSourceFile1), Pair(mockedTargetFile1, mockedSourceFile2), Pair(mockedTargetFile1, mockedSourceFile3), Pair(mockedTargetFile1, mockedSourceFile4), Pair(mockedTargetFile1, mockedSourceFile5), Pair(mockedTargetFile1, mockedSourceFile6), - Pair(mockedTargetFile2, mockedSourceFile1), Pair(mockedTargetFile2, mockedSourceFile2), Pair(mockedTargetFile2, mockedSourceFile3) + Pair(mockedTargetFile2, mockedSourceFile1), Pair(mockedTargetFile2, mockedSourceFile2), Pair(mockedTargetFile2, mockedSourceFile3), + Pair(mockedTargetFile3, mockedSourceFile2) ) + every { mockedTargetFile1.findChild(any() as String) } returns childDestinationVirtualFile1 + every { mockedTargetFile3.findChild(any() as String) } returns childDestinationVirtualFile3 + every { dataOpsManagerService.testInstance.tryToGetAttributes(childDestinationVirtualFile1) } returns null every { dataOpsManagerService.testInstance.tryToGetAttributes(childDestinationVirtualFile2) } returns childDestMFFile2Attr + every { dataOpsManagerService.testInstance.tryToGetAttributes(childDestinationVirtualFile3) } returns null every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedSourceFile1) } returns mockedSourceAttributes1 every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedSourceFile2) } returns mockedSourceAttributes2 every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedSourceFile3) } returns mockedSourceAttributes3 @@ -869,6 +886,7 @@ class ExplorerPasteProviderTestSpec : ShouldSpec({ every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedSourceFile6) } returns mockedSourceAttributes6 every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedTargetFile1) } returns null every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedTargetFile2) } returns mockedTargetFile2Attributes + every { dataOpsManagerService.testInstance.tryToGetAttributes(mockedTargetFile3) } returns null every { mockedDataContext.getData(IS_DRAG_AND_DROP_KEY) } returns true every { mockedDataContext.getData(CommonDataKeys.PROJECT) } returns mockedProject diff --git a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/dummyClasses.kt b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/dummyClasses.kt index b5f2a0598..9d68c856f 100644 --- a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/dummyClasses.kt +++ b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/dummyClasses.kt @@ -38,6 +38,10 @@ open class TestFileEditorManager : FileEditorManager() { TODO("Not yet implemented") } + override fun openFile(file: VirtualFile): MutableList { + TODO("Not yet implemented") + } + override fun closeFile(file: VirtualFile) { TODO("Not yet implemented") } @@ -58,6 +62,10 @@ open class TestFileEditorManager : FileEditorManager() { TODO("Not yet implemented") } + override fun getOpenFilesWithRemotes(): MutableList { + TODO("Not yet implemented") + } + override fun getSelectedFiles(): Array { TODO("Not yet implemented") } From a6d331da1dcbcda7409c107a0c5ff09c1a8c627d Mon Sep 17 00:00:00 2001 From: Dzianis Lisiankou Date: Wed, 14 Jun 2023 17:40:49 +0300 Subject: [PATCH 4/8] Fixes after 'Merge branch release/v1.1.0-223 into release/v1.1.0-231' --- .../config/ConfigStartupActivity.kt | 6 ++--- .../editor/ProjectStartupActivity.kt | 8 +++--- .../ui/ChangeEncodingDialogTestSpec.kt | 25 +++++++------------ 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/eu/ibagroup/formainframe/config/ConfigStartupActivity.kt b/src/main/kotlin/eu/ibagroup/formainframe/config/ConfigStartupActivity.kt index 978287721..ffd425799 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/config/ConfigStartupActivity.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/config/ConfigStartupActivity.kt @@ -12,16 +12,16 @@ package eu.ibagroup.formainframe.config import com.intellij.openapi.components.service import com.intellij.openapi.project.Project -import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager.PostStartupActivity +import com.intellij.openapi.startup.ProjectActivity /** * Activity to prepare configs. * @author Valiantsin Krus. */ -class ConfigStartupActivity: PostStartupActivity() { +class ConfigStartupActivity: ProjectActivity { /** Registers all config classes and migrate configs to state v2. */ - override fun runActivity(project: Project) { + override suspend fun execute(project: Project) { service().apply { registerAllConfigClasses() service().state?.let { oldState -> diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectStartupActivity.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectStartupActivity.kt index 4be004c41..0d190a66d 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectStartupActivity.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectStartupActivity.kt @@ -11,20 +11,20 @@ package eu.ibagroup.formainframe.editor import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.wm.StatusBar import com.intellij.openapi.wm.StatusBarWidgetFactory /** * Project post startup activity. */ -class ProjectStartupActivity: StartupActivity.DumbAware { +class ProjectStartupActivity: ProjectActivity { /** - * Implementation of [StartupActivity.runActivity]. + * Implementation of [ProjectActivity.execute]. * Unregisters widget factories that provide status bar widgets that are overridden in the plugin. */ - override fun runActivity(project: Project) { + override suspend fun execute(project: Project) { val extensionPoint = StatusBarWidgetFactory.EP_NAME.point extensionPoint.extensionList.filter { it.id == StatusBar.StandardWidgets.ENCODING_PANEL || it.id == StatusBar.StandardWidgets.LINE_SEPARATOR_PANEL diff --git a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ChangeEncodingDialogTestSpec.kt b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ChangeEncodingDialogTestSpec.kt index e0306b323..ed8b00c0d 100644 --- a/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ChangeEncodingDialogTestSpec.kt +++ b/src/test/kotlin/eu/ibagroup/formainframe/explorer/ui/ChangeEncodingDialogTestSpec.kt @@ -10,6 +10,7 @@ package eu.ibagroup.formainframe.explorer.ui +import com.intellij.collaboration.ui.util.getName import com.intellij.icons.AllIcons import com.intellij.ide.IdeBundle import com.intellij.openapi.application.ApplicationManager @@ -204,8 +205,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ every { reloadIn(any(), virtualFileMock, charsetMock) } returns Unit val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val reloadAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.reload") } + val reloadAction = actions?.first { it.getName() == IdeBundle.message("button.reload") } reloadAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.RELOAD_EXIT_CODE } @@ -215,8 +215,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ every { reloadIn(any(), virtualFileMock, charsetMock) } returns Unit val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val reloadAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.reload") } + val reloadAction = actions?.first { it.getName() == IdeBundle.message("button.reload") } reloadAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.RELOAD_EXIT_CODE } @@ -247,8 +246,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ } val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val reloadAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.reload") } + val reloadAction = actions?.first { it.getName() == IdeBundle.message("button.reload") } reloadAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.RELOAD_EXIT_CODE } @@ -279,8 +277,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ } val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val reloadAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.reload") } + val reloadAction = actions?.first { it.getName() == IdeBundle.message("button.reload") } reloadAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.RELOAD_EXIT_CODE } @@ -304,8 +301,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ } val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val reloadAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.reload") } + val reloadAction = actions?.first { it.getName() == IdeBundle.message("button.reload") } reloadAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe DialogWrapper.CANCEL_EXIT_CODE } @@ -316,8 +312,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ every { saveIn(any(), virtualFileMock, charsetMock) } returns Unit val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val convertAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.convert") } + val convertAction = actions?.first { it.getName() == IdeBundle.message("button.convert") } convertAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.CONVERT_EXIT_CODE } @@ -348,8 +343,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ } val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val convertAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.convert") } + val convertAction = actions?.first { it.getName() == IdeBundle.message("button.convert") } convertAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe ChangeEncodingDialog.CONVERT_EXIT_CODE } @@ -373,8 +367,7 @@ class ChangeEncodingDialogTestSpec : ShouldSpec({ } val actions = createActionsRef.invoke(changeEncodingDialog).castOrNull>() - // TODO: change it.getValue(Action.NAME) to it.getName() in v1.*.*-231 and greater - val convertAction = actions?.first { it.getValue(Action.NAME) == IdeBundle.message("button.convert") } + val convertAction = actions?.first { it.getName() == IdeBundle.message("button.convert") } convertAction?.actionPerformed(actionEventMock) assertSoftly { expectedExitCode shouldBe DialogWrapper.CANCEL_EXIT_CODE } From 99b514f0c7b48d05e18905fd2c18a846eeb9c040 Mon Sep 17 00:00:00 2001 From: Uladzislau Date: Fri, 11 Aug 2023 11:38:03 +0200 Subject: [PATCH 5/8] IntelliJ IDEA supported versions bump --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6d2cd4bfe..5155ef0c6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,7 +88,7 @@ tasks { patchPluginXml { sinceBuild.set("231.8109") - untilBuild.set("231.*") + untilBuild.set("232.*") changeNotes.set( """ New features: From 4930ef5c7bc817f1f830ed35ae3647c771c965aa Mon Sep 17 00:00:00 2001 From: Uladzislau Date: Mon, 27 Nov 2023 17:35:41 +0100 Subject: [PATCH 6/8] The plugin version update Signed-off-by: Uladzislau --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 86c3e8051..943b7cf58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,7 +22,7 @@ apply(plugin = "kotlin") apply(plugin = "org.jetbrains.intellij") group = "eu.ibagroup" -version = "1.1.1-231" +version = "1.1.2-231" val remoteRobotVersion = "0.11.19" val okHttp3Version = "4.10.0" val kotestVersion = "5.6.2" From 81f24fa337fd97e01de508c6f683547f50c98ffc Mon Sep 17 00:00:00 2001 From: Dzianis Lisiankou Date: Tue, 16 Jan 2024 11:28:59 +0100 Subject: [PATCH 7/8] IJMP-1454: fixes for Intellij Idea EAP 2023.3 --- build.gradle.kts | 2 +- .../config/MainframeConfigurable.kt | 7 +++++-- .../connect/ui/zosmf/ConnectionDialog.kt | 13 +++++++----- .../ui/zosmf/ZOSMFConnectionConfigurable.kt | 13 +++++++----- .../editor/FileEditorFocusListener.kt | 20 ++++++++++++++----- .../editor/ProjectCloseListener.kt | 9 ++++++--- .../actions/SubmitJobToolbarAction.kt | 2 +- .../explorer/ui/WorkingSetNode.kt | 12 +++++++---- .../formainframe/utils/encodingUtils.kt | 3 ++- .../formainframe/vfs/MFVirtualFile.kt | 2 +- .../formainframe/editor/EditorTestSpec.kt | 2 ++ 11 files changed, 57 insertions(+), 28 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 943b7cf58..a6bfa21f6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,7 +88,7 @@ tasks { patchPluginXml { sinceBuild.set("231.8109") - untilBuild.set("232.*") + untilBuild.set("233.*") changeNotes.set( """ New features: diff --git a/src/main/kotlin/eu/ibagroup/formainframe/config/MainframeConfigurable.kt b/src/main/kotlin/eu/ibagroup/formainframe/config/MainframeConfigurable.kt index 82b95893f..b472cfd37 100755 --- a/src/main/kotlin/eu/ibagroup/formainframe/config/MainframeConfigurable.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/config/MainframeConfigurable.kt @@ -13,6 +13,7 @@ package eu.ibagroup.formainframe.config import com.intellij.openapi.components.service import com.intellij.openapi.options.Configurable import com.intellij.openapi.options.TabbedConfigurable +import com.intellij.openapi.progress.runBackgroundableTask import eu.ibagroup.formainframe.config.settings.ui.SettingsConfigurable /** @@ -55,8 +56,10 @@ class MainframeConfigurable : TabbedConfigurable() { * @see com.intellij.openapi.options.UnnamedConfigurable.reset */ override fun reset() { - ConfigSandbox.instance.fetch() - super.reset() + runBackgroundableTask(title = "Reset changes", cancellable = false) { + ConfigSandbox.instance.fetch() + super.reset() + } } /** diff --git a/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ConnectionDialog.kt b/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ConnectionDialog.kt index 16080cc40..19f58c395 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ConnectionDialog.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ConnectionDialog.kt @@ -12,6 +12,7 @@ package eu.ibagroup.formainframe.config.connect.ui.zosmf import com.intellij.icons.AllIcons import com.intellij.openapi.components.service +import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.project.Project import com.intellij.openapi.ui.MessageDialogBuilder import com.intellij.openapi.ui.MessageType @@ -348,11 +349,13 @@ class ConnectionDialog( state.password = getPassword(lastSuccessfulState.connectionConfig) state.isAllowSsl = lastSuccessfulState.isAllowSsl state.zVersion = lastSuccessfulState.zVersion - CredentialService.instance.setCredentials( - connectionConfigUuid = lastSuccessfulState.connectionUuid, - username = getUsername(lastSuccessfulState.connectionConfig), - password = getPassword(lastSuccessfulState.connectionConfig) - ) + runBackgroundableTask("Setting credentials", project, false) { + CredentialService.instance.setCredentials( + connectionConfigUuid = lastSuccessfulState.connectionUuid, + username = getUsername(lastSuccessfulState.connectionConfig), + password = getPassword(lastSuccessfulState.connectionConfig) + ) + } } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ZOSMFConnectionConfigurable.kt b/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ZOSMFConnectionConfigurable.kt index 155c9918b..3091f3a11 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ZOSMFConnectionConfigurable.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/config/connect/ui/zosmf/ZOSMFConnectionConfigurable.kt @@ -13,6 +13,7 @@ package eu.ibagroup.formainframe.config.connect.ui.zosmf import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.invokeLater import com.intellij.openapi.options.BoundSearchableConfigurable +import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.ui.DialogPanel import com.intellij.openapi.ui.Messages import com.intellij.ui.dsl.builder.panel @@ -225,11 +226,13 @@ class ZOSMFConnectionConfigurable : BoundSearchableConfigurable("z/OSMF Connecti /** Reset the Connections table changes. Updates UI when the changes were introduced */ override fun reset() { - val wasModified = isModified - rollbackSandbox() - rollbackSandbox() - if (wasModified) { - panel?.updateUI() + runBackgroundableTask(title = "Reset changes", cancellable = false) { + val wasModified = isModified + rollbackSandbox() + rollbackSandbox() + if (wasModified) { + panel?.updateUI() + } } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/FileEditorFocusListener.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/FileEditorFocusListener.kt index 0a0421d5c..762caa5de 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/FileEditorFocusListener.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/FileEditorFocusListener.kt @@ -10,10 +10,12 @@ package eu.ibagroup.formainframe.editor +import com.intellij.openapi.application.runInEdt import com.intellij.openapi.components.service import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.editor.ex.FocusChangeListener +import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.ui.isComponentUnderMouse import eu.ibagroup.formainframe.config.ConfigService import eu.ibagroup.formainframe.dataops.DataOpsManager @@ -57,12 +59,20 @@ class FileEditorFocusListener: FocusChangeListener { val previousContent = contentSynchronizer?.successfulContentStorage(syncProvider) val needToUpload = contentSynchronizer?.isFileUploadNeeded(syncProvider) == true if (!(currentContent contentEquals previousContent) && needToUpload) { - val incompatibleEncoding = !checkEncodingCompatibility(file, project) - if (incompatibleEncoding && !showSaveAnywayDialog(file.charset)) { - return + runBackgroundableTask( + title = "Synchronizing ${file.name}...", + project = project, + cancellable = true + ) { + val incompatibleEncoding = !checkEncodingCompatibility(file, project) + runInEdt { + if (incompatibleEncoding && !showSaveAnywayDialog(file.charset)) { + return@runInEdt + } + runWriteActionInEdtAndWait { syncProvider.saveDocument() } + sendTopic(AutoSyncFileListener.AUTO_SYNC_FILE, project).sync(file) + } } - runWriteActionInEdtAndWait { syncProvider.saveDocument() } - sendTopic(AutoSyncFileListener.AUTO_SYNC_FILE, project).sync(file) } } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectCloseListener.kt b/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectCloseListener.kt index 3ac702fb5..61e2e7985 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectCloseListener.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/editor/ProjectCloseListener.kt @@ -10,6 +10,7 @@ package eu.ibagroup.formainframe.editor +import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.ProjectManagerListener @@ -69,9 +70,11 @@ class ProjectCloseListener : ProjectManagerListener { * @param project the project to filter encoding mappings. */ override fun projectClosingBeforeSave(project: Project) { - val encodingManager = EncodingProjectManager.getInstance(project) as EncodingProjectManagerImpl - val filteredMappings = encodingManager.allMappings.toMutableMap().filter { it.key !is MFVirtualFile } - encodingManager.setMapping(filteredMappings) + runWriteAction { + val encodingManager = EncodingProjectManager.getInstance(project) as EncodingProjectManagerImpl + val filteredMappings = encodingManager.allMappings.toMutableMap().filter { it.key !is MFVirtualFile } + encodingManager.setMapping(filteredMappings) + } super.projectClosingBeforeSave(project) } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/explorer/actions/SubmitJobToolbarAction.kt b/src/main/kotlin/eu/ibagroup/formainframe/explorer/actions/SubmitJobToolbarAction.kt index 7bbf6c72a..e969ba2af 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/explorer/actions/SubmitJobToolbarAction.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/explorer/actions/SubmitJobToolbarAction.kt @@ -53,7 +53,7 @@ class SubmitJobToolbarAction: AnAction() { ), progressIndicator = it ).also { result -> - project?.let { project -> + e.project?.let { project -> sendTopic(JOB_ADDED_TOPIC, project).submitted(project, connectionConfig, file.parent.path, result) } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/explorer/ui/WorkingSetNode.kt b/src/main/kotlin/eu/ibagroup/formainframe/explorer/ui/WorkingSetNode.kt index 255554748..61c63b1dc 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/explorer/ui/WorkingSetNode.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/explorer/ui/WorkingSetNode.kt @@ -13,6 +13,7 @@ package eu.ibagroup.formainframe.explorer.ui import com.intellij.icons.AllIcons import com.intellij.ide.projectView.PresentationData import com.intellij.ide.util.treeView.AbstractTreeNode +import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.project.Project import com.intellij.ui.LayeredIcon import com.intellij.ui.SimpleTextAttributes @@ -80,9 +81,12 @@ abstract class WorkingSetNode( * @param presentation the presentation, which explanatory text will be assigned to */ protected fun addInfo(presentation: PresentationData) { - val connectionConfig = value.connectionConfig ?: return - val url = value.connectionConfig?.url ?: return - val username = getUsername(connectionConfig) - presentation.addText(" $username on ${connectionConfig.name} [${url}]", SimpleTextAttributes.GRAYED_ATTRIBUTES) + runBackgroundableTask("Getting connection information", project, false) { + val connectionConfig = value.connectionConfig ?: return@runBackgroundableTask + val url = value.connectionConfig?.url ?: return@runBackgroundableTask + val username = getUsername(connectionConfig) + presentation.addText(" $username on ${connectionConfig.name} [${url}]", SimpleTextAttributes.GRAYED_ATTRIBUTES) + apply(presentation) + } } } diff --git a/src/main/kotlin/eu/ibagroup/formainframe/utils/encodingUtils.kt b/src/main/kotlin/eu/ibagroup/formainframe/utils/encodingUtils.kt index 6b3be9d5a..b832a590c 100644 --- a/src/main/kotlin/eu/ibagroup/formainframe/utils/encodingUtils.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/utils/encodingUtils.kt @@ -18,6 +18,7 @@ import com.intellij.ide.IdeBundle import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DefaultActionGroup +import com.intellij.openapi.application.runReadAction import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.impl.LoadTextUtil import com.intellij.openapi.project.DumbAwareAction @@ -224,7 +225,7 @@ fun createCharsetsActionGroup(virtualFile: VirtualFile, attributes: RemoteUssAtt */ fun checkEncodingCompatibility(file: VirtualFile, project: Project): Boolean { var compatible = true - val psiFile = PsiManager.getInstance(project).findFile(file) + val psiFile = runReadAction { PsiManager.getInstance(project).findFile(file) } psiFile?.let { val inspectionProfile = InspectionProjectProfileManager.getInstance(project).currentProfile val inspectionTool = inspectionProfile.getInspectionTool("MFLossyEncoding", project) diff --git a/src/main/kotlin/eu/ibagroup/formainframe/vfs/MFVirtualFile.kt b/src/main/kotlin/eu/ibagroup/formainframe/vfs/MFVirtualFile.kt index c979c68a7..f66dabc99 100755 --- a/src/main/kotlin/eu/ibagroup/formainframe/vfs/MFVirtualFile.kt +++ b/src/main/kotlin/eu/ibagroup/formainframe/vfs/MFVirtualFile.kt @@ -32,7 +32,7 @@ class MFVirtualFile internal constructor( ) : VirtualFile(), VirtualFileWithId, ReadWriteLock by ReentrantReadWriteLock() { companion object { - private val fs = MFVirtualFileSystem.instance + private val fs by lazy { MFVirtualFileSystem.instance } } @Volatile diff --git a/src/test/kotlin/eu/ibagroup/formainframe/editor/EditorTestSpec.kt b/src/test/kotlin/eu/ibagroup/formainframe/editor/EditorTestSpec.kt index 169e495b6..e9e3c8023 100644 --- a/src/test/kotlin/eu/ibagroup/formainframe/editor/EditorTestSpec.kt +++ b/src/test/kotlin/eu/ibagroup/formainframe/editor/EditorTestSpec.kt @@ -117,6 +117,8 @@ class EditorTestSpec : WithApplicationShouldSpec({ val bytes = byteArrayOf(116, 101, 120, 116) every { contentSynchronizerMock.successfulContentStorage(any()) } returns bytes + every { virtualFileMock.name } returns "fileName" + var currentBytes: ByteArray mockkConstructor(DocumentedSyncProvider::class) From f43bc22ceba0576c7ecd64bf352f85a3d3c7e7d0 Mon Sep 17 00:00:00 2001 From: Uladzislau Date: Thu, 18 Jan 2024 14:44:49 +0100 Subject: [PATCH 8/8] CHANGELOG.md change Signed-off-by: Uladzislau --- CHANGELOG.md | 3 +++ build.gradle.kts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f58394010..855b875d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to the Zowe IntelliJ Plugin will be documented in this file. ## `1.1.2 (2024-01-22)` +* Feature: GitHub issue #165: IntelliJ 2023.3 support ([81f24fa3](https://github.com/zowe/zowe-explorer-intellij/commit/81f24fa3)) + + * Bugfix: Sync action does not work after file download ([bfb125d7](https://github.com/zowe/zowe-explorer-intellij/commit/bfb125d7)) * Bugifx: "Skip This Files" doesn't work when uploading local file to PDS ([749b2d4b](https://github.com/zowe/zowe-explorer-intellij/commit/749b2d4b)) * Bugifx: "Use new name" doesn't work for copying partitioned dataset to USS folder ([26d865be](https://github.com/zowe/zowe-explorer-intellij/commit/26d865be)) diff --git a/build.gradle.kts b/build.gradle.kts index c82fd354f..8fc3a2e17 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -93,7 +93,7 @@ tasks { """ New features:
    -
  • None at the moment
  • +
  • GitHub issue #165: IntelliJ 2023.3 support

Fixed bugs: