IDEA-39879 Background color and gutter stripe color for bookmarks should be configurable idea/138.427
authorVassiliy <vassiliy.kudryashov@jetbrains.com>
Mon, 2 Jun 2014 12:30:24 +0000 (16:30 +0400)
committerVassiliy <vassiliy.kudryashov@jetbrains.com>
Mon, 2 Jun 2014 12:30:58 +0000 (16:30 +0400)
platform/core-api/src/com/intellij/openapi/editor/colors/CodeInsightColors.java
platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java
platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java
platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkManager.java
platform/lang-impl/src/com/intellij/openapi/options/colors/pages/GeneralColorsPage.java
platform/platform-resources-en/src/messages/OptionsBundle.properties
platform/platform-resources/src/DefaultColorSchemesManager.xml

index ede02461408d7e36be8c67f16907777266bd6b94..3bcc0f002b1533fc14568d7176aed8165479a009 100644 (file)
@@ -65,6 +65,7 @@ public interface CodeInsightColors {
   TextAttributesKey FOLLOWED_HYPERLINK_ATTRIBUTES = TextAttributesKey.createTextAttributesKey("FOLLOWED_HYPERLINK_ATTRIBUTES");
 
   TextAttributesKey TODO_DEFAULT_ATTRIBUTES = TextAttributesKey.createTextAttributesKey("TODO_DEFAULT_ATTRIBUTES");
+  TextAttributesKey BOOKMARKS_ATTRIBUTES = TextAttributesKey.createTextAttributesKey("BOOKMARKS_ATTRIBUTES");
 
 // Colors
   ColorKey METHOD_SEPARATORS_COLOR = ColorKey.createColorKey("METHOD_SEPARATORS_COLOR");
index 7a2bc3aa8655be54ea24d5ab5514d7adfb847df4..5e3017206132ed26bcb5b9f3a89d66d35bd3be54 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.application.options.OptionsContainingConfigurable;
 import com.intellij.application.options.editor.EditorOptionsProvider;
 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
 import com.intellij.execution.impl.ConsoleViewUtil;
+import com.intellij.ide.bookmarks.BookmarkManager;
 import com.intellij.ide.todo.TodoConfiguration;
 import com.intellij.ide.ui.LafManager;
 import com.intellij.ide.ui.laf.darcula.DarculaInstaller;
@@ -275,6 +276,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract
     for (Project openProject : openProjects) {
       FileStatusManager.getInstance(openProject).fileStatusesChanged();
       DaemonCodeAnalyzer.getInstance(openProject).restart();
+      BookmarkManager.getInstance(openProject).colorsChanged();
     }
   }
 
index 9a42f3cffb318063c8ae7b1be5eae413e5daac65..e6cd53e811f83df93407764b0b65b5fd4ef564b6 100644 (file)
@@ -26,16 +26,20 @@ import com.intellij.navigation.ItemPresentation;
 import com.intellij.navigation.NavigationItem;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.RangeMarker;
+import com.intellij.openapi.editor.colors.CodeInsightColors;
+import com.intellij.openapi.editor.colors.EditorColorsManager;
 import com.intellij.openapi.editor.ex.MarkupModelEx;
 import com.intellij.openapi.editor.ex.RangeHighlighterEx;
 import com.intellij.openapi.editor.impl.DocumentMarkupModel;
 import com.intellij.openapi.editor.markup.GutterIconRenderer;
 import com.intellij.openapi.editor.markup.HighlighterLayer;
 import com.intellij.openapi.editor.markup.RangeHighlighter;
+import com.intellij.openapi.editor.markup.TextAttributes;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.pom.Navigatable;
@@ -43,7 +47,6 @@ import com.intellij.psi.PsiDocumentManager;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.PsiManager;
 import com.intellij.ui.JBColor;
-import com.intellij.ui.LightColors;
 import com.intellij.util.PlatformIcons;
 import com.intellij.util.Processor;
 import org.jetbrains.annotations.NotNull;
