View Javadoc

1   /*
2    *  XNap - A P2P framework and client.
3    *
4    *  See the file AUTHORS for copyright information.
5    *
6    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation.
9    *
10   *  This program is distributed in the hope that it will be useful,
11   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   *  GNU General Public License for more details.
14   *
15   *  You should have received a copy of the GNU General Public License
16   *  along with this program; if not, write to the Free Software
17   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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      //--- Data field(s) ---
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      //--- Constructor(s) ---
72  
73      private PreferencesDialog() 
74      {
75  		super(XNap.tr("XNap - Settings"));
76  	
77  		// icon panel
78  		initializePanels();
79  		listeners.fireDialogWillBecomeVisible(this);
80  
81  		setSize(prefs.getPrefsWindowWidth(), prefs.getPrefsWindowHeight());
82      }
83  
84      // --- Methods ---
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 		// search
120 		SearchPrefsPanel spp = new SearchPrefsPanel();
121 		CSH.setHelpIDString(spp, "search");
122 		addPanel(spp, "find.png");
123 		
124 		// transfer
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 		// chat
133 		addPanel(new ChatPrefsPanel(), "mail_generic.png");
134 
135 		// packages
136 		addPanel(new PackagePrefsPanel(), "package.png");
137 
138 		HelpManager.enableHelpKeys(getRootPane(), "configuring-XNap", null);
139     }
140 
141     public boolean apply()
142     {
143 		// initialize
144 		canClose = true;
145 
146 		// register for restart notification
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 		// save dialog prefs
158 		prefs.setPrefsWindowWidth(getBounds().getSize().width);
159 		prefs.setPrefsWindowHeight(getBounds().getSize().height);
160 
161 		// save the preferences to file
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 }