/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This program 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, version 2.1 of the License.
*
* This program 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 program.  If not,
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
*
* Description:
*
*/
#ifndef GWebContentViewJSObject_H_
#define GWebContentViewJSObject_H_

#include <QObject>
#include "controllableviewimpl.h"
#include "GWebContentView.h"
#include "GSuperWebPage.h"

class WebViewEventContext;

namespace GVA {

/*! \ingroup JavascriptAPI
  \brief This class provides the javascript API for GWebContentView.
 */
class GWebContentViewJSObject : public ::ControllableViewJSObject {
    Q_OBJECT
  public:
    GWebContentViewJSObject(GWebContentView *contentView, ::QWebFrame *chromeFrame, const QString &objectName)
      : ::ControllableViewJSObject(contentView, chromeFrame, objectName)
    {
      //qDebug() << "GWebContentViewJSObject::GWebContentViewJSObject: " << this;
    }

    qreal getZoomFactor() const { return webContentViewConst()->getZoomFactor(); }
    void setZoomFactor(qreal factor)  { webContentView()->setZoomFactor(factor); }
    Q_PROPERTY(qreal zoomFactor READ getZoomFactor WRITE setZoomFactor)

    Q_PROPERTY(QObjectList superPages READ getSuperPages)
    QObjectList getSuperPages() { return webContentView()->getSuperPages(); }

    /*! This property holds whether touch navigation is enabled.
     */
    Q_PROPERTY(bool gesturesEnabled READ getGesturesEnabled WRITE setGesturesEnabled)
    bool getGesturesEnabled() const
    {
        return webContentViewConst()->gesturesEnabled();
    }

    void setGesturesEnabled(bool value)
    {
        webContentView()->setGesturesEnabled(value);
    }

    Q_PROPERTY(bool enabled WRITE setEnabled READ enabled)
    bool enabled() const { return webContentViewConst()->enabled(); }
    void setEnabled(bool value) { webContentView()->setEnabled(value); }

public slots:
    void loadUrlToCurrentPage(const QString & url)
        { webContentView()->loadUrlToCurrentPage(url); }
    QObject *currentPage() { return webContentView()->currentPage(); }
    void back() { webContentView()->back(); }
    void forward() { webContentView()->forward(); }
    void reload() { webContentView()->reload(); }
#ifndef BEDROCK_TILED_BACKING_STORE
    void zoomIn(qreal deltaPercent = 0.1) { webContentView()->zoomIn(deltaPercent); }
    void zoomOut(qreal deltaPercent = 0.1) { webContentView()->zoomOut(deltaPercent); }
    void zoomBy(qreal delta) { zoomIn(delta); }
#endif	
    void zoom(bool in) { webContentView()->zoom(in); }
    void toggleZoom() { webContentView()->toggleZoom(); }
    void stopZoom() { webContentView()->stopZoom(); }
    void scrollBy(int deltaX, int deltaY) { webContentView()->scrollBy(deltaX, deltaY); }
    void scrollTo(int x, int y) { webContentView()->scrollTo(x, y); }
    int scrollX() { return webContentView()->scrollX(); }
    int scrollY() { return webContentView()->scrollY(); }
    int contentWidth() { return webContentView()->contentWidth(); }
    int contentHeight() { return webContentView()->contentHeight(); }
    void showNormalPage() { return webContentView()->showNormalPage(); }
    bool currentPageIsSuperPage() { return webContentView()->currentPageIsSuperPage(); }
    void dump() { return webContentView()->dump(); }
    bool frozen() const { return webContentViewConst()->frozen(); }
    void freeze() { return webContentView()->freeze(); }
    void unfreeze() { return webContentView()->unfreeze(); }

    // Super page slots.
    QObject * createSuperPage(const QString &name, bool persist=false) { return webContentView()->createSuperPage(name, persist); }
    void destroySuperPage(const QString &name) { webContentView()->destroySuperPage(name); }
    void setCurrentSuperPage(const QString &name) { webContentView()->setCurrentSuperPage(name); }
    QObject * currentSuperPage() { return webContentView()->currentSuperPage(); }
    QString currentSuperPageName() { return webContentView()->currentSuperPage()->objectName(); }
    void showSuperPage(const QString &name) { webContentView()->showSuperPage(name); }
    QObject * superPage(const QString &name) { return webContentView()->superPage(name); }
    bool isSuperPage(const QString &name) { return webContentView()->isSuperPage(name); }

    bool bedrockTiledBackingStoreEnabled() 
    {
#ifdef BEDROCK_TILED_BACKING_STORE
        return true;
#else
        return false;
#endif
    }
#ifndef BEDROCK_TILED_BACKING_STORE
    void setSavedZoomValueInView(qreal zoomValue){ webContentView()->setSavedZoomValueInView(zoomValue); }
#endif

signals:
    void ContextChanged();
    void iconChanged();
    void loadFinished(bool ok);
    void loadProgress(int progress);
    void loadStarted();
    void titleChanged(const QString & title);
    void urlChanged(const QString & url);
    void secureConnection(bool secure);
    void backEnabled(bool enabled);
    void forwardEnabled(bool enabled);
    void onStatusBarMessage( const QString & text );
    void onStatusBarVisibilityChangeRequested(bool visible);
    void startingPanGesture(int directionHint);

    // Sent when the display mode changes from landscape to protrait or vice versa.
    void onDisplayModeChanged(const QString &orientation);

    void contextEvent(QObject *context);
    
    /// Sent when a superpage is shown.
	  void superPageShown(const QString &name);
	  /// Send when the normal content page is shown, ie. switching away from a super-page.
	  void normalPageShown();
    

private slots:
    void statusBarMessage( const QString & text );
    void statusBarVisibilityChangeRequested(bool visible);
    void onContextEvent(::WebViewEventContext *context);

protected:
    GWebContentView *webContentView() { return static_cast<GWebContentView *>(m_contentView); }
    GWebContentView *webContentViewConst() const { return static_cast<GWebContentView *>(m_contentView); }
};

}

#endif /* GWebContentViewJSObject_H_ */
