summaryrefslogtreecommitdiffstats
path: root/khtml/rendering/render_layer.h
diff options
context:
space:
mode:
Diffstat (limited to 'khtml/rendering/render_layer.h')
-rw-r--r--khtml/rendering/render_layer.h342
1 files changed, 342 insertions, 0 deletions
diff --git a/khtml/rendering/render_layer.h b/khtml/rendering/render_layer.h
new file mode 100644
index 000000000..c7587ae39
--- /dev/null
+++ b/khtml/rendering/render_layer.h
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc.
+ *
+ * Portions are Copyright (C) 1998 Netscape Communications Corporation.
+ *
+ * Other contributors:
+ * Robert O'Callahan <roc+@cs.cmu.edu>
+ * David Baron <dbaron@fas.harvard.edu>
+ * Christian Biesinger <cbiesinger@web.de>
+ * Randall Jesup <rjesup@wgate.com>
+ * Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
+ * Josh Soref <timeless@mac.com>
+ * Boris Zbarsky <bzbarsky@mit.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Alternatively, the contents of this file may be used under the terms
+ * of either the Mozilla Public License Version 1.1, found at
+ * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
+ * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
+ * (the "GPL"), in which case the provisions of the MPL or the GPL are
+ * applicable instead of those above. If you wish to allow use of your
+ * version of this file only under the terms of one of those two
+ * licenses (the MPL or the GPL) and not to allow others to use your
+ * version of this file under the LGPL, indicate your decision by
+ * deletingthe provisions above and replace them with the notice and
+ * other provisions required by the MPL or the GPL, as the case may be.
+ * If you do not delete the provisions above, a recipient may use your
+ * version of this file under any of the LGPL, the MPL or the GPL.
+ */
+
+#ifndef render_layer_h
+#define render_layer_h
+
+#include <qcolor.h>
+#include <qrect.h>
+#include <assert.h>
+
+#include "render_object.h"
+
+class QScrollBar;
+template <class T> class QPtrVector;
+
+namespace khtml {
+ class RenderStyle;
+ class RenderTable;
+ class CachedObject;
+ class RenderCanvas;
+ class RenderText;
+ class RenderFrameSet;
+ class RenderObject;
+ class RenderScrollMediator;
+
+class RenderScrollMediator: public QObject
+{
+ Q_OBJECT
+public:
+ RenderScrollMediator(RenderLayer* layer)
+ :m_layer(layer) {}
+
+public slots:
+ void slotValueChanged();
+
+private:
+ RenderLayer* m_layer;
+};
+
+// This class handles the auto-scrolling of layers with overflow: marquee.
+class Marquee: public QObject
+{
+ Q_OBJECT
+
+public:
+ Marquee(RenderLayer* l);
+
+ void timerEvent(QTimerEvent*);
+
+ int speed() const { return m_speed; }
+ int marqueeSpeed() const;
+ EMarqueeDirection direction() const;
+ EMarqueeDirection reverseDirection() const { return static_cast<EMarqueeDirection>(-direction()); }
+ bool isHorizontal() const;
+ bool isUnfurlMarquee() const;
+ int unfurlPos() const { return m_unfurlPos; }
+
+ EWhiteSpace whiteSpace() { return m_whiteSpace; }
+
+ int computePosition(EMarqueeDirection dir, bool stopAtClientEdge);
+
+ void setEnd(int end) { m_end = end; }
+
+ void start();
+ void suspend();
+ void stop();
+
+ void updateMarqueeStyle();
+ void updateMarqueePosition();
+
+private:
+ RenderLayer* m_layer;
+ int m_currentLoop;
+ int m_totalLoops;
+ int m_timerId;
+ int m_start;
+ int m_end;
+ int m_speed;
+ int m_unfurlPos;
+ bool m_reset:1;
+ bool m_suspended:1;
+ bool m_stopped:1;
+ EWhiteSpace m_whiteSpace : 3;
+ EMarqueeDirection m_direction : 4;
+};
+
+class RenderLayer
+{
+public:
+#ifdef APPLE_CHANGES
+ static QScrollBar* gScrollBar;
+#endif
+
+ RenderLayer(RenderObject* object);
+ ~RenderLayer();
+
+ RenderObject* renderer() const { return m_object; }
+ RenderLayer *parent() const { return m_parent; }
+ RenderLayer *previousSibling() const { return m_previous; }
+ RenderLayer *nextSibling() const { return m_next; }
+
+ RenderLayer *firstChild() const { return m_first; }
+ RenderLayer *lastChild() const { return m_last; }
+
+ void addChild(RenderLayer *newChild, RenderLayer* beforeChild = 0);
+ RenderLayer* removeChild(RenderLayer *oldChild);
+
+ void removeOnlyThisLayer();
+ void insertOnlyThisLayer();
+
+ void styleChanged();
+
+ Marquee* marquee() const { return m_marquee; }
+ void suspendMarquees();
+
+ bool isOverflowOnly() const { return m_isOverflowOnly; }
+
+#ifdef APPLE_CHANGES
+ bool isTransparent();
+ RenderLayer* transparentAncestor();
+#endif
+
+ RenderLayer* root() {
+ RenderLayer* curr = this;
+ while (curr->parent()) curr = curr->parent();
+ return curr;
+ }
+
+ int xPos() const { return m_x; }
+ int yPos() const { return m_y; }
+
+ short width() const;
+ int height() const;
+
+ short scrollWidth() const { return m_scrollWidth; }
+ int scrollHeight() const { return m_scrollHeight; }
+
+ void resize( int w, int h ) {
+ m_scrollWidth = w; m_scrollHeight = h;
+ }
+
+ void setPos( int xPos, int yPos ) {
+ m_x = xPos;
+ m_y = yPos;
+ }
+
+ // Scrolling methods for layers that can scroll their overflow.
+ void scrollOffset(int& x, int& y);
+ void subtractScrollOffset(int& x, int& y);
+ void checkInlineRelOffset(const RenderObject* o, int& x, int& y);
+ short scrollXOffset() { return m_scrollX; }
+ int scrollYOffset() { return m_scrollY; }
+ void scrollToOffset(int x, int y, bool updateScrollbars = true, bool repaint = true);
+ void scrollToXOffset(int x) { scrollToOffset(x, m_scrollY); }
+ void scrollToYOffset(int y) { scrollToOffset(m_scrollX, y); }
+ void showScrollbar(Qt::Orientation, bool);
+ QScrollBar* horizontalScrollbar() { return m_hBar; }
+ QScrollBar* verticalScrollbar() { return m_vBar; }
+ int verticalScrollbarWidth();
+ int horizontalScrollbarHeight();
+ void positionScrollbars(const QRect &damageRect);
+ void paintScrollbars(RenderObject::PaintInfo& pI);
+ void checkScrollbarsAfterLayout();
+ void slotValueChanged(int);
+ void repaint(Priority p=NormalPriority, bool markForRepaint = false);
+ void updateScrollPositionFromScrollbars();
+
+ void updateLayerPosition();
+ void updateLayerPositions( RenderLayer* rootLayer, bool doFullRepaint = false, bool checkForRepaint = false);
+
+ // Get the enclosing stacking context for this layer. A stacking context is a layer
+ // that has a non-auto z-index.
+ RenderLayer* stackingContext() const;
+ bool isStackingContext() const { return !hasAutoZIndex() || renderer()->isCanvas(); }
+
+ void dirtyZOrderLists();
+ void updateZOrderLists();
+ QPtrVector<RenderLayer>* posZOrderList() const { return m_posZOrderList; }
+ QPtrVector<RenderLayer>* negZOrderList() const { return m_negZOrderList; }
+
+ void dirtyOverflowList();
+ void updateOverflowList();
+ QValueList<RenderLayer*>* overflowList() const { return m_overflowList; }
+
+ void setHasOverlaidWidgets(bool b=true) { m_hasOverlaidWidgets = b; }
+ bool hasOverlaidWidgets() const { return m_hasOverlaidWidgets; }
+ QRegion getMask() const { return m_region; }
+ QRegion paintedRegion(RenderLayer* rootLayer);
+ void updateWidgetMasks(RenderLayer* rootLayer);
+
+ // Gets the nearest enclosing positioned ancestor layer (also includes
+ // the <html> layer and the root layer).
+ RenderLayer* enclosingPositionedAncestor() const;
+
+ void convertToLayerCoords(const RenderLayer* ancestorLayer, int& x, int& y) const;
+
+ bool hasAutoZIndex() const { return renderer()->style()->hasAutoZIndex(); }
+ int zIndex() const { return renderer()->style()->zIndex(); }
+
+ // The two main functions that use the layer system. The paint method
+ // paints the layers that intersect the damage rect from back to
+ // front. The nodeAtPoint method looks for mouse events by walking
+ // layers that intersect the point from front to back.
+ KDE_EXPORT void paint(QPainter *p, const QRect& damageRect, bool selectionOnly=false);
+ bool nodeAtPoint(RenderObject::NodeInfo& info, int x, int y);
+
+ // This method figures out our layerBounds in coordinates relative to
+ // |rootLayer}. It also computes our background and foreground clip rects
+ // for painting/event handling.
+ void calculateRects(const RenderLayer* rootLayer, const QRect& paintDirtyRect, QRect& layerBounds,
+ QRect& backgroundRect, QRect& foregroundRect);
+ void calculateClipRects(const RenderLayer* rootLayer, QRect& overflowClipRect,
+ QRect& posClipRect, QRect& fixedClipRect);
+
+ bool intersectsDamageRect(const QRect& layerBounds, const QRect& damageRect) const;
+ bool containsPoint(int x, int y, const QRect& damageRect) const;
+
+ void updateHoverActiveState(RenderObject::NodeInfo& info);
+
+ void detach(RenderArena* renderArena);
+
+#ifdef ENABLE_DUMP
+ KDE_EXPORT void dump(QTextStream &stream, const QString &ind = QString::null);
+#endif
+
+ // Overloaded new operator. Derived classes must override operator new
+ // in order to allocate out of the RenderArena.
+ void* operator new(size_t sz, RenderArena* renderArena) throw();
+
+ // Overridden to prevent the normal delete from being called.
+ void operator delete(void* ptr, size_t sz);
+
+private:
+ // The normal operator new is disallowed on all render objects.
+ void* operator new(size_t sz) throw();
+
+private:
+ void setNextSibling(RenderLayer* next) { m_next = next; }
+ void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
+ void setParent(RenderLayer* parent) { m_parent = parent; }
+ void setFirstChild(RenderLayer* first) { m_first = first; }
+ void setLastChild(RenderLayer* last) { m_last = last; }
+
+ void collectLayers(QPtrVector<RenderLayer>*&, QPtrVector<RenderLayer>*&);
+
+ KDE_EXPORT void paintLayer(RenderLayer* rootLayer, QPainter *p, const QRect& paintDirtyRect, bool selectionOnly=false);
+ RenderLayer* nodeAtPointForLayer(RenderLayer* rootLayer, RenderObject::NodeInfo& info,
+ int x, int y, const QRect& hitTestRect);
+ bool shouldBeOverflowOnly() const;
+
+protected:
+ RenderObject* m_object;
+
+ RenderLayer* m_parent;
+ RenderLayer* m_previous;
+ RenderLayer* m_next;
+
+ RenderLayer* m_first;
+ RenderLayer* m_last;
+
+ // Our (x,y) coordinates are in our parent layer's coordinate space.
+ short m_x;
+ int m_y;
+
+ // Our scroll offsets if the view is scrolled.
+ short m_scrollX;
+ int m_scrollY;
+
+ // The width/height of our scrolled area.
+ short m_scrollWidth;
+ int m_scrollHeight;
+
+ // For layers with overflow, we have a pair of scrollbars.
+ QScrollBar* m_hBar;
+ QScrollBar* m_vBar;
+ RenderScrollMediator* m_scrollMediator;
+
+ // For layers that establish stacking contexts, m_posZOrderList holds a sorted list of all the
+ // descendant layers within the stacking context that have z-indices of 0 or greater
+ // (auto will count as 0). m_negZOrderList holds descendants within our stacking context with negative
+ // z-indices.
+ QPtrVector<RenderLayer>* m_posZOrderList;
+ QPtrVector<RenderLayer>* m_negZOrderList;
+
+ // This list contains our overflow child layers.
+ QValueList<RenderLayer*>* m_overflowList;
+
+ bool m_zOrderListsDirty: 1;
+ bool m_overflowListDirty: 1;
+ bool m_isOverflowOnly: 1;
+ bool m_markedForRepaint: 1;
+ bool m_hasOverlaidWidgets: 1;
+
+ QRect m_visibleRect;
+
+ QRegion m_region; // used by overlaid (non z-order aware) widgets
+
+ Marquee* m_marquee; // Used by layers with overflow:marquee
+};
+
+} // namespace
+#endif