/******************************************************************************* * Copyright (c) 2008, 2010 Wind River Systems 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.cdt.dsf.debug.ui.viewmodel.breakpoints; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.internal.ui.viewers.model.provisional.ICheckUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; import org.eclipse.ui.IMemento; /** * Breakpiont VM Node which uses VM Contexts to populate breakpoint elements * in the view. Any actions or other selection listeners which depend on the * breakpoint object will not work with these elements unless they use the * adapter mechanism to obtain the breakpoints. * * @since 2.1 */ public class BreakpointVMNode extends AbstractBreakpointVMNode implements IElementLabelProvider, IElementMementoProvider { public BreakpointVMNode(BreakpointVMProvider provider) { super(provider); } @Override protected Object createBreakpiontElement(IBreakpoint bp) { return new BreakpointVMContext(this, bp); } public void update(ILabelUpdate[] updates) { Map<IElementLabelProvider, List<ILabelUpdate>> delegatesMap = new HashMap<IElementLabelProvider, List<ILabelUpdate>>(1,1); for (final ILabelUpdate update : updates) { final IBreakpoint bp = ((BreakpointVMContext)update.getElement()).getBreakpoint(); IElementLabelProvider provider = (IElementLabelProvider)bp.getAdapter(IElementLabelProvider.class); if (provider == null) { update.done(); continue; } List<ILabelUpdate> delegatesList = delegatesMap.get(provider); if (delegatesList == null) { delegatesList = new ArrayList<ILabelUpdate>(updates.length); delegatesMap.put(provider, delegatesList); } delegatesList.add(new ICheckUpdate() { public void setChecked(boolean checked, boolean grayed) { if (update instanceof ICheckUpdate) { ((ICheckUpdate)update).setChecked(checked, grayed); } } public String[] getColumnIds() { return update.getColumnIds(); } public void setLabel(String text, int columnIndex) { update.setLabel(text, columnIndex); } public void setFontData(FontData fontData, int columnIndex) { update.setFontData(fontData, columnIndex); } public void setImageDescriptor(ImageDescriptor image, int columnIndex) { update.setImageDescriptor(image, columnIndex); } public void setForeground(RGB foreground, int columnIndex) { update.setForeground(foreground, columnIndex); } public void setBackground(RGB background, int columnIndex) { update.setBackground(background, columnIndex); } public IPresentationContext getPresentationContext() { return update.getPresentationContext(); } public Object getElement() { return bp; } public TreePath getElementPath() { return update.getElementPath().getParentPath().createChildPath(bp); } public Object getViewerInput() { return update.getViewerInput(); } public void setStatus(IStatus status) { update.setStatus(status); } public IStatus getStatus() { return update.getStatus(); } public void done() { update.done(); } public void cancel() { update.cancel(); } public boolean isCanceled() { return update.isCanceled(); } }); } for (IElementLabelProvider provider : delegatesMap.keySet()) { List<ILabelUpdate> updatesList = delegatesMap.get(provider); provider.update(updatesList.toArray(new ILabelUpdate[updatesList.size()])); } } public void encodeElements(IElementMementoRequest[] updates) { Map<IElementMementoProvider, List<IElementMementoRequest>> delegatesMap = new HashMap<IElementMementoProvider, List<IElementMementoRequest>>(1,1); for (final IElementMementoRequest update : updates) { final IBreakpoint bp = ((BreakpointVMContext)update.getElement()).getBreakpoint(); IElementMementoProvider provider = (IElementMementoProvider)bp.getAdapter(IElementMementoProvider.class); if (provider == null) { update.done(); continue; } List<IElementMementoRequest> delegatesList = delegatesMap.get(provider); if (delegatesList == null) { delegatesList = new ArrayList<IElementMementoRequest>(updates.length); delegatesMap.put(provider, delegatesList); } delegatesList.add(new IElementMementoRequest() { public IMemento getMemento() { return update.getMemento(); } public IPresentationContext getPresentationContext() { return update.getPresentationContext(); } public Object getElement() { return bp; } public TreePath getElementPath() { return update.getElementPath().getParentPath().createChildPath(bp); } public Object getViewerInput() { return update.getViewerInput(); } public void setStatus(IStatus status) { update.setStatus(status); } public IStatus getStatus() { return update.getStatus(); } public void done() { update.done(); } public void cancel() { update.cancel(); } public boolean isCanceled() { return update.isCanceled(); } }); } for (IElementMementoProvider provider : delegatesMap.keySet()) { List<IElementMementoRequest> updatesList = delegatesMap.get(provider); provider.encodeElements(updatesList.toArray(new IElementMementoRequest[updatesList.size()])); } } public void compareElements(IElementCompareRequest[] updates) { Map<IElementMementoProvider, List<IElementCompareRequest>> delegatesMap = new HashMap<IElementMementoProvider, List<IElementCompareRequest>>(1,1); for (final IElementCompareRequest update : updates) { final IBreakpoint bp = ((BreakpointVMContext)update.getElement()).getBreakpoint(); IElementMementoProvider provider = (IElementMementoProvider)bp.getAdapter(IElementMementoProvider.class); if (provider == null) { update.done(); continue; } List<IElementCompareRequest> delegatesList = delegatesMap.get(provider); if (delegatesList == null) { delegatesList = new ArrayList<IElementCompareRequest>(updates.length); delegatesMap.put(provider, delegatesList); } delegatesList.add(new IElementCompareRequest() { public IMemento getMemento() { return update.getMemento(); } public void setEqual(boolean equal) { update.setEqual(equal);} public IPresentationContext getPresentationContext() { return update.getPresentationContext(); } public Object getElement() { return bp; } public TreePath getElementPath() { return update.getElementPath().getParentPath().createChildPath(bp); } public Object getViewerInput() { return update.getViewerInput(); } public void setStatus(IStatus status) { update.setStatus(status); } public IStatus getStatus() { return update.getStatus(); } public void done() { update.done(); } public void cancel() { update.cancel(); } public boolean isCanceled() { return update.isCanceled(); } }); } for (IElementMementoProvider provider : delegatesMap.keySet()) { List<IElementCompareRequest> updatesList = delegatesMap.get(provider); provider.compareElements(updatesList.toArray(new IElementCompareRequest[updatesList.size()])); } } }