IDEA-63970 Disabling "Smart Home" has no effect
authorDenis Zhdanov <Denis.Zhdanov@jetbrains.com>
Thu, 13 Jan 2011 09:39:06 +0000 (12:39 +0300)
committerDenis Zhdanov <Denis.Zhdanov@jetbrains.com>
Thu, 13 Jan 2011 09:40:51 +0000 (12:40 +0300)
1. Added support for 'non-smart home' processing;
2. Corresponding test is added;

platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java
platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceOnDocumentModificationTest.java

index 7ea59777c4018ecbc2f32fa534642877ab0423f8..ecdaca94248f4dc626a98d126851678c7b52ca0a 100644 (file)
@@ -215,7 +215,12 @@ public class EditorActionUtil {
 
     if (currentVisCaret.line > caretLogLineStartVis.line) {
       // Caret is located not at the first visual line of soft-wrapped logical line.
-      moveCaretToStartOfSoftWrappedLine(editor, currentVisCaret, currentVisCaret.line - caretLogLineStartVis.line);
+      if (editorSettings.isSmartHome()) {
+        moveCaretToStartOfSoftWrappedLine(editor, currentVisCaret, currentVisCaret.line - caretLogLineStartVis.line);
+      }
+      else {
+        caretModel.moveToVisualPosition(new VisualPosition(currentVisCaret.line, 0));
+      }
       setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart);
       editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
       return;
@@ -228,8 +233,8 @@ public class EditorActionUtil {
     }
     logLineToUse++;
 
-    if (logLineToUse >= document.getLineCount()) {
-      editor.getCaretModel().moveToVisualPosition(new VisualPosition(logLineToUse, 0));
+    if (logLineToUse >= document.getLineCount() || !editorSettings.isSmartHome()) {
+      editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(logLineToUse, 0));
     }
     else if (logLineToUse == logCaretLine) {
       int line = currentVisCaret.line;
index b77e9a1f13acbb65b47d70aaeeb18525129f4780..0e8646825acb511b2e1eb060e8cd083b1e54fb61 100644 (file)
@@ -33,10 +33,25 @@ import java.util.List;
  */
 public class SoftWrapApplianceOnDocumentModificationTest extends AbstractEditorProcessingOnDocumentModificationTest {
 
+  private boolean mySmartHome;
+  
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    if (myEditor == null) {
+      return;
+    }
+
+    EditorSettings settings = myEditor.getSettings();
+    mySmartHome = settings.isSmartHome();
+  }
+
   @Override
   protected void tearDown() throws Exception {
     if (myEditor != null) {
-      myEditor.getSettings().setUseSoftWraps(false);
+      EditorSettings settings = myEditor.getSettings();
+      settings.setUseSoftWraps(false);
+      settings.setSmartHome(mySmartHome);
     }
     super.tearDown();
   }
@@ -652,6 +667,34 @@ public class SoftWrapApplianceOnDocumentModificationTest extends AbstractEditorP
     return result;
   }
   
+  public void testNonSmartHome() throws IOException {
+    String text =
+      "     this is a string that starts with white space and is long enough to be soft-wrapped\n" +
+      " this is a 'prefix' text before collapsed multi-line folding that is long enough to be soft-wrapped first fold line\n" +
+      "second fold line";
+    init(200, text);
+    
+    addCollapsedFoldRegion(text.indexOf("first fold line"), text.length(), "...");
+
+    List<? extends SoftWrap> softWraps = getSoftWrapModel().getRegisteredSoftWraps();
+    assertTrue(!softWraps.isEmpty());
+
+    CaretModel caretModel = myEditor.getCaretModel();
+    SoftWrap softWrap = softWraps.get(0);
+    
+    // Test non-smart home
+    myEditor.getSettings().setSmartHome(false);
+    caretModel.moveToOffset(softWrap.getStart() + 1);
+    int visLine = caretModel.getVisualPosition().line;
+    home();
+    assertEquals(new VisualPosition(visLine, 0), caretModel.getVisualPosition());
+    
+    caretModel.moveToOffset(text.length());
+    home();
+    visLine = caretModel.getVisualPosition().line;
+    assertEquals(new VisualPosition(visLine, 0), caretModel.getVisualPosition());
+  }
+  
   private void init(final int visibleWidth, String fileText) throws IOException {
     init(fileText);
     myEditor.getSettings().setUseSoftWraps(true);