/*
This file is part of the BlueJ program.
Copyright (C) 1999-2009 Michael Klling and John Rosenberg
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
This file is subject to the Classpath exception as provided in the
LICENSE.txt file that accompanied this code.
*/
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
** @version $Id: MultiLineLabel.java 6164 2009-02-19 18:11:32Z polle $
** @author Justin Tan
** A multi-line Label-like AWT component.
**/
public class MultiLineLabel extends JPanel
{
protected int fontAttributes = Font.PLAIN;
protected float alignment;
protected Color col = null;
protected int spacing = 0;
/**
** Constructor - make a multiline label
**/
public MultiLineLabel(String text, float alignment)
{
this.alignment = alignment;
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
if(text != null)
setText(text);
}
/**
** Constructor, defaults to centered text
**/
public MultiLineLabel(String text)
{
this(text, LEFT_ALIGNMENT);
}
/**
* Constructor, empty with the given alignment
*/
public MultiLineLabel(float alignment)
{
this(null, alignment);
}
/**
* Constructor, empty with the given alignment and line spacing
*/
public MultiLineLabel(float alignment, int spacing)
{
this(null, alignment);
this.spacing = spacing;
}
/**
** Constructor - make an empty multiline label
**/
public MultiLineLabel()
{
this(null, LEFT_ALIGNMENT);
}
public void setText(String text)
{
// clear the existing lines from the panel
removeAll();
addText(text);
}
public void addText(String text)
{
addText(text, 12);
}
public void addText(String text, int size)
{
if(spacing > 0)
add(Box.createVerticalStrut(spacing));
String strs[] = splitLines(text);
JLabel l;
Font font = new Font("SansSerif", fontAttributes, size);
for (int i = 0; strs != null && i < strs.length; i++) {
l = new JLabel(strs[i]);
l.setFont(font);
l.setAlignmentX(alignment);
if (col != null)
l.setForeground(col);
add(l);
}
}
/**
* Splits "string" by "Delimiter"
*
* @param str - the string to be split
* @param delimiter - the field delimiter within str
* @returns an array of Strings
*/
public static String[] split(String str, String delimiter)
{
List<String> strings = new ArrayList<String>();
int start = 0;
int len = str.length();
int dlen = delimiter.length();
int offset = str.lastIndexOf(delimiter); // First of all, find the
// Last occurance of the Delimiter
// Stop empty delimiters
if (dlen < 1)
return null;
else if (offset < 0) // one element
{
String[] result = {str};
return result;
}
//
// Append the delimiter onto the end if it doesn't already exit
//
if (len > offset + dlen) {
str += delimiter;
len += dlen;
}
do {
// Get the new Offset
offset = str.indexOf(delimiter, start);
strings.add(str.substring(start, offset));
// Get the new Start position
start = offset + dlen;
} while ((start < len) && (offset != -1));
// Convert the list into an Array of Strings
String result[] = new String[strings.size()];
strings.toArray(result);
return result;
}
/**
* Splits "string" into lines (stripping end-of-line characters)
*
* @param str - the string to be split
* @returns an array of Strings
*/
public static String[] splitLines(String str)
{
return (str == null ? null : split(str, "\n"));
}
public void addText(String text, boolean bold, boolean italic)
{
int oldAttributes = fontAttributes;
setBold(bold);
setItalic(italic);
addText(text);
fontAttributes = oldAttributes;
}
public void setForeground(Color col)
{
this.col = col;
Component[] components = this.getComponents();
for (int i = 0; i < components.length; i++) {
Component component = components[i];
component.setForeground(col);
}
}
public void setItalic(boolean italic)
{
if(italic)
fontAttributes |= Font.ITALIC;
else
fontAttributes &= ~Font.ITALIC;
}
public void setBold(boolean bold)
{
if(bold)
fontAttributes |= Font.BOLD;
else
fontAttributes &= ~Font.BOLD;
}
}