org.chromium.debug.ui/src/org/chromium/debug/ui/actions/SynchronizeBreakpoints.java
changeset 355 8726e95bcbba
--- /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;
+}