⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrollviewmac.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
字号:
/* * Copyright (C) 2004, 2006, 2007, 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#import "config.h"#import "ScrollView.h"#import "BlockExceptions.h"#import "FloatRect.h"#import "IntRect.h"#import "Logging.h"#import "NotImplemented.h"#import "WebCoreFrameView.h"using namespace std;@interface NSWindow (WebWindowDetails)- (BOOL)_needsToResetDragMargins;- (void)_setNeedsToResetDragMargins:(BOOL)needs;@endnamespace WebCore {inline NSScrollView<WebCoreFrameScrollView> *ScrollView::scrollView() const{    ASSERT(!platformWidget() || [platformWidget() isKindOfClass:[NSScrollView class]]);    ASSERT(!platformWidget() || [platformWidget() conformsToProtocol:@protocol(WebCoreFrameScrollView)]);    return static_cast<NSScrollView<WebCoreFrameScrollView> *>(platformWidget());}NSView *ScrollView::documentView() const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;    return [scrollView() documentView];    END_BLOCK_OBJC_EXCEPTIONS;    return nil;}void ScrollView::platformAddChild(Widget* child){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    NSView *parentView = documentView();    NSView *childView = child->getOuterView();    ASSERT(![parentView isDescendantOf:childView]);        // Suppress the resetting of drag margins since we know we can't affect them.    NSWindow *window = [parentView window];    BOOL resetDragMargins = [window _needsToResetDragMargins];    [window _setNeedsToResetDragMargins:NO];    if ([childView superview] != parentView)        [parentView addSubview:childView];    [window _setNeedsToResetDragMargins:resetDragMargins];    END_BLOCK_OBJC_EXCEPTIONS;}void ScrollView::platformRemoveChild(Widget* child){    child->removeFromSuperview();}void ScrollView::platformSetScrollbarModes(){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    [scrollView() setScrollingModes:m_horizontalScrollbarMode vertical:m_verticalScrollbarMode andLock:NO];    END_BLOCK_OBJC_EXCEPTIONS;}void ScrollView::platformScrollbarModes(ScrollbarMode& horizontal, ScrollbarMode& vertical) const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;    [scrollView() scrollingModes:&horizontal vertical:&vertical];    END_BLOCK_OBJC_EXCEPTIONS;}void ScrollView::platformSetCanBlitOnScroll(bool canBlitOnScroll){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    [[scrollView() contentView] setCopiesOnScroll:canBlitOnScroll];    END_BLOCK_OBJC_EXCEPTIONS;}bool ScrollView::platformCanBlitOnScroll() const{    return [[scrollView() contentView] copiesOnScroll];}IntRect ScrollView::platformVisibleContentRect(bool includeScrollbars) const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;     if (includeScrollbars) {        if (NSView* documentView = this->documentView())            return enclosingIntRect([documentView visibleRect]);    }    return enclosingIntRect([scrollView() documentVisibleRect]);     END_BLOCK_OBJC_EXCEPTIONS;     return IntRect();}IntSize ScrollView::platformContentsSize() const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;    if (NSView* documentView = this->documentView())        return enclosingIntRect([documentView bounds]).size();    END_BLOCK_OBJC_EXCEPTIONS;    return IntSize();}void ScrollView::platformSetContentsSize(){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    int w = m_contentsSize.width();    int h = m_contentsSize.height();    LOG(Frames, "%p %@ at w %d h %d\n", documentView(), [(id)[documentView() class] className], w, h);                NSSize tempSize = { max(0, w), max(0, h) }; // workaround for 4213314    [documentView() setFrameSize:tempSize];    END_BLOCK_OBJC_EXCEPTIONS;}void ScrollView::platformSetScrollbarsSuppressed(bool repaintOnUnsuppress){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    [scrollView() setScrollBarsSuppressed:m_scrollbarsSuppressed                      repaintOnUnsuppress:repaintOnUnsuppress];    END_BLOCK_OBJC_EXCEPTIONS;}void ScrollView::platformSetScrollPosition(const IntPoint& scrollPoint){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    NSPoint tempPoint = { max(0, scrollPoint.x()), max(0, scrollPoint.y()) }; // Don't use NSMakePoint to work around 4213314.    [documentView() scrollPoint:tempPoint];    END_BLOCK_OBJC_EXCEPTIONS;}bool ScrollView::platformScroll(ScrollDirection, ScrollGranularity){    // FIXME: It would be nice to implement this so that all of the code in WebFrameView could go away.    notImplemented();    return false;}void ScrollView::platformRepaintContentRectangle(const IntRect& rect, bool now){    BEGIN_BLOCK_OBJC_EXCEPTIONS;    NSView *view = documentView();    NSRect visibleRect = visibleContentRect();    // FIXME: I don't think this intersection is necessary any more now that    // selection doesn't call this method directly (but has to go through FrameView's    // repaintContentRectangle, which does the intersection test also).  Leaving it in    // for now until I'm sure.    // 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, visibleRect);    if (!NSIsEmptyRect(dirtyRect)) {        [view setNeedsDisplayInRect:dirtyRect];        if (now) {            [[view window] displayIfNeeded];            [[view window] flushWindowIfNeeded];        }    }    END_BLOCK_OBJC_EXCEPTIONS;}// "Containing Window" means the NSWindow's coord system, which is origin lower leftIntRect ScrollView::platformContentsToScreen(const IntRect& rect) const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;    if (NSView* documentView = this->documentView()) {        NSRect tempRect = rect;        tempRect = [documentView convertRect:tempRect toView:nil];        tempRect.origin = [[documentView window] convertBaseToScreen:tempRect.origin];        return enclosingIntRect(tempRect);    }    END_BLOCK_OBJC_EXCEPTIONS;    return IntRect();}IntPoint ScrollView::platformScreenToContents(const IntPoint& point) const{    BEGIN_BLOCK_OBJC_EXCEPTIONS;    if (NSView* documentView = this->documentView()) {        NSPoint windowCoord = [[documentView window] convertScreenToBase: point];        return IntPoint([documentView convertPoint:windowCoord fromView:nil]);    }    END_BLOCK_OBJC_EXCEPTIONS;    return IntPoint();}bool ScrollView::platformIsOffscreen() const{    return ![platformWidget() window] || ![[platformWidget() window] isVisible];}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -