diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebCore/platform/symbian/ScrollViewSymbian.cpp --- /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(getView()); + return v?v->visibleRect().Width():0; + } + +int ScrollView::visibleHeight() const + { + MScrollView* v = static_cast(getView()); + return v?v->visibleRect().Height():0; + } + +FloatRect ScrollView::visibleContentRect() const + { + MScrollView* v = static_cast(getView()); + return v?FloatRect( v->visibleRect() ):FloatRect( 0, 0, 0, 0 ); + } + +int ScrollView::contentsWidth() const + { + MScrollView* v = static_cast(getView()); + return v?v->contentSize().iWidth:0; + } + +int ScrollView::contentsHeight() const + { + MScrollView* v = static_cast(getView()); + return v?v->contentSize().iHeight:0; + } + +int ScrollView::contentsX() const + { + MScrollView* v = static_cast(getView()); + return v?v->visibleRect().iTl.iX:0; + } + +int ScrollView::contentsY() const + { + MScrollView* v = static_cast(getView()); + return v?v->visibleRect().iTl.iY:0; + } + +IntSize ScrollView::scrollOffset() const + { + MScrollView* v = static_cast(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(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* frameView = (NSView*)view; + [frameView setVerticalScrollingMode: (WebCoreScrollbarMode)vMode]; + } + END_BLOCK_OBJC_EXCEPTIONS;*/ + MScrollView* v = static_cast(getView()); + if (v) + { + v->setVerticalScrollingMode(vMode); + } + } + +void ScrollView::setHScrollbarMode(ScrollbarMode hMode) + { + /*NSView* view = getView(); + + BEGIN_BLOCK_OBJC_EXCEPTIONS; + if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) { + NSView* frameView = (NSView*)view; + [frameView setHorizontalScrollingMode: (WebCoreScrollbarMode)hMode]; + } + END_BLOCK_OBJC_EXCEPTIONS;*/ + MScrollView* v = static_cast(getView()); + if (v) + { + v->setHorizontalScrollingMode(hMode); + } + + } + +void ScrollView::setScrollbarsMode(ScrollbarMode mode) + { + /*NSView* view = getView(); + + BEGIN_BLOCK_OBJC_EXCEPTIONS; + if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) { + NSView* frameView = (NSView*)view; + [frameView setScrollingMode: (WebCoreScrollbarMode)mode]; + } + END_BLOCK_OBJC_EXCEPTIONS;*/ + MScrollView* v = static_cast(getView()); + if (v) + { + v->setScrollingMode(mode); + } + } + +ScrollbarMode ScrollView::vScrollbarMode() const + { + /*NSView* view = getView(); + + BEGIN_BLOCK_OBJC_EXCEPTIONS; + if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) { + NSView* frameView = (NSView*)view; + return (ScrollbarMode)[frameView verticalScrollingMode]; + } + END_BLOCK_OBJC_EXCEPTIONS; + + return ScrollbarAuto;*/ + MScrollView* v = static_cast(getView()); + return v?(ScrollbarMode)v->verticalScrollingMode():ScrollbarAuto; + } + +ScrollbarMode ScrollView::hScrollbarMode() const + { + /*NSView* view = getView(); + + BEGIN_BLOCK_OBJC_EXCEPTIONS; + if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) { + NSView* frameView = (NSView*)view; + return (ScrollbarMode)[frameView horizontalScrollingMode]; + } + END_BLOCK_OBJC_EXCEPTIONS; + + return ScrollbarAuto;*/ + MScrollView* v = static_cast(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* frameView = (NSView*)view; + [frameView setScrollbarsSuppressed: suppressed + repaintOnUnsuppress: repaintOnUnsuppress]; + } + END_BLOCK_OBJC_EXCEPTIONS;*/ + MScrollView* v = static_cast(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(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(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(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(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(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(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(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(getView()); + } + +bool ScrollView::inWindow() const + { + return true; //[getView() window]; + } + +}