001 /* 002 * $Id: JXTitledPanel.java 3345 2009-05-25 01:51:04Z kschaefe $ 003 * 004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, 005 * Santa Clara, California 95054, U.S.A. All rights reserved. 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 020 */ 021 022 package org.jdesktop.swingx; 023 024 import java.awt.BorderLayout; 025 import java.awt.Color; 026 import java.awt.Container; 027 import java.awt.Font; 028 029 import javax.swing.BorderFactory; 030 import javax.swing.JComponent; 031 import org.jdesktop.swingx.painter.Painter; 032 033 import org.jdesktop.swingx.plaf.TitledPanelAddon; 034 import org.jdesktop.swingx.plaf.LookAndFeelAddons; 035 import org.jdesktop.swingx.plaf.TitledPanelUI; 036 037 /** 038 * A special type of Panel that has a Title section and a Content section.<br> 039 * The following properties can be set with the UIManager to change the look 040 * and feel of the JXTitledPanel: 041 * <ul> 042 * <li>JXTitledPanel.titleForeground</li> 043 * <li>JXTitledPanel.titleBackground</li> 044 * <li>JXTitledPanel.titleFont</li> 045 * <li>JXTitledPanel.titlePainter</li> 046 * <li>JXTitledPanel.captionInsets</li> 047 * <li>JXTitledPanel.rightDecorationInsets</li> 048 * <li>JXTitledPanel.leftDecorationInsets</li> 049 * </ul> 050 * 051 * @author Richard Bair 052 * @author Nicola Ken Barozzi 053 * @author Jeanette Winzenburg 054 */ 055 public class JXTitledPanel extends JXPanel { 056 057 /** 058 * @see #getUIClassID // * 059 * @see #readObject 060 */ 061 static public final String uiClassID = "TitledPanelUI"; 062 063 public static final String LEFT_DECORATION = "JXTitledPanel.leftDecoration"; 064 065 public static final String RIGHT_DECORATION = "JXTitledPanel.rightDecoration"; 066 067 /** 068 * Initialization that would ideally be moved into various look and feel 069 * classes. 070 */ 071 static { 072 LookAndFeelAddons.contribute(new TitledPanelAddon()); 073 } 074 075 /** 076 * The text to use for the title 077 */ 078 private String title = ""; 079 080 /** 081 * The Font to use for the Title 082 */ 083 private Font titleFont; 084 085 /** 086 * The foreground color to use for the Title (particularly for the text) 087 */ 088 private Color titleForeground; 089 090 /** 091 * The ContentPanel. Whatever this container is will be displayed in the 092 * Content section 093 */ 094 private Container contentPanel; 095 096 /** 097 * The Painter to use for painting the title section of the JXTitledPanel 098 */ 099 private Painter titlePainter; 100 101 /** 102 * Create a new JTitledPanel with an empty string for the title. 103 */ 104 public JXTitledPanel() { 105 this(" "); 106 } 107 108 /** 109 * Create a new JTitledPanel with the given title as the title for the 110 * panel. 111 * 112 * @param title 113 */ 114 public JXTitledPanel(String title) { 115 this(title, createDefaultContainer()); 116 } 117 118 /** 119 * Create a new JTitledPanel with the given String as the title, and the 120 * given Container as the content panel. 121 * 122 * @param title 123 * @param content 124 */ 125 public JXTitledPanel(String title, Container content) { 126 setTitle(title); 127 setContentContainer(content); 128 } 129 130 /** 131 * Returns the look and feel (L&F) object that renders this component. 132 * 133 * @return the TitledPanelUI object that renders this component 134 */ 135 @Override 136 public TitledPanelUI getUI() { 137 return (TitledPanelUI) ui; 138 } 139 140 /** 141 * Sets the look and feel (L&F) object that renders this component. 142 * 143 * @param ui 144 * the TitledPanelUI L&F object 145 * @see javax.swing.UIDefaults#getUI 146 * @beaninfo bound: true 147 * hidden: true attribute: visualUpdate true 148 * description: The UI object that implements the Component's LookAndFeel. 149 */ 150 public void setUI(TitledPanelUI ui) { 151 super.setUI(ui); 152 } 153 154 /** 155 * Returns a string that specifies the name of the L&F class that renders 156 * this component. 157 * 158 * @return "TitledPanelUI" 159 * @see JComponent#getUIClassID 160 * @see javax.swing.UIDefaults#getUI 161 * @beaninfo expert: true 162 * description: A string that specifies the name of the L&F class. 163 */ 164 @Override 165 public String getUIClassID() { 166 return uiClassID; 167 } 168 169 /** 170 * Notification from the <code>UIManager</code> that the L&F has changed. 171 * Replaces the current UI object with the latest version from the 172 * <code>UIManager</code>. 173 * 174 * @see javax.swing.JComponent#updateUI 175 */ 176 @Override 177 public void updateUI() { 178 setUI((TitledPanelUI) LookAndFeelAddons 179 .getUI(this, TitledPanelUI.class)); 180 } 181 182 /** 183 * Gets the title for this titled panel. 184 * 185 * @return the currently displayed title 186 */ 187 public String getTitle() { 188 return title; 189 } 190 191 /** 192 * Sets the title for this title panel. 193 * 194 * @param title 195 * the title to display 196 */ 197 public void setTitle(String title) { 198 String oldTitle = this.title; 199 this.title = (title == null ? "" : title); 200 // JW: fix swingx #9 - missing/incorrect notification 201 // let standard notification handle 202 // NOTE - "getting" the new property in the fire method is 203 // intentional: there's no way of missing any transformations 204 // on the parameter to set (like above: setting a 205 // value depending on whether the input is null). 206 firePropertyChange("title", oldTitle, getTitle()); 207 } 208 209 public Container getContentContainer() { 210 if (contentPanel == null) { 211 contentPanel = new JXPanel(); 212 ((JXPanel) contentPanel).setBorder(BorderFactory 213 .createEmptyBorder()); 214 this.add(contentPanel, BorderLayout.CENTER); 215 } 216 return contentPanel; 217 } 218 219 public void setContentContainer(Container contentPanel) { 220 if (this.contentPanel != null) { 221 remove(this.contentPanel); 222 } 223 add(contentPanel, BorderLayout.CENTER); 224 this.contentPanel = contentPanel; 225 } 226 227 /** 228 * Adds the given JComponent as a decoration on the right of the title 229 * 230 * @param decoration 231 */ 232 public void setRightDecoration(JComponent decoration) { 233 JComponent old = getRightDecoration(); 234 getUI().setRightDecoration(decoration); 235 firePropertyChange("rightDecoration", old, getRightDecoration()); 236 } 237 238 public JComponent getRightDecoration() { 239 return getUI().getRightDecoration(); 240 } 241 242 /** 243 * Adds the given JComponent as a decoration on the left of the title 244 * 245 * @param decoration 246 */ 247 public void setLeftDecoration(JComponent decoration) { 248 JComponent old = getLeftDecoration(); 249 getUI().setLeftDecoration(decoration); 250 firePropertyChange("leftDecoration", old, getLeftDecoration()); 251 } 252 253 public JComponent getLeftDecoration() { 254 return getUI().getLeftDecoration(); 255 } 256 257 public Font getTitleFont() { 258 return titleFont; 259 } 260 261 public void setTitleFont(Font titleFont) { 262 Font old = getTitleFont(); 263 this.titleFont = titleFont; 264 firePropertyChange("titleFont", old, getTitleFont()); 265 } 266 267 /** 268 * Set the Painter to use for painting the title section of the JXTitledPanel. 269 * This value may be null, which will cause the current look and feel to paint 270 * an appropriate look 271 * 272 * @param p The Painter to use. May be null 273 */ 274 public void setTitlePainter(Painter p) { 275 Painter old = getTitlePainter(); 276 this.titlePainter = p; 277 firePropertyChange("titlePainter", old, getTitlePainter()); 278 } 279 280 /** 281 * @return the Painter to use for painting the background of the title section 282 */ 283 public Painter getTitlePainter() { 284 return titlePainter; 285 } 286 287 public Color getTitleForeground() { 288 return titleForeground; 289 } 290 291 public void setTitleForeground(Color titleForeground) { 292 Color old = getTitleForeground(); 293 this.titleForeground = titleForeground; 294 firePropertyChange("titleForeground", old, getTitleForeground()); 295 } 296 297 private static Container createDefaultContainer() { 298 //TODO: All this default container creation stuff should be in the UI 299 //delegate. Not enough time at the moment for me to do this right. 300 JXPanel p = new JXPanel(); 301 p.setOpaque(false); 302 return p; 303 } 304 305 }