1   /*  ApperanceDialog.java
2    *
3    *  Copyright (c) 1998-2001, The University of Sheffield.
4    *
5    *  This file is part of GATE (see http://gate.ac.uk/), and is free
6    *  software, licenced under the GNU Library General Public License,
7    *  Version 2, June 1991 (in the distribution as file licence.html,
8    *  and also available at http://gate.ac.uk/gate/licence.html).
9    *
10   *  Valentin Tablan 12/04/2001
11   *
12   *  $Id: AppearanceDialog.java,v 1.3 2001/11/15 14:21:14 valyt Exp $
13   *
14   */
15  package gate.gui;
16  
17  import javax.swing.JDialog;
18  import javax.swing.*;
19  import javax.swing.event.*;
20  import javax.swing.plaf.FontUIResource;
21  import java.awt.*;
22  import java.awt.event.*;
23  import java.beans.*;
24  
25  import gate.swing.*;
26  import gate.*;
27  
28  public class AppearanceDialog extends JDialog {
29  
30    public AppearanceDialog(Frame owner, String title, boolean modal,
31                           Component[] targets) {
32      super(owner, title, modal);
33      this.targets = targets;
34      init();
35    }// ApperanceDialog
36  
37    public AppearanceDialog(Dialog owner, String title, boolean modal,
38                           Component[] targets) {
39      super(owner, title, modal);
40      this.targets = targets;
41      init();
42    }//ApperanceDialog
43  
44    protected void init() {
45      initLocalData();
46      initGuiComponents();
47      initListeners();
48      bGroup.setSelected(menusRBtn.getModel(), true);
49      cancelBtn.getAction().actionPerformed(null);
50    }
51  
52    protected void initLocalData() {
53      Font font = Gate.getUserConfig().getFont(GateConstants.MENUS_FONT);
54      oldMenusFont = menusFont = font == null ?
55                                 UIManager.getFont("Menu.font") :
56                                 font;
57  
58      font = Gate.getUserConfig().getFont(GateConstants.OTHER_COMPONENTS_FONT);
59      oldComponentsFont = componentsFont = font == null ?
60                                           UIManager.getFont("Button.font"):
61                                           font;
62  
63      font = Gate.getUserConfig().getFont(GateConstants.TEXT_COMPONENTS_FONT);
64      oldTextComponentsFont = textComponentsFont =
65            font == null ? UIManager.getFont("TextPane.font") : font;
66    }// initLocalData()
67  
68    protected void initGuiComponents() {
69      getContentPane().setLayout(new BoxLayout(getContentPane(),
70                                               BoxLayout.Y_AXIS));
71      //add the radio buttons
72      Box box = Box.createHorizontalBox();
73      Box tempBox = Box.createVerticalBox();
74      bGroup = new ButtonGroup();
75      menusRBtn = new JRadioButton("Menus", false);
76      menusRBtn.setActionCommand("menus");
77      bGroup.add(menusRBtn);
78      tempBox.add(menusRBtn);
79      componentsRBtn = new JRadioButton("Components", false);
80      componentsRBtn.setActionCommand("components");
81      bGroup.add(componentsRBtn);
82      tempBox.add(componentsRBtn);
83      textComponentsRBtn = new JRadioButton("Text components", false);
84      textComponentsRBtn.setActionCommand("text components");
85      bGroup.add(textComponentsRBtn);
86      tempBox.add(textComponentsRBtn);
87      box.add(tempBox);
88      box.add(Box.createHorizontalGlue());
89      getContentPane().add(box);
90  
91      //add the font chooser
92      fontChooser = new JFontChooser();
93      getContentPane().add(fontChooser);
94  
95      //add the buttons
96      box = Box.createHorizontalBox();
97      okBtn = new JButton(new OKAction());
98      box.add(okBtn);
99      cancelBtn = new JButton(new CancelAction());
100     box.add(cancelBtn);
101     applyBtn = new JButton(new ApplyAction());
102     box.add(applyBtn);
103     getContentPane().add(box);
104 
105     setResizable(false);
106 
107   }// initGuiComponents()
108 
109   protected void initListeners() {
110     fontChooser.addComponentListener(new ComponentAdapter() {
111       public void componentResized(ComponentEvent e) {
112         pack();
113      }
114     });
115 
116     menusRBtn.addActionListener(new ActionListener() {
117       public void actionPerformed(ActionEvent e) {
118         if(menusRBtn.isSelected()) fontChooser.setFontValue(menusFont);
119       }// public void actionPerformed(ActionEvent e)
120     });
121 
122     componentsRBtn.addActionListener(new ActionListener() {
123       public void actionPerformed(ActionEvent e) {
124         if(componentsRBtn.isSelected())
125           fontChooser.setFontValue(componentsFont);
126       }// public void actionPerformed(ActionEvent e)
127     });
128 
129     textComponentsRBtn.addActionListener(new ActionListener() {
130       public void actionPerformed(ActionEvent e) {
131         if(textComponentsRBtn.isSelected())
132           fontChooser.setFontValue(textComponentsFont);
133       }// public void actionPerformed(ActionEvent e)
134     });
135   }// initListeners()
136 
137   public void show(Component[] targets) {
138     this.targets = targets;
139     oldMenusFont = menusFont = UIManager.getFont("Menu.font");
140     oldComponentsFont = componentsFont = UIManager.getFont("Button.font");
141     oldTextComponentsFont = textComponentsFont =
142                             UIManager.getFont("TextPane.font");
143     super.show();
144   }// show(Component[] targets)
145 
146 
147   protected static void setUIDefaults(Object[] keys, Object value) {
148     for(int i = 0; i < keys.length; i++){
149       UIManager.put(keys[i], value);
150     }
151   }// setUIDefaults(Object[] keys, Object value)
152 
153   /**
154    * Updates the Swing defaults table with the provided font to be used for the
155    * text components
156    */
157   public static void setTextComponentsFont(Font textComponentsFont){
158     setUIDefaults(textComponentsKeys, new FontUIResource(textComponentsFont));
159     Gate.getUserConfig().put(GateConstants.TEXT_COMPONENTS_FONT,
160                              textComponentsFont);
161   }
162 
163   /**
164    * Updates the Swing defaults table with the provided font to be used for the
165    * menu components
166    */
167   public static void setMenuComponentsFont(Font menuComponentsFont){
168     setUIDefaults(menuKeys, new FontUIResource(menuComponentsFont));
169     Gate.getUserConfig().put(GateConstants.MENUS_FONT,
170                              menuComponentsFont);
171   }
172 
173   /**
174    * Updates the Swing defaults table with the provided font to be used for
175    * various compoents that neither text or menu components
176    */
177   public static void setComponentsFont(Font componentsFont){
178     setUIDefaults(componentsKeys, new FontUIResource(componentsFont));
179     Gate.getUserConfig().put(GateConstants.OTHER_COMPONENTS_FONT,
180                              componentsFont);
181   }
182 
183   /**
184    * Test code
185    */
186   public static void main(String[] args) {
187     try {
188       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
189     } catch(Exception e){
190       e.printStackTrace();
191     }
192 
193     JFrame frame = new JFrame("Foo frame");
194     final AppearanceDialog apperanceDialog1 = new AppearanceDialog(frame,
195                                                            "Font appearance",
196                                                            true,
197                                                            new Component[]{frame});
198     apperanceDialog1.pack();
199 
200     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
201     JButton btn = new JButton("Show dialog");
202     btn.addActionListener(new ActionListener() {
203       public void actionPerformed(ActionEvent e) {
204         apperanceDialog1.show();
205       }
206     });
207 
208     frame.getContentPane().add(btn);
209     frame.setSize(new Dimension(300, 300));
210     frame.setVisible(true);
211   }// public static void main(String[] args)
212 
213   JRadioButton menusRBtn;
214   JRadioButton componentsRBtn;
215   JRadioButton textComponentsRBtn;
216   JFontChooser fontChooser;
217 
218   JButton okBtn;
219   JButton applyBtn;
220   JButton cancelBtn;
221   ButtonGroup bGroup;
222 
223   Font menusFont;
224   Font componentsFont;
225   Font textComponentsFont;
226 
227   Font oldMenusFont;
228   Font oldComponentsFont;
229   Font oldTextComponentsFont;
230 
231   /**
232    * Which font is being edited now. Possible vlues: "menu", "text",
233    * "components".
234    */
235   String currentFont;
236   Component[] targets;
237 
238   public static String[] menuKeys = new String[]{"CheckBoxMenuItem.acceleratorFont",
239                                           "CheckBoxMenuItem.font",
240                                           "Menu.acceleratorFont",
241                                           "Menu.font",
242                                           "MenuBar.font",
243                                           "MenuItem.acceleratorFont",
244                                           "MenuItem.font",
245                                           "RadioButtonMenuItem.acceleratorFont",
246                                           "RadioButtonMenuItem.font"};
247 
248   public static String[] componentsKeys =
249                              new String[]{"Button.font",
250                                           "CheckBox.font",
251                                           "ColorChooser.font",
252                                           "ComboBox.font",
253                                           "InternalFrame.titleFont",
254                                           "Label.font",
255                                           "List.font",
256                                           "OptionPane.font",
257                                           "Panel.font",
258                                           "PasswordField.font",
259                                           "PopupMenu.font",
260                                           "ProgressBar.font",
261                                           "RadioButton.font",
262                                           "ScrollPane.font",
263                                           "TabbedPane.font",
264                                           "Table.font",
265                                           "TableHeader.font",
266                                           "TitledBorder.font",
267                                           "ToggleButton.font",
268                                           "ToolBar.font",
269                                           "ToolTip.font",
270                                           "Tree.font",
271                                           "Viewport.font"};
272 
273   public static String[] textComponentsKeys =
274                              new String[]{"EditorPane.font",
275                                           "TextArea.font",
276                                           "TextField.font",
277                                           "TextPane.font"};
278 
279   class ApplyAction extends AbstractAction{
280     ApplyAction(){
281       super("Apply");
282     }
283 
284     public void actionPerformed(ActionEvent evt) {
285       setMenuComponentsFont(menusFont);
286       setComponentsFont(componentsFont);
287       setTextComponentsFont(textComponentsFont);
288       SwingUtilities.updateComponentTreeUI(AppearanceDialog.this);
289       for(int i = 0; i< targets.length; i++){
290         if(targets[i] instanceof Window) {
291           SwingUtilities.updateComponentTreeUI(targets[i]);
292         } else {
293           SwingUtilities.updateComponentTreeUI(
294             SwingUtilities.getRoot(targets[i])
295           );
296         }
297       }
298     }// void actionPerformed(ActionEvent evt)
299   }
300 
301   class OKAction extends AbstractAction {
302     OKAction(){
303       super("OK");
304     }
305 
306     public void actionPerformed(ActionEvent evt){
307       applyBtn.getAction().actionPerformed(evt);
308       hide();
309     }
310   }// class OKAction extends AbstractAction
311 
312   class CancelAction extends AbstractAction {
313     CancelAction(){
314       super("Cancel");
315     }
316 
317     public void actionPerformed(ActionEvent evt){
318       setUIDefaults(menuKeys, new FontUIResource(oldMenusFont));
319       setUIDefaults(componentsKeys, new FontUIResource(oldComponentsFont));
320       setUIDefaults(textComponentsKeys, new FontUIResource(oldTextComponentsFont));
321       SwingUtilities.updateComponentTreeUI(
322                                   SwingUtilities.getRoot(AppearanceDialog.this));
323       for(int i = 0; i< targets.length; i++){
324         if(targets[i] instanceof Window){
325           SwingUtilities.updateComponentTreeUI(targets[i]);
326         } else {
327           SwingUtilities.updateComponentTreeUI(
328             SwingUtilities.getRoot(targets[i])
329           );
330         }
331       }
332       hide();
333     }// void actionPerformed(ActionEvent evt)
334   }// class CancelAction extends AbstractAction
335 
336 }// class ApperanceDialog