use of org.eclipse.xtext.debug.IStratumBreakpointSupport in project xtext-eclipse by eclipse.
the class StratumBreakpointAdapterFactory method toggleBreakpoints.
@Override
public void toggleBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
if (!(part instanceof XtextEditor) || !(selection instanceof ITextSelection)) {
return;
}
try {
final XtextEditor xtextEditor = (XtextEditor) part;
final IEditorInput editorInput = xtextEditor.getEditorInput();
final IResource breakpointResource = breakpointUtil.getBreakpointResource(editorInput);
final SourceRelativeURI breakpointUri = breakpointUtil.getBreakpointURI(editorInput);
final int offset = ((ITextSelection) selection).getOffset();
final int line = xtextEditor.getDocument().getLineOfOffset(offset) + 1;
Data data = xtextEditor.getDocument().readOnly(new IUnitOfWork<Data, XtextResource>() {
@Override
public Data exec(XtextResource state) throws Exception {
IResourceServiceProvider provider = state.getResourceServiceProvider();
IStratumBreakpointSupport breakpointSupport = provider.get(IStratumBreakpointSupport.class);
Data result = new Data();
result.name = state.getURI().lastSegment();
result.valid = breakpointSupport != null && breakpointSupport.isValidLineForBreakPoint(state, line);
result.types = getClassNamePattern(state);
result.lang = provider.get(LanguageInfo.class);
result.sourceUri = state.getURI();
if (editorInput.getAdapter(IClassFile.class) != null) {
result.classHandle = ((IClassFile) editorInput.getAdapter(IClassFile.class)).getHandleIdentifier();
}
return result;
}
});
IJavaStratumLineBreakpoint existingBreakpoint = findExistingBreakpoint(breakpointResource, breakpointUri, line);
if (existingBreakpoint != null) {
existingBreakpoint.delete();
return;
}
if (!data.valid || data.types == null)
return;
if (log.isDebugEnabled()) {
log.debug("Types the breakpoint listens for : " + data.types);
}
final IRegion information = xtextEditor.getDocument().getLineInformation(line - 1);
final int charStart = information.getOffset();
final int charEnd = information.getOffset() + information.getLength();
final String shortName = data.lang.getShortName();
Map<String, Object> attributes = Maps.newHashMap();
if (breakpointUri != null)
attributes.put(JarFileMarkerAnnotationModel.MARKER_URI, breakpointUri.toString());
attributes.put(ORG_ECLIPSE_JDT_DEBUG_CORE_SOURCE_NAME, data.name);
attributes.put(ORG_ECLIPSE_XTEXT_XBASE_SOURCE_URI, data.sourceUri.toString());
if (data.classHandle != null)
attributes.put(ORG_ECLIPSE_XTEXT_XBASE_CLASS_HANDLE, data.classHandle);
final IJavaStratumLineBreakpoint breakpoint = new XbaseLineBreakpoint(breakpointResource, shortName, data.types, line, charStart, charEnd, attributes);
// make sure the class name pattern gets updated on change
final IMarker marker = breakpoint.getMarker();
final IWorkspace ws = marker.getResource().getWorkspace();
IResourceChangeListener listener = new IResourceChangeListener() {
@Override
public void resourceChanged(IResourceChangeEvent event) {
if (!marker.exists())
ws.removeResourceChangeListener(this);
IResourceDelta delta = event.getDelta();
if (delta == null)
return;
final IResourceDelta findMember = event.getDelta().findMember(marker.getResource().getFullPath());
if (findMember == null)
return;
IResource res = findMember.getResource();
if (res == null || !res.exists())
return;
if (event.getType() == IResourceChangeEvent.PRE_DELETE) {
ws.removeResourceChangeListener(this);
} else if (event.getType() == IResourceChangeEvent.POST_CHANGE && (findMember.getFlags() & IResourceDelta.CONTENT) != 0) {
String classNamePattern = getClassNamePattern(event.getResource());
try {
breakpoint.getMarker().setAttribute("org.eclipse.jdt.debug.pattern", classNamePattern);
} catch (CoreException e) {
log.info(e.getMessage(), e);
}
}
}
};
ws.addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE);
} catch (BadLocationException e) {
log.info(e.getMessage(), e);
}
}
Aggregations