org.chromium.debug.ui/src/org/chromium/debug/ui/actions/SynchronizeBreakpoints.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.debug.ui/src/org/chromium/debug/ui/actions/SynchronizeBreakpoints.java Mon Jun 07 16:51:19 2010 -0700
@@ -0,0 +1,127 @@
+package org.chromium.debug.ui.actions;
+
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.chromium.debug.core.ChromiumDebugPlugin;
+import org.chromium.debug.core.model.BreakpointSynchronizer;
+import org.chromium.debug.core.model.DebugTargetImpl;
+import org.chromium.debug.core.model.BreakpointSynchronizer.Direction;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+public class SynchronizeBreakpoints implements IWorkbenchWindowActionDelegate {
+
+ public static class ResetRemote extends SynchronizeBreakpoints {
+ public ResetRemote() {
+ super(BreakpointSynchronizer.Direction.RESET_REMOTE);
+ }
+ }
+
+ public static class ResetLocal extends SynchronizeBreakpoints {
+ public ResetLocal() {
+ super(BreakpointSynchronizer.Direction.RESET_LOCAL);
+ }
+ }
+
+ public static class Merge extends SynchronizeBreakpoints {
+ public Merge() {
+ super(BreakpointSynchronizer.Direction.MERGE);
+ }
+ }
+
+ private final BreakpointSynchronizer.Direction direction;
+
+ protected SynchronizeBreakpoints(Direction direction) {
+ this.direction = direction;
+ }
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ }
+
+ public void run(IAction action) {
+ if (currentRunnable == null) {
+ return;
+ }
+ currentRunnable.run();
+ currentRunnable = null;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ currentRunnable = createRunnable(selection);
+ action.setEnabled(currentRunnable != null);
+ }
+
+ private Runnable createRunnable(ISelection selection) {
+ if (selection instanceof IStructuredSelection == false) {
+ return null;
+ }
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ final Set<DebugTargetImpl> targets = new HashSet<DebugTargetImpl>(3);
+ for (Iterator<?> it = structuredSelection.iterator(); it.hasNext(); ) {
+ Object element = it.next();
+ IDebugTarget debugTarget;
+ if (element instanceof ILaunch) {
+ ILaunch launch = (ILaunch) element;
+ debugTarget = launch.getDebugTarget();
+ } else if (element instanceof IDebugElement) {
+ IDebugElement debugElement = (IDebugElement) element;
+ debugTarget = debugElement.getDebugTarget();
+ } else {
+ continue;
+ }
+ if (debugTarget instanceof DebugTargetImpl == false) {
+ continue;
+ }
+ DebugTargetImpl debugTargetImpl = (DebugTargetImpl) debugTarget;
+ targets.add(debugTargetImpl);
+ }
+ if (targets.isEmpty()) {
+ return null;
+ }
+ if (direction != BreakpointSynchronizer.Direction.RESET_REMOTE && targets.size() > 1) {
+ // Only "reset remote" mode is implemented for a multiple selection.
+ return null;
+ }
+
+ return new Runnable() {
+ public void run() {
+ new Job(MessageFormat.format(Messages.SynchronizeBreakpoints_JOB_TITLE, targets.size())) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ // TODO(peter.rybin): consider blocking this method until callback is invoked to
+ // keep the UI jobs open while something is still happening.
+ BreakpointSynchronizer.Callback callback = new BreakpointSynchronizer.Callback() {
+ public void onDone(IStatus status) {
+ ChromiumDebugPlugin.log(status);
+ }
+ };
+
+ // TODO(peter.rybin): consider showing progress for several targets.
+ for (DebugTargetImpl target : targets) {
+ target.synchronizeBreakpoints(direction, callback);
+ }
+ return Status.OK_STATUS;
+ }
+ }.schedule();
+ }
+ };
+ }
+
+ private Runnable currentRunnable;
+}