blob: 58c6a8bae0d2a43c18a533d7b16d88b708ad212e [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.ide.ui.laf.darcula.ui;
import com.intellij.ide.ui.laf.darcula.DarculaUIUtil;
import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.ui.Gray;
import com.intellij.util.ui.EmptyIcon;
import com.intellij.util.ui.UIUtil;
import sun.swing.SwingUtilities2;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.IconUIResource;
import javax.swing.plaf.basic.BasicHTML;
import javax.swing.plaf.metal.MetalCheckBoxUI;
import javax.swing.text.View;
import java.awt.*;
/**
* @author Konstantin Bulenkov
*/
public class DarculaCheckBoxUI extends MetalCheckBoxUI {
@SuppressWarnings("MethodOverridesStaticMethodOfSuperclass")
public static ComponentUI createUI(JComponent c) {
if (UIUtil.getParentOfType(CellRendererPane.class, c) != null) {
c.setBorder(null);
}
return new DarculaCheckBoxUI();
}
@Override
public synchronized void paint(Graphics g2d, JComponent c) {
Graphics2D g = (Graphics2D)g2d;
JCheckBox b = (JCheckBox) c;
final ButtonModel model = b.getModel();
final Dimension size = c.getSize();
final Font font = c.getFont();
g.setFont(font);
FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, font);
Rectangle viewRect = new Rectangle(size);
Rectangle iconRect = new Rectangle();
Rectangle textRect = new Rectangle();
Insets i = c.getInsets();
viewRect.x += i.left;
viewRect.y += i.top;
viewRect.width -= (i.right + viewRect.x);
viewRect.height -= (i.bottom + viewRect.y);
String text = SwingUtilities.layoutCompoundLabel(c, fm, b.getText(), getDefaultIcon(),
b.getVerticalAlignment(), b.getHorizontalAlignment(),
b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
viewRect, iconRect, textRect, b.getIconTextGap());
//background
if (c.isOpaque()) {
g.setColor(b.getBackground());
g.fillRect(0, 0, size.width, size.height);
}
final boolean selected = b.isSelected();
final boolean enabled = b.isEnabled();
if (selected && b.getSelectedIcon() != null) {
b.getSelectedIcon().paintIcon(b, g, iconRect.x + 4, iconRect.y + 2);
} else if (!selected && b.getIcon() != null) {
b.getIcon().paintIcon(b, g, iconRect.x + 4, iconRect.y + 2);
} else {
final int x = iconRect.x + 3;
final int y = iconRect.y + 3;
final int w = iconRect.width - 6;
final int h = iconRect.height - 6;
g.translate(x, y);
final Paint paint = UIUtil.getGradientPaint(w / 2, 0, b.getBackground().brighter(),
w / 2, h, b.getBackground());
g.setPaint(paint);
g.fillRect(1, 1, w - 2, h - 2);
//setup AA for lines
final GraphicsConfig config = new GraphicsConfig(g);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
final boolean armed = b.getModel().isArmed();
if (c.hasFocus()) {
g.setPaint(UIUtil.getGradientPaint(w/2, 1, getFocusedBackgroundColor1(armed, selected), w/2, h, getFocusedBackgroundColor2(armed, selected)));
g.fillRoundRect(0, 0, w, h, 4, 4);
DarculaUIUtil.paintFocusRing(g, 1, 1, w - 2, h - 2);
} else {
g.setPaint(UIUtil.getGradientPaint(w / 2, 1, getBackgroundColor1(enabled, selected), w / 2, h, getBackgroundColor2(enabled,
selected)));
g.fillRoundRect(0, 0, w, h , 4, 4);
final Color borderColor1 = getBorderColor1(enabled, selected);
final Color borderColor2 = getBorderColor2(enabled, selected);
g.setPaint(UIUtil.getGradientPaint(w / 2, 1, borderColor1, w / 2, h, borderColor2));
g.drawRoundRect(0, (UIUtil.isUnderDarcula() ? 1 : 0), w, h - 1, 4, 4);
g.setPaint(getInactiveFillColor());
g.drawRoundRect(0, 0, w, h - 1, 4, 4);
}
if (b.getModel().isSelected()) {
paintCheckSign(g, enabled, w, h);
}
g.translate(-x, -y);
config.restore();
}
//text
if(text != null) {
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
if (view != null) {
view.paint(g, textRect);
} else {
g.setColor(model.isEnabled() ? b.getForeground() : getDisabledTextColor());
SwingUtilities2.drawStringUnderlineCharAt(c, g, text,
b.getDisplayedMnemonicIndex(),
textRect.x,
textRect.y + fm.getAscent());
}
}
}
protected void paintCheckSign(Graphics2D g, boolean enabled, int w, int h) {
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g.setStroke(new BasicStroke(1 *2.0f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
g.setPaint(getShadowColor(enabled, true));
g.drawLine(4, 7, 7, 11);
g.drawLine(7, 11, w, 2);
g.setPaint(getCheckSignColor(enabled, true));
g.drawLine(4, 5, 7, 9);
g.drawLine(7, 9, w, 0);
}
protected Color getInactiveFillColor() {
return getColor("inactiveFillColor", Gray._40.withAlpha(180));
}
protected Color getBorderColor1(boolean enabled, boolean selected) {
return enabled ? getColor("borderColor1", Gray._120.withAlpha(0x5a), selected)
: getColor("disabledBorderColor1", Gray._120.withAlpha(90), selected);
}
protected Color getBorderColor2(boolean enabled, boolean selected) {
return enabled ? getColor("borderColor2", Gray._105.withAlpha(90), selected)
: getColor("disabledBorderColor2", Gray._105.withAlpha(90), selected);
}
protected Color getBackgroundColor1(boolean enabled, boolean selected) {
return getColor("backgroundColor1", Gray._110, selected);
}
protected Color getBackgroundColor2(boolean enabled, boolean selected) {
return getColor("backgroundColor2", Gray._95, selected);
}
protected Color getCheckSignColor(boolean enabled, boolean selected) {
return enabled ? getColor("checkSignColor", Gray._170, selected)
: getColor("checkSignColorDisabled", Gray._120, selected);
}
protected Color getShadowColor(boolean enabled, boolean selected) {
return enabled ? getColor("shadowColor", Gray._30, selected)
: getColor("shadowColorDisabled", Gray._60, selected);
}
protected Color getFocusedBackgroundColor1(boolean armed, boolean selected) {
return armed ? getColor("focusedArmed.backgroundColor1", Gray._100, selected)
: getColor("focused.backgroundColor1", Gray._120, selected);
}
protected Color getFocusedBackgroundColor2(boolean armed, boolean selected) {
return armed ? getColor("focusedArmed.backgroundColor2", Gray._55, selected)
: getColor("focused.backgroundColor2", Gray._75, selected);
}
protected static Color getColor(String shortPropertyName, Color defaultValue) {
final Color color = UIManager.getColor("CheckBox.darcula." + shortPropertyName);
return color == null ? defaultValue : color;
}
protected static Color getColor(String shortPropertyName, Color defaultValue, boolean selected) {
if (selected) {
final Color color = getColor(shortPropertyName + ".selected", null);
if (color != null) {
return color;
}
}
return getColor(shortPropertyName, defaultValue);
}
@Override
public Icon getDefaultIcon() {
return new IconUIResource(EmptyIcon.create(20));
}
}