IJPL-165414: vcs marker: Move "Highlight words" action form toolbar to the context menu

Add "Copy" as well to the context menu


(cherry picked from commit 7a64bba4ba719d3a5a45e9ca51ecf27ca8ed9bd0)

IJ-CR-149651

GitOrigin-RevId: 4dac3794ff4e2716cfdf5fed1fbc6b5cd1c1550f
This commit is contained in:
Aleksandr Krasilnikov
2024-11-06 14:56:33 +01:00
committed by intellij-monorepo-bot
parent 90ee4cefd1
commit 633ffa3474
4 changed files with 43 additions and 14 deletions

View File

@@ -147,12 +147,13 @@ object LineStatusMarkerPopupActions {
}
@ApiStatus.NonExtendable
open class ToggleByWordDiffAction(private val editor: Editor,
private val tracker: LineStatusTrackerI<*>,
private val range: Range,
private val mousePosition: Point?,
private val controller: LineStatusMarkerRendererWithPopupController)
: ToggleAction(DiffBundle.message("highlight.words"), null, AllIcons.Actions.Highlighting), DumbAware, LightEditCompatible {
open class ToggleByWordDiffAction(
private val editor: Editor,
private val tracker: LineStatusMarkerRangesSource<*>,
private val range: Range,
private val mousePosition: Point?,
private val controller: LineStatusMarkerRendererWithPopupController,
) : ToggleAction(DiffBundle.message("highlight.words"), null, AllIcons.Actions.Highlighting), DumbAware, LightEditCompatible {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT

View File

@@ -6,9 +6,14 @@ import com.intellij.diff.comparison.ByWord
import com.intellij.diff.comparison.ComparisonPolicy
import com.intellij.diff.util.DiffUtil
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.ActionGroup
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.event.EditorMouseEvent
import com.intellij.openapi.editor.impl.ContextMenuPopupHandler
import com.intellij.openapi.editor.impl.EditorImpl
import com.intellij.openapi.editor.markup.MarkupEditorFilter
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.fileTypes.PlainTextFileType
@@ -32,7 +37,7 @@ abstract class LineStatusTrackerMarkerRenderer(
popupDisposable: Disposable): LineStatusMarkerPopupPanel {
var editorComponent: JComponent? = null
if (range.hasVcsLines()) {
editorComponent = createVcsContentComponent(range, editor, popupDisposable)
editorComponent = createVcsContentComponent(range, editor, mousePosition, popupDisposable)
}
val actions = createToolbarActions(editor, range, mousePosition) +
createAdditionalToolbarActions(editor, range, mousePosition, popupDisposable)
@@ -41,18 +46,28 @@ abstract class LineStatusTrackerMarkerRenderer(
return LineStatusMarkerPopupPanel.create(editor, toolbar, editorComponent, additionalInfoPanel)
}
private fun createVcsContentComponent(range: Range, editor: Editor, disposable: Disposable): JComponent {
private fun createVcsContentComponent(range: Range, editor: Editor, mousePosition: Point?, disposable: Disposable): JComponent {
val vcsRange = DiffUtil.getLinesRange(vcsDocument, range.vcsLine1, range.vcsLine2)
val vcsContent = DiffUtil.getLinesContent(vcsDocument, range.vcsLine1, range.vcsLine2).toString()
val textField = LineStatusMarkerPopupPanel.createTextField(editor, vcsContent)
LineStatusMarkerPopupPanel.installBaseEditorSyntaxHighlighters(project, textField, vcsDocument, vcsRange,
fileType ?: PlainTextFileType.INSTANCE)
installWordDiff(editor, textField, range, disposable)
textField.addSettingsProvider { uEditor ->
uEditor as? EditorImpl ?: return@addSettingsProvider
val contextMenuActions = createEditorContextMenuActions(editor, range, mousePosition)
if (contextMenuActions.isNotEmpty()) {
uEditor.installPopupHandler(object : ContextMenuPopupHandler() {
override fun getActionGroup(event: EditorMouseEvent): ActionGroup = DefaultActionGroup(contextMenuActions)
})
}
}
return LineStatusMarkerPopupPanel.createEditorComponent(editor, textField)
}
protected open fun createToolbarActions(editor: Editor, range: Range, mousePosition: Point?): List<AnAction> = emptyList()
protected open fun createAdditionalToolbarActions(editor: Editor, range: Range, mousePosition: Point?, popupDisposable: Disposable): List<AnAction> = emptyList()
protected open fun createEditorContextMenuActions(editor: Editor, range: Range, mousePosition: Point?): List<AnAction> = emptyList()
protected open fun createAdditionalInfoPanel(editor: Editor,
range: Range,

View File

@@ -9,6 +9,8 @@ import com.intellij.ide.lightEdit.LightEditCompatible
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.actionSystem.KeepPopupOnPerform
import com.intellij.openapi.actionSystem.Separator
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.editor.Document
@@ -155,10 +157,17 @@ abstract class LocalLineStatusTrackerImpl<R : Range>(
actions.add(RollbackLineStatusRangeAction(editor, range))
actions.add(LineStatusMarkerPopupActions.ShowLineStatusRangeDiffAction(editor, tracker, range))
actions.add(LineStatusMarkerPopupActions.CopyLineStatusRangeAction(editor, tracker, range))
actions.add(LineStatusMarkerPopupActions.ToggleByWordDiffAction(editor, tracker, range, mousePosition, this))
return actions
}
override fun createEditorContextMenuActions(editor: Editor, range: Range, mousePosition: Point?): List<AnAction> = listOf(
LineStatusMarkerPopupActions.CopyLineStatusRangeAction(editor, tracker, range),
Separator.getInstance(),
LineStatusMarkerPopupActions.ToggleByWordDiffAction(editor, tracker, range, mousePosition, this).apply {
templatePresentation.keepPopupOnPerform = KeepPopupOnPerform.Never
},
)
override fun createAdditionalInfoPanel(editor: Editor, range: Range, mousePosition: Point?, disposable: Disposable): JComponent? {
val clientIds = (range as? LstLocalRange)?.clientIds ?: return null
return createClientIdGutterPopupPanel(tracker.project, clientIds)

View File

@@ -14,10 +14,7 @@ import com.intellij.diff.util.DiffDrawUtil.InlineHighlighterBuilder
import com.intellij.diff.util.DiffDrawUtil.LineHighlighterBuilder
import com.intellij.ide.lightEdit.LightEditCompatible
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.diff.DiffBundle
import com.intellij.openapi.diff.LineStatusMarkerColorScheme
@@ -792,10 +789,17 @@ class GitStageLineStatusTracker(
actions.add(RollbackLineStatusRangeAction(editor, range))
actions.add(StageShowDiffAction(editor, range))
actions.add(LineStatusMarkerPopupActions.CopyLineStatusRangeAction(editor, tracker, range))
actions.add(LineStatusMarkerPopupActions.ToggleByWordDiffAction(editor, tracker, range, mousePosition, this))
return actions
}
override fun createEditorContextMenuActions(editor: Editor, range: Range, mousePosition: Point?): List<AnAction> = listOf(
LineStatusMarkerPopupActions.CopyLineStatusRangeAction(editor, tracker, range),
Separator.getInstance(),
LineStatusMarkerPopupActions.ToggleByWordDiffAction(editor, tracker, range, mousePosition, this).apply {
templatePresentation.keepPopupOnPerform = KeepPopupOnPerform.Never
},
)
override fun toString(): String = "GitStageLineStatusTracker.MyLineStatusMarkerPopupRenderer(tracker=$tracker)"
private inner class RollbackLineStatusRangeAction(editor: Editor, range: Range)