001package org.jdesktop.swingx.plaf; 002 003import java.awt.Dimension; 004import java.awt.Graphics; 005import java.awt.Insets; 006 007import javax.swing.JComponent; 008import javax.swing.JTextField; 009import javax.swing.border.Border; 010import javax.swing.plaf.TextUI; 011 012/** 013 * <p> 014 * TODO: queries the text components layout manager for the preferred size. 015 * </p> 016 * 017 * @author Peter Weishapl <petw@gmx.net> 018 * 019 */ 020public class BuddyTextFieldUI extends PromptTextFieldUI { 021 protected BuddyLayoutAndBorder layoutAndBorder; 022 023 // Bad hacking: FIXME when know how to get the real margin. 024 private static final Insets MAC_MARGIN = new Insets(0, 2, 1, 2); 025 026 @Override 027 public void paint(Graphics g, JComponent c) { 028 // yet another dirty mac hack to prevent painting background outside of 029 // border. 030 if (hasMacTextFieldBorder(c)) { 031 Insets borderInsets = layoutAndBorder.getRealBorderInsets(); 032 033 borderInsets.left -= MAC_MARGIN.left; 034 int height = c.getHeight() - borderInsets.bottom - borderInsets.top + MAC_MARGIN.bottom + MAC_MARGIN.top; 035 int width = c.getWidth() - borderInsets.left - borderInsets.right + MAC_MARGIN.right; 036 g.clipRect(borderInsets.left, borderInsets.top, width, height); 037 } 038 super.paint(g, c); 039 } 040 041 private boolean hasMacTextFieldBorder(JComponent c) { 042 Border border = c.getBorder(); 043 if (border == layoutAndBorder) { 044 border = layoutAndBorder.getBorderDelegate(); 045 } 046 return border != null && border.getClass().getName().equals("apple.laf.CUIAquaTextFieldBorder"); 047 } 048 049 /** 050 * Creates a new {@link BuddyTextFieldUI} which delegates most work to 051 * another {@link TextUI}. 052 * 053 * @param delegate 054 */ 055 public BuddyTextFieldUI(TextUI delegate) { 056 super(delegate); 057 } 058 059 @Override 060 public void installUI(JComponent c) { 061 super.installUI(c); 062 layoutAndBorder = createBuddyLayoutAndBorder(); 063 layoutAndBorder.install((JTextField) c); 064 } 065 066 protected BuddyLayoutAndBorder createBuddyLayoutAndBorder() { 067 return new BuddyLayoutAndBorder(); 068 } 069 070 @Override 071 public void uninstallUI(JComponent c) { 072 layoutAndBorder.uninstall(); 073 super.uninstallUI(c); 074 } 075 076 /** 077 * TODO: comment 078 * 079 * @see javax.swing.plaf.ComponentUI#getPreferredSize(javax.swing.JComponent) 080 */ 081 @Override 082 public Dimension getPreferredSize(JComponent c) { 083 Dimension d = new Dimension(); 084 Dimension cd = super.getPreferredSize(c); 085 Dimension ld = c.getLayout().preferredLayoutSize(c); 086 087 d.height = Math.max(cd.height, ld.height); 088 d.width = Math.max(cd.width, ld.width); 089 090 return d; 091 } 092}