OptionsDialog.java
001 /*
002  *  Copyright (c) 1995-2010, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Valentin Tablan 15/11/2001
011  *
012  *  $Id: OptionsDialog.java 13685 2011-04-18 11:16:55Z valyt $
013  *
014  */
015 package gate.gui;
016 
017 import java.awt.*;
018 import java.awt.event.ActionEvent;
019 import java.awt.event.ActionListener;
020 import java.beans.PropertyChangeEvent;
021 import java.beans.PropertyChangeListener;
022 import java.util.*;
023 import java.util.List;
024 
025 import javax.swing.*;
026 import javax.swing.plaf.FontUIResource;
027 
028 import gate.Gate;
029 import gate.GateConstants;
030 import gate.swing.JFontChooser;
031 import gate.util.GateRuntimeException;
032 import gate.util.OptionsMap;
033 
034 /**
035  * The options dialog for Gate.
036  */
037 public class OptionsDialog extends JDialog {
038   public OptionsDialog(Frame owner){
039     super(owner, "GATE Options"true);
040     MainFrame.getGuiRoots().add(this);
041   }
042 
043   protected void initLocalData(){
044     lookAndFeelClassName = userConfig.getString(GateConstants.LOOK_AND_FEEL);
045     textComponentsFont = userConfig.getFont(GateConstants.TEXT_COMPONENTS_FONT);
046     menusFont = userConfig.getFont(GateConstants.MENUS_FONT);
047     componentsFont = userConfig.getFont(GateConstants.OTHER_COMPONENTS_FONT);
048     dirtyGUI = false;
049   }
050 
051 
052   protected void initGuiComponents(){
053     getContentPane().removeAll();
054     mainTabbedPane = new JTabbedPane(JTabbedPane.TOP);
055     getContentPane().setLayout(new BoxLayout(getContentPane(),
056                                              BoxLayout.Y_AXIS));
057     getContentPane().add(mainTabbedPane);
058     Box vBox;
059     Box hBox;
060     Box hBox2;
061 
062     /*******************
063      * Appearance pane *
064      *******************/
065 
066     //the LNF combo
067     List<LNFData> supportedLNFs = new ArrayList<LNFData>();
068     LNFData currentLNF = null;
069     UIManager.LookAndFeelInfo[] lnfs = UIManager.getInstalledLookAndFeels();
070     for (UIManager.LookAndFeelInfo lnf : lnfs) {
071       try {
072         Class lnfClass = Class.forName(lnf.getClassName());
073         if (((LookAndFeel) (lnfClass.newInstance())).isSupportedLookAndFeel()) {
074           if (lnf.getName().equals(UIManager.getLookAndFeel().getName())) {
075             supportedLNFs.add(currentLNF =
076               new LNFData(lnf.getClassName(), lnf.getName()));
077           else {
078             supportedLNFs.add(new LNFData(lnf.getClassName(), lnf.getName()));
079           }
080         }
081       catch (Exception e) {
082         e.printStackTrace();
083       }
084     }
085     lnfCombo = new JComboBox(supportedLNFs.toArray());
086     lnfCombo.setSelectedItem(currentLNF);
087     lnfCombo.setToolTipText("Be aware that only 'Metal' is fully tested.");
088 
089     fontBG = new ButtonGroup();
090     textBtn = new JRadioButton("Text components font");
091     textBtn.setActionCommand("text");
092     fontBG.add(textBtn);
093     menuBtn = new JRadioButton("Menu components font");
094     menuBtn.setActionCommand("menu");
095     fontBG.add(menuBtn);
096     otherCompsBtn = new JRadioButton("Other components font");
097     otherCompsBtn.setActionCommand("other");
098     fontBG.add(otherCompsBtn);
099 
100     JPanel appearanceBox = new JPanel();
101     appearanceBox.setLayout(new BoxLayout(appearanceBox, BoxLayout.Y_AXIS));
102     appearanceBox.setBorder(BorderFactory.createEmptyBorder(5555));
103 
104     appearanceBox.add(Box.createVerticalStrut(5));
105 
106     vBox = Box.createVerticalBox();
107     vBox.setBackground(getContentPane().getBackground());
108     vBox.setBorder(BorderFactory.createTitledBorder(" Look and Feel "));
109     vBox.add(Box.createVerticalStrut(5));
110       hBox = Box.createHorizontalBox();
111       hBox.add(Box.createHorizontalStrut(5));
112       hBox.add(lnfCombo);
113       hBox.add(Box.createHorizontalStrut(5));
114     vBox.add(hBox);
115     vBox.add(Box.createVerticalStrut(5));
116     appearanceBox.add(vBox);
117 
118     appearanceBox.add(Box.createVerticalStrut(5));
119 
120     hBox = Box.createHorizontalBox();
121     hBox.setBorder(BorderFactory.createTitledBorder(" Font options "));
122     hBox.add(Box.createHorizontalStrut(5));
123       vBox = Box.createVerticalBox();
124       vBox.add(textBtn);
125       vBox.add(Box.createVerticalStrut(5));
126       vBox.add(menuBtn);
127       vBox.add(Box.createVerticalStrut(5));
128       vBox.add(otherCompsBtn);
129       vBox.add(Box.createVerticalStrut(5));
130       vBox.add(Box.createVerticalGlue());
131     hBox.add(Box.createHorizontalStrut(5));
132     hBox.add(vBox);
133     fontChooser = new JFontChooser();
134     hBox.add(fontChooser);
135     hBox.add(Box.createHorizontalStrut(5));
136 
137     appearanceBox.add(hBox);
138 
139     mainTabbedPane.add("Appearance", appearanceBox);
140 
141     /*****************
142      * Advanced pane *
143      *****************/
144 
145     saveOptionsChk = new JCheckBox("Save options on exit",
146       userConfig.getBoolean(GateConstants.SAVE_OPTIONS_ON_EXIT));
147     saveOptionsChk.setToolTipText(
148       "Remembers the options set in this dialogue.");
149 
150     saveSessionChk = new JCheckBox("Save session on exit",
151       userConfig.getBoolean(GateConstants.SAVE_SESSION_ON_EXIT));
152     saveSessionChk.setToolTipText(
153       "Reloads the same resources in the tree on next start.");
154 
155     includeFeaturesOnPreserveFormatChk = new JCheckBox(
156       "Include annotation features for \"Save preserving format\"",
157       userConfig.getBoolean(
158         GateConstants.SAVE_FEATURES_WHEN_PRESERVING_FORMAT));
159 
160     addSpaceOnMarkupUnpackChk = new JCheckBox(
161       "Add space on markup unpack if needed"true);
162     addSpaceOnMarkupUnpackChk.setToolTipText(
163       "Adds a space instead of concatenate words separated by a XML tag");
164     if ( (userConfig.get(GateConstants
165       .DOCUMENT_ADD_SPACE_ON_UNPACK_FEATURE_NAME!= null)
166       && !userConfig.getBoolean(GateConstants
167       .DOCUMENT_ADD_SPACE_ON_UNPACK_FEATURE_NAME) )
168       addSpaceOnMarkupUnpackChk.setSelected(false);
169 
170     browserComboBox = new JComboBox(new String[] {
171       "Default browser""Java""Custom"});
172     browserComboBox.setPrototypeDisplayValue("Default browser");
173     browserComboBox.setToolTipText(
174       "Use Java or Custom only if Default doesn't work.");
175     browserCommandLineTextField = new JTextField(15);
176     String commandLine =
177       userConfig.getString(MainFrame.class.getName()+".browsercommandline");
178     if(commandLine == null || commandLine.trim().length() == 0
179     || commandLine.equals("Set dynamically when you display help.")) {
180       // option not configured or empty or default browser
181       browserComboBox.setSelectedItem("Default browser");
182       browserCommandLineTextField.setEnabled(false);
183     }
184     else if(commandLine.equals("Internal Java browser.")) {
185       browserComboBox.setSelectedItem("Java");
186       browserCommandLineTextField.setEnabled(false);
187     }
188     else {
189       browserComboBox.setSelectedItem("Custom");
190     }
191     browserCommandLineTextField.setText((commandLine == null)?"":commandLine);
192 
193     treeSelectViewChk = new JCheckBox("Tree select view",
194       userConfig.getBoolean(MainFrame.class.getName()+".treeselectview"));
195     treeSelectViewChk.setToolTipText(
196       "Selection in left resources tree select the main view");
197 
198     viewSelectTreeChk = new JCheckBox("View select in tree",
199       userConfig.getBoolean(MainFrame.class.getName()+".viewselecttree"));
200     viewSelectTreeChk.setToolTipText(
201       "Selection of the main view select item in left resources tree");
202 
203     JPanel advancedBox =  new JPanel();
204     advancedBox.setLayout(new BoxLayout(advancedBox, BoxLayout.Y_AXIS));
205     advancedBox.setBorder(BorderFactory.createEmptyBorder(5555));
206 
207     advancedBox.add(Box.createVerticalStrut(5));
208 
209     hBox = Box.createHorizontalBox();
210     hBox.setBorder(BorderFactory.createTitledBorder(" Advanced features "));
211     hBox.add(Box.createHorizontalStrut(5));
212       vBox = Box.createVerticalBox();
213       vBox.add(includeFeaturesOnPreserveFormatChk);
214       vBox.add(Box.createVerticalStrut(5));
215       vBox.add(addSpaceOnMarkupUnpackChk);
216       vBox.add(Box.createVerticalStrut(5));
217     hBox.add(vBox);
218     hBox.add(Box.createHorizontalStrut(5));
219     hBox.add(Box.createHorizontalGlue());
220     advancedBox.add(hBox);
221 
222     advancedBox.add(Box.createVerticalStrut(5));
223 
224     hBox = Box.createHorizontalBox();
225     hBox.setBorder(BorderFactory.createTitledBorder(" Session persistence "));
226     hBox.add(Box.createHorizontalStrut(5));
227       hBox2 = Box.createHorizontalBox();
228       hBox2.add(saveOptionsChk);
229       hBox2.add(Box.createVerticalStrut(5));
230       hBox2.add(saveSessionChk);
231       hBox2.add(Box.createVerticalStrut(5));
232     hBox.add(hBox2);
233     hBox.add(Box.createHorizontalStrut(5));
234     hBox.add(Box.createHorizontalGlue());
235     advancedBox.add(hBox);
236 
237     advancedBox.add(Box.createVerticalStrut(5));
238 
239     hBox = Box.createHorizontalBox();
240     hBox.setBorder(BorderFactory.createTitledBorder(" Help browser "));
241     hBox.add(Box.createHorizontalStrut(5));
242       vBox = Box.createVerticalBox();
243       vBox.add(browserComboBox);
244       vBox.add(Box.createVerticalStrut(5));
245       vBox.add(browserCommandLineTextField);
246       vBox.add(Box.createVerticalStrut(5));
247     hBox.add(vBox);
248     hBox.add(Box.createHorizontalStrut(5));
249     advancedBox.add(hBox);
250 
251     hBox = Box.createHorizontalBox();
252     hBox.setBorder(BorderFactory.createTitledBorder(
253       " Link resources tree selection and the main view "));
254     hBox.add(Box.createHorizontalStrut(5));
255       hBox2 = Box.createHorizontalBox();
256       hBox2.add(treeSelectViewChk);
257       hBox2.add(Box.createVerticalStrut(5));
258       hBox2.add(viewSelectTreeChk);
259       hBox2.add(Box.createVerticalStrut(5));
260     hBox.add(hBox2);
261     hBox.add(Box.createHorizontalStrut(5));
262     hBox.add(Box.createHorizontalGlue());
263     advancedBox.add(hBox);
264 
265     mainTabbedPane.add("Advanced", advancedBox);
266 
267     /******************
268      * Dialog buttons *
269      ******************/
270 
271     Box buttonsBox = Box.createHorizontalBox();
272     okButton = new JButton(new OKAction());
273     buttonsBox.add(okButton);
274     buttonsBox.add(Box.createHorizontalStrut(10));
275     buttonsBox.add(cancelButton = new JButton(new CancelAction()));
276 
277     getContentPane().add(Box.createVerticalStrut(10));
278     getContentPane().add(buttonsBox);
279     getContentPane().add(Box.createVerticalStrut(10));
280 
281     getRootPane().setDefaultButton(okButton);
282   }
283 
284   protected void initListeners(){
285     lnfCombo.addActionListener(new ActionListener() {
286       public void actionPerformed(ActionEvent e) {
287         if(!lookAndFeelClassName.equals(
288            ((LNFData)lnfCombo.getSelectedItem()).className)
289           ){
290           dirtyGUI = true;
291           lookAndFeelClassName = ((LNFData)lnfCombo.getSelectedItem()).
292                                  className;
293         }
294       }
295     });
296 
297     fontChooser.addPropertyChangeListener(new PropertyChangeListener() {
298       public void propertyChange(PropertyChangeEvent e) {
299         if(e.getPropertyName().equals("fontValue")){
300           String selectedFont = fontBG.getSelection().getActionCommand();
301           if(selectedFont.equals("text")){
302             textComponentsFont = (Font)e.getNewValue();
303             dirtyGUI = true;
304           }else if(selectedFont.equals("menu")){
305             menusFont = (Font)e.getNewValue();
306             dirtyGUI = true;
307           }else if(selectedFont.equals("other")){
308             componentsFont = (Font)e.getNewValue();
309             dirtyGUI = true;
310           }
311         }
312       }
313     });
314 
315     textBtn.addActionListener(new ActionListener() {
316       public void actionPerformed(ActionEvent e) {
317         if(textBtn.isSelected()) selectedFontChanged();
318         selectedFontBtn = "text";
319         fontChooser.setFontValue(textComponentsFont);
320       }
321     });
322 
323     menuBtn.addActionListener(new ActionListener() {
324       public void actionPerformed(ActionEvent e) {
325         if(menuBtn.isSelected()) selectedFontChanged();
326         selectedFontBtn = "menu";
327         fontChooser.setFontValue(menusFont);
328       }
329     });
330 
331     otherCompsBtn.addActionListener(new ActionListener() {
332       public void actionPerformed(ActionEvent e) {
333         if(otherCompsBtn.isSelected()) selectedFontChanged();
334         selectedFontBtn = "other";
335         fontChooser.setFontValue(componentsFont);
336       }
337     });
338 
339     textBtn.setSelected(true);
340 
341     browserComboBox.addActionListener(new ActionListener() {
342       public void actionPerformed(ActionEvent e) {
343         if(browserComboBox.getSelectedItem() == null) {
344           return;
345         }
346         String item = (String)browserComboBox.getSelectedItem();
347         browserCommandLineTextField.setEnabled(item.equals("Custom"));
348         if(item.equals("Default browser")) {
349           browserCommandLineTextField.setText(
350             "Set dynamically when you display help.");
351         }
352         else if(item.equals("Java")) {
353           browserCommandLineTextField.setText("Internal Java browser.");
354         }
355         else if(item.equals("Custom")) {
356           browserCommandLineTextField.setText("firefox %file");
357         }
358       }
359     });
360 
361     // define keystrokes action bindings at the level of the main window
362     InputMap inputMap = ((JComponent)this.getContentPane())
363       .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
364     ActionMap actionMap = ((JComponent)this.getContentPane()).getActionMap();
365     inputMap.put(KeyStroke.getKeyStroke("ENTER")"Apply");
366     actionMap.put("Apply"new OKAction());
367     inputMap.put(KeyStroke.getKeyStroke("ESCAPE")"Cancel");
368     actionMap.put("Cancel"new CancelAction());
369   }
370 
371   protected void selectedFontChanged(){
372     if(selectedFontBtn != null){
373       //save the old font
374       if(selectedFontBtn.equals("text")){
375         textComponentsFont = fontChooser.getFontValue();
376       }else if(selectedFontBtn.equals("menu")){
377         menusFont = fontChooser.getFontValue();
378       }else if(selectedFontBtn.equals("other")){
379         componentsFont = fontChooser.getFontValue();
380       }
381     }
382   }
383 
384   public void showDialog(){
385     initLocalData();
386     initGuiComponents();
387     initListeners();
388     textBtn.doClick();
389     
390     pack();
391     setLocationRelativeTo(getOwner());
392     setVisible(true);
393     selectedFontBtn = null;
394   }
395 
396   public static void main(String args[]){
397     try{
398       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
399     }catch(Exception e){
400       e.printStackTrace();
401     }
402     final JFrame frame = new JFrame("Foo frame");
403     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
404     JButton btn = new JButton("Show dialog");
405     btn.addActionListener(new ActionListener() {
406       public void actionPerformed(ActionEvent e) {
407         OptionsDialog dialog = new OptionsDialog(frame);
408         dialog.pack();
409         dialog.showDialog();
410       }
411     });
412     frame.getContentPane().add(btn);
413     frame.pack();
414     frame.setVisible(true);
415     System.out.println("Font: " + UIManager.getFont("Button.font"));
416   }// main
417 
418 
419   protected static void setUIDefaults(Object[] keys, Object value) {
420     for(int i = 0; i < keys.length; i++){
421       UIManager.put(keys[i], value);
422     }
423   }// setUIDefaults(Object[] keys, Object value)
424 
425   /**
426    * Updates the Swing defaults table with the provided font to be used for the
427    * text components
428    */
429   public static void setTextComponentsFont(Font font){
430     setUIDefaults(textComponentsKeys, new FontUIResource(font));
431     userConfig.put(GateConstants.TEXT_COMPONENTS_FONT, font);
432   }
433 
434   /**
435    * Updates the Swing defaults table with the provided font to be used for the
436    * menu components
437    */
438   public static void setMenuComponentsFont(Font font){
439     setUIDefaults(menuKeys, new FontUIResource(font));
440     userConfig.put(GateConstants.MENUS_FONT, font);
441   }
442 
443   /**
444    * Updates the Swing defaults table with the provided font to be used for
445    * various compoents that neither text or menu components
446    */
447   public static void setComponentsFont(Font font){
448     setUIDefaults(componentsKeys, new FontUIResource(font));
449     userConfig.put(GateConstants.OTHER_COMPONENTS_FONT, font);
450   }
451 
452   class OKAction extends AbstractAction{
453     OKAction(){
454       super("OK");
455     }
456 
457     public void actionPerformed(ActionEvent evt) {
458       if(dirtyGUI){
459         setMenuComponentsFont(menusFont);
460         setComponentsFont(componentsFont);
461         setTextComponentsFont(textComponentsFont);
462         userConfig.put(GateConstants.LOOK_AND_FEEL, lookAndFeelClassName);
463         try{
464           UIManager.setLookAndFeel(lookAndFeelClassName);
465         }catch(Exception e){
466           throw new GateRuntimeException(
467                   "Error while setting the look and feel", e);
468         }
469         Iterator rootsIter = MainFrame.getGuiRoots().iterator();
470         while(rootsIter.hasNext()){
471           try{
472             SwingUtilities.updateComponentTreeUI((Component)rootsIter.next());
473           }catch(Exception e){
474             throw new GateRuntimeException(
475                     "Error while updating the graphical interface", e);
476           }            
477         }
478       }
479 
480       userConfig.put(GateConstants.SAVE_OPTIONS_ON_EXIT,
481         saveOptionsChk.isSelected());
482       userConfig.put(GateConstants.SAVE_SESSION_ON_EXIT,
483         saveSessionChk.isSelected());
484       userConfig.put(GateConstants.SAVE_FEATURES_WHEN_PRESERVING_FORMAT,
485         includeFeaturesOnPreserveFormatChk.isSelected());
486       userConfig.put(GateConstants.DOCUMENT_ADD_SPACE_ON_UNPACK_FEATURE_NAME,
487         addSpaceOnMarkupUnpackChk.isSelected());
488       userConfig.put(MainFrame.class.getName()+".browsercommandline",
489         browserCommandLineTextField.getText());
490       userConfig.put(MainFrame.class.getName()+".treeselectview",
491         treeSelectViewChk.isSelected());
492       userConfig.put(MainFrame.class.getName()+".viewselecttree",
493         viewSelectTreeChk.isSelected());
494       setVisible(false);
495     }// void actionPerformed(ActionEvent evt)
496   }
497 
498   protected class CancelAction extends AbstractAction {
499     public CancelAction(){
500       super("Cancel");
501     }
502     public void actionPerformed(ActionEvent evt){
503       setVisible(false);
504     }
505   }
506 
507   protected static class LNFData{
508     public LNFData(String className, String name){
509       this.className = className;
510       this.name = name;
511     }
512 
513     public String toString(){
514       return name;
515     }
516 
517     String className;
518     String name;
519   }
520 
521 
522   public static String[] menuKeys = new String[]{"CheckBoxMenuItem.acceleratorFont",
523                                           "CheckBoxMenuItem.font",
524                                           "Menu.acceleratorFont",
525                                           "Menu.font",
526                                           "MenuBar.font",
527                                           "MenuItem.acceleratorFont",
528                                           "MenuItem.font",
529                                           "RadioButtonMenuItem.acceleratorFont",
530                                           "RadioButtonMenuItem.font"};
531 
532   public static String[] componentsKeys =
533                              new String[]{"Button.font",
534                                           "CheckBox.font",
535                                           "ColorChooser.font",
536                                           "ComboBox.font",
537                                           "InternalFrame.titleFont",
538                                           "Label.font",
539                                           "List.font",
540                                           "OptionPane.font",
541                                           "Panel.font",
542                                           "PasswordField.font",
543                                           "PopupMenu.font",
544                                           "ProgressBar.font",
545                                           "RadioButton.font",
546                                           "ScrollPane.font",
547                                           "TabbedPane.font",
548                                           "Table.font",
549                                           "TableHeader.font",
550                                           "TextField.font",
551                                           "TitledBorder.font",
552                                           "ToggleButton.font",
553                                           "ToolBar.font",
554                                           "ToolTip.font",
555                                           "Tree.font",
556                                           "Viewport.font"};
557 
558   public static String[] textComponentsKeys =
559                              new String[]{"EditorPane.font",
560                                           "TextArea.font",
561                                           "TextPane.font"};
562 
563   /**
564    * The main tabbed pane
565    */
566   protected JTabbedPane mainTabbedPane;
567 
568   /**
569    * Radio button used to set the font for text components
570    */
571   protected JRadioButton textBtn;
572   
573   /**
574    * The OK button for the dialog. It's set as protected so it can be accessed
575    * by subclasses in other projects.
576    */
577   protected JButton okButton;
578   
579   /**
580    * The Cancel button for the dialog. It's set as protected so it can be 
581    * accessed by subclasses in other projects.
582    */
583   protected JButton cancelButton;
584 
585   /**
586    * which text is currently being edited; values are: "text", "menu", "other"
587    */
588   protected String selectedFontBtn = null;
589 
590   /**
591    * Radio button used to set the font for menu components
592    */
593   protected JRadioButton menuBtn;
594 
595   /**
596    * Radio button used to set the font for other components
597    */
598   protected JRadioButton otherCompsBtn;
599 
600   /**
601    * Button group for the font setting radio buttons
602    */
603   protected ButtonGroup fontBG;
604 
605   /**
606    * The font chooser used for selecting fonts
607    */
608   protected JFontChooser fontChooser;
609 
610   /**
611    * The "Save Options on close" checkbox
612    */
613   protected JCheckBox saveOptionsChk;
614 
615   /**
616    * The "Save Session on close" checkbox
617    */
618   protected JCheckBox saveSessionChk;
619 
620   /**
621    * The "Include Annotation Features in Save Preserving Format" checkbox
622    */
623   protected JCheckBox includeFeaturesOnPreserveFormatChk;
624 
625   /**
626    * The "Add extra space markup unpack if needed" checkbox
627    */
628   protected JCheckBox addSpaceOnMarkupUnpackChk;
629 
630   /**
631    * The name of the look and feel class
632    */
633   protected String lookAndFeelClassName;
634 
635   /**
636    * The font to be used for the menus; cached value for the one in the user
637    * config map.
638    */
639   protected Font menusFont;
640 
641   /**
642    * The font to be used for text components; cached value for the one in the
643    * user config map.
644    */
645   protected Font textComponentsFont;
646 
647   /**
648    * The font to be used for GUI components; cached value for the one in the
649    * user config map.
650    */
651   protected Font componentsFont;
652 
653   /**
654    * This flag becomes true when an GUI related option has been changed
655    */
656   protected boolean dirtyGUI;
657 
658   /**
659    * The combobox for the look and feel selection
660    */
661   protected JComboBox lnfCombo;
662 
663   /**
664    * List of browsers. Update the browserCommandLineTextField.
665    */
666   protected JComboBox browserComboBox;
667 
668   /**
669    * Browser command line.
670    */
671   protected JTextField browserCommandLineTextField;
672 
673   protected JCheckBox treeSelectViewChk;
674 
675   protected JCheckBox viewSelectTreeChk;
676 
677   protected static OptionsMap userConfig = Gate.getUserConfig();
678 }