/* * @(#)CheckBoxIcon.java 3/6/2012 * * Copyright 2002 - 2012 JIDE Software Inc. All rights reserved. */ package com.jidesoft.icons; import com.jidesoft.swing.TristateCheckBox; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; /** * The icon to paint CheckBox icon safely with any L&F. * * @since 3.3.7 */ public class CheckBoxIcon implements Icon { private TristateCheckBox _checkBox; private Icon _checkBoxIcon; private BufferedImage _uncheckImage; private BufferedImage _checkedImage; private BufferedImage _mixedImage; private int _state; /** * The constructor. */ public CheckBoxIcon() { } private void validateCheckBox() { if (_checkBox == null || _checkBoxIcon != UIManager.getDefaults().getIcon("CheckBox.icon")) { _checkBox = new TristateCheckBox(); _checkBox.setOpaque(false); _checkBoxIcon = UIManager.getDefaults().getIcon("CheckBox.icon"); _uncheckImage = null; _checkedImage = null; _mixedImage = null; } } @Override public void paintIcon(Component c, Graphics g, int x, int y) { validateCheckBox(); if (_uncheckImage == null) { GraphicsConfiguration graphicsConfiguration = ((Graphics2D) g).getDeviceConfiguration(); _uncheckImage = graphicsConfiguration.createCompatibleImage(getIconWidth(), getIconHeight(), Transparency.TRANSLUCENT); _checkBox.setState(TristateCheckBox.STATE_UNSELECTED); _checkBox.setBounds(0, 0, getIconWidth(), getIconHeight()); _checkBox.paint(_uncheckImage.getGraphics()); _checkedImage = graphicsConfiguration.createCompatibleImage(getIconWidth(), getIconHeight(), Transparency.TRANSLUCENT); _checkBox.setState(TristateCheckBox.STATE_SELECTED); _checkBox.setBounds(0, 0, getIconWidth(), getIconHeight()); _checkBox.paint(_checkedImage.getGraphics()); _mixedImage = graphicsConfiguration.createCompatibleImage(getIconWidth(), getIconHeight(), Transparency.TRANSLUCENT); _checkBox.setState(TristateCheckBox.STATE_MIXED); _checkBox.setBounds(0, 0, getIconWidth(), getIconHeight()); _checkBox.paint(_mixedImage.getGraphics()); } if (getState() == TristateCheckBox.STATE_SELECTED) { g.drawImage(_checkedImage, x, y, null); } else if (getState() == TristateCheckBox.STATE_UNSELECTED) { g.drawImage(_uncheckImage, x, y, null); } else if (getState() == TristateCheckBox.STATE_MIXED) { g.drawImage(_mixedImage, x, y, null); } } @Override public int getIconWidth() { validateCheckBox(); return _checkBox.getPreferredSize().width; } @Override public int getIconHeight() { validateCheckBox(); return _checkBox.getPreferredSize().height; } /** * Sets the state of the icon to paint. * <p/> * The state could be {@link TristateCheckBox#STATE_SELECTED}, {@link TristateCheckBox#STATE_UNSELECTED} or * {@link TristateCheckBox#STATE_MIXED}. * * @param state the state */ public void setState(int state) { _state = state; } /** * Gets the state of the icon to paint. * * @return the state. * @see #setState(int) */ public int getState() { return _state; } }