summaryrefslogtreecommitdiffstats
path: root/src/gui/text/qtextcursor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text/qtextcursor.cpp')
-rw-r--r--src/gui/text/qtextcursor.cpp35
1 files changed, 15 insertions, 20 deletions
diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp
index 2bebf4c861..766d9792cd 100644
--- a/src/gui/text/qtextcursor.cpp
+++ b/src/gui/text/qtextcursor.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -269,25 +269,7 @@ void QTextCursorPrivate::adjustCursor(QTextCursor::MoveOperation m)
QTextTableCell c_position = table->cellAt(position);
QTextTableCell c_anchor = table->cellAt(adjusted_anchor);
if (c_position != c_anchor) {
- bool before;
- int col_position = c_position.column();
- int col_anchor = c_anchor.column();
- if (col_position == col_anchor) {
- before = c_position.row() < c_anchor.row();
- } else {
- before = col_position < col_anchor;
- }
-
- // adjust to cell boundaries
- if (m <= QTextCursor::WordLeft) {
- position = c_position.firstPosition();
- if (!before)
- --position;
- } else {
- position = c_position.lastPosition();
- if (before)
- ++position;
- }
+ position = c_position.firstPosition();
if (position < adjusted_anchor)
adjusted_anchor = c_anchor.lastPosition();
else
@@ -391,6 +373,17 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
int newPosition = position;
+ if (mode == QTextCursor::KeepAnchor && complexSelectionTable() != 0) {
+ if ((op >= QTextCursor::EndOfLine && op <= QTextCursor::NextWord)
+ || (op >= QTextCursor::Right && op <= QTextCursor::WordRight)) {
+ QTextTable *t = qobject_cast<QTextTable *>(priv->frameAt(position));
+ Q_ASSERT(t); // as we have already made sure we have a complex selection
+ QTextTableCell cell_pos = t->cellAt(position);
+ if (cell_pos.column() + cell_pos.columnSpan() != t->columns())
+ op = QTextCursor::NextCell;
+ }
+ }
+
if (x == -1 && !priv->isInEditBlock() && (op == QTextCursor::Up || op == QTextCursor::Down))
setX();
@@ -495,6 +488,8 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
break;
}
newPosition = blockIt.position() + line.textStart() + line.textLength();
+ if (newPosition >= priv->length())
+ newPosition = priv->length() - 1;
if (line.lineNumber() < layout->lineCount() - 1) {
const QString text = blockIt.text();
// ###### this relies on spaces being the cause for linebreaks.