blob: dfd8091bd5be6a0df1f1c0780db7e1620989231b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2014 Sebastian Schmidt 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:
* Sebastian Schmidt - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.debug.ui;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.osgi.util.NLS;
/**
* @author Sebastian Schmidt
*/
public class BreakpointsStructureBridge extends AbstractContextStructureBridge {
private static final String ATTRIBUTE_ID_DEFAULT = "breakpoint[unknown]"; //$NON-NLS-1$
static final String ATTRIBUTE_ID = "org.eclipse.mylyn.debug.ui.breakpointId"; //$NON-NLS-1$
public static final String HANDLE_DEFAULT_BREAKPOINT_MANAGER = "breakpointmanager[default]"; //$NON-NLS-1$
private final IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
@Override
public String getContentType() {
return DebugUiPlugin.CONTENT_TYPE;
}
@Override
public String getHandleIdentifier(Object object) {
if (object instanceof IBreakpoint) {
IBreakpoint breakpoint = (IBreakpoint) object;
updateBreakpointId((IBreakpoint) object);
return breakpoint.getMarker().getAttribute(ATTRIBUTE_ID, ATTRIBUTE_ID_DEFAULT);
} else if (object instanceof IBreakpointManager) {
return HANDLE_DEFAULT_BREAKPOINT_MANAGER;
}
return null;
}
private void updateBreakpointId(IBreakpoint object) {
if (object.getMarker().getAttribute(ATTRIBUTE_ID, null) == null) {
try {
// FIXME: there are better *unique* random number generators than Math.random...
object.getMarker().setAttribute(ATTRIBUTE_ID, "breakpoint[" + (Math.random() * 10000) + "]"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (CoreException e) {
IResource resource = object.getMarker().getResource();
StatusHandler.log(new Status(IStatus.WARNING, DebugUiPlugin.ID_PLUGIN, NLS.bind(
"Breakpoint could not be updated for resource {0} ", resource.getFullPath()))); //$NON-NLS-1$
}
}
}
@Override
public String getParentHandle(String handle) {
Object object = getObjectForHandle(handle);
if (object != null && object instanceof IBreakpoint) {
return HANDLE_DEFAULT_BREAKPOINT_MANAGER;
}
return null;
}
@Override
public Object getObjectForHandle(String handle) {
if (handle.equals(HANDLE_DEFAULT_BREAKPOINT_MANAGER)) {
return breakpointManager;
}
for (IBreakpoint breakpoint : breakpointManager.getBreakpoints()) {
if (breakpoint.getMarker().getAttribute(ATTRIBUTE_ID, ATTRIBUTE_ID_DEFAULT).equals(handle)) {
return breakpoint;
}
}
return null;
}
@Override
public List<String> getChildHandles(String handle) {
return Collections.emptyList();
}
@Override
public String getLabel(Object object) {
return object.toString();
}
@Override
public boolean canBeLandmark(String handle) {
return true;
}
@Override
public boolean acceptsObject(Object object) {
return object instanceof IBreakpointManager || object instanceof IBreakpoint;
}
@Override
public boolean canFilter(Object element) {
return true;
}
@Override
public boolean isDocument(String handle) {
return false;
}
@Override
public String getHandleForOffsetInObject(Object resource, int offset) {
return null;
}
@Override
public String getContentType(String elementHandle) {
Object object = getObjectForHandle(elementHandle);
if (object != null) {
return DebugUiPlugin.CONTENT_TYPE;
}
return null;
}
}