Font Dialog from claribole
/* 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<tokens.length-3;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; } }