1 /* -------------------------------------------------------------------
2 * Java source file for the class FontEditor
3 *
4 * Copyright (c), 2002, Masahiro Takatsuka.
5 * All Rights Researved.
6 *
7 * Original Author: Masahiro Takatsuka (masa@jbeans.net)
8 * $Author: takatsukam $
9 *
10 * $Date: 2003/07/25 04:51:45 $
11 *
12 * $Id: FontEditor.java,v 1.1.1.1 2003/07/25 04:51:45 takatsukam Exp $
13 *
14 * Reference: Document no:
15 * ___ ___
16 *
17 * To Do:
18 * ___
19 *
20 ------------------------------------------------------------------- */
21
22 /* --------------------------- Package ---------------------------- */
23 package net.jbeans.bean.property.editor;
24
25 /* ------------------ Import classes (packages) ------------------- *//package-summary/html">color="#329900"> ------------------ Import classes (packages) ------------------- *//package-summary.html">color="#329900">/* ------------------ Import classes (packages) ------------------- *//package-summary.html">color="#329900"> ------------------ Import classes (packages) ------------------- */
26 import java.awt.*;
27 import java.awt.event.*;
28 import javax.swing.*;
29
30 /*====================================================================
31 Implementation of class FontEditor
32 ====================================================================*/
33 /***
34 * A Font property editor.
35 *
36 * @version $Revision: 1.1.1.1 $
37 * @author Masahiro Takatsuka (masa@jbeans.net)
38 * @see EditorSupport
39 * @see ActionListener
40 */
41
42 public final class FontEditor extends EditorSupport implements ActionListener {
43 private static final int BUTTON_WIDTH = 20;
44 private static final int BUTTON_HEIGHT = 30;
45
46 private static Dimension sButtonSize = new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT);
47
48 private String[] fonts;
49 private static int[] sPointSizes = { 3, 5, 8, 10, 12, 14, 18, 24, 36, 48 };
50 private static String[] sStyleStrings = {"plain", "italic", "bold", "bold/italic"};
51 private static int[] sStyleValues = {Font.PLAIN, Font.ITALIC, Font.BOLD, Font.BOLD | Font.ITALIC, };
52 private static final int DEMO_SIZE = 12;
53 private static Font[] sStyleFonts = {new Font("Dialog", sStyleValues[0], DEMO_SIZE),
54 new Font("Dialog", sStyleValues[1], DEMO_SIZE),
55 new Font("Dialog", sStyleValues[2], DEMO_SIZE),
56 new Font("Dialog", sStyleValues[3], DEMO_SIZE),
57 };
58
59 private int selectedStyle = Font.PLAIN;
60 private final static String SAMPLE_TEXT = "Abcde...";
61
62 // Controls
63 private JComboBox familyNameCombo;
64 private JComboBox fontSizeCombo;
65 private JComboBox fontStyleCombo;
66
67 private JToggleButton pButton, iButton, bButton, biButton;
68 private FontDisplay iDisplay, pDisplay, bDisplay, biDisplay;
69
70 private JLabel labelDisplay;
71
72 public FontEditor() {
73 this.fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
74
75 this.pDisplay = new FontDisplay(Font.PLAIN);
76 this.pButton = new JToggleButton(this.pDisplay);
77 this.pButton.setToolTipText("plain style");
78
79 this.iDisplay = new FontDisplay(Font.ITALIC);
80 this.iButton = new JToggleButton(this.iDisplay);
81 this.iButton.setToolTipText("italic style");
82
83 this.bDisplay = new FontDisplay(Font.BOLD);
84 this.bButton = new JToggleButton(this.bDisplay);
85 this.bButton.setToolTipText("bold style");
86
87 this.biDisplay = new FontDisplay(Font.BOLD | Font.ITALIC);
88 this.biButton = new JToggleButton(this.biDisplay);
89 this.biButton.setToolTipText("bold/italic style");
90
91 initializeButton(this.pButton);
92 initializeButton(this.iButton);
93 initializeButton(this.bButton);
94 initializeButton(this.biButton);
95
96 ButtonGroup group = new ButtonGroup();
97 group.add(this.pButton);
98 group.add(this.iButton);
99 group.add(this.bButton);
100 group.add(this.biButton);
101
102 // ComboBoxes
103 this.familyNameCombo = new JComboBox();
104 this.fontSizeCombo = new JComboBox();
105 this.fontStyleCombo = new JComboBox();
106
107 this.labelDisplay = new JLabel(this.fonts[0]);
108 this.labelDisplay.setAlignmentX(Component.LEFT_ALIGNMENT);
109 this.labelDisplay.setPreferredSize(new Dimension(250,30));
110 this.labelDisplay.setMinimumSize(new Dimension(250,30));
111
112 initializeComboBoxes();
113
114 // Assemble the panel.
115 JPanel p = new JPanel();
116 p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS));
117 p.add(this.familyNameCombo);
118 p.add(Box.createRigidArea(new Dimension(5,0)));
119 p.add(this.fontSizeCombo);
120 p.add(Box.createRigidArea(new Dimension(5,0)));
121 p.add(this.fontStyleCombo);
122 p.add(Box.createRigidArea(new Dimension(5,0)));
123
124 // p.add(_pButton);
125 // p.add(_iButton);
126 // p.add(_bButton);
127 // p.add(_biButton);
128 p.setAlignmentX(Component.LEFT_ALIGNMENT);
129
130 JPanel panel = new JPanel();
131 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
132 panel.add(p);
133 panel.add(this.labelDisplay);
134 setPanel(panel);
135 }
136
137 private void initializeButton(JToggleButton b) {
138 b.setBorderPainted(false);
139 b.setFocusPainted(false);
140 b.setContentAreaFilled(false);
141
142 b.setPreferredSize(sButtonSize);
143 b.setMaximumSize(sButtonSize);
144 b.setMinimumSize(sButtonSize);
145 b.addActionListener(this);
146 setAlignment(b);
147 }
148
149 private void initializeComboBoxes() {
150 for (int i = 0; i < this.fonts.length; i++)
151 this.familyNameCombo.addItem(this.fonts[i]);
152
153 this.familyNameCombo.setPreferredSize(EditorSupport.MEDIUM_DIMENSION);
154 this.familyNameCombo.setMinimumSize(EditorSupport.MEDIUM_DIMENSION);
155 this.familyNameCombo.setMaximumSize(EditorSupport.MEDIUM_DIMENSION);
156 this.familyNameCombo.addActionListener(this);
157 setAlignment(this.familyNameCombo);
158
159 for (int i = 0; i < sPointSizes.length; i++)
160 this.fontSizeCombo.addItem("" + sPointSizes[i]);
161
162 this.fontSizeCombo.setPreferredSize(EditorSupport.SMALL_DIMENSION);
163 this.fontSizeCombo.setMaximumSize(EditorSupport.SMALL_DIMENSION);
164 this.fontSizeCombo.setMinimumSize(EditorSupport.SMALL_DIMENSION);
165 this.fontSizeCombo.addActionListener(this);
166 setAlignment(this.fontSizeCombo);
167
168 for (int i = 0; i < sStyleStrings.length; i++) {
169 this.fontStyleCombo.addItem(sStyleStrings[i]);
170 }
171
172 this.fontStyleCombo.setPreferredSize(EditorSupport.MEDIUM_DIMENSION);
173 this.fontStyleCombo.setMaximumSize(EditorSupport.MEDIUM_DIMENSION);
174 this.fontStyleCombo.setMinimumSize(EditorSupport.MEDIUM_DIMENSION);
175 this.fontStyleCombo.addActionListener(this);
176 this.fontStyleCombo.setRenderer(new FontStyleRenderer());
177 setAlignment(this.fontStyleCombo);
178 }
179
180 final class FontStyleRenderer extends JLabel implements ListCellRenderer {
181 public FontStyleRenderer() {
182 setOpaque(false);
183 setVerticalAlignment(CENTER);
184 }
185
186 public final Component getListCellRendererComponent(JList list,
187 Object value,
188 int index,
189 boolean isSelected,
190 boolean cellHasFocus) {
191 if (index >= 0) {
192 setFont(sStyleFonts[index]);
193 }
194 setText(value.toString());
195 return this;
196 }
197 }
198
199
200 /***
201 * ActionListener handler for all component events.
202 */
203 public final void actionPerformed(ActionEvent evt) {
204 Object obj = evt.getSource();
205
206 if (obj instanceof AbstractButton) {
207 AbstractButton button = (AbstractButton)obj;
208 if (obj == this.pButton) {
209 this.selectedStyle = Font.PLAIN;
210 } else if (obj == this.iButton) {
211 this.selectedStyle = Font.ITALIC;
212 } else if (obj == this.bButton) {
213 this.selectedStyle = Font.BOLD;
214 } else if (obj == this.biButton) {
215 this.selectedStyle = (Font.BOLD | Font.ITALIC);
216 }
217
218 String family = (String)this.familyNameCombo.getSelectedItem();
219 int size = sPointSizes[this.fontSizeCombo.getSelectedIndex()];
220
221 setValue(new Font(family, this.selectedStyle, size));
222 }
223
224 if (obj instanceof JComboBox) {
225 String family = (String)this.familyNameCombo.getSelectedItem();
226 int size = sPointSizes[this.fontSizeCombo.getSelectedIndex()];
227 this.selectedStyle = sStyleValues[this.fontStyleCombo.getSelectedIndex()];
228
229 setValue(new Font(family, this.selectedStyle, size));
230 }
231 }
232
233 /***
234 * Reconfigure the controls to reflect the current font.
235 */
236 private void editorChangeValue(Font font){
237 if (font == null) {
238 return;
239 }
240 for (int i = 0; i < this.fonts.length; i++) {
241 if (this.fonts[i].equals(font.getName())) {
242 this.familyNameCombo.setSelectedIndex(i);
243 break;
244 }
245 }
246
247 for (int i = 0; i < sPointSizes.length; i++) {
248 if (font.getSize() <= sPointSizes[i]){
249 this.fontSizeCombo.setSelectedIndex(i);
250 break;
251 }
252 }
253
254 this.selectedStyle = font.getStyle();
255 for (int i = 0; i < sStyleValues.length; i++) {
256 if (sStyleValues[i] == this.selectedStyle) {
257 this.fontStyleCombo.setSelectedIndex(i);
258 break;
259 }
260 }
261
262 String style = "";
263 switch (this.selectedStyle) {
264 case Font.PLAIN:
265 this.pButton.setSelected(true);
266 style = "Plain";
267 break;
268 case Font.ITALIC:
269 this.iButton.setSelected(true);
270 style = "Italic";
271 break;
272 case Font.BOLD:
273 this.bButton.setSelected(true);
274 style = "Bold";
275 break;
276 }
277 String family = font.getFamily();
278
279 this.iDisplay.setFamily(family);
280 this.pDisplay.setFamily(family);
281 this.bDisplay.setFamily(family);
282 this.biDisplay.setFamily(family);
283
284 this.labelDisplay.setFont(font);
285 this.labelDisplay.setText(family + ", " + style + ", " + font.getSize());
286
287 // getPanel().revalidate();
288 getPanel().repaint();
289 }
290
291 //
292 // PropertyEditor interface definitions
293 //
294
295 public final void setValue(Object value) {
296 super.setValue(value);
297 editorChangeValue((Font)value);
298 }
299
300 public final boolean isPaintable() {
301 return true;
302 }
303
304 public final void paintValue(Graphics g, Rectangle rect) {
305 // Silent noop.
306 Font oldFont = g.getFont();
307 g.setFont((Font)getValue());
308 FontMetrics fm = g.getFontMetrics();
309 int vpad = (rect.height - fm.getAscent())/2;
310 g.drawString(SAMPLE_TEXT, 0, rect.height-vpad);
311 g.setFont(oldFont);
312 }
313
314 public final String getJavaInitializationString() {
315 Font font = (Font)getValue();
316
317 return "new java.awt.Font(\"" + font.getFamily() + "\", " +
318 font.getStyle() + ", " + font.getSize() + ")";
319 }
320
321 /***
322 * Implementation of a Icon button.
323 */
324 final class FontDisplay implements Icon {
325 private Font font;
326
327 private int style;
328 private int size = 24;
329
330 private String label;
331
332 private int iconWidth = 20;
333 private int iconHeight = 30;
334
335 public FontDisplay(int style, String label) {
336 this.style = style;
337 this.label = label;
338 this.font = new Font("Dialog", this.style, this.size);
339 }
340
341 public FontDisplay(int style) {
342 this(style, "A");
343 }
344
345 public FontDisplay() {
346 this(Font.PLAIN);
347 }
348
349 public final void setFamily(String family) {
350 this.font = new Font(family, this.style, this.size);
351 }
352
353 public final void paintIcon(Component c, Graphics g, int x, int y) {
354 JComponent component = (JComponent)c;
355
356 Font oldFont = g.getFont();
357 g.setFont(this.font);
358 if (component instanceof JToggleButton) {
359 AbstractButton b= (AbstractButton)component;
360 ButtonModel model = b.getModel();
361 if (model.isPressed() || model.isSelected()) {
362 g.setColor(Color.black); // xxx: foreground
363 } else {
364 g.setColor(Color.gray); // xxx: foreground light
365 }
366 }
367 g.drawString(this.label, x, (y + this.iconHeight) - 7);
368 g.setFont(oldFont);
369 }
370
371 public final int getIconWidth() {
372 return this.iconWidth;
373 }
374
375 public final int getIconHeight() {
376 return this.iconHeight;
377 }
378 } // end class FontDisplay
379 }
This page was automatically generated by Maven