[Rider] Lift some of the common UI Rider/CLionNova logic to rdclient and the platform.

(So that the Rider/CLionNova thin clients could use it)

GitOrigin-RevId: 26802752ccf2a27fd66394c44373ba573ab7a19e
This commit is contained in:
Egor.Skrypnikov
2025-02-18 21:52:04 +01:00
committed by intellij-monorepo-bot
parent 6bf4b6f983
commit 042406f675
8 changed files with 167 additions and 0 deletions

View File

@@ -12,6 +12,8 @@
implementationClass="com.intellij.openapi.vcs.ex.LineStatusMakerEscEditorHandler"
id="LineStatusTrackerMarkerPopup"
order="before hide-hints"/>
<mergeableGutterIconRendererProvider implementation="com.intellij.diff.util.DiffGutterRendererMergeableRendererProvider" />
</extensions>
<applicationListeners>

View File

@@ -0,0 +1,41 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.diff.util;
import com.intellij.codeInsight.daemon.GutterMark;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.editor.GutterMarkWrapper;
import com.intellij.openapi.editor.ImportantNonMergeableGutterMark;
import com.intellij.openapi.editor.MergeableGutterIconRenderer;
import com.intellij.openapi.editor.MergeableGutterIconRendererProvider;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ApiStatus.Internal
public class DiffGutterRendererMergeableRendererProvider implements MergeableGutterIconRendererProvider {
public static class DiffMergeableGutterMarkRenderer extends GutterMarkWrapper<DiffGutterRenderer> implements ImportantNonMergeableGutterMark {
protected DiffMergeableGutterMarkRenderer(DiffGutterRenderer originalMark) {
super(originalMark);
}
@Override
public @Nullable AnAction getClickAction() { return originalMark.getClickAction(); }
@Override
public boolean equals(Object obj) { return obj instanceof DiffMergeableGutterMarkRenderer && originalMark.equals(((DiffMergeableGutterMarkRenderer)obj).originalMark); }
@Override
public int hashCode() { return System.identityHashCode(originalMark); }
@Override
public int getWeight() { return 0; }
}
@Override
public @Nullable MergeableGutterIconRenderer tryGetMergeableIconRenderer(@NotNull GutterMark mark) {
if (!(mark instanceof DiffGutterRenderer)) return null;
return new DiffMergeableGutterMarkRenderer((DiffGutterRenderer)mark);
}
}

View File

@@ -6,6 +6,8 @@
dynamic="true">
<with attribute="implementationClass" implements="com.intellij.openapi.fileTypes.SyntaxHighlighter"/>
</extensionPoint>
<extensionPoint qualifiedName="com.intellij.mergeableGutterIconRendererProvider" interface="com.intellij.openapi.editor.MergeableGutterIconRendererProvider" dynamic="true"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="com.intellij.ide.ui.UISettingsStateDefaultsProviderImpl"

View File

@@ -0,0 +1,39 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.editor;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.editor.markup.GutterDraggableObject;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@ApiStatus.Internal
public abstract class GutterMarkWrapper<T extends GutterIconRenderer> extends GutterIconRenderer implements MergeableGutterIconRenderer {
protected final T originalMark;
public T getOriginalMark() { return originalMark; }
protected GutterMarkWrapper(T originalMark) {
this.originalMark = originalMark;
}
@Override public @NotNull Icon getIcon() { return originalMark.getIcon(); }
@Override public @Nullable String getTooltipText() { return originalMark.getTooltipText(); }
@Override public @NotNull Alignment getAlignment() { return Alignment.LEFT; }
@Override public @NotNull String getAccessibleName() { return originalMark.getAccessibleName(); }
@Override public @Nullable String getAccessibleTooltipText() { return originalMark.getAccessibleTooltipText(); }
@Override public @Nullable GutterDraggableObject getDraggableObject() { return originalMark.getDraggableObject(); }
@Override public @Nullable AnAction getMiddleButtonClickAction() { return originalMark.getMiddleButtonClickAction(); }
@Override public @Nullable ActionGroup getPopupMenuActions() { return originalMark.getPopupMenuActions(); }
@Override public @Nullable AnAction getRightButtonClickAction() { return originalMark.getRightButtonClickAction(); }
@Override public boolean isNavigateAction() { return originalMark.isNavigateAction(); }
@Override public boolean isDumbAware() { return originalMark.isDumbAware(); }
@Override public @NotNull String toString() { return originalMark.toString(); }
@Override public abstract @Nullable AnAction getClickAction();
}

View File

@@ -0,0 +1,13 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.editor;
import com.intellij.codeInsight.daemon.GutterMark;
import org.jetbrains.annotations.ApiStatus;
/**
* This interface is used in some {@link GutterMarkPreprocessor} implementors (the ones that merge the gutter marks) to
* mark a gutter mark as a non-participant in the merge logic.
*/
@ApiStatus.Internal
public interface ImportantNonMergeableGutterMark extends GutterMark {
}

View File

@@ -0,0 +1,15 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.editor;
import com.intellij.codeInsight.daemon.GutterMark;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal
public interface MergeableGutterIconRenderer extends GutterMark, Comparable<MergeableGutterIconRenderer> {
int getWeight();
@Override
default int compareTo(MergeableGutterIconRenderer other) {
return -Integer.compare(this.getWeight(), other.getWeight());
}
}

View File

@@ -0,0 +1,38 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.editor;
import com.intellij.codeInsight.daemon.GutterMark;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Objects;
@ApiStatus.Internal
public abstract class MergeableGutterIconRendererExternalWrapper implements MergeableGutterIconRenderer {
private final GutterMark myOriginalMark;
public MergeableGutterIconRendererExternalWrapper(GutterMark originalMark) {
myOriginalMark = originalMark;
}
public GutterMark getOriginalMark() { return myOriginalMark; }
@Override
public @NotNull Icon getIcon() { return myOriginalMark.getIcon(); }
@Override
public @Nullable String getTooltipText() { return myOriginalMark.getTooltipText(); }
@Override
public boolean equals(@Nullable Object other) {
if (!(other instanceof MergeableGutterIconRendererExternalWrapper)) return false;
return Objects.equals(myOriginalMark, ((MergeableGutterIconRendererExternalWrapper)other).myOriginalMark);
}
@Override
public int hashCode() {
return Objects.hashCode(myOriginalMark);
}
}

View File

@@ -0,0 +1,17 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.editor;
import com.intellij.codeInsight.daemon.GutterMark;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
// This is a bit of a crutch inherited from the Forefathers. Please refer to RiderGutterMarksPreprocessor if you have questions.
@ApiStatus.Internal
public interface MergeableGutterIconRendererProvider {
ExtensionPointName<MergeableGutterIconRendererProvider> EP_NAME = ExtensionPointName.create("com.intellij.mergeableGutterIconRendererProvider");
@Nullable MergeableGutterIconRenderer tryGetMergeableIconRenderer(@NotNull GutterMark mark);
}