package org.korsakow.ide.ui.laf; import java.awt.BasicStroke; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import javax.swing.ButtonModel; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import org.korsakow.ide.util.UIResourceManager; import sun.swing.SwingUtilities2; import com.sun.java.swing.plaf.motif.MotifCheckBoxUI; public class KorsakowCheckBoxUI extends MotifCheckBoxUI { private static final int CHECK_HEIGHT = 12; private static final int CHECK_WIDTH = 12; private static final int TEXT_GAP = 5; private static Icon checkIcon = null; @Override public void installUI(JComponent c) { super.installUI(c); if (checkIcon == null) { checkIcon = UIResourceManager.getIcon("laf/checkbox_check.png"); } // arrowIcon = new MotifComboBoxArrowIcon(UIManager.getColor("controlHighlight"), } public static ComponentUI createUI(JComponent c){ c.setOpaque(false); return new KorsakowCheckBoxUI(); } @Override public Dimension getPreferredSize(JComponent c) { JCheckBox check = (JCheckBox) c; final Dimension d = new Dimension(CHECK_WIDTH, CHECK_HEIGHT); if (check.getIcon() != null) { d.width += check.getIcon().getIconWidth(); d.height = Math.max(d.height, check.getIcon().getIconWidth()); } if (!check.getText().isEmpty()) { d.width += check.getIconTextGap(); d.width += SwingUtilities2.stringWidth(check, check.getFontMetrics(check.getFont()), check.getText()); d.height = Math.max(d.height, check.getFontMetrics(check.getFont()).getHeight()); d.width += TEXT_GAP; } return d; } // TODO: why is the super synchronized??!?! @Override public synchronized void paint(Graphics g, JComponent c) { JCheckBox check = (JCheckBox) c; ButtonModel model = check.getModel(); float strokeSize = UIManager.getInt("CheckBox.borderSize"); //KorsakowLookAndFeel.BORDER_STROKE_SIZE; Graphics2D g2 = (Graphics2D)g; Rectangle clipRect = g.getClipBounds(); int checkOffsetX = 0; int textOffsetX = CHECK_WIDTH+2; final int textWidth = clipRect.width-CHECK_WIDTH-2; if (check.getHorizontalTextPosition() == JCheckBox.LEFT) { checkOffsetX = textWidth; textOffsetX = 0; } else { } int boxX = checkOffsetX; int boxY = (clipRect.height-CHECK_HEIGHT)/2-0*CHECK_HEIGHT/2; Rectangle2D.Float borderRect = new Rectangle2D.Float(boxX+strokeSize/2, boxY+strokeSize/2, CHECK_WIDTH-strokeSize-strokeSize/2, CHECK_HEIGHT-strokeSize-strokeSize/2); // draw background Paint paint = null; paint = new GradientPaint(boxX, boxY, UIManager.getColor("CheckBox.background"), boxX, boxY+CHECK_HEIGHT, UIManager.getColor("CheckBox.background2"), false); g2.setPaint(paint); g2.fill(borderRect); // draw border g2.setStroke(new BasicStroke(strokeSize)); g2.setColor(UIManager.getColor("CheckBox.borderColor")); g2.draw(borderRect); if (model.isSelected()) { checkIcon.paintIcon(c, g, checkOffsetX + (CHECK_WIDTH-checkIcon.getIconWidth())/2+1, (CHECK_HEIGHT-checkIcon.getIconHeight())/2); } if (check.getIcon() != null) check.getIcon().paintIcon(check, g2, CHECK_WIDTH, (clipRect.height-check.getIcon().getIconHeight())/2); String text = check.getText(); if (text != null && !text.equals("")) { Rectangle textRect = new Rectangle(textOffsetX, 0, textWidth, clipRect.height); if (check.getIcon() != null) textRect.x += check.getIcon().getIconWidth() + check.getIconTextGap(); paintText(g, check, textRect, text); } } }