remove a flag to disable multiple carets in editor and supporting legacy code
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 12 Jan 2015 14:16:42 +0000 (17:16 +0300)
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 12 Jan 2015 14:20:54 +0000 (17:20 +0300)
48 files changed:
java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
platform/editor-ui-api/src/com/intellij/openapi/editor/Caret.java
platform/editor-ui-api/src/com/intellij/openapi/editor/CaretModel.java
platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java
platform/editor-ui-api/src/com/intellij/openapi/editor/SelectionModel.java
platform/lang-impl/src/com/intellij/codeInsight/actions/RearrangeCodeProcessor.java
platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/BackspaceHandler.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/CopyHandler.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/CutHandler.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/PasteHandler.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java
platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByBlockCommentHandler.java
platform/lang-impl/src/com/intellij/codeInsight/generation/surroundWith/SurroundWithHandler.java
platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlighter.java
platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java
platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java
platform/lang-impl/src/com/intellij/injected/editor/SelectionModelWindow.java
platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectWordAtCaretAction.java
platform/lang-impl/src/com/intellij/openapi/editor/richcopy/TextWithMarkupProcessor.java
platform/lang-impl/src/com/intellij/refactoring/actions/BaseRefactoringAction.java
platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java
platform/platform-api/src/com/intellij/openapi/editor/actionSystem/EditorWriteActionHandler.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/BackspaceAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/ConvertIndentsActionBase.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/CopyAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/DeleteAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/EscapeAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/HungryBackspaceAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/PasteAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/ToggleCaseAction.java
platform/platform-impl/src/com/intellij/openapi/editor/actions/ToggleColumnModeAction.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/SelectionModelImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentSelectionModel.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/status/PositionPanel.java
platform/testFramework/src/com/intellij/testFramework/EditorTestUtil.java
platform/util/resources/misc/registry.properties
plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/intentions/base/Intention.java
plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/RemoveUnnecessarySemicolonsIntention.java
python/src/com/jetbrains/python/editor/PyEmacsHandler.java
xml/impl/src/com/intellij/codeInsight/template/emmet/SurroundWithEmmetAction.java

index e617bca540ec998a9ae23df6fde38ae9cb26a8c4..e2e9a3c99eef9da97ec6939930239758c918e620 100644 (file)
@@ -38,7 +38,6 @@ import com.intellij.openapi.command.impl.UndoManagerImpl
 import com.intellij.openapi.command.undo.UndoManager
 import com.intellij.openapi.editor.Editor
 import com.intellij.openapi.editor.EditorFactory
-import com.intellij.openapi.editor.LogicalPosition
 import com.intellij.openapi.editor.actionSystem.EditorActionManager
 import com.intellij.openapi.editor.ex.EditorEx
 import com.intellij.openapi.extensions.Extensions
@@ -54,7 +53,6 @@ import com.intellij.psi.PsiJavaFile
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.statistics.StatisticsManager
 import com.intellij.psi.statistics.impl.StatisticsManagerImpl
-import com.intellij.testFramework.EditorTestUtil
 import com.intellij.util.containers.ContainerUtil
 import org.jetbrains.annotations.NotNull
 
