/*
* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/


#include "config.h"
#include "Font.h"
#include "GraphicsContext.h"
#include "Widget.h"
#include "WebCoreWidget.h"
#include "IntRect.h"
#include "IntPoint.h"
#include "Cursor.h"
#include "Event.h"
#include "EventNames.h"
#include "KeyboardEvent.h"

namespace WebCore {
using namespace EventNames;
static bool deferFirstResponderChanges;
static Widget *deferredFirstResponder;

class WidgetPrivate
    {
    public:
        Font font;
        MWebCoreWidget* view;
        WidgetClient* client;
        bool visible;
        bool mustStayInWindow;
        bool removeFromSuperviewSoon;
    };

Widget::Widget() : data(new WidgetPrivate)
    {
    data->view = NULL;
    data->client = NULL;
    data->visible = true;
    data->mustStayInWindow = EFalse;
    data->removeFromSuperviewSoon = EFalse;
    }

Widget::Widget(MWebCoreWidget* view) : data(new WidgetPrivate)
    {
    data->view = view;
    data->client = NULL;
    data->visible = true;
    data->mustStayInWindow = EFalse;
    data->removeFromSuperviewSoon = EFalse;
    }

Widget::~Widget()
    {
    if( data->view )
        {
        data->view->deref();
        }
    if (deferredFirstResponder == this)
        {
        deferredFirstResponder = NULL;
        }
    delete data;
    }

void Widget::setEnabled(bool enabled)
    {
    if( getView() )
        {
        getView()->makeVisible(enabled);
        }
    }

bool Widget::isEnabled() const
    {
    if( getView() )
        {
        return getView()->isVisible();
        }
    return EFalse;
    }

IntRect Widget::frameGeometry() const
    {
    if( getOuterView() )
        {
        return IntRect( getOuterView()->rect() );
        }
    return IntRect();
    }

bool Widget::hasFocus() const
    {
    if( getView() )
        {
        return  getView()->isFocused();
        }
    return EFalse;
   }

void Widget::setFocus()
    {
    if (hasFocus())
        {
        return;
        }

    if( getView() )
        {
        getView()->setFocus( ETrue );
        }
    }

void Widget::setCursor(const Cursor& cursor)
{
    /*for (id view = data->view; view; view = [view superview]) {
        if ([view respondsToSelector:@selector(setDocumentCursor:)]) {
            if ([view respondsToSelector:@selector(documentCursor)] && cursor.impl() == [view documentCursor])
                break;
            [view setDocumentCursor:cursor.impl()];
            break;
        }
    }*/
    getView()->setCursor( cursor.impl() ? cursor.impl()->type() : PointerCursor );
}

void Widget::show()
    {
    if (!data || data->visible)
        {
        return;
        }

    data->visible = true;

    if( getOuterView() )
        {
        getOuterView()->makeVisible( ETrue );
        }
    }

void Widget::hide()
    {
    if (!data || !data->visible)
        {
        return;
        }

    data->visible = false;

    if( getOuterView() && isFrameView() )
        {
        getOuterView()->makeVisible( EFalse );
        }
    }

void Widget::setFrameGeometry(const IntRect &rect)
    {
    if( getOuterView() )
        {
        MWebCoreWidget* view = getOuterView();
        if (view->rect() != rect.Rect() )
            {
            view->setRect(rect.Rect());
            view->setNeedsDisplay( EFalse );
            }
        }
    }


MWebCoreWidget* Widget::getView() const
    {
    return data->view;
    }

void Widget::setView(MWebCoreWidget* view)
    {
    if (data->view)
        data->view->deref();
    data->view = view;
    if (data->view)
        data->view->ref();
    }

MWebCoreWidget* Widget::getOuterView() const
    {
    // If this widget's view is a WebCoreFrameView the we resize its containing view, a WebFrameView.

    /*
    NSView* view = data->view;
    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
        view = [view superview];
        ASSERT(view);
    }*/

    MWebCoreWidget* view = getView();
    return view;
    }

void Widget::paint(GraphicsContext* p, const IntRect& r)
    {
    if (p->paintingDisabled())
        {
        return;
        }
    if( getView() )
        {
        getView()->draw( *p->platformContext(), r.Rect() );
        }
    }

void Widget::setIsSelected(bool isSelected)
    {
    //[FrameMac::bridgeForWidget(this) setIsSelected:isSelected forView:getView()];
    }

void Widget::setClient(WidgetClient* c)
    {
    data->client = c;
    }

WidgetClient* Widget::client() const
    {
    return data->client;
    }

bool Widget::isFocusable() const
    {
    if (getView())
        return getView()->isFocusable();
    return false;
    }

void Widget::handleEvent(Event* event)
{
    if (event->type() == keydownEvent && event->isKeyboardEvent()) {
        KeyboardEvent* kevt = static_cast<KeyboardEvent*>(event);
        if (kevt->keyIdentifier() == "Enter") {
            MWebCoreWidget* view = getView();
            if(view && view->isObjectView()) {
                view->activate();
            }
        }
    }
}

}
