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.plugin.opennap;
21  
22  import java.awt.event.ActionEvent;
23  import java.util.List;
24  
25  import javax.swing.Icon;
26  import javax.swing.JMenu;
27  import javax.swing.JTabbedPane;
28  
29  import org.xnap.XNap;
30  import org.xnap.XNapFacade;
31  import org.xnap.gui.AbstractPreferencesDialog;
32  import org.xnap.gui.DefaultPrefsWizardDialog;
33  import org.xnap.gui.Dialogs;
34  import org.xnap.gui.StatusBar;
35  import org.xnap.gui.XNapFrame;
36  import org.xnap.gui.action.AbstractWizardAction;
37  import org.xnap.gui.component.XNapCheckBoxMenuItem;
38  import org.xnap.gui.component.XNapMenu;
39  import org.xnap.gui.component.XNapMenuItem;
40  import org.xnap.gui.event.AbstractPreferencesDialogListener;
41  import org.xnap.gui.util.IconHelper;
42  import org.xnap.plugin.AbstractPlugin;
43  import org.xnap.plugin.opennap.action.OpenNapAddAnyToHotlistAction;
44  import org.xnap.plugin.opennap.action.OpenNapGetServerListAction;
45  import org.xnap.plugin.opennap.gui.OpenNapAdvancedPreferencesPanel;
46  import org.xnap.plugin.opennap.gui.OpenNapPreferencesPanel;
47  import org.xnap.plugin.opennap.gui.OpenNapSearchOptionsPanel;
48  import org.xnap.plugin.opennap.gui.OpenNapServerPanel;
49  import org.xnap.plugin.opennap.gui.OpenNapServerPreferencesPanel;
50  import org.xnap.plugin.opennap.gui.OpenNapStatusPanel;
51  import org.xnap.plugin.opennap.gui.OpenNapWhoisPanel;
52  import org.xnap.plugin.opennap.gui.OpenNapWizardPanel;
53  import org.xnap.plugin.opennap.gui.UseAutoConnectorAction;
54  import org.xnap.plugin.opennap.net.OpenNapSearchManager;
55  import org.xnap.plugin.opennap.net.OpenNapServerManager;
56  import org.xnap.plugin.opennap.net.OpenNapTransferManager;
57  import org.xnap.plugin.opennap.net.msg.MessageHandler;
58  import org.xnap.plugin.opennap.user.OpenNapUserManager;
59  import org.xnap.plugin.opennap.util.OpenNapPreferences;
60  
61  /***
62   * Provides a plugin that can access multiple OpenNap servers.
63   */
64  public class OpenNapPlugin extends AbstractPlugin 
65  {
66      
67      //--- Constant(s) ---
68  
69      public static String ICON_FILENAME = "network_local.png";
70  
71      public static Icon ICON_16 = IconHelper.getIcon(ICON_FILENAME, 16, false);
72      
73      //--- Data Field(s) ---
74  
75      private static OpenNapPlugin singleton;
76  
77      private JMenu jmOpenNap;
78      private JTabbedPane jtpOpenNap;
79      private OpenNapServerPanel jpServers;
80      private OpenNapWhoisPanel jpWhois;
81      private OpenNapStatusPanel jlStatus;
82      private PreferencesDialogListener pdl;
83  
84      private MessageHandler messageHandler;
85      private OpenNapPreferences napPrefs;
86      private OpenNapSearchManager searchManager;
87      private OpenNapServerManager serverManager;
88      private OpenNapUserManager userManager;
89  	private OpenNapTransferManager transferManager;
90  
91  	private int dataPortErrorCount = 0;
92  
93      //--- Constructor(s) ---
94  
95      public OpenNapPlugin()
96      {
97      }
98  
99      //--- Method(s) ---
100 
101 	/***
102 	 * Invoked when a DataPortErrorMessage is received.
103 	 */
104 	public synchronized void dataPortErrorReceived()
105 	{
106 		dataPortErrorCount++;
107 
108 		if (dataPortErrorCount == 10) {
109 			if (XNapFrame.getInstance() != null) {
110 				Dialogs.showNotification
111 					(XNapFrame.getInstance(), "DataPortError", 
112 					 XNap.tr("XNap Warning"), 			
113 					 XNap.tr("A number of notifications have been received that the local port is misconfigured. Therefore it has been disabled. Open the plugin preferences to renable it."),
114 					 getPreferences());
115 			}
116 			getPreferences().setFirewalled(true);
117 			dataPortErrorCount = 0;
118 		}
119 	}
120 
121     public static OpenNapPlugin getInstance()
122     {
123 		return singleton;
124     }
125 
126     public static MessageHandler getMessageHandler()
127     {
128 		return singleton.messageHandler;
129     }
130 
131     public static OpenNapPreferences getPreferences()
132     {
133 		return singleton.napPrefs;
134     }
135 
136     public static OpenNapSearchManager getSearchManager()
137     {
138 		return singleton.searchManager;
139     }
140 
141     public static OpenNapServerManager getServerManager()
142     {
143 		return singleton.serverManager;
144     }
145 
146     public static OpenNapTransferManager getTransferManager()
147     {
148 		return singleton.transferManager;
149     }
150 
151     public static OpenNapUserManager getUserManager()
152     {
153 		return singleton.userManager;
154     }
155 
156     public void start()
157     {
158 		singleton = this;
159 		napPrefs = new OpenNapPreferences();
160 		userManager = new OpenNapUserManager();
161 		transferManager = new OpenNapTransferManager();
162 		messageHandler = new MessageHandler();
163 		searchManager = new OpenNapSearchManager();
164 		serverManager = new OpenNapServerManager();
165 
166 		userManager.restore();
167 		transferManager.restore();
168 		serverManager.init();
169 		serverManager.getConnector().setEnabled
170 			(napPrefs.getUseAutoconnector());
171     }
172 
173     public void startGUI()
174     {
175 		jtpOpenNap = new JTabbedPane();
176 		jtpOpenNap.setName("opennap");
177 		XNapFrame.getInstance().insertTab
178 			(getInfo().getName(), IconHelper.getListIcon(ICON_FILENAME),
179 			 jtpOpenNap);
180 
181 		jpServers = new OpenNapServerPanel();
182 		getServerManager().addStatsListener(jpServers);
183 		jtpOpenNap.add(XNap.tr("Server"), jpServers);
184 
185       	jpWhois = new OpenNapWhoisPanel();
186 		jpWhois.setName("whois");
187     	jtpOpenNap.add(XNap.tr("Whois"), jpWhois);
188 
189 		jlStatus = new OpenNapStatusPanel();
190 		getServerManager().addStatsListener(jlStatus);
191 		StatusBar.getInstance().addComponent(jlStatus);
192 
193 		initializeMenu();
194 		XNapFrame.getInstance().getMainMenuBar().addPluginMenu(jmOpenNap);
195 
196 		pdl = new PreferencesDialogListener();
197 		XNapFacade.addPluginPreferencesDialogListener(pdl);
198 
199 		XNapFrame.getInstance().getSearchPanel().getAdvancedPanel()
200 			.addOptionsPanel(getSearchManager(), new OpenNapSearchOptionsPanel());
201 
202 		if (!napPrefs.getSeenStartupWizard()) {
203 			showWizard();
204 		}
205     }
206 
207     public void initializeMenu()
208     {
209 		jmOpenNap = new XNapMenu(getInfo().getName());
210 		jmOpenNap.setIcon(IconHelper.getMenuIcon(ICON_FILENAME));
211 
212 		XNapMenu jmStartup = new XNapMenu(XNap.tr("Startup"));
213 		jmOpenNap.add(jmStartup);
214 		jmStartup.add(new XNapCheckBoxMenuItem(new UseAutoConnectorAction()));
215 		jmOpenNap.addSeparator();
216 		jmOpenNap.add(new XNapMenuItem(new OpenNapAddAnyToHotlistAction()));
217 		jmOpenNap.addSeparator();
218  		jmOpenNap.add(new XNapMenuItem(new OpenNapGetServerListAction()));
219 		jmOpenNap.addSeparator();
220 		jmOpenNap.add(new XNapMenuItem(new ShowWizardAction()));
221     }
222 
223 	public void showWizard()
224 	{
225 		DefaultPrefsWizardDialog d 
226 			= new DefaultPrefsWizardDialog(napPrefs, "seenStartupWizard");
227 		d.addPanel(new OpenNapWizardPanel());
228 		d.show(XNapFrame.getInstance());
229 	}
230 
231     public void stop()
232     {
233 		userManager.save();
234 		transferManager.save();
235 		transferManager.clear();
236 		messageHandler.die();
237 		serverManager.die();
238 
239 		messageHandler = null;
240 		serverManager = null;
241 		searchManager = null;
242 		transferManager = null;
243 		userManager = null;
244 		napPrefs = null;
245 
246 		// we can not cleanly unload the plugin...
247 		//singleton = null;
248     }
249 
250     public void stopGUI()
251     {
252 		XNapFrame.getInstance().getSearchPanel().getAdvancedPanel()
253 			.removeOptionsPanel(getSearchManager());
254 
255 		pdl.dispose();
256 		XNapFacade.removePluginPreferencesDialogListener(pdl);
257 		pdl = null;
258 
259 		XNapFrame.getInstance().getMainMenuBar().removePluginMenu(jmOpenNap);
260 		jmOpenNap = null;
261 
262 		getServerManager().removeStatsListener(jlStatus);
263 		StatusBar.getInstance().removeComponent(jlStatus);
264 		jlStatus = null;
265 
266 		XNapFrame.getInstance().removeTab(jtpOpenNap);
267 		jtpOpenNap = null;
268 
269 		getServerManager().removeStatsListener(jpServers);
270 		jpServers = null;
271 
272 		jpWhois = null;
273     }
274 
275     // --- Inner Class(es) ---
276 
277     private class PreferencesDialogListener 
278 		extends AbstractPreferencesDialogListener
279     {
280 
281 		public void addPanels(AbstractPreferencesDialog dialog, List panels) 
282 		{
283 			JTabbedPane jtp = new JTabbedPane();
284 			dialog.addPanel(jtp, getInfo().getName(), ICON_FILENAME, 
285 					   XNap.tr("{0} settings", getInfo().getName()));
286 			panels.add(jtp);
287 
288 			OpenNapPreferencesPanel npp = new OpenNapPreferencesPanel();
289 			dialog.addTab(jtp, npp);
290 			panels.add(npp);
291 	    
292 			OpenNapServerPreferencesPanel spp = new OpenNapServerPreferencesPanel();
293 			dialog.addTab(jtp, spp);
294 			panels.add(spp);
295 			
296 			OpenNapAdvancedPreferencesPanel napp
297 				= new OpenNapAdvancedPreferencesPanel();
298 			dialog.addTab(jtp, napp);
299 			panels.add(napp);
300 
301 		}
302 
303 
304     }
305 
306 	private class ShowWizardAction extends AbstractWizardAction
307 	{
308 		public void actionPerformed(ActionEvent event) 
309 		{
310 			showWizard();
311 		}
312 	}
313 
314 }
315