785586d326eecbc64d7d2cd9444a98bfa742f24f
[debian/jabref.git] / src / java / net / sf / jabref / PrefsDialog3.java
1 /*
2 Copyright (C) 2003 JabRef project
3
4 All programs in this directory and
5 subdirectories are published under the GNU General Public License as
6 described below.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or (at
11 your option) any later version.
12
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 USA
22
23 Further information about the GNU GPL is available at:
24 http://www.gnu.org/copyleft/gpl.ja.html
25
26 */
27
28 package net.sf.jabref;
29
30 import java.awt.*;
31 import java.awt.event.*;
32 import java.io.*;
33 import java.util.*;
34
35 import javax.swing.*;
36 import javax.swing.event.*;
37
38 import net.sf.jabref.groups.GroupsPrefsTab;
39 import net.sf.jabref.gui.MainTable;
40
41 /**
42  * Preferences dialog. Contains a TabbedPane, and tabs will be defined
43  * in separate classes. Tabs MUST implement the PrefsTab interface,
44  * since this dialog will call the storeSettings() method of all tabs
45  * when the user presses ok.
46  *
47  * With this design, it should be very easy to add new tabs later.
48  *
49  */
50 public class PrefsDialog3 extends JDialog {
51
52     private JabRefPreferences _prefs;
53     JPanel upper = new JPanel(),
54         lower = new JPanel(),
55     main = new JPanel();/* {
56                 public void add(Component c, Object o) {
57                     super.add(c, o);
58                     System.out.println(o+" "+c.getPreferredSize());
59                     }
60                     };*/
61     JList chooser;
62     JButton importPrefs = new JButton(Globals.lang("Import preferences")),
63     exportPrefs = new JButton(Globals.lang("Export preferences"));
64     CardLayout cardLayout = new CardLayout();
65     HashMap panels = new HashMap();
66     JabRefFrame frame;
67     PrefsDialog3 ths = this;
68
69     public PrefsDialog3(JabRefFrame parent, JabRefPreferences prefs) {
70         super(parent, Globals.lang("JabRef preferences"), false);
71         _prefs = prefs;
72         frame = parent;
73         getContentPane().setLayout(new BorderLayout());
74     getContentPane().add(upper, BorderLayout.CENTER);
75         getContentPane().add(lower, BorderLayout.SOUTH);
76
77         // ----------------------------------------------------------------
78         // Add tabs to tabbed here. Remember, tabs must implement PrefsTab.
79         // ----------------------------------------------------------------
80     String
81         GEN = Globals.lang("General"),
82         APP = Globals.lang("Appearance"),
83         GRP = Globals.lang("Groups"), // JZTODO lyrics
84         EXT = Globals.lang("External programs"),
85         TAB = Globals.lang("Entry table"),
86         COL = Globals.lang("Entry table columns"),
87         KEY = Globals.lang("Key pattern"),
88         PRE = Globals.lang("Entry preview"),
89         //JOU = Globals.lang("Journal names"),
90         ADV = Globals.lang("Advanced");
91
92     ArrayList al = new ArrayList();
93     al.add(GEN);
94     al.add(APP);
95     al.add(GRP);
96     al.add(EXT);
97     al.add(TAB);
98     al.add(COL);
99     al.add(KEY);
100     //al.add(JOU);
101     al.add(PRE);
102
103     main.setLayout(cardLayout);
104
105         main.add(new GeneralTab(frame, _prefs), GEN);
106     if (!Globals.ON_MAC) {
107         al.add(ADV);
108         main.add(new AdvancedTab(_prefs, parent.helpDiag), ADV);
109     }
110
111
112
113
114         main.add(new GroupsPrefsTab(_prefs), GRP);
115         main.add(new AppearancePrefsTab(_prefs), APP);
116         main.add(new ExternalTab(frame, _prefs), EXT);
117         main.add(new TablePrefsTab(_prefs, parent), TAB);
118         main.add(new TableColumnsTab(_prefs, parent), COL);
119         main.add(new TabLabelPattern(_prefs, parent.helpDiag), KEY);
120         main.add(new PreviewPrefsTab(_prefs, parent.helpDiag), PRE);
121         //main.add(new ManageJournalsPanel(frame), JOU);
122
123     upper.setBorder(BorderFactory.createEtchedBorder());
124
125     chooser = new JList(al.toArray());
126     chooser.setBorder(BorderFactory.createEtchedBorder());
127     // Set a prototype value to control the width of the list:
128     chooser.setPrototypeCellValue("This should be wide enough");
129     chooser.setSelectedIndex(0);
130     chooser.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
131
132     // Add the selection listener that will show the correct panel when selection changes:
133     chooser.addListSelectionListener(new ListSelectionListener() {
134         public void valueChanged(ListSelectionEvent e) {
135             if (e.getValueIsAdjusting())
136             return;
137             String o = (String)chooser.getSelectedValue();
138             //Util.pr(o);
139             cardLayout.show(main, o);
140             //main.revalidate();
141             //main.repaint();
142         }
143         });
144
145     JPanel one = new JPanel(), two = new JPanel();
146     one.setLayout(new BorderLayout());
147     two.setLayout(new BorderLayout());
148     one.add(chooser, BorderLayout.CENTER);
149     one.add(importPrefs, BorderLayout.SOUTH);
150     two.add(one, BorderLayout.CENTER);
151     two.add(exportPrefs, BorderLayout.SOUTH);
152     upper.setLayout(new BorderLayout());
153     upper.add(two, BorderLayout.WEST);
154     upper.add(main, BorderLayout.CENTER);
155
156     // Add all panels to main panel:
157     //for (Iterator i=panels.entrySet().iterator(); i.hasNext();) {
158
159
160     //}
161
162         JButton
163             ok = new JButton(Globals.lang("Ok")),
164             cancel = new JButton(Globals.lang("Cancel"));
165         ok.addActionListener(new OkAction());
166         CancelAction cancelAction = new CancelAction();
167         cancel.addActionListener(cancelAction);
168         lower.add(ok);
169         lower.add(cancel);
170
171         // Key bindings:
172         ActionMap am = chooser.getActionMap();
173         InputMap im = chooser.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
174         im.put(frame.prefs().getKey("Close dialog"), "close");
175         am.put("close", cancelAction);
176
177     // Import and export actions:
178     exportPrefs.setToolTipText(Globals.lang("Export preferences to file"));
179     importPrefs.setToolTipText(Globals.lang("Import preferences from file"));
180     exportPrefs.addActionListener(new ActionListener() {
181         public void actionPerformed(ActionEvent e) {
182             String filename = Globals.getNewFile
183             (frame, new File(System.getProperty("user.home")),
184              ".xml", JFileChooser.SAVE_DIALOG, false);
185             if (filename == null)
186             return;
187             File file = new File(filename);
188             if (!file.exists() ||
189             (JOptionPane.showConfirmDialog
190                          (ths, "'"+file.getName()+"' "+Globals.lang("exists. Overwrite file?"),
191                           Globals.lang("Export preferences"), JOptionPane.OK_CANCEL_OPTION)
192                          == JOptionPane.OK_OPTION)) {
193
194             try {
195                 _prefs.exportPreferences(filename);
196             } catch (IOException ex) {
197                 JOptionPane.showMessageDialog
198                 (ths, Globals.lang("Could not export preferences")+": "+ex.getMessage(), Globals.lang("Export preferences"), JOptionPane.ERROR_MESSAGE);
199                 //ex.printStackTrace();
200             }
201             }
202
203         }
204         });
205
206     importPrefs.addActionListener(new ActionListener() {
207         public void actionPerformed(ActionEvent e) {
208             String filename = Globals.getNewFile
209             (frame, new File(System.getProperty("user.home")),
210              ".xml", JFileChooser.OPEN_DIALOG, false);
211             if (filename == null)
212             return;
213
214             try {
215             _prefs.importPreferences(filename);
216             setValues();
217                 BibtexEntryType.loadCustomEntryTypes(_prefs);
218                 frame.removeCachedEntryEditors();
219             } catch (IOException ex) {
220             JOptionPane.showMessageDialog
221                 (ths, Globals.lang("Could not import preferences")+": "+ex.getMessage(), Globals.lang("Import preferences"), JOptionPane.ERROR_MESSAGE);
222             //ex.printStackTrace();
223             }
224         }
225
226
227         });
228
229     setValues();
230
231         pack(); //setSize(440, 500);
232     }
233
234     class OkAction extends AbstractAction {
235         public OkAction() {
236             super("Ok");
237         }
238         public void actionPerformed(ActionEvent e) {
239
240         AbstractWorker worker = new AbstractWorker() {
241             boolean ready = true;
242             public void run() {
243             // First check that all tabs are ready to close:
244             int count = main.getComponentCount();
245             Component[] comps = main.getComponents();
246             for (int i = 0; i < count; i++) {
247                 if (!((PrefsTab)comps[i]).readyToClose()) {
248                 ready = false;
249                 return; // If not, break off.
250                 }
251             }
252             // Then store settings and close:
253             for (int i = 0; i < count; i++) {
254                 ( (PrefsTab)comps[i]).storeSettings();
255             }
256             Globals.prefs.flush();
257             //try { Thread.sleep(3000); } catch (InterruptedException ex) {}
258             }
259             public void update() {
260             if (!ready)
261                 return;
262             setVisible(false);
263             MainTable.updateRenderers();
264             frame.setupAllTables();
265             frame.groupSelector.revalidateGroups(); // icons may have changed
266             frame.output(Globals.lang("Preferences recorded."));
267             }
268         };
269         worker.getWorker().run();
270         worker.getCallBack().update();
271
272         }
273     }
274
275     public void setValues() {
276     // Update all field values in the tabs:
277     int count = main.getComponentCount();
278     Component[] comps = main.getComponents();
279     for (int i = 0; i < count; i++) {
280         ((PrefsTab)comps[i]).setValues();
281     }
282     }
283
284     class CancelAction extends AbstractAction {
285         public CancelAction() {
286             super("Cancel");
287
288         }
289         public void actionPerformed(ActionEvent e) {
290         setVisible(false);
291             // Just close dialog without recording changes.
292             /*(new Thread() {
293               public void run() {
294
295               }
296               }).start();*/
297         }
298     }
299
300 }