/***************************************************************** * Copyright (c) 2010 Texas Instruments 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: * Patrick Chuong (Texas Instruments) - Pin and Clone Supports (331781) *****************************************************************/ package org.eclipse.cdt.debug.internal.ui.pinclone; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.contexts.DebugContextEvent; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.debug.ui.contexts.IDebugContextService; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IWorkbenchPart; /** * This class provides debug event filtering service for the pin-able views. */ public class DebugEventFilterService { /** * A debug context event listen that provides filter support * for the pinned debug context. */ private class DebugEventFilter implements IDebugContextListener { private final DebugContextPinProvider fProvider; private DebugEventFilter(DebugContextPinProvider provider) { fProvider = provider; } /* * (non-Javadoc) * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent) */ public void debugContextChanged(DebugContextEvent event) { ISelection eventContext = event.getContext(); if (eventContext instanceof IStructuredSelection) { List<?> eventContextList = ((IStructuredSelection)eventContext).toList(); for (Object o : eventContextList) { if (fProvider.isPinnedTo(o)) { if (fProvider != event.getDebugContextProvider()) { fProvider.delegateEvent(new DebugContextEvent(fProvider, event.getContext(), event.getFlags())); } return; } } } } public DebugContextPinProvider getTranslator() { return fProvider; } } private static DebugEventFilterService INSTANCE; private Map<IWorkbenchPart, DebugEventFilter> fFilterMap = new HashMap<IWorkbenchPart, DebugEventFilter>(); private DebugEventFilterService() { } public static synchronized DebugEventFilterService getInstance() { if (INSTANCE == null) INSTANCE = new DebugEventFilterService(); return INSTANCE; } /** * Add debug event filter for the provided part and filter debug context change * event for the provided debug context. * * @param part the part to filter debug context change event. * @param debugContext the debug context that filter should stick to. * @return the debug context provider that handles the filtering. */ public DebugContextPinProvider addDebugEventFilter(IWorkbenchPart part, ISelection debugContext) { DebugContextPinProvider contextProvider = null; DebugEventFilter filter = null; synchronized (fFilterMap) { if (fFilterMap.containsKey(part)) { return null; } contextProvider = new DebugContextPinProvider(part, debugContext); filter = new DebugEventFilter(contextProvider); fFilterMap.put(part, filter); } assert contextProvider != null && filter != null; IDebugContextService contextService = DebugUITools.getDebugContextManager().getContextService(part.getSite().getWorkbenchWindow()); contextService.addDebugContextProvider(contextProvider); contextService.addDebugContextListener(filter); return contextProvider; } /** * Remove debug event filter for the provided part. * * @param part the workbench part. */ public void removeDebugEventFilter(IWorkbenchPart part) { DebugEventFilter filter = null; synchronized (fFilterMap) { if (!fFilterMap.containsKey(part)) { return; } filter = fFilterMap.remove(part); } assert filter != null; DebugContextPinProvider contextProvider = filter.getTranslator(); IDebugContextService contextService = DebugUITools.getDebugContextManager().getContextService(part.getSite().getWorkbenchWindow()); // send a change notification to the listener to update with selected context contextProvider.delegateEvent(new DebugContextEvent(contextProvider, contextService.getActiveContext(), DebugContextEvent.ACTIVATED)); // removes the listener and provider contextService.removeDebugContextListener(filter); contextService.removeDebugContextProvider(contextProvider); contextProvider.dispose(); } }