]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/JFontChooser.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.ui / src / org / simantics / spreadsheet / ui / JFontChooser.java
1 package org.simantics.spreadsheet.ui;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.awt.Component;\r
5 import java.awt.Dimension;\r
6 import java.awt.Font;\r
7 import java.awt.Frame;\r
8 import java.awt.GraphicsEnvironment;\r
9 import java.awt.GridLayout;\r
10 import java.awt.event.ActionEvent;\r
11 import java.awt.event.FocusAdapter;\r
12 import java.awt.event.FocusEvent;\r
13 import java.awt.event.KeyAdapter;\r
14 import java.awt.event.KeyEvent;\r
15 import java.awt.event.WindowAdapter;\r
16 import java.awt.event.WindowEvent;\r
17 \r
18 import javax.swing.AbstractAction;\r
19 import javax.swing.Action;\r
20 import javax.swing.ActionMap;\r
21 import javax.swing.BorderFactory;\r
22 import javax.swing.BoxLayout;\r
23 import javax.swing.InputMap;\r
24 import javax.swing.JButton;\r
25 import javax.swing.JComponent;\r
26 import javax.swing.JDialog;\r
27 import javax.swing.JLabel;\r
28 import javax.swing.JList;\r
29 import javax.swing.JPanel;\r
30 import javax.swing.JScrollPane;\r
31 import javax.swing.JTextField;\r
32 import javax.swing.KeyStroke;\r
33 import javax.swing.ListSelectionModel;\r
34 import javax.swing.SwingUtilities;\r
35 import javax.swing.border.Border;\r
36 import javax.swing.event.DocumentEvent;\r
37 import javax.swing.event.DocumentListener;\r
38 import javax.swing.event.ListSelectionEvent;\r
39 import javax.swing.event.ListSelectionListener;\r
40 import javax.swing.text.BadLocationException;\r
41 import javax.swing.text.Document;\r
42 import javax.swing.text.JTextComponent;\r
43 import javax.swing.text.Position;\r
44 \r
45 /**\r
46  * The <code>JFontChooser</code> class is a swing component \r
47  * for font selection.\r
48  * This class has <code>JFileChooser</code> like APIs.\r
49  * The following code pops up a font chooser dialog.\r
50  * <pre>\r
51  *   JFontChooser fontChooser = new JFontChooser();\r
52  *   int result = fontChooser.showDialog(parent);\r
53  *   if (result == JFontChooser.OK_OPTION)\r
54  *   {\r
55  *      Font font = fontChooser.getSelectedFont(); \r
56  *      System.out.println("Selected Font : " + font); \r
57  *   }\r
58  * <pre>\r
59  **/\r
60 public class JFontChooser extends JComponent\r
61 {\r
62         private static final long serialVersionUID = -8803227254655562584L;\r
63         // class variables\r
64     /**\r
65      * Return value from <code>showDialog()</code>.\r
66      * @see #showDialog\r
67      **/\r
68     public static final int OK_OPTION = 0;\r
69     /**\r
70      * Return value from <code>showDialog()</code>.\r
71      * @see #showDialog\r
72      **/\r
73     public static final int CANCEL_OPTION = 1;\r
74     /**\r
75      * Return value from <code>showDialog()</code>.\r
76      * @see #showDialog\r
77      **/\r
78     public static final int ERROR_OPTION = -1;\r
79     private static final Font DEFAULT_SELECTED_FONT = new Font("Serif", Font.PLAIN, 12);\r
80     private static final Font DEFAULT_FONT = new Font("Dialog", Font.PLAIN, 10);\r
81     private static final int[] FONT_STYLE_CODES =\r
82     {\r
83         Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD | Font.ITALIC\r
84     };\r
85     private static final String[] DEFAULT_FONT_SIZE_STRINGS =\r
86     {\r
87         "8", "9", "10", "11", "12", "14", "16", "18", "20",\r
88         "22", "24", "26", "28", "36", "48", "72",\r
89     };\r
90 \r
91     // instance variables\r
92     protected int dialogResultValue = ERROR_OPTION;\r
93 \r
94 \r
95 \r
96     private String[] fontStyleNames = null;\r
97     private String[] fontFamilyNames = null;\r
98     private String[] fontSizeStrings = null;\r
99     private JTextField fontFamilyTextField = null;\r
100     private JTextField fontStyleTextField = null;\r
101     private JTextField fontSizeTextField = null;\r
102     private JList fontNameList = null;\r
103     private JList fontStyleList = null;\r
104     private JList fontSizeList = null;\r
105     private JPanel fontNamePanel = null;\r
106     private JPanel fontStylePanel = null;\r
107     private JPanel fontSizePanel = null;\r
108     private JPanel samplePanel = null;\r
109     private JTextField sampleText = null;\r
110 \r
111     /**\r
112      * Constructs a <code>JFontChooser</code> object.\r
113      **/\r
114     public JFontChooser()\r
115     {\r
116         this(DEFAULT_FONT_SIZE_STRINGS);\r
117     }\r
118 \r
119     /**\r
120      * Constructs a <code>JFontChooser</code> object using the given font size array.\r
121      * @param fontSizeStrings  the array of font size string.\r
122      **/\r
123     public JFontChooser(String[] fontSizeStrings)\r
124     {\r
125         if (fontSizeStrings == null)\r
126         {\r
127             fontSizeStrings = DEFAULT_FONT_SIZE_STRINGS;\r
128         }\r
129         this.fontSizeStrings = fontSizeStrings;\r
130 \r
131         JPanel selectPanel = new JPanel();\r
132         selectPanel.setLayout(new BoxLayout(selectPanel, BoxLayout.X_AXIS));\r
133         selectPanel.add(getFontFamilyPanel());\r
134         selectPanel.add(getFontStylePanel());\r
135         selectPanel.add(getFontSizePanel());\r
136 \r
137         JPanel contentsPanel = new JPanel();\r
138         contentsPanel.setLayout(new GridLayout(2, 1));\r
139         contentsPanel.add(selectPanel, BorderLayout.NORTH);\r
140         contentsPanel.add(getSamplePanel(), BorderLayout.CENTER);\r
141 \r
142         this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));\r
143         this.add(contentsPanel);\r
144         this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
145         this.setSelectedFont(DEFAULT_SELECTED_FONT);\r
146     }\r
147 \r
148     public JTextField getFontFamilyTextField()\r
149     {\r
150         if (fontFamilyTextField == null)\r
151         {\r
152             fontFamilyTextField = new JTextField();\r
153             fontFamilyTextField.addFocusListener(\r
154                 new TextFieldFocusHandlerForTextSelection(fontFamilyTextField));\r
155             fontFamilyTextField.addKeyListener(\r
156                 new TextFieldKeyHandlerForListSelectionUpDown(getFontFamilyList()));\r
157             fontFamilyTextField.getDocument().addDocumentListener(\r
158                 new ListSearchTextFieldDocumentHandler(getFontFamilyList()));\r
159             fontFamilyTextField.setFont(DEFAULT_FONT);\r
160 \r
161         }\r
162         return fontFamilyTextField;\r
163     }\r
164 \r
165     public JTextField getFontStyleTextField()\r
166     {\r
167         if (fontStyleTextField == null)\r
168         {\r
169             fontStyleTextField = new JTextField();\r
170             fontStyleTextField.addFocusListener(\r
171                 new TextFieldFocusHandlerForTextSelection(fontStyleTextField));\r
172             fontStyleTextField.addKeyListener(\r
173                 new TextFieldKeyHandlerForListSelectionUpDown(getFontStyleList()));\r
174             fontStyleTextField.getDocument().addDocumentListener(\r
175                 new ListSearchTextFieldDocumentHandler(getFontStyleList()));\r
176             fontStyleTextField.setFont(DEFAULT_FONT);\r
177         }\r
178         return fontStyleTextField;\r
179     }\r
180 \r
181     public JTextField getFontSizeTextField()\r
182     {\r
183         if (fontSizeTextField == null)\r
184         {\r
185             fontSizeTextField = new JTextField();\r
186             fontSizeTextField.addFocusListener(\r
187                 new TextFieldFocusHandlerForTextSelection(fontSizeTextField));\r
188             fontSizeTextField.addKeyListener(\r
189                 new TextFieldKeyHandlerForListSelectionUpDown(getFontSizeList()));\r
190             fontSizeTextField.getDocument().addDocumentListener(\r
191                 new ListSearchTextFieldDocumentHandler(getFontSizeList()));\r
192             fontSizeTextField.setFont(DEFAULT_FONT);\r
193         }\r
194         return fontSizeTextField;\r
195     }\r
196 \r
197     public JList getFontFamilyList()\r
198     {\r
199         if (fontNameList == null)\r
200         {\r
201             fontNameList = new JList(getFontFamilies());\r
202             fontNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
203             fontNameList.addListSelectionListener(\r
204                 new ListSelectionHandler(getFontFamilyTextField()));\r
205             fontNameList.setSelectedIndex(0);\r
206             fontNameList.setFont(DEFAULT_FONT);\r
207             fontNameList.setFocusable(false);\r
208         }\r
209         return fontNameList;\r
210     }\r
211 \r
212     public JList getFontStyleList()\r
213     {\r
214         if (fontStyleList == null)\r
215         {\r
216             fontStyleList = new JList(getFontStyleNames());\r
217             fontStyleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
218             fontStyleList.addListSelectionListener(\r
219                 new ListSelectionHandler(getFontStyleTextField()));\r
220             fontStyleList.setSelectedIndex(0);\r
221             fontStyleList.setFont(DEFAULT_FONT);\r
222             fontStyleList.setFocusable(false);\r
223         }\r
224         return fontStyleList;\r
225     }\r
226 \r
227     public JList getFontSizeList()\r
228     {\r
229         if (fontSizeList == null)\r
230         {\r
231             fontSizeList = new JList(this.fontSizeStrings);\r
232             fontSizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
233             fontSizeList.addListSelectionListener(\r
234                 new ListSelectionHandler(getFontSizeTextField()));\r
235             fontSizeList.setSelectedIndex(0);\r
236             fontSizeList.setFont(DEFAULT_FONT);\r
237             fontSizeList.setFocusable(false);\r
238         }\r
239         return fontSizeList;\r
240     }\r
241 \r
242     /**\r
243      * Get the family name of the selected font.\r
244      * @return  the font family of the selected font.\r
245      *\r
246      * @see #setSelectedFontFamily\r
247      **/\r
248     public String getSelectedFontFamily()\r
249     {\r
250         String fontName = (String) getFontFamilyList().getSelectedValue();\r
251         return fontName;\r
252     }\r
253 \r
254     /**\r
255      * Get the style of the selected font.\r
256      * @return  the style of the selected font.\r
257      *          <code>Font.PLAIN</code>, <code>Font.BOLD</code>,\r
258      *          <code>Font.ITALIC</code>, <code>Font.BOLD|Font.ITALIC</code>\r
259      *\r
260      * @see java.awt.Font#PLAIN\r
261      * @see java.awt.Font#BOLD\r
262      * @see java.awt.Font#ITALIC\r
263      * @see #setSelectedFontStyle\r
264      **/\r
265     public int getSelectedFontStyle()\r
266     {\r
267         int index = getFontStyleList().getSelectedIndex();\r
268         return FONT_STYLE_CODES[index];\r
269     }\r
270 \r
271     /**\r
272      * Get the size of the selected font.\r
273      * @return  the size of the selected font\r
274      *\r
275      * @see #setSelectedFontSize\r
276      **/\r
277     public int getSelectedFontSize()\r
278     {\r
279         int fontSize = 1;\r
280         String fontSizeString = getFontSizeTextField().getText();\r
281         while (true)\r
282         {\r
283             try\r
284             {\r
285                 fontSize = Integer.parseInt(fontSizeString);\r
286                 break;\r
287             }\r
288             catch (NumberFormatException e)\r
289             {\r
290                 fontSizeString = (String) getFontSizeList().getSelectedValue();\r
291                 getFontSizeTextField().setText(fontSizeString);\r
292             }\r
293         }\r
294 \r
295         return fontSize;\r
296     }\r
297 \r
298     /**\r
299      * Get the selected font.\r
300      * @return  the selected font\r
301      *\r
302      * @see #setSelectedFont\r
303      * @see java.awt.Font\r
304      **/\r
305     public Font getSelectedFont()\r
306     {\r
307         Font font = new Font(getSelectedFontFamily(),\r
308             getSelectedFontStyle(), getSelectedFontSize());\r
309         return font;\r
310     }\r
311 \r
312     /**\r
313      * Set the family name of the selected font.\r
314      * @param name  the family name of the selected font. \r
315      *\r
316      * @see getSelectedFontFamily\r
317      **/\r
318     public void setSelectedFontFamily(String name)\r
319     {\r
320         String[] names = getFontFamilies();\r
321         for (int i = 0; i < names.length; i++)\r
322         {\r
323             if (names[i].toLowerCase().equals(name.toLowerCase()))\r
324             {\r
325                 getFontFamilyList().setSelectedIndex(i);\r
326                 break;\r
327             }\r
328         }\r
329         updateSampleFont();\r
330     }\r
331 \r
332     /**\r
333      * Set the style of the selected font.\r
334      * @param style  the size of the selected font.\r
335      *               <code>Font.PLAIN</code>, <code>Font.BOLD</code>,\r
336      *               <code>Font.ITALIC</code>, or\r
337      *               <code>Font.BOLD|Font.ITALIC</code>.\r
338      *\r
339      * @see java.awt.Font#PLAIN\r
340      * @see java.awt.Font#BOLD\r
341      * @see java.awt.Font#ITALIC\r
342      * @see #getSelectedFontStyle\r
343      **/\r
344     public void setSelectedFontStyle(int style)\r
345     {\r
346         for (int i = 0; i < FONT_STYLE_CODES.length; i++)\r
347         {\r
348             if (FONT_STYLE_CODES[i] == style)\r
349             {\r
350                 getFontStyleList().setSelectedIndex(i);\r
351                 break;\r
352             }\r
353         }\r
354         updateSampleFont();\r
355     }\r
356 \r
357     /**\r
358      * Set the size of the selected font.\r
359      * @param size the size of the selected font\r
360      *\r
361      * @see #getSelectedFontSize\r
362      **/\r
363     public void setSelectedFontSize(int size)\r
364     {\r
365         String sizeString = String.valueOf(size);\r
366         for (int i = 0; i < this.fontSizeStrings.length; i++)\r
367         {\r
368             if (this.fontSizeStrings[i].equals(sizeString))\r
369             {\r
370                 getFontSizeList().setSelectedIndex(i);\r
371                 break;\r
372             }\r
373         }\r
374         getFontSizeTextField().setText(sizeString);\r
375         updateSampleFont();\r
376     }\r
377 \r
378     /**\r
379      * Set the selected font.\r
380      * @param font the selected font\r
381      *\r
382      * @see #getSelectedFont\r
383      * @see java.awt.Font\r
384      **/\r
385     public void setSelectedFont(Font font)\r
386     {\r
387         setSelectedFontFamily(font.getFamily());\r
388         setSelectedFontStyle(font.getStyle());\r
389         setSelectedFontSize(font.getSize());\r
390     }\r
391 \r
392     public String getVersionString()\r
393     {\r
394         return ("Version");\r
395     }\r
396 \r
397     /**\r
398      *  Show font selection dialog.\r
399      *  @param parent Dialog's Parent component.\r
400      *  @return OK_OPTION, CANCEL_OPTION or ERROR_OPTION\r
401      *\r
402      *  @see #OK_OPTION \r
403      *  @see #CANCEL_OPTION\r
404      *  @see #ERROR_OPTION\r
405      **/\r
406     public int showDialog(Component parent)\r
407     {\r
408         dialogResultValue = ERROR_OPTION;\r
409         JDialog dialog = createDialog(parent);\r
410         dialog.addWindowListener(new WindowAdapter()\r
411         {\r
412             public void windowClosing(WindowEvent e)\r
413             {\r
414                 dialogResultValue = CANCEL_OPTION;\r
415             }\r
416         });\r
417 \r
418         dialog.setVisible(true);\r
419         dialog.dispose();\r
420         dialog = null;\r
421 \r
422         return dialogResultValue;\r
423     }\r
424 \r
425     protected class ListSelectionHandler implements ListSelectionListener\r
426     {\r
427         private JTextComponent textComponent;\r
428 \r
429         ListSelectionHandler(JTextComponent textComponent)\r
430         {\r
431             this.textComponent = textComponent;\r
432         }\r
433 \r
434         public void valueChanged(ListSelectionEvent e)\r
435         {\r
436             if (e.getValueIsAdjusting() == false)\r
437             {\r
438                 JList list = (JList) e.getSource();\r
439                 String selectedValue = (String) list.getSelectedValue();\r
440 \r
441                 String oldValue = textComponent.getText();\r
442                 textComponent.setText(selectedValue);\r
443                 if (!oldValue.equalsIgnoreCase(selectedValue))\r
444                 {\r
445                     textComponent.selectAll();\r
446                     textComponent.requestFocus();\r
447                 }\r
448 \r
449                 updateSampleFont();\r
450             }\r
451         }\r
452     }\r
453 \r
454     protected class TextFieldFocusHandlerForTextSelection extends FocusAdapter\r
455     {\r
456         private JTextComponent textComponent;\r
457 \r
458         public TextFieldFocusHandlerForTextSelection(JTextComponent textComponent)\r
459         {\r
460             this.textComponent = textComponent;\r
461         }\r
462 \r
463         public void focusGained(FocusEvent e)\r
464         {\r
465             textComponent.selectAll();\r
466         }\r
467 \r
468         public void focusLost(FocusEvent e)\r
469         {\r
470             textComponent.select(0, 0);\r
471             updateSampleFont();\r
472         }\r
473     }\r
474 \r
475     protected class TextFieldKeyHandlerForListSelectionUpDown extends KeyAdapter\r
476     {\r
477         private JList targetList;\r
478 \r
479         public TextFieldKeyHandlerForListSelectionUpDown(JList list)\r
480         {\r
481             this.targetList = list;\r
482         }\r
483 \r
484         public void keyPressed(KeyEvent e)\r
485         {\r
486             int i = targetList.getSelectedIndex();\r
487             switch (e.getKeyCode())\r
488             {\r
489                 case KeyEvent.VK_UP:\r
490                     i = targetList.getSelectedIndex() - 1;\r
491                     if (i < 0)\r
492                     {\r
493                         i = 0;\r
494                     }\r
495                     targetList.setSelectedIndex(i);\r
496                     break;\r
497                 case KeyEvent.VK_DOWN:\r
498                     int listSize = targetList.getModel().getSize();\r
499                     i = targetList.getSelectedIndex() + 1;\r
500                     if (i >= listSize)\r
501                     {\r
502                         i = listSize - 1;\r
503                     }\r
504                     targetList.setSelectedIndex(i);\r
505                     break;\r
506                 default:\r
507                     break;\r
508             }\r
509         }\r
510     }\r
511 \r
512     protected class ListSearchTextFieldDocumentHandler implements DocumentListener\r
513     {\r
514         JList targetList;\r
515 \r
516         public ListSearchTextFieldDocumentHandler(JList targetList)\r
517         {\r
518             this.targetList = targetList;\r
519         }\r
520 \r
521         public void insertUpdate(DocumentEvent e)\r
522         {\r
523             update(e);\r
524         }\r
525 \r
526         public void removeUpdate(DocumentEvent e)\r
527         {\r
528             update(e);\r
529         }\r
530 \r
531         public void changedUpdate(DocumentEvent e)\r
532         {\r
533             update(e);\r
534         }\r
535 \r
536         private void update(DocumentEvent event)\r
537         {\r
538             String newValue = "";\r
539             try\r
540             {\r
541                 Document doc = event.getDocument();\r
542                 newValue = doc.getText(0, doc.getLength());\r
543             }\r
544             catch (BadLocationException e)\r
545             {\r
546                 e.printStackTrace();\r
547             }\r
548 \r
549             if (newValue.length() > 0)\r
550             {\r
551                 int index = targetList.getNextMatch(newValue, 0, Position.Bias.Forward);\r
552                 if (index < 0)\r
553                 {\r
554                     index = 0;\r
555                 }\r
556                 targetList.ensureIndexIsVisible(index);\r
557 \r
558                 String matchedName = targetList.getModel().getElementAt(index).toString();\r
559                 if (newValue.equalsIgnoreCase(matchedName))\r
560                 {\r
561                     if (index != targetList.getSelectedIndex())\r
562                     {\r
563                         SwingUtilities.invokeLater(new ListSelector(index));\r
564                     }\r
565                 }\r
566             }\r
567         }\r
568 \r
569         public class ListSelector implements Runnable\r
570         {\r
571             private int index;\r
572 \r
573             public ListSelector(int index)\r
574             {\r
575                 this.index = index;\r
576             }\r
577 \r
578             public void run()\r
579             {\r
580                 targetList.setSelectedIndex(this.index);\r
581             }\r
582         }\r
583     }\r
584 \r
585     protected class DialogOKAction extends AbstractAction\r
586     {\r
587         protected static final String ACTION_NAME = "OK";\r
588         private JDialog dialog;\r
589 \r
590         protected DialogOKAction(JDialog dialog)\r
591         {\r
592             this.dialog = dialog;\r
593             putValue(Action.DEFAULT, ACTION_NAME);\r
594             putValue(Action.ACTION_COMMAND_KEY, ACTION_NAME);\r
595             putValue(Action.NAME, (ACTION_NAME));\r
596         }\r
597 \r
598         public void actionPerformed(ActionEvent e)\r
599         {\r
600             dialogResultValue = OK_OPTION;\r
601             dialog.setVisible(false);\r
602         }\r
603     }\r
604 \r
605     protected class DialogCancelAction extends AbstractAction\r
606     {\r
607         protected static final String ACTION_NAME = "Cancel";\r
608         private JDialog dialog;\r
609 \r
610         protected DialogCancelAction(JDialog dialog)\r
611         {\r
612             this.dialog = dialog;\r
613             putValue(Action.DEFAULT, ACTION_NAME);\r
614             putValue(Action.ACTION_COMMAND_KEY, ACTION_NAME);\r
615             putValue(Action.NAME, (ACTION_NAME));\r
616         }\r
617 \r
618         public void actionPerformed(ActionEvent e)\r
619         {\r
620             dialogResultValue = CANCEL_OPTION;\r
621             dialog.setVisible(false);\r
622         }\r
623     }\r
624 \r
625     protected JDialog createDialog(Component parent)\r
626     {\r
627         Frame frame = parent instanceof Frame ? (Frame) parent\r
628             : (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);\r
629         JDialog dialog = new JDialog(frame, ("Select Font"), true);\r
630 \r
631         Action okAction = new DialogOKAction(dialog);\r
632         Action cancelAction = new DialogCancelAction(dialog);\r
633 \r
634         JButton okButton = new JButton(okAction);\r
635         okButton.setFont(DEFAULT_FONT);\r
636         JButton cancelButton = new JButton(cancelAction);\r
637         cancelButton.setFont(DEFAULT_FONT);\r
638 \r
639         JPanel buttonsPanel = new JPanel();\r
640         buttonsPanel.setLayout(new GridLayout(2, 1));\r
641         buttonsPanel.add(okButton);\r
642         buttonsPanel.add(cancelButton);\r
643         buttonsPanel.setBorder(BorderFactory.createEmptyBorder(25, 0, 10, 10));\r
644 \r
645         ActionMap actionMap = buttonsPanel.getActionMap();\r
646         actionMap.put(cancelAction.getValue(Action.DEFAULT), cancelAction);\r
647         actionMap.put(okAction.getValue(Action.DEFAULT), okAction);\r
648         InputMap inputMap = buttonsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);\r
649         inputMap.put(KeyStroke.getKeyStroke("ESCAPE"), cancelAction.getValue(Action.DEFAULT));\r
650         inputMap.put(KeyStroke.getKeyStroke("ENTER"), okAction.getValue(Action.DEFAULT));\r
651 \r
652         JPanel dialogEastPanel = new JPanel();\r
653         dialogEastPanel.setLayout(new BorderLayout());\r
654         dialogEastPanel.add(buttonsPanel, BorderLayout.NORTH);\r
655 \r
656         dialog.getContentPane().add(this, BorderLayout.CENTER);\r
657         dialog.getContentPane().add(dialogEastPanel, BorderLayout.EAST);\r
658         dialog.pack();\r
659         dialog.setLocationRelativeTo(frame);\r
660         return dialog;\r
661     }\r
662 \r
663     protected void updateSampleFont()\r
664     {\r
665         Font font = getSelectedFont();\r
666         getSampleTextField().setFont(font);\r
667     }\r
668 \r
669     protected JPanel getFontFamilyPanel()\r
670     {\r
671         if (fontNamePanel == null)\r
672         {\r
673             fontNamePanel = new JPanel();\r
674             fontNamePanel.setLayout(new BorderLayout());\r
675             fontNamePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
676             fontNamePanel.setPreferredSize(new Dimension(180, 130));\r
677 \r
678             JScrollPane scrollPane = new JScrollPane(getFontFamilyList());\r
679             scrollPane.getVerticalScrollBar().setFocusable(false);\r
680             scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);\r
681 \r
682             JPanel p = new JPanel();\r
683             p.setLayout(new BorderLayout());\r
684             p.add(getFontFamilyTextField(), BorderLayout.NORTH);\r
685             p.add(scrollPane, BorderLayout.CENTER);\r
686 \r
687             JLabel label = new JLabel(("Font Name"));\r
688             label.setHorizontalAlignment(JLabel.LEFT);\r
689             label.setHorizontalTextPosition(JLabel.LEFT);\r
690             label.setLabelFor(getFontFamilyTextField());\r
691             label.setDisplayedMnemonic('F');\r
692 \r
693             fontNamePanel.add(label, BorderLayout.NORTH);\r
694             fontNamePanel.add(p, BorderLayout.CENTER);\r
695 \r
696         }\r
697         return fontNamePanel;\r
698     }\r
699 \r
700     protected JPanel getFontStylePanel()\r
701     {\r
702         if (fontStylePanel == null)\r
703         {\r
704             fontStylePanel = new JPanel();\r
705             fontStylePanel.setLayout(new BorderLayout());\r
706             fontStylePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
707             fontStylePanel.setPreferredSize(new Dimension(140, 130));\r
708 \r
709             JScrollPane scrollPane = new JScrollPane(getFontStyleList());\r
710             scrollPane.getVerticalScrollBar().setFocusable(false);\r
711             scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);\r
712 \r
713             JPanel p = new JPanel();\r
714             p.setLayout(new BorderLayout());\r
715             p.add(getFontStyleTextField(), BorderLayout.NORTH);\r
716             p.add(scrollPane, BorderLayout.CENTER);\r
717 \r
718             JLabel label = new JLabel(("Font Style"));\r
719             label.setHorizontalAlignment(JLabel.LEFT);\r
720             label.setHorizontalTextPosition(JLabel.LEFT);\r
721             label.setLabelFor(getFontStyleTextField());\r
722             label.setDisplayedMnemonic('Y');\r
723 \r
724             fontStylePanel.add(label, BorderLayout.NORTH);\r
725             fontStylePanel.add(p, BorderLayout.CENTER);\r
726         }\r
727         return fontStylePanel;\r
728     }\r
729 \r
730     protected JPanel getFontSizePanel()\r
731     {\r
732         if (fontSizePanel == null)\r
733         {\r
734             fontSizePanel = new JPanel();\r
735             fontSizePanel.setLayout(new BorderLayout());\r
736             fontSizePanel.setPreferredSize(new Dimension(70, 130));\r
737             fontSizePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
738 \r
739             JScrollPane scrollPane = new JScrollPane(getFontSizeList());\r
740             scrollPane.getVerticalScrollBar().setFocusable(false);\r
741             scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);\r
742 \r
743             JPanel p = new JPanel();\r
744             p.setLayout(new BorderLayout());\r
745             p.add(getFontSizeTextField(), BorderLayout.NORTH);\r
746             p.add(scrollPane, BorderLayout.CENTER);\r
747 \r
748             JLabel label = new JLabel(("Font Size"));\r
749             label.setHorizontalAlignment(JLabel.LEFT);\r
750             label.setHorizontalTextPosition(JLabel.LEFT);\r
751             label.setLabelFor(getFontSizeTextField());\r
752             label.setDisplayedMnemonic('S');\r
753 \r
754             fontSizePanel.add(label, BorderLayout.NORTH);\r
755             fontSizePanel.add(p, BorderLayout.CENTER);\r
756         }\r
757         return fontSizePanel;\r
758     }\r
759 \r
760     protected JPanel getSamplePanel()\r
761     {\r
762         if (samplePanel == null)\r
763         {\r
764             Border titledBorder = BorderFactory.createTitledBorder(\r
765                 BorderFactory.createEtchedBorder(), ("Sample"));\r
766             Border empty = BorderFactory.createEmptyBorder(5, 10, 10, 10);\r
767             Border border = BorderFactory.createCompoundBorder(titledBorder, empty);\r
768 \r
769             samplePanel = new JPanel();\r
770             samplePanel.setLayout(new BorderLayout());\r
771             samplePanel.setBorder(border);\r
772 \r
773             samplePanel.add(getSampleTextField(), BorderLayout.CENTER);\r
774         }\r
775         return samplePanel;\r
776     }\r
777 \r
778     protected JTextField getSampleTextField()\r
779     {\r
780         if (sampleText == null)\r
781         {\r
782             Border lowered = BorderFactory.createLoweredBevelBorder();\r
783 \r
784             sampleText = new JTextField(("AaBbYyZz"));\r
785             sampleText.setBorder(lowered);\r
786             sampleText.setPreferredSize(new Dimension(300, 100));\r
787         }\r
788         return sampleText;\r
789     }\r
790 \r
791     protected String[] getFontFamilies()\r
792     {\r
793         if (fontFamilyNames == null)\r
794         {\r
795             GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
796             fontFamilyNames = env.getAvailableFontFamilyNames();\r
797         }\r
798         return fontFamilyNames;\r
799     }\r
800 \r
801     protected String[] getFontStyleNames()\r
802     {\r
803         if (fontStyleNames == null)\r
804         {\r
805             int i = 0;\r
806             fontStyleNames = new String[4];\r
807             fontStyleNames[i++] = ("Plain");\r
808             fontStyleNames[i++] = ("Bold");\r
809             fontStyleNames[i++] = ("Italic");\r
810             fontStyleNames[i++] = ("BoldItalic");\r
811         }\r
812         return fontStyleNames;\r
813     }\r
814 }