@@ -1308,29 +1306,6 @@ class Foo {{
     myFixture.checkResult textAfter
   }
 
-  private doTestBlockSelection(final String textBefore, final String toType, final String textAfter) {
-    EditorTestUtil.disableMultipleCarets()
-    try {
-      myFixture.configureByText "a.java", textBefore
-      edt {
-        def caret = myFixture.editor.offsetToLogicalPosition(myFixture.editor.caretModel.offset)
-        myFixture.editor.selectionModel.setBlockSelection(caret, new LogicalPosition(caret.line + 1, caret.column + 1))
-      }
-      type 'toStr'
-      assert lookup
-      type toType
-      myFixture.checkResult textAfter
-      def start = myFixture.editor.selectionModel.blockStart
-      def end = myFixture.editor.selectionModel.blockEnd
-      assert start.line == end.line - 1
-      assert start.column == end.column
-      assert end == myFixture.editor.caretModel.logicalPosition
-    }
-    finally {
-      EditorTestUtil.enableMultipleCarets()
-    }
-  }
-
   public void "test two non-imported classes when space selects first autopopup item"() {
     myFixture.addClass("package foo; public class Abcdefg {}")
     myFixture.configureByText 'a.java', 'class Foo extends <caret>'
index f6d8b75a6719a2dc92c1cf94e9ec04c6df176523..3bf3f6fbe428787a0ead01741985f4d75977d3d3 100644 (file)
@@ -23,12 +23,10 @@ import com.intellij.codeInsight.lookup.LookupManager
 import com.intellij.codeInsight.lookup.impl.LookupImpl
 import com.intellij.lang.java.JavaLanguage
 import com.intellij.openapi.actionSystem.IdeActions
-import com.intellij.openapi.editor.LogicalPosition
 import com.intellij.psi.PsiDocumentManager
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.codeStyle.CodeStyleSettingsManager
 import com.intellij.psi.codeStyle.CommonCodeStyleSettings
-import com.intellij.testFramework.EditorTestUtil
 
 public class NormalCompletionTest extends LightFixtureCompletionTestCase {
   @Override
@@ -1396,30 +1394,6 @@ class XInternalError {}
     doTest('\n')
   }
 
-  public void "test block selection from bottom to top with single-item insertion"() {
-    EditorTestUtil.disableMultipleCarets()
-    try {
-      myFixture.configureByText "a.java", """
-  class Foo {{
-    ret<caret>;
-    ret;
-  }}"""
-      edt {
-        def caret = myFixture.editor.offsetToLogicalPosition(myFixture.editor.caretModel.offset)
-        myFixture.editor.selectionModel.setBlockSelection(new LogicalPosition(caret.line + 1, caret.column), caret)
-      }
-      myFixture.completeBasic()
-      myFixture.checkResult '''
-  class Foo {{
-    return<caret>;
-    return;
-  }}'''
-    }
-    finally {
-      EditorTestUtil.enableMultipleCarets()
-    }
-  }
-
   public void testMulticaretSingleItemInsertion() {
     doTest()
   }
index fc824844be6e672f2e04792b4c698c52233f7316..68ff8ce7f563aeb5c352ff30209d32977ac12d39 100644 (file)
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Represents a specific caret instance in the editor when it support multiple carets (see {@link CaretModel#supportsMultipleCarets()}.
+ * Represents a specific caret instance in the editor.
  * Provides methods to query and modify caret position and caret's associated selection.
  */
 public interface Caret extends UserDataHolderEx, Disposable {
@@ -41,8 +41,8 @@ public interface Caret extends UserDataHolderEx, Disposable {
    * Tells whether this caret is valid, i.e. recognized by the caret model currently. Caret is valid since its creation till its
    * removal from caret model.
    *
-   * @see com.intellij.openapi.editor.CaretModel#addCaret(VisualPosition)
-   * @see com.intellij.openapi.editor.CaretModel#removeCaret(Caret)
+   * @see CaretModel#addCaret(VisualPosition)
+   * @see CaretModel#removeCaret(Caret)
    */
   boolean isValid();
 
index a5053923fa3188e43d229071e15304a597acecd0..5247337fa2028d4ab30bcebc8f8ab5424f9f38ef 100644 (file)
@@ -28,16 +28,16 @@ import java.util.List;
  * May support several carets existing simultaneously in a document. {@link #supportsMultipleCarets()} method can be used to find out
  * whether particular instance of CaretModel does it. If it does, query and update methods for caret position operate on a certain 'primary'
  * caret. There exists a way to perform the same operation(s) on each caret - see
- * {@link #runForEachCaret(com.intellij.openapi.editor.CaretAction)} method. Within its context, query and update methods operate on the
+ * {@link #runForEachCaret(CaretAction)} method. Within its context, query and update methods operate on the
  * current caret in that iteration. This behaviour can change in future though, so using caret and selection query and update methods in
- * actions that need to operate on multiple carets is discouraged - methods on {@link com.intellij.openapi.editor.Caret} instances obtained
+ * actions that need to operate on multiple carets is discouraged - methods on {@link Caret} instances obtained
  * via {@link #getAllCarets()} or {@link #runForEachCaret(CaretAction)} should be used instead.
  * <p>
  * How 'primary' caret is determined by the model is not defined (currently it's the most recently added caret, but that can change).
  * <p>
  * At all times at least one caret will exist in a document.
  * <p>
- * Update methods, {@link #runBatchCaretOperation(Runnable)} and {@link #runForEachCaret(com.intellij.openapi.editor.CaretAction)} methods
+ * Update methods, {@link #runBatchCaretOperation(Runnable)} and {@link #runForEachCaret(CaretAction)} methods
  * should only be run from EDT. Query methods can be run from any thread, when called not from EDT, those methods are 'not aware' of
  * 'runForEachCaret' scope - they will always return information about primary caret.
  *
@@ -49,9 +49,8 @@ public interface CaretModel {
    *
    * @param columnShift    the number of columns to move the caret by.
    * @param lineShift      the number of lines to move the caret by.
-   * @param withSelection  if true, the caret move should extend the range or block selection in the document.
-   * @param blockSelection if true and <code>withSelection</code> is true, the caret move should extend
-   *                       the block selection in the document. This parameter is ignored when multiple carets are supported by the model.
+   * @param withSelection  if true, the caret move should extend the selection range in the document.
+   * @param blockSelection This parameter is currently ignored.
    * @param scrollToCaret  if true, the document should be scrolled so that the caret is visible after the move.
    */
   void moveCaretRelatively(int columnShift,
@@ -168,7 +167,7 @@ public interface CaretModel {
    * Returns current caret - the one, query and update methods in the model operate at the moment. In the current implementation this is
    * either an iteration-current caret within the context of {@link #runForEachCaret(CaretAction)} method, or the 'primary' caret without that
    * context. Users {@link #runForEachCaret(CaretAction)} method should use caret parameter passed to
-   * {@link com.intellij.openapi.editor.CaretAction#perform(Caret)} method instead of this method, as the definition of current caret (as
+   * {@link CaretAction#perform(Caret)} method instead of this method, as the definition of current caret (as
    * well as caret instance operated on by model methods) can potentially change.
    */
   @NotNull
@@ -247,14 +246,14 @@ public interface CaretModel {
   /**
    * Returns the current positions of all carets and their selections. The order of entries in the returned list does not necessarily
    * correspond to the order of {@link #getAllCarets()} method results. Passing the result of this method to
-   * {@link #setCaretsAndSelections(java.util.List)} will restore the state of carets, including the internal caret order, in particular,
+   * {@link #setCaretsAndSelections(List)} will restore the state of carets, including the internal caret order, in particular,
    * the caret, that was primary when this method was called, will be the primary one after corresponding
-   * {@link #setCaretsAndSelections(java.util.List)} invocation.
+   * {@link #setCaretsAndSelections(List)} invocation.
    * <p>
    * If multiple carets are not supported, the behaviour is unspecified.
    *
    * @see #supportsMultipleCarets()
-   * @see #setCaretsAndSelections(java.util.List)
+   * @see #setCaretsAndSelections(List)
    */
   @NotNull
   List<CaretState> getCaretsAndSelections();
index bd63b43f1af305af8cc85bef9f93da945140a672..5ada68320ee98a8439ddd6e1d1eff599ef915ca5 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.openapi.editor;
 
+import com.intellij.openapi.actionSystem.DataProvider;
 import com.intellij.openapi.editor.colors.EditorColorsScheme;
 import com.intellij.openapi.editor.event.EditorMouseEventArea;
 import com.intellij.openapi.editor.event.EditorMouseListener;
@@ -68,7 +69,7 @@ public interface Editor extends UserDataHolder {
   /**
    * Returns the component for the content area of the editor (the area displaying the document text).
    * The component can be used, for example, for converting logical to screen coordinates.
-   * The instance is implementing {@link com.intellij.openapi.actionSystem.DataProvider}
+   * The instance is implementing {@link DataProvider}
    *
    * @return the component instance.
    */
@@ -82,7 +83,11 @@ public interface Editor extends UserDataHolder {
   /**
    * Returns the selection model for the editor, which can be used to select ranges of text in
    * the document and retrieve information about the selection.
+   * <p>
+   * To query or change selections for specific carets, {@link CaretModel} interface should be used.
    *
+   * @see #getCaretModel()
+   * 
    * @return the selection model instance.
    */
   @NotNull
@@ -118,8 +123,8 @@ public interface Editor extends UserDataHolder {
   ScrollingModel getScrollingModel();
 
   /**
-   * Returns the caret model for the document, which can be used to move the caret and
-   * retrieve information about the caret position.
+   * Returns the caret model for the document, which can be used to add and remove carets to the editor, as well as to query and update 
+   * carets' and corresponding selections' positions.
    *
    * @return the caret model instance.
    */
@@ -336,12 +341,12 @@ public interface Editor extends UserDataHolder {
   void setHeaderComponent(@Nullable JComponent header);
 
   /**
-   * @return <code>true</code> if this editor has active header component set up by {@link #setHeaderComponent(javax.swing.JComponent)}
+   * @return <code>true</code> if this editor has active header component set up by {@link #setHeaderComponent(JComponent)}
    */
   boolean hasHeaderComponent();
 
   /**
-   * @return a component set by {@link #setHeaderComponent(javax.swing.JComponent)} or <code>null</code> if no header currently installed.
+   * @return a component set by {@link #setHeaderComponent(JComponent)} or <code>null</code> if no header currently installed.
    */
   @Nullable
   JComponent getHeaderComponent();
index 9d66612d16320501766a0dc778e82ca6a9496f9c..c5809bb90018e26fe3ce3525009dbd206b395c54 100644 (file)
@@ -21,21 +21,15 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Provides services for selecting text in the IDEA text editor and retrieving information
- * about the selection. The editor supports two modes of selection: range selection (where
- * a sequential range of text from one offset to another is selected) and block selection
- * (where a rectangular block of text is selected). Different functions exist for handling
- * these two types of selection, but only one type of selection can exist in a document at
- * any given time.
- *
- * When caret model supports multiple carets, block selection mode is not supported.
- * Instead, each caret can have its own selected region. Most of the methods querying or
- * updating selection operate on the current caret (see {@link com.intellij.openapi.editor.CaretModel#runForEachCaret(Runnable)},
- * or 'primary' caret if current caret is not defined. The exception is {@link #copySelectionToClipboard()},
- * which copies contents of all selected regions to clipboard as one piece of text.
+ * Provides services for selecting text in the IDEA text editor and retrieving information about the selection. 
+ * Most of the methods here exist for compatibility reasons, corresponding functionality is also provided by {@link CaretModel} now.
+ * <p>
+ * In editor supporting multiple carets, each caret has its own associated selection range. Unless mentioned explicitly, methods of this 
+ * interface operate on the current caret (see {@link CaretModel#runForEachCaret(CaretAction)}), or 'primary' caret if current caret 
+ * is not defined. 
  *
  * @see Editor#getSelectionModel()
- * @see com.intellij.openapi.editor.CaretModel
+ * @see CaretModel
  */
 public interface SelectionModel {
   /**
@@ -67,8 +61,7 @@ public interface SelectionModel {
   VisualPosition getSelectionEndPosition();
 
   /**
-   * Returns the text selected in the editor (or the concatenation of text ranges selected
-   * in each line, if block selection mode is used).
+   * Returns the text selected in the editor.
    *
    * @return the selected text, or null if there is currently no selection.
    */
@@ -99,10 +92,9 @@ public interface SelectionModel {
   VisualPosition getLeadSelectionPosition();
 
   /**
-   * Checks if a range of text is currently selected in regular (non-block) selection mode.
+   * Checks if a range of text is currently selected.
    *
    * @return true if a range of text is selected, false otherwise.
-   * @see #hasBlockSelection()
    */
   boolean hasSelection();
 
@@ -111,16 +103,14 @@ public interface SelectionModel {
    * the document, and returns <code>true</code> if any of them has selection, otherwise checks only the current caret.
    *
    * @return true if a range of text is selected, false otherwise.
-   * @see #hasBlockSelection()
    */
   boolean hasSelection(boolean anyCaret);
 
   /**
-   * Selects the specified range of text in regular (non-block) selection mode.
+   * Selects the specified range of text.
    *
    * @param startOffset the start offset of the text range to select.
    * @param endOffset   the end offset of the text range to select.
-   * @see #setBlockSelection(LogicalPosition, LogicalPosition)
    */
   void setSelection(int startOffset, int endOffset);
 
@@ -157,7 +147,7 @@ public interface SelectionModel {
 
   /**
    * Removes the selection in the editor. If <code>allCarets</code> is <code>true</code>, removes selections from all carets in the
-   * document, otherwise, does this just for the current caret.
+   * editor, otherwise, does this just for the current caret.
    */
   void removeSelection(boolean allCarets);
 
@@ -198,9 +188,7 @@ public interface SelectionModel {
   void copySelectionToClipboard();
 
   /**
-   * Selects the specified rectangle of text in block selection mode. When multiple carets are supported by editor, this creates an
-   * equivalent multi-caret selection (note, that in this case {@link #hasBlockSelection()} will still return <code>false</code>
-   * afterwards!).
+   * Creates a multi-caret selection for the rectangular block of text with specified start and end positions.
    *
    * @param blockStart the start of the rectangle to select.
    * @param blockEnd   the end of the rectangle to select.
@@ -209,70 +197,64 @@ public interface SelectionModel {
   void setBlockSelection(@NotNull LogicalPosition blockStart, @NotNull LogicalPosition blockEnd);
 
   /**
-   * Removes the block selection from the document. Does nothing if multiple carets are supported by editor.
+   * Does nothing.
    *
-   * @see #removeSelection()
-   * @see #removeSelection(boolean)
+   * @deprecated To be removed in IDEA 16.
    */
   void removeBlockSelection();
 
   /**
-   * Checks if a rectangular block of text is currently selected in the document. Does not apply to multiple-caret selections.
+   * Always returns <code>false</code>.
    *
-   * @return true if a block selection currently exists, false otherwise.
-   * @see #hasSelection()
+   * @deprecated To be removed in IDEA 16.
    */
   boolean hasBlockSelection();
 
   /**
-   * Returns an array of start offsets in the document for line parts selected in the document currently. Works both in single-caret state,
-   * multiple-caret selection and block-mode selection (for carets not having a selection, caret position is returned).
+   * Returns an array of start offsets in the document for ranges selected in the document currently. Works both for a single-caret and
+   * a multiple-caret selection (for carets not having a selection, caret position is returned).
    *
-   * @return the array of start offsets, or an array of 1 element if a range selection
-   * currently exists, or an empty array if no selection exists.
+   * @return an array of start offsets, array size is equal to the number of carets existing in the editor currently.
    */
   @NotNull
   int[] getBlockSelectionStarts();
 
   /**
-   * Returns an array of end offsets in the document for line parts selected in the document currently. Works both in single-caret state,
-   * multiple-caret selection and block-mode selection (for carets not having a selection, caret position is returned).
+   * Returns an array of end offsets in the document for ranges selected in the document currently. Works both for a single-caret and
+   * a multiple-caret selection (for carets not having a selection, caret position is returned).
    *
-   * @return the array of end offsets, or an array of 1 element if a range selection
-   * currently exists, or an empty array if no selection exists.
+   * @return an array of start offsets, array size is equal to the number of carets existing in the editor currently.
    */
   @NotNull
   int[] getBlockSelectionEnds();
 
   /**
-   * Returns the start position of the current block selection.
+   * Always returns <code>null</code>.
    *
-   * @return the block selection start, or null if no block selection currently exists.
+   * @deprecated To be removed in IDEA 16.
    */
   @Nullable
   LogicalPosition getBlockStart();
 
   /**
-   * Returns the end position of the current block selection.
+   * Always returns <code>null</code>.
    *
-   * @return the block selection end, or null if no block selection currently exists.
+   * @deprecated To be removed in IDEA 16.
    */
   @Nullable
   LogicalPosition getBlockEnd();
 
   /**
-   * Checks if any read-only markers intersect the current block selection.
+   * Always returns <code>false</code>.
    *
-   * @return true if part of the block selection is read-only, false otherwise.
-   * @see Document#createGuardedBlock(int, int)
+   * @deprecated To be removed in IDEA 16.
    */
   boolean isBlockSelectionGuarded();
 
   /**
-   * Returns a read-only marker intersecting the current block selection.
+   * Always returns <code>null</code>.
    *
-   * @return the marker instance, or null if there is no block selection or no read-only marker
-   * intersects it.
+   * @deprecated To be removed in IDEA 16.
    */
   @Nullable
   RangeMarker getBlockSelectionGuard();
index 4dbdefc6c8ecfd48f924ead0700ad934d351e8b8..4867d85abbd7e94f5afa105e24a5446890e9277a 100644 (file)
@@ -20,7 +20,6 @@ import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.SelectionModel;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.PsiDocumentManager;
 import com.intellij.psi.PsiFile;
@@ -88,13 +87,6 @@ public class RearrangeCodeProcessor extends AbstractLayoutCodeProcessor {
     if (mySelectionModel != null && mySelectionModel.hasSelection()) {
       ranges.add(TextRange.create(mySelectionModel.getSelectionStart(), mySelectionModel.getSelectionEnd()));
     }
-    else if (mySelectionModel != null && mySelectionModel.hasBlockSelection()) {
-      int[] starts = mySelectionModel.getBlockSelectionStarts();
-      int[] ends = mySelectionModel.getBlockSelectionEnds();
-      for (int i = 0; i < starts.length; i++) {
-        ranges.add(TextRange.create(starts[i], ends[i]));
-      }
-    }
     else {
       ranges.add(TextRange.create(0, file.getTextLength()));
     }
index 2870ecf81850118b1ee8b3cd3635fca2b9eb53d8..03fd6cfd335aef660692da2267bc2bbcb0b84de2 100644 (file)
@@ -600,42 +600,8 @@ public class CodeCompletionHandlerBase {
     }
     final int idEndOffsetDelta = idEndOffset - caretOffset;
 
-    CompletionAssertions.WatchingInsertionContext context = null;
-    if (editor.getSelectionModel().hasBlockSelection() && editor.getSelectionModel().getBlockSelectionEnds().length > 0) {
-      List<RangeMarker> insertionPoints = new ArrayList<RangeMarker>();
-      int idDelta = 0;
-      Document document = editor.getDocument();
-      int caretLine = document.getLineNumber(editor.getCaretModel().getOffset());
-
-      for (int point : editor.getSelectionModel().getBlockSelectionEnds()) {
-        insertionPoints.add(document.createRangeMarker(point, point));
-        if (document.getLineNumber(point) == document.getLineNumber(idEndOffset)) {
-          idDelta = idEndOffset - point;
-        }
-      }
-
-      List<RangeMarker> caretsAfter = new ArrayList<RangeMarker>();
-      for (RangeMarker marker : insertionPoints) {
-        if (marker.isValid()) {
-          int insertionPoint = marker.getStartOffset();
-          context = insertItem(indicator, item, completionChar, items, update, editor, indicator.getParameters().getOriginalFile(),
-                               insertionPoint, idDelta + insertionPoint, indicator.getOffsetMap());
-          int offset = editor.getCaretModel().getOffset();
-          caretsAfter.add(document.createRangeMarker(offset, offset));
-        }
-      }
-      assert context != null;
-
-      restoreBlockSelection(editor, caretsAfter, caretLine);
-
-      for (RangeMarker insertionPoint : insertionPoints) {
-        insertionPoint.dispose();
-      }
-      for (RangeMarker marker : caretsAfter) {
-        marker.dispose();
-      }
-
-    } else if (editor.getCaretModel().supportsMultipleCarets()) {
+    CompletionAssertions.WatchingInsertionContext context;
+    if (editor.getCaretModel().supportsMultipleCarets()) {
       final List<CompletionAssertions.WatchingInsertionContext> contexts = new ArrayList<CompletionAssertions.WatchingInsertionContext>();
       final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(editor);
       final PsiFile originalFile = indicator.getParameters().getOriginalFile();
@@ -699,29 +665,6 @@ public class CodeCompletionHandlerBase {
     }
   }
 
-  private static void restoreBlockSelection(Editor editor, List<RangeMarker> caretsAfter, int caretLine) {
-    int column = -1;
-    int minLine = Integer.MAX_VALUE;
-    int maxLine = -1;
-    for (RangeMarker marker : caretsAfter) {
-      if (marker.isValid()) {
-        LogicalPosition lp = editor.offsetToLogicalPosition(marker.getStartOffset());
-        if (column == -1) {
-          column = lp.column;
-        } else if (column != lp.column) {
-          return;
-        }
-        minLine = Math.min(minLine, lp.line);
-        maxLine = Math.max(maxLine, lp.line);
-
-        if (lp.line == caretLine) {
-          editor.getCaretModel().moveToLogicalPosition(lp);
-        }
-      }
-    }
-    editor.getSelectionModel().setBlockSelection(new LogicalPosition(minLine, column), new LogicalPosition(maxLine, column));
-  }
-
   private static CompletionAssertions.WatchingInsertionContext insertItem(final CompletionProgressIndicator indicator,
                                                                           final LookupElement item,
                                                                           final char completionChar,
index 78a81f85591519bf623b40e512342028e8f4a46f..bb1f5d375ab9ab13688f4e9ff0bbf0c894f32cfc 100644 (file)
@@ -166,7 +166,7 @@ public class BackspaceHandler extends EditorWriteActionHandler {
 
   @Nullable
   public static LogicalPosition getBackspaceUnindentPosition(final PsiFile file, final Editor editor) {
-    if (editor.getSelectionModel().hasSelection() || editor.getSelectionModel().hasBlockSelection()) return null;
+    if (editor.getSelectionModel().hasSelection()) return null;
 
     final LogicalPosition caretPos = editor.getCaretModel().getLogicalPosition();
     if (caretPos.column == 0) {
index 3451c0630e52dd0033371d37300beb1636163515..e1628464ff343c4c6ff5938849983bfcbb9abbcd 100644 (file)
@@ -63,7 +63,7 @@ public class CopyHandler extends EditorActionHandler {
     }
 
     final SelectionModel selectionModel = editor.getSelectionModel();
-    if (!selectionModel.hasSelection(true) && !selectionModel.hasBlockSelection()) {
+    if (!selectionModel.hasSelection(true)) {
       if (Registry.is(CopyAction.SKIP_COPY_AND_CUT_FOR_EMPTY_SELECTION_KEY)) {
         return;
       }
index ce38e0121ac9bba3d3237e5337b75fd78ef3f667..0cbe249217f6a628e636a643f6f6f3523356ec4f 100644 (file)
@@ -64,7 +64,7 @@ public class CutHandler extends EditorWriteActionHandler {
     }
 
     final SelectionModel selectionModel = editor.getSelectionModel();
-    if (!selectionModel.hasSelection(true) && !selectionModel.hasBlockSelection()) {
+    if (!selectionModel.hasSelection(true)) {
       if (Registry.is(CopyAction.SKIP_COPY_AND_CUT_FOR_EMPTY_SELECTION_KEY)) {
         return;
       }
index 9722a1b99d3e70ae899bc37b59c52ad3f17bc113..04f02ab9b380a48206c990d7bb62b9202a9fc36e 100644 (file)
@@ -91,8 +91,7 @@ public class PasteHandler extends EditorActionHandler implements EditorTextInser
     }
 
     final Project project = editor.getProject();
-    if (project == null || editor.isColumnMode() || editor.getSelectionModel().hasBlockSelection()
-        || editor.getCaretModel().getCaretCount() > 1) {
+    if (project == null || editor.isColumnMode() || editor.getCaretModel().getCaretCount() > 1) {
       if (myOriginalHandler != null) {
         myOriginalHandler.execute(editor, null, context);
       }
index 10c52b666c9d6345d92502727569a9d780a1d1a5..14ab0b69ca723f19103d6448b154f82f8c2638a4 100644 (file)
@@ -192,16 +192,14 @@ public class TypedHandler extends TypedActionHandlerBase {
           }
         }
 
-        if (!editor.getSelectionModel().hasBlockSelection()) {
-          if (')' == charTyped || ']' == charTyped || '}' == charTyped) {
-            if (FileTypes.PLAIN_TEXT != fileType) {
-              if (handleRParen(editor, fileType, charTyped)) return;
-            }
-          }
-          else if ('"' == charTyped || '\'' == charTyped || '`' == charTyped/* || '/' == charTyped*/) {
-            if (handleQuote(editor, charTyped, dataContext, file)) return;
+        if (')' == charTyped || ']' == charTyped || '}' == charTyped) {
+          if (FileTypes.PLAIN_TEXT != fileType) {
+            if (handleRParen(editor, fileType, charTyped)) return;
           }
         }
+        else if ('"' == charTyped || '\'' == charTyped || '`' == charTyped/* || '/' == charTyped*/) {
+          if (handleQuote(editor, charTyped, dataContext, file)) return;
+        }
 
         long modificationStampBeforeTyping = editor.getDocument().getModificationStamp();
         type(originalEditor, charTyped);
@@ -209,7 +207,7 @@ public class TypedHandler extends TypedActionHandlerBase {
 
         if (('(' == charTyped || '[' == charTyped || '{' == charTyped) &&
             CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET &&
-            !editor.getSelectionModel().hasBlockSelection() && fileType != FileTypes.PLAIN_TEXT) {
+            fileType != FileTypes.PLAIN_TEXT) {
           handleAfterLParen(editor, fileType, charTyped);
         }
         else if ('}' == charTyped) {
index 9e76b64613c845140d5004f79fc8da28f11c46a6..b750824f1679f686b0f3aef7ab97163515e58302 100644 (file)
@@ -130,29 +130,7 @@ public class CommentByBlockCommentHandler extends MultiCaretCodeInsightActionHan
       }
     }
     else {
-      if (myEditor.getSelectionModel().hasBlockSelection()) {
-        final LogicalPosition start = myEditor.getSelectionModel().getBlockStart();
-        final LogicalPosition end = myEditor.getSelectionModel().getBlockEnd();
-
-        assert start != null;
-        assert end != null;
-
-        int startColumn = Math.min(start.column, end.column);
-        int endColumn = Math.max(start.column, end.column);
-        int startLine = Math.min(start.line, end.line);
-        int endLine = Math.max(start.line, end.line);
-
-        for (int i = startLine; i <= endLine; i++) {
-          editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(i, endColumn));
-          EditorModificationUtil.insertStringAtCaret(editor, suffix, true, true);
-        }
-
-        for (int i = startLine; i <= endLine; i++) {
-          editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(i, startColumn));
-          EditorModificationUtil.insertStringAtCaret(editor, prefix, true, true);
-        }
-      }
-      else if (myCaret.hasSelection()) {
+      if (myCaret.hasSelection()) {
         int selectionStart = myCaret.getSelectionStart();
         int selectionEnd = myCaret.getSelectionEnd();
         if (commenter instanceof IndentedCommenter) {
index d8fcf2bd2c4923ed0e7a1376fc23b21ee6f080e7..61678e49c7c6580505226ee032bbb410f5e3e06d 100644 (file)
@@ -93,7 +93,7 @@ public class SurroundWithHandler implements CodeInsightActionHandler {
   @Nullable
   public static List<AnAction> buildSurroundActions(final Project project, final Editor editor, PsiFile file, @Nullable Surrounder surrounder){
     SelectionModel selectionModel = editor.getSelectionModel();
-    if (!selectionModel.hasSelection() && !selectionModel.hasBlockSelection()) {
+    if (!selectionModel.hasSelection()) {
       selectionModel.selectLineAtCaret();
     }
     int startOffset = selectionModel.getSelectionStart();
index 52b955ef73c7d52d96e6433039a29bdd64c3ab7f..63b10737b0aafcc0ff4e0b821b63459559e4bc85 100644 (file)
@@ -49,7 +49,7 @@ public class BraceHighlighter implements StartupActivity {
         Editor editor = e.getEditor();
         final SelectionModel selectionModel = editor.getSelectionModel();
         // Don't update braces in case of the active selection.
-        if (editor.getProject() != project || selectionModel.hasSelection() || selectionModel.hasBlockSelection()) {
+        if (editor.getProject() != project || selectionModel.hasSelection()) {
           return;
         }
 
index e88a0000a191b2e274cd0b7ce6729624e88e66d6..e419c42ca35ead023ebb9d8bbdc31409e4e99010 100644 (file)
@@ -528,59 +528,28 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable,
   }
 
   private void insertLookupString(LookupElement item, final int prefix) {
-    final Document document = myEditor.getDocument();
-
     final String lookupString = getCaseCorrectedLookupString(item);
 
-    if (myEditor.getSelectionModel().hasBlockSelection()) {
-      LogicalPosition blockStart = myEditor.getSelectionModel().getBlockStart();
-      LogicalPosition blockEnd = myEditor.getSelectionModel().getBlockEnd();
-      assert blockStart != null && blockEnd != null;
-
-      int minLine = Math.min(blockStart.line, blockEnd.line);
-      int maxLine = Math.max(blockStart.line, blockEnd.line);
-      int minColumn = Math.min(blockStart.column, blockEnd.column);
-      int maxColumn = Math.max(blockStart.column, blockEnd.column);
-
-      int caretLine = document.getLineNumber(myEditor.getCaretModel().getOffset());
-
-      for (int line = minLine; line <= maxLine; line++) {
-        int bs = myEditor.logicalPositionToOffset(new LogicalPosition(line, minColumn));
-        int start = bs - prefix;
-        int end = myEditor.logicalPositionToOffset(new LogicalPosition(line, maxColumn));
-        if (start > end) {
-          LOG.error("bs=" + bs + "; start=" + start + "; end=" + end +
-                    "; blockStart=" + blockStart + "; blockEnd=" + blockEnd + "; line=" + line + "; len=" +
-                    (document.getLineEndOffset(line) - document.getLineStartOffset(line)));
-        }
-        document.replaceString(start, end, lookupString);
-      }
-      LogicalPosition start = new LogicalPosition(minLine, minColumn - prefix);
-      LogicalPosition end = new LogicalPosition(maxLine, start.column + lookupString.length());
-      myEditor.getSelectionModel().setBlockSelection(start, end);
-      myEditor.getCaretModel().moveToLogicalPosition(new LogicalPosition(caretLine, end.column));
-    } else {
-      final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor);
-      hostEditor.getCaretModel().runForEachCaret(new CaretAction() {
-        @Override
-        public void perform(Caret caret) {
-          EditorModificationUtil.deleteSelectedText(hostEditor);
-          final int caretOffset = hostEditor.getCaretModel().getOffset();
-          int lookupStart = Math.max(caretOffset - prefix, 0);
+    final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor);
+    hostEditor.getCaretModel().runForEachCaret(new CaretAction() {
+      @Override
+      public void perform(Caret caret) {
+        EditorModificationUtil.deleteSelectedText(hostEditor);
+        final int caretOffset = hostEditor.getCaretModel().getOffset();
+        int lookupStart = Math.max(caretOffset - prefix, 0);
 
-          int len = hostEditor.getDocument().getTextLength();
-          LOG.assertTrue(lookupStart >= 0 && lookupStart <= len,
-                         "ls: " + lookupStart + " caret: " + caretOffset + " prefix:" + prefix + " doc: " + len);
-          LOG.assertTrue(caretOffset >= 0 && caretOffset <= len, "co: " + caretOffset + " doc: " + len);
+        int len = hostEditor.getDocument().getTextLength();
+        LOG.assertTrue(lookupStart >= 0 && lookupStart <= len,
+                       "ls: " + lookupStart + " caret: " + caretOffset + " prefix:" + prefix + " doc: " + len);
+        LOG.assertTrue(caretOffset >= 0 && caretOffset <= len, "co: " + caretOffset + " doc: " + len);
 
-          hostEditor.getDocument().replaceString(lookupStart, caretOffset, lookupString);
+        hostEditor.getDocument().replaceString(lookupStart, caretOffset, lookupString);
 
-          int offset = lookupStart + lookupString.length();
-          hostEditor.getCaretModel().moveToOffset(offset);
-          hostEditor.getSelectionModel().removeSelection();
-        }
-      });
-    }
+        int offset = lookupStart + lookupString.length();
+        hostEditor.getCaretModel().moveToOffset(offset);
+        hostEditor.getSelectionModel().removeSelection();
+      }
+    });
 
     myEditor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
   }
index a894781d5cb1868f688ea8ce048d9ad3d885e3bb..aa070b38b6d0881105dcba69f4027239f32a7550 100644 (file)
@@ -199,7 +199,7 @@ public class LivePreviewController implements LivePreview.Delegate, FindUtil.Rep
       final SelectionModel selectionModel = mySearchResults.getEditor().getSelectionModel();
 
       final int offset;
-      if ((!selectionModel.hasSelection() && !selectionModel.hasBlockSelection()) || copy.isGlobal()) {
+      if (!selectionModel.hasSelection() || copy.isGlobal()) {
         copy.setGlobal(true);
         offset = 0;
       } else {
@@ -220,10 +220,7 @@ public class LivePreviewController implements LivePreview.Delegate, FindUtil.Rep
   }
 
   public boolean canReplace() {
-    if (mySearchResults != null && mySearchResults.getCursor() != null &&
-        !isReplaceDenied() && (mySearchResults.getFindModel().isGlobal() ||
-                                                       !mySearchResults.getEditor().getSelectionModel()
-                                                         .hasBlockSelection()) ) {
+    if (mySearchResults != null && mySearchResults.getCursor() != null && !isReplaceDenied()) {
 
       final String replacement = getStringToReplace(getEditor(), mySearchResults.getCursor());
       return replacement != null;
index 37d9dd7268b1a26a907930a0fa5013d1c1e39eb8..d4f82cf26613908657fe4cc745d3d29189366c7a 100644 (file)
@@ -156,12 +156,11 @@ public class SelectionModelWindow implements SelectionModel {
 
   @Override
   public void removeBlockSelection() {
-    myHostModel.removeBlockSelection();
   }
 
   @Override
   public boolean hasBlockSelection() {
-    return myHostModel.hasBlockSelection();
+    return false;
   }
 
   @Override
@@ -186,24 +185,22 @@ public class SelectionModelWindow implements SelectionModel {
 
   @Override
   public LogicalPosition getBlockStart() {
-    LogicalPosition hostBlock = myHostModel.getBlockStart();
-    return hostBlock == null ? null : myInjectedEditor.hostToInjected(hostBlock);
+    return null;
   }
 
   @Override
   public LogicalPosition getBlockEnd() {
-    LogicalPosition hostBlock = myHostModel.getBlockEnd();
-    return hostBlock == null ? null : myInjectedEditor.hostToInjected(hostBlock);
+    return null;
   }
 
   @Override
   public boolean isBlockSelectionGuarded() {
-    return myHostModel.isBlockSelectionGuarded();
+    return false;
   }
 
   @Override
   public RangeMarker getBlockSelectionGuard() {
-    return myHostModel.getBlockSelectionGuard();
+    return null;
   }
 
   @Override
index 0cf8e9e984d043928ad000455e3df9cbcbe9554b..d495132b085d2a5fb91aba78f44c7cec50df0d05 100644 (file)
@@ -103,7 +103,7 @@ public class SelectWordAtCaretAction extends TextComponentEditorAction implement
     public void doExecute(Editor editor, @Nullable Caret caret, DataContext dataContext) {
       final IndentGuideDescriptor guide = editor.getIndentsModel().getCaretIndentGuide();
       final SelectionModel selectionModel = editor.getSelectionModel();
-      if (guide != null && !selectionModel.hasSelection() && !selectionModel.hasBlockSelection() && isWhitespaceAtCaret(editor)) {
+      if (guide != null && !selectionModel.hasSelection() && isWhitespaceAtCaret(editor)) {
         selectWithGuide(editor, guide);
       }
       else {
index c153350eaf0398a93583d9e87177efae604ab34b..6458bfe13a9ea461da4e8881ad8d70bc2068f0ad 100644 (file)
@@ -76,11 +76,6 @@ public class TextWithMarkupProcessor extends CopyPastePostProcessor<RawTextWithM
     }
 
     try {
-      SelectionModel selectionModel = editor.getSelectionModel();
-      if (selectionModel.hasBlockSelection()) {
-        return Collections.emptyList(); // unsupported legacy mode
-      }
-
       RichCopySettings settings = RichCopySettings.getInstance();
       List<Caret> carets = editor.getCaretModel().getAllCarets();
       Caret firstCaret = carets.get(0);
index 7750d91ade5e251a0eb906cfa9e9823c43dbe978..1ae15ab0242199de895d9250a6c4883b5d40e366 100644 (file)
@@ -215,7 +215,7 @@ public abstract class BaseRefactoringAction extends AnAction {
 
   private static int fixCaretOffset(final Editor editor) {
     final int caret = editor.getCaretModel().getOffset();
-    if (editor.getSelectionModel().hasSelection() && !editor.getSelectionModel().hasBlockSelection()) {
+    if (editor.getSelectionModel().hasSelection()) {
       if (caret == editor.getSelectionModel().getSelectionEnd()) {
         return Math.max(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd() - 1);
       }
index b36b6652018c3d11db72277474180b4b5f923a34..003af8789fc9556e794c10331c2229abcb45c5fb 100644 (file)
@@ -16,9 +16,6 @@
 package com.intellij.openapi.editor;
 
 import com.intellij.codeStyle.CodeStyleFacade;
-import com.intellij.openapi.editor.actionSystem.EditorActionManager;
-import com.intellij.openapi.editor.event.DocumentEvent;
-import com.intellij.openapi.editor.event.MockDocumentEvent;
 import com.intellij.openapi.ide.CopyPasteManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.TextRange;
@@ -41,7 +38,6 @@ public class EditorModificationUtil {
 
   public static void deleteSelectedText(Editor editor) {
     SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasBlockSelection()) deleteBlockSelection(editor);
     if(!selectionModel.hasSelection()) return;
 
     int selectionStart = selectionModel.getSelectionStart();
@@ -68,29 +64,12 @@ public class EditorModificationUtil {
     });
   }
 
+  /**
+   * Does nothing currently.
+   * 
+   * @deprecated Use {@link #deleteSelectedText(Editor)} to delete all selected fragments. To be removed in IDEA 16. 
+   */
   public static void deleteBlockSelection(Editor editor) {
-    SelectionModel selectionModel = editor.getSelectionModel();
-    if (!selectionModel.hasBlockSelection()) return;
-
-    LogicalPosition blockStart = selectionModel.getBlockStart();
-    LogicalPosition blockEnd = selectionModel.getBlockEnd();
-    if (blockStart == null || blockEnd == null) {
-      return;
-    }
-
-    int startLine = blockStart.line;
-    int endLine = blockEnd.line;
-
-    int[] starts = selectionModel.getBlockSelectionStarts();
-    int[] ends = selectionModel.getBlockSelectionEnds();
-
-    for (int i = starts.length - 1; i >= 0; i--) {
-      editor.getDocument().deleteString(starts[i], ends[i]);
-    }
-
-    editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
-
-    zeroWidthBlockSelectionAtCaretColumn(editor, startLine, endLine);
   }
 
   public static void zeroWidthBlockSelectionAtCaretColumn(final Editor editor, final int startLine, final int endLine) {
@@ -201,46 +180,21 @@ public class EditorModificationUtil {
     if (text == null) return;
 
     int caretLine = editor.getCaretModel().getLogicalPosition().line;
-    int originalCaretLine = caretLine;
-    int selectedLinesCount = 0;
-
-    final SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasBlockSelection()) {
-      final LogicalPosition start = selectionModel.getBlockStart();
-      final LogicalPosition end = selectionModel.getBlockEnd();
-      assert start != null;
-      assert end != null;
-      LogicalPosition caret = new LogicalPosition(Math.min(start.line, end.line), Math.min(start.column, end.column));
-      selectedLinesCount = Math.abs(end.line - start.line);
-      caretLine = caret.line;
-
-      deleteSelectedText(editor);
-      editor.getCaretModel().moveToLogicalPosition(caret);
-    }
 
     LogicalPosition caretToRestore = editor.getCaretModel().getLogicalPosition();
 
     String[] lines = LineTokenizer.tokenize(text.toCharArray(), false);
-    if (lines.length > 1 || selectedLinesCount == 0) {
-      int longestLineLength = 0;
-      for (int i = 0; i < lines.length; i++) {
-        String line = lines[i];
-        longestLineLength = Math.max(longestLineLength, line.length());
-        editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(caretLine + i, caretToRestore.column));
-        insertStringAtCaret(editor, line, false, true);
-      }
-      caretToRestore = new LogicalPosition(originalCaretLine, caretToRestore.column + longestLineLength);
-    }
-    else {
-      for (int i = 0; i <= selectedLinesCount; i++) {
-        editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(caretLine + i, caretToRestore.column));
-        insertStringAtCaret(editor, text, false, true);
-      }
-      caretToRestore = new LogicalPosition(originalCaretLine, caretToRestore.column + text.length());
+    int longestLineLength = 0;
+    for (int i = 0; i < lines.length; i++) {
+      String line = lines[i];
+      longestLineLength = Math.max(longestLineLength, line.length());
+      editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(caretLine + i, caretToRestore.column));
+      insertStringAtCaret(editor, line, false, true);
     }
+    caretToRestore = new LogicalPosition(caretLine, caretToRestore.column + longestLineLength);
 
     editor.getCaretModel().moveToLogicalPosition(caretToRestore);
-    zeroWidthBlockSelectionAtCaretColumn(editor, caretLine, caretLine + selectedLinesCount);
+    zeroWidthBlockSelectionAtCaretColumn(editor, caretLine, caretLine);
   }
 
   @Nullable
@@ -371,39 +325,13 @@ public class EditorModificationUtil {
     return buf.toString();
   }
 
+  /**
+   * @deprecated Use an appropriate <code>insertStringAtCaret</code> method instead. To be removed in IDEA 16.
+   */
   public static void typeInStringAtCaretHonorBlockSelection(final Editor editor, final String str, final boolean toProcessOverwriteMode)
     throws ReadOnlyFragmentModificationException
   {
-    Document doc = editor.getDocument();
-    final SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasBlockSelection()) {
-      RangeMarker guard = selectionModel.getBlockSelectionGuard();
-      if (guard != null) {
-        DocumentEvent evt = new MockDocumentEvent(doc, editor.getCaretModel().getOffset());
-        ReadOnlyFragmentModificationException e = new ReadOnlyFragmentModificationException(evt, guard);
-        EditorActionManager.getInstance().getReadonlyFragmentModificationHandler(doc).handle(e);
-      }
-      else {
-        final LogicalPosition start = selectionModel.getBlockStart();
-        final LogicalPosition end = selectionModel.getBlockEnd();
-        assert start != null;
-        assert end != null;
-
-        int column = Math.min(start.column, end.column);
-        int startLine = Math.min(start.line, end.line);
-        int endLine = Math.max(start.line, end.line);
-        deleteBlockSelection(editor);
-        for (int i = startLine; i <= endLine; i++) {
-          editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(i, column));
-          insertStringAtCaret(editor, str, toProcessOverwriteMode, true);
-        }
-        selectionModel.setBlockSelection(new LogicalPosition(startLine, column + str.length()),
-                                         new LogicalPosition(endLine, column + str.length()));
-      }
-    }
-    else {
-      insertStringAtCaret(editor, str, toProcessOverwriteMode, true);
-    }
+    insertStringAtCaret(editor, str, toProcessOverwriteMode, true);
   }
 
   public static void typeInStringAtCaretHonorMultipleCarets(final Editor editor, @NotNull final String str) {
@@ -424,42 +352,13 @@ public class EditorModificationUtil {
   public static void typeInStringAtCaretHonorMultipleCarets(final Editor editor, @NotNull final String str, final boolean toProcessOverwriteMode, final int caretShift)
     throws ReadOnlyFragmentModificationException
   {
-    Document doc = editor.getDocument();
-    final SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasBlockSelection()) {
-      RangeMarker guard = selectionModel.getBlockSelectionGuard();
-      if (guard != null) {
-        DocumentEvent evt = new MockDocumentEvent(doc, editor.getCaretModel().getOffset());
-        ReadOnlyFragmentModificationException e = new ReadOnlyFragmentModificationException(evt, guard);
-        EditorActionManager.getInstance().getReadonlyFragmentModificationHandler(doc).handle(e);
-      }
-      else {
-        final LogicalPosition start = selectionModel.getBlockStart();
-        final LogicalPosition end = selectionModel.getBlockEnd();
-        assert start != null;
-        assert end != null;
-
-        int column = Math.min(start.column, end.column);
-        int startLine = Math.min(start.line, end.line);
-        int endLine = Math.max(start.line, end.line);
-        deleteBlockSelection(editor);
-        for (int i = startLine; i <= endLine; i++) {
-          editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(i, column));
-          insertStringAtCaret(editor, str, toProcessOverwriteMode, true, caretShift);
-        }
-        selectionModel.setBlockSelection(new LogicalPosition(startLine, column + str.length()),
-                                         new LogicalPosition(endLine, column + str.length()));
+    editor.getCaretModel().runForEachCaret(new CaretAction() {
+      @Override
+      public void perform(Caret caret) {
+        insertStringAtCaretNoScrolling(editor, str, toProcessOverwriteMode, true, caretShift);
       }
-    }
-    else {
-      editor.getCaretModel().runForEachCaret(new CaretAction() {
-        @Override
-        public void perform(Caret caret) {
-          insertStringAtCaretNoScrolling(editor, str, toProcessOverwriteMode, true, caretShift);
-        }
-      });
-      editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
-    }
+    });
+    editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
   }
 
   public static void moveAllCaretsRelatively(@NotNull Editor editor, final int caretShift) {
index b9c93f85d98ea3f2ed0c5d9cecf7e8c6cb195a17..ba4111af46e96af8b5133dd40ddc2d9ab3049b79 100644 (file)
@@ -19,8 +19,6 @@ import com.intellij.openapi.actionSystem.CommonDataKeys;
 import com.intellij.openapi.actionSystem.DataContext;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.editor.*;
-import com.intellij.openapi.editor.event.DocumentEvent;
-import com.intellij.openapi.editor.event.MockDocumentEvent;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.project.Project;
 import org.jetbrains.annotations.Nullable;
@@ -48,16 +46,6 @@ public abstract class EditorWriteActionHandler extends EditorActionHandler {
       @Override
       public void run() {
         final Document doc = editor.getDocument();
-        final SelectionModel selectionModel = editor.getSelectionModel();
-        if (selectionModel.hasBlockSelection()) {
-          RangeMarker guard = selectionModel.getBlockSelectionGuard();
-          if (guard != null) {
-            DocumentEvent evt = new MockDocumentEvent(editor.getDocument(), editor.getCaretModel().getOffset());
-            ReadOnlyFragmentModificationException e = new ReadOnlyFragmentModificationException(evt, guard);
-            EditorActionManager.getInstance().getReadonlyFragmentModificationHandler(doc).handle(e);
-            return;
-          }
-        }
 
         doc.startGuardedBlockChecking();
         try {
index bc60a3e7e8904197669db77b2f44b04c9b846222..88e5db1b7ab47181a6a067cb8473fa6b0e3ef1b2 100644 (file)
@@ -52,26 +52,6 @@ public class BackspaceAction extends EditorAction {
         // since the latter have trouble finding the right location of caret movement in the case of multi-shred injected fragments
         editor = ((EditorWindow)editor).getDelegate();
       }
-      final SelectionModel selectionModel = editor.getSelectionModel();
-      if (selectionModel.hasBlockSelection()) {
-        final LogicalPosition start = selectionModel.getBlockStart();
-        final LogicalPosition end = selectionModel.getBlockEnd();
-        int column = Math.min(start.column, end.column);
-        int startLine = Math.min(start.line, end.line);
-        int endLine = Math.max(start.line, end.line);
-        EditorModificationUtil.deleteBlockSelection(editor);
-        if (column > 0 && start.column == end.column) {
-          for (int i = startLine; i <= endLine; i++) {
-            editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(i, column));
-            doBackSpaceAtCaret(editor);
-          }
-          column--;
-        }
-        final int newColumn = Math.max(column, 0);
-        selectionModel.setBlockSelection(new LogicalPosition(startLine, newColumn), new LogicalPosition(endLine, newColumn));
-        return;
-      }
-
       doBackSpaceAtCaret(editor);
     }
   }
index 960663310bbab8c51834f37a0d6737e4992191c4..a39149e672c1fe67e9a67d91617193d04970b806 100644 (file)
@@ -104,13 +104,6 @@ public abstract class ConvertIndentsActionBase extends EditorAction {
       if (selectionModel.hasSelection()) {
         changedLines = performAction(editor, new TextRange(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()));
       }
-      else if (selectionModel.hasBlockSelection()) {
-        final int[] starts = selectionModel.getBlockSelectionStarts();
-        final int[] ends = selectionModel.getBlockSelectionEnds();
-        for (int i = 0; i < starts.length; i++) {
-          changedLines += performAction(editor, new TextRange(starts [i], ends [i]));
-        }
-      }
       else {
         changedLines += performAction(editor, new TextRange(0, editor.getDocument().getTextLength()));
       }
index 24e5e553b92334b995beafb412668f5a74bf04a7..68185278e201d40e687ab3f317ac3ff4449f0a4e 100644 (file)
@@ -43,7 +43,7 @@ public class CopyAction extends EditorAction {
   private static class Handler extends EditorActionHandler {
     @Override
     public void execute(final Editor editor, DataContext dataContext) {
-      if (!editor.getSelectionModel().hasSelection(true) && !editor.getSelectionModel().hasBlockSelection()) {
+      if (!editor.getSelectionModel().hasSelection(true)) {
         if (Registry.is(SKIP_COPY_AND_CUT_FOR_EMPTY_SELECTION_KEY)) {
           return;
         }
index 2b9b2e1127209dd6fa47fa430d24332bddacec23..b477ee9f2d820eba1431652313e63908d98fef9f 100644 (file)
@@ -29,7 +29,6 @@ import com.intellij.openapi.command.CommandProcessor;
 import com.intellij.openapi.editor.*;
 import com.intellij.openapi.editor.actionSystem.EditorAction;
 import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler;
-import com.intellij.openapi.editor.ex.util.EditorUtil;
 import com.intellij.openapi.ide.CopyPasteManager;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.ui.MacUIUtil;
@@ -50,30 +49,7 @@ public class DeleteAction extends EditorAction {
       CommandProcessor.getInstance().setCurrentCommandGroupId(EditorActionUtil.DELETE_COMMAND_GROUP);
       CopyPasteManager.getInstance().stopKillRings();
       SelectionModel selectionModel = editor.getSelectionModel();
-      final LogicalPosition logicalBlockSelectionStart = selectionModel.getBlockStart();
-      final LogicalPosition logicalBlockSelectionEnd = selectionModel.getBlockEnd();
-      if (selectionModel.hasBlockSelection() && logicalBlockSelectionStart != null && logicalBlockSelectionEnd != null) {
-        final VisualPosition visualStart = editor.logicalToVisualPosition(logicalBlockSelectionStart);
-        final VisualPosition visualEnd = editor.logicalToVisualPosition(logicalBlockSelectionEnd);
-        if (visualStart.column == visualEnd.column) {
-          int column = visualEnd.column;
-          int startVisLine = Math.min(visualStart.line, visualEnd.line);
-          int endVisLine = Math.max(visualStart.line, visualEnd.line);
-          for (int i = startVisLine; i <= endVisLine; i++) {
-            if (EditorUtil.getLastVisualLineColumnNumber(editor, i) >= visualStart.column) {
-              editor.getCaretModel().moveToVisualPosition(new VisualPosition(i, column));
-              deleteCharAtCaret(editor);
-            }
-          }
-          selectionModel.setBlockSelection(
-            new LogicalPosition(logicalBlockSelectionStart.line, column),
-            new LogicalPosition(logicalBlockSelectionEnd.line, column)
-          );
-          return;
-        }
-        EditorModificationUtil.deleteBlockSelection(editor);
-      }
-      else if (!selectionModel.hasSelection()) {
+      if (!selectionModel.hasSelection()) {
         deleteCharAtCaret(editor);
       }
       else {
index c0f9b0d25f4ca2299a4139d7341c9d248a466b7a..206fe465fbf4a7e93b67d73c49b93cbcc467e463 100644 (file)
@@ -315,9 +315,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
     EditorSettings editorSettings = editor.getSettings();
 
     int logCaretLine = caretModel.getLogicalPosition().line;
@@ -544,9 +542,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
     SoftWrapModel softWrapModel = editor.getSoftWrapModel();
 
     int lineNumber = editor.getCaretModel().getLogicalPosition().line;
@@ -621,9 +617,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
 
     int offset = caretModel.getOffset();
     if (offset == document.getTextLength()) {
@@ -715,9 +709,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
 
     int offset = editor.getCaretModel().getOffset();
     if (offset == 0) return;
@@ -771,9 +763,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
     Rectangle visibleArea = editor.getScrollingModel().getVisibleArea();
     int lineNumber = visibleArea.y / lineHeight;
     if (visibleArea.y % lineHeight > 0) {
@@ -789,9 +779,7 @@ public class EditorActionUtil {
     SelectionModel selectionModel = editor.getSelectionModel();
     int selectionStart = selectionModel.getLeadSelectionOffset();
     CaretModel caretModel = editor.getCaretModel();
-    LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                          ? selectionModel.getBlockStart()
-                                          : caretModel.getLogicalPosition();
+    LogicalPosition blockSelectionStart = caretModel.getLogicalPosition();
     Rectangle visibleArea = editor.getScrollingModel().getVisibleArea();
     int lineNumber = (visibleArea.y + visibleArea.height) / lineHeight - 1;
     VisualPosition pos = new VisualPosition(lineNumber, editor.getCaretModel().getVisualPosition().column);
index 9a977ae6493fadc41807ae327ab4b21f8fe4689d..88f681f6963799e732289b6f3a1ab358aec828d4 100644 (file)
@@ -59,7 +59,7 @@ public class EscapeAction extends EditorAction {
     public boolean isEnabled(Editor editor, DataContext dataContext) {
       SelectionModel selectionModel = editor.getSelectionModel();
       CaretModel caretModel = editor.getCaretModel();
-      return selectionModel.hasSelection() || selectionModel.hasBlockSelection() || caretModel.getCaretCount() > 1;
+      return selectionModel.hasSelection() || caretModel.getCaretCount() > 1;
     }
   }
 }
index 094c9523d8090d9c4dcaabebc184a317b5917ae5..fa69913ea152d93400900282364ac611370b956e 100644 (file)
@@ -56,7 +56,7 @@ public class HungryBackspaceAction extends TextComponentEditorAction {
       final SelectionModel selectionModel = editor.getSelectionModel();
       final CharSequence text = document.getCharsSequence();
       final char c = text.charAt(prevSymbolOffset);
-      final boolean doHungryCheck = !selectionModel.hasSelection() && !selectionModel.hasBlockSelection() && StringUtil.isWhiteSpace(c);
+      final boolean doHungryCheck = !selectionModel.hasSelection() && StringUtil.isWhiteSpace(c);
       final EditorActionHandler handler = EditorActionManager.getInstance().getActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE);
       handler.execute(editor, dataContext);
 
index 76a2ae6f24e094ab7992f2f8841f73f3aedaec4a..8f7cea0fc61d4f4e3fb9396cb17d9afba8353d7a 100644 (file)
@@ -42,7 +42,7 @@ public class PasteAction extends EditorAction {
     @Override
     public void executeWriteAction(Editor editor, DataContext dataContext) {
       Producer<Transferable> producer = TRANSFERABLE_PROVIDER.getData(dataContext);
-      if (!editor.getCaretModel().supportsMultipleCarets() && (editor.isColumnMode() || editor.getSelectionModel().hasBlockSelection())) {
+      if (!editor.getCaretModel().supportsMultipleCarets() && editor.isColumnMode()) {
         EditorModificationUtil.pasteTransferableAsBlock(editor, producer);
       }
       else {
index a50b05b37adc0dc747be0b3320058e6b003a563b..bdda03028419a60da719b342023376a7e8dde5eb 100644 (file)
@@ -39,61 +39,34 @@ public class ToggleCaseAction extends TextComponentEditorAction {
   private static class Handler extends EditorWriteActionHandler {
     @Override
     public void executeWriteAction(final Editor editor, @Nullable Caret caret, DataContext dataContext) {
-      final SelectionModel selectionModel = editor.getSelectionModel();
-
-      if (selectionModel.hasBlockSelection()) {
-        final int[] starts = selectionModel.getBlockSelectionStarts();
-        final int[] ends = selectionModel.getBlockSelectionEnds();
-        LogicalPosition blockStart = selectionModel.getBlockStart();
-        LogicalPosition blockEnd = selectionModel.getBlockEnd();
-
-        selectionModel.removeBlockSelection();
-        selectionModel.removeSelection();
-
-        for (int i = 0; i < starts.length; i++) {
-          int startOffset = starts[i];
-          int endOffset = ends[i];
-          final String text = editor.getDocument().getCharsSequence().subSequence(startOffset, endOffset).toString();
-          String converted = toCase(text, true);
-          if (text.equals(converted)) {
-            converted = toCase(text, false);
+      final Ref<Boolean> toLowerCase = new Ref<Boolean>(Boolean.FALSE);
+      runForCaret(editor, caret, new CaretAction() {
+        @Override
+        public void perform(Caret caret) {
+          if (!caret.hasSelection()) {
+            caret.selectWordAtCaret(true);
+          }
+          String selectedText = caret.getSelectedText();
+          if (selectedText != null && !selectedText.equals(toCase(selectedText, true))) {
+            toLowerCase.set(Boolean.TRUE);
           }
-          editor.getDocument().replaceString(startOffset, endOffset, converted);
         }
-        if (blockStart != null && blockEnd != null) {
-          selectionModel.setBlockSelection(blockStart, blockEnd);
+      });
+      runForCaret(editor, caret, new CaretAction() {
+        @Override
+        public void perform(Caret caret) {
+          VisualPosition caretPosition = caret.getVisualPosition();
+          int selectionStartOffset = caret.getSelectionStart();
+          int selectionEndOffset = caret.getSelectionEnd();
+          VisualPosition selectionStartPosition = caret.getSelectionStartPosition();
+          VisualPosition selectionEndPosition = caret.getSelectionEndPosition();
+          caret.removeSelection();
+          String text = editor.getDocument().getText(new TextRange(selectionStartOffset, selectionEndOffset));
+          editor.getDocument().replaceString(selectionStartOffset, selectionEndOffset, toCase(text, toLowerCase.get()));
+          caret.moveToVisualPosition(caretPosition);
+          caret.setSelection(selectionStartPosition, selectionStartOffset, selectionEndPosition, selectionEndOffset);
         }
-      }
-      else {
-        final Ref<Boolean> toLowerCase = new Ref<Boolean>(Boolean.FALSE);
-        runForCaret(editor, caret, new CaretAction() {
-          @Override
-          public void perform(Caret caret) {
-            if (!caret.hasSelection()) {
-              caret.selectWordAtCaret(true);
-            }
-            String selectedText = caret.getSelectedText();
-            if (selectedText != null && !selectedText.equals(toCase(selectedText, true))) {
-              toLowerCase.set(Boolean.TRUE);
-            }
-          }
-        });
-        runForCaret(editor, caret, new CaretAction() {
-          @Override
-          public void perform(Caret caret) {
-            VisualPosition caretPosition = caret.getVisualPosition();
-            int selectionStartOffset = caret.getSelectionStart();
-            int selectionEndOffset = caret.getSelectionEnd();
-            VisualPosition selectionStartPosition = caret.getSelectionStartPosition();
-            VisualPosition selectionEndPosition = caret.getSelectionEndPosition();
-            caret.removeSelection();
-            String text = editor.getDocument().getText(new TextRange(selectionStartOffset, selectionEndOffset));
-            editor.getDocument().replaceString(selectionStartOffset, selectionEndOffset, toCase(text, toLowerCase.get()));
-            caret.moveToVisualPosition(caretPosition);
-            caret.setSelection(selectionStartPosition, selectionStartOffset, selectionEndPosition, selectionEndOffset);
-          }
-        });
-      }
+      });
     }
 
     private static void runForCaret(Editor editor, Caret caret, CaretAction action) {
index a3b3446139e1eff9efebf307b3343c6838bdf0e8..7d12cb5ee43af705cf05a8f32db34ad7e58e8c76 100644 (file)
@@ -73,12 +73,9 @@ public class ToggleColumnModeAction extends ToggleAction implements DumbAware {
       }
     }
     else {
-      boolean hasSelection = selectionModel.hasBlockSelection();
-      final LogicalPosition blockStart = selectionModel.getBlockStart();
-      final LogicalPosition blockEnd = selectionModel.getBlockEnd();
-
-      int selStart = hasSelection && blockStart != null ? editor.logicalPositionToOffset(blockStart) : 0;
-      int selEnd = hasSelection && blockEnd != null ? editor.logicalPositionToOffset(blockEnd) : 0;
+      boolean hasSelection = false;
+      int selStart = 0;
+      int selEnd = 0;
 
       if (caretModel.supportsMultipleCarets()) {
         hasSelection = true;
index f3fdfd3b99d098cebf74727bf1be9f0d5dd83dab..fd49b3b5574dd1e5d6e903ab2cc9ac0c0a3dc725 100644 (file)
@@ -234,15 +234,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
   }
 
   @Override
-  public void moveCaretRelatively(int columnShift, int lineShift, boolean withSelection, boolean scrollToCaret) {
-    moveCaretRelatively(columnShift, lineShift, withSelection, false, scrollToCaret);
-  }
-
-  void moveCaretRelatively(final int columnShift,
-                                  final int lineShift,
-                                  final boolean withSelection,
-                                  final boolean blockSelection,
-                                  final boolean scrollToCaret) {
+  public void moveCaretRelatively(final int columnShift, final int lineShift, final boolean withSelection, final boolean scrollToCaret) {
     assertIsDispatchThread();
     if (mySkipChangeRequests) {
       return;
@@ -256,12 +248,8 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
     myEditor.getCaretModel().doWithCaretMerging(new Runnable() {
       @Override
       public void run() {
-        SelectionModelImpl selectionModel = myEditor.getSelectionModel();
         final int leadSelectionOffset = getLeadSelectionOffset();
         final VisualPosition leadSelectionPosition = getLeadSelectionPosition();
-        LogicalPosition blockSelectionStart = selectionModel.hasBlockSelection()
-                                              ? selectionModel.getBlockStart()
-                                              : getLogicalPosition();
         EditorSettings editorSettings = myEditor.getSettings();
         VisualPosition visualCaret = getVisualPosition();
 
@@ -370,49 +358,29 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
         }
 
         if (withSelection) {
-          if (blockSelection && !supportsMultipleCarets()) {
-            selectionModel.setBlockSelection(blockSelectionStart, getLogicalPosition());
+          if (selectToDocumentStart) {
+            setSelection(leadSelectionPosition, leadSelectionOffset, myEditor.offsetToVisualPosition(0), 0);
           }
-          else {
-            if (selectToDocumentStart) {
-              if (supportsMultipleCarets()) {
-                setSelection(leadSelectionPosition, leadSelectionOffset, myEditor.offsetToVisualPosition(0), 0);
-              }
-              else {
-                setSelection(leadSelectionOffset, 0);
-              }
-            }
-            else if (pos.line >= myEditor.getVisibleLineCount()) {
-              int endOffset = document.getTextLength();
-              if (leadSelectionOffset < endOffset) {
-                if (supportsMultipleCarets()) {
-                  setSelection(leadSelectionPosition, leadSelectionOffset, myEditor.offsetToVisualPosition(endOffset), endOffset);
-                }
-                else {
-                  setSelection(leadSelectionOffset, endOffset);
-                }
-              }
+          else if (pos.line >= myEditor.getVisibleLineCount()) {
+            int endOffset = document.getTextLength();
+            if (leadSelectionOffset < endOffset) {
+              setSelection(leadSelectionPosition, leadSelectionOffset, myEditor.offsetToVisualPosition(endOffset), endOffset);
             }
-            else {
-              int selectionStartToUse = leadSelectionOffset;
-              VisualPosition selectionStartPositionToUse = leadSelectionPosition;
-              if (isUnknownDirection()) {
-                if (getOffset() > leadSelectionOffset ^ getSelectionStart() < getSelectionEnd()) {
-                  selectionStartToUse = getSelectionEnd();
-                  selectionStartPositionToUse = getSelectionEndPosition();
-                }
-                else {
-                  selectionStartToUse = getSelectionStart();
-                  selectionStartPositionToUse = getSelectionStartPosition();
-                }
-              }
-              if (supportsMultipleCarets()) {
-                setSelection(selectionStartPositionToUse, selectionStartToUse, getVisualPosition(), getOffset());
+          }
+          else {
+            int selectionStartToUse = leadSelectionOffset;
+            VisualPosition selectionStartPositionToUse = leadSelectionPosition;
+            if (isUnknownDirection()) {
+              if (getOffset() > leadSelectionOffset ^ getSelectionStart() < getSelectionEnd()) {
+                selectionStartToUse = getSelectionEnd();
+                selectionStartPositionToUse = getSelectionEndPosition();
               }
               else {
-                setSelection(selectionStartToUse, getVisualPosition(), getOffset());
+                selectionStartToUse = getSelectionStart();
+                selectionStartPositionToUse = getSelectionStartPosition();
               }
             }
+            setSelection(selectionStartPositionToUse, selectionStartToUse, getVisualPosition(), getOffset());
           }
         }
         else {
@@ -497,7 +465,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
 
     EditorSettings editorSettings = myEditor.getSettings();
 
-    if (!editorSettings.isVirtualSpace() && line < lineCount && !myEditor.getSelectionModel().hasBlockSelection()) {
+    if (!editorSettings.isVirtualSpace() && line < lineCount) {
       int lineEndOffset = doc.getLineEndOffset(line);
       final LogicalPosition endLinePosition = myEditor.offsetToLogicalPosition(lineEndOffset);
       int lineEndColumnNumber = endLinePosition.column;
@@ -606,7 +574,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
     }
 
     if (!oldCaretPosition.toVisualPosition().equals(myLogicalCaret.toVisualPosition())) {
-      CaretEvent event = new CaretEvent(myEditor, supportsMultipleCarets() ? this : null, oldCaretPosition, myLogicalCaret);
+      CaretEvent event = new CaretEvent(myEditor, this, oldCaretPosition, myLogicalCaret);
       if (fireListeners) {
         myEditor.getCaretModel().fireCaretPositionChanged(event);
       }
@@ -617,10 +585,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
     return null;
   }
 
-  private boolean supportsMultipleCarets() {
-    return myEditor.getCaretModel().supportsMultipleCarets();
-  }
-
   private void updateOffsetsFromLogicalPosition() {
     myOffset = myEditor.logicalPositionToOffset(myLogicalCaret);
     myVirtualSpaceOffset = myLogicalCaret.column - myEditor.offsetToLogicalPosition(myOffset).column;
@@ -725,7 +689,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
     requestRepaint(oldInfo);
 
     if (fireListeners && !oldPosition.equals(myLogicalCaret)) {
-      CaretEvent event = new CaretEvent(myEditor, supportsMultipleCarets() ? this : null, oldPosition, myLogicalCaret);
+      CaretEvent event = new CaretEvent(myEditor, this, oldPosition, myLogicalCaret);
       myEditor.getCaretModel().fireCaretPositionChanged(event);
     }
   }
@@ -897,7 +861,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
 
       newOffset = Math.min(newOffset, document.getTextLength());
 
-      if (supportsMultipleCarets() && myOffset != startOffset) {
+      if (myOffset != startOffset) {
         LogicalPosition pos = myEditor.offsetToLogicalPosition(newOffset);
         moveToLogicalPosition(new LogicalPosition(pos.line, pos.column + myVirtualSpaceOffset), // retain caret in the virtual space
                             performSoftWrapAdjustment, null, true);
@@ -1214,8 +1178,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
 
         validateContext(true);
 
-        myEditor.getSelectionModel().removeBlockSelection();
-
         int textLength = doc.getTextLength();
         if (startOffset < 0 || startOffset > textLength) {
           LOG.error("Wrong startOffset: " + startOffset + ", textLength=" + textLength);
@@ -1326,7 +1288,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
       @Override
       public void run() {
         validateContext(true);
-        myEditor.getSelectionModel().removeBlockSelection();
         int caretOffset = getOffset();
         RangeMarker marker = mySelectionMarker;
         if (marker != null) {
@@ -1488,7 +1449,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret {
   }
 
   private boolean isVirtualSelectionEnabled() {
-    return myEditor.isColumnMode() && supportsMultipleCarets();
+    return myEditor.isColumnMode();
   }
 
   boolean hasVirtualSelection() {
index 6221b8867153a4772ab8ab48b6b0b643ef32107a..e53a6a4f0a78b91c8ff55de3c1f20f41cd81f534 100644 (file)
@@ -35,7 +35,6 @@ import com.intellij.openapi.editor.ex.PrioritizedDocumentListener;
 import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
 import com.intellij.openapi.editor.markup.TextAttributes;
 import com.intellij.openapi.util.Disposer;
-import com.intellij.openapi.util.registry.Registry;
 import com.intellij.util.EventDispatcher;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -46,7 +45,6 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
   private final EditorImpl myEditor;
   
   private final EventDispatcher<CaretListener> myCaretListeners = EventDispatcher.create(CaretListener.class);
-  private final boolean mySupportsMultipleCarets = Registry.is("editor.allow.multiple.carets");
 
   private TextAttributes myTextAttributes;
 
@@ -123,7 +121,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
 
   @Override
   public void moveCaretRelatively(final int columnShift, final int lineShift, final boolean withSelection, final boolean blockSelection, final boolean scrollToCaret) {
-    getCurrentCaret().moveCaretRelatively(columnShift, lineShift, withSelection, blockSelection, scrollToCaret);
+    getCurrentCaret().moveCaretRelatively(columnShift, lineShift, withSelection, scrollToCaret);
   }
 
   @Override
@@ -212,7 +210,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
 
   @Override
   public boolean supportsMultipleCarets() {
-    return mySupportsMultipleCarets;
+    return true;
   }
 
   @Override
@@ -308,9 +306,6 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
   @Override
   public void removeSecondaryCarets() {
     EditorImpl.assertIsDispatchThread();
-    if (!supportsMultipleCarets()) {
-      return;
-    }
     ListIterator<CaretImpl> caretIterator = myCarets.listIterator(myCarets.size() - 1);
     while (caretIterator.hasPrevious()) {
       CaretImpl caret = caretIterator.previous();
@@ -330,10 +325,6 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
   @Override
   public void runForEachCaret(@NotNull final CaretAction action, final boolean reverseOrder) {
     EditorImpl.assertIsDispatchThread();
-    if (!supportsMultipleCarets()) {
-      action.perform(getPrimaryCaret());
-      return;
-    }
     if (myCurrentCaret != null) {
       throw new IllegalStateException("Current caret is defined, cannot operate on other ones");
     }
@@ -363,7 +354,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
   }
 
   private void mergeOverlappingCaretsAndSelections() {
-    if (!supportsMultipleCarets() || myCarets.size() <= 1) {
+    if (myCarets.size() <= 1) {
       return;
     }
     LinkedList<CaretImpl> carets = new LinkedList<CaretImpl>(myCarets);
index 530fea5fc19c0850b7b03b5d6e624d3f6c5c5259..55f49157d4c03f31c7ca70a2d93f75994ba7b887 100644 (file)
@@ -758,15 +758,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       myIgnoreMouseEventsConsecutiveToInitial = true;
     }
 
-    if (myCaretModel.supportsMultipleCarets()) {
-      myCaretModel.updateVisualPosition();
-    }
-    else {
-      // There is a possible case that 'use soft wrap' setting value is changed and we need to repaint all affected lines then.
-      repaintToScreenBottom(getCaretModel().getLogicalPosition().line);
-      int y = getCaretModel().getVisualLineStart() * getLineHeight();
-      myGutterComponent.repaint(0, y, myGutterComponent.getWidth(), myGutterComponent.getHeight() - y);
-    }
+    myCaretModel.updateVisualPosition();
+
     // make sure carets won't appear at invalid positions (e.g. on Tab width change)
     for (Caret caret : getCaretModel().getAllCarets()) {
       caret.moveToOffset(caret.getOffset());
@@ -1139,14 +1132,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     boolean oldValue = myIsInsertMode;
     myIsInsertMode = mode;
     myPropertyChangeSupport.firePropertyChange(PROP_INSERT_MODE, oldValue, mode);
-    if (myCaretModel.supportsMultipleCarets()) {
-      myCaretCursor.repaint();
-    }
-    else {
-      //Repaint the caret line by moving caret to the same place
-      LogicalPosition caretPosition = getCaretModel().getLogicalPosition();
-      getCaretModel().moveToLogicalPosition(caretPosition);
-    }
+    myCaretCursor.repaint();
   }
 
   @Override
@@ -1734,7 +1720,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
 
     clearTextWidthCache();
 
-    mySelectionModel.removeBlockSelection();
     setMouseSelectionState(MOUSE_SELECTION_STATE_NONE);
 
     mySizeContainer.reset();
@@ -1768,7 +1753,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     if (myDocument.isInBulkUpdate()) return;
 
     clearTextWidthCache();
-    mySelectionModel.removeBlockSelection();
     setMouseSelectionState(MOUSE_SELECTION_STATE_NONE);
 
     // We assume that size container is already notified with the visual line widths during soft wraps processing
@@ -2017,7 +2001,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       return;
     }
 
-    paintRectangularSelection(g);
     paintRightMargin(g, clip);
     paintCustomRenderers(g, clipStartOffset, clipEndOffset);
     MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(myDocument, myProject, true);
@@ -2478,32 +2461,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     }
   }
 
-  private void paintRectangularSelection(@NotNull Graphics g) {
-    final SelectionModel model = getSelectionModel();
-    if (!model.hasBlockSelection()) return;
-    final LogicalPosition blockStart = model.getBlockStart();
-    final LogicalPosition blockEnd = model.getBlockEnd();
-    assert blockStart != null;
-    assert blockEnd != null;
-
-    final Point start = logicalPositionToXY(blockStart);
-    final Point end = logicalPositionToXY(blockEnd);
-    g.setColor(myScheme.getColor(EditorColors.SELECTION_BACKGROUND_COLOR));
-    final int y;
-    final int height;
-    if (start.y <= end.y) {
-      y = start.y;
-      height = end.y - y + getLineHeight();
-    }
-    else {
-      y = end.y;
-      height = start.y - end.y + getLineHeight();
-    }
-    final int x = Math.min(start.x, end.x);
-    final int width = Math.max(2, Math.abs(end.x - start.x));
-    g.fillRect(x, y, width, height);
-  }
-
   private void paintAfterFileEndBackground(@NotNull IterationState iterationState,
                                            @NotNull Graphics g,
                                            @NotNull Point position,
@@ -4000,7 +3957,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       return getLogicalPositionForScreenPos(x, newY, trimToLineWidth);
     }
 
-    if (!mySettings.isVirtualSpace() && !mySelectionModel.hasBlockSelection() && trimToLineWidth) {
+    if (!mySettings.isVirtualSpace() && trimToLineWidth) {
       int lineEndOffset = myDocument.getLineEndOffset(line);
       int lineEndColumn = calcColumnNumber(lineEndOffset, line);
       if (column > lineEndColumn) {
@@ -4223,8 +4180,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       int oldSelectionStart = leadCaret.getLeadSelectionOffset();
       VisualPosition oldVisLeadSelectionStart = leadCaret.getLeadSelectionPosition();
       int oldCaretOffset = getCaretModel().getOffset();
-      LogicalPosition oldLogicalCaret = getCaretModel().getLogicalPosition();
-      boolean multiCaretSelection = myCaretModel.supportsMultipleCarets() && (columnSelectionDrag || toggleCaretEvent);
+      boolean multiCaretSelection = columnSelectionDrag || toggleCaretEvent;
       LogicalPosition newLogicalCaret = getLogicalPositionForScreenPos(x, y, !multiCaretSelection);
       if (multiCaretSelection) {
         myMultiSelectionInProgress = true;
@@ -4246,19 +4202,10 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
         selectionModel.setSelection(oldSelectionStart, newCaretOffset);
       }
       else {
-        if (columnSelectionDrag || toggleCaretEvent) {
-          if (myCaretModel.supportsMultipleCarets()) {
-            if (myLastMousePressedLocation != null && (myCurrentDragIsSubstantial || !newLogicalCaret.equals(myLastMousePressedLocation))) {
-              createSelectionTill(newLogicalCaret);
-              blockActionsIfNeeded(e, myLastMousePressedLocation, newLogicalCaret);
-            }
-          } else {
-            final LogicalPosition blockStart = selectionModel.hasBlockSelection() ? selectionModel.getBlockStart() : oldLogicalCaret;
-            if (blockStart != null) {
-              LogicalPosition endPosition = getCaretModel().getLogicalPosition();
-              mySelectionModel.setBlockSelection(blockStart, endPosition);
-              blockActionsIfNeeded(e, blockStart, endPosition);
-            }
+        if (multiCaretSelection) {
+          if (myLastMousePressedLocation != null && (myCurrentDragIsSubstantial || !newLogicalCaret.equals(myLastMousePressedLocation))) {
+            createSelectionTill(newLogicalCaret);
+            blockActionsIfNeeded(e, myLastMousePressedLocation, newLogicalCaret);
           }
         }
         else {
@@ -4491,22 +4438,14 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
   }
 
   private void setCursorPosition() {
-    if (myCaretModel.supportsMultipleCarets()) {
-      final List<CaretRectangle> caretPoints = new ArrayList<CaretRectangle>();
-      for (Caret caret : getCaretModel().getAllCarets()) {
-        VisualPosition caretPosition = caret.getVisualPosition();
-        Point pos1 = visualPositionToXY(caretPosition);
-        Point pos2 = visualPositionToXY(new VisualPosition(caretPosition.line, caretPosition.column + 1));
-        caretPoints.add(new CaretRectangle(pos1, pos2.x - pos1.x, caret));
-      }
-      myCaretCursor.setPositions(caretPoints.toArray(new CaretRectangle[caretPoints.size()]));
-    }
-    else {
-      VisualPosition caretPosition = getCaretModel().getVisualPosition();
+    final List<CaretRectangle> caretPoints = new ArrayList<CaretRectangle>();
+    for (Caret caret : getCaretModel().getAllCarets()) {
+      VisualPosition caretPosition = caret.getVisualPosition();
       Point pos1 = visualPositionToXY(caretPosition);
       Point pos2 = visualPositionToXY(new VisualPosition(caretPosition.line, caretPosition.column + 1));
-      myCaretCursor.setPosition(pos1, pos2.x - pos1.x);
+      caretPoints.add(new CaretRectangle(pos1, pos2.x - pos1.x, caret));
     }
+    myCaretCursor.setPositions(caretPoints.toArray(new CaretRectangle[caretPoints.size()]));
   }
 
   @Override
@@ -4588,8 +4527,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
   }
 
   private class CaretCursor {
-    private Point myLocation;
-    private int myWidth;
     private CaretRectangle[] myLocations;
     private boolean myEnabled;
 
@@ -4598,7 +4535,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     private long myStartTime = 0;
 
     private CaretCursor() {
-      myLocation = new Point(0, 0);
       myLocations = new CaretRectangle[] {new CaretRectangle(new Point(0, 0), 0, null)};
       setEnabled(true);
     }
@@ -4634,14 +4570,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       }
     }
 
-    private void setPosition(Point location, int width) {
-      myStartTime = System.currentTimeMillis();
-      myLocation = location;
-      myWidth = Math.max(width, 2);
-      myIsShown = true;
-      repaint();
-    }
-
     private void setPositions(CaretRectangle[] locations) {
       myStartTime = System.currentTimeMillis();
       myLocations = locations;
@@ -4650,26 +4578,16 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     }
 
     private void repaint() {
-      if (myCaretModel.supportsMultipleCarets()) {
-        for (CaretRectangle location : myLocations) {
-          myEditorComponent.repaintEditorComponent(location.myPoint.x, location.myPoint.y, location.myWidth, getLineHeight());
-        }
-      }
-      else {
-        myEditorComponent.repaintEditorComponent(myLocation.x, myLocation.y, myWidth, getLineHeight());
+      for (CaretRectangle location : myLocations) {
+        myEditorComponent.repaintEditorComponent(location.myPoint.x, location.myPoint.y, location.myWidth, getLineHeight());
       }
     }
 
     private void paint(@NotNull Graphics g) {
       if (!isEnabled() || !myIsShown || isRendererMode() || !IJSwingUtilities.hasFocus(getContentComponent())) return;
 
-      if (myCaretModel.supportsMultipleCarets()) {
-        for (CaretRectangle location : myLocations) {
-          paintAt(g, location.myPoint.x, location.myPoint.y, location.myWidth, location.myCaret);
-        }
-      }
-      else {
-        paintAt(g, myLocation.x, myLocation.y, myWidth, null);
+      for (CaretRectangle location : myLocations) {
+        paintAt(g, location.myPoint.x, location.myPoint.y, location.myWidth, location.myCaret);
       }
     }
 
@@ -4858,9 +4776,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
                 getScrollingModel().scrollTo(newLogicalPosition, ScrollType.RELATIVE);
                 createSelectionTill(newLogicalPosition);
               }
-              else if (mySelectionModel.hasBlockSelection()) {
-                mySelectionModel.setBlockSelection(mySelectionModel.getBlockStart(), getCaretModel().getLogicalPosition());
-              }
               else {
                 mySelectionModel.setSelection(oldSelectionStart, getCaretModel().getOffset());
               }
@@ -5030,7 +4945,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
 
     @Override
     public boolean isCopyVisible(@NotNull DataContext dataContext) {
-      return getSelectionModel().hasSelection(true) || getSelectionModel().hasBlockSelection();
+      return getSelectionModel().hasSelection(true);
     }
 
     @Override
@@ -5046,7 +4961,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     @Override
     public boolean isCutVisible(@NotNull DataContext dataContext) {
       if (!isCutEnabled(dataContext)) return false;
-      return getSelectionModel().hasSelection(true) || getSelectionModel().hasBlockSelection();
+      return getSelectionModel().hasSelection(true);
     }
 
     @Override
@@ -5759,7 +5674,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       final int oldStart = mySelectionModel.getSelectionStart();
       final int oldEnd = mySelectionModel.getSelectionEnd();
 
-      boolean toggleCaret = myCaretModel.supportsMultipleCarets() && e.getSource() != myGutterComponent && isToggleCaretEvent(e);
+      boolean toggleCaret = e.getSource() != myGutterComponent && isToggleCaretEvent(e);
       boolean lastPressCreatedCaret = myLastPressCreatedCaret;
       if (e.getClickCount() == 1) {
         myLastPressCreatedCaret = false;
@@ -5813,17 +5728,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
       myMousePressedInsideSelection = mySelectionModel.hasSelection() && caretOffset >= mySelectionModel.getSelectionStart() &&
                                       caretOffset <= mySelectionModel.getSelectionEnd();
 
-      if (!myMousePressedInsideSelection && mySelectionModel.hasBlockSelection()) {
-        int[] starts = mySelectionModel.getBlockSelectionStarts();
-        int[] ends = mySelectionModel.getBlockSelectionEnds();
-        for (int i = 0; i < starts.length; i++) {
-          if (caretOffset >= starts[i] && caretOffset < ends[i]) {
-            myMousePressedInsideSelection = true;
-            break;
-          }
-        }
-      }
-
       if (getMouseEventArea(e) == EditorMouseEventArea.LINE_NUMBERS_AREA && e.getClickCount() == 1) {
         mySelectionModel.selectLineAtCaret();
         setMouseSelectionState(MOUSE_SELECTION_STATE_LINE_SELECTED);
@@ -5850,7 +5754,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
         }
       }
       else {
-        if (!myMousePressedInsideSelection && (getSelectionModel().hasSelection() || getSelectionModel().hasBlockSelection())) {
+        if (!myMousePressedInsideSelection && getSelectionModel().hasSelection()) {
           setMouseSelectionState(MOUSE_SELECTION_STATE_NONE);
           mySelectionModel.setSelection(caretOffset, caretOffset);
         }
@@ -6356,7 +6260,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
         if (!FileDocumentManager.getInstance().requestWriting(editor.getDocument(), editor.getProject())) {
           return;
         }
-        CommandProcessor.getInstance().executeCommand(((EditorImpl)editor).myProject, new Runnable() {
+        CommandProcessor.getInstance().executeCommand(editor.myProject, new Runnable() {
           @Override
           public void run() {
             ApplicationManager.getApplication().runWriteAction(new Runnable() {
index 2cf61697255043473433184c25020011a8e78be4..82eceacf1547c55a9d7b00a8ebf6a49d91bf2b90 100644 (file)
@@ -380,7 +380,6 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList
       caretPosition = new LogicalPosition(caretPosition.line, caretPosition.column);
     }
     int caretOffset = myEditor.logicalPositionToOffset(caretPosition);
-    boolean hasBlockSelection = myEditor.getSelectionModel().hasBlockSelection();
     int selectionStart = myEditor.getSelectionModel().getSelectionStart();
     int selectionEnd = myEditor.getSelectionModel().getSelectionEnd();
 
@@ -424,7 +423,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList
 
     if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) {
       myEditor.getSelectionModel().removeSelection();
-    } else if (!hasBlockSelection && selectionStart < myEditor.getDocument().getTextLength()) {
+    } else if (selectionStart < myEditor.getDocument().getTextLength()) {
       myEditor.getSelectionModel().setSelection(selectionStart, selectionEnd);
     }
 
index 3b658d03128feee097312b334cfe867a0ae32de1..dc56ac52a101496578707c467cd875be21874771 100644 (file)
@@ -137,7 +137,7 @@ public final class IterationState {
     LOG.assertTrue(myStartOffset <= myEnd);
     myHighlighterIterator = useOnlyFullLineHighlighters ? null : editor.getHighlighter().createIterator(start);
 
-    boolean hasSelection = useCaretAndSelection && (editor.getCaretModel().supportsMultipleCarets() || editor.getSelectionModel().hasSelection() || editor.getSelectionModel().hasBlockSelection());
+    boolean hasSelection = useCaretAndSelection && (editor.getCaretModel().supportsMultipleCarets() || editor.getSelectionModel().hasSelection());
     if (!hasSelection) {
       mySelectionStarts = ArrayUtilRt.EMPTY_INT_ARRAY;
       mySelectionEnds = ArrayUtilRt.EMPTY_INT_ARRAY;
index 4e95b35878c7eb15faa49a6a232ffeef5f725dc3..6acfb0318ad0312a3c53aa30b46991296ecca794 100644 (file)
@@ -33,21 +33,16 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme;
 import com.intellij.openapi.editor.event.DocumentEvent;
 import com.intellij.openapi.editor.event.SelectionEvent;
 import com.intellij.openapi.editor.event.SelectionListener;
-import com.intellij.openapi.editor.ex.DocumentEx;
 import com.intellij.openapi.editor.ex.PrioritizedDocumentListener;
 import com.intellij.openapi.editor.ex.util.EditorUtil;
 import com.intellij.openapi.editor.markup.TextAttributes;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Pair;
-import com.intellij.util.ArrayUtil;
 import com.intellij.util.containers.ContainerUtil;
-import gnu.trove.TIntArrayList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 
 public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentListener {
@@ -58,11 +53,6 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi
 
   private TextAttributes myTextAttributes;
 
-  private LogicalPosition myBlockStart;
-  private LogicalPosition myBlockEnd;
-  private int[] myBlockSelectionStarts;
-  private int[] myBlockSelectionEnds;
-
   private DocumentEvent myIsInUpdate;
 
   public SelectionModelImpl(EditorImpl editor) {
@@ -210,219 +200,61 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi
 
   @Override
   public void setBlockSelection(@NotNull LogicalPosition blockStart, @NotNull LogicalPosition blockEnd) {
-    if (myEditor.getCaretModel().supportsMultipleCarets()) {
-      List<CaretState> caretStates = EditorModificationUtil.calcBlockSelectionState(myEditor, blockStart, blockEnd);
-      myEditor.getCaretModel().setCaretsAndSelections(caretStates);
-    }
-    else {
-      removeSelection();
-
-      int oldStartLine = 0;
-      int oldEndLine = 0;
-
-      if (hasBlockSelection()) {
-        oldStartLine = myBlockStart.line;
-        oldEndLine = myBlockEnd.line;
-        if (oldStartLine > oldEndLine) {
-          int t = oldStartLine;
-          oldStartLine = oldEndLine;
-          oldEndLine = t;
-        }
-      }
-
-      int newStartLine = blockStart.line;
-      int newEndLine = blockEnd.line;
-
-      if (newStartLine > newEndLine) {
-        int t = newStartLine;
-        newStartLine = newEndLine;
-        newEndLine = t;
-      }
-
-      myEditor.repaintLines(Math.min(oldStartLine, newStartLine), Math.max(newEndLine, oldEndLine));
-
-      final int[] oldStarts = getBlockSelectionStarts();
-      final int[] oldEnds = getBlockSelectionEnds();
-
-      myBlockStart = blockStart;
-      myBlockEnd = blockEnd;
-      recalculateBlockOffsets();
-
-      final int[] newStarts = getBlockSelectionStarts();
-      final int[] newEnds = getBlockSelectionEnds();
-
-      broadcastSelectionEvent(new SelectionEvent(myEditor, oldStarts, oldEnds, newStarts, newEnds));
-    }
+    List<CaretState> caretStates = EditorModificationUtil.calcBlockSelectionState(myEditor, blockStart, blockEnd);
+    myEditor.getCaretModel().setCaretsAndSelections(caretStates);
   }
 
   @Override
   public void removeBlockSelection() {
-    if (!myEditor.getCaretModel().supportsMultipleCarets()) {
-      myEditor.getCaretModel().getCurrentCaret().setUnknownDirection(false);
-      if (hasBlockSelection()) {
-        myEditor.repaint(0, myEditor.getDocument().getTextLength());
-
-        final int[] oldStarts = getBlockSelectionStarts();
-        final int[] oldEnds = getBlockSelectionEnds();
-
-        myBlockStart = null;
-        myBlockEnd = null;
-
-        final int[] newStarts = getBlockSelectionStarts();
-        final int[] newEnds = getBlockSelectionEnds();
-
-        broadcastSelectionEvent(new SelectionEvent(myEditor, oldStarts, oldEnds, newStarts, newEnds));
-      }
-    }
   }
 
   @Override
   public boolean hasBlockSelection() {
-    return myBlockStart != null;
+    return false;
   }
 
   @Override
   public LogicalPosition getBlockStart() {
-    return myBlockStart;
+    return null;
   }
 
   @Override
   public LogicalPosition getBlockEnd() {
-    return myBlockEnd;
+    return null;
   }
 
   @Override
   public boolean isBlockSelectionGuarded() {
-    if (!hasBlockSelection()) return false;
-    int[] starts = getBlockSelectionStarts();
-    int[] ends = getBlockSelectionEnds();
-    Document doc = myEditor.getDocument();
-    for (int i = 0; i < starts.length; i++) {
-      int start = starts[i];
-      int end = ends[i];
-      if (start == end && doc.getOffsetGuard(start) != null || start != end && doc.getRangeGuard(start, end) != null) {
-        return true;
-      }
-    }
     return false;
   }
 
   @Override
   public RangeMarker getBlockSelectionGuard() {
-    if (!hasBlockSelection()) return null;
-
-    int[] starts = getBlockSelectionStarts();
-    int[] ends = getBlockSelectionEnds();
-    Document doc = myEditor.getDocument();
-    for (int i = 0; i < starts.length; i++) {
-      int start = starts[i];
-      int end = ends[i];
-      if (start == end) {
-        RangeMarker guard = doc.getOffsetGuard(start);
-        if (guard != null) return guard;
-      }
-      if (start != end) {
-        RangeMarker guard = doc.getRangeGuard(start, end);
-        if (guard != null) return guard;
-      }
-    }
-
     return null;
   }
 
-  private void recalculateBlockOffsets() {
-    TIntArrayList startOffsets = new TIntArrayList();
-    TIntArrayList endOffsets = new TIntArrayList();
-    final int startLine = Math.min(myBlockStart.line, myBlockEnd.line);
-    final int endLine = Math.max(myBlockStart.line, myBlockEnd.line);
-    final int startColumn = Math.min(myBlockStart.column, myBlockEnd.column);
-    final int endColumn = Math.max(myBlockStart.column, myBlockEnd.column);
-    FoldingModelImpl foldingModel = myEditor.getFoldingModel();
-    DocumentEx document = myEditor.getDocument();
-    boolean insideFoldRegion = false;
-    for (int line = startLine; line <= endLine; line++) {
-      int startOffset = myEditor.logicalPositionToOffset(new LogicalPosition(line, startColumn));
-      FoldRegion startRegion = foldingModel.getCollapsedRegionAtOffset(startOffset);
-      boolean startInsideFold = startRegion != null && startRegion.getStartOffset() < startOffset;
-
-      int endOffset = myEditor.logicalPositionToOffset(new LogicalPosition(line, endColumn));
-      FoldRegion endRegion = foldingModel.getCollapsedRegionAtOffset(endOffset);
-      boolean endInsideFold = endRegion != null && endRegion.getStartOffset() < endOffset;
-
-      if (!startInsideFold && !endInsideFold) {
-        startOffsets.add(startOffset);
-        endOffsets.add(endOffset);
-      }
-      else if (startInsideFold && endInsideFold) {
-        if (insideFoldRegion) {
-          startOffsets.add(Math.max(document.getLineStartOffset(line), startRegion.getStartOffset()));
-          endOffsets.add(Math.min(document.getLineEndOffset(line), endRegion.getEndOffset()));
-        }
-      }
-      else if (startInsideFold && !endInsideFold) {
-        if (startRegion.getEndOffset() < endOffset) {
-          startOffsets.add(Math.max(document.getLineStartOffset(line), startRegion.getStartOffset()));
-          endOffsets.add(endOffset);
-        }
-        insideFoldRegion = false;
-      }
-      else {
-        startOffsets.add(startOffset);
-        endOffsets.add(Math.min(document.getLineEndOffset(line), endRegion.getEndOffset()));
-        insideFoldRegion = true;
-      }
-    }
-
-    myBlockSelectionStarts = startOffsets.toNativeArray();
-    myBlockSelectionEnds = endOffsets.toNativeArray();
-  }
-
   @Override
   @NotNull
   public int[] getBlockSelectionStarts() {
-    if (myEditor.getCaretModel().supportsMultipleCarets()) {
-      Collection<Caret> carets = myEditor.getCaretModel().getAllCarets();
-      int[] result = new int[carets.size()];
-      int i = 0;
-      for (Caret caret : carets) {
-        result[i++] = caret.getSelectionStart();
-      }
-      return result;
-    } else {
-      if (hasSelection()) {
-        return new int[]{getSelectionStart()};
-      }
-      else if (!hasBlockSelection() || myBlockSelectionStarts == null) {
-        return ArrayUtil.EMPTY_INT_ARRAY;
-      }
-      else {
-        return myBlockSelectionStarts;
-      }
+    Collection<Caret> carets = myEditor.getCaretModel().getAllCarets();
+    int[] result = new int[carets.size()];
+    int i = 0;
+    for (Caret caret : carets) {
+      result[i++] = caret.getSelectionStart();
     }
+    return result;
   }
 
   @Override
   @NotNull
   public int[] getBlockSelectionEnds() {
-    if (myEditor.getCaretModel().supportsMultipleCarets()) {
-      Collection<Caret> carets = myEditor.getCaretModel().getAllCarets();
-      int[] result = new int[carets.size()];
-      int i = 0;
-      for (Caret caret : carets) {
-        result[i++] = caret.getSelectionEnd();
-      }
-      return result;
-    } else {
-      if (hasSelection()) {
-        return new int[]{getSelectionEnd()};
-      }
-      else if (!hasBlockSelection() || myBlockSelectionEnds == null) {
-        return ArrayUtil.EMPTY_INT_ARRAY;
-      }
-      else {
-        return myBlockSelectionEnds;
-      }
+    Collection<Caret> carets = myEditor.getCaretModel().getAllCarets();
+    int[] result = new int[carets.size()];
+    int i = 0;
+    for (Caret caret : carets) {
+      result[i++] = caret.getSelectionEnd();
     }
+    return result;
   }
 
   @Override
@@ -455,21 +287,7 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi
   public String getSelectedText(boolean allCarets) {
     validateContext(false);
 
-    if (hasBlockSelection()) {
-      CharSequence text = myEditor.getDocument().getCharsSequence();
-      int[] starts = getBlockSelectionStarts();
-      int[] ends = getBlockSelectionEnds();
-      int width = myEditor.getCaretModel().supportsMultipleCarets() ? 0 : Math.abs(myBlockEnd.column - myBlockStart.column);
-      final StringBuilder buf = new StringBuilder();
-      for (int i = 0; i < starts.length; i++) {
-        if (i > 0) buf.append('\n');
-        final int len = ends[i] - starts[i];
-        appendCharSequence(buf, text, starts[i], len);
-        for (int j = len; j < width; j++) buf.append(' ');
-      }
-      return buf.toString();
-    }
-    else if (myEditor.getCaretModel().supportsMultipleCarets() && allCarets) {
+    if (myEditor.getCaretModel().supportsMultipleCarets() && allCarets) {
       final StringBuilder buf = new StringBuilder();
       String separator = "";
       for (Caret caret : myEditor.getCaretModel().getAllCarets()) {
@@ -487,19 +305,6 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi
     }
   }
 
-  private static void appendCharSequence(@NotNull StringBuilder buf, @NotNull CharSequence s, int srcOffset, int len) {
-    if (srcOffset < 0 || len < 0 || srcOffset > s.length() - len) {
-      throw new IndexOutOfBoundsException("srcOffset " + srcOffset + ", len " + len + ", s.length() " + s.length());
-    }
-    if (len == 0) {
-      return;
-    }
-    final int limit = srcOffset + len;
-    for (int i = srcOffset; i < limit; i++) {
-      buf.append(s.charAt(i));
-    }
-  }
-
   public static void doSelectLineAtCaret(Editor editor) {
     int lineNumber = editor.getCaretModel().getLogicalPosition().line;
     Document document = editor.getDocument();
index 0b612054a71a40cdc38fe5af6f673d126ded4615..62af56479f7ecc20d921a8cadac626a03d23e5d0 100644 (file)
@@ -192,24 +192,24 @@ public class TextComponentSelectionModel implements SelectionModel {
   @Override
   @Nullable
   public LogicalPosition getBlockStart() {
-    throw new UnsupportedOperationException("Not implemented");
+    return null;
   }
 
   @Override
   @Nullable
   public LogicalPosition getBlockEnd() {
-    throw new UnsupportedOperationException("Not implemented");
+    return null;
   }
 
   @Override
   public boolean isBlockSelectionGuarded() {
-    throw new UnsupportedOperationException("Not implemented");
+    return false;
   }
 
   @Override
   @Nullable
   public RangeMarker getBlockSelectionGuard() {
-    throw new UnsupportedOperationException("Not implemented");
+    return null;
   }
 
   @Override
index 3c90258d67c60d33d600d4ace01b26ec365985c4..67195a99d3a2a2847cb4c9a5fa9eb6528ec48b70 100644 (file)
@@ -147,35 +147,17 @@ public class PositionPanel extends EditorBasedWidget implements StatusBarWidget.
       StringBuilder message = new StringBuilder();
 
       SelectionModel selectionModel = editor.getSelectionModel();
-      if (selectionModel.hasBlockSelection()) {
-        LogicalPosition start = selectionModel.getBlockStart();
-        LogicalPosition end = selectionModel.getBlockEnd();
-        if (start == null || end == null) {
-          throw new IllegalStateException(String.format(
-            "Invalid selection model state detected: 'blockSelection' property is 'true' but selection start position (%s) or "
-            + "selection end position (%s) is undefined", start, end
-          ));
-        }
-        appendLogicalPosition(start, message);
-        message.append("-");
-        appendLogicalPosition(
-          new LogicalPosition(Math.abs(end.line - start.line), Math.max(0, Math.abs(end.column - start.column) - 1)),
-          message
-        );
+      int caretCount = editor.getCaretModel().getCaretCount();
+      if (caretCount > 1) {
+        message.append(caretCount).append(" carets");
       }
       else {
-        int caretCount = editor.getCaretModel().getCaretCount();
-        if (caretCount > 1) {
-          message.append(caretCount).append(" carets");
-        }
-        else {
-          LogicalPosition caret = editor.getCaretModel().getLogicalPosition();
-
-          appendLogicalPosition(caret, message);
-          if (selectionModel.hasSelection()) {
-            int len = Math.abs(selectionModel.getSelectionStart() - selectionModel.getSelectionEnd());
-            if (len != 0) message.append("/").append(len);
-          }
+        LogicalPosition caret = editor.getCaretModel().getLogicalPosition();
+
+        appendLogicalPosition(caret, message);
+        if (selectionModel.hasSelection()) {
+          int len = Math.abs(selectionModel.getSelectionStart() - selectionModel.getSelectionEnd());
+          if (len != 0) message.append("/").append(len);
         }
       }
 
index 8b62b03a44ad953d8f940618041e2334695f4312..86d67e864ae4803f3efeff674dff3ffcb11927f7 100644 (file)
@@ -33,7 +33,6 @@ import com.intellij.openapi.editor.impl.softwrap.SoftWrapPainter;
 import com.intellij.openapi.editor.impl.softwrap.mapping.SoftWrapApplianceManager;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.TextRange;
-import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.tree.IElementType;
 import org.jetbrains.annotations.NotNull;
@@ -391,10 +390,8 @@ public class EditorTestUtil {
       int actualCaretLine = editor.getDocument().getLineNumber(currentCaret.getOffset());
       int actualCaretColumn = currentCaret.getOffset() - editor.getDocument().getLineStartOffset(actualCaretLine);
       LogicalPosition actualCaretPosition = new LogicalPosition(actualCaretLine, actualCaretColumn);
-      int[] selectionStarts = editor.getSelectionModel().getBlockSelectionStarts();
-      int[] selectionEnds = editor.getSelectionModel().getBlockSelectionEnds();
-      int selectionStart = editor.getSelectionModel().hasBlockSelection() ? selectionStarts[selectionStarts.length - 1] : currentCaret.getSelectionStart();
-      int selectionEnd = editor.getSelectionModel().hasBlockSelection() ? selectionEnds[selectionEnds.length - 1] : currentCaret.getSelectionEnd();
+      int selectionStart = currentCaret.getSelectionStart();
+      int selectionEnd = currentCaret.getSelectionEnd();
       LogicalPosition actualSelectionStart = editor.offsetToLogicalPosition(selectionStart);
       LogicalPosition actualSelectionEnd = editor.offsetToLogicalPosition(selectionEnd);
       CaretInfo expected = caretState.carets.get(i);
@@ -415,14 +412,6 @@ public class EditorTestUtil {
     }
   }
 
-  public static void enableMultipleCarets() {
-    Registry.get("editor.allow.multiple.carets").setValue(true);
-  }
-
-  public static void disableMultipleCarets() {
-    Registry.get("editor.allow.multiple.carets").setValue(false);
-  }
-
   public static FoldRegion addFoldRegion(@NotNull Editor editor, final int startOffset, final int endOffset, final String placeholder, final boolean collapse) {
     final FoldingModel foldingModel = editor.getFoldingModel();
     final Ref<FoldRegion> ref = new Ref<FoldRegion>();
index 241bb767b5445743cb7ba878c1d4bffe7f83e789..c161fbc7672012ad442db94e1c4650a85d79d1f6 100644 (file)
@@ -399,7 +399,6 @@ vcs.merge.toolwindows.restartRequired=true
 ide.open.file.in.temp.project.dir=true
 ide.open.file.in.temp.project.dir.description=Enables opening file in temp project directory
 
-editor.allow.multiple.carets=true
 embed.scene.builder=true
 
 dsm.retina.darcula.legend=true
index 920447a95184743fc3387ff020d20c84a25cc1b8..a04caf0da266475b59f5825adc134beb588541de 100644 (file)
@@ -90,7 +90,7 @@ public abstract class Intention implements IntentionAction {
     }
 
     SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasSelection() && !selectionModel.hasBlockSelection()) {
+    if (selectionModel.hasSelection()) {
       int start = selectionModel.getSelectionStart();
       int end = selectionModel.getSelectionEnd();
 
index 7e34e67659452d887c7175b44ca174713fbaf752..cd0afc4faa8cbb06abb751d19ce35db767f7f49d 100644 (file)
@@ -67,7 +67,6 @@ public class RemoveUnnecessarySemicolonsIntention implements IntentionAction {
   public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
     final SelectionModel selectionModel = editor.getSelectionModel();
     if (!(file instanceof GroovyFileBase)) return false;
-    if (selectionModel.hasBlockSelection()) return false;
 
     if (selectionModel.hasSelection()) {
       final HighlighterIterator iterator = ((EditorEx)editor).getHighlighter().createIterator(selectionModel.getSelectionStart());
@@ -99,7 +98,6 @@ public class RemoveUnnecessarySemicolonsIntention implements IntentionAction {
   @Override
   public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
     final SelectionModel selectionModel = editor.getSelectionModel();
-    if (selectionModel.hasBlockSelection()) return;
 
     Document document = editor.getDocument();
     if (selectionModel.hasSelection()) {
index 87fdf520ebebc35d09ff04202cced7d2d4514b9d..0c2c0b4a5fe3bbfa9ba64891500967d61069da5f 100644 (file)
@@ -86,7 +86,7 @@ public class PyEmacsHandler implements EmacsProcessingHandler {
     
     SelectionModel selectionModel = editor.getSelectionModel();
     // Emacs Tab doesn't adjust indent in case of active selection. So do we.
-    if (selectionModel.hasSelection() || selectionModel.hasBlockSelection()) {
+    if (selectionModel.hasSelection()) {
       return Result.CONTINUE;
     }
     
index 58f7df38df46258ce0d7709d9d1ec0172a3d7d5f..b563a9d5d5c3cb6e87640cef44ae590ff6603738 100644 (file)
@@ -49,7 +49,7 @@ public class SurroundWithEmmetAction extends BaseCodeInsightAction {
     @Override
     public void invoke(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) {
       SelectionModel selectionModel = editor.getSelectionModel();
-      if (!selectionModel.hasSelection() && !selectionModel.hasBlockSelection()) {
+      if (!selectionModel.hasSelection()) {
         selectionModel.selectLineAtCaret();
       }