JFontChooser.java
001 /*  JFontChooser.java
002  *
003  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
004  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
005  *
006  *  This file is part of GATE (see http://gate.ac.uk/), and is free
007  *  software, licenced under the GNU Library General Public License,
008  *  Version 2, June 1991 (in the distribution as file licence.html,
009  *  and also available at http://gate.ac.uk/gate/licence.html).
010  *
011  *  Valentin Tablan 06/04/2001
012  *
013  *  $Id: JFontChooser.java 17865 2014-04-18 08:45:27Z markagreenwood $
014  *
015  */
016 
017 package gate.swing;
018 
019 import java.awt.Component;
020 import java.awt.Dialog;
021 import java.awt.Dimension;
022 import java.awt.Font;
023 import java.awt.Frame;
024 import java.awt.GraphicsEnvironment;
025 import java.awt.Window;
026 import java.awt.event.ActionEvent;
027 import java.awt.event.ActionListener;
028 import java.awt.event.ComponentAdapter;
029 import java.awt.event.ComponentEvent;
030 import java.awt.font.TextAttribute;
031 import java.util.HashMap;
032 import java.util.Map;
033 
034 import javax.swing.BorderFactory;
035 import javax.swing.Box;
036 import javax.swing.BoxLayout;
037 import javax.swing.JButton;
038 import javax.swing.JCheckBox;
039 import javax.swing.JComboBox;
040 import javax.swing.JDialog;
041 import javax.swing.JFrame;
042 import javax.swing.JPanel;
043 import javax.swing.JTextArea;
044 import javax.swing.SwingUtilities;
045 import javax.swing.UIManager;
046 
047 @SuppressWarnings("serial")
048 public class JFontChooser extends JPanel {
049 
050   public JFontChooser(){
051     this(UIManager.getFont("Button.font"));
052   }
053 
054   public JFontChooser(Font initialFont){
055     initLocalData();
056     initGuiComponents();
057     initListeners();
058     setFontValue(initialFont);
059   }// public JFontChooser(Font initialFont)
060 
061   public static Font showDialog(Component parent, String title,
062                                 Font initialfont){
063 
064     Window windowParent;
065     if(parent instanceof WindowwindowParent = (Window)parent;
066     else windowParent = SwingUtilities.getWindowAncestor(parent);
067     if(windowParent == nullthrow new IllegalArgumentException(
068       "The supplied parent component has no window ancestor");
069     final JDialog dialog;
070     if(windowParent instanceof Framedialog = new JDialog((Frame)windowParent,
071                                                            title, true);
072     else dialog = new JDialog((Dialog)windowParent, title, true);
073 
074     dialog.getContentPane().setLayout(new BoxLayout(dialog.getContentPane(),
075                                                     BoxLayout.Y_AXIS));
076 
077     final JFontChooser fontChooser = new JFontChooser(initialfont);
078     dialog.getContentPane().add(fontChooser);
079 
080     JButton okBtn = new JButton("OK");
081     JButton cancelBtn = new JButton("Cancel");
082     JPanel buttonsBox = new JPanel();
083     buttonsBox.setLayout(new BoxLayout(buttonsBox, BoxLayout.X_AXIS));
084     buttonsBox.add(Box.createHorizontalGlue());
085     buttonsBox.add(okBtn);
086     buttonsBox.add(Box.createHorizontalStrut(30));
087     buttonsBox.add(cancelBtn);
088     buttonsBox.add(Box.createHorizontalGlue());
089     dialog.getContentPane().add(buttonsBox);
090     dialog.pack();
091     fontChooser.addComponentListener(new ComponentAdapter() {
092       @Override
093       public void componentResized(ComponentEvent e) {
094         dialog.pack();
095       }
096     });
097     okBtn.addActionListener(new ActionListener() {
098       @Override
099       public void actionPerformed(ActionEvent e) {
100         dialog.setVisible(false);
101       }
102     });
103 
104     cancelBtn.addActionListener(new ActionListener() {
105       @Override
106       public void actionPerformed(ActionEvent e) {
107         dialog.setVisible(false);
108         fontChooser.setFontValue(null);
109       }
110     });
111 
112     dialog.setVisible(true);
113 
114     return fontChooser.getFontValue();
115   }// showDialog
116 
117   protected void initLocalData() {
118 
119   }
120 
121   protected void initGuiComponents() {
122     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
123     familyCombo = new JComboBox<String>(
124                         GraphicsEnvironment.getLocalGraphicsEnvironment().
125                         getAvailableFontFamilyNames()
126                       );
127     familyCombo.setSelectedItem(UIManager.getFont("Label.font").getFamily());
128 
129     sizeCombo = new JComboBox<String>(new String[]{"6""8""10""12""14""16",
130                                               "18""20""22""24""26"});
131     sizeCombo.setSelectedItem(new Integer(
132                         UIManager.getFont("Label.font").getSize()).toString());
133 
134     italicChk = new JCheckBox("<html><i>Italic</i></html>"false);
135     boldChk = new JCheckBox("<html><i=b>Bold</b></html>"false);
136 
137     JPanel fontBox = new JPanel();
138     fontBox.setLayout(new BoxLayout(fontBox, BoxLayout.X_AXIS));
139     fontBox.add(familyCombo);
140     fontBox.add(sizeCombo);
141     fontBox.setBorder(BorderFactory.createTitledBorder(" Font "));
142     add(fontBox);
143     add(Box.createVerticalStrut(10));
144 
145     JPanel effectsBox = new JPanel();
146     effectsBox.setLayout(new BoxLayout(effectsBox, BoxLayout.X_AXIS));
147     effectsBox.add(italicChk);
148     effectsBox.add(boldChk);
149     effectsBox.setBorder(BorderFactory.createTitledBorder(" Effects "));
150     add(effectsBox);
151     add(Box.createVerticalStrut(10));
152 
153     sampleTextArea = new JTextArea("Type your sample here...");
154     JPanel samplePanel = new JPanel();
155     samplePanel.setLayout(new BoxLayout(samplePanel, BoxLayout.X_AXIS));
156     //samplePanel.add(new JScrollPane(sampleTextArea));
157     samplePanel.add(sampleTextArea);
158     samplePanel.setBorder(BorderFactory.createTitledBorder(" Sample "));
159     add(samplePanel);
160     add(Box.createVerticalStrut(10));
161   }// initGuiComponents()
162 
163   protected void initListeners(){
164     familyCombo.addActionListener(new ActionListener() {
165       @Override
166       public void actionPerformed(ActionEvent e) {
167         updateFont();
168       }
169     });
170 
171     sizeCombo.addActionListener(new ActionListener() {
172       @Override
173       public void actionPerformed(ActionEvent e) {
174         updateFont();
175       }
176     });
177 
178     boldChk.addActionListener(new ActionListener() {
179       @Override
180       public void actionPerformed(ActionEvent e) {
181         updateFont();
182       }
183     });
184 
185     italicChk.addActionListener(new ActionListener() {
186       @Override
187       public void actionPerformed(ActionEvent e) {
188         updateFont();
189       }
190     });
191   }// initListeners()
192 
193   protected void updateFont(){
194     Map<TextAttribute, Object> fontAttrs = new HashMap<TextAttribute, Object>();
195     fontAttrs.put(TextAttribute.FAMILY, familyCombo.getSelectedItem());
196     fontAttrs.put(TextAttribute.SIZE, new Float((String)sizeCombo.getSelectedItem()));
197 
198     if(boldChk.isSelected())
199       fontAttrs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
200     else fontAttrs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_REGULAR);
201 
202     if(italicChk.isSelected())
203       fontAttrs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
204     else fontAttrs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
205 
206     Font newFont = new Font(fontAttrs);
207     Font oldFont = fontValue;
208     fontValue = newFont;
209     sampleTextArea.setFont(newFont);
210     String text = sampleTextArea.getText();
211     sampleTextArea.setText("");
212     sampleTextArea.setText(text);
213     sampleTextArea.repaint(100);
214     firePropertyChange("fontValue", oldFont, newFont);
215   }//updateFont()
216 
217   /**
218    * Test code
219    */
220   public static void main(String args[]){
221     try{
222       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
223     }catch(Exception e){
224       e.printStackTrace();
225     }
226     final JFrame frame = new JFrame("Foo frame");
227     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
228     JButton btn = new JButton("Show dialog");
229     btn.addActionListener(new ActionListener() {
230       @Override
231       public void actionPerformed(ActionEvent e) {
232         System.out.println(showDialog(frame, "Fonter",
233                                       UIManager.getFont("Button.font")));
234       }
235     });
236     frame.getContentPane().add(btn);
237     frame.setSize(new Dimension(300300));
238     frame.setVisible(true);
239     System.out.println("Font: " + UIManager.getFont("Button.font"));
240     showDialog(frame, "Fonter", UIManager.getFont("Button.font"));
241   }// main
242 
243   public void setFontValue(java.awt.Font newfontValue) {
244     boldChk.setSelected(newfontValue.isBold());
245     italicChk.setSelected(newfontValue.isItalic());
246     familyCombo.setSelectedItem(newfontValue.getName());
247     sizeCombo.setSelectedItem(Integer.toString(newfontValue.getSize()));
248     this.fontValue = newfontValue;
249   }
250 
251   public java.awt.Font getFontValue() {
252     return fontValue;
253   }
254 
255   JComboBox<String> familyCombo;
256   JCheckBox italicChk;
257   JCheckBox boldChk;
258   JComboBox<String> sizeCombo;
259   JTextArea sampleTextArea;
260   private java.awt.Font fontValue;
261 }// class JFontChooser extends JPanel