001: /*
002: * $Id: JXTitledPanel.java,v 1.21 2006/07/18 23:52:16 rbair 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.getUI(this ,
177: 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: }
|