IDEA-164079 Caret painting attribute customization - converted to an explicit API
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 28 Nov 2016 12:26:28 +0000 (15:26 +0300)
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 28 Nov 2016 12:52:34 +0000 (15:52 +0300)
platform/editor-ui-api/src/com/intellij/openapi/editor/Caret.java
platform/editor-ui-api/src/com/intellij/openapi/editor/CaretVisualAttributes.java [moved from platform/editor-ui-api/src/com/intellij/openapi/editor/CaretAttributes.java with 64% similarity]
platform/lang-impl/src/com/intellij/injected/editor/InjectedCaret.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java
platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaret.java

index 8e85f25ca51a34c5c2a8612e8c7762a76783a350..c7729e9aeb8e256415303871ddc5a47842078e0b 100644 (file)
@@ -23,6 +23,8 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Represents a specific caret instance in the editor.
  * Provides methods to query and modify caret position and caret's associated selection.
+ * <p>
+ * Instances of this interface are supposed to be obtained from {@link CaretModel} instance, and not created explicitly.
  */
 public interface Caret extends UserDataHolderEx, Disposable {
   /**
@@ -313,4 +315,19 @@ public interface Caret extends UserDataHolderEx, Disposable {
    * ({@link LogicalPosition#leansForward} and {@link VisualPosition#leansRight}).
    */
   boolean isAtBidiRunBoundary();
+
+  /**
+   * Returns visual attributes currently set for the caret.
+   *
+   * @see #setVisualAttributes(CaretVisualAttributes)
+   */
+  @NotNull
+  CaretVisualAttributes getVisualAttributes();
+
+  /**
+   * Sets caret's current visual attributes. This can have no effect if editor doesn't support changing caret's visual appearance.
+   *
+   * @see #getVisualAttributes()
+   */
+  void setVisualAttributes(@NotNull CaretVisualAttributes attributes);
 }
similarity index 64%
rename from platform/editor-ui-api/src/com/intellij/openapi/editor/CaretAttributes.java
rename to platform/editor-ui-api/src/com/intellij/openapi/editor/CaretVisualAttributes.java
index 1a86bb64ed12bf593de450743c19dce7aa4d551f..a9bf19a579a667dc15f2c1a2bd07d9aff84b1fd9 100644 (file)
  */
 package com.intellij.openapi.editor;
 
-import com.intellij.openapi.util.Key;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.awt.*;
 
 /**
- * Used to override Caret Painting Color and for non-block carets their Width
+ * Used to override caret painting color and, for non-block carets, their width.
  */
