1 /*
2  * Copyright (C) Azureus Software, Inc, All Rights Reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details ( see the LICENSE file ).
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18 
19 package com.aelitis.azureus.ui.swt.shells.main;
20 
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.*;
23 import org.eclipse.swt.widgets.*;
24 
25 import org.gudy.azureus2.core3.config.COConfigurationManager;
26 import org.gudy.azureus2.core3.config.ParameterListener;
27 import org.gudy.azureus2.core3.config.impl.ConfigurationDefaults;
28 import org.gudy.azureus2.core3.util.Constants;
29 import org.gudy.azureus2.core3.util.Debug;
30 import org.gudy.azureus2.core3.util.SystemProperties;
31 import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarActivationListener;
32 import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarItem;
33 import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarManager;
34 import org.gudy.azureus2.ui.swt.KeyBindings;
35 import org.gudy.azureus2.ui.swt.MenuBuildUtils;
36 import org.gudy.azureus2.ui.swt.Messages;
37 import org.gudy.azureus2.ui.swt.Utils;
38 import org.gudy.azureus2.ui.swt.mainwindow.*;
39 import org.gudy.azureus2.ui.swt.pluginsimpl.UIToolBarManagerImpl;
40 
41 import com.aelitis.azureus.core.cnetwork.ContentNetwork;
42 import com.aelitis.azureus.core.util.FeatureAvailability;
43 import com.aelitis.azureus.ui.UIFunctionsManager;
44 import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
45 import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
46 import com.aelitis.azureus.ui.skin.SkinConstants;
47 import com.aelitis.azureus.ui.swt.feature.FeatureManagerUI;
48 import com.aelitis.azureus.ui.swt.skin.SWTSkin;
49 import com.aelitis.azureus.ui.swt.skin.SWTSkinFactory;
50 import com.aelitis.azureus.ui.swt.skin.SWTSkinObject;
51 import com.aelitis.azureus.ui.swt.skin.SWTSkinUtils;
52 import com.aelitis.azureus.ui.swt.views.skin.SBC_PlusFTUX;
53 import com.aelitis.azureus.ui.swt.views.skin.SkinViewManager;
54 import com.aelitis.azureus.ui.swt.views.skin.ToolBarView;
55 import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBar;
56 import com.aelitis.azureus.util.ConstantsVuze;
57 import com.aelitis.azureus.util.ContentNetworkUtils;
58 
59 public class MainMenu
60 	implements IMainMenu, IMenuConstants
61 {
62 	private final static String PREFIX_V2 = "MainWindow.menu";
63 
64 	private final static String PREFIX_V3 = "v3.MainWindow.menu";
65 
66 	private Menu menuBar;
67 
68 	/**
69 	 * Creates the main menu on the supplied shell
70 	 *
71 	 * @param shell
72 	 */
MainMenu(SWTSkin skin, final Shell shell)73 	public MainMenu(SWTSkin skin, final Shell shell) {
74 		if (null == skin) {
75 			System.err.println("MainMenu: The parameter [SWTSkin skin] can not be null");
76 			return;
77 		}
78 
79 		buildMenu(shell);
80 
81 	}
82 
buildMenu(Shell parent)83 	private void buildMenu(Shell parent) {
84 
85 		//The Main Menu
86 		menuBar = new Menu(parent, SWT.BAR);
87 		parent.setMenuBar(menuBar);
88 
89 		addFileMenu();
90 		//addViewMenu();
91 		addSimpleViewMenu();
92 
93 		addCommunityMenu();
94 
95 		addToolsMenu();
96 
97 		/*
98 		 * The Torrents menu is a user-configured option
99 		 */
100 		if (true == COConfigurationManager.getBooleanParameter("show_torrents_menu")) {
101 			addTorrentMenu();
102 		}
103 
104 		if (!Constants.isWindows) {
105 			addWindowMenu();
106 		}
107 
108 		// ===== Debug menu (development only)====
109 		if (org.gudy.azureus2.core3.util.Constants.isCVSVersion()) {
110 			final Menu menuDebug = org.gudy.azureus2.ui.swt.mainwindow.DebugMenuHelper.createDebugMenuItem(menuBar);
111 			menuDebug.addMenuListener(new MenuListener() {
112 
113 				public void menuShown(MenuEvent e) {
114 					MenuItem[] items = menuDebug.getItems();
115 					Utils.disposeSWTObjects(items);
116 
117 					DebugMenuHelper.createDebugMenuItem(menuDebug);
118 					MenuFactory.addSeparatorMenuItem(menuDebug);
119 					MenuItem menuItem = new MenuItem(menuDebug, SWT.PUSH);
120 					menuItem.setText("Log Views");
121 					menuItem.setEnabled(false);
122 					PluginsMenuHelper.getInstance().buildPluginLogsMenu(menuDebug);
123 				}
124 
125 				public void menuHidden(MenuEvent e) {
126 				}
127 			});
128 		}
129 
130 		addV3HelpMenu();
131 
132 		/*
133 		 * Enabled/disable menus based on what ui mode we're in; this method call controls
134 		 * which menus are enabled when we're in Vuze vs. Vuze Advanced
135 		 */
136 		MenuFactory.updateEnabledStates(menuBar);
137 	}
138 
139 	/**
140 	 * Creates the File menu and all its children
141 	 */
addFileMenu()142 	private void addFileMenu() {
143 		MenuItem fileItem = MenuFactory.createFileMenuItem(menuBar);
144 		final Menu fileMenu = fileItem.getMenu();
145 		builFileMenu(fileMenu);
146 
147 		fileMenu.addListener(SWT.Show, new Listener() {
148 			public void handleEvent(Event event) {
149 				MenuItem[] menuItems = fileMenu.getItems();
150 				for (int i = 0; i < menuItems.length; i++) {
151 					menuItems[i].dispose();
152 				}
153 
154 				builFileMenu(fileMenu);
155 			}
156 		});
157 	}
158 
159 	/**
160 	 * Builds the File menu dynamically
161 	 * @param fileMenu
162 	 */
builFileMenu(Menu fileMenu)163 	private void builFileMenu(Menu fileMenu) {
164 
165 		MenuItem openMenuItem = MenuFactory.createOpenMenuItem(fileMenu);
166 		Menu openSubMenu = openMenuItem.getMenu();
167 		MenuFactory.addOpenTorrentMenuItem(openSubMenu);
168 		MenuFactory.addOpenURIMenuItem(openSubMenu);
169 		MenuFactory.addOpenTorrentForTrackingMenuItem(openSubMenu);
170 		MenuFactory.addOpenVuzeFileMenuItem(openSubMenu);
171 
172 		int userMode = COConfigurationManager.getIntParameter("User Mode");
173 
174 		if ( userMode > 0 ){
175 			Menu shareSubMenu = MenuFactory.createShareMenuItem(fileMenu).getMenu();
176 			MenuFactory.addShareFileMenuItem(shareSubMenu);
177 			MenuFactory.addShareFolderMenuItem(shareSubMenu);
178 			MenuFactory.addShareFolderContentMenuItem(shareSubMenu);
179 			MenuFactory.addShareFolderContentRecursiveMenuItem(shareSubMenu);
180 		}
181 
182 		MenuFactory.addCreateMenuItem(fileMenu);
183 
184 		if (FeatureManagerUI.enabled) {
185 			MenuFactory.addSeparatorMenuItem(fileMenu);
186   		MenuFactory.addMenuItem(fileMenu, "menu.plus", new Listener() {
187   			public void handleEvent(Event event) {
188   				SBC_PlusFTUX.setSourceRef("menu-file");
189 
190   				MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
191   				mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS);
192   			}
193   		});
194 		}
195 
196 		MenuFactory.addSeparatorMenuItem(fileMenu);
197 		MenuFactory.addCloseWindowMenuItem(fileMenu);
198 		MenuFactory.addCloseDetailsMenuItem(fileMenu);
199 		MenuFactory.addCloseDownloadBarsToMenu(fileMenu);
200 
201 		MenuFactory.addSeparatorMenuItem(fileMenu);
202 		MenuFactory.createTransfersMenuItem(fileMenu);
203 
204 		/*
205 		 * No need for restart and exit on OS X since it's already handled on the application menu
206 		 */
207 		if (!Utils.isCarbon) {
208 			MenuFactory.addSeparatorMenuItem(fileMenu);
209 			MenuFactory.addRestartMenuItem(fileMenu);
210 		}
211 		if (!Constants.isOSX) {
212 			MenuFactory.addExitMenuItem(fileMenu);
213 		}
214 	}
215 
addSimpleViewMenu()216 	private void addSimpleViewMenu() {
217 		try {
218 			MenuItem viewItem = MenuFactory.createViewMenuItem(menuBar);
219 			final Menu viewMenu = viewItem.getMenu();
220 
221 			viewMenu.addListener(SWT.Show, new Listener() {
222 				public void handleEvent(Event event) {
223 					Utils.disposeSWTObjects(viewMenu.getItems());
224 					buildSimpleViewMenu(viewMenu,-1);
225 				}
226 			});
227 
228 				// hack to handle key binding before menu is actually created...
229 
230 			final KeyBindings.KeyBindingInfo binding_info = KeyBindings.getKeyBindingInfo( "v3.MainWindow.menu.view." + SkinConstants.VIEWID_PLUGINBAR );
231 
232 			if ( binding_info != null ){
233 				Display.getDefault().addFilter(SWT.KeyDown, new Listener() {
234 					public void handleEvent(Event event) {
235 						if (event.keyCode == binding_info.accelerator ){
236 							Utils.disposeSWTObjects(viewMenu.getItems());
237 							buildSimpleViewMenu(viewMenu, event.keyCode);
238 						}
239 					}
240 				});
241 			}
242 		} catch (Exception e) {
243 			Debug.out("Error creating View Menu", e);
244 		}
245 	}
246 
247 	/**
248 	 * @param viewMenu
249 	 *
250 	 * @since 4.5.0.3
251 	 */
buildSimpleViewMenu(final Menu viewMenu, int accelerator)252 	private void buildSimpleViewMenu(final Menu viewMenu, int accelerator) {
253 		try {
254 
255 			MenuFactory.addMenuItem(viewMenu, SWT.CHECK, PREFIX_V3 + ".view.sidebar",
256 					new Listener() {
257 						public void handleEvent(Event event) {
258 							SideBar sidebar = (SideBar) SkinViewManager.getByClass(SideBar.class);
259 							if (sidebar != null) {
260 								sidebar.flipSideBarVisibility();
261 							}
262 						}
263 					});
264 
265 			if (COConfigurationManager.getIntParameter("User Mode") > 1) {
266 
267 				SWTSkin skin = SWTSkinFactory.getInstance();
268 
269 				SWTSkinObject plugin_bar = skin.getSkinObject(SkinConstants.VIEWID_PLUGINBAR);
270 
271 				if ( plugin_bar != null ){
272 
273 					MenuItem mi =
274 						MainMenu.createViewMenuItem(skin, viewMenu,
275 							"v3.MainWindow.menu.view." + SkinConstants.VIEWID_PLUGINBAR,
276 							SkinConstants.VIEWID_PLUGINBAR + ".visible",
277 							SkinConstants.VIEWID_PLUGINBAR, true, -1);
278 
279 					if ( accelerator != -1 && mi.getAccelerator() == accelerator ){
280 
281 						Listener[] listeners = mi.getListeners( SWT.Selection );
282 
283 						for ( Listener l: listeners ){
284 
285 							try{
286 								l.handleEvent( null );
287 
288 							}catch( Throwable e ){
289 							}
290 						}
291 					}
292 				}
293 			}
294 
295 			/////////
296 
297 			MenuItem itemStatusBar = MenuFactory.createTopLevelMenuItem(viewMenu,
298 					"v3.MainWindow.menu.view.statusbar");
299 			itemStatusBar.setText(itemStatusBar.getText());
300 			Menu menuStatusBar = itemStatusBar.getMenu();
301 
302 			final String[] statusAreaLangs = {
303 				"ConfigView.section.style.status.show_sr",
304 				"ConfigView.section.style.status.show_nat",
305 				"ConfigView.section.style.status.show_ddb",
306 				"ConfigView.section.style.status.show_ipf",
307 			};
308 			final String[] statusAreaConfig = {
309 				"Status Area Show SR",
310 				"Status Area Show NAT",
311 				"Status Area Show DDB",
312 				"Status Area Show IPF",
313 			};
314 
315 			for (int i = 0; i < statusAreaConfig.length; i++) {
316 				final String configID = statusAreaConfig[i];
317 				String langID = statusAreaLangs[i];
318 
319 				final MenuItem item = new MenuItem(menuStatusBar, SWT.CHECK);
320 				Messages.setLanguageText(item, langID);
321 				item.addListener(SWT.Selection, new Listener() {
322 					public void handleEvent(Event event) {
323 						COConfigurationManager.setParameter(configID,
324 								!COConfigurationManager.getBooleanParameter(configID));
325 					}
326 				});
327 				menuStatusBar.addListener(SWT.Show, new Listener() {
328 					public void handleEvent(Event event) {
329 						item.setSelection(COConfigurationManager.getBooleanParameter(configID));
330 					}
331 				});
332 			}
333 
334 			/////////
335 
336 			if (Constants.isWindows) {
337 				MenuFactory.addSeparatorMenuItem(viewMenu);
338 			}
339 
340 			boolean needsSep = false;
341 			boolean enabled = COConfigurationManager.getBooleanParameter("Beta Programme Enabled");
342 			if (enabled) {
343 				MenuFactory.addMenuItem(viewMenu, SWT.CHECK, PREFIX_V2 + ".view.beta",
344 						new Listener() {
345 							public void handleEvent(Event event) {
346 								MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
347 								if (mdi != null) {
348 									mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_BETAPROGRAM);
349 								}
350 							}
351 				});
352 				needsSep = true;
353 			}
354 
355 			if (Constants.isWindows && FeatureAvailability.isGamesEnabled()) {
356   			MenuFactory.addMenuItem(viewMenu, PREFIX_V3 + ".games", new Listener() {
357   				public void handleEvent(Event event) {
358   					MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
359   					mdi.showEntryByID(SideBar.SIDEBAR_SECTION_GAMES);
360   				}
361   			});
362 				needsSep = true;
363 			}
364 
365 
366 			if (needsSep) {
367 				MenuFactory.addSeparatorMenuItem(viewMenu);
368 			}
369 
370 			needsSep = PluginsMenuHelper.getInstance().buildViewMenu(viewMenu, viewMenu.getShell());
371 
372 			if ( COConfigurationManager.getBooleanParameter( "Library.EnableSimpleView" )){
373 
374 				if (needsSep) {
375 					MenuFactory.addSeparatorMenuItem(viewMenu);
376 				}
377 
378 					// Ubuntu Unity (14.04) with SWT 4508 crashes when global View menu triggered as it appears
379 					// that radio menu items aren't supported
380 					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=419729#c9
381 
382 				int simple_advanced_menu_type = Constants.isLinux?SWT.CHECK:SWT.RADIO;
383 
384 				MenuFactory.addMenuItem(viewMenu, simple_advanced_menu_type, PREFIX_V3
385 						+ ".view.asSimpleList", new Listener() {
386 					public void handleEvent(Event event) {
387 						UIToolBarManager tb = UIToolBarManagerImpl.getInstance();
388 						if (tb != null) {
389 							UIToolBarItem item = tb.getToolBarItem("modeBig");
390 							if (item != null) {
391 								item.triggerToolBarItem(
392 										UIToolBarActivationListener.ACTIVATIONTYPE_NORMAL,
393 										SelectedContentManager.convertSelectedContentToObject(null));
394 							}
395 						}
396 					}
397 				});
398 				MenuFactory.addMenuItem(viewMenu, simple_advanced_menu_type, PREFIX_V3
399 						+ ".view.asAdvancedList", new Listener() {
400 					public void handleEvent(Event event) {
401 						UIToolBarManager tb = UIToolBarManagerImpl.getInstance();
402 						if (tb != null) {
403 							UIToolBarItem item = tb.getToolBarItem("modeSmall");
404 							if (item != null) {
405 								item.triggerToolBarItem(
406 										UIToolBarActivationListener.ACTIVATIONTYPE_NORMAL,
407 										SelectedContentManager.convertSelectedContentToObject(null));
408 							}
409 						}
410 					}
411 				});
412 			}
413 
414 			viewMenu.addMenuListener(new MenuListener() {
415 
416 				public void menuShown(MenuEvent e) {
417 
418 					MenuItem sidebarMenuItem = MenuFactory.findMenuItem(viewMenu,
419 							PREFIX_V3 + ".view.sidebar");
420 					if (sidebarMenuItem != null) {
421 						MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
422 						if (mdi != null) {
423 							sidebarMenuItem.setSelection(mdi.isVisible());
424 						}
425 					}
426 
427 					MenuItem itemShowText = MenuFactory.findMenuItem(viewMenu, PREFIX_V3
428 							+ ".view.toolbartext");
429 					if (itemShowText != null) {
430 						ToolBarView tb = (ToolBarView) SkinViewManager.getByClass(ToolBarView.class);
431 						if (tb != null) {
432 							itemShowText.setSelection(tb.getShowText());
433 						}
434 					}
435 
436 					if ( COConfigurationManager.getBooleanParameter( "Library.EnableSimpleView" )){
437 
438 						MenuItem itemShowAsSimple = MenuFactory.findMenuItem(viewMenu,
439 								PREFIX_V3 + ".view.asSimpleList");
440 						if (itemShowAsSimple != null) {
441 							UIToolBarManager tb = UIToolBarManagerImpl.getInstance();
442 							if (tb != null) {
443 								UIToolBarItem item = tb.getToolBarItem("modeBig");
444 								long state = item == null ? 0 : item.getState();
445 								itemShowAsSimple.setEnabled((state & UIToolBarItem.STATE_ENABLED) > 0);
446 								itemShowAsSimple.setSelection((state & UIToolBarItem.STATE_DOWN) > 0);
447 							}
448 						}
449 						MenuItem itemShowAsAdv = MenuFactory.findMenuItem(viewMenu, PREFIX_V3
450 								+ ".view.asAdvancedList");
451 						if (itemShowAsAdv != null) {
452 							UIToolBarManager tb = UIToolBarManagerImpl.getInstance();
453 							if (tb != null) {
454 								UIToolBarItem item = tb.getToolBarItem("modeSmall");
455 								long state = item == null ? 0 : item.getState();
456 								itemShowAsAdv.setEnabled((state & UIToolBarItem.STATE_ENABLED) > 0);
457 								itemShowAsAdv.setSelection((state & UIToolBarItem.STATE_DOWN) > 0);
458 							}
459 						}
460 					}
461 				}
462 
463 				public void menuHidden(MenuEvent e) {
464 				}
465 			});
466 		} catch (Exception e) {
467 			Debug.out("Error creating View Menu", e);
468 		}
469 	}
470 
471 	/**
472 	 * Creates the Tools menu and all its children
473 	 */
addToolsMenu()474 	private void addToolsMenu() {
475 		MenuItem toolsItem = MenuFactory.createToolsMenuItem(menuBar);
476 		Menu toolsMenu = toolsItem.getMenu();
477 
478 		MenuFactory.addMyTrackerMenuItem(toolsMenu);
479 		MenuFactory.addMySharesMenuItem(toolsMenu);
480 		MenuFactory.addConsoleMenuItem(toolsMenu);
481 		MenuFactory.addStatisticsMenuItem(toolsMenu);
482 		MenuFactory.addSpeedLimitsToMenu(toolsMenu);
483 
484 		MenuFactory.addTransferBarToMenu(toolsMenu);
485 		MenuFactory.addAllPeersMenuItem(toolsMenu);
486 		MenuFactory.addClientStatsMenuItem(toolsMenu);
487 		MenuFactory.addBlockedIPsMenuItem(toolsMenu);
488 
489 		MenuFactory.addSeparatorMenuItem(toolsMenu);
490 		MenuFactory.createPluginsMenuItem(toolsMenu, true);
491 
492 		MenuFactory.addPairingMenuItem(toolsMenu);
493 
494 		MenuFactory.addOptionsMenuItem(toolsMenu);
495 
496 	}
497 
498 	/**
499 	 * Creates the Help menu and all its children
500 	 */
addV3HelpMenu()501 	private void addV3HelpMenu() {
502 		MenuItem helpItem = MenuFactory.createHelpMenuItem(menuBar);
503 		Menu helpMenu = helpItem.getMenu();
504 
505 		if (false == Constants.isOSX) {
506 			/*
507 			 * The 'About' menu is on the application menu on OSX
508 			 */
509 			MenuFactory.addAboutMenuItem(helpMenu);
510 			MenuFactory.addSeparatorMenuItem(helpMenu);
511 		}
512 
513 		MenuFactory.addMenuItem(helpMenu, PREFIX_V3 + ".getting_started",
514 				new Listener() {
515 					public void handleEvent(Event event) {
516 						MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
517 						if (mdi != null) {
518 							mdi.showEntryByID(SideBar.SIDEBAR_SECTION_WELCOME);
519 						}
520 					}
521 				});
522 
523 		MenuFactory.addHelpSupportMenuItem(
524 				helpMenu,
525 				ContentNetworkUtils.getUrl(
526 				ConstantsVuze.getDefaultContentNetwork(), ContentNetwork.SERVICE_SUPPORT));
527 
528 		MenuFactory.addHealthMenuItem(helpMenu);
529 
530 		MenuFactory.addReleaseNotesMenuItem(helpMenu);
531 
532 		if (false == SystemProperties.isJavaWebStartInstance()) {
533 			MenuFactory.addSeparatorMenuItem(helpMenu);
534 			MenuFactory.addCheckUpdateMenuItem(helpMenu);
535 			MenuFactory.addBetaMenuItem(helpMenu);
536 			MenuFactory.addVoteMenuItem(helpMenu);
537 		}
538 
539 		if (FeatureManagerUI.enabled) {
540   		MenuFactory.addMenuItem(helpMenu, "menu.register", new Listener() {
541   			public void handleEvent(Event event) {
542   				FeatureManagerUI.openLicenceEntryWindow(false, null);
543   			}
544   		});
545 		}
546 
547 		MenuFactory.addDonationMenuItem(helpMenu);
548 
549 		MenuFactory.addSeparatorMenuItem(helpMenu);
550 		MenuFactory.addConfigWizardMenuItem(helpMenu);
551 		MenuFactory.addNatTestMenuItem(helpMenu);
552 		MenuFactory.addNetStatusMenuItem(helpMenu);
553 		MenuFactory.addSpeedTestMenuItem(helpMenu);
554 		MenuFactory.addAdvancedHelpMenuItem(helpMenu);
555 
556 		MenuFactory.addSeparatorMenuItem(helpMenu);
557 		MenuFactory.addDebugHelpMenuItem(helpMenu);
558 
559 	}
560 
561 	/**
562 	 * Creates the Window menu and all its children
563 	 */
addWindowMenu()564 	private void addWindowMenu() {
565 		MenuItem menu_window = MenuFactory.createWindowMenuItem(menuBar);
566 		Menu windowMenu = menu_window.getMenu();
567 
568 		MenuFactory.addMinimizeWindowMenuItem(windowMenu);
569 		MenuFactory.addZoomWindowMenuItem(windowMenu);
570 		MenuFactory.addSeparatorMenuItem(windowMenu);
571 		MenuFactory.addBringAllToFrontMenuItem(windowMenu);
572 
573 		MenuFactory.addSeparatorMenuItem(windowMenu);
574 		MenuFactory.appendWindowMenuItems(windowMenu);
575 	}
576 
577 	/**
578 	 * Creates the Torrent menu and all its children
579 	 */
addTorrentMenu()580 	private void addTorrentMenu() {
581 		MenuFactory.createTorrentMenuItem(menuBar);
582 	}
583 
getMenu(String id)584 	public Menu getMenu(String id) {
585 		if (true == MENU_ID_MENU_BAR.equals(id)) {
586 			return menuBar;
587 		}
588 		return MenuFactory.findMenu(menuBar, id);
589 	}
590 
addCommunityMenu()591 	private void addCommunityMenu() {
592 		MenuItem item = MenuFactory.createTopLevelMenuItem(menuBar,	MENU_ID_COMMUNITY);
593 
594 		final Menu communityMenu = item.getMenu();
595 
596 		communityMenu.addListener(
597 			SWT.Show,
598 			new Listener()
599 			{
600 				public void
601 				handleEvent( Event event)
602 				{
603 					Utils.disposeSWTObjects( communityMenu.getItems());
604 
605 					MenuFactory.addMenuItem(communityMenu, MENU_ID_COMMUNITY_FORUMS,
606 						new Listener() {
607 							public void handleEvent(Event e) {
608 								Utils.launch(ContentNetworkUtils.getUrl(
609 										ConstantsVuze.getDefaultContentNetwork(),
610 										ContentNetwork.SERVICE_FORUMS));
611 							}
612 						});
613 
614 					MenuFactory.addMenuItem(communityMenu, MENU_ID_COMMUNITY_WIKI,
615 						new Listener() {
616 							public void handleEvent(Event e) {
617 								Utils.launch(ContentNetworkUtils.getUrl(
618 										ConstantsVuze.getDefaultContentNetwork(),
619 										ContentNetwork.SERVICE_WIKI));
620 							}
621 						});
622 
623 					MenuBuildUtils.addChatMenu( communityMenu, MENU_ID_COMMUNITY_CHAT, "General: Help" );
624 
625 					MenuFactory.addMenuItem(communityMenu, MENU_ID_COMMUNITY_BLOG,
626 						new Listener() {
627 							public void handleEvent(Event e) {
628 								Utils.launch(ContentNetworkUtils.getUrl(
629 										ConstantsVuze.getDefaultContentNetwork(),
630 										ContentNetwork.SERVICE_BLOG));
631 							}
632 						});
633 				}
634 			});
635 	}
636 
637 	//====================================
638 
639 	/**
640 	 * @deprecated This method has been replaced with {@link #getMenu(String)};
641 	 * use {@link #getMenu(IMenuConstants.MENU_ID_MENU_BAR)} instead
642 	 * @return the menuBar
643 	 */
getMenuBar()644 	public Menu getMenuBar() {
645 		return menuBar;
646 	}
647 
648 	/**
649 	 * @param viewMenu
650 	 * @param string
651 	 * @param string2
652 	 */
createViewMenuItem(final SWTSkin skin, Menu viewMenu, final String textID, final String configID, final String viewID, final boolean fast, int menuIndex)653 	public static MenuItem createViewMenuItem(final SWTSkin skin, Menu viewMenu,
654 			final String textID, final String configID, final String viewID,
655 			final boolean fast, int menuIndex) {
656 		MenuItem item;
657 
658 		if (!ConfigurationDefaults.getInstance().doesParameterDefaultExist(configID)) {
659 			COConfigurationManager.setBooleanDefault(configID, true);
660 		}
661 
662 		item = MenuFactory.addMenuItem(viewMenu, SWT.CHECK, menuIndex, textID,
663 				new Listener() {
664 					public void handleEvent(Event event) {
665 						SWTSkinObject skinObject = skin.getSkinObject(viewID);
666 						if (skinObject != null) {
667 							boolean newVisibility = !skinObject.isVisible();
668 
669 							SWTSkinUtils.setVisibility(skin, configID, viewID, newVisibility,
670 									true, fast);
671 						}
672 					}
673 				});
674 		SWTSkinUtils.setVisibility(skin, configID, viewID,
675 				COConfigurationManager.getBooleanParameter(configID), false, true);
676 
677 		final MenuItem itemViewPluginBar = item;
678 		final ParameterListener listener = new ParameterListener() {
679 			public void parameterChanged(String parameterName) {
680 				itemViewPluginBar.setSelection(COConfigurationManager.getBooleanParameter(parameterName));
681 			}
682 		};
683 
684 		COConfigurationManager.addAndFireParameterListener(configID, listener);
685 		item.addDisposeListener(new DisposeListener() {
686 			public void widgetDisposed(DisposeEvent e) {
687 				COConfigurationManager.removeParameterListener(configID, listener);
688 			}
689 		});
690 
691 		return item;
692 	}
693 
694 	// backward compat..
setVisibility(SWTSkin skin, String configID, String viewID, boolean visible)695 	public static void setVisibility(SWTSkin skin, String configID,
696 			String viewID, boolean visible) {
697 		SWTSkinUtils.setVisibility(skin, configID, viewID, visible, true, false);
698 	}
699 
700 	// backward compat..
setVisibility(SWTSkin skin, String configID, String viewID, boolean visible, boolean save)701 	public static void setVisibility(SWTSkin skin, String configID,
702 			String viewID, boolean visible, boolean save) {
703 		SWTSkinUtils.setVisibility(skin, configID, viewID, visible, save, false);
704 	}
705 
706 }
707