/* * @(#)FocusedBorder.java * * $Date: 2014-03-13 01:15:48 -0700 (Thu, 13 Mar 2014) $ * * Copyright (c) 2011 by Jeremy Wood. * All rights reserved. * * The copyright of this software is owned by Jeremy Wood. * You may not use, copy or modify this software, except in * accordance with the license agreement you entered into with * Jeremy Wood. For details see accompanying license terms. * * This software is probably, but not necessarily, discussed here: * https://javagraphics.java.net/ * * That site should also contain the most recent official version * of this software. (See the SVN repository for more details.) */ package com.bric.swing; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; import java.awt.geom.GeneralPath; import java.awt.geom.Path2D; import javax.swing.border.Border; import com.bric.plaf.PlafPaintUtils; /** This will alternate between a focus ring of 3 pixels * and an arbitrary border you pass when constructing this * object. * */ public class FocusedBorder implements Border { private final static Insets focusInsets = new Insets(3,3,3,3); final Border unfocusedBorder; /** Create a new <code>FocusedBorder</code>. * * @param unfocusedBorder the border to paint when the focus ring will not be painted. */ public FocusedBorder(Border unfocusedBorder) { this.unfocusedBorder = unfocusedBorder; } public Insets getBorderInsets(Component c) { Insets newInsets = (Insets)focusInsets.clone(); if(unfocusedBorder!=null) { Insets otherInsets = unfocusedBorder.getBorderInsets(c); newInsets.left = Math.max(newInsets.left, otherInsets.left); newInsets.top = Math.max(newInsets.top, otherInsets.top); newInsets.bottom = Math.max(newInsets.bottom, otherInsets.bottom); newInsets.right = Math.max(newInsets.right, otherInsets.right); } return newInsets; } public boolean isBorderOpaque() { return false; } public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Insets insets = getBorderInsets(c); if(c.hasFocus()) { Rectangle rect = new Rectangle(x+insets.left, y+insets.top, width-insets.left-insets.right-1, height-insets.top-insets.bottom-1); Graphics2D g2 = (Graphics2D)g.create(); GeneralPath focusOnly = new GeneralPath(Path2D.WIND_EVEN_ODD); focusOnly.append(new Rectangle(x,y,width,height), false); focusOnly.append(new Rectangle(x+insets.left,y+insets.top, width-insets.left-insets.right, height-insets.top-insets.bottom), false); g2.clip(focusOnly); PlafPaintUtils.paintFocus(g2, rect, 3); } else if(unfocusedBorder!=null) { Insets borderInsets = unfocusedBorder.getBorderInsets(c); unfocusedBorder.paintBorder(c, g, x+insets.left-borderInsets.left, y+insets.top-borderInsets.top, width-insets.left-insets.right+borderInsets.left+borderInsets.right, height-insets.top-insets.bottom+borderInsets.top+borderInsets.bottom); } } }