diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java index 9d15d5b53500..9cbd615e8f05 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java @@ -19,6 +19,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; @@ -187,6 +188,27 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { return XSourcePositionImpl.create(file, line); } + @NotNull + public static Collection getAllCaretsPositions(@NotNull Project project, DataContext context) { + Editor editor = getEditor(project, context); + if (editor == null) { + return Collections.emptyList(); + } + + final Document document = editor.getDocument(); + VirtualFile file = FileDocumentManager.getInstance().getFile(document); + Collection res = new ArrayList(); + List carets = editor.getCaretModel().getAllCarets(); + for (Caret caret : carets) { + int line = caret.getLogicalPosition().line; + XSourcePositionImpl position = XSourcePositionImpl.create(file, line); + if (position != null) { + res.add(position); + } + } + return res; + } + @Nullable private static Editor getEditor(@NotNull Project project, DataContext context) { Editor editor = CommonDataKeys.EDITOR.getData(context); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XToggleLineBreakpointActionHandler.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XToggleLineBreakpointActionHandler.java index e1f5bd7fe881..d4cae5981ef6 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XToggleLineBreakpointActionHandler.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XToggleLineBreakpointActionHandler.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.HashSet; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XDebuggerUtil; import com.intellij.xdebugger.XSourcePosition; @@ -30,6 +31,8 @@ import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; import com.intellij.xdebugger.impl.breakpoints.XBreakpointUtil; import org.jetbrains.annotations.NotNull; +import java.util.Set; + /** * @author nik */ @@ -58,13 +61,13 @@ public class XToggleLineBreakpointActionHandler extends DebuggerActionHandler { } public void perform(@NotNull final Project project, final AnActionEvent event) { - XSourcePosition position = XDebuggerUtilImpl.getCaretPosition(project, event.getDataContext()); - if (position == null) { - return; - } - Editor editor = event.getData(CommonDataKeys.EDITOR); - - XBreakpointUtil.toggleLineBreakpoint(project, position.getFile(), editor, position.getLine(), myTemporary, true); + // do not toggle more than once on the same line + Set processedLines = new HashSet(); + for (XSourcePosition position : XDebuggerUtilImpl.getAllCaretsPositions(project, event.getDataContext())) { + if (processedLines.add(position.getLine())) { + XBreakpointUtil.toggleLineBreakpoint(project, position.getFile(), editor, position.getLine(), myTemporary, true); + } + } } }