package org.gudy.azureus2.ui.swt.mainwindow;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.ui.common.util.MenuItemManager;
import org.gudy.azureus2.ui.swt.MenuBuildUtils;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.BasicPluginViewImpl;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewImpl;
import org.gudy.azureus2.ui.swt.views.AbstractIView;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
public class PluginsMenuHelper
{
private static PluginsMenuHelper INSTANCE = null;
private AEMonitor plugin_helper_mon = new AEMonitor("plugin_helper_mon");
private Map plugin_view_info_map = new TreeMap();
private Map plugin_logs_view_info_map = new TreeMap();
private PluginsMenuHelper() {
//Making this private
}
public static PluginsMenuHelper getInstance() {
if (null == INSTANCE) {
INSTANCE = new PluginsMenuHelper();
}
return INSTANCE;
}
public void buildPluginMenu(Menu pluginMenu, Shell parent,
boolean includeGetPluginsMenu) {
try {
plugin_helper_mon.enter();
createIViewInfoMenuItems(pluginMenu, plugin_view_info_map);
MenuItem menu_plugin_logViews = MenuFactory.addLogsViewMenuItem(pluginMenu);
createIViewInfoMenuItems(menu_plugin_logViews.getMenu(),
plugin_logs_view_info_map);
} finally {
plugin_helper_mon.exit();
}
MenuFactory.addSeparatorMenuItem(pluginMenu);
org.gudy.azureus2.plugins.ui.menus.MenuItem[] plugin_items;
plugin_items = MenuItemManager.getInstance().getAllAsArray("mainmenu");
if (plugin_items.length > 0) {
MenuBuildUtils.addPluginMenuItems(parent, plugin_items, pluginMenu, true,
true, MenuBuildUtils.BASIC_MENU_ITEM_CONTROLLER);
MenuFactory.addSeparatorMenuItem(pluginMenu);
}
MenuFactory.addPluginInstallMenuItem(pluginMenu);
MenuFactory.addPluginUnInstallMenuItem(pluginMenu);
if (true == includeGetPluginsMenu) {
MenuFactory.addGetPluginsMenuItem(pluginMenu);
}
}
public void addPluginView(String sViewID, UISWTViewEventListener l) {
IViewInfo view_info = new IViewInfo();
view_info.viewID = sViewID;
view_info.event_listener = l;
String sResourceID = UISWTViewImpl.CFG_PREFIX + sViewID + ".title";
boolean bResourceExists = MessageText.keyExists(sResourceID);
String name;
if (bResourceExists) {
name = MessageText.getString(sResourceID);
} else {
// try plain resource
sResourceID = sViewID;
bResourceExists = MessageText.keyExists(sResourceID);
if (bResourceExists) {
name = MessageText.getString(sResourceID);
} else {
name = sViewID.replace('.', ' '); // support old plugins
}
}
view_info.name = name;
Map map_to_use = (l instanceof BasicPluginViewImpl)
? this.plugin_logs_view_info_map : this.plugin_view_info_map;
try {
plugin_helper_mon.enter();
map_to_use.put(name, view_info);
} finally {
plugin_helper_mon.exit();
}
}
private void removePluginViewsWithID(String sViewID, Map map) {
if (sViewID == null) {
return;
}
Iterator itr = map.values().iterator();
IViewInfo view_info = null;
while (itr.hasNext()) {
view_info = (IViewInfo) itr.next();
if (sViewID.equals(view_info.viewID)) {
itr.remove();
}
}
}
public void removePluginViews(final String sViewID) {
try {
plugin_helper_mon.enter();
removePluginViewsWithID(sViewID, plugin_view_info_map);
removePluginViewsWithID(sViewID, plugin_logs_view_info_map);
} finally {
plugin_helper_mon.exit();
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
uiFunctions.closePluginViews(sViewID);
}
}
});
}
public void addPluginView(final AbstractIView view, final String name) {
IViewInfo view_info = new IViewInfo();
view_info.name = name;
view_info.view = view;
try {
plugin_helper_mon.enter();
plugin_view_info_map.put(name, view_info);
} finally {
plugin_helper_mon.exit();
}
}
public void removePluginView(final AbstractIView view, final String name) {
IViewInfo view_info = null;
try {
plugin_helper_mon.enter();
view_info = (IViewInfo) this.plugin_view_info_map.remove(name);
} finally {
plugin_helper_mon.exit();
}
if (view_info != null) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
uiFunctions.closePluginView(view);
}
}
});
}
}
/**
* Populates Azureus' menu bar
* @param locales
* @param parent
*/
private void createIViewInfoMenuItem(Menu parent, final IViewInfo info) {
MenuItem item = new MenuItem(parent, SWT.NULL);
item.setText(info.name);
if (info.viewID != null) {
item.setData("ViewID", info.viewID);
}
item.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
info.openView(uiFunctions);
}
}
});
}
private void createIViewInfoMenuItems(Menu parent, Map menu_data) {
Iterator itr = menu_data.values().iterator();
while (itr.hasNext()) {
createIViewInfoMenuItem(parent, (IViewInfo) itr.next());
}
}
private static class IViewInfo
{
public AbstractIView view;
public String name;
public String viewID;
public UISWTViewEventListener event_listener;
public void openView(UIFunctionsSWT uiFunctions) {
if (event_listener != null) {
uiFunctions.openPluginView(UISWTInstance.VIEW_MAIN, viewID,
event_listener, null, true);
} else {
uiFunctions.openPluginView(view, name);
}
}
}
}