001 /*
002 * $Id: JXTitledPanel.java,v 1.20 2006/05/14 15:55:54 dmouse Exp $
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.JXTitledPanelAddon;
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 3 properties can be set with the UIManager to change the look
040 * and feel of the JXTitledPanel:
041 * <ul>
042 * <li>JXTitledPanel.title.foreground</li>
043 * <li>JXTitledPanel.title.background</li>
044 * <li>JXTitledPanel.title.font</li>
045 * </ul>
046 *
047 * @author Richard Bair
048 * @author Nicola Ken Barozzi
049 * @author Jeanette Winzenburg
050 */
051 public class JXTitledPanel extends JXPanel {
052
053 /**
054 * @see #getUIClassID // *
055 * @see #readObject
056 */
057 static public final String uiClassID = "TitledPanelUI";
058
059 public static final String LEFT_DECORATION = "JXTitledPanel.leftDecoration";
060
061 public static final String RIGHT_DECORATION = "JXTitledPanel.rightDecoration";
062
063 /**
064 * Initialization that would ideally be moved into various look and feel
065 * classes.
066 */
067 static {
068 LookAndFeelAddons.contribute(new JXTitledPanelAddon());
069 }
070
071 /**
072 * The text to use for the title
073 */
074 private String title = "";
075
076 /**
077 * The Font to use for the Title
078 */
079 private Font titleFont;
080
081 /**
082 * The forground color to use for the Title (particularly for the text)
083 */
084 private Color titleForeground;
085
086 /**
087 * The ContentPanel. Whatever this container is will be displayed in the
088 * Content section
089 */
090 private Container contentPanel;
091
092 /**
093 * The Painter to use for painting the title section of the JXTitledPanel
094 */
095 private Painter titlePainter;
096
097 /**
098 * Create a new JTitledPanel with an empty string for the title.
099 */
100 public JXTitledPanel() {
101 this("");
102 }
103
104 /**
105 * Create a new JTitledPanel with the given title as the title for the
106 * panel.
107 *
108 * @param title
109 */
110 public JXTitledPanel(String title) {
111 this(title, new JXPanel());
112 }
113
114 /**
115 * Create a new JTitledPanel with the given String as the title, and the
116 * given Container as the content panel.
117 *
118 * @param title
119 * @param content
120 */
121 public JXTitledPanel(String title, Container content) {
122 setTitle(title);
123 setContentContainer(content);
124 }
125
126 /**
127 * Returns the look and feel (L&F) object that renders this component.
128 *
129 * @return the TitledPanelUI object that renders this component
130 * @since 1.4
131 */
132 @Override
133 public TitledPanelUI getUI() {
134 return (TitledPanelUI) ui;
135 }
136
137 /**
138 * Sets the look and feel (L&F) object that renders this component.
139 *
140 * @param ui
141 * the TitledPanelUI L&F object
142 * @see javax.swing.UIDefaults#getUI
143 * @since 1.4
144 * @beaninfo bound: true hidden: true attribute: visualUpdate true
145 * description: The UI object that implements the Component's
146 * LookAndFeel.
147 */
148 public void setUI(TitledPanelUI ui) {
149 super.setUI(ui);
150 }
151
152 /**
153 * Returns a string that specifies the name of the L&F class that renders
154 * this component.
155 *
156 * @return "TitledPanelUI"
157 * @see JComponent#getUIClassID
158 * @see javax.swing.UIDefaults#getUI
159 * @beaninfo expert: true description: A string that specifies the name of
160 * the L&F class.
161 */
162 @Override
163 public String getUIClassID() {
164 return uiClassID;
165 }
166
167 /**
168 * Notification from the <code>UIManager</code> that the L&F has changed.
169 * Replaces the current UI object with the latest version from the
170 * <code>UIManager</code>.
171 *
172 * @see javax.swing.JComponent#updateUI
173 */
174 @Override
175 public void updateUI() {
176 setUI((TitledPanelUI) LookAndFeelAddons
177 .getUI(this, TitledPanelUI.class));
178 }
179
180 public String getTitle() {
181 return title;
182 }
183
184 public void setTitle(String title) {
185 String oldTitle = this.title;
186 this.title = (title == null ? "" : title);
187 // JW: fix swingx #9 - missing/incorrect notification
188 // let standard notification handle
189 // NOTE - "getting" the new property in the fire method is
190 // intentional: there's no way of missing any transformations
191 // on the parameter to set (like above: setting a
192 // value depending on whether the input is null).
193 firePropertyChange("title", oldTitle, getTitle());
194 }
195
196 public Container getContentContainer() {
197 if (contentPanel == null) {
198 contentPanel = new JXPanel();
199 ((JXPanel) contentPanel).setBorder(BorderFactory
200 .createEmptyBorder());
201 this.add(contentPanel, BorderLayout.CENTER);
202 }
203 return contentPanel;
204 }
205
206 public void setContentContainer(Container contentPanel) {
207 if (this.contentPanel != null) {
208 remove(this.contentPanel);
209 }
210 add(contentPanel, BorderLayout.CENTER);
211 this.contentPanel = contentPanel;
212 }
213
214 /**
215 * Adds the given JComponent as a decoration on the right of the title
216 *
217 * @param decoration
218 */
219 @Deprecated
220 public void addRightDecoration(JComponent decoration) {
221 getUI().setRightDecoration(decoration);
222 }
223
224 /**
225 * Adds the given JComponent as a decoration on the left of the title
226 *
227 * @param decoration
228 */
229 @Deprecated
230 public void addLeftDecoration(JComponent decoration) {
231 getUI().setLeftDecoration(decoration);
232 }
233
234 /**
235 * Adds the given JComponent as a decoration on the right of the title
236 *
237 * @param decoration
238 */
239 public void setRightDecoration(JComponent decoration) {
240 JComponent old = getRightDecoration();
241 getUI().setRightDecoration(decoration);
242 firePropertyChange("rightDecoration", old, getRightDecoration());
243 }
244
245 public JComponent getRightDecoration() {
246 return getUI().getRightDecoration();
247 }
248
249 /**
250 * Adds the given JComponent as a decoration on the left of the title
251 *
252 * @param decoration
253 */
254 public void setLeftDecoration(JComponent decoration) {
255 JComponent old = getLeftDecoration();
256 getUI().setLeftDecoration(decoration);
257 firePropertyChange("leftDecoration", old, getLeftDecoration());
258 }
259
260 public JComponent getLeftDecoration() {
261 return getUI().getLeftDecoration();
262 }
263
264 public Font getTitleFont() {
265 return titleFont;
266 }
267
268 public void setTitleFont(Font titleFont) {
269 Font old = getTitleFont();
270 this.titleFont = titleFont;
271 firePropertyChange("titleFont", old, getTitleFont());
272 }
273
274 /**
275 * Set the Painter to use for painting the title section of the JXTitledPanel.
276 * This value may be null, which will cause the current look and feel to paint
277 * an appropriate look
278 *
279 * @param p The Painter to use. May be null
280 */
281 public void setTitlePainter(Painter p) {
282 Painter old = getTitlePainter();
283 this.titlePainter = p;
284 firePropertyChange("titlePainter", old, getTitlePainter());
285 }
286
287 /**
288 * @return the Painter to use for painting the background of the title section
289 */
290 public Painter getTitlePainter() {
291 return titlePainter;
292 }
293
294 public Color getTitleForeground() {
295 return titleForeground;
296 }
297
298 public void setTitleForeground(Color titleForeground) {
299 Color old = getTitleForeground();
300 this.titleForeground = titleForeground;
301 firePropertyChange("titleForeground", old, getTitleForeground());
302 }
303
304 }