001 /* 002 * BasicStatusBarUI.java 003 * 004 * Created on March 9, 2006, 11:30 PM 005 * 006 * To change this template, choose Tools | Template Manager 007 * and open the template in the editor. 008 */ 009 010 package org.jdesktop.swingx.plaf.basic; 011 012 import java.awt.Graphics; 013 import java.awt.Graphics2D; 014 import java.awt.image.BufferedImage; 015 import javax.imageio.ImageIO; 016 import javax.swing.BorderFactory; 017 import javax.swing.JComponent; 018 import javax.swing.plaf.ComponentUI; 019 import org.jdesktop.swingx.JXStatusBar; 020 import org.jdesktop.swingx.plaf.StatusBarUI; 021 022 /** 023 * 024 * @author Richard 025 */ 026 public class BasicStatusBarUI extends StatusBarUI { 027 /** 028 * The one and only JXStatusBar for this UI delegate 029 */ 030 private JXStatusBar statusBar; 031 private BufferedImage leftImage; 032 private BufferedImage middleImage; 033 private BufferedImage rightImage; 034 035 /** Creates a new instance of BasicStatusBarUI */ 036 public BasicStatusBarUI() { 037 try { 038 leftImage = ImageIO.read(getClass().getResource("resources/statusbar-left.png")); 039 middleImage = ImageIO.read(getClass().getResource("resources/statusbar-middle.png")); 040 rightImage = ImageIO.read(getClass().getResource("resources/statusbar-right.png")); 041 } catch (Exception e) { 042 //hmmmm... should log this I guess 043 } 044 } 045 046 /** 047 * Returns an instance of the UI delegate for the specified component. 048 * Each subclass must provide its own static <code>createUI</code> 049 * method that returns an instance of that UI delegate subclass. 050 * If the UI delegate subclass is stateless, it may return an instance 051 * that is shared by multiple components. If the UI delegate is 052 * stateful, then it should return a new instance per component. 053 * The default implementation of this method throws an error, as it 054 * should never be invoked. 055 */ 056 public static ComponentUI createUI(JComponent c) { 057 return new BasicStatusBarUI(); 058 } 059 060 /** 061 * Configures the specified component appropriate for the look and feel. 062 * This method is invoked when the <code>ComponentUI</code> instance is being installed 063 * as the UI delegate on the specified component. This method should 064 * completely configure the component for the look and feel, 065 * including the following: 066 * <ol> 067 * <li>Install any default property values for color, fonts, borders, 068 * icons, opacity, etc. on the component. Whenever possible, 069 * property values initialized by the client program should <i>not</i> 070 * be overridden. 071 * <li>Install a <code>LayoutManager</code> on the component if necessary. 072 * <li>Create/add any required sub-components to the component. 073 * <li>Create/install event listeners on the component. 074 * <li>Create/install a <code>PropertyChangeListener</code> on the component in order 075 * to detect and respond to component property changes appropriately. 076 * <li>Install keyboard UI (mnemonics, traversal, etc.) on the component. 077 * <li>Initialize any appropriate instance data. 078 * </ol> 079 * @param c the component where this UI delegate is being installed 080 * 081 * @see #uninstallUI 082 * @see javax.swing.JComponent#setUI 083 * @see javax.swing.JComponent#updateUI 084 */ 085 @Override 086 public void installUI(JComponent c) { 087 assert c instanceof JXStatusBar; 088 statusBar = (JXStatusBar)c; 089 090 statusBar.setBorder(BorderFactory.createEmptyBorder(4, 5, 4, 22)); 091 } 092 093 /** 094 * Reverses configuration which was done on the specified component during 095 * <code>installUI</code>. This method is invoked when this 096 * <code>UIComponent</code> instance is being removed as the UI delegate 097 * for the specified component. This method should undo the 098 * configuration performed in <code>installUI</code>, being careful to 099 * leave the <code>JComponent</code> instance in a clean state (no 100 * extraneous listeners, look-and-feel-specific property objects, etc.). 101 * This should include the following: 102 * <ol> 103 * <li>Remove any UI-set borders from the component. 104 * <li>Remove any UI-set layout managers on the component. 105 * <li>Remove any UI-added sub-components from the component. 106 * <li>Remove any UI-added event/property listeners from the component. 107 * <li>Remove any UI-installed keyboard UI from the component. 108 * <li>Nullify any allocated instance data objects to allow for GC. 109 * </ol> 110 * @param c the component from which this UI delegate is being removed; 111 * this argument is often ignored, 112 * but might be used if the UI object is stateless 113 * and shared by multiple components 114 * 115 * @see #installUI 116 * @see javax.swing.JComponent#updateUI 117 */ 118 @Override 119 public void uninstallUI(JComponent c) { 120 assert c instanceof JXStatusBar; 121 } 122 123 @Override 124 public void paint(Graphics g, JComponent c) { 125 super.paint(g, c); 126 127 //paint the background if opaque 128 if (statusBar.isOpaque()) { 129 //if bidi, reverse the image painting order 130 //TODO need to handle vertical stretching better 131 Graphics2D g2 = (Graphics2D)g; 132 g2.drawImage(leftImage, 0, 0, leftImage.getWidth(), statusBar.getHeight(), null); 133 g2.drawImage(middleImage, leftImage.getWidth(), 0, statusBar.getWidth() - leftImage.getWidth() - rightImage.getWidth(), statusBar.getHeight(), null); 134 g2.drawImage(rightImage, statusBar.getWidth() - rightImage.getWidth(), 0, rightImage.getWidth(), statusBar.getHeight(), null); 135 } 136 } 137 }