001 /*
002 * $Id: JXHeader.java,v 1.2 2006/03/22 19:05:47 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.Color;
025 import java.awt.Font;
026 import java.awt.GridBagConstraints;
027 import java.awt.GridBagLayout;
028 import java.awt.Insets;
029 import javax.swing.Icon;
030 import javax.swing.JLabel;
031 import javax.swing.JSeparator;
032 import javax.swing.UIManager;
033 import org.jdesktop.swingx.painter.gradient.BasicGradientPainter;
034
035 /**
036 * <p>A simple component that consists of a title, a description, and an icon.
037 * An example of such a component can be seen on
038 * <a href="http://jext.free.fr/header.png">Romain Guys ProgX website</a></p>
039 *
040 * <p>The JXHeader is sufficiently configurable to be useable. The description area
041 * accepts HTML (the same set of HTML that {@link org.jdesktop.swingx.JXEditorPane}
042 * supports), and thus allows a great deal of flexibility. The icon and the
043 * various bits of text is configurable. The JXHeader itself extends JXPanel, and
044 * so allows a gradient to be painted in the background.</p>
045 *
046 * <p>If I were to reconstruct the JXHeader shown in the above screenshot, I might
047 * do so like this:<br/>
048 * <pre><code>
049 * JXHeader header = new JXHeader();
050 * header.setTitle("Timing Framework Spline Editor");
051 * header.setDescription("<html><body>" +
052 * "Drag control points in the display to change the shape of the spline<br/>" +
053 * "Click the Copy Code button to generate the corrosponding Java code." +
054 * "</body></html>");
055 * Icon icon = new ImageIcon(getClass().getResource("tools.png"));
056 * header.setIcon(icon);
057 * header.setDrawGradient(true);
058 * </code></pre></p>
059 *
060 * @author rbair
061 */
062 public class JXHeader extends JXPanel {
063 private JLabel titleLabel;
064 private JXEditorPane descriptionPane;
065 private JLabel imagePanel;
066
067 /** Creates a new instance of JXHeader */
068 public JXHeader() {
069 initGui();
070 }
071
072 private void initGui() {
073 setLayout(new GridBagLayout());
074
075 titleLabel = new JLabel("Title");
076 titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
077 add(titleLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(12, 12, 0, 11), 0, 0));
078
079 descriptionPane = new JXEditorPane();
080 descriptionPane.setContentType("text/html");
081 descriptionPane.setEditable(false);
082 descriptionPane.setOpaque(false);
083 descriptionPane.setText("<html><body><p> </p><p> </p></body></html>");
084 add(descriptionPane, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 24, 0, 11), 0, 0));
085
086 imagePanel = new JLabel();
087 add(imagePanel, new GridBagConstraints(1, 0, 1, 2, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(12, 0, 11, 11), 0, 0));
088
089 add(new JSeparator(), new GridBagConstraints(0, 2, 2, 1, 1.0, 0.0, GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
090
091 setBackgroundPainter(new BasicGradientPainter(0, 0, Color.WHITE, 1, 0, UIManager.getColor("control")));
092 }
093
094 /**
095 * @inheritDoc
096 * Passes enabled state on to the child components
097 */
098 @Override
099 public void setEnabled(boolean enabled) {
100 titleLabel.setEnabled(enabled);
101 descriptionPane.setEnabled(enabled);
102 imagePanel.setEnabled(enabled);
103 super.setEnabled(enabled);
104 }
105
106 public void setTitle(String title) {
107 String old = getTitle();
108 titleLabel.setText(title);
109 firePropertyChange("title", old, getTitle());
110 }
111
112 public String getTitle() {
113 return titleLabel.getText();
114 }
115
116 public void setDescription(String description) {
117 String old = getDescription();
118 descriptionPane.setText(description);
119 firePropertyChange("description", old, getDescription());
120 }
121
122 public String getDescription() {
123 return descriptionPane.getText();
124 }
125
126 public void setIcon(Icon icon) {
127 Icon old = getIcon();
128 imagePanel.setIcon(icon);
129 firePropertyChange("icon", old, getIcon());
130 }
131
132 public Icon getIcon() {
133 return imagePanel.getIcon();
134 }
135 }