1 /*
2 * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 *
19 */
20
21 #ifndef RootInlineBox_h
22 #define RootInlineBox_h
23
24 #include "BidiContext.h"
25 #include "InlineFlowBox.h"
26
27 namespace WebCore {
28
29 class EllipsisBox;
30 class HitTestResult;
31
32 struct BidiStatus;
33 struct GapRects;
34
35 class RootInlineBox : public InlineFlowBox {
36 public:
RootInlineBox(RenderObject * obj)37 RootInlineBox(RenderObject* obj)
38 : InlineFlowBox(obj)
39 , m_lineBreakObj(0)
40 , m_lineBreakPos(0)
41 , m_lineTop(0)
42 , m_lineBottom(0)
43 {
44 }
45
46 virtual void destroy(RenderArena*);
47
isRootInlineBox()48 virtual bool isRootInlineBox() const { return true; }
49
50 void detachEllipsisBox(RenderArena*);
51
nextRootBox()52 RootInlineBox* nextRootBox() const { return static_cast<RootInlineBox*>(m_nextLine); }
prevRootBox()53 RootInlineBox* prevRootBox() const { return static_cast<RootInlineBox*>(m_prevLine); }
54
55 virtual void adjustPosition(int dx, int dy);
56
lineTop()57 int lineTop() const { return m_lineTop; }
lineBottom()58 int lineBottom() const { return m_lineBottom; }
59
60 int selectionTop() const;
selectionBottom()61 int selectionBottom() const { return lineBottom(); }
selectionHeight()62 int selectionHeight() const { return max(0, selectionBottom() - selectionTop()); }
63
64 virtual int verticallyAlignBoxes(int heightOfBlock);
65 void setLineTopBottomPositions(int top, int bottom);
66
67 virtual RenderLineBoxList* rendererLineBoxes() const;
68
69 #if ENABLE(SVG)
computePerCharacterLayoutInformation()70 virtual void computePerCharacterLayoutInformation() { }
71 #endif
72
lineBreakObj()73 RenderObject* lineBreakObj() const { return m_lineBreakObj; }
74 BidiStatus lineBreakBidiStatus() const;
75 void setLineBreakInfo(RenderObject*, unsigned breakPos, const BidiStatus&);
76
lineBreakPos()77 unsigned lineBreakPos() const { return m_lineBreakPos; }
setLineBreakPos(unsigned p)78 void setLineBreakPos(unsigned p) { m_lineBreakPos = p; }
79
blockHeight()80 int blockHeight() const { return m_blockHeight; }
setBlockHeight(int h)81 void setBlockHeight(int h) { m_blockHeight = h; }
82
endsWithBreak()83 bool endsWithBreak() const { return m_endsWithBreak; }
setEndsWithBreak(bool b)84 void setEndsWithBreak(bool b) { m_endsWithBreak = b; }
85
86 void childRemoved(InlineBox* box);
87
88 bool canAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth);
89 void placeEllipsis(const AtomicString& ellipsisStr, bool ltr, int blockLeftEdge, int blockRightEdge, int ellipsisWidth, InlineBox* markupBox = 0);
90 virtual int placeEllipsisBox(bool ltr, int blockLeftEdge, int blockRightEdge, int ellipsisWidth, bool& foundBox);
91
92 EllipsisBox* ellipsisBox() const;
93
94 void paintEllipsisBox(RenderObject::PaintInfo&, int tx, int ty) const;
95 bool hitTestEllipsisBox(HitTestResult&, int x, int y, int tx, int ty, HitTestAction, bool);
96
97 virtual void clearTruncation();
98
99 #if PLATFORM(MAC)
100 void addHighlightOverflow();
101 void paintCustomHighlight(RenderObject::PaintInfo&, int tx, int ty, const AtomicString& highlightType);
102 #endif
103
104 virtual void paint(RenderObject::PaintInfo&, int tx, int ty);
105 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int, int, int, int);
106
hasSelectedChildren()107 bool hasSelectedChildren() const { return m_hasSelectedChildren; }
108 void setHasSelectedChildren(bool);
109
110 virtual RenderObject::SelectionState selectionState();
111 InlineBox* firstSelectedBox();
112 InlineBox* lastSelectedBox();
113
114 GapRects fillLineSelectionGap(int selTop, int selHeight, RenderBlock* rootBlock, int blockX, int blockY,
115 int tx, int ty, const RenderObject::PaintInfo*);
116
117 RenderBlock* block() const;
118
119 InlineBox* closestLeafChildForXPos(int x, bool onlyEditableLeaves = false);
120
floats()121 Vector<RenderBox*>& floats()
122 {
123 ASSERT(!isDirty());
124 if (!m_floats)
125 m_floats.set(new Vector<RenderBox*>());
126 return *m_floats;
127 }
128
floatsPtr()129 Vector<RenderBox*>* floatsPtr() { ASSERT(!isDirty()); return m_floats.get(); }
130
131 virtual void extractLineBoxFromRenderObject();
132 virtual void attachLineBoxToRenderObject();
133 virtual void removeLineBoxFromRenderObject();
134
135 protected:
136 // Where this line ended. The exact object and the position within that object are stored so that
137 // we can create an InlineIterator beginning just after the end of this line.
138 RenderObject* m_lineBreakObj;
139 unsigned m_lineBreakPos;
140 RefPtr<BidiContext> m_lineBreakContext;
141
142 int m_lineTop;
143 int m_lineBottom;
144
145 // Floats hanging off the line are pushed into this vector during layout. It is only
146 // good for as long as the line has not been marked dirty.
147 OwnPtr<Vector<RenderBox*> > m_floats;
148
149 // The height of the block at the end of this line. This is where the next line starts.
150 int m_blockHeight;
151
152 WTF::Unicode::Direction m_lineBreakBidiStatusEor : 5;
153 WTF::Unicode::Direction m_lineBreakBidiStatusLastStrong : 5;
154 WTF::Unicode::Direction m_lineBreakBidiStatusLast : 5;
155 };
156
setLineTopBottomPositions(int top,int bottom)157 inline void RootInlineBox::setLineTopBottomPositions(int top, int bottom)
158 {
159 m_lineTop = top;
160 m_lineBottom = bottom;
161 }
162
163 } // namespace WebCore
164
165 #endif // RootInlineBox_h
166