summaryrefslogtreecommitdiff
path: root/platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java')
-rw-r--r--platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java278
1 files changed, 278 insertions, 0 deletions
diff --git a/platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java b/platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java
new file mode 100644
index 000000000000..6046a0ec108c
--- /dev/null
+++ b/platform/core-api/src/com/intellij/ui/SimpleTextAttributes.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ui;
+
+import com.intellij.openapi.editor.markup.EffectType;
+import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.util.ui.UIUtil;
+import org.intellij.lang.annotations.JdkConstants;
+import org.intellij.lang.annotations.MagicConstant;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.*;
+
+/**
+ * @author Vladimir Kondratyev
+ */
+@SuppressWarnings({"PointlessBitwiseExpression"})
+public final class SimpleTextAttributes {
+
+ @MagicConstant(flags = {STYLE_PLAIN, STYLE_BOLD, STYLE_ITALIC, STYLE_STRIKEOUT, STYLE_WAVED, STYLE_UNDERLINE, STYLE_BOLD_DOTTED_LINE, STYLE_SEARCH_MATCH, STYLE_SMALLER, STYLE_OPAQUE})
+ public @interface StyleAttributeConstant { }
+
+ public static final int STYLE_PLAIN = Font.PLAIN;
+ public static final int STYLE_BOLD = Font.BOLD;
+ public static final int STYLE_ITALIC = Font.ITALIC;
+ public static final int FONT_MASK = STYLE_PLAIN | STYLE_BOLD | STYLE_ITALIC;
+ public static final int STYLE_STRIKEOUT = STYLE_ITALIC << 1;
+ public static final int STYLE_WAVED = STYLE_STRIKEOUT << 1;
+ public static final int STYLE_UNDERLINE = STYLE_WAVED << 1;
+ public static final int STYLE_BOLD_DOTTED_LINE = STYLE_UNDERLINE << 1;
+ public static final int STYLE_SEARCH_MATCH = STYLE_BOLD_DOTTED_LINE << 1;
+ public static final int STYLE_SMALLER = STYLE_SEARCH_MATCH << 1;
+ public static final int STYLE_OPAQUE = STYLE_SMALLER << 1;
+
+ public static final SimpleTextAttributes REGULAR_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, null);
+ public static final SimpleTextAttributes REGULAR_BOLD_ATTRIBUTES = new SimpleTextAttributes(STYLE_BOLD, null);
+ public static final SimpleTextAttributes REGULAR_ITALIC_ATTRIBUTES = new SimpleTextAttributes(STYLE_ITALIC, null);
+ public static final SimpleTextAttributes ERROR_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, JBColor.red);
+
+ public static final SimpleTextAttributes GRAYED_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, UIUtil.getInactiveTextColor());
+ public static final SimpleTextAttributes GRAYED_BOLD_ATTRIBUTES = new SimpleTextAttributes(STYLE_BOLD, UIUtil.getInactiveTextColor());
+
+ public static final SimpleTextAttributes SYNTHETIC_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, JBColor.blue);
+ public static final SimpleTextAttributes GRAY_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, Color.GRAY);
+ public static final SimpleTextAttributes GRAY_ITALIC_ATTRIBUTES = new SimpleTextAttributes(STYLE_ITALIC, Color.GRAY);
+ public static final SimpleTextAttributes DARK_TEXT = new SimpleTextAttributes(STYLE_PLAIN, new Color(112, 112, 164));
+ public static final SimpleTextAttributes SIMPLE_CELL_ATTRIBUTES = new SimpleTextAttributes(STYLE_PLAIN, new JBColor(Gray._0, Gray._187));
+ public static final SimpleTextAttributes SELECTED_SIMPLE_CELL_ATTRIBUTES =
+ new SimpleTextAttributes(STYLE_PLAIN, UIUtil.getListSelectionForeground());
+ public static final SimpleTextAttributes EXCLUDED_ATTRIBUTES = new SimpleTextAttributes(STYLE_ITALIC, Color.GRAY);
+
+ public static final SimpleTextAttributes LINK_ATTRIBUTES = new SimpleTextAttributes(STYLE_UNDERLINE, JBColor.blue);
+ public static final SimpleTextAttributes LINK_BOLD_ATTRIBUTES = new SimpleTextAttributes(STYLE_UNDERLINE | STYLE_BOLD, JBColor.blue);
+
+ private final Color myBgColor;
+ private final Color myFgColor;
+ private final Color myWaveColor;
+ @StyleAttributeConstant
+ private final int myStyle;
+
+ /**
+ * @param style style of the text fragment. 5
+ * @param fgColor color of the text fragment. <code>color</code> can be
+ * <code>null</code>. In that case <code>SimpleColoredComponent</code> will
+ * use its foreground to paint the text fragment.
+ */
+ public SimpleTextAttributes(@StyleAttributeConstant int style, Color fgColor) {
+ this(style, fgColor, null);
+ }
+
+ public SimpleTextAttributes(@StyleAttributeConstant int style, Color fgColor, @Nullable Color waveColor) {
+ this(null, fgColor, waveColor, style);
+ }
+
+ public SimpleTextAttributes(@Nullable final Color bgColor, final Color fgColor, @Nullable final Color waveColor, @StyleAttributeConstant int style) {
+ if ((~(STYLE_PLAIN |
+ STYLE_BOLD |
+ STYLE_ITALIC |
+ STYLE_STRIKEOUT |
+ STYLE_WAVED |
+ STYLE_UNDERLINE |
+ STYLE_BOLD_DOTTED_LINE |
+ STYLE_SEARCH_MATCH |
+ STYLE_SMALLER |
+ STYLE_OPAQUE) & style) != 0) {
+ throw new IllegalArgumentException("Wrong style: " + style);
+ }
+
+ myBgColor = bgColor;
+ myFgColor = fgColor;
+ myWaveColor = waveColor;
+ myStyle = style;
+ }
+
+ /**
+ * @return foreground color
+ */
+ public Color getFgColor() {
+ return myFgColor;
+ }
+
+
+ /**
+ * @return background color
+ */
+ @Nullable
+ public Color getBgColor() {
+ return myBgColor;
+ }
+
+ /**
+ * @return wave color. The method can return <code>null</code>. <code>null</code>
+ * means that color of wave is the same as foreground color.
+ */
+ @Nullable
+ public Color getWaveColor() {
+ return myWaveColor;
+ }
+
+ @StyleAttributeConstant
+ public int getStyle() {
+ return myStyle;
+ }
+
+ /**
+ * @return whether text is struck out or not
+ */
+ public boolean isStrikeout() {
+ return (myStyle & STYLE_STRIKEOUT) != 0;
+ }
+
+ /**
+ * @return whether text is waved or not
+ */
+ public boolean isWaved() {
+ return (myStyle & STYLE_WAVED) != 0;
+ }
+
+ public boolean isUnderline() {
+ return (myStyle & STYLE_UNDERLINE) != 0;
+ }
+
+ public boolean isBoldDottedLine() {
+ return (myStyle & STYLE_BOLD_DOTTED_LINE) != 0;
+ }
+
+ public boolean isSearchMatch() {
+ return (myStyle & STYLE_SEARCH_MATCH) != 0;
+ }
+
+ public boolean isSmaller() {
+ return (myStyle & STYLE_SMALLER) != 0;
+ }
+
+ public boolean isOpaque() {
+ return (myStyle & STYLE_OPAQUE) != 0;
+ }
+
+ @NotNull
+ public static SimpleTextAttributes fromTextAttributes(TextAttributes attributes) {
+ if (attributes == null) return REGULAR_ATTRIBUTES;
+
+ Color foregroundColor = attributes.getForegroundColor();
+ if (foregroundColor == null) foregroundColor = REGULAR_ATTRIBUTES.getFgColor();
+
+ int style = attributes.getFontType();
+ if (attributes.getEffectColor() != null) {
+ EffectType effectType = attributes.getEffectType();
+ if (effectType == EffectType.STRIKEOUT) {
+ style |= STYLE_STRIKEOUT;
+ }
+ else if (effectType == EffectType.WAVE_UNDERSCORE) {
+ style |= STYLE_WAVED;
+ }
+ else if (effectType == EffectType.LINE_UNDERSCORE ||
+ effectType == EffectType.BOLD_LINE_UNDERSCORE ||
+ effectType == EffectType.BOLD_DOTTED_LINE) {
+ style |= STYLE_UNDERLINE;
+ }
+ else if (effectType == EffectType.SEARCH_MATCH) {
+ style |= STYLE_SEARCH_MATCH;
+ }
+ else {
+ // not supported
+ }
+ }
+ return new SimpleTextAttributes(attributes.getBackgroundColor(), foregroundColor, attributes.getEffectColor(), style);
+ }
+
+ @JdkConstants.FontStyle
+ public int getFontStyle() {
+ return myStyle & FONT_MASK;
+ }
+
+ public TextAttributes toTextAttributes() {
+ Color effectColor;
+ EffectType effectType;
+ if (isWaved()) {
+ effectColor = myWaveColor;
+ effectType = EffectType.WAVE_UNDERSCORE;
+ }
+ else if (isStrikeout()) {
+ effectColor = myWaveColor;
+ effectType = EffectType.STRIKEOUT;
+ }
+ else if (isUnderline()) {
+ effectColor = myWaveColor;
+ effectType = EffectType.LINE_UNDERSCORE;
+ }
+ else if (isBoldDottedLine()) {
+ effectColor = myWaveColor;
+ effectType = EffectType.BOLD_DOTTED_LINE;
+ }
+ else if (isSearchMatch()) {
+ effectColor = myWaveColor;
+ effectType = EffectType.SEARCH_MATCH;
+ }
+ else {
+ effectColor = null;
+ effectType = null;
+ }
+ return new TextAttributes(myFgColor, null, effectColor, effectType, myStyle & FONT_MASK);
+ }
+
+ public SimpleTextAttributes derive(@StyleAttributeConstant int style, @Nullable Color fg, @Nullable Color bg, @Nullable Color wave) {
+ return new SimpleTextAttributes(bg != null ? bg : getBgColor(), fg != null ? fg : getFgColor(), wave != null ? wave : getWaveColor(),
+ style == -1 ? getStyle() : style);
+ }
+
+ // take what differs from REGULAR
+ public static SimpleTextAttributes merge(final SimpleTextAttributes weak, final SimpleTextAttributes strong) {
+ final int style;
+ if (strong.getStyle() != REGULAR_ATTRIBUTES.getStyle()) {
+ style = strong.getStyle();
+ }
+ else {
+ style = weak.getStyle();
+ }
+ final Color wave;
+ if (!Comparing.equal(strong.getWaveColor(), REGULAR_ATTRIBUTES.getWaveColor())) {
+ wave = strong.getWaveColor();
+ }
+ else {
+ wave = weak.getWaveColor();
+ }
+ final Color fg;
+ if (!Comparing.equal(strong.getFgColor(), REGULAR_ATTRIBUTES.getFgColor())) {
+ fg = strong.getFgColor();
+ }
+ else {
+ fg = weak.getFgColor();
+ }
+ final Color bg;
+ if (!Comparing.equal(strong.getBgColor(), REGULAR_ATTRIBUTES.getBgColor())) {
+ bg = strong.getBgColor();
+ }
+ else {
+ bg = weak.getBgColor();
+ }
+
+ return new SimpleTextAttributes(bg, fg, wave, style);
+ }
+}