*/
Key<Boolean> MERGE_EDITOR_FLAG = Key.create("Diff.mergeEditor");
+ /**
+ * Force aligning changes in side-by-side viewer.<br/>
+ * This can be used in viewers, where aligning is critical (e.g. {@link com.intellij.diff.tools.combined.CombinedDiffViewer}).
+ *
+ * @see com.intellij.diff.tools.util.base.TextDiffSettingsHolder.TextDiffSettings#isEnableAligningChangesMode
+ */
Key<Boolean> ALIGNED_TWO_SIDED_DIFF = Key.create("Diff.AlignTwoSidedDiff");
}
--- /dev/null
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.intellij.diff.actions.impl
+
+import com.intellij.diff.tools.simple.SimpleDiffViewer
+import com.intellij.diff.tools.util.DiffDataKeys.DIFF_VIEWER
+import com.intellij.diff.tools.util.base.TextDiffViewerUtil
+import com.intellij.diff.util.DiffUserDataKeys.ALIGNED_TWO_SIDED_DIFF
+import com.intellij.diff.util.DiffUtil
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.project.DumbAwareToggleAction
+
+class ToggleDiffAligningModeAction : DumbAwareToggleAction() {
+
+ override fun update(e: AnActionEvent) {
+ val viewer = e.getData(DIFF_VIEWER)
+ val available = e.project != null
+ && viewer is SimpleDiffViewer
+ && !DiffUtil.isUserDataFlagSet(ALIGNED_TWO_SIDED_DIFF, viewer.request)
+ if (!available) {
+ e.presentation.isEnabledAndVisible = available
+ return
+ }
+
+ super.update(e)
+ }
+
+ override fun isSelected(e: AnActionEvent): Boolean {
+ val viewer = e.getData(DIFF_VIEWER) as SimpleDiffViewer
+ return TextDiffViewerUtil.getTextSettings(viewer.context).isEnableAligningChangesMode
+ }
+
+ override fun setSelected(e: AnActionEvent, state: Boolean) {
+ val viewer = e.getData(DIFF_VIEWER) as SimpleDiffViewer
+
+ TextDiffViewerUtil.getTextSettings(viewer.context).isEnableAligningChangesMode = state
+ viewer.rediff()
+ }
+}
private val DIFF_PLACE = EventFields.String("diff_place", places)
private val SYNC_SCROLL = GROUP.registerVarargEvent("sync.scroll", DIFF_PLACE, EventFields.Enabled)
+ private val ALIGNED_CHANGES = GROUP.registerVarargEvent("aligned.changes", DIFF_PLACE, EventFields.Enabled)
private val IGNORE_POLICY_VALUE = EventFields.Enum("value", IgnorePolicy::class.java)
private val IGNORE_POLICY = GROUP.registerVarargEvent("ignore.policy", DIFF_PLACE, IGNORE_POLICY_VALUE)
private val HIGHLIGHT_POLICY_VALUE = EventFields.Enum("value", HighlightPolicy::class.java)
override fun getMetrics(): Set<MetricEvent> {
val set = HashSet<MetricEvent>()
-
for (place in places) {
val data: MutableList<EventPair<*>> = mutableListOf(DIFF_PLACE.with(place))
val defaultTextSettings = TextDiffSettings.getDefaultSettings(place)
addBoolIfDiffers(set, textSettings, defaultTextSettings, { it.isEnableSyncScroll }, SYNC_SCROLL, data)
+ addBoolIfDiffers(set, textSettings, defaultTextSettings, { it.isEnableAligningChangesMode }, ALIGNED_CHANGES, data)
addIfDiffers(set, textSettings, defaultTextSettings, { it.ignorePolicy }, IGNORE_POLICY, IGNORE_POLICY_VALUE, data)
addIfDiffers(set, textSettings, defaultTextSettings, { it.highlightPolicy }, HIGHLIGHT_POLICY, HIGHLIGHT_POLICY_VALUE, data)
addIfDiffers(set, textSettings, defaultTextSettings, { it.highlightingLevel }, SHOW_WARNINGS_POLICY, HIGHLIGHTING_LEVEL_VALUE,
private val inlayHighlighters = mutableMapOf<Side, MutableList<RangeHighlighter>>()
init {
- if (viewer.needAlignChanges()) {
- val inlayListener = MyInlayModelListener()
- viewer.getEditor(Side.LEFT).inlayModel.addListener(inlayListener, viewer)
- viewer.getEditor(Side.RIGHT).inlayModel.addListener(inlayListener, viewer)
- }
+ val inlayListener = MyInlayModelListener()
+ viewer.getEditor(Side.LEFT).inlayModel.addListener(inlayListener, viewer)
+ viewer.getEditor(Side.RIGHT).inlayModel.addListener(inlayListener, viewer)
}
fun alignChange(change: SimpleDiffChange) {
private enum class ProcessType { ADDED, REMOVED, HEIGHT_UPDATED }
private fun processInlay(inlay: Inlay<*>, processType: ProcessType) {
+ if (!viewer.needAlignChanges()) return
if (inlay.renderer is BaseAlignDiffInlayPresentation) return //skip self
val inlayLine = inlay.logicalLine
}
boolean needAlignChanges() {
- return Boolean.TRUE.equals(myRequest.getUserData(DiffUserDataKeys.ALIGNED_TWO_SIDED_DIFF));
+ return Boolean.TRUE.equals(myRequest.getUserData(DiffUserDataKeys.ALIGNED_TWO_SIDED_DIFF))
+ || getTextSettings().isEnableAligningChangesMode();
}
@NotNull
-// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.diff.tools.util.base
import com.intellij.diff.tools.util.breadcrumbs.BreadcrumbsPlacement
var CONTEXT_RANGE: Int = 4,
var MERGE_AUTO_APPLY_NON_CONFLICTED_CHANGES: Boolean = false,
- var MERGE_LST_GUTTER_MARKERS: Boolean = true
+ var MERGE_LST_GUTTER_MARKERS: Boolean = true,
+ var ENABLE_ALIGNING_CHANGES_MODE: Boolean = false
)
data class PlaceSettings(
var isEnableSyncScroll: Boolean = true
+ var isEnableAligningChangesMode: Boolean
+ get() = SHARED_SETTINGS.ENABLE_ALIGNING_CHANGES_MODE
+ set(value) { SHARED_SETTINGS.ENABLE_ALIGNING_CHANGES_MODE = value }
+
// Diff settings
var highlightPolicy: HighlightPolicy = PLACE_SETTINGS.HIGHLIGHT_POLICY
override fun loadState(state: State) {
myState = state
}
-}
\ No newline at end of file
+}
action.Vcs.Diff.ShowDiffInNewWindow.text=Show Diff in Separate Window
action.Vcs.Diff.ShowCombinedDiff.text=Show Combined Diff
action.Vcs.Diff.ShowCombinedDiff.description=Show diff for all selected changes in one place
+action.Vcs.Diff.ToggleDiffAligningMode.text=Align Changes In Side-by-Side Diff
+action.Vcs.Diff.ToggleDiffAligningMode.popup@DiffToolbar.text=Align Changes Highlighting
+action.Vcs.Diff.ToggleDiffAligningMode.description=Turn on changes alignment for two-sided diff
action.Vcs.RollbackChangedLines.text=Rollback Lines
action.Vcs.RollbackChangedLines.description=Rollback changes in selected lines
action.openAssertEqualsDiff.text=View assertEquals Difference
big.spacer=big spacer
-action.ListPersistentStateComponents.text=List Persistent State Components
\ No newline at end of file
+action.ListPersistentStateComponents.text=List Persistent State Components
<add-to-group group-id="Diff.EditorGutterPopupMenu.EditorSettings" anchor="last"/>
<add-to-group group-id="Diff.Binary.Settings" anchor="last"/>
</action>
+ <action id="Vcs.Diff.ToggleDiffAligningMode" class="com.intellij.diff.actions.impl.ToggleDiffAligningModeAction">
+ <add-to-group group-id="Diff.EditorGutterPopupMenu.EditorSettings"/>
+ <override-text place="popup@DiffToolbar"/>
+ </action>
<group>
<action id="Vcs.Diff.ShowDiffInNewWindow"
icon="AllIcons.Actions.MoveToWindow"