/*
* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* A dialog allow selection and a font and its associated info.
*
* @author <A HREF="mailto:colbell@users.sourceforge.net">Colin Bell</A>
*/
public class FontChooser extends JDialog
{
private final boolean _selectStyles;
private JComboBox _fontNamesCmb;
private final JComboBox _fontSizesCmb = new JComboBox(new String[]
{ "8", "9", "10", "12", "14" });
private final JCheckBox _boldChk = new JCheckBox("Bold");
private final JCheckBox _italicChk = new JCheckBox("Italic");
private final JLabel _previewLbl = new JLabel("PreviewText");
private Font _font;
private ActionListener _previewUpdater;
/**
* Default ctor.
*/
public FontChooser()
{
this((Frame)null);
}
/**
* ctor specifying whether styles can be selected.
*
* @param selectStyles If <TT>true</TT> bold and italic checkboxes displayed.
*/
public FontChooser(boolean selectStyles)
{
this((Frame)null, selectStyles);
}
/**
* ctor specifying the parent frame.
*
* @param owner Parent frame.
*/
public FontChooser(Frame owner)
{
super(owner, "Font Chooser", true);
_selectStyles = true;
createUserInterface();
}
/**
* ctor specifying the parent frame and whether styles can be selected.
*
* @param owner Parent frame.
* @param selectStyles If <TT>true</TT> bold and italic checkboxes displayed.
*/
public FontChooser(Frame owner, boolean selectStyles)
{
super(owner, "Font Chooser", true);
_selectStyles = selectStyles;
createUserInterface();
}
/**
* ctor specifying the parent dialog.
*
* @param owner Parent frame.
*/
public FontChooser(Dialog owner)
{
super(owner, "Font Chooser", true);
_selectStyles = true;
createUserInterface();
}
/**
* ctor specifying the parent dialog and whether styles can be selected.
*
* @param owner Parent frame.
* @param selectStyles If <TT>true</TT> bold and italic checkboxes displayed.
*/
public FontChooser(Dialog owner, boolean selectStyles)
{
super(owner, "Font Chooser", true);
_selectStyles = selectStyles;
createUserInterface();
}
/**
* Component is being added to its parent.
*/
public void addNotify()
{
super.addNotify();
if (_previewUpdater == null)
{
_previewUpdater = new PreviewLabelUpdater();
_fontNamesCmb.addActionListener(_previewUpdater);
_fontSizesCmb.addActionListener(_previewUpdater);
_boldChk.addActionListener(_previewUpdater);
_italicChk.addActionListener(_previewUpdater);
}
}
/**
* Component is being removed from its parent.
*/
public void removeNotify()
{
super.removeNotify();
if (_previewUpdater != null)
{
_fontNamesCmb.removeActionListener(_previewUpdater);
_fontSizesCmb.removeActionListener(_previewUpdater);
_boldChk.removeActionListener(_previewUpdater);
_italicChk.removeActionListener(_previewUpdater);
_previewUpdater = null;
}
}
public Font showDialog()
{
return showDialog(null);
}
/**
* Show dialog defaulting to the passed font.
*
* @param font The font to default to.
*/
public Font showDialog(Font font)
{
if (font != null)
{
_fontNamesCmb.setSelectedItem(font.getName());
_fontSizesCmb.setSelectedItem("" + font.getSize());
_boldChk.setSelected(_selectStyles && font.isBold());
_italicChk.setSelected(_selectStyles && font.isItalic());
}
else
{
_fontNamesCmb.setSelectedIndex(0);
_fontSizesCmb.setSelectedIndex(0);
_boldChk.setSelected(false);
_italicChk.setSelected(false);
}
setupPreviewLabel();
setVisible(true);
return _font;
}
public Font getSelectedFont()
{
return _font;
}
protected void setupFontFromDialog()
{
int size = 12;
try
{
size = Integer.parseInt((String)_fontSizesCmb.getSelectedItem());
}
catch (Exception ignore)
{
// Ignore.
}
FontInfo fi = new FontInfo();
fi.setFamily((String)_fontNamesCmb.getSelectedItem());
fi.setSize(size);
fi.setIsBold(_boldChk.isSelected());
fi.setIsItalic(_italicChk.isSelected());
_font = fi.createFont();
}
private void createUserInterface()
{
final JPanel content = new JPanel(new GridBagLayout());
final GridBagConstraints gbc = new GridBagConstraints();
setContentPane(content);
content.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = gbc.gridy = 0;
content.add(new JLabel("Font"), gbc);
++gbc.gridx;
content.add(new JLabel("Size"), gbc);
if (_selectStyles)
{
++gbc.gridx;
content.add(new JLabel("Style"), gbc);
}
++gbc.gridy;
gbc.gridx = 0;
_fontNamesCmb = new JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
content.add(_fontNamesCmb, gbc);
++gbc.gridx;
_fontSizesCmb.setEditable(true);
content.add(_fontSizesCmb, gbc);
if (_selectStyles)
{
++gbc.gridx;
content.add(_boldChk, gbc);
++gbc.gridy;
content.add(_italicChk, gbc);
}
gbc.gridx = 0;
++gbc.gridy;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
content.add(createPreviewPanel(), gbc);
++gbc.gridy;
gbc.fill = GridBagConstraints.HORIZONTAL;
content.add(createButtonsPanel(), gbc);
pack();
setResizable(true);
}
private JPanel createPreviewPanel()
{
final JPanel pnl = new JPanel(new BorderLayout());
pnl.setBorder(BorderFactory.createTitledBorder("PreviewTitle"));
Dimension prefSize = _previewLbl.getPreferredSize();
prefSize.height = 50;
_previewLbl.setPreferredSize(prefSize);
pnl.add(_previewLbl, BorderLayout.CENTER);
setupPreviewLabel();
return pnl;
}
private JPanel createButtonsPanel()
{
JPanel pnl = new JPanel();
JButton okBtn = new JButton("OK");
okBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
setupFontFromDialog();
dispose();
}
});
JButton cancelBtn = new JButton("Cancel");
cancelBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
FontChooser.this._font = null;
dispose();
}
});
pnl.add(okBtn);
pnl.add(cancelBtn);
getRootPane().setDefaultButton(okBtn);
return pnl;
}
private void setupPreviewLabel()
{
setupFontFromDialog();
_previewLbl.setFont(_font);
}
private final class PreviewLabelUpdater implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
setupPreviewLabel();
}
}
}
/*
* Copyright (C) 2001-2003 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
class FontInfo implements Cloneable, Serializable
{
private static final long serialVersionUID = 1L;
public interface IPropertyNames
{
String FAMILY = "family";
String IS_BOLD = "isBold";
String IS_ITALIC = "isItalic";
String SIZE = "size";
}
private static String DEFAULT_FAMILY = "Monospaced";
private String _familyName;
private boolean _isBold;
private boolean _isItalic;
private int _size;
public FontInfo()
{
super();
setFamily(DEFAULT_FAMILY);
setSize(12);
}
public FontInfo(Font font)
{
super();
if (font == null)
{
throw new IllegalArgumentException("Null Font passed");
}
setFont(font);
}
/**
* Return a copy of this object.
*/
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException ex)
{
throw new InternalError(ex.getMessage()); // Impossible.
}
}
public String getFamily()
{
return _familyName;
}
public void setFamily(String value)
{
_familyName = value != null ? value : DEFAULT_FAMILY;
}
public boolean isBold()
{
return _isBold;
}
public void setIsBold(boolean value)
{
_isBold = value;
}
public boolean isItalic()
{
return _isItalic;
}
public void setIsItalic(boolean value)
{
_isItalic = value;
}
public int getSize()
{
return _size;
}
public void setSize(int value)
{
_size = value;
}
public void setFont(Font font) throws IllegalArgumentException
{
if (font == null)
{
throw new IllegalArgumentException("Null Font passed");
}
_familyName = font.getFamily();
_isBold = font.isBold();
_isItalic = font.isItalic();
_size = font.getSize();
}
public boolean doesFontMatch(Font font)
{
if (font == null)
{
return false;
}
return font.getFamily().equals(_familyName)
&& font.getSize() == getSize()
&& font.getStyle() == generateStyle();
}
public int generateStyle()
{
int style = 0;
if (!_isBold && !_isItalic)
{
style = Font.PLAIN;
}
else
{
if (_isBold)
{
style |= Font.BOLD;
}
if (_isItalic)
{
style |= Font.ITALIC;
}
}
return style;
}
public Font createFont()
{
return new Font(_familyName, generateStyle(), _size);
}
// i18n ? What is this used for?
public String toString()
{
StringBuffer buf = new StringBuffer();
buf.append(_familyName).append(", " + _size);
if (_isBold)
{
buf.append(", bold");
}
if (_isItalic)
{
buf.append(", italic");
}
return buf.toString();
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((_familyName == null) ? 0 : _familyName.hashCode());
result = PRIME * result + (_isBold ? 1231 : 1237);
result = PRIME * result + (_isItalic ? 1231 : 1237);
result = PRIME * result + _size;
return result;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final FontInfo other = (FontInfo) obj;
if (_familyName == null) {
if (other._familyName != null)
return false;
} else if (!_familyName.equals(other._familyName))
return false;
if (_isBold != other._isBold)
return false;
if (_isItalic != other._isItalic)
return false;
if (_size != other._size)
return false;
return true;
}
}