diff options
Diffstat (limited to 'Source/WebCore/rendering/RootInlineBox.h')
-rw-r--r-- | Source/WebCore/rendering/RootInlineBox.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/RootInlineBox.h b/Source/WebCore/rendering/RootInlineBox.h new file mode 100644 index 0000000..7c4b15c --- /dev/null +++ b/Source/WebCore/rendering/RootInlineBox.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef RootInlineBox_h +#define RootInlineBox_h + +#include "BidiContext.h" +#include "InlineFlowBox.h" + +namespace WebCore { + +class EllipsisBox; +class HitTestResult; + +struct BidiStatus; +struct GapRects; + +class RootInlineBox : public InlineFlowBox { +public: + RootInlineBox(RenderBlock* block); + + virtual void destroy(RenderArena*); + + virtual bool isRootInlineBox() const { return true; } + + void detachEllipsisBox(RenderArena*); + + RootInlineBox* nextRootBox() const { return static_cast<RootInlineBox*>(m_nextLineBox); } + RootInlineBox* prevRootBox() const { return static_cast<RootInlineBox*>(m_prevLineBox); } + + virtual void adjustPosition(int dx, int dy); + + int lineTop() const { return m_lineTop; } + int lineBottom() const { return m_lineBottom; } + + int paginationStrut() const { return m_paginationStrut; } + void setPaginationStrut(int s) { m_paginationStrut = s; } + + int selectionTop() const; + int selectionBottom() const; + int selectionHeight() const { return max(0, selectionBottom() - selectionTop()); } + + int alignBoxesInBlockDirection(int heightOfBlock, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&); + void setLineTopBottomPositions(int top, int bottom); + + virtual RenderLineBoxList* rendererLineBoxes() const; + + RenderObject* lineBreakObj() const { return m_lineBreakObj; } + BidiStatus lineBreakBidiStatus() const; + void setLineBreakInfo(RenderObject*, unsigned breakPos, const BidiStatus&); + + unsigned lineBreakPos() const { return m_lineBreakPos; } + void setLineBreakPos(unsigned p) { m_lineBreakPos = p; } + + int blockLogicalHeight() const { return m_blockLogicalHeight; } + void setBlockLogicalHeight(int h) { m_blockLogicalHeight = h; } + + bool endsWithBreak() const { return m_endsWithBreak; } + void setEndsWithBreak(bool b) { m_endsWithBreak = b; } + + void childRemoved(InlineBox* box); + + bool canAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth); + void placeEllipsis(const AtomicString& ellipsisStr, bool ltr, int blockLeftEdge, int blockRightEdge, int ellipsisWidth, InlineBox* markupBox = 0); + virtual int placeEllipsisBox(bool ltr, int blockLeftEdge, int blockRightEdge, int ellipsisWidth, bool& foundBox); + + EllipsisBox* ellipsisBox() const; + + void paintEllipsisBox(PaintInfo&, int tx, int ty) const; + bool hitTestEllipsisBox(HitTestResult&, int x, int y, int tx, int ty, HitTestAction, bool); + + virtual void clearTruncation(); + + virtual int baselinePosition(FontBaseline baselineType) const { return boxModelObject()->baselinePosition(baselineType, m_firstLine, isHorizontal() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes); } + virtual int lineHeight() const { return boxModelObject()->lineHeight(m_firstLine, isHorizontal() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes); } + +#if PLATFORM(MAC) + void addHighlightOverflow(); + void paintCustomHighlight(PaintInfo&, int tx, int ty, const AtomicString& highlightType); +#endif + + virtual void paint(PaintInfo&, int tx, int ty); + virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int, int, int, int); + + bool hasSelectedChildren() const { return m_hasSelectedChildren; } + void setHasSelectedChildren(bool); + + virtual RenderObject::SelectionState selectionState(); + InlineBox* firstSelectedBox(); + InlineBox* lastSelectedBox(); + + GapRects lineSelectionGap(RenderBlock* rootBlock, const IntPoint& rootBlockPhysicalPosition, const IntSize& offsetFromRootBlock, int selTop, int selHeight, const PaintInfo*); + + RenderBlock* block() const; + + InlineBox* closestLeafChildForLogicalLeftPosition(int, bool onlyEditableLeaves = false); + + Vector<RenderBox*>& floats() + { + ASSERT(!isDirty()); + if (!m_floats) + m_floats= adoptPtr(new Vector<RenderBox*>); + return *m_floats; + } + + Vector<RenderBox*>* floatsPtr() { ASSERT(!isDirty()); return m_floats.get(); } + + virtual void extractLineBoxFromRenderObject(); + virtual void attachLineBoxToRenderObject(); + virtual void removeLineBoxFromRenderObject(); + + FontBaseline baselineType() const { return static_cast<FontBaseline>(m_baselineType); } + + bool hasAnnotationsBefore() const { return m_hasAnnotationsBefore; } + bool hasAnnotationsAfter() const { return m_hasAnnotationsAfter; } + + IntRect paddedLayoutOverflowRect(int endPadding) const; + +private: + bool hasEllipsisBox() const { return m_hasEllipsisBoxOrHyphen; } + void setHasEllipsisBox(bool hasEllipsisBox) { m_hasEllipsisBoxOrHyphen = hasEllipsisBox; } + + int beforeAnnotationsAdjustment() const; + + // Where this line ended. The exact object and the position within that object are stored so that + // we can create an InlineIterator beginning just after the end of this line. + RenderObject* m_lineBreakObj; + unsigned m_lineBreakPos; + RefPtr<BidiContext> m_lineBreakContext; + + int m_lineTop; + int m_lineBottom; + + int m_paginationStrut; + + // Floats hanging off the line are pushed into this vector during layout. It is only + // good for as long as the line has not been marked dirty. + OwnPtr<Vector<RenderBox*> > m_floats; + + // The logical height of the block at the end of this line. This is where the next line starts. + int m_blockLogicalHeight; + + // Whether or not this line uses alphabetic or ideographic baselines by default. + unsigned m_baselineType : 1; // FontBaseline + + // If the line contains any ruby runs, then this will be true. + bool m_hasAnnotationsBefore : 1; + bool m_hasAnnotationsAfter : 1; + + WTF::Unicode::Direction m_lineBreakBidiStatusEor : 5; + WTF::Unicode::Direction m_lineBreakBidiStatusLastStrong : 5; + WTF::Unicode::Direction m_lineBreakBidiStatusLast : 5; +}; + +inline void RootInlineBox::setLineTopBottomPositions(int top, int bottom) +{ + m_lineTop = top; + m_lineBottom = bottom; +} + +} // namespace WebCore + +#endif // RootInlineBox_h |