/******************************************************************************* * Copyright (c) 2013 Wind River Systems, Inc. and others. All rights reserved. * This program and the accompanying materials are made available under the terms * of the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.tcf.launch.ui.internal.listeners; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.debug.ui.AbstractDebugView; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.MenuManager; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPartReference; /** * Part listener implementation. */ public class PartListener implements IPartListener2 { // The map of part listener registrations private final Map<IWorkbenchPartReference, List<Registration>> registrations = new HashMap<IWorkbenchPartReference, List<Registration>>(); /** * Part listener registration implementation. */ /* default */ static class Registration { /* default */ AbstractDebugView view = null; /* default */ MenuManager mgr = null; /* default */ IMenuListener listener = null; } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partActivated(IWorkbenchPartReference partRef) { } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partBroughtToTop(IWorkbenchPartReference partRef) { } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partClosed(IWorkbenchPartReference partRef) { if (IDebugUIConstants.ID_DEBUG_VIEW.equals(partRef.getId())) { // Part closed --> Cleanup the registrations List<Registration> regs = registrations.remove(partRef); if (regs != null) { for (Registration reg : regs) { reg.mgr.removeMenuListener(reg.listener); } } } } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partDeactivated(IWorkbenchPartReference partRef) { } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partOpened(IWorkbenchPartReference partRef) { if (IDebugUIConstants.ID_DEBUG_VIEW.equals(partRef.getId()) && partRef instanceof IViewReference) { // Get the list of existing registrations List<Registration> regs = registrations.get(partRef); if (regs == null) regs = new ArrayList<Registration>(); // Get the view part IViewPart part = ((IViewReference)partRef).getView(false); if (part instanceof AbstractDebugView) { AbstractDebugView view = (AbstractDebugView)part; List<?> menuManagers = view.getContextMenuManagers(); for (Object element : menuManagers) { if (!(element instanceof MenuManager)) continue; MenuManager mgr = (MenuManager)element; if ("#PopUp".equals(mgr.getMenuText())) { //$NON-NLS-1$ // Check the registrations if this combination of view and menu manager // is already registered Registration reg = null; for (Registration candidate : regs) { if (candidate.view == view && candidate.mgr == mgr) { reg = candidate; break; } } if (reg == null) { IMenuListener listener = new MenuListener(); mgr.addMenuListener(listener); // Create the registration reg = new Registration(); reg.view = view; reg.mgr = mgr; reg.listener = listener; regs.add(reg); } } } } if (!regs.isEmpty()) registrations.put(partRef, regs); else registrations.remove(partRef); } } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partHidden(IWorkbenchPartReference partRef) { } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partVisible(IWorkbenchPartReference partRef) { } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference) */ @Override public void partInputChanged(IWorkbenchPartReference partRef) { } }