#ifndef RENDER_BLOCK_H
#define RENDER_BLOCK_H
#include <qptrlist.h>
#include "render_flow.h"
namespace khtml {
class RenderBlock : public RenderFlow
{
public:
RenderBlock(DOM::NodeImpl* node);
virtual ~RenderBlock();
virtual const char *renderName() const;
virtual short lineHeight(bool b, bool isRootLineBox=false) const;
virtual short baselinePosition(bool b, bool isRootLineBox=false) const;
virtual bool isRenderBlock() const { return true; }
virtual bool isBlockFlow() const { return (!isInline() || isReplaced()) && !isTable(); }
virtual bool isInlineFlow() const { return isInline() && !isReplaced(); }
virtual bool isInlineBlockOrInlineTable() const { return isInline() && isReplaced(); }
virtual bool childrenInline() const { return m_childrenInline; }
virtual void setChildrenInline(bool b) { m_childrenInline = b; }
void makeChildrenNonInline(RenderObject* insertionPoint = 0);
virtual int overflowHeight(bool includeInterior=true) const
{ return (!includeInterior && style()->hidesOverflow()) ? m_height : m_overflowHeight; }
virtual int overflowWidth(bool includeInterior=true) const
{ return (!includeInterior && style()->hidesOverflow()) ? m_width : m_overflowWidth; }
virtual void setOverflowHeight(int h) { m_overflowHeight = h; }
virtual void setOverflowWidth(int w) { m_overflowWidth = w; }
virtual bool isSelfCollapsingBlock() const;
virtual bool isTopMarginQuirk() const { return m_topMarginQuirk; }
virtual bool isBottomMarginQuirk() const { return m_bottomMarginQuirk; }
virtual short maxTopMargin(bool positive) const {
if (positive)
return m_maxTopPosMargin;
else
return m_maxTopNegMargin;
}
virtual short maxBottomMargin(bool positive) const {
if (positive)
return m_maxBottomPosMargin;
else
return m_maxBottomNegMargin;
}
void initMaxMarginValues() {
if (m_marginTop >= 0)
m_maxTopPosMargin = m_marginTop;
else
m_maxTopNegMargin = -m_marginTop;
if (m_marginBottom >= 0)
m_maxBottomPosMargin = m_marginBottom;
else
m_maxBottomNegMargin = -m_marginBottom;
}
virtual void addChildToFlow(RenderObject* newChild, RenderObject* beforeChild);
virtual void removeChild(RenderObject *oldChild);
#ifdef INCREMENTAL_REPAINTING
virtual void repaintObjectsBeforeLayout();
virtual void repaintFloatingDescendants();
virtual void getAbsoluteRepaintRectIncludingFloats(QRect& bounds, QRect& fullBounds);
#endif
virtual void setStyle(RenderStyle* _style);
virtual void layout();
virtual void layoutBlock( bool relayoutChildren );
void layoutBlockChildren( bool relayoutChildren );
void layoutInlineChildren( bool relayoutChildren );
void layoutPositionedObjects( bool relayoutChildren );
void insertPositionedObject(RenderObject *o);
void removePositionedObject(RenderObject *o);
virtual RenderObject* layoutLegend(bool relayoutChildren) { return 0; };
void bidiReorderLine(const BidiIterator &start, const BidiIterator &end, BidiState &bidi );
BidiIterator findNextLineBreak(BidiIterator &start, BidiState &info );
InlineFlowBox* constructLine(const BidiIterator& start, const BidiIterator& end);
InlineFlowBox* createLineBoxes(RenderObject* obj);
void computeHorizontalPositionsForLine(InlineFlowBox* lineBox, BidiState &bidi);
void computeVerticalPositionsForLine(InlineFlowBox* lineBox);
virtual void paint(QPainter *, int x, int y, int w, int h,
int tx, int ty, PaintAction paintAction);
virtual void paintObject(QPainter *, int x, int y, int w, int h,
int tx, int ty, PaintAction paintAction);
void paintFloats(QPainter *p, int _x, int _y,
int _w, int _h, int _tx, int _ty, bool paintSelection = false);
void insertFloatingObject(RenderObject *o);
void removeFloatingObject(RenderObject *o);
void positionNewFloats();
void clearFloats();
int getClearDelta(RenderObject *child);
virtual void markAllDescendantsWithFloatsForLayout(RenderObject* floatToRemove = 0);
virtual bool containsFloats() { return m_floatingObjects!=0; }
virtual bool containsFloat(RenderObject* o);
virtual bool hasOverhangingFloats() { return floatBottom() > m_height; }
void addOverHangingFloats( RenderBlock *block, int xoffset, int yoffset, bool child = false );
int nearestFloatBottom(int height) const;
int floatBottom() const;
inline int leftBottom();
inline int rightBottom();
virtual unsigned short lineWidth(int y) const;
virtual int lowestPosition(bool includeOverflowInterior=true, bool includeSelf=true) const;
virtual int rightmostPosition(bool includeOverflowInterior=true, bool includeSelf=true) const;
virtual int leftmostPosition(bool includeOverflowInterior=true, bool includeSelf=true) const;
int rightOffset() const;
int rightRelOffset(int y, int fixedOffset, bool applyTextIndent = true,
int *heightRemaining = 0) const;
int rightOffset(int y) const { return rightRelOffset(y, rightOffset(), true); }
int leftOffset() const;
int leftRelOffset(int y, int fixedOffset, bool applyTextIndent = true,
int *heightRemaining = 0) const;
int leftOffset(int y) const { return leftRelOffset(y, leftOffset(), true); }
virtual bool nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty,
HitTestAction hitTestAction = HitTestAll, bool inside=false);
bool isPointInScrollbar(int x, int y, int tx, int ty);
virtual void calcMinMaxWidth();
void calcInlineMinMaxWidth();
void calcBlockMinMaxWidth();
virtual int getBaselineOfFirstLineBox();
virtual InlineFlowBox* getFirstLineBox();
virtual bool requiresLayer();
virtual RenderBlock* firstLineBlock() const;
virtual void updateFirstLetter();
bool inRootBlockContext() const;
#ifndef NDEBUG
virtual void printTree(int indent=0) const;
virtual void dump(QTextStream *stream, QString ind = "") const;
#endif
protected:
void newLine();
protected:
struct FloatingObject {
enum Type {
FloatLeft,
FloatRight
};
FloatingObject(Type _type) {
node = 0;
startY = 0;
endY = 0;
type = _type;
left = 0;
width = 0;
noPaint = false;
}
RenderObject* node;
int startY;
int endY;
short left;
short width;
Type type : 1; bool noPaint : 1;
};
protected:
QPtrList<FloatingObject>* m_floatingObjects;
QPtrList<RenderObject>* m_positionedObjects;
bool m_childrenInline : 1;
bool m_pre : 1;
bool m_firstLine : 1; EClear m_clearStatus : 2; bool m_topMarginQuirk : 1;
bool m_bottomMarginQuirk : 1;
short m_maxTopPosMargin;
short m_maxTopNegMargin;
short m_maxBottomPosMargin;
short m_maxBottomNegMargin;
int m_overflowHeight;
int m_overflowWidth;
};
};
#endif // RENDER_BLOCK_H