|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 #ifndef nsILineIterator_h___ |
|
6 #define nsILineIterator_h___ |
|
7 |
|
8 #include "nscore.h" |
|
9 #include "nsCoord.h" |
|
10 |
|
11 class nsIFrame; |
|
12 struct nsRect; |
|
13 |
|
14 // Line Flags (see GetLine below) |
|
15 |
|
16 // This bit is set when the line is wrapping up a block frame. When |
|
17 // clear, it means that the line contains inline elements. |
|
18 #define NS_LINE_FLAG_IS_BLOCK 0x1 |
|
19 |
|
20 // This bit is set when the line ends in some sort of break. |
|
21 #define NS_LINE_FLAG_ENDS_IN_BREAK 0x4 |
|
22 |
|
23 /** |
|
24 * Line iterator API. |
|
25 * |
|
26 * Lines are numbered from 0 to N, where 0 is the top line and N is |
|
27 * the bottom line. |
|
28 * |
|
29 * Obtain this interface from frames via nsIFrame::GetLineIterator. |
|
30 * When you are finished using the iterator, call DisposeLineIterator() |
|
31 * to destroy the iterator if appropriate. |
|
32 */ |
|
33 class nsILineIterator |
|
34 { |
|
35 protected: |
|
36 ~nsILineIterator() { } |
|
37 |
|
38 public: |
|
39 virtual void DisposeLineIterator() = 0; |
|
40 |
|
41 /** |
|
42 * The number of lines in the block |
|
43 */ |
|
44 virtual int32_t GetNumLines() = 0; |
|
45 |
|
46 /** |
|
47 * The prevailing direction of lines. |
|
48 * |
|
49 * @return true if the CSS direction property for the block is |
|
50 * "rtl", otherwise false |
|
51 */ |
|
52 virtual bool GetDirection() = 0; |
|
53 |
|
54 // Return structural information about a line. aFirstFrameOnLine is |
|
55 // the first frame on the line and aNumFramesOnLine is the number of |
|
56 // frames that are on the line. If the line-number is invalid then |
|
57 // aFirstFrameOnLine will be nullptr and aNumFramesOnLine will be |
|
58 // zero. |
|
59 // |
|
60 // For valid line numbers, aLineBounds is set to the bounding box of |
|
61 // the line (which is based on the in-flow position of the frames on |
|
62 // the line; if a frame was moved because of relative positioning |
|
63 // then its coordinates may be outside the line bounds). |
|
64 // |
|
65 // In addition, aLineFlags will contain flag information about the |
|
66 // line. |
|
67 NS_IMETHOD GetLine(int32_t aLineNumber, |
|
68 nsIFrame** aFirstFrameOnLine, |
|
69 int32_t* aNumFramesOnLine, |
|
70 nsRect& aLineBounds, |
|
71 uint32_t* aLineFlags) = 0; |
|
72 |
|
73 /** |
|
74 * Given a frame that's a child of the block, find which line its on |
|
75 * and return that line index, as long as it's at least as big as |
|
76 * aStartLine. Returns -1 if the frame cannot be found on lines |
|
77 * starting with aStartLine. |
|
78 */ |
|
79 virtual int32_t FindLineContaining(nsIFrame* aFrame, |
|
80 int32_t aStartLine = 0) = 0; |
|
81 |
|
82 // Given a line number and an X coordinate, find the frame on the |
|
83 // line that is nearest to the X coordinate. The |
|
84 // aXIsBeforeFirstFrame and aXIsAfterLastFrame flags are updated |
|
85 // appropriately. |
|
86 NS_IMETHOD FindFrameAt(int32_t aLineNumber, |
|
87 nscoord aX, |
|
88 nsIFrame** aFrameFound, |
|
89 bool* aXIsBeforeFirstFrame, |
|
90 bool* aXIsAfterLastFrame) = 0; |
|
91 |
|
92 // Give the line iterator implementor a chance todo something more complicated than |
|
93 // nsIFrame::GetNextSibling() |
|
94 NS_IMETHOD GetNextSiblingOnLine(nsIFrame*& aFrame, int32_t aLineNumber) = 0; |
|
95 |
|
96 // Check whether visual and logical order of frames within a line are identical. |
|
97 // If not, return the first and last visual frames |
|
98 NS_IMETHOD CheckLineOrder(int32_t aLine, |
|
99 bool *aIsReordered, |
|
100 nsIFrame **aFirstVisual, |
|
101 nsIFrame **aLastVisual) = 0; |
|
102 }; |
|
103 |
|
104 class nsAutoLineIterator |
|
105 { |
|
106 public: |
|
107 nsAutoLineIterator() : mRawPtr(nullptr) { } |
|
108 nsAutoLineIterator(nsILineIterator *i) : mRawPtr(i) { } |
|
109 |
|
110 ~nsAutoLineIterator() { |
|
111 if (mRawPtr) |
|
112 mRawPtr->DisposeLineIterator(); |
|
113 } |
|
114 |
|
115 operator nsILineIterator*() { return mRawPtr; } |
|
116 nsILineIterator* operator->() { return mRawPtr; } |
|
117 |
|
118 nsILineIterator* operator=(nsILineIterator* i) { |
|
119 if (i == mRawPtr) |
|
120 return i; |
|
121 |
|
122 if (mRawPtr) |
|
123 mRawPtr->DisposeLineIterator(); |
|
124 |
|
125 mRawPtr = i; |
|
126 return i; |
|
127 } |
|
128 |
|
129 private: |
|
130 nsILineIterator* mRawPtr; |
|
131 }; |
|
132 |
|
133 #endif /* nsILineIterator_h___ */ |