1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.xnap.gui;
21
22 import java.awt.Component;
23 import java.beans.PropertyChangeEvent;
24 import java.beans.PropertyChangeListener;
25
26 import javax.help.CSH;
27 import javax.swing.JOptionPane;
28 import javax.swing.JPanel;
29 import javax.swing.JTabbedPane;
30
31 import org.xnap.XNap;
32 import org.xnap.gui.event.DialogSupport;
33 import org.xnap.gui.prefs.AdvancedTransferPrefsPanel;
34 import org.xnap.gui.prefs.ApplicationPrefsPanel;
35 import org.xnap.gui.prefs.ChatAppearancePrefsPanel;
36 import org.xnap.gui.prefs.ChatPrefsPanel;
37 import org.xnap.gui.prefs.ConfirmPrefsPanel;
38 import org.xnap.gui.prefs.ConsoleAppearancePrefsPanel;
39 import org.xnap.gui.prefs.FilePrefsPanel;
40 import org.xnap.gui.prefs.LookAndFeelPrefsPanel;
41 import org.xnap.gui.prefs.NetworkPrefsPanel;
42 import org.xnap.gui.prefs.PackagePrefsPanel;
43 import org.xnap.gui.prefs.PersonalPrefsPanel;
44 import org.xnap.gui.prefs.ProgramPrefsPanel;
45 import org.xnap.gui.prefs.ProxyPrefsPanel;
46 import org.xnap.gui.prefs.SearchPrefsPanel;
47 import org.xnap.gui.prefs.ShortcutPrefsPanel;
48 import org.xnap.gui.prefs.TransferPrefsPanel;
49 import org.xnap.gui.util.*;
50 import org.xnap.util.Preferences;
51
52 /***
53 * Provides the global preferences dialog.
54 */
55 public class PreferencesDialog extends AbstractPreferencesDialog
56 implements PropertyChangeListener {
57
58
59
60 /***
61 * Used to store dialog listeners.
62 */
63 private static DialogSupport listeners = new DialogSupport();
64 private static PreferencesDialog me = null;
65
66 private Preferences prefs = Preferences.getInstance();
67
68 private boolean canClose;
69 private boolean needToRestartXNap = false;
70
71
72
73 private PreferencesDialog()
74 {
75 super(XNap.tr("XNap - Settings"));
76
77
78 initializePanels();
79 listeners.fireDialogWillBecomeVisible(this);
80
81 setSize(prefs.getPrefsWindowWidth(), prefs.getPrefsWindowHeight());
82 }
83
84
85
86 private void initializePanels()
87 {
88 JTabbedPane jtpGeneral = new JTabbedPane();
89 addPanel(jtpGeneral, XNap.tr("General"), "gohome.png",
90 XNap.tr("Personal settings configuration."));
91 CSH.setHelpIDString(jtpGeneral, "general");
92 addTab(jtpGeneral, new PersonalPrefsPanel());
93 addTab(jtpGeneral, new ConfirmPrefsPanel());
94 addTab(jtpGeneral, new ShortcutPrefsPanel());
95
96 JTabbedPane jtpAppearance = new JTabbedPane();
97 addPanel(jtpAppearance, XNap.tr("Appearance"), "list.png",
98 XNap.tr("Program behaviour and look and feel configuration."));
99 CSH.setHelpIDString(jtpAppearance, "appearance");
100 addTab(jtpAppearance, new ApplicationPrefsPanel());
101 addTab(jtpAppearance, new LookAndFeelPrefsPanel());
102 addTab(jtpAppearance, new ChatAppearancePrefsPanel());
103 addTab(jtpAppearance, new ConsoleAppearancePrefsPanel());
104
105 JTabbedPane jtpFiles = new JTabbedPane();
106 addPanel(jtpFiles, XNap.tr("Files"), "folder.png",
107 XNap.tr("Folder and program configuration."));
108 CSH.setHelpIDString(jtpFiles, "files");
109 addTab(jtpFiles, new FilePrefsPanel());
110 addTab(jtpFiles, new ProgramPrefsPanel());
111
112 JTabbedPane jtpNetwork = new JTabbedPane();
113 addPanel(jtpNetwork, XNap.tr("Network"), "world.png",
114 XNap.tr("Firewall and proxy configuration."));
115 CSH.setHelpIDString(jtpNetwork, "network");
116 addTab(jtpNetwork, new NetworkPrefsPanel());
117 addTab(jtpNetwork, new ProxyPrefsPanel());
118
119
120 SearchPrefsPanel spp = new SearchPrefsPanel();
121 CSH.setHelpIDString(spp, "search");
122 addPanel(spp, "find.png");
123
124
125 JTabbedPane jtpTransfer = new JTabbedPane();
126 addPanel(jtpTransfer, XNap.tr("Transfer"), "connect_established.png",
127 XNap.tr("Throttle and transfer limit configuration."));
128 CSH.setHelpIDString(jtpTransfer, "transfer");
129 addTab(jtpTransfer, new TransferPrefsPanel());
130 addTab(jtpTransfer, new AdvancedTransferPrefsPanel());
131
132
133 addPanel(new ChatPrefsPanel(), "mail_generic.png");
134
135
136 addPanel(new PackagePrefsPanel(), "package.png");
137
138 HelpManager.enableHelpKeys(getRootPane(), "configuring-XNap", null);
139 }
140
141 public boolean apply()
142 {
143
144 canClose = true;
145
146
147 prefs.addPropertyChangeListener(this);
148
149 canClose &= super.apply();
150
151 prefs.removePropertyChangeListener(this);
152 return canClose;
153 }
154
155 public void close()
156 {
157
158 prefs.setPrefsWindowWidth(getBounds().getSize().width);
159 prefs.setPrefsWindowHeight(getBounds().getSize().height);
160
161
162 if (isOkay() && !prefs.write()) {
163 String msg = XNap.tr("Could not write {0}.", prefs.getFilename());
164 JOptionPane.showMessageDialog
165 (this, msg, XNap.tr("Preferences"),
166 JOptionPane.ERROR_MESSAGE);
167 return;
168 }
169
170 if (needToRestartXNap) {
171 Dialogs.showRestartNotification(this);
172 }
173
174 listeners.fireDialogWillBecomeInvisible(this);
175
176 dispose();
177 me = null;
178 }
179
180 public void propertyChange(PropertyChangeEvent e)
181 {
182 String p = e.getPropertyName();
183
184 if (p.equals("lookAndFeel") || p.equals("showTextIcons")
185 || p.equals("theme") || p.equals("language")
186 || p.equals("iconTheme")) {
187
188 needToRestartXNap = true;
189 }
190 }
191
192 /***
193 * Removes <code>jp</code> from the list.
194 */
195 public static void removePanel(JPanel jp)
196 {
197 if (me != null) {
198 me.remove(jp);
199 }
200 }
201
202 /***
203 * Removes <code>tab</code> from the list of {@link SettingsPanel}
204 * objects. After this method has been invoked, <code>tab.apply()</code>
205 * is not called when the dialog is closed.
206 */
207 public static void removePanel(SettingsPanel tab)
208 {
209 if (me != null) {
210 me.remove(tab);
211 }
212 }
213
214 public static void showDialog(Component c)
215 {
216 if (me == null) {
217 me = new PreferencesDialog();
218 }
219 me.show(c);
220 }
221
222 }