Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/breakpoints/CBreakpointContext.java')
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/breakpoints/CBreakpointContext.java242
1 files changed, 242 insertions, 0 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/breakpoints/CBreakpointContext.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/breakpoints/CBreakpointContext.java
new file mode 100644
index 00000000000..bc179355e35
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/breakpoints/CBreakpointContext.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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
+ * Ericsson - Added tracepoint support (284286)
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.breakpoints;
+
+import java.util.Map;
+
+import org.eclipse.cdt.debug.core.CDIDebugModel;
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICEventBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICTracepoint;
+import org.eclipse.cdt.debug.core.model.ICWatchpoint;
+import org.eclipse.cdt.debug.ui.breakpoints.ICBreakpointContext;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IDebugModelProvider;
+import org.eclipse.debug.ui.contexts.IDebugContextListener;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionFilter;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ * Input for breakpoint properties dialog. It captures both the
+ * selected breakpoint object as well as the selected debug context.
+ * This combined context can then be used by breakpoint property
+ * pages to access model and target specific breakpoint settings.
+ */
+public class CBreakpointContext extends PlatformObject implements ICBreakpointContext {
+
+ // Register an adapter factory for the class when it is first loaded.
+ static {
+ Platform.getAdapterManager().registerAdapters(new CBreakpointContextAdapterFactory(), CBreakpointContext.class);
+ }
+
+ /**
+ * Breakpoint object held by this context.
+ */
+ private final ICBreakpoint fBreakpoint;
+
+ /**
+ * The resource that the breakpoint is to be created for.
+ */
+ private final IResource fResource;
+
+ /**
+ * The active debug context held by this context.
+ */
+ private final ISelection fDebugContext;
+
+ /**
+ * Associated preference store.
+ */
+ private final CBreakpointPreferenceStore fPreferenceStore;
+
+ /**
+ * Creates a new breakpoint context with given breakpoint and debug
+ * context selection.
+ */
+ public CBreakpointContext(ICBreakpoint breakpoint, ISelection debugContext) {
+ this (breakpoint, debugContext, null, null);
+ }
+
+ public CBreakpointContext(ICBreakpoint breakpoint, ISelection debugContext, IResource resource, Map<String, Object> attributes) {
+ fBreakpoint = breakpoint;
+ fResource = resource;
+ fDebugContext = debugContext;
+ fPreferenceStore = new CBreakpointPreferenceStore(this, attributes);
+ }
+
+ @Override
+ public ICBreakpoint getBreakpoint() { return fBreakpoint; }
+
+ @Override
+ public IResource getResource() { return fResource; }
+
+ @Override
+ public IPreferenceStore getPreferenceStore() { return fPreferenceStore; }
+
+ /**
+ * Returns the debug context.
+ */
+ public ISelection getDebugContext() { return fDebugContext; }
+
+ /**
+ * (non-Javadoc)
+ * @see org.eclipse.debug.ui.contexts.IDebugContextProvider implementation
+ */
+ public IWorkbenchPart getPart() { return null; }
+ public void addDebugContextListener(IDebugContextListener listener) {}
+ public void removeDebugContextListener(IDebugContextListener listener) {}
+
+ public ISelection getActiveContext() {
+ return fDebugContext;
+ }
+}
+
+/**
+ * Action filter for the breakpoint context, which allows property
+ * pages to filter their activation based on the debug model ID of
+ * the active debug context.
+ */
+class CBreakpointContextActionFilter implements IActionFilter {
+
+ private static String[] EMPTY_IDENTIFIERS_ARRAY = new String[0];
+
+ @Override
+ public boolean testAttribute(Object target, String name, String value) {
+ if (target instanceof CBreakpointContext) {
+ if ("debugModelId".equals(name)) { //$NON-NLS-1$
+ String[] targetModelIds = getDebugModelIds( (CBreakpointContext)target );
+ for (int i = 0; i < targetModelIds.length; i++) {
+ if (targetModelIds[i].equals(value)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private String[] getDebugModelIds(CBreakpointContext bpContext) {
+ ISelection debugContext = bpContext.getDebugContext();
+ if (debugContext instanceof IStructuredSelection) {
+ Object debugElement = ((IStructuredSelection)debugContext).getFirstElement();
+ if (debugElement instanceof IAdaptable) {
+ IDebugModelProvider debugModelProvider =
+ (IDebugModelProvider)((IAdaptable)debugElement).getAdapter(IDebugModelProvider.class);
+ if (debugModelProvider != null) {
+ return debugModelProvider.getModelIdentifiers();
+ } else if (debugElement instanceof IDebugElement) {
+ return new String[] { ((IDebugElement)debugElement).getModelIdentifier() };
+ }
+ }
+ }
+ return EMPTY_IDENTIFIERS_ARRAY;
+ }
+}
+
+class CBreakpointContextWorkbenchAdapter implements IWorkbenchAdapter {
+ @Override
+ public String getLabel(Object o) {
+ if (o instanceof ICBreakpointContext) {
+ ICBreakpoint bp = ((ICBreakpointContext)o).getBreakpoint();
+ return getBreakpointMainLabel(bp);
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public Object[] getChildren(Object o) { return null; }
+
+ @Override
+ public ImageDescriptor getImageDescriptor(Object object) { return null; }
+
+ @Override
+ public Object getParent(Object o) { return null; }
+
+ private String getBreakpointMainLabel(ICBreakpoint breakpoint) {
+ if (breakpoint instanceof ICFunctionBreakpoint) {
+ return BreakpointsMessages.getString("CBreakpointPropertyPage.breakpointType_function_label"); //$NON-NLS-1$
+ } else if (breakpoint instanceof ICAddressBreakpoint) {
+ return BreakpointsMessages.getString("CBreakpointPropertyPage.breakpointType_address_label"); //$NON-NLS-1$
+ } else if (breakpoint instanceof ICLineBreakpoint) {
+ return BreakpointsMessages.getString("CBreakpointPropertyPage.breakpointType_line_label"); //$NON-NLS-1$
+ } else if (breakpoint instanceof ICEventBreakpoint) {
+ return BreakpointsMessages.getString("CBreakpointPropertyPage.breakpointType_event_label"); //$NON-NLS-1$
+ } else if (breakpoint instanceof ICWatchpoint) {
+ return BreakpointsMessages.getString("CBreakpointPropertyPage.breakpointType_watchpoint_label"); //$NON-NLS-1$
+ }
+ // default main label is the label of marker type for the breakpoint
+ return CDIDebugModel.calculateMarkerType(breakpoint);
+ }
+
+}
+
+/**
+ * Adapter factory which returns the breakpoint object and the action
+ * filter for the CBreakpointContext type.
+ */
+class CBreakpointContextAdapterFactory implements IAdapterFactory {
+
+ private static final Class<?>[] fgAdapterList = new Class[] {
+ IBreakpoint.class, ICBreakpoint.class, ICTracepoint.class, IActionFilter.class, IPreferenceStore.class,
+ IWorkbenchAdapter.class,
+ };
+
+ private static final IActionFilter fgActionFilter = new CBreakpointContextActionFilter();
+ private static final IWorkbenchAdapter fgWorkbenchAdapter = new CBreakpointContextWorkbenchAdapter();
+
+ @Override
+ public Object getAdapter(Object obj, @SuppressWarnings("rawtypes") Class adapterType) {
+ // Note: only return the breakpoint object as an adapter if it has
+ // an associated marker. Otherwise the property pages will throw multiple
+ // exceptions.
+ if (adapterType.isInstance( ((CBreakpointContext)obj).getBreakpoint() ) &&
+ ((CBreakpointContext)obj).getBreakpoint().getMarker() != null)
+ {
+ return ((CBreakpointContext)obj).getBreakpoint();
+ }
+
+ if ( IPreferenceStore.class.equals(adapterType) ) {
+ return ((CBreakpointContext)obj).getPreferenceStore();
+ }
+
+ if (IActionFilter.class.equals(adapterType)) {
+ return fgActionFilter;
+ }
+
+ if (IWorkbenchAdapter.class.equals(adapterType)) {
+ return fgWorkbenchAdapter;
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Class[] getAdapterList() {
+ return fgAdapterList;
+ }
+}
+

Back to the top