-final public class CaretAttributes {
-  final public static Key<CaretAttributes> KEY = new Key<>("CaretAttributes");
-  final public static CaretAttributes NULL = new CaretAttributes(null, Weight.NORMAL);
+public final class CaretVisualAttributes {
+  public static final CaretVisualAttributes DEFAULT = new CaretVisualAttributes(null, Weight.NORMAL);
 
-  public enum Weight {
-    THIN(-1),
-    NORMAL(0),
-    HEAVY(1);
-
-    final private int delta;
-    
-    Weight(int delta) {
-      this.delta = delta;
-    }
-
-    public int getDelta() {
-      return delta;
-    }
-  }
-  
-  final private @Nullable Color myColor;
-  final private Weight myWeight ;
+  @Nullable
+  private final Color myColor;
+  @NotNull
+  private final Weight myWeight;
 
-  public CaretAttributes(@Nullable Color color, Weight weight) {
+  public CaretVisualAttributes(@Nullable Color color, @NotNull Weight weight) {
     myColor = color;
     myWeight = weight;
   }
@@ -56,11 +41,28 @@ final public class CaretAttributes {
     return myColor;
   }
 
+  @NotNull
   public Weight getWeight() {
     return myWeight;
   }
-  
-  public int getWidth(int width) {
-    return width + myWeight.delta < 1 ? 1 : width +myWeight.delta;
+
+  public int getWidth(int defaultWidth) {
+    return Math.max(1, defaultWidth + myWeight.delta);
+  }
+
+  public enum Weight {
+    THIN(-1),
+    NORMAL(0),
+    HEAVY(1);
+
+    private final int delta;
+
+    Weight(int delta) {
+      this.delta = delta;
+    }
+
+    public int getDelta() {
+      return delta;
+    }
   }
 }
index 50c32fc467bd42f4a12d482c41b0af48d5bb0117..e76c1470eb71652605ce9c16673cdd3cde9783ff 100644 (file)
@@ -247,4 +247,15 @@ public class InjectedCaret implements Caret {
   public boolean isAtBidiRunBoundary() {
     return myDelegate.isAtBidiRunBoundary();
   }
+
+  @NotNull
+  @Override
+  public CaretVisualAttributes getVisualAttributes() {
+    return myDelegate.getVisualAttributes();
+  }
+
+  @Override
+  public void setVisualAttributes(@NotNull CaretVisualAttributes attributes) {
+    myDelegate.setVisualAttributes(attributes);
+  }
 }
index 4cb50d3f09495de1e98fda35af6904883bcbd997..65472e3efe23515333d0e1580bf049265b3958f5 100644 (file)
@@ -34,6 +34,7 @@ import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
 import com.intellij.openapi.editor.impl.softwrap.SoftWrapHelper;
 import com.intellij.openapi.ide.CopyPasteManager;
 import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.UserDataHolderBase;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.DocumentUtil;
@@ -51,6 +52,7 @@ import java.util.List;
 
 public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.impl.CaretImpl");
+  private static final Key<CaretVisualAttributes> VISUAL_ATTRIBUTES_KEY = new Key<>("CaretAttributes");
 
   private final EditorImpl myEditor;
   private boolean isValid = true;
@@ -1399,6 +1401,18 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
 
   @NotNull
   @Override
+  public CaretVisualAttributes getVisualAttributes() {
+    CaretVisualAttributes attrs = getUserData(VISUAL_ATTRIBUTES_KEY);
+    return attrs == null ? CaretVisualAttributes.DEFAULT : attrs;
+  }
+
+  @Override
+  public void setVisualAttributes(@NotNull CaretVisualAttributes attributes) {
+    putUserData(VISUAL_ATTRIBUTES_KEY, attributes == CaretVisualAttributes.DEFAULT ? null : attributes);
+  }
+
+  @NotNull
+  @Override
   public String dumpState() {
     return "{valid: " + isValid +
            ", update counter: " + myDocumentUpdateCounter +
index 19b8e74e244393438d20daea42d667de337dd543..7b1e849afa317a745e06346a8aafe15f5e5604f7 100644 (file)
@@ -811,8 +811,7 @@ class EditorPainter implements TextDrawingCallback {
       int x = location.myPoint.x;
       int y = location.myPoint.y - topOverhang;
       Caret caret = location.myCaret;
-      CaretAttributes attr = caret == null ? null : caret.getUserData(CaretAttributes.KEY);
-      if (attr == null) attr = CaretAttributes.NULL;
+      CaretVisualAttributes attr = caret == null ? CaretVisualAttributes.DEFAULT : caret.getVisualAttributes();
       g.setColor(attr.getColor() != null ? attr.getColor() : caretColor);
       boolean isRtl = location.myIsRtl;
       if (myEditor.isInsertMode() != settings.isBlockCursor()) {
index f63c53dbf2702181cd006123a377b80c34678592..4ac79932af2895dbe13d1fe4f7556087882026f8 100644 (file)
@@ -208,6 +208,16 @@ public class TextComponentCaret extends UserDataHolderBase implements Caret {
     return false;
   }
 
+  @NotNull
+  @Override
+  public CaretVisualAttributes getVisualAttributes() {
+    return CaretVisualAttributes.DEFAULT;
+  }
+
+  @Override
+  public void setVisualAttributes(@NotNull CaretVisualAttributes attributes) {
+  }
+
   private SelectionModel getSelectionModel() {
     return myEditor.getSelectionModel();
   }