ca55a75931e923e54c3cc0d6ce2a7431da862c3a
[scilab.git] / scilab / modules / preferences / src / java / org / scilab / modules / preferences / Component / FontSelector.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.preferences.Component;
14
15 import java.awt.Dimension;
16 import java.awt.Font;
17 import java.awt.event.ActionEvent;
18 import java.awt.event.ActionListener;
19
20 import javax.swing.GroupLayout;
21 import javax.swing.JButton;
22 import javax.swing.JFrame;
23 import javax.swing.JTextField;
24 import javax.swing.JPanel;
25 import javax.swing.SwingConstants;
26 import javax.swing.SwingUtilities;
27
28 import org.w3c.dom.Node;
29
30 import org.scilab.modules.gui.bridge.fontchooser.SwingScilabFontChooser;
31 import org.scilab.modules.preferences.XChooser;
32 import org.scilab.modules.preferences.XCommonManager;
33 import org.scilab.modules.preferences.XComponent;
34 import org.scilab.modules.preferences.XConfigManager;
35
36 /**
37  * Implementation of Label compliant with extended management.
38  *
39  * @author Calixte DENIZET
40  *
41  */
42 public class FontSelector extends Panel implements XComponent, XChooser {
43
44     /** Universal identifier for serialization.
45      *
46      */
47     private static final long serialVersionUID = -4842434795956015959L;
48     private ActionListener actionListener;
49     private JTextField textField;
50     private JButton button;
51     private Font font = new Font("Monospaced", Font.PLAIN, 12);
52     private int defaultSize;
53
54     /** Define the set of actuators.
55      *
56      * @return array of actuator names.
57      */
58     public final String [] actuators() {
59         return new String[] {"font-name", "font-face", "font-size", "enable"};
60     }
61
62     /** Constructor.
63      *
64      * @param peer : associated view DOM node.
65      */
66     public FontSelector(final Node peer) {
67         super(peer);
68         GroupLayout layout = new GroupLayout(this);
69         setLayout(layout);
70
71         textField = new JTextField();
72         defaultSize = textField.getFont().getSize();
73         textField.setEditable(false);
74
75         button = new JButton("...");
76         button.addActionListener(new ActionListener() {
77             public void actionPerformed(ActionEvent e) {
78                 JFrame frame = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, FontSelector.this);
79                 SwingScilabFontChooser fontChooser = new SwingScilabFontChooser(frame, font, false);
80                 fontChooser.setLocationRelativeTo(frame);
81                 fontChooser.displayAndWait();
82
83                 Font newFont = fontChooser.getSelectedFont();
84                 if (newFont != null && !newFont.equals(font)) {
85                     font = newFont;
86                     setTextField();
87                     if (actionListener != null) {
88                         actionListener.actionPerformed(new ActionEvent(FontSelector.this, 0, "Font Selector Value changed", System.currentTimeMillis(), 0));
89                     }
90                 }
91             }
92         });
93
94         layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(textField).addComponent(button));
95         layout.setVerticalGroup(layout.createParallelGroup().addComponent(textField).addComponent(button));
96
97         setRequestFocusEnabled(true);
98         setFocusable(true);
99
100         String fontname = XConfigManager.getAttribute(peer , "font-name");
101         fontname(fontname);
102
103         String fontface = XConfigManager.getAttribute(peer , "font-face");
104         fontface(fontface);
105
106         String fontsize = XConfigManager.getAttribute(peer , "font-size");
107         fontsize(fontsize);
108     }
109
110     private void setTextField() {
111         textField.setFont(font.deriveFont((float) defaultSize));
112         textField.setText(fontname() + " " + fontsize() + " " + fontface());
113     }
114
115     /** Refresh the component by the use of actuators.
116      *
117      * @param peer the corresponding view DOM node
118      */
119     public void refresh(final Node peer) {
120         String fontname = XConfigManager.getAttribute(peer , "font-name");
121         if (!fontname.equals(fontname())) {
122             fontname(fontname);
123         }
124
125         String fontface = XConfigManager.getAttribute(peer , "font-face");
126         if (!fontface.equals(fontface())) {
127             fontface(fontface);
128         }
129
130         String fontsize = XConfigManager.getAttribute(peer , "font-size");
131         if (!fontsize.equals(fontsize())) {
132             fontsize(fontsize);
133         }
134
135         String enable = XConfigManager.getAttribute(peer , "enable", "true");
136         textField.setEnabled(enable.equals("true"));
137         button.setEnabled(enable.equals("true"));
138     }
139
140     public Dimension getMaximumSize() {
141         return getPreferredSize();
142     }
143
144     /** Sensor for 'font-size' attribute.
145      *
146      * @return the attribute value.
147      */
148     public final String fontsize() {
149         return Integer.toString(font.getSize());
150     }
151
152     /** Sensor for 'font-face' attribute.
153      *
154      * @return the attribute value.
155      */
156     public final String fontface() {
157         switch (font.getStyle()) {
158             case Font.PLAIN :
159                 return "plain";
160             case Font.BOLD :
161                 return "bold";
162             case Font.ITALIC :
163                 return "italic";
164             case Font.BOLD | Font.ITALIC :
165                 return "bold italic";
166             default :
167                 return "plain";
168         }
169     }
170
171     /** Sensor for 'font-name' attribute.
172      *
173      * @return the attribute value.
174      */
175     public final String fontname() {
176         return font.getName();
177     }
178
179     /** Actuator for 'font-size' attribute.
180      *
181      * @param text : the attribute value.
182      */
183     public final void fontsize(String fontsize) {
184         if (!fontsize.equals(XCommonManager.NAV) && !fontsize.equals("")) {
185             try {
186                 int size = Integer.parseInt(fontsize);
187                 font = font.deriveFont((float) size);
188                 setTextField();
189             } catch (NumberFormatException e) { }
190         }
191     }
192
193     /** Actuator for 'font-face' attribute.
194      *
195      * @param text : the attribute value.
196      */
197     public final void fontface(String fontface) {
198         if (!fontface.equals(XCommonManager.NAV) && !fontface.equals("")) {
199             int style = Font.PLAIN;
200             if (fontface.equalsIgnoreCase("bold")) {
201                 style = Font.BOLD;
202             } else if (fontface.equalsIgnoreCase("italic")) {
203                 style = Font.ITALIC;
204             } else if (fontface.equalsIgnoreCase("bold italic")) {
205                 style = Font.BOLD | Font.ITALIC;
206             }
207             font = font.deriveFont(style);
208             setTextField();
209         }
210     }
211
212     /** Actuator for 'font-name' attribute.
213      *
214      * @param text : the attribute value.
215      */
216     public final void fontname(String fontname) {
217         if (!fontname.equals(XCommonManager.NAV) && !fontname.equals("")) {
218             font = new Font(fontname, font.getStyle(), font.getSize());
219             setTextField();
220         }
221     }
222
223     /** Actual response read by the listener.
224      *
225      * @return response read by the listener.
226      */
227     public final Object choose() {
228         return new String[] {fontname(), fontface(), fontsize()};
229     }
230
231
232     public void addActionListener(ActionListener actionListener) {
233         this.actionListener = actionListener;
234     }
235
236     /** Developer serialization method.
237      *
238      * @return equivalent signature.
239      */
240     public final String toString() {
241         StringBuilder signature = new StringBuilder("FontSelector");
242
243         if (!fontname().equals(XConfigManager.NAV)) {
244             signature.append(" font-name='");
245             signature.append(fontname());
246             signature.append("'");
247         }
248
249         if (!fontface().equals(XConfigManager.NAV)) {
250             signature.append(" font-face='");
251             signature.append(fontface());
252             signature.append("'");
253         }
254
255         if (!fontsize().equals(XConfigManager.NAV)) {
256             signature.append(" font-size='");
257             signature.append(fontsize());
258             signature.append("'");
259         }
260
261         return signature.toString();
262     }
263 }