/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.incubator; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; /** * Utililty class to remove items from context menus. As context menus are created at runtime, it is not possible to remove the items in * advanced at a centralized location. * * @author Oliver Seebach */ public final class ContextMenuItemRemover { private static List<String> itemsToRemove; private ContextMenuItemRemover() { } /** * Removes unwanted context menu entries from the given control. * * @param control The control where the context menu should be edited. */ public static void removeUnwantedMenuEntries(Control control) { final Properties unwanted = new Properties(); try { unwanted.load(ContextMenuItemRemover.class.getResourceAsStream("unwanted.properties")); } catch (IOException e) { return; } String unwantedEntriesProperty = unwanted.getProperty("unwantedContextMenuEntries"); itemsToRemove = new ArrayList<String>(Arrays.asList(unwantedEntriesProperty.split(","))); if (!control.isDisposed() && control.getMenu() != null) { // prevent multiple listener registration if (control.getData("MenuDetectToken") == null) { control.setData("MenuDetectToken", true); control.addMenuDetectListener(new RemoveItemsMenuDetectListener()); } } } /** * Menu listener to remove unwanted items. Items are removed if they are in the list of unwanted items or if they are a separator and * preceeded by a separator (which can occur when other items are removed). * * @author Oliver Seebach */ private static class RemoveItemsMenuListener implements MenuListener { private final Menu menu; /** * Submenu listener to remove unwanted items. Items are removed if they are in the list of unwanted items or if they are a separator * and preceeded by a separator (which can occur when other items are removed). * * @author Oliver Seebach */ private final class CustomSubMenuListener implements MenuListener { @Override public void menuShown(MenuEvent event) { MenuItem preceedingSubMenuItem = null; final Menu subMenu = ((Menu) event.widget); for (MenuItem subMenuItem : subMenu.getItems()) { if (preceedingSubMenuItem != null && preceedingSubMenuItem.isDisposed()) { preceedingSubMenuItem = null; } if (itemsToRemove.contains(subMenuItem.getText()) || (preceedingSubMenuItem != null && preceedingSubMenuItem.getText().isEmpty() && subMenuItem.getText().isEmpty())) { subMenuItem.dispose(); } else { preceedingSubMenuItem = subMenuItem; } } } @Override public void menuHidden(MenuEvent arg0) {} } RemoveItemsMenuListener(Menu menu) { this.menu = menu; } @Override public void menuShown(MenuEvent menuEvent) { MenuItem preceedingMainMenuItem = null; for (MenuItem mainMenuItem : menu.getItems()) { MenuItem itemToHandle = null; if (!mainMenuItem.isDisposed()) { itemToHandle = mainMenuItem; if (itemsToRemove.contains(mainMenuItem.getText()) || (preceedingMainMenuItem != null && preceedingMainMenuItem.getText().isEmpty() && itemToHandle.getText().isEmpty())) { itemToHandle.dispose(); } else { preceedingMainMenuItem = itemToHandle; } // handle submenu if (!itemToHandle.isDisposed() && itemToHandle.getMenu() != null) { // prevent multiple listener registration if (itemToHandle.getMenu().getData("SubMenuListenerToken") == null) { itemToHandle.getMenu().setData("SubMenuListenerToken", true); itemToHandle.getMenu().addMenuListener(new CustomSubMenuListener()); } } } } } @Override public void menuHidden(MenuEvent arg0) {} } /** * Menu detect listener to remove unwanted items. * * @author Oliver Seebach */ private static class RemoveItemsMenuDetectListener implements MenuDetectListener { @Override public void menuDetected(MenuDetectEvent event) { final Menu menu = ((Control) event.widget).getMenu(); if (!menu.isDisposed() && menu != null) { // prevent multiple listener registration if (menu.getData("MenuListenerToken") == null) { menu.setData("MenuListenerToken", true); menu.addMenuListener(new RemoveItemsMenuListener(menu)); } } } } }