diff --git a/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java b/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java
index ff62e540b587..3b9f0b34a704 100644
--- a/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java
+++ b/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java
@@ -26,6 +26,9 @@ import org.jetbrains.annotations.NonNls;
* single logical (line; column) pair matches soft wrap-introduced virtual space, i.e. different visual positions
* correspond to the same logical position. It's convenient to store exact visual location details within the logical
* position in order to relief further {@code 'logical position' -> 'visual position'} mapping.
+ *
+ * Note: two objects of this class are considered equal if their logical line and column are equal. I.e. all logical positions
+ * for soft wrap-introduced virtual space and the first document symbol after soft wrap are considered to be equal.
*
* @see Editor#offsetToLogicalPosition(int)
* @see Editor#logicalPositionToOffset(LogicalPosition)
@@ -134,18 +137,11 @@ public class LogicalPosition implements Comparable {
if (!(o instanceof LogicalPosition)) return false;
final LogicalPosition logicalPosition = (LogicalPosition) o;
- return column == logicalPosition.column && line == logicalPosition.line && softWrapLines == logicalPosition.softWrapLines
- && linesFromActiveSoftWrap == logicalPosition.linesFromActiveSoftWrap
- && softWrapColumnDiff == logicalPosition.softWrapColumnDiff && foldedLines == logicalPosition.foldedLines
- && foldingColumnDiff == logicalPosition.foldingColumnDiff;
+ return column == logicalPosition.column && line == logicalPosition.line;
}
public int hashCode() {
- int result = 29 * line + column;
- result = result * 29 + softWrapLines;
- result = 29 * result + softWrapColumnDiff;
- result = 29 * result + foldedLines;
- return 29 * result + foldingColumnDiff;
+ return 29 * line + column;
}
@NonNls
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java
index 841a909719df..f716608bfa52 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java
@@ -233,10 +233,13 @@ public class EditorActionUtil {
}
else if (logLineToUse == logCaretLine) {
int line = currentVisCaret.line;
- int column = 0;
+ int column;
if (currentVisCaret.column == 0) {
column = findSmartIndentColumn(editor, currentVisCaret.line);
}
+ else {
+ column = findFirstNonSpaceColumnOnTheLine(editor, currentVisCaret.line);
+ }
caretModel.moveToVisualPosition(new VisualPosition(line, column));
}
else {
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java
index 55333c4a986b..fecf85c1090b 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java
@@ -279,7 +279,7 @@ public class SoftWrapModelImpl implements SoftWrapModelEx {
@NotNull
public LogicalPosition adjustLogicalPosition(@NotNull LogicalPosition defaultLogical, @NotNull VisualPosition visual) {
- if (myActive > 0 || !isSoftWrappingEnabled() || myWraps.isEmpty()) {
+ if (myActive > 0 || !isSoftWrappingEnabled() || myWraps.isEmpty() || myEditor.getDocument().getTextLength() <= 0) {
return defaultLogical;
}