/*
 * Copyright (C) 2012 Samsung Electronics
 * Copyright (C) 2013 Intel Corporation. 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 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this program; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include "config.h"
#if USE(COORDINATED_GRAPHICS)

#include "WKView.h"

#include "APIPageConfiguration.h"
#include "WKAPICast.h"
#include "WebView.h"

using namespace WebCore;
using namespace WebKit;

WKViewRef WKViewCreate(WKContextRef context, WKPageConfigurationRef pageConfiguration)
{
    RefPtr<WebView> webView = WebView::create(toImpl(context), *toImpl(pageConfiguration));
    return toAPI(webView.release().leakRef());
}

WKSize WKViewGetSize(WKViewRef viewRef)
{
    return toAPI(toImpl(viewRef)->size());
}

void WKViewSetSize(WKViewRef viewRef, WKSize size)
{
    toImpl(viewRef)->setSize(toIntSize(size));
}

void WKViewSetViewClient(WKViewRef viewRef, const WKViewClientBase* client)
{
    toImpl(viewRef)->initializeClient(client);
}

bool WKViewIsActive(WKViewRef viewRef)
{
    return toImpl(viewRef)->isActive();
}

void WKViewSetIsActive(WKViewRef viewRef, bool isActive)
{
    toImpl(viewRef)->setActive(isActive);
}

bool WKViewIsFocused(WKViewRef viewRef)
{
    return toImpl(viewRef)->isFocused();
}

void WKViewSetIsFocused(WKViewRef viewRef, bool isFocused)
{
    toImpl(viewRef)->setFocused(isFocused);
}

bool WKViewIsVisible(WKViewRef viewRef)
{
    return toImpl(viewRef)->isVisible();
}

void WKViewSetIsVisible(WKViewRef viewRef, bool isVisible)
{
    toImpl(viewRef)->setVisible(isVisible);
}

float WKViewGetContentScaleFactor(WKViewRef viewRef)
{
    return toImpl(viewRef)->contentScaleFactor();
}

void WKViewSetContentScaleFactor(WKViewRef viewRef, float scale)
{
    toImpl(viewRef)->setContentScaleFactor(scale);
}

WKPoint WKViewGetContentPosition(WKViewRef viewRef)
{
    const WebCore::FloatPoint& result = toImpl(viewRef)->contentPosition();
    return WKPointMake(result.x(), result.y());
}

void WKViewSetContentPosition(WKViewRef viewRef, WKPoint position)
{
    toImpl(viewRef)->setContentPosition(WebCore::FloatPoint(position.x, position.y));
}

void WKViewSetUserViewportTranslation(WKViewRef viewRef, double tx, double ty)
{
    toImpl(viewRef)->setUserViewportTranslation(tx, ty);
}

WKPoint WKViewUserViewportToContents(WKViewRef viewRef, WKPoint point)
{
    const WebCore::IntPoint& result = toImpl(viewRef)->userViewportToContents(toIntPoint(point));
    return WKPointMake(result.x(), result.y());
}

WKPoint WKViewUserViewportToScene(WKViewRef viewRef, WKPoint point)
{
    WebCore::IntPoint result = toImpl(viewRef)->userViewportToScene(toIntPoint(point));
    return WKPointMake(result.x(), result.y());
}

WKPoint WKViewContentsToUserViewport(WKViewRef viewRef, WKPoint point)
{
    WebCore::IntPoint result = toImpl(viewRef)->contentsToUserViewport(toIntPoint(point));
    return WKPointMake(result.x(), result.y());
}

void WKViewPaintToCurrentGLContext(WKViewRef viewRef)
{
    toImpl(viewRef)->paintToCurrentGLContext();
}

WKPageRef WKViewGetPage(WKViewRef viewRef)
{
    return toImpl(viewRef)->pageRef();
}

void WKViewSetDrawsBackground(WKViewRef viewRef, bool flag)
{
    toImpl(viewRef)->setDrawsBackground(flag);
}

bool WKViewGetDrawsBackground(WKViewRef viewRef)
{
    return toImpl(viewRef)->drawsBackground();
}

void WKViewSetDrawsTransparentBackground(WKViewRef viewRef, bool flag)
{
    toImpl(viewRef)->setDrawsTransparentBackground(flag);
}

bool WKViewGetDrawsTransparentBackground(WKViewRef viewRef)
{
    return toImpl(viewRef)->drawsTransparentBackground();
}

void WKViewSuspendActiveDOMObjectsAndAnimations(WKViewRef viewRef)
{
    toImpl(viewRef)->suspendActiveDOMObjectsAndAnimations();
}

void WKViewResumeActiveDOMObjectsAndAnimations(WKViewRef viewRef)
{
    toImpl(viewRef)->resumeActiveDOMObjectsAndAnimations();
}

bool WKViewExitFullScreen(WKViewRef viewRef)
{
#if ENABLE(FULLSCREEN_API)
    return toImpl(viewRef)->requestExitFullScreen();
#else
    UNUSED_PARAM(viewRef);
    return false;
#endif
}

void WKViewSetOpacity(WKViewRef view, double opacity)
{
    toImpl(view)->setOpacity(opacity);
}

double WKViewOpacity(WKViewRef view)
{
    return toImpl(view)->opacity();
}

void WKViewFindZoomableAreaForRect(WKViewRef viewRef, WKRect wkRect)
{
#if USE(COORDINATED_GRAPHICS_MULTIPROCESS)
    IntRect rect = toIntRect(wkRect);
    toImpl(viewRef)->findZoomableAreaForPoint(rect.center(), rect.size());
#else
    UNUSED_PARAM(viewRef);
    UNUSED_PARAM(wkRect);
#endif
}

WKSize WKViewGetContentsSize(WKViewRef viewRef)
{
    const WebCore::IntSize& size = toImpl(viewRef)->contentsSize();
    return WKSizeMake(size.width(), size.height());
}

#endif // USE(COORDINATED_GRAPHICS)
