| OptionsDialog |

    1   /*
    2    *  Copyright (c) 1998-2001, The University of Sheffield.
    3    *
    4    *  This file is part of GATE (see http://gate.ac.uk/), and is free
    5    *  software, licenced under the GNU Library General Public License,
    6    *  Version 2, June 1991 (in the distribution as file licence.html,
    7    *  and also available at http://gate.ac.uk/gate/licence.html).
    8    *
    9    *  Valentin Tablan 15/11/2001
    10   *
    11   *  $Id: OptionsDialog.java,v 1.2 2001/11/16 15:15:28 valyt Exp $
    12   *
    13   */
    14  package gate.gui;
    15
    16  import gate.*;
    17  import gate.util.*;
    18  import gate.swing.*;
    19
    20  import javax.swing.*;
    21  import javax.swing.event.*;
    22  import java.awt.event.*;
    23  import java.awt.Frame;
    24  import java.awt.Font;
    25  import java.awt.Component;
    26  import java.awt.font.TextAttribute;
    27  import javax.swing.plaf.FontUIResource;
    28  import java.beans.PropertyChangeListener;
    29  import java.beans.PropertyChangeEvent;
    30  import java.util.*;
    31
    32  /**
    33   * The options dialog for Gate.
    34   */
    35  public class OptionsDialog extends JDialog {
    36    public OptionsDialog(Frame owner){
    37      super(owner, "Gate Options", true);
    38      MainFrame.getGuiRoots().add(this);
    39    }
    40
    41    protected void initLocalData(){
    42      lookAndFeelClassName = Gate.getUserConfig().
    43                             getString(GateConstants.LOOK_AND_FEEL);
    44
    45      textComponentsFont = Gate.getUserConfig().
    46                           getFont(GateConstants.TEXT_COMPONENTS_FONT);
    47
    48      menusFont = Gate.getUserConfig().
    49                  getFont(GateConstants.MENUS_FONT);
    50
    51      componentsFont = Gate.getUserConfig().
    52                       getFont(GateConstants.OTHER_COMPONENTS_FONT);
    53      dirtyGUI = false;
    54    }
    55
    56
    57    protected void initGuiComponents(){
    58      getContentPane().removeAll();
    59      mainTabbedPane = new JTabbedPane(JTabbedPane.TOP);
    60      getContentPane().setLayout(new BoxLayout(getContentPane(),
    61                                               BoxLayout.Y_AXIS));
    62      getContentPane().add(mainTabbedPane);
    63
    64      Box appearanceBox = Box.createVerticalBox();
    65      //the LNF combo
    66      List supportedLNFs = new ArrayList();
    67      LNFData currentLNF = null;
    68      UIManager.LookAndFeelInfo[] lnfs = UIManager.getInstalledLookAndFeels();
    69      for(int i = 0; i < lnfs.length; i++){
    70        UIManager.LookAndFeelInfo lnf = lnfs[i];
    71        try{
    72          Class lnfClass = Class.forName(lnf.getClassName());
    73          if(((LookAndFeel)(lnfClass.newInstance())).isSupportedLookAndFeel()){
    74            if(lnf.getName().equals(UIManager.getLookAndFeel().getName())){
    75              supportedLNFs.add(currentLNF =
    76                                new LNFData(lnf.getClassName(), lnf.getName()));
    77            }else{
    78              supportedLNFs.add(new LNFData(lnf.getClassName(), lnf.getName()));
    79            }
    80          }
    81        }catch(ClassNotFoundException cnfe){
    82        }catch(IllegalAccessException iae){
    83        }catch(InstantiationException ie){
    84        }
    85      }
    86      lnfCombo = new JComboBox(supportedLNFs.toArray());
    87      lnfCombo.setSelectedItem(currentLNF);
    88
    89      Box horBox = Box.createHorizontalBox();
    90      horBox.add(Box.createHorizontalStrut(5));
    91      horBox.add(new JLabel("Look and feel:"));
    92      horBox.add(Box.createHorizontalStrut(5));
    93      horBox.add(lnfCombo);
    94      horBox.add(Box.createHorizontalStrut(5));
    95      appearanceBox.add(Box.createVerticalStrut(10));
    96      appearanceBox.add(horBox);
    97      appearanceBox.add(Box.createVerticalStrut(10));
    98
    99      JPanel panel = new JPanel();
    100     panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
    101     panel.setBorder(BorderFactory.createTitledBorder(" Font options "));
    102
    103     fontBG = new ButtonGroup();
    104     textBtn = new JRadioButton("Text components font");
    105     textBtn.setActionCommand("text");
    106     fontBG.add(textBtn);
    107     menuBtn = new JRadioButton("Menu components font");
    108     menuBtn.setActionCommand("menu");
    109     fontBG.add(menuBtn);
    110     otherCompsBtn = new JRadioButton("Other components font");
    111     otherCompsBtn.setActionCommand("other");
    112     fontBG.add(otherCompsBtn);
    113     Box verBox = Box.createVerticalBox();
    114     verBox.add(Box.createVerticalStrut(5));
    115     verBox.add(textBtn);
    116     verBox.add(Box.createVerticalStrut(5));
    117     verBox.add(menuBtn);
    118     verBox.add(Box.createVerticalStrut(5));
    119     verBox.add(otherCompsBtn);
    120     verBox.add(Box.createVerticalStrut(5));
    121     verBox.add(Box.createVerticalGlue());
    122     panel.add(verBox);
    123
    124     fontChooser = new JFontChooser();
    125     panel.add(fontChooser);
    126
    127     appearanceBox.add(panel);
    128
    129     mainTabbedPane.add("Appearance", appearanceBox);
    130
    131     Box advancedBox = Box.createVerticalBox();
    132     saveOptionsChk = new JCheckBox(
    133         "Save options on exit",
    134         Gate.getUserConfig().getBoolean(GateConstants.SAVE_OPTIONS_ON_EXIT).
    135         booleanValue());
    136
    137     saveSessionChk = new JCheckBox(
    138         "Save session on exit",
    139         Gate.getUserConfig().getBoolean(GateConstants.SAVE_SESSION_ON_EXIT).
    140         booleanValue());
    141     advancedBox.add(Box.createVerticalStrut(10));
    142     advancedBox.add(saveOptionsChk);
    143     advancedBox.add(Box.createVerticalStrut(10));
    144     advancedBox.add(saveSessionChk);
    145     advancedBox.add(Box.createVerticalStrut(10));
    146     mainTabbedPane.add("Advanced", advancedBox);
    147
    148     Box buttonsBox = Box.createHorizontalBox();
    149     buttonsBox.add(Box.createHorizontalGlue());
    150     buttonsBox.add(okButton = new JButton(new OKAction()));
    151     buttonsBox.add(Box.createHorizontalStrut(10));
    152     buttonsBox.add(cancelButton = new JButton("Cancel"));
    153     buttonsBox.add(Box.createHorizontalGlue());
    154
    155     getContentPane().add(Box.createVerticalStrut(10));
    156     getContentPane().add(buttonsBox);
    157     getContentPane().add(Box.createVerticalStrut(10));
    158   }
    159
    160   protected void initListeners(){
    161     lnfCombo.addActionListener(new ActionListener() {
    162       public void actionPerformed(ActionEvent e) {
    163         if(!lookAndFeelClassName.equals(
    164            ((LNFData)lnfCombo.getSelectedItem()).className)
    165           ){
    166           dirtyGUI = true;
    167           lookAndFeelClassName = ((LNFData)lnfCombo.getSelectedItem()).
    168                                  className;
    169         }
    170       }
    171     });
    172
    173     fontChooser.addPropertyChangeListener(new PropertyChangeListener() {
    174       public void propertyChange(PropertyChangeEvent e) {
    175         if(e.getPropertyName().equals("fontValue")){
    176           String selectedFont = fontBG.getSelection().getActionCommand();
    177           if(selectedFont.equals("text")){
    178             textComponentsFont = (Font)e.getNewValue();
    179             dirtyGUI = true;
    180           }else if(selectedFont.equals("menu")){
    181             menusFont = (Font)e.getNewValue();
    182             dirtyGUI = true;
    183           }else if(selectedFont.equals("other")){
    184             componentsFont = (Font)e.getNewValue();
    185             dirtyGUI = true;
    186           }
    187         }
    188       }
    189     });
    190
    191     textBtn.addActionListener(new ActionListener() {
    192       public void actionPerformed(ActionEvent e) {
    193         if(textBtn.isSelected()) selectedFontChanged();
    194         selectedFontBtn = "text";
    195         fontChooser.setFontValue(textComponentsFont);
    196       }
    197     });
    198
    199     menuBtn.addActionListener(new ActionListener() {
    200       public void actionPerformed(ActionEvent e) {
    201         if(menuBtn.isSelected()) selectedFontChanged();
    202         selectedFontBtn = "menu";
    203         fontChooser.setFontValue(menusFont);
    204       }
    205     });
    206
    207     otherCompsBtn.addActionListener(new ActionListener() {
    208       public void actionPerformed(ActionEvent e) {
    209         if(otherCompsBtn.isSelected()) selectedFontChanged();
    210         selectedFontBtn = "other";
    211         fontChooser.setFontValue(componentsFont);
    212       }
    213     });
    214
    215     cancelButton.setAction(new AbstractAction("Cancel"){
    216       public void actionPerformed(ActionEvent evt){
    217         hide();
    218       }
    219     });
    220     textBtn.setSelected(true);
    221   }
    222
    223   public void dispose(){
    224     MainFrame.getGuiRoots().remove(this);
    225     super.dispose();
    226   }
    227
    228   protected void selectedFontChanged(){
    229     if(selectedFontBtn != null){
    230       //save the old font
    231       if(selectedFontBtn.equals("text")){
    232         textComponentsFont = fontChooser.getFontValue();
    233       }else if(selectedFontBtn.equals("menu")){
    234         menusFont = fontChooser.getFontValue();
    235       }else if(selectedFontBtn.equals("other")){
    236         componentsFont = fontChooser.getFontValue();
    237       }
    238     }
    239   }
    240
    241   public void show(){
    242     initLocalData();
    243     initGuiComponents();
    244     textBtn.setSelected(true);
    245     fontChooser.setFontValue(textComponentsFont);
    246     initListeners();
    247     pack();
    248     setLocationRelativeTo(getOwner());
    249     super.show();
    250   }
    251
    252   public static void main(String args[]){
    253     try{
    254       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    255     }catch(Exception e){
    256       e.printStackTrace();
    257     }
    258     final JFrame frame = new JFrame("Foo frame");
    259     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    260     JButton btn = new JButton("Show dialog");
    261     btn.addActionListener(new ActionListener() {
    262       public void actionPerformed(ActionEvent e) {
    263         OptionsDialog dialog = new OptionsDialog(frame);
    264         dialog.pack();
    265         dialog.show();
    266       }
    267     });
    268     frame.getContentPane().add(btn);
    269     frame.pack();
    270     frame.setVisible(true);
    271     System.out.println("Font: " + UIManager.getFont("Button.font"));
    272   }// main
    273
    274
    275   protected static void setUIDefaults(Object[] keys, Object value) {
    276     for(int i = 0; i < keys.length; i++){
    277       UIManager.put(keys[i], value);
    278     }
    279   }// setUIDefaults(Object[] keys, Object value)
    280
    281   /**
    282    * Updates the Swing defaults table with the provided font to be used for the
    283    * text components
    284    */
    285   public static void setTextComponentsFont(Font font){
    286     setUIDefaults(textComponentsKeys, new FontUIResource(font));
    287     Gate.getUserConfig().put(GateConstants.TEXT_COMPONENTS_FONT, font);
    288   }
    289
    290   /**
    291    * Updates the Swing defaults table with the provided font to be used for the
    292    * menu components
    293    */
    294   public static void setMenuComponentsFont(Font font){
    295     setUIDefaults(menuKeys, new FontUIResource(font));
    296     Gate.getUserConfig().put(GateConstants.MENUS_FONT, font);
    297   }
    298
    299   /**
    300    * Updates the Swing defaults table with the provided font to be used for
    301    * various compoents that neither text or menu components
    302    */
    303   public static void setComponentsFont(Font font){
    304     setUIDefaults(componentsKeys, new FontUIResource(font));
    305     Gate.getUserConfig().put(GateConstants.OTHER_COMPONENTS_FONT, font);
    306   }
    307
    308   class OKAction extends AbstractAction{
    309     OKAction(){
    310       super("OK");
    311     }
    312
    313     public void actionPerformed(ActionEvent evt) {
    314       OptionsMap userConfig = Gate.getUserConfig();
    315       if(dirtyGUI){
    316         setMenuComponentsFont(menusFont);
    317         setComponentsFont(componentsFont);
    318         setTextComponentsFont(textComponentsFont);
    319         userConfig.put(GateConstants.LOOK_AND_FEEL, lookAndFeelClassName);
    320         try{
    321           UIManager.setLookAndFeel(lookAndFeelClassName);
    322           Iterator rootsIter = MainFrame.getGuiRoots().iterator();
    323           while(rootsIter.hasNext()){
    324             SwingUtilities.updateComponentTreeUI((Component)rootsIter.next());
    325           }
    326         }catch(Exception e){}
    327       }
    328
    329       userConfig.put(GateConstants.SAVE_OPTIONS_ON_EXIT,
    330                      new Boolean(saveOptionsChk.isSelected()));
    331       userConfig.put(GateConstants.SAVE_SESSION_ON_EXIT,
    332                      new Boolean(saveSessionChk.isSelected()));
    333       hide();
    334     }// void actionPerformed(ActionEvent evt)
    335   }
    336
    337   protected static class LNFData{
    338     public LNFData(String className, String name){
    339       this.className = className;
    340       this.name = name;
    341     }
    342
    343     public String toString(){
    344       return name;
    345     }
    346
    347     String className;
    348     String name;
    349   }
    350
    351
    352   public static String[] menuKeys = new String[]{"CheckBoxMenuItem.acceleratorFont",
    353                                           "CheckBoxMenuItem.font",
    354                                           "Menu.acceleratorFont",
    355                                           "Menu.font",
    356                                           "MenuBar.font",
    357                                           "MenuItem.acceleratorFont",
    358                                           "MenuItem.font",
    359                                           "RadioButtonMenuItem.acceleratorFont",
    360                                           "RadioButtonMenuItem.font"};
    361
    362   public static String[] componentsKeys =
    363                              new String[]{"Button.font",
    364                                           "CheckBox.font",
    365                                           "ColorChooser.font",
    366                                           "ComboBox.font",
    367                                           "InternalFrame.titleFont",
    368                                           "Label.font",
    369                                           "List.font",
    370                                           "OptionPane.font",
    371                                           "Panel.font",
    372                                           "PasswordField.font",
    373                                           "PopupMenu.font",
    374                                           "ProgressBar.font",
    375                                           "RadioButton.font",
    376                                           "ScrollPane.font",
    377                                           "TabbedPane.font",
    378                                           "Table.font",
    379                                           "TableHeader.font",
    380                                           "TitledBorder.font",
    381                                           "ToggleButton.font",
    382                                           "ToolBar.font",
    383                                           "ToolTip.font",
    384                                           "Tree.font",
    385                                           "Viewport.font"};
    386
    387   public static String[] textComponentsKeys =
    388                              new String[]{"EditorPane.font",
    389                                           "TextArea.font",
    390                                           "TextField.font",
    391                                           "TextPane.font"};
    392
    393   /**
    394    * The main tabbed pane
    395    */
    396   JTabbedPane mainTabbedPane;
    397
    398   /**
    399    * The OK button. The action for this button is an {@link OKAction}
    400    */
    401   JButton okButton;
    402
    403   /**
    404    * The Cancel button: hides the dialog without doing anything
    405    */
    406   JButton cancelButton;
    407
    408   /**
    409    * Radio button used to set the font for text components
    410    */
    411   JRadioButton textBtn;
    412
    413   /**
    414    * which text is currently being edited; values are: "text", "menu", "other"
    415    */
    416   String selectedFontBtn = null;
    417
    418   /**
    419    * Radio button used to set the font for menu components
    420    */
    421   JRadioButton menuBtn;
    422
    423   /**
    424    * Radio button used to set the font for other components
    425    */
    426   JRadioButton otherCompsBtn;
    427
    428   /**
    429    * Button group for the font setting radio buttons
    430    */
    431   ButtonGroup fontBG;
    432
    433   /**
    434    * The font chooser used for selecting fonts
    435    */
    436   JFontChooser fontChooser;
    437
    438   /**
    439    * The "Save Options on close" checkbox
    440    */
    441   JCheckBox saveOptionsChk;
    442
    443   /**
    444    * The "Save Session on close" checkbox
    445    */
    446   JCheckBox saveSessionChk;
    447   /**
    448    * The name of the look and feel class
    449    */
    450   String lookAndFeelClassName;
    451
    452   /**
    453    * The font to be used for the menus; cached value for the one in the user
    454    * config map.
    455    */
    456   Font menusFont;
    457
    458   /**
    459    * The font to be used for text components; cached value for the one in the
    460    * user config map.
    461    */
    462   Font textComponentsFont;
    463
    464   /**
    465    * The font to be used for GUI components; cached value for the one in the
    466    * user config map.
    467    */
    468   Font componentsFont;
    469
    470   /**
    471    * This flag becomes true when an GUI related option has been changed
    472    */
    473   boolean dirtyGUI;
    474
    475   /**
    476    * The combobox for the look and feel selection
    477    */
    478   JComboBox lnfCombo;
    479 }

| OptionsDialog |