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}