// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.debug.ui.actions;
import org.chromium.debug.core.model.ChromiumExceptionBreakpoint;
import org.chromium.debug.core.model.VProjectWorkspaceBridge;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
/**
* Adds new exception breakpoint. It doesn't really make sense to have more than 2 such breakpoints
* (one for uncaught and one for all breakpoints to be able to disable/enable them), but
* there is no elegant way of limiting this.
*/
public class AddExceptionBreakpointAction implements IWorkbenchWindowActionDelegate {
private Performer currentPerformer = null;
@Override
public void run(IAction action) {
if (currentPerformer == null) {
return;
}
currentPerformer.run();
currentPerformer = null;
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
currentPerformer = createPerformer(selection);
}
private Performer createPerformer(ISelection selection) {
final IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
return new Performer() {
@Override
void run() {
IResource resource = ResourcesPlugin.getWorkspace().getRoot();
boolean includingCaught = true;
try {
ChromiumExceptionBreakpoint exceptionBreakpoint = new ChromiumExceptionBreakpoint(
resource, includingCaught, VProjectWorkspaceBridge.DEBUG_MODEL_ID);
breakpointManager.addBreakpoint(exceptionBreakpoint);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
}
@Override
public void dispose() {
}
@Override
public void init(IWorkbenchWindow window) {
}
private abstract class Performer {
abstract void run();
}
}