webengine/osswebengine/WebCore/platform/symbian/ScrollViewSymbian.cpp
changeset 0 dd21522fd290
child 15 60c5402cb945
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/platform/symbian/ScrollViewSymbian.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,462 @@
+/*
+* 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 "ScrollView.h"
+
+#include "WebCoreWidget.h"
+#include "FloatRect.h"
+#include "IntRect.h"
+
+/*
+    This class implementation does NOT actually emulate the Qt ScrollView.
+    It does provide an implementation that khtml will use to interact with
+    WebKit's WebFrameView documentView and our NSScrollView subclass.
+
+    ScrollView's view is a NSScrollView (or subclass of NSScrollView)
+    in most cases. That scrollview is a subview of an
+    WebCoreFrameView. The WebCoreFrameView's documentView will also be
+    the scroll view's documentView.
+
+    The WebCoreFrameView's size is the frame size.  The WebCoreFrameView's documentView
+    corresponds to the frame content size.  The scrollview itself is autosized to the
+    WebCoreFrameView's size (see Widget::resize).
+*/
+
+namespace WebCore {
+
+int ScrollView::visibleWidth() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->visibleRect().Width():0;
+    }
+
+int ScrollView::visibleHeight() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->visibleRect().Height():0;
+    }
+
+FloatRect ScrollView::visibleContentRect() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?FloatRect( v->visibleRect() ):FloatRect( 0, 0, 0, 0 );
+    }
+
+int ScrollView::contentsWidth() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->contentSize().iWidth:0;
+    }
+
+int ScrollView::contentsHeight() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->contentSize().iHeight:0;
+    }
+
+int ScrollView::contentsX() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->visibleRect().iTl.iX:0;
+    }
+
+int ScrollView::contentsY() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?v->visibleRect().iTl.iY:0;
+    }
+
+IntSize ScrollView::scrollOffset() const
+    {
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?IntPoint( v->visibleRect().iTl ) - IntPoint():IntSize();
+    }
+
+void ScrollView::scrollBy(int dx, int dy)
+    {
+    setContentsPos(contentsX() + dx, contentsY() + dy);
+    }
+
+void ScrollView::scrollRectIntoViewRecursively(const IntRect& rect)
+    {
+    int x = rect.x();
+    int y = rect.y();
+    x = (x < 0) ? 0 : x;
+    y = (y < 0) ? 0 : y;
+    /*NSPoint p = NSMakePoint(x,y);
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    NSView *docView;
+    NSView *view = getView();
+    docView = getDocumentView();
+    if (docView)
+        view = docView;
+
+    NSView *originalView = view;
+    while (view) {
+        if ([view isKindOfClass:[NSClipView class]]) {
+            NSPoint viewPoint = [view convertPoint:p fromView:originalView];
+            [view scrollPoint:viewPoint];
+        }
+        view = [view superview];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    setContentsPos(x,y);
+    }
+
+FloatRect ScrollView::visibleContentRectConsideringExternalScrollers() const
+{
+    // external scrollers not supported for now
+    return visibleContentRect();
+}
+
+void ScrollView::setContentsPos(int x, int y)
+    {
+    x = (x < 0) ? 0 : x;
+    y = (y < 0) ? 0 : y;
+    /*NSPoint p =  NSMakePoint(x,y);
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    NSView *docView;
+    NSView *view = getView();
+    docView = getDocumentView();
+    if (docView)
+        view = docView;
+    [view scrollPoint:p];
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->scrollTo(TPoint(x,y));
+        }
+
+    }
+
+void ScrollView::setVScrollbarMode(ScrollbarMode vMode)
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        [frameView setVerticalScrollingMode: (WebCoreScrollbarMode)vMode];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->setVerticalScrollingMode(vMode);
+        }
+    }
+
+void ScrollView::setHScrollbarMode(ScrollbarMode hMode)
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        [frameView setHorizontalScrollingMode: (WebCoreScrollbarMode)hMode];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->setHorizontalScrollingMode(hMode);
+        }
+
+    }
+
+void ScrollView::setScrollbarsMode(ScrollbarMode mode)
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        [frameView setScrollingMode: (WebCoreScrollbarMode)mode];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->setScrollingMode(mode);
+        }
+    }
+
+ScrollbarMode ScrollView::vScrollbarMode() const
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        return (ScrollbarMode)[frameView verticalScrollingMode];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return ScrollbarAuto;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?(ScrollbarMode)v->verticalScrollingMode():ScrollbarAuto;
+    }
+
+ScrollbarMode ScrollView::hScrollbarMode() const
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        return (ScrollbarMode)[frameView horizontalScrollingMode];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return ScrollbarAuto;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    return v?(ScrollbarMode)v->horizontalScrollingMode():ScrollbarAuto;
+    }
+
+void ScrollView::suppressScrollbars(bool suppressed,  bool repaintOnUnsuppress)
+    {
+    /*NSView* view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) {
+        NSView<WebCoreFrameView>* frameView = (NSView<WebCoreFrameView>*)view;
+        [frameView setScrollbarsSuppressed: suppressed
+                       repaintOnUnsuppress: repaintOnUnsuppress];
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->setScrollbarsSuppressed(suppressed,repaintOnUnsuppress);
+        }
+    }
+
+void ScrollView::addChild(Widget* child )
+    {
+    ASSERT(child != this);
+
+    /*
+    // we don't need to do the offscreen position initialization that KDE needs
+    if (x != -500000)
+        child->move(x, y);
+
+    NSView *thisView = getView();
+    NSView *thisDocView = getDocumentView();
+    if (thisDocView)
+        thisView = thisDocView;
+
+#ifndef NDEBUG
+    NSView *subview = child->getOuterView();
+
+    LOG(Frames, "Adding %p %@ at (%d,%d) w %d h %d\n", subview,
+        [(id)[subview class] className], x, y, (int)[subview frame].size.width, (int)[subview frame].size.height);
+#endif
+    child->addToSuperview(thisView);*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->addChild(child->getView());
+        }
+    }
+
+void ScrollView::removeChild(Widget*)
+    {
+    //child->removeFromSuperview();
+    }
+
+void ScrollView::resizeContents(int w, int h)
+    {
+    /*BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    int _w = w;
+    int _h = h;
+
+    LOG(Frames, "%p %@ at w %d h %d\n", getView(), [(id)[getView() class] className], w, h);
+    NSView *view = getView();
+    if ([view isKindOfClass:[NSScrollView class]]){
+        view = getDocumentView();
+
+        LOG(Frames, "%p %@ at w %d h %d\n", view, [(id)[view class] className], w, h);
+        if (_w < 0)
+            _w = 0;
+        if (_h < 0)
+            _h = 0;
+
+        NSSize tempSize = { _w, _h }; // workaround for 4213314
+        [view setFrameSize:tempSize];
+    } else {
+        resize (_w, _h);
+    }
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    if (w < 0)
+        {
+        w = 0;
+        }
+    if (h < 0)
+        {
+        h = 0;
+        }
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->resizeContent(TSize(w,h));
+        }
+    }
+
+void ScrollView::updateContents(const IntRect &rect, bool now)
+    {
+    /*BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    NSView *view = getView();
+
+    if ([view isKindOfClass:[NSScrollView class]])
+        view = getDocumentView();
+
+    // Checking for rect visibility is an important optimization for the case of
+    // Select All of a large document. AppKit does not do this check, and so ends
+    // up building a large complicated NSRegion if we don't perform the check.
+    NSRect dirtyRect = NSIntersectionRect(rect, [view visibleRect]);
+    if (!NSIsEmptyRect(dirtyRect)) {
+        [view setNeedsDisplayInRect:dirtyRect];
+        if (now) {
+            [[view window] displayIfNeeded];
+            [[view window] flushWindowIfNeeded];
+        }
+    }
+
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->invalidateRect( rect, now );
+        }
+    }
+
+void ScrollView::update()
+{
+/*
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    NSView *view = getView();
+    [[view window] displayIfNeeded];
+    [[view window] flushWindowIfNeeded];
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->invalidateRect( v->visibleRect(), true );
+        }
+}
+
+// NB, for us "viewport" means the NSWindow's coord system, which is origin lower left
+
+IntPoint ScrollView::contentsToWindow(const IntPoint& contentsPoint) const
+    {
+    /*BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    NSView *docView;
+    NSView *view = getView();
+
+    docView = getDocumentView();
+    if (docView)
+        view = docView;
+
+    NSPoint tempPoint = { contentsPoint.x(), contentsPoint.y() }; // workaround for 4213314
+    NSPoint np = [view convertPoint:tempPoint toView: nil];
+    return IntPoint(np);
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return IntPoint();*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    TPoint p(0,0);
+    if (v)
+        {
+        TPoint tempPoint( contentsPoint.x(), contentsPoint.y() );
+        p = v->convertContentToView( tempPoint );
+        }
+    return IntPoint( p );
+    }
+
+IntPoint ScrollView::windowToContents(const IntPoint& viewportPoint) const
+    {
+    /*BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    NSView *docView;
+    NSView *view = getView();
+
+    docView = getDocumentView();
+    if (docView)
+        view = docView;
+
+    NSPoint tempPoint = { viewportPoint.x(), viewportPoint.y() }; // workaround for 4213314
+    NSPoint np = [view convertPoint:tempPoint fromView: nil];
+
+    return IntPoint(np);
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return IntPoint();*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    TPoint p;
+    if (v)
+        {
+        TPoint tempPoint( viewportPoint.x(), viewportPoint.y() );
+        p = v->convertViewToContent( tempPoint );
+        }
+    return IntPoint( p );
+    }
+
+void ScrollView::setStaticBackground(bool b)
+    {
+    /*NSScrollView *view = (NSScrollView *)getView();
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view isKindOfClass:[NSScrollView class]])
+        [[view contentView] setCopiesOnScroll: !b];
+    END_BLOCK_OBJC_EXCEPTIONS;*/
+    MScrollView* v = static_cast<MScrollView*>(getView());
+    if (v)
+        {
+        v->setMayUseCopyScroll(!b);
+        }
+    }
+
+MScrollView& ScrollView::getDocumentView() const
+    {
+    /*id view = getView();
+
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+    if ([view respondsToSelector:@selector(documentView)])
+        return [view documentView];
+    END_BLOCK_OBJC_EXCEPTIONS;
+
+    return nil;*/
+    return *static_cast<MScrollView*>(getView());
+    }
+
+bool ScrollView::inWindow() const
+    {
+    return true; //[getView() window];
+    }
+
+}