[iOS] Refactor some logic for inserting pasted or dropped virtual card files as attac...
[WebKit-https.git] / Source / WebCore / editing / VisibleUnits.h
1 /*
2  * Copyright (C) 2004 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include "EditingBoundary.h"
29 #include "VisibleSelection.h"
30
31 namespace WebCore {
32
33 class Node;
34 class VisiblePosition;
35 class SimplifiedBackwardsTextIterator;
36 class TextIterator;
37
38 enum EWordSide { RightWordIfOnBoundary = false, LeftWordIfOnBoundary = true };
39
40 // words
41 WEBCORE_EXPORT VisiblePosition startOfWord(const VisiblePosition &, EWordSide = RightWordIfOnBoundary);
42 WEBCORE_EXPORT VisiblePosition endOfWord(const VisiblePosition &, EWordSide = RightWordIfOnBoundary);
43 WEBCORE_EXPORT VisiblePosition previousWordPosition(const VisiblePosition &);
44 WEBCORE_EXPORT VisiblePosition nextWordPosition(const VisiblePosition &);
45 VisiblePosition rightWordPosition(const VisiblePosition&, bool skipsSpaceWhenMovingRight);
46 VisiblePosition leftWordPosition(const VisiblePosition&, bool skipsSpaceWhenMovingRight);
47 bool isStartOfWord(const VisiblePosition&);
48
49 // sentences
50 WEBCORE_EXPORT VisiblePosition startOfSentence(const VisiblePosition &);
51 WEBCORE_EXPORT VisiblePosition endOfSentence(const VisiblePosition &);
52 WEBCORE_EXPORT VisiblePosition previousSentencePosition(const VisiblePosition &);
53 WEBCORE_EXPORT VisiblePosition nextSentencePosition(const VisiblePosition &);
54
55 // lines
56 WEBCORE_EXPORT VisiblePosition startOfLine(const VisiblePosition &);
57 WEBCORE_EXPORT VisiblePosition endOfLine(const VisiblePosition &);
58 WEBCORE_EXPORT VisiblePosition previousLinePosition(const VisiblePosition&, int lineDirectionPoint, EditableType = ContentIsEditable);
59 WEBCORE_EXPORT VisiblePosition nextLinePosition(const VisiblePosition&, int lineDirectionPoint, EditableType = ContentIsEditable);
60 WEBCORE_EXPORT bool inSameLine(const VisiblePosition &, const VisiblePosition &);
61 WEBCORE_EXPORT bool isStartOfLine(const VisiblePosition &);
62 WEBCORE_EXPORT bool isEndOfLine(const VisiblePosition &);
63 VisiblePosition logicalStartOfLine(const VisiblePosition &, bool* reachedBoundary = nullptr);
64 VisiblePosition logicalEndOfLine(const VisiblePosition &, bool* reachedBoundary = nullptr);
65 bool isLogicalEndOfLine(const VisiblePosition &);
66 VisiblePosition leftBoundaryOfLine(const VisiblePosition&, TextDirection, bool* reachedBoundary);
67 VisiblePosition rightBoundaryOfLine(const VisiblePosition&, TextDirection, bool* reachedBoundary);
68
69 // paragraphs (perhaps a misnomer, can be divided by line break elements)
70 WEBCORE_EXPORT VisiblePosition startOfParagraph(const VisiblePosition&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
71 WEBCORE_EXPORT VisiblePosition endOfParagraph(const VisiblePosition&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
72 VisiblePosition startOfNextParagraph(const VisiblePosition&);
73 WEBCORE_EXPORT VisiblePosition previousParagraphPosition(const VisiblePosition &, int x);
74 WEBCORE_EXPORT VisiblePosition nextParagraphPosition(const VisiblePosition &, int x);
75 WEBCORE_EXPORT bool isStartOfParagraph(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
76 WEBCORE_EXPORT bool isEndOfParagraph(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
77 bool inSameParagraph(const VisiblePosition &, const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
78 bool isBlankParagraph(const VisiblePosition &);
79
80 // blocks (true paragraphs; line break elements don't break blocks)
81 VisiblePosition startOfBlock(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
82 VisiblePosition endOfBlock(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
83 bool inSameBlock(const VisiblePosition &, const VisiblePosition &);
84 bool isStartOfBlock(const VisiblePosition &);
85 bool isEndOfBlock(const VisiblePosition &);
86
87 // document
88 WEBCORE_EXPORT VisiblePosition startOfDocument(const Node*);
89 WEBCORE_EXPORT VisiblePosition endOfDocument(const Node*);
90 WEBCORE_EXPORT VisiblePosition startOfDocument(const VisiblePosition &);
91 WEBCORE_EXPORT VisiblePosition endOfDocument(const VisiblePosition &);
92 bool inSameDocument(const VisiblePosition &, const VisiblePosition &);
93 WEBCORE_EXPORT bool isStartOfDocument(const VisiblePosition &);
94 WEBCORE_EXPORT bool isEndOfDocument(const VisiblePosition &);
95
96 // editable content
97 WEBCORE_EXPORT VisiblePosition startOfEditableContent(const VisiblePosition&);
98 WEBCORE_EXPORT VisiblePosition endOfEditableContent(const VisiblePosition&);
99 WEBCORE_EXPORT bool isEndOfEditableOrNonEditableContent(const VisiblePosition&);
100
101 WEBCORE_EXPORT bool atBoundaryOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
102 WEBCORE_EXPORT bool withinTextUnitOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
103 WEBCORE_EXPORT VisiblePosition positionOfNextBoundaryOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
104 WEBCORE_EXPORT RefPtr<Range> enclosingTextUnitOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
105 WEBCORE_EXPORT int distanceBetweenPositions(const VisiblePosition&, const VisiblePosition&);
106 WEBCORE_EXPORT RefPtr<Range> wordRangeFromPosition(const VisiblePosition&);
107 WEBCORE_EXPORT VisiblePosition closestWordBoundaryForPosition(const VisiblePosition& position);
108 WEBCORE_EXPORT void charactersAroundPosition(const VisiblePosition&, UChar32& oneAfter, UChar32& oneBefore, UChar32& twoBefore);
109 WEBCORE_EXPORT RefPtr<Range> rangeExpandedAroundPositionByCharacters(const VisiblePosition&, int numberOfCharactersToExpand);
110 WEBCORE_EXPORT RefPtr<Range> rangeExpandedByCharactersInDirectionAtWordBoundary(const VisiblePosition&, int numberOfCharactersToExpand, SelectionDirection);
111
112 // helper function
113 enum BoundarySearchContextAvailability { DontHaveMoreContext, MayHaveMoreContext };
114 typedef unsigned (*BoundarySearchFunction)(StringView, unsigned offset, BoundarySearchContextAvailability, bool& needMoreContext);
115 unsigned startWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
116 unsigned endWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
117 unsigned startSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
118 unsigned endSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
119 unsigned suffixLengthForRange(const Range&, Vector<UChar, 1024>&);
120 unsigned prefixLengthForRange(const Range&, Vector<UChar, 1024>&);
121 unsigned backwardSearchForBoundaryWithTextIterator(SimplifiedBackwardsTextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
122 unsigned forwardSearchForBoundaryWithTextIterator(TextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
123 Node* findStartOfParagraph(Node*, Node*, Node*, int&, Position::AnchorType&, EditingBoundaryCrossingRule);
124 Node* findEndOfParagraph(Node*, Node*, Node*, int&, Position::AnchorType&, EditingBoundaryCrossingRule);
125
126 } // namespace WebCore