Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(927)

Unified Diff: Source/core/editing/GranularityStrategy.h

Issue 1123563003: Improving direction-based selection strategy. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Addressing rotated text + comment cleanup Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/editing/FrameSelectionTest.cpp ('k') | Source/core/editing/GranularityStrategy.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/editing/GranularityStrategy.h
diff --git a/Source/core/editing/GranularityStrategy.h b/Source/core/editing/GranularityStrategy.h
index 9d31bc84eb0ad41f48f7a04ea2fa49f2e994b75c..50c2ff09b878c988afdfa4f20696eae641496742 100644
--- a/Source/core/editing/GranularityStrategy.h
+++ b/Source/core/editing/GranularityStrategy.h
@@ -16,9 +16,9 @@ public:
virtual SelectionStrategy GetType() const = 0;
virtual void Clear() = 0;
- // Calculates and returns the new selection based on the updated user
- // selection extent |extentPosition| and the granularity strategy.
- virtual VisibleSelection updateExtent(const VisiblePosition& extentPosition, const VisibleSelection&) = 0;
+ // Calculates and returns the new selection based on the updated extent
+ // location in contents-space coordinates.
+ virtual VisibleSelection updateExtent(const IntPoint&, LocalFrame*) = 0;
protected:
GranularityStrategy();
@@ -33,13 +33,41 @@ public:
// GranularityStrategy:
SelectionStrategy GetType() const final;
void Clear() final;
- VisibleSelection updateExtent(const VisiblePosition& extentPosition, const VisibleSelection&) final;
+ VisibleSelection updateExtent(const IntPoint&, LocalFrame*) final;
};
// "Expand by word, shrink by character" selection strategy.
// Uses character granularity when selection is shrinking. If the selection is
// expanding, granularity doesn't change until a word boundary is passed, after
// which the granularity switches to "word".
+// In word granularity, the word is not selected until the extent passes the
+// middle of the word. If the selection is shrunk when there is a distance
+// between the extent and the selection end on extent's side of the base, then
+// this distance is applied to the extent as an offset for the purpose of
+// determining the selection bound. This prevents the selection edge from
+// "jumping" back to extent position when it is shrunk after extending. This
+// offset can be reduced or set to 0 if the extent is moved in the opposite
+// direction.
+//
+// Example:
+// ^ marks base, | marks extent passed in updateExtent, > marks selection end:
+// Lorem ip^sum|> dolor sit amet, consectetur
+//
+// Move extent over the middle of "dolor", granularity should change to word
+// granularity and the selection end should jump to the end of the word.
+// Lorem ip^sum dolo|r> sit amet, consectetur
+//
+// Move extent back one character. Granularity changes to "character". The
+// selection end should move back one character as well. Note an offset between
+// the extent and the selection end.
+// Lorem ip^sum dol|o>r sit amet, consectetur
+//
+// Move extent forward one character. The offset is reduced to 0. Selection end
+// doesn't change.
+// Lorem ip^sum dolo|>r sit amet, consectetur
+//
+// Move forward one character. End moves with extent in character granularity.
+// Lorem ip^sum dolor|> sit amet, consectetur
class DirectionGranularityStrategy final : public GranularityStrategy {
public:
DirectionGranularityStrategy();
@@ -48,23 +76,47 @@ public:
// GranularityStrategy:
SelectionStrategy GetType() const final;
void Clear() final;
- VisibleSelection updateExtent(const VisiblePosition&, const VisibleSelection&) final;
+ VisibleSelection updateExtent(const IntPoint&, LocalFrame*) final;
private:
+ enum class StrategyState {
+ // Starting state.
+ // Selection was cleared and there were no extent updates since then.
+ // One an update is performed, the strategy goes into the Expanding
+ // state unless the upate shrinks the selection without changing
+ // relative base/extent order, in which case the strategy goes into the
+ // Shrinking state.
+ Cleared,
+ // Last time the selection was changed by updateExtent - it was expanded
+ // or the relative base/extent order was changed.
+ Expanding,
+ // Last time the selection was changed by updateExtent - it was shrunk
+ // (without changing relative base/extent order).
+ Shrinking
+ };
enum class BoundAdjust {CurrentPosIfOnBound, NextBoundIfOnBound};
enum class SearchDirection {SearchBackwards, SearchForward};
+ // Returns true if the two supplied positions are in the order defined by
+ // the int parameter:
leviw_travelin_and_unemployed 2015/05/20 22:01:01 This isn't exactly what I meant. I'd probably go
mfomitchev 2015/05/25 23:05:51 Done.
+ // - For int > 0 returns true if the first position is after the second one.
+ // - For int < 0 returns true if the first position is before the second one.
+ // - For int == 0 returns true if the first position is equal to the second one.
+ bool arePositionsInOrder(const VisiblePosition&, const VisiblePosition&, int);
+
// Returns the next word boundary starting from |pos|. |direction| specifies
// the direction in which to search for the next bound. nextIfOnBound
// controls whether |pos| or the next boundary is returned when |pos| is
// located exactly on word boundary.
VisiblePosition nextWordBound(const VisiblePosition& /*pos*/, SearchDirection /*direction*/, BoundAdjust /*nextIfOnBound*/);
+ StrategyState m_state;
// Current selection granularity being used
TextGranularity m_granularity;
- // Set to true if the selection was shrunk (without changing relative
- // base/extent order) as a result of the most recent updateExtent call.
- bool m_lastMoveShrunkSelection;
+ // Coordinates of the previous extent in contents-space.
+ IntPoint m_extentPoint;
+ // Offset applied to the extent.
+ int m_offset;
};
} // namespace blink
« no previous file with comments | « Source/core/editing/FrameSelectionTest.cpp ('k') | Source/core/editing/GranularityStrategy.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698