/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2012 Maxence Bernard
*
* muCommander 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 3 of the License, or
* (at your option) any later version.
*
* muCommander 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, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.ui.layout;
import com.mucommander.ui.text.MultiLineLabel;
import javax.swing.*;
import java.awt.*;
/**
* InformationPane is a panel which is suitable for use in dialogs, to give information about the action that the
* dialog is about to perform.<br>
* It is made of 3 components:
* <ul>
* <li>A 'main' label which provides a brief description of the action to be performed.
* By default, this label uses the standard label's font size and a bold style.
* <li>A 'caption' label which is displayed under the main label and provides additional information about the action
* to be performed. This label uses a smaller font size and plain style.
* <li>An optional icon displayed to the left of labels. InformationPane makes it easy to use one of the standard
* <code>JOptionPane</code> icons: error, information, warning, question.
* </ul>
*
* <p>Here is a textual representation of the layout, all components are vertically aligned to the top:
* <pre>
*
* --------------------------
* | [ICON] | Main label |
* | | Caption label |
* |________|_______________|
*
* </pre>
* </p>
*
* @author Maxence Bernard
*/
public class InformationPane extends JPanel {
/** Label used to display the icon, can be null if no icon is used */
private JLabel iconLabel;
/** Label used to display the main message */
private MultiLineLabel mainLabel;
/** Label used to display the caption message */
private MultiLineLabel captionLabel;
/** Designates the 'error' predefined icon */
public final static int ERROR_ICON = 1;
/** Designates the 'information' predefined icon */
public final static int INFORMATION_ICON = 2;
/** DesignateS the 'warning' predefined icon */
public final static int WARNING_ICON = 3;
/** Designates the 'question' predefined icon */
public final static int QUESTION_ICON = 4;
/**
* Creates a new InformationPane with no main and caption message.
*/
public InformationPane() {
this("", "");
}
/**
* Creates a new InformationPane using the given main and caption messages and no icon. The font style for the main
* label is set to <code>Font.BOLD</code>.
*
* @param mainMessage the message to display in the main label
* @param captionMessage the message to display in the caption label
*/
public InformationPane(String mainMessage, String captionMessage) {
this(mainMessage, captionMessage, Font.BOLD, null);
}
/**
* Creates a new InformationPane using the given main message, caption message, main label font style and
* predefined icon.
*
* @param mainMessage the message to display in the main label
* @param captionMessage the message to display in the caption label
* @param mainMessageFontStyle the font style to use in the main label
* @param predefinedIconId an id designating the predefined icon to display, see constant fields for allowed values
*/
public InformationPane(String mainMessage, String captionMessage, int mainMessageFontStyle, int predefinedIconId) {
this(mainMessage, captionMessage, mainMessageFontStyle, getPredefinedIcon(predefinedIconId));
}
/**
* Creates a new InformationPane using the given main message, caption message, main label font style and icon.
*
* @param mainMessage the message to display in the main label
* @param captionMessage the message to display in the caption label
* @param mainMessageFontStyle the font style to use in the main label
* @param icon an icon to display, null for no icon
*/
public InformationPane(String mainMessage, String captionMessage, int mainMessageFontStyle, Icon icon) {
super(new BorderLayout());
if(icon!=null)
setIcon(icon);
YBoxPanel yPanel = new YBoxPanel(5);
mainLabel = new MultiLineLabel(mainMessage);
if(mainMessageFontStyle!=Font.PLAIN)
setMainLabelFontStyle(mainMessageFontStyle);
yPanel.add(mainLabel);
yPanel.addSpace(5);
captionLabel = new MultiLineLabel(captionMessage);
Font labelFont = mainLabel.getFont();
captionLabel.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()-2));
yPanel.add(captionLabel);
add(yPanel, BorderLayout.CENTER);
}
/**
* Returns an <code>Icon</code> instance corresponding to the given predefined icon id.
*
* @param predefinedIconId an id designating a predefined icon, see constant fields for allowed values
* @return an Icon instance corresponding to the given predefined icon id
*/
public static Icon getPredefinedIcon(int predefinedIconId) {
String optionPaneIcon;
switch(predefinedIconId) {
case ERROR_ICON:
optionPaneIcon = "errorIcon";
break;
case INFORMATION_ICON:
optionPaneIcon = "informationIcon";
break;
case WARNING_ICON:
optionPaneIcon = "warningIcon";
break;
case QUESTION_ICON:
optionPaneIcon = "questionIcon";
break;
default:
return null;
}
return UIManager.getIcon("OptionPane."+optionPaneIcon);
}
/**
* Returns the main label displayed in this InformationPane.
*
* @return the main label displayed in this InformationPane
*/
public MultiLineLabel getMainLabel() {
return mainLabel;
}
/**
* Returns the caption label displayed in this InformationPane.
*
* @return the caption label displayed in this InformationPane
*/
public MultiLineLabel getCaptionLabel() {
return captionLabel;
}
/**
* Changes the icon displayed in this InformationPane to the given one. If <code>null</code> is specified, this
* InformationPane will not display any icon.
*
* @param icon the new icon to display, null for no icon
*/
public void setIcon(Icon icon) {
if(icon==null) {
if(iconLabel!=null) {
remove(iconLabel);
iconLabel = null;
}
}
else {
if(iconLabel==null) {
iconLabel = new JLabel(" ");
add(iconLabel, BorderLayout.WEST);
}
iconLabel.setIcon(icon);
}
}
/**
* Changes the font style used by the main label. Allowed values are <code>Font.PLAIN</code>,
* <code>Font.BOLD</code> and <code>Font.ITALIC</code> or a mix of those combined as a bitwise mask.
*
* @param fontStyle the new font style for the main label
*/
public void setMainLabelFontStyle(int fontStyle) {
Font labelFont = mainLabel.getFont();
mainLabel.setFont(labelFont.deriveFont(fontStyle, labelFont.getSize()));
}
/**
* Returns the font style used by the main label as a bitwise mask.
*
* @return the font style used by the main label as a bitwise mask
*/
public int getMainLabelFontStyle() {
return mainLabel.getFont().getStyle();
}
}