/* FILE: FontDialog.java
* DATE OF CREATION: Wed Jan 15 17:07:07 2002
* AUTHOR : Emmanuel Pietriga (emmanuel@w3.org)
* MODIF: Emmanuel Pietriga (emmanuel.pietriga@inria.fr)
* Copyright (c) Emmanuel Pietriga, 2002. All Rights Reserved
* Copyright (c) INRIA, 2008. All Rights Reserved
* Licensed under the GNU LGPL. For full terms see the file COPYING.
*
* $Id: FontDialog.java 1207 2008-08-13 16:03:07Z epietrig $
*/
import java.awt.Container;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class FontDialog extends JDialog implements ActionListener {
static final String ZVTM_FONT_CHOOSER = "ZVTM Font Chooser";
static String DEFAULT_FAMILY="Dialog";
static int DEFAULT_STYLE=Font.PLAIN;
static int DEFAULT_SIZE=10;
FontTracker ft;
JButton okBt,cancelBt;
JList familyList,styleList,sizeList;
String[] allFontFamilies=java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
String[] allFontStyles={"Plain","Bold","Italic","BoldItalic"};
String[] allFontSizes={"4","6","8","10","12","14","16","18","20","24"};
/** Call a FontDialog window that will return the font selected in the window
*@param owner application frame that owns this Modal component
*/
public static Font getFontDialog(Frame owner){
FontTracker res=new FontTracker();
FontDialog fd=new FontDialog(res,owner);
fd.addWindowListener(new FontDialog.Closer());
fd.addComponentListener(new FontDialog.DisposeOnClose());
fd.setLocationRelativeTo(owner);
fd.setVisible(true); //blocks until the dialog is closed
return res.getFont();
}
/** Call a FontDialog window that will return the font selected in the window
*@param owner application dialog that owns this Modal component
*/
public static Font getFontDialog(Dialog owner){
FontTracker res=new FontTracker();
FontDialog fd=new FontDialog(res,owner);
fd.addWindowListener(new FontDialog.Closer());
fd.addComponentListener(new FontDialog.DisposeOnClose());
fd.setLocationRelativeTo(owner);
fd.setVisible(true); //blocks until the dialog is closed
return res.getFont();
}
/** Call a FontDialog window that will return the font selected in the window
*@param owner application frame that owns this Modal component
*@param f a font giving the default parameters with which the dialog should be initialized (family, size, style)
*/
public static Font getFontDialog(Frame owner,Font f){
if (f!=null){
DEFAULT_FAMILY=f.getFamily();
DEFAULT_STYLE=f.getStyle();
DEFAULT_SIZE=f.getSize();
}
FontTracker res=new FontTracker();
FontDialog fd=new FontDialog(res,owner);
fd.addWindowListener(new FontDialog.Closer());
fd.addComponentListener(new FontDialog.DisposeOnClose());
fd.setLocationRelativeTo(owner);
fd.setVisible(true); //blocks until the dialog is closed
return res.getFont();
}
/** Call a FontDialog window that will return the font selected in the window
*@param owner application dialog that owns this Modal component
*@param f a font giving the default parameters with which the dialog should be initialized (family, size, style)
*/
public static Font getFontDialog(Dialog owner,Font f){
if (f!=null){
DEFAULT_FAMILY=f.getFamily();
DEFAULT_STYLE=f.getStyle();
DEFAULT_SIZE=f.getSize();
}
FontTracker res=new FontTracker();
FontDialog fd=new FontDialog(res,owner);
fd.addWindowListener(new FontDialog.Closer());
fd.addComponentListener(new FontDialog.DisposeOnClose());
fd.setLocationRelativeTo(owner);
fd.setVisible(true); //blocks until the dialog is closed
return res.getFont();
}
/**
* Font.decode does not seem to work that well, or I don;t understand how it is supposed to work
* Anyway, this one does what I want (decodes family+" "+style+" "+size)
*/
public static Font decode(String fontSpec){
if (fontSpec!=null && fontSpec.length()>0){
StringTokenizer st=new StringTokenizer(fontSpec," ",false);
String[] tokens=new String[st.countTokens()];
if (tokens.length>=3){
int i=0;
while (st.hasMoreTokens()) {
tokens[i++]=st.nextToken();
}
String tokenizedFamily="";
for (int j=0;j tokenizedFamily+=tokens[j]+" ";
}
tokenizedFamily+=tokens[tokens.length-3];
String family=tokenizedFamily;if (family==null){family=DEFAULT_FAMILY;}
String tokenizedStyle=tokens[tokens.length-2];
String tokenizedSize=tokens[tokens.length-1];
int style;
if (tokenizedStyle.equals("Bold")){style=Font.BOLD;}
else if (tokenizedStyle.equals("Italic")){style=Font.ITALIC;}
else if (tokenizedStyle.equals("BoldItalic")){style=Font.BOLD+Font.ITALIC;}
else {style=Font.PLAIN;}//"Plain"
int size;
try {
size=Integer.parseInt(tokenizedSize);
if (size<=0){size=DEFAULT_SIZE;}
}
catch (NumberFormatException ex){size=DEFAULT_SIZE;}
return new Font(family,style,size);
}
else {return new Font(DEFAULT_FAMILY,DEFAULT_STYLE,DEFAULT_SIZE);}
}
else {return new Font(DEFAULT_FAMILY,DEFAULT_STYLE,DEFAULT_SIZE);}
}
FontDialog(FontTracker ftt,Frame owner){
super(owner,ZVTM_FONT_CHOOSER,true);
setLocation(owner.getLocation());
ft=ftt;
initUI();
}
FontDialog(FontTracker ftt,Dialog owner){
super(owner,ZVTM_FONT_CHOOSER,true);
setLocation(owner.getLocation());
ft=ftt;
initUI();
}
void initUI(){//depending on selected item/default shape type
Container cp=this.getContentPane();
try {
okBt.removeActionListener(this);
cancelBt.removeActionListener(this);
}
catch (NullPointerException ex){/*all these might be null (for instance when poping up a GlyphFactory for the first time)*/}
cp.removeAll();
//main font panel
JPanel mainPanel=new JPanel();
GridBagLayout gridBag1=new GridBagLayout();
GridBagConstraints constraints1=new GridBagConstraints();
mainPanel.setLayout(gridBag1);
constraints1.fill=GridBagConstraints.BOTH;
constraints1.anchor=GridBagConstraints.CENTER;
familyList=new JList(allFontFamilies);
JScrollPane sp1=new JScrollPane(familyList);
buildConstraints(constraints1,0,0,1,1,30,100);
gridBag1.setConstraints(sp1,constraints1);
mainPanel.add(sp1);
styleList=new JList(allFontStyles);
JScrollPane sp2=new JScrollPane(styleList);
buildConstraints(constraints1,1,0,1,1,30,0);
gridBag1.setConstraints(sp2,constraints1);
mainPanel.add(sp2);
sizeList=new JList(allFontSizes);
JScrollPane sp3=new JScrollPane(sizeList);
buildConstraints(constraints1,2,0,1,1,25,0);
gridBag1.setConstraints(sp3,constraints1);
mainPanel.add(sp3);
//ok, cancel, reset buttons
JPanel btPanel=new JPanel();
btPanel.setLayout(new FlowLayout());
okBt=new JButton("OK");
okBt.addActionListener(this);
btPanel.add(okBt);
cancelBt=new JButton("Cancel");
cancelBt.addActionListener(this);
btPanel.add(cancelBt);
//main components
GridBagLayout gridBag=new GridBagLayout();
GridBagConstraints constraints=new GridBagConstraints();
cp.setLayout(gridBag);
constraints.fill=GridBagConstraints.BOTH;
constraints.anchor=GridBagConstraints.CENTER;
buildConstraints(constraints,0,0,1,1,100,99);
gridBag.setConstraints(mainPanel,constraints);
cp.add(mainPanel);
buildConstraints(constraints,0,1,1,1,100,1);
gridBag.setConstraints(btPanel,constraints);
cp.add(btPanel);
this.setSize(350,200);
this.setResizable(false);
familyList.setSelectedValue(DEFAULT_FAMILY,true);
if (DEFAULT_STYLE==Font.PLAIN){styleList.setSelectedValue("Plain",true);}
else if (DEFAULT_STYLE==Font.BOLD){styleList.setSelectedValue("Bold",true);}
else if (DEFAULT_STYLE==Font.ITALIC){styleList.setSelectedValue("Italic",true);}
else if (DEFAULT_STYLE==Font.BOLD+Font.ITALIC){styleList.setSelectedValue("BoldItalic",true);}
sizeList.setSelectedValue((new Integer(DEFAULT_SIZE)).toString(),true);
}
public void actionPerformed(ActionEvent e){
Object source=e.getSource();
if (source==okBt){
ft.setFont(getSelectedFont());
this.dispose();
}
else if (source==cancelBt){
ft.setFont(null);
this.dispose();
}
}
Font getSelectedFont(){
String family=(String)familyList.getSelectedValue();if (family==null){family=DEFAULT_FAMILY;}
String selectedStyle=(String)styleList.getSelectedValue();
int style;
if (selectedStyle.equals("Bold")){style=Font.BOLD;}
else if (selectedStyle.equals("Italic")){style=Font.ITALIC;}
else if (selectedStyle.equals("BoldItalic")){style=Font.BOLD+Font.ITALIC;}
else {style=Font.PLAIN;}//"Plain"
int size;
try {
String selectedSize=(String)sizeList.getSelectedValue();
size=Integer.parseInt(selectedSize);
if (size<=0){size=DEFAULT_SIZE;}
}
catch (NumberFormatException ex){size=DEFAULT_SIZE;}
return new Font(family,style,size);
}
static void buildConstraints(GridBagConstraints gbc, int gx,int gy,int gw,int gh,int wx,int wy){
gbc.gridx=gx;
gbc.gridy=gy;
gbc.gridwidth=gw;
gbc.gridheight=gh;
gbc.weightx=wx;
gbc.weighty=wy;
}
static class Closer extends WindowAdapter {
public void windowClosing(WindowEvent e) {
Window w = e.getWindow();
w.setVisible(false);
}
}
static class DisposeOnClose extends ComponentAdapter {
public void componentHidden(ComponentEvent e) {
Window w = (Window)e.getComponent();
w.dispose();
}
}
public static String getFontStyleName(int i){
if (i==java.awt.Font.BOLD){return "Bold";}
else if (i==java.awt.Font.ITALIC){return "Italic";}
else if (i==java.awt.Font.BOLD+java.awt.Font.ITALIC){return "BoldItalic";}
else {return "Plain";}
}
}
class FontTracker {
Font font;
public void setFont(Font f){
font=f;
}
public Font getFont() {
return font;
}
}