@@ -53,7 +56,8 @@ import javax.swing.*;
 import java.awt.*;
 
 public class Bookmark implements Navigatable {
-  public static final Icon DEFAULT_ICON = PlatformIcons.CHECK_ICON;
+  private static final JBColor ICON_BACKGROUND_COLOR = new JBColor(new Color(0xffffcc), new Color(0x675133));
+  public static final Icon DEFAULT_ICON = new MyDefaultIcon();
 
   private final VirtualFile myFile;
   @NotNull private final OpenFileDescriptor myTarget;
@@ -70,6 +74,15 @@ public class Bookmark implements Navigatable {
 
     myTarget = new OpenFileDescriptor(project, file, line, -1, true);
 
+    addHighlighter();
+  }
+
+  public void updateHighlighter() {
+    release();
+    addHighlighter();
+  }
+
+  private void addHighlighter() {
     Document document = FileDocumentManager.getInstance().getCachedDocument(getFile());
     if (document != null) {
       createHighlighter((MarkupModelEx)DocumentMarkupModel.forDocument(document, myProject, true));
@@ -77,15 +90,27 @@ public class Bookmark implements Navigatable {
   }
 
   public RangeHighlighter createHighlighter(@NotNull MarkupModelEx markup) {
-    final RangeHighlighter myHighlighter;
+    final RangeHighlighterEx myHighlighter;
     int line = getLine();
     if (line >= 0) {
       myHighlighter = markup.addPersistentLineHighlighter(line, HighlighterLayer.ERROR + 1, null);
       if (myHighlighter != null) {
         myHighlighter.setGutterIconRenderer(new MyGutterIconRenderer(this));
 
-        myHighlighter.setErrorStripeMarkColor(Color.black);
+        TextAttributes textAttributes =
+          EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.BOOKMARKS_ATTRIBUTES);
+
+        Color stripeColor = textAttributes.getErrorStripeColor();
+        myHighlighter.setErrorStripeMarkColor(stripeColor != null ? stripeColor : Color.black);
         myHighlighter.setErrorStripeTooltip(getBookmarkTooltip());
+
+        TextAttributes attributes = myHighlighter.getTextAttributes();
+        if (attributes == null) {
+          attributes = new TextAttributes();
+        }
+        attributes.setBackgroundColor(textAttributes.getBackgroundColor());
+        attributes.setForegroundColor(textAttributes.getForegroundColor());
+        myHighlighter.setTextAttributes(attributes);
       }
     }
     else {
@@ -111,19 +136,19 @@ public class Bookmark implements Navigatable {
     final int startOffset = markupDocument.getLineStartOffset(line);
     final int endOffset = markupDocument.getLineEndOffset(line);
 
-    final RangeHighlighterEx[] found = new RangeHighlighterEx[1];
+    final Ref<RangeHighlighterEx> found = new Ref<RangeHighlighterEx>();
     markup.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor<RangeHighlighterEx>() {
       @Override
       public boolean process(RangeHighlighterEx highlighter) {
         GutterMark renderer = highlighter.getGutterIconRenderer();
         if (renderer instanceof MyGutterIconRenderer && ((MyGutterIconRenderer)renderer).myBookmark == Bookmark.this) {
-          found[0] = highlighter;
+          found.set(highlighter);
           return false;
         }
         return true;
       }
     });
-    if (found[0] != null) found[0].dispose();
+    if (!found.isNull()) found.get().dispose();
   }
 
   public Icon getIcon() {
@@ -265,18 +290,17 @@ public class Bookmark implements Navigatable {
 
     @Override
     public void paintIcon(Component c, Graphics g, int x, int y) {
-      x++;
-      g.setColor(new JBColor(LightColors.YELLOW, new Color(103, 81, 51)));
-      g.fillRect(x, y, getIconWidth() - 2, getIconHeight());
+      g.setColor(ICON_BACKGROUND_COLOR);
+      g.fillRect(x, y, getIconWidth(), getIconHeight());
 
       g.setColor(JBColor.GRAY);
-      g.drawRect(x, y, getIconWidth() - 2, getIconHeight());
+      g.drawRect(x, y, getIconWidth(), getIconHeight());
 
       g.setColor(JBColor.foreground());
       final Font oldFont = g.getFont();
       g.setFont(MNEMONIC_FONT);
 
-      g.drawString(Character.toString(myMnemonic), x + 2, y + getIconHeight() - 2);
+      ((Graphics2D)g).drawString(Character.toString(myMnemonic), x + 3, y + getIconHeight() - 1.5F);
       g.setFont(oldFont);
     }
 
@@ -306,6 +330,29 @@ public class Bookmark implements Navigatable {
     }
   }
 
+  private static class MyDefaultIcon implements Icon {
+    private static final Icon myIcon = PlatformIcons.CHECK_ICON;
+
+    @Override
+    public void paintIcon(Component c, Graphics g, int x, int y) {
+      g.setColor(ICON_BACKGROUND_COLOR);
+      g.fillRect(x, y, getIconWidth(), getIconHeight());
+      g.setColor(JBColor.GRAY);
+      g.drawRect(x, y, getIconWidth(), getIconHeight());
+      myIcon.paintIcon(c, g, x, y);
+    }
+
+    @Override
+    public int getIconWidth() {
+      return myIcon.getIconWidth();
+    }
+
+    @Override
+    public int getIconHeight() {
+      return myIcon.getIconHeight();
+    }
+  }
+
   private static class MyGutterIconRenderer extends GutterIconRenderer {
     private final Bookmark myBookmark;
 
index 43013637defcca48f957c0ef8621022833f3823a..99532035d64c28ecedd550227a6e1d161d0f3d99 100644 (file)
@@ -409,6 +409,12 @@ public class BookmarkManager extends AbstractProjectComponent implements Persist
     myBus.syncPublisher(BookmarksListener.TOPIC).bookmarkChanged(bookmark);
   }
 
+  public void colorsChanged() {
+    for (Bookmark bookmark : myBookmarks) {
+      bookmark.updateHighlighter();
+    }
+  }
+
 
   private class MyEditorMouseListener extends EditorMouseAdapter {
     @Override
index 5db72dc8b52897038e44f92c3c0da289784ffba5..18b02d03f9be141c14439cedb35f6e286c0c7da8 100644 (file)
@@ -91,6 +91,7 @@ public class GeneralColorsPage implements ColorSettingsPage, InspectionColorSett
     new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.unmatched.brace"), CodeInsightColors.UNMATCHED_BRACE_ATTRIBUTES),
 
     new AttributesDescriptor(OptionsBundle.message("options.general.color.descriptor.todo.defaults"), CodeInsightColors.TODO_DEFAULT_ATTRIBUTES),
+    new AttributesDescriptor(OptionsBundle.message("options.general.color.descriptor.bookmarks"), CodeInsightColors.BOOKMARKS_ATTRIBUTES),
 
     new AttributesDescriptor(OptionsBundle.message("options.java.color.descriptor.full.coverage"), CodeInsightColors.LINE_FULL_COVERAGE),
     new AttributesDescriptor(OptionsBundle.message("options.java.color.descriptor.partial.coverage"),
index 364c5b48fe3330ff47d3bbe8d629c90f7d9fa9e6..b1c60ece98960f71f8fabed0f1479f4536f9f647 100644 (file)
@@ -140,6 +140,7 @@ options.general.color.descriptor.hyperlink.new=Hyperlink
 options.general.color.descriptor.hyperlink.followed=Followed hyperlink
 options.general.color.descriptor.reference.hyperlink=Reference hyperlink
 options.general.color.descriptor.todo.defaults=TODO defaults
+options.general.color.descriptor.bookmarks=Bookmarks
 options.general.color.soft.wrap.sign=Soft wrap sign
 
 
index 91fcf5464eb08d34329170c7bf0b285ca2cd2171..e0737bb3195d9fef1ce57bbde6d645902fb6817d 100644 (file)
           <option name="EFFECT_TYPE" value="0" />
           <option name="ERROR_STRIPE_COLOR" value="ff" />
         </value>
+      </option>
+      <option name="BOOKMARKS_ATTRIBUTES">
+        <value>
+          <option name="ERROR_STRIPE_COLOR" value="0" />
+        </value>
       </option>
         <option name="CONSOLE_BLACK_OUTPUT">
           <value>