IJPL-850 make NavBarVm independent of NavBarItem

GitOrigin-RevId: 01617567b94538e1bb043c3b360dc9cf79c12bbc
This commit is contained in:
Daniil Ovchinnikov
2024-03-20 20:54:34 +00:00
committed by intellij-monorepo-bot
parent 89981ba257
commit d1293441d8
9 changed files with 58 additions and 51 deletions
@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.execution.services
import com.intellij.execution.services.ServiceModel.ServiceViewItem
@@ -91,9 +91,9 @@ internal class ServiceViewNavBarPanel(
updateRequests.tryEmit(Unit)
}
private fun requestNavigation(pointer: Pointer<out NavBarItem>) {
private fun requestNavigation(item: NavBarVmItem) {
cs.launch(Dispatchers.EDT) {
(pointer as? ServiceViewNavBarItem)?.item?.let {
(item as? ServiceViewNavBarItem)?.item?.let {
selector.select(it)
}
}
@@ -1,7 +1,10 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.actions
import com.intellij.ide.impl.dataRules.GetDataRule
import com.intellij.ide.navbar.NavBarItem
import com.intellij.ide.navbar.ide.IdeNavBarVmItem
import com.intellij.ide.navbar.ide.NavBarVmItem
import com.intellij.ide.navbar.impl.DefaultNavBarItem
import com.intellij.ide.navbar.impl.ModuleNavBarItem
import com.intellij.ide.navbar.impl.PsiNavBarItem
@@ -40,6 +43,22 @@ private fun extensionData(dataId: String, provider: DataProvider): Any? {
return provider.getData(dataId)
}
internal class BgtDataRule : GetDataRule {
override fun getData(dataProvider: DataProvider): Any? {
val project = CommonDataKeys.PROJECT.getData(dataProvider)
?: return null
val selection = NavBarVmItem.SELECTED_ITEMS.getData(dataProvider)
?: return null
val pointers = selection.map {
(it as IdeNavBarVmItem).pointer
}
return DataProvider {
getBgData(project, pointers, it)
}
}
}
internal fun getBgData(project: Project, selection: List<Pointer<out NavBarItem>>, dataId: String): Any? {
val selectedItems = lazy(LazyThreadSafetyMode.NONE) {
ApplicationManager.getApplication().assertReadAccessAllowed()
@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ide
import com.intellij.codeInsight.navigation.actions.navigateRequest
@@ -11,7 +11,6 @@ import com.intellij.ide.navbar.ui.showHint
import com.intellij.ide.navbar.ui.staticNavBarPanel
import com.intellij.ide.ui.UISettings
import com.intellij.lang.documentation.ide.ui.DEFAULT_UI_RESPONSE_TIMEOUT
import com.intellij.model.Pointer
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.application.EDT
@@ -107,22 +106,17 @@ internal class NavBarService(private val project: Project, cs: CoroutineScope) {
}
}
private fun requestNavigation(pointer: Pointer<out NavBarItem>) {
private fun requestNavigation(item: NavBarVmItem) {
cs.launch {
navigateTo(pointer)
val navigationRequest = readAction {
(item as IdeNavBarVmItem).pointer.dereference()?.navigationRequest()
} ?: return@launch
withContext(Dispatchers.EDT) {
navigateRequest(project, navigationRequest)
}
updateRequests.emit(Unit)
}
}
private suspend fun navigateTo(pointer: Pointer<out NavBarItem>) {
val navigationRequest = readAction {
pointer.dereference()?.navigationRequest()
} ?: return
withContext(Dispatchers.EDT) {
navigateRequest(project, navigationRequest)
}
updateRequests.emit(Unit)
}
}
/**
@@ -1,15 +1,12 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ide
import com.intellij.ide.navbar.NavBarItem
import com.intellij.ide.navbar.NavBarItemPresentation
import com.intellij.ide.navbar.vm.NavBarItemVm
import com.intellij.ide.navbar.vm.NavBarPopupVm
import com.intellij.ide.navbar.vm.NavBarVm
import com.intellij.ide.navbar.vm.NavBarVm.SelectionShift
import com.intellij.model.Pointer
import com.intellij.platform.util.coroutines.flow.zipWithNext
import com.intellij.util.ui.EDT
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
@@ -36,7 +33,7 @@ class NavBarVmImpl(
private val _popup: MutableStateFlow<NavBarPopupVmImpl<DefaultNavBarPopupItem>?> = MutableStateFlow(null)
private val _activationRequests: MutableSharedFlow<Pointer<out NavBarItem>> =
private val _activationRequests: MutableSharedFlow<NavBarVmItem> =
MutableSharedFlow(extraBufferCapacity = 1, onBufferOverflow = DROP_OLDEST)
init {
@@ -64,21 +61,20 @@ class NavBarVmImpl(
override val popup: StateFlow<NavBarPopupVm<*>?> = _popup.asStateFlow()
override val activationRequests: Flow<Pointer<out NavBarItem>> = _activationRequests.asSharedFlow()
override val activationRequests: Flow<NavBarVmItem> = _activationRequests.asSharedFlow()
override fun selection(): List<Pointer<out NavBarItem>> {
EDT.assertIsEdt()
override fun selection(): List<NavBarVmItem> {
val popup = _popup.value
if (popup != null) {
return popup.selectedItems.map {
it.item.pointer
it.item
}
}
else {
val selectedIndex = _selectedIndex.value
val items = _items.value
if (selectedIndex in items.indices) {
return listOf(items[selectedIndex].item.pointer)
return listOf(items[selectedIndex].item)
}
}
return emptyList()
@@ -155,7 +151,7 @@ class NavBarVmImpl(
?: return
when (expandResult) {
is ExpandResult.NavigateTo -> {
_activationRequests.tryEmit(expandResult.target.pointer)
_activationRequests.tryEmit(expandResult.target)
return
}
is ExpandResult.NextPopup -> {
@@ -206,7 +202,7 @@ class NavBarVmImpl(
}
override fun activate() {
_activationRequests.tryEmit(item.pointer)
_activationRequests.tryEmit(item)
}
}
}
@@ -1,12 +1,18 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ide
import com.intellij.ide.navbar.NavBarItem
import com.intellij.ide.navbar.NavBarItemPresentation
import com.intellij.model.Pointer
import com.intellij.openapi.actionSystem.DataKey
interface NavBarVmItem {
companion object {
@JvmField
val SELECTED_ITEMS: DataKey<List<NavBarVmItem>> = DataKey.create("nav.bar.selection")
}
override fun equals(other: Any?): Boolean
override fun hashCode(): Int
@@ -1,26 +1,23 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ui
import com.intellij.accessibility.AccessibilityUtils
import com.intellij.ide.CopyPasteDelegator
import com.intellij.ide.CopyPasteSupport
import com.intellij.ide.IdeBundle
import com.intellij.ide.navbar.NavBarItem
import com.intellij.ide.navbar.actions.NavBarActionHandler.NAV_BAR_ACTION_HANDLER
import com.intellij.ide.navbar.actions.NavBarActionHandlerImpl
import com.intellij.ide.navbar.actions.extensionData
import com.intellij.ide.navbar.actions.getBgData
import com.intellij.ide.navbar.ide.LOG
import com.intellij.ide.navbar.ide.NavBarVmItem.Companion.SELECTED_ITEMS
import com.intellij.ide.navbar.ui.NavBarItemComponent.Companion.isItemComponentFocusable
import com.intellij.ide.navbar.vm.NavBarItemVm
import com.intellij.ide.navbar.vm.NavBarPopupVm
import com.intellij.ide.navbar.vm.NavBarVm
import com.intellij.ide.ui.UISettings
import com.intellij.internal.statistic.service.fus.collectors.UIEventLogger.NavBarShowPopup
import com.intellij.model.Pointer
import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT
import com.intellij.openapi.actionSystem.DataProvider
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys.BGT_DATA_PROVIDER
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys.CONTEXT_COMPONENT
import com.intellij.openapi.actionSystem.PlatformDataKeys.*
import com.intellij.openapi.actionSystem.ex.ActionUtil
@@ -241,12 +238,7 @@ class NewNavBarPanel(
CUT_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).cutProvider
COPY_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).copyProvider
PASTE_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).pasteProvider
BGT_DATA_PROVIDER.name -> {
val selection: List<Pointer<out NavBarItem>> = vm.selection()
DataProvider {
getBgData(project, selection, it)
}
}
SELECTED_ITEMS.name -> vm.selection()
else -> null
}
@@ -1,10 +1,8 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.ui
import com.intellij.ide.navbar.NavBarItem
import com.intellij.ide.navbar.ide.*
import com.intellij.ide.navbar.vm.NavBarVm
import com.intellij.model.Pointer
import com.intellij.openapi.application.EDT
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.attachAsChildTo
@@ -29,7 +27,7 @@ fun staticNavBarPanel(
project: Project,
cs: CoroutineScope,
updateRequests: Flow<Any>,
requestNavigation: (Pointer<out NavBarItem>) -> Unit,
requestNavigation: (NavBarVmItem) -> Unit,
): JComponent {
val staticNavBarVm: MutableStateFlow<NavBarVm?> = MutableStateFlow(null)
@@ -1,8 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.navbar.vm
import com.intellij.ide.navbar.NavBarItem
import com.intellij.model.Pointer
import com.intellij.ide.navbar.ide.NavBarVmItem
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import org.jetbrains.annotations.ApiStatus
@@ -16,9 +15,9 @@ interface NavBarVm {
val popup: StateFlow<NavBarPopupVm<*>?>
val activationRequests: Flow<Pointer<out NavBarItem>>
val activationRequests: Flow<NavBarVmItem>
fun selection(): List<Pointer<out NavBarItem>>
fun selection(): List<NavBarVmItem>
enum class SelectionShift {
FIRST,
@@ -705,6 +705,9 @@
implementationClass="com.intellij.ide.navbar.actions.DefaultNavBarItemDataRule"
type="context"
order="last"/>
<getDataRule key="bgtDataProvider"
implementationClass="com.intellij.ide.navbar.actions.BgtDataRule"
type="provider"/>
<statistician key="completion" implementationClass="com.intellij.codeInsight.completion.DefaultCompletionStatistician" order="last"/>