blob: f56cf7ee36c1ee20112bb628787c4a5d7c198a79 [file] [log] [blame]
/*
* 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 GRAYED_ITALIC_ATTRIBUTES = new SimpleTextAttributes(STYLE_ITALIC, 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);
}
}