// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: HeaderPanelExt.java,v 1.10 2006/01/08 05:07:31 kyank Exp $
//
package com.salas.bb.utils.uif;
import com.jgoodies.uifextras.panel.GradientBackgroundPanel;
import com.jgoodies.uifextras.util.UIFactory;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.uif.util.SystemUtils;
import com.salas.bb.utils.osx.OSXSupport;
import com.salas.bb.utils.Constants;
import javax.swing.*;
import java.awt.*;
/**
* Extended header panel, with the ability to wrap and with platform specific font handling.
*/
public class HeaderPanelExt extends GradientBackgroundPanel
{
private static final String COLUMNS = "pref:grow";
private static final String ROWS = "pref, 7px";
private static final Font FONT_LUCIDA_GRANDE = new Font("Lucida Grande", Font.PLAIN, 10);
/**
* Automatically computed height. Don't work for dialogs with resizer hooks as they require
* the pre-set dimensions to do the job.
*/
// public static final int HEIGHT_AUTO = -1;
/** Default height. */
public static final int HEIGHT_DEFAULT = 70;
private final int height;
private JLabel titleLabel;
private JLabel iconLabel;
private JTextArea descriptionArea;
// Instance Creation ****************************************************
/**
* Constructs the panel. Minimum height will be computed.
*
* @param title title.
* @param description description.
*/
public HeaderPanelExt(String title, String description)
{
this(title, description, null);
}
/**
* Constructs the panel. Minimum height will be computed.
*
* @param title title.
* @param description description.
* @param icon icon.
*/
public HeaderPanelExt(String title, String description, Icon icon)
{
this(title, description, icon, HEIGHT_DEFAULT);
}
/**
* Constructs the panel.
*
* @param title title.
* @param description description.
* @param icon icon.
* @param height minimum height.
*
* @see #HEIGHT_DEFAULT
*/
public HeaderPanelExt(String title, String description, Icon icon, int height)
{
super(true);
this.height = height;
initComponents();
build();
setTitle(title);
setDescription(description);
setIcon(icon);
}
/**
* Returns the title text.
*
* @return title.
*/
public String getTitle()
{
return titleLabel.getText();
}
/**
* Sets the title text.
*
* @param title title.
*/
public void setTitle(String title)
{
titleLabel.setText(title);
}
/**
* Returns the description text.
*
* @return description.
*/
public String getDescription()
{
return descriptionArea.getText();
}
/**
* Sets the description text.
*
* @param description description.
*/
public void setDescription(String description)
{
descriptionArea.setText(description);
}
/**
* Returns the icon.
*
* @return icon.
*/
public Icon getIcon()
{
return iconLabel.getIcon();
}
/**
* Sets the icon.
*
* @param icon icon.
*/
public void setIcon(Icon icon)
{
if (icon != null)
{
if (icon.getIconWidth() <= 20 && (icon instanceof ImageIcon))
{
Image image = ((ImageIcon)icon).getImage();
int newWidth = 2 * icon.getIconWidth();
int newHeight = 2 * icon.getIconHeight();
image = image.getScaledInstance(newWidth, newHeight, 0);
icon = new ImageIcon(image);
}
}
iconLabel.setIcon(icon);
}
/**
* Creates and configures the UI components.
*/
private void initComponents()
{
titleLabel = UIFactory.createBoldLabel(Constants.EMPTY_STRING, 0, Color.black);
descriptionArea = ComponentsFactory.createWrappedMultilineLabel(Constants.EMPTY_STRING);
if (SystemUtils.IS_OS_MAC) descriptionArea.setFont(FONT_LUCIDA_GRANDE);
iconLabel = new JLabel();
}
/**
* Builds the panel.
*/
private void build()
{
setLayout(new FormLayout(COLUMNS, ROWS));
CellConstraints cc = new CellConstraints();
add(buildCenterComponent(), cc.xy(1, 1));
add(buildBottomComponent(), cc.xy(1, 2, CellConstraints.FILL, CellConstraints.BOTTOM));
}
/**
* Builds and answers the panel's center component.
*/
protected JComponent buildCenterComponent()
{
FormLayout fl = new FormLayout(
"7dlu, 9dlu, pref:grow, 14dlu, pref, 4dlu",
"7dlu, pref, 2dlu, pref, 7dlu:grow");
JPanel panel = new JPanel(fl);
// if (height != HEIGHT_AUTO)
// {
Dimension size = new Dimension(300, height);
panel.setMinimumSize(size);
panel.setPreferredSize(size);
// }
panel.setOpaque(false);
CellConstraints cc = new CellConstraints();
panel.add(titleLabel, cc.xyw(2, 2, 2));
panel.add(descriptionArea, cc.xy(3, 4));
panel.add(iconLabel, cc.xywh(5, 1, 1, 5));
return panel;
}
/**
* Builds and answers the panel's bottom component, a separator by default.
*/
protected JComponent buildBottomComponent()
{
return new JSeparator();
}
}