blob: ec1145b8c5b00ac061b749aada1aee80320790a3 [file] [log] [blame]
package com.intellij.ui.components;
import com.intellij.ui.AnchorableComponent;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.plaf.ButtonUI;
import javax.swing.plaf.basic.BasicRadioButtonUI;
import java.awt.*;
/**
* @author evgeny.zakrevsky
*/
public class JBCheckBox extends JCheckBox implements AnchorableComponent {
private JComponent myAnchor;
public JBCheckBox() {
this(null);
}
public JBCheckBox(@Nullable String text) {
this(text, false);
}
public JBCheckBox(@Nullable String text, boolean selected) {
super(text, null, selected);
}
@Override
public JComponent getAnchor() {
return myAnchor;
}
@Override
public void setAnchor(@Nullable JComponent anchor) {
this.myAnchor = anchor;
}
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
if (myAnchor != null && myAnchor != this) {
Dimension anchorSize = myAnchor.getPreferredSize();
size.width = Math.max(size.width, anchorSize.width);
size.height = Math.max(size.height, anchorSize.height);
}
return size;
}
@Override
public Dimension getMinimumSize() {
Dimension size = super.getMinimumSize();
if (myAnchor != null && myAnchor != this) {
Dimension anchorSize = myAnchor.getMinimumSize();
size.width = Math.max(size.width, anchorSize.width);
size.height = Math.max(size.height, anchorSize.height);
}
return size;
}
/**
* Sets given icon to display between checkbox icon and text.
*
* @return true in case of success and false otherwise
*/
public boolean setTextIcon(@NotNull Icon icon) {
if (UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) {
return false;
}
ButtonUI ui = getUI();
if (ui instanceof BasicRadioButtonUI) {
Icon defaultIcon = ((BasicRadioButtonUI) ui).getDefaultIcon();
if (defaultIcon != null) {
MergedIcon mergedIcon = new MergedIcon(defaultIcon, 10, icon);
setIcon(mergedIcon);
return true;
}
}
return false;
}
private static class MergedIcon implements Icon {
private final Icon myLeftIcon;
private final int myHorizontalStrut;
private final Icon myRightIcon;
public MergedIcon(@NotNull Icon leftIcon, int horizontalStrut, @NotNull Icon rightIcon) {
myLeftIcon = leftIcon;
myHorizontalStrut = horizontalStrut;
myRightIcon = rightIcon;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
paintIconAlignedCenter(c, g, x, y, myLeftIcon);
paintIconAlignedCenter(c, g, x + myLeftIcon.getIconWidth() + myHorizontalStrut, y, myRightIcon);
}
private void paintIconAlignedCenter(Component c, Graphics g, int x, int y, @NotNull Icon icon) {
int iconHeight = getIconHeight();
icon.paintIcon(c, g, x, y + (iconHeight - icon.getIconHeight()) / 2);
}
@Override
public int getIconWidth() {
return myLeftIcon.getIconWidth() + myHorizontalStrut + myRightIcon.getIconWidth();
}
@Override
public int getIconHeight() {
return Math.max(myLeftIcon.getIconHeight(), myRightIcon.getIconHeight());
}
}
}