#ifndef PageClientQt_h
#define PageClientQt_h
#include "FrameView.h"
#include "GraphicsContext.h"
#include "IntRect.h"
#include "QWebPageClient.h"
#include "TiledBackingStore.h"
#include "qgraphicswebview.h"
#include "qwebframe.h"
#include "qwebframe_p.h"
#include "qwebpage.h"
#include "qwebpage_p.h"
#include <QtCore/qmetaobject.h>
#include <QtGui/qgraphicsscene.h>
#include <QtGui/qgraphicsview.h>
#include <QtGui/qgraphicswidget.h>
#include <QtGui/qscrollbar.h>
#include <QtGui/qstyleoption.h>
#include <QtGui/qwidget.h>
#include <Settings.h>
namespace WebCore {
#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
class TextureMapperNodeClientQt {
public:
TextureMapperNodeClientQt(QWebFrame*, GraphicsLayer*);
virtual ~TextureMapperNodeClientQt();
void setTextureMapper(const PassOwnPtr<TextureMapper>&);
void syncRootLayer();
TextureMapperNode* rootNode();
private:
QWebFrame* m_frame;
OwnPtr<GraphicsLayer> m_rootGraphicsLayer;
};
#endif
class PageClientQWidget : public QWebPageClient {
public:
PageClientQWidget(QWidget* newView, QWebPage* newPage)
: view(newView)
, page(newPage)
#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
, syncTimer(this, &PageClientQWidget::syncLayers)
#endif
{
Q_ASSERT(view);
}
virtual ~PageClientQWidget();
virtual bool isQWidgetClient() const { return true; }
virtual void scroll(int dx, int dy, const QRect&);
virtual void update(const QRect& dirtyRect);
virtual void setInputMethodEnabled(bool enable);
virtual bool inputMethodEnabled() const;
virtual void setInputMethodHints(Qt::InputMethodHints hints);
#ifndef QT_NO_CURSOR
virtual QCursor cursor() const;
virtual void updateCursor(const QCursor& cursor);
#endif
virtual QPalette palette() const;
virtual int screenNumber() const;
virtual QWidget* ownerWidget() const;
virtual QRect geometryRelativeToOwnerWidget() const;
virtual QObject* pluginParent() const;
virtual QStyle* style() const;
virtual bool viewResizesToContentsEnabled() const { return false; }
virtual QRectF windowRect() const;
QWidget* view;
QWebPage* page;
#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
virtual void setRootGraphicsLayer(GraphicsLayer*);
virtual void markForSync(bool scheduleSync);
void syncLayers(Timer<PageClientQWidget>*);
#endif
#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
virtual bool allowsAcceleratedCompositing() const { return true; }
#else
virtual bool allowsAcceleratedCompositing() const { return false; }
#endif
#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
Timer<PageClientQWidget> syncTimer;
OwnPtr<TextureMapperNodeClientQt> textureMapperNodeClient;
#endif
};
#if !defined(QT_NO_GRAPHICSVIEW)
class QGraphicsItemOverlay : public QGraphicsObject {
public:
QGraphicsItemOverlay(QGraphicsWidget* view, QWebPage* p)
:QGraphicsObject(view)
, q(view)
, page(p)
{
setPos(0, 0);
setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
setCacheMode(QGraphicsItem::DeviceCoordinateCache);
}
QRectF boundingRect() const
{
return q->boundingRect();
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* options, QWidget*)
{
page->mainFrame()->render(painter, static_cast<QWebFrame::RenderLayer>(QWebFrame::AllLayers&(~QWebFrame::ContentsLayer)), options->exposedRect.toRect());
}
void prepareGraphicsItemGeometryChange()
{
prepareGeometryChange();
}
QGraphicsWidget* q;
QWebPage* page;
};
class PageClientQGraphicsWidget : public QWebPageClient {
public:
PageClientQGraphicsWidget(QGraphicsWebView* newView, QWebPage* newPage)
: view(newView)
, page(newPage)
, viewResizesToContents(false)
#if USE(ACCELERATED_COMPOSITING)
, syncTimer(this, &PageClientQGraphicsWidget::syncLayersTimeout)
, shouldSync(false)
#endif
, overlay(0)
{
Q_ASSERT(view);
#if USE(ACCELERATED_COMPOSITING)
view->setFlag(QGraphicsItem::ItemUsesExtendedStyleOption);
#endif
}
virtual ~PageClientQGraphicsWidget();
virtual bool isQWidgetClient() const { return false; }
virtual void scroll(int dx, int dy, const QRect&);
virtual void update(const QRect& dirtyRect);
virtual void setInputMethodEnabled(bool enable);
virtual bool inputMethodEnabled() const;
virtual void setInputMethodHints(Qt::InputMethodHints hints);
#ifndef QT_NO_CURSOR
virtual QCursor cursor() const;
virtual void updateCursor(const QCursor& cursor);
#endif
virtual QPalette palette() const;
virtual int screenNumber() const;
virtual QWidget* ownerWidget() const;
virtual QRect geometryRelativeToOwnerWidget() const;
virtual QObject* pluginParent() const;
virtual QStyle* style() const;
virtual bool viewResizesToContentsEnabled() const { return viewResizesToContents; }
void createOrDeleteOverlay();
#if ENABLE(TILED_BACKING_STORE)
void updateTiledBackingStoreScale();
virtual QRectF graphicsItemVisibleRect() const;
#endif
#if USE(ACCELERATED_COMPOSITING)
virtual void setRootGraphicsLayer(GraphicsLayer*);
virtual void markForSync(bool scheduleSync);
void syncLayers();
void syncLayersTimeout(Timer<PageClientQGraphicsWidget>*) { syncLayers(); }
virtual bool allowsAcceleratedCompositing() const { return true; }
#endif
virtual QRectF windowRect() const;
QGraphicsWebView* view;
QWebPage* page;
bool viewResizesToContents;
#if USE(ACCELERATED_COMPOSITING)
#if USE(TEXTURE_MAPPER)
OwnPtr<TextureMapperNodeClientQt> textureMapperNodeClient;
#else
QWeakPointer<QGraphicsObject> rootGraphicsLayer;
#endif
Timer<PageClientQGraphicsWidget> syncTimer;
bool shouldSync;
#endif
QGraphicsItemOverlay* overlay;
enum { RootGraphicsLayerZValue, OverlayZValue };
};
#endif // QT_NO_GRAPHICSVIEW
}
#endif // PageClientQt