[webkit-changes] cvs commit: WebCore/kwq KWQButton.mm KWQComboBox.mm KWQFileButton.mm KWQKHTMLPart.mm KWQListBox.mm KWQScrollView.h KWQScrollView.mm KWQSlider.mm KWQTextArea.mm KWQTextField.mm WebCoreBridge.mm KWQNSViewExtras.h KWQNSViewExtras.m

Timothy thatcher at opensource.apple.com
Fri Nov 11 17:57:47 PST 2005


thatcher    05/11/11 17:57:47

  Modified:    .        Tag: Safari-1-3-branch ChangeLog
               khtml    Tag: Safari-1-3-branch khtml_part.cpp khtmlview.cpp
               khtml/rendering Tag: Safari-1-3-branch render_layer.cpp
                        render_layer.h render_text.cpp
               kwq      Tag: Safari-1-3-branch KWQButton.mm KWQComboBox.mm
                        KWQFileButton.mm KWQKHTMLPart.mm KWQListBox.mm
                        KWQScrollView.h KWQScrollView.mm KWQSlider.mm
                        KWQTextArea.mm KWQTextField.mm WebCoreBridge.mm
  Removed:     kwq      Tag: Safari-1-3-branch KWQNSViewExtras.h
                        KWQNSViewExtras.m
  Log:
          Merged fix from TOT to Safari-1-3-branch
  
      2005-11-03  Adele Peterson  <adele at apple.com>
  
          Reviewed by Hyatt.
  
          Clean up of layer scrolling code.  Now we can clearly define what to do if a rectangle is fully visible, partially visible, or hidden.
          This also fixes a bug with the previous implementation where nested layers/frames would get passed a rect that was too large.
  
          Added fast/overflow/scrollRevealButton.html
  
          * khtml/rendering/render_layer.h: (khtml::RenderLayer::):
          Added ScrollBehavior enum, ScrollAlignment struct, and ScrollAlignment static members
          to describe specific scrolling behaviors depending on how visible the rectangle is.
          In the future, we can add other statics to easily describe desired behaviors.
          * khtml/rendering/render_layer.cpp:
          (khtml::): initialize ScrollAlignment static members:
          alignCenterIfNeeded, alignToEdgeIfNeeded, alignCenterAlways, alignTopAlways, alignBottomAlways
          (khtml::RenderLayer::scrollRectToVisible):
          alignCenterIfNeeded is the default behavior for both directions.
          Pass the original rect (adjusted if scrolling has occurred) when recursively calling this function.
          (khtml::RenderLayer::getRectToExpose): Adjusted for new ScrollAlignment parameters.
          * khtml/khtml_part.cpp:
          (KHTMLPart::gotoAnchor): Use the node's rect to determine where to scroll.
          We used to just use the origin, but this helps us match other browsers better.
          (KHTMLPart::setActiveNode): Removed scrolling code, since this is now also done in setFocusNode
          * khtml/xml/dom_elementimpl.cpp: (ElementImpl::scrollIntoView): Use new ScrollAlignment values to describe scrolling behavior.
          * kwq/KWQKHTMLPart.mm:
          (KWQKHTMLPart::nextKeyViewInFrame): Removed scrolling code, since this is now also done in setFocusNode
          (KWQKHTMLPart::centerSelectionInVisibleArea): Use new ScrollAlignment values to describe scrolling behavior.
          * kwq/WebCoreBridge.mm: (-[WebCoreBridge ensureSelectionVisible]): ditto.
          * kwq/KWQScrollView.h: Removed ensureRectVisible, since we no longer use this.
          * kwq/KWQScrollView.mm: ditto.
          * khtml/khtmlview.cpp:
          (KHTMLView::doAutoScroll): Removed unnecessary nil checks for enclosingLayer
          (KHTMLView::focusNextPrevNode): ditto.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.335.2.16 +39 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.335.2.15
  retrieving revision 1.335.2.16
  diff -u -r1.335.2.15 -r1.335.2.16
  --- ChangeLog	12 Nov 2005 01:30:50 -0000	1.335.2.15
  +++ ChangeLog	12 Nov 2005 01:57:40 -0000	1.335.2.16
  @@ -2,6 +2,45 @@
   
           Merged fix from TOT to Safari-1-3-branch
   
  +    2005-11-03  Adele Peterson  <adele at apple.com>
  +
  +        Reviewed by Hyatt.
  +
  +        Clean up of layer scrolling code.  Now we can clearly define what to do if a rectangle is fully visible, partially visible, or hidden.
  +        This also fixes a bug with the previous implementation where nested layers/frames would get passed a rect that was too large.
  +
  +        Added fast/overflow/scrollRevealButton.html
  +
  +        * khtml/rendering/render_layer.h: (khtml::RenderLayer::): 
  +        Added ScrollBehavior enum, ScrollAlignment struct, and ScrollAlignment static members
  +        to describe specific scrolling behaviors depending on how visible the rectangle is.
  +        In the future, we can add other statics to easily describe desired behaviors.
  +        * khtml/rendering/render_layer.cpp:
  +        (khtml::): initialize ScrollAlignment static members: 
  +        alignCenterIfNeeded, alignToEdgeIfNeeded, alignCenterAlways, alignTopAlways, alignBottomAlways
  +        (khtml::RenderLayer::scrollRectToVisible):
  +        alignCenterIfNeeded is the default behavior for both directions.
  +        Pass the original rect (adjusted if scrolling has occurred) when recursively calling this function.
  +        (khtml::RenderLayer::getRectToExpose): Adjusted for new ScrollAlignment parameters.
  +        * khtml/khtml_part.cpp:
  +        (KHTMLPart::gotoAnchor): Use the node's rect to determine where to scroll.  
  +        We used to just use the origin, but this helps us match other browsers better.
  +        (KHTMLPart::setActiveNode): Removed scrolling code, since this is now also done in setFocusNode
  +        * khtml/xml/dom_elementimpl.cpp: (ElementImpl::scrollIntoView): Use new ScrollAlignment values to describe scrolling behavior.
  +        * kwq/KWQKHTMLPart.mm:
  +        (KWQKHTMLPart::nextKeyViewInFrame): Removed scrolling code, since this is now also done in setFocusNode
  +        (KWQKHTMLPart::centerSelectionInVisibleArea): Use new ScrollAlignment values to describe scrolling behavior.
  +        * kwq/WebCoreBridge.mm: (-[WebCoreBridge ensureSelectionVisible]): ditto.
  +        * kwq/KWQScrollView.h: Removed ensureRectVisible, since we no longer use this.
  +        * kwq/KWQScrollView.mm: ditto.
  +        * khtml/khtmlview.cpp:
  +        (KHTMLView::doAutoScroll): Removed unnecessary nil checks for enclosingLayer
  +        (KHTMLView::focusNextPrevNode): ditto.
  +
  +2005-11-11  Timothy Hatcher  <timothy at apple.com>
  +
  +        Merged fix from TOT to Safari-1-3-branch
  +
       2005-10-27  David Harrison  <harrison at apple.com>
    
           Reviewed by Justin Garcia and Dave Hyatt.
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.311.6.7 +11 -6     WebCore/khtml/khtml_part.cpp
  
  Index: khtml_part.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/khtml_part.cpp,v
  retrieving revision 1.311.6.6
  retrieving revision 1.311.6.7
  diff -u -r1.311.6.6 -r1.311.6.7
  --- khtml_part.cpp	15 Jul 2005 18:05:13 -0000	1.311.6.6
  +++ khtml_part.cpp	12 Nov 2005 01:57:41 -0000	1.311.6.7
  @@ -123,6 +123,7 @@
   using khtml::plainText;
   using khtml::RenderObject;
   using khtml::RenderText;
  +using khtml::RenderLayer;
   using khtml::RenderWidget;
   using khtml::Selection;
   using khtml::Tokenizer;
  @@ -2254,10 +2255,13 @@
     if (n) {
       static_cast<HTMLElementImpl *>(n)->getUpperLeftCorner(x, y);
     }
  -  // Scroll to actual top left of element with no slop, since some pages expect anchors to be exactly scrolled to.
  +
   #if APPLE_CHANGES
  -  // Call recursive version so this will expose correctly from within nested frames.
  -  d->m_view->setContentsPosRecursive(x, y);
  +    // Scroll nested layers and frames to reveal the anchor.
  +    if (n && n->renderer()) {
  +        // Align to the top and to the closest side (this matches other browsers).
  +        n->renderer()->enclosingLayer()->scrollRectToVisible(n->getRect(), RenderLayer::gAlignToEdgeIfNeeded, RenderLayer::gAlignTopAlways);
  +    }
   #else
     d->m_view->setContentsPos(x, y);
   #endif
  @@ -5324,9 +5328,10 @@
       d->m_doc->setFocusNode(node.handle());
   
       // Scroll the view if necessary to ensure that the new focus node is visible
  -    QRect rect  = node.handle()->getRect();
  -    d->m_view->ensureVisible(rect.right(), rect.bottom());
  -    d->m_view->ensureVisible(rect.left(), rect.top());
  +    QRect rect  = node.handle()->getRect();    
  +    if (node.handle()->renderer() && node.handle()->renderer()->enclosingLayer()) {
  +        node.handle()->renderer()->enclosingLayer()->scrollRectToVisible(rect);
  +    }
   }
   
   DOM::Node KHTMLPart::activeNode() const
  
  
  
  1.128.6.2 +7 -2      WebCore/khtml/khtmlview.cpp
  
  Index: khtmlview.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/khtmlview.cpp,v
  retrieving revision 1.128.6.1
  retrieving revision 1.128.6.2
  diff -u -r1.128.6.1 -r1.128.6.2
  --- khtmlview.cpp	18 Aug 2005 00:11:42 -0000	1.128.6.1
  +++ khtmlview.cpp	12 Nov 2005 01:57:42 -0000	1.128.6.2
  @@ -1332,7 +1332,10 @@
       if ( (pos.y() < 0) || (pos.y() > visibleHeight()) ||
            (pos.x() < 0) || (pos.x() > visibleWidth()) )
       {
  -        ensureVisible( xm, ym, 0, 5 );
  +        DocumentImpl *doc = m_part->xmlDocImpl();
  +        if (doc && doc->renderer()) {
  +            doc->renderer()->enclosingLayer()->scrollRectToVisible(QRect(xm, ym, 0, 5));
  +        }
       }
   }
   
  @@ -1492,7 +1495,9 @@
                   return;
           }
           else {
  -            ensureVisible(contentsX(), next ? 0: contentsHeight());
  +            if (doc->renderer()) {
  +                doc->renderer()->enclosingLayer()->scrollRectToVisible(QRect(contentsX(), next ? 0: contentsHeight(), 0, 0));
  +            }
           }
       }
       // Set focus node on the document
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.94.4.1  +123 -2    WebCore/khtml/rendering/render_layer.cpp
  
  Index: render_layer.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_layer.cpp,v
  retrieving revision 1.94
  retrieving revision 1.94.4.1
  diff -u -r1.94 -r1.94.4.1
  --- render_layer.cpp	20 Mar 2005 23:48:17 -0000	1.94
  +++ render_layer.cpp	12 Nov 2005 01:57:43 -0000	1.94.4.1
  @@ -59,6 +59,8 @@
   #include "KWQKHTMLPart.h" // For Dashboard.
   #endif
   
  +#define MIN_INTERSECT_FOR_REVEAL 32
  +
   using namespace DOM;
   using namespace khtml;
   
  @@ -70,6 +72,12 @@
   static bool inRenderLayerDetach;
   #endif
   
  +const RenderLayer::ScrollAlignment RenderLayer::gAlignCenterIfNeeded = { RenderLayer::noScroll, RenderLayer::alignCenter, RenderLayer::alignToClosestEdge };
  +const RenderLayer::ScrollAlignment RenderLayer::gAlignToEdgeIfNeeded = { RenderLayer::noScroll, RenderLayer::alignToClosestEdge, RenderLayer::alignToClosestEdge };
  +const RenderLayer::ScrollAlignment RenderLayer::gAlignCenterAlways = { RenderLayer::alignCenter, RenderLayer::alignCenter, RenderLayer::alignCenter };
  +const RenderLayer::ScrollAlignment RenderLayer::gAlignTopAlways = { RenderLayer::alignTop, RenderLayer::alignTop, RenderLayer::alignTop };
  +const RenderLayer::ScrollAlignment RenderLayer::gAlignBottomAlways = { RenderLayer::alignBottom, RenderLayer::alignBottom, RenderLayer::alignBottom };
  +
   void* ClipRects::operator new(size_t sz, RenderArena* renderArena) throw()
   {
       return renderArena->allocate(sz);
  @@ -541,8 +549,121 @@
       }
   }
   
  -void
  -RenderLayer::updateScrollPositionFromScrollbars()
  +void RenderLayer::scrollRectToVisible(const QRect &rect, const ScrollAlignment& alignX, const ScrollAlignment& alignY)
  +{
  +    RenderLayer* parentLayer = 0;
  +    QRect newRect = rect;
  +    
  +    if (m_object->hasOverflowClip()) {
  +        QRect layerBounds = QRect(m_x + m_scrollX, m_y + m_scrollY, m_width, m_height);
  +        QRect exposeRect = QRect(rect.x() + m_scrollX, rect.y() + m_scrollY, rect.width(), rect.height());
  +        QRect r = getRectToExpose(layerBounds, exposeRect, alignX, alignY);
  +        
  +        int xOffset = r.x() - m_x;
  +        int yOffset = r.y() - m_y;
  +        // Adjust offsets if they're outside of the allowable range.
  +        xOffset = kMax(0, kMin(m_scrollWidth - m_width, xOffset));
  +        yOffset = kMax(0, kMin(m_scrollHeight - m_height, yOffset));
  +        
  +        if (xOffset != m_scrollX || yOffset != m_scrollY) {
  +            int diffX = m_scrollX;
  +            int diffY = m_scrollY;
  +            scrollToOffset(xOffset, yOffset);
  +            diffX = m_scrollX - diffX;
  +            diffY = m_scrollY - diffY;
  +            newRect.setX(rect.x() - diffX);
  +            newRect.setY(rect.y() - diffY);
  +        }
  +    
  +        if (m_object->parent())
  +            parentLayer = m_object->parent()->enclosingLayer();
  +    } else {
  +        QScrollView* view = m_object->document()->view();
  +        QRect viewRect = QRect(view->contentsX(), view->contentsY(), view->visibleWidth(), view->visibleHeight());
  +        if (view) {
  +            QRect r = getRectToExpose(viewRect, rect, alignX, alignY);
  +            view->setContentsPos(r.x(), r.y());
  +        }
  +        if (m_object->document() && m_object->document()->ownerElement() && m_object->document()->ownerElement()->renderer()) {
  +            parentLayer = m_object->document()->ownerElement()->renderer()->enclosingLayer();
  +            newRect.setX(rect.x() - view->contentsX() + view->viewport()->x());
  +            newRect.setY(rect.y() - view->contentsY() + view->viewport()->y());
  +        }
  +    }
  +    
  +    if (parentLayer)
  +        parentLayer->scrollRectToVisible(newRect, alignX, alignY);
  +}
  +
  +QRect RenderLayer::getRectToExpose(const QRect &visibleRect, const QRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY) {
  +
  +    int x, y, w, h;
  +    x = exposeRect.x();
  +    y = exposeRect.y();
  +    w = exposeRect.width();
  +    h = exposeRect.height();
  +    
  +    // Find the appropriate X coordinate to scroll to.
  +    ScrollBehavior scrollX = getHiddenBehavior(alignX);
  +    int intersectWidth = visibleRect.intersect(exposeRect).width();
  +    // If the rectangle is fully visible, use the specified visible behavior.
  +    // If the rectangle is partially visible, but over a certain threshold, then treat it as fully visible to avoid unnecessary horizontal scrolling
  +    if (intersectWidth == w || intersectWidth >= MIN_INTERSECT_FOR_REVEAL)
  +        scrollX = getVisibleBehavior(alignX);
  +    else if (intersectWidth == visibleRect.width()) {
  +        // If the rect is bigger than the visible area, don't bother trying to center.  Other alignments will work.
  +        if (getVisibleBehavior(alignX) == alignCenter)
  +            scrollX = noScroll;
  +        else
  +            scrollX = getVisibleBehavior(alignX);
  +    }
  +    // If the rectangle is partially visible, but not above the minimum threshold, use the specified partial behavior
  +    else if (intersectWidth > 0)
  +        scrollX = getPartialBehavior(alignX);
  +        
  +    if (scrollX == noScroll) 
  +        x = visibleRect.x();
  +    // If we're trying to align to the closest edge, and the exposeRect is further right than the visibleRect, then alignRight.
  +    else if ((scrollX == alignRight) || ((scrollX == alignToClosestEdge) && exposeRect.right() > visibleRect.right()))
  +        x = exposeRect.right() - visibleRect.width();
  +    else if (scrollX == alignCenter)
  +        x -= (visibleRect.width() - w) / 2;
  +    // By default, x is set to the left of the exposeRect, so for the alignLeft case, 
  +    // or the alignToClosestEdge case where the closest edge is the left edge, then x does not need to be changed.
  +    w = visibleRect.width();
  +    
  +    // Find the appropriate Y coordinate to scroll to.
  +    ScrollBehavior scrollY = getHiddenBehavior(alignY);
  +    int intersectHeight = visibleRect.intersect(exposeRect).height();
  +    // If the rectangle is fully visible, use the specified visible behavior.
  +    if (intersectHeight == h)
  +        scrollY = getVisibleBehavior(alignY);
  +    else if (intersectHeight == visibleRect.height()) {
  +        // If the rect is bigger than the visible area, don't bother trying to center.  Other alignments will work.
  +        if (getVisibleBehavior(alignY) == alignCenter)
  +            scrollY = noScroll;
  +        else
  +            scrollY = getVisibleBehavior(alignY);
  +    }
  +    // If the rectangle is partially visible, use the specified partial behavior
  +    else if (intersectHeight > 0)
  +        scrollY = getPartialBehavior(alignY);
  +        
  +    if (scrollY == noScroll) 
  +        y = visibleRect.y();
  +    // If we're trying to align to the closest edge, and the exposeRect is further down than the visibleRect, then alignBottom.
  +    else if ((scrollY == alignBottom) || ((scrollY == alignToClosestEdge) && exposeRect.bottom() > visibleRect.bottom()))
  +        y = exposeRect.bottom() - visibleRect.height();
  +    else if (scrollY == alignCenter)
  +        y -= (visibleRect.height() - h) / 2;
  +    // By default, y is set to the top of the exposeRect, so for the alignTop case, 
  +    // or the alignToEdgeY case where the closest edge is the top edge, then y does not need to be changed.
  +    h = visibleRect.height();
  +    
  +    return QRect(x, y, w, h);
  +}
  +
  +void RenderLayer::updateScrollPositionFromScrollbars()
   {
       bool needUpdate = false;
       int newX = m_scrollX;
  
  
  
  1.46.6.1  +28 -0     WebCore/khtml/rendering/render_layer.h
  
  Index: render_layer.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_layer.h,v
  retrieving revision 1.46
  retrieving revision 1.46.6.1
  diff -u -r1.46 -r1.46.6.1
  --- render_layer.h	25 Feb 2005 17:33:09 -0000	1.46
  +++ render_layer.h	12 Nov 2005 01:57:43 -0000	1.46.6.1
  @@ -158,6 +158,32 @@
   class RenderLayer
   {
   public:
  +    enum ScrollBehavior {
  +        noScroll,
  +        alignCenter,
  +        alignTop,
  +        alignBottom, 
  +        alignLeft,
  +        alignRight,
  +        alignToClosestEdge
  +    };
  +
  +    struct ScrollAlignment {
  +        ScrollBehavior m_rectVisible;
  +        ScrollBehavior m_rectHidden;
  +        ScrollBehavior m_rectPartial;
  +    };
  +
  +    static const ScrollAlignment gAlignCenterIfNeeded;
  +    static const ScrollAlignment gAlignToEdgeIfNeeded;
  +    static const ScrollAlignment gAlignCenterAlways;
  +    static const ScrollAlignment gAlignTopAlways;
  +    static const ScrollAlignment gAlignBottomAlways;
  +    
  +    static ScrollBehavior getVisibleBehavior(const ScrollAlignment& s) { return s.m_rectVisible; }
  +    static ScrollBehavior getPartialBehavior(const ScrollAlignment& s) { return s.m_rectPartial; }
  +    static ScrollBehavior getHiddenBehavior(const ScrollAlignment& s) { return s.m_rectHidden; }
  +    
   #ifdef APPLE_CHANGES
       static QScrollBar* gScrollBar;
   #endif
  @@ -222,6 +248,8 @@
       void scrollToOffset(int x, int y, bool updateScrollbars = true, bool repaint = true);
       void scrollToXOffset(int x) { scrollToOffset(x, m_scrollY); }
       void scrollToYOffset(int y) { scrollToOffset(m_scrollX, y); }
  +    void scrollRectToVisible(const QRect &r, const ScrollAlignment& alignX = gAlignCenterIfNeeded, const ScrollAlignment& alignY = gAlignCenterIfNeeded);
  +    QRect getRectToExpose(const QRect &visibleRect,  const QRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY);   
       void setHasHorizontalScrollbar(bool hasScrollbar);
       void setHasVerticalScrollbar(bool hasScrollbar);
       QScrollBar* horizontalScrollbar() { return m_hBar; }
  
  
  
  1.177.6.1 +3 -0      WebCore/khtml/rendering/render_text.cpp
  
  Index: render_text.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_text.cpp,v
  retrieving revision 1.177
  retrieving revision 1.177.6.1
  diff -u -r1.177 -r1.177.6.1
  --- render_text.cpp	20 Mar 2005 02:22:59 -0000	1.177
  +++ render_text.cpp	12 Nov 2005 01:57:43 -0000	1.177.6.1
  @@ -1740,6 +1740,9 @@
   
       int absx, absy;
       cb->absolutePosition(absx, absy);
  +    RenderLayer *layer = cb->layer();
  +    if (layer)
  +        layer->subtractScrollOffset(absx, absy); 
       for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) {
           QRect r = box->selectionRect(absx, absy, startPos, endPos);
           if (!r.isEmpty()) {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.40.6.1  +8 -2      WebCore/kwq/Attic/KWQButton.mm
  
  Index: KWQButton.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/Attic/KWQButton.mm,v
  retrieving revision 1.40
  retrieving revision 1.40.6.1
  diff -u -r1.40 -r1.40.6.1
  --- KWQButton.mm	19 Mar 2005 00:34:07 -0000	1.40
  +++ KWQButton.mm	12 Nov 2005 01:57:44 -0000	1.40.6.1
  @@ -31,9 +31,12 @@
   #import "KWQKHTMLPart.h"
   #import "KWQNSViewExtras.h"
   #import "KWQView.h"
  +#import "render_form.h"
   #import "WebCoreBridge.h"
   
  -#import "render_form.h"
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
  +
   
   @interface NSCell (KWQButtonKnowsAppKitSecrets)
   - (NSMutableDictionary *)_textAttributes;
  @@ -123,7 +126,10 @@
       BOOL become = [super becomeFirstResponder];
       if (become && button) {
           if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(button)) {
  -            [self _KWQ_scrollFrameToVisible];
  +            RenderWidget *w = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(button->eventFilterObject()));
  +            RenderLayer *layer = w->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(w->absoluteBoundingBoxRect());
           }
           if (button) {
               QFocusEvent event(QEvent::FocusIn);
  
  
  
  1.59.8.2  +9 -2      WebCore/kwq/KWQComboBox.mm
  
  Index: KWQComboBox.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQComboBox.mm,v
  retrieving revision 1.59.8.1
  retrieving revision 1.59.8.2
  diff -u -r1.59.8.1 -r1.59.8.2
  --- KWQComboBox.mm	10 Nov 2005 23:02:31 -0000	1.59.8.1
  +++ KWQComboBox.mm	12 Nov 2005 01:57:44 -0000	1.59.8.2
  @@ -29,13 +29,17 @@
   #import "KWQButton.h"
   #import "KWQExceptions.h"
   #import "KWQKHTMLPart.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQFoundationExtras.h"
   #import "KWQView.h"
   #import "WebCoreBridge.h"
   #import "WebCoreTextRenderer.h"
   #import "WebCoreTextRendererFactory.h"
   
  +#import "render_form.h"
  +
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
  +
   @interface NSCell (KWQComboBoxKnowsAppKitSecrets)
   - (NSMutableDictionary *)_textAttributes;
   @end
  @@ -468,7 +472,10 @@
           QWidget *widget = [self widget];
           if (widget) {
               if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(widget)) {
  -                [self _KWQ_scrollFrameToVisible];
  +                RenderWidget *w = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(widget->eventFilterObject()));
  +                RenderLayer *layer = w->enclosingLayer();
  +                if (layer)
  +                    layer->scrollRectToVisible(w->absoluteBoundingBoxRect());
               }
               QFocusEvent event(QEvent::FocusIn);
               const_cast<QObject *>(widget->eventFilterObject())->eventFilter(widget, &event);
  
  
  
  1.26.6.1  +9 -2      WebCore/kwq/KWQFileButton.mm
  
  Index: KWQFileButton.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQFileButton.mm,v
  retrieving revision 1.26
  retrieving revision 1.26.6.1
  diff -u -r1.26 -r1.26.6.1
  --- KWQFileButton.mm	19 Mar 2005 00:34:07 -0000	1.26
  +++ KWQFileButton.mm	12 Nov 2005 01:57:44 -0000	1.26.6.1
  @@ -28,9 +28,12 @@
   #import "KWQAssertions.h"
   #import "KWQExceptions.h"
   #import "KWQKHTMLPart.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQFoundationExtras.h"
   #import "WebCoreBridge.h"
  +#import "render_form.h"
  +
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
   
   @interface KWQFileButtonAdapter : NSObject <WebCoreFileButtonDelegate>
   {
  @@ -152,7 +155,11 @@
   {
       if (nowHasFocus) {
           if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(this)) {
  -            [getView() _KWQ_scrollFrameToVisible];
  +            RenderWidget *widget = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(eventFilterObject()));
  +            RenderLayer *layer = widget->enclosingLayer();
  +            layer = layer->renderer()->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(widget->absoluteBoundingBoxRect());
           }        
           QFocusEvent event(QEvent::FocusIn);
           const_cast<QObject *>(eventFilterObject())->eventFilter(this, &event);
  
  
  
  1.628.4.1 +23 -39    WebCore/kwq/KWQKHTMLPart.mm
  
  Index: KWQKHTMLPart.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQKHTMLPart.mm,v
  retrieving revision 1.628
  retrieving revision 1.628.4.1
  diff -u -r1.628 -r1.628.4.1
  --- KWQKHTMLPart.mm	19 Mar 2005 16:21:57 -0000	1.628
  +++ KWQKHTMLPart.mm	12 Nov 2005 01:57:44 -0000	1.628.4.1
  @@ -904,37 +904,14 @@
   
   void KWQKHTMLPart::jumpToSelection()
   {
  -    // Assumes that selection start will only ever be a text node. This is currently
  -    // true, but will it always be so?
       if (d->m_selection.start().isNotNull()) {
  -        RenderText *rt = dynamic_cast<RenderText *>(d->m_selection.start().node()->renderer());
  -        if (rt) {
  -            int x = 0, y = 0;
  -            rt->posOfChar(d->m_selection.start().offset(), x, y);
  -            // The -50 offset is copied from KHTMLPart::findTextNext, which sets the contents position
  -            // after finding a matched text string.
  -            d->m_view->setContentsPos(x - 50, y - 50);
  -        }
  -/*
  -        Something like this would fix <rdar://problem/3154293>: "Find Next should not scroll page if the next target is already visible"
  -
  -        I think this would be a better way to do this, to avoid needless horizontal scrolling,
  -        but it is not feasible until selectionRect() returns a tighter rect around the
  -        selected text.  Right now it works at element granularity.
  - 
  -        NSView *docView = d->m_view->getDocumentView();
  -
  -	KWQ_BLOCK_EXCEPTIONS;
  -        NSRect selRect = NSRect(selectionRect());
  -        NSRect visRect = [docView visibleRect];
  -        if (!NSContainsRect(visRect, selRect)) {
  -            // pad a bit so we overscroll slightly
  -            selRect = NSInsetRect(selRect, -10.0, -10.0);
  -            selRect = NSIntersectionRect(selRect, [docView bounds]);
  -            [docView scrollRectToVisible:selRect];
  +        if (selectionStart() && selectionStart()->renderer()) {
  +            RenderLayer *layer = selectionStart()->renderer()->enclosingLayer();
  +            if (layer) {
  +                ASSERT(!selectionEnd() || !selectionEnd()->renderer() || (selectionEnd()->renderer()->enclosingLayer() == layer));
  +                layer->scrollRectToVisible(selectionRect());
  +            }
           }
  -	KWQ_UNBLOCK_EXCEPTIONS;
  -*/
       }
   }
   
  @@ -1240,9 +1217,9 @@
           }
           else {
               doc->setFocusNode(node);
  -            if (view() && node->renderer() && !node->renderer()->isRoot()) {
  -                view()->ensureRectVisibleCentered(node->getRect());
  -            }
  +            if (node->renderer())
  +                node->renderer()->enclosingLayer()->scrollRectToVisible(node->getRect());
  +                
               [_bridge makeFirstResponder:[_bridge documentView]];
               return [_bridge documentView];
           }
  @@ -3364,21 +3341,28 @@
   
   void KWQKHTMLPart::centerSelectionInVisibleArea() const
   {
  +    QRect rect;
  +
       switch (selection().state()) {
           case Selection::NONE:
  -            break;
  +            return;
           case Selection::CARET: {
  -            if (view())
  -                // passing true forces centering even if selection is already exposed
  -                view()->ensureRectVisibleCentered(selection().caretRect(), true);
  +            rect = selection().caretRect();
               break;
           }
           case Selection::RANGE:
  -            if (view())
  -                // passing true forces centering even if selection is already exposed
  -                view()->ensureRectVisibleCentered(selectionRect(), true);
  +            rect = selectionRect();
               break;
       }
  +    
  +    ASSERT(d->m_selection.start().isNotNull());
  +    if (selectionStart() && selectionStart()->renderer()) {
  +        RenderLayer *layer = selectionStart()->renderer()->enclosingLayer();
  +        if (layer) {
  +            ASSERT(!selectionEnd() || !selectionEnd()->renderer() || (selectionEnd()->renderer()->enclosingLayer() == layer));
  +            layer->scrollRectToVisible(rect, RenderLayer::gAlignCenterAlways, RenderLayer::gAlignCenterAlways);
  +        }
  +    }
   }
   
   NSImage *KWQKHTMLPart::imageFromRect(NSRect rect) const
  
  
  
  1.51.6.2  +9 -2      WebCore/kwq/KWQListBox.mm
  
  Index: KWQListBox.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQListBox.mm,v
  retrieving revision 1.51.6.1
  retrieving revision 1.51.6.2
  diff -u -r1.51.6.1 -r1.51.6.2
  --- KWQListBox.mm	10 Nov 2005 23:02:32 -0000	1.51.6.1
  +++ KWQListBox.mm	12 Nov 2005 01:57:44 -0000	1.51.6.2
  @@ -28,13 +28,17 @@
   #import "KWQAssertions.h"
   #import "KWQExceptions.h"
   #import "KWQKHTMLPart.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQView.h"
   #import "WebCoreBridge.h"
   #import "WebCoreScrollView.h"
   #import "WebCoreTextRenderer.h"
   #import "WebCoreTextRendererFactory.h"
   
  +#import "render_form.h"
  +
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
  +
   @interface NSTableView (KWQListBoxKnowsAppKitSecrets)
   - (NSCell *)_accessibilityTableCell:(int)row tableColumn:(NSTableColumn *)tableColumn;
   @end
  @@ -464,7 +468,10 @@
       
       if (become) {
           if (_box && !KWQKHTMLPart::currentEventIsMouseDownInWidget(_box)) {
  -            [self _KWQ_scrollFrameToVisible];
  +            RenderWidget *widget = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(_box->eventFilterObject()));
  +            RenderLayer *layer = widget->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(widget->absoluteBoundingBoxRect());
           }        
   	[self _KWQ_setKeyboardFocusRingNeedsDisplay];
   
  
  
  
  1.39.6.1  +0 -5      WebCore/kwq/KWQScrollView.h
  
  Index: KWQScrollView.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQScrollView.h,v
  retrieving revision 1.39
  retrieving revision 1.39.6.1
  diff -u -r1.39 -r1.39.6.1
  --- KWQScrollView.h	14 Dec 2004 00:10:18 -0000	1.39
  +++ KWQScrollView.h	12 Nov 2005 01:57:44 -0000	1.39.6.1
  @@ -50,7 +50,6 @@
       void scrollBy(int dx, int dy);
   
       void setContentsPos(int x, int y);
  -    void setContentsPosRecursive(int,int);
   
       virtual void setVScrollBarMode(ScrollBarMode vMode);
       virtual void setHScrollBarMode(ScrollBarMode hMode);
  @@ -88,10 +87,6 @@
       void setStaticBackground(bool);
   
       void resizeEvent(QResizeEvent *);
  -
  -    void ensureVisible(int,int);
  -    void ensureVisible(int,int,int,int);
  -    void ensureRectVisibleCentered(const QRect &r, bool forceCentering=false);
           
       NSView *getDocumentView() const;
   
  
  
  
  1.80.6.1  +0 -37     WebCore/kwq/KWQScrollView.mm
  
  Index: KWQScrollView.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQScrollView.mm,v
  retrieving revision 1.80
  retrieving revision 1.80.6.1
  diff -u -r1.80 -r1.80.6.1
  --- KWQScrollView.mm	14 Dec 2004 00:10:18 -0000	1.80
  +++ KWQScrollView.mm	12 Nov 2005 01:57:44 -0000	1.80.6.1
  @@ -27,7 +27,6 @@
   
   #import "KWQExceptions.h"
   #import "KWQLogging.h"
  -#import "KWQNSViewExtras.h"
   #import "WebCoreFrameView.h"
   
   /*
  @@ -444,42 +443,6 @@
   {
   }
   
  -void QScrollView::setContentsPosRecursive(int x, int y)
  -{
  -    KWQ_BLOCK_EXCEPTIONS;
  -    [getDocumentView() _KWQ_scrollPointRecursive:NSMakePoint(x, y)];
  -    KWQ_UNBLOCK_EXCEPTIONS;
  -}
  -
  -void QScrollView::ensureVisible(int x, int y)
  -{
  -    // Note that the definition of ensureVisible in trolltech documentation says:
  -    // "Scrolls the content so that the point (x, y) is visible with at least 
  -    // 50-pixel margins (if possible, otherwise centered).", which is
  -    // not what we're doing here.
  -    KWQ_BLOCK_EXCEPTIONS;
  -    [getDocumentView() scrollRectToVisible:NSMakeRect(x, y, 0, 0)];
  -    KWQ_UNBLOCK_EXCEPTIONS;
  -}
  -
  -void QScrollView::ensureVisible(int x, int y, int xmargin, int ymargin)
  -{
  -    // Note that the definition of ensureVisible in trolltech documentation says:
  -    // "Scrolls the content so that the point (x, y) is visible with at least the 
  -    // xmargin and ymargin margins (if possible, otherwise centered).", which is
  -    // not what we're doing here.
  -    KWQ_BLOCK_EXCEPTIONS;
  -    [getDocumentView() scrollRectToVisible:NSMakeRect(x, y, xmargin, ymargin)];
  -    KWQ_UNBLOCK_EXCEPTIONS;
  -}
  -
  -void QScrollView::ensureRectVisibleCentered(const QRect &rect, bool forceCentering)
  -{
  -    KWQ_BLOCK_EXCEPTIONS;
  -    [getDocumentView() _KWQ_scrollRectToVisible:NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()) forceCentering:forceCentering];
  -    KWQ_UNBLOCK_EXCEPTIONS;
  -}
  -
   NSView *QScrollView::getDocumentView() const
   {
       id view = getView();
  
  
  
  1.8.6.1   +8 -2      WebCore/kwq/KWQSlider.mm
  
  Index: KWQSlider.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQSlider.mm,v
  retrieving revision 1.8
  retrieving revision 1.8.6.1
  diff -u -r1.8 -r1.8.6.1
  --- KWQSlider.mm	3 Mar 2005 00:58:35 -0000	1.8
  +++ KWQSlider.mm	12 Nov 2005 01:57:44 -0000	1.8.6.1
  @@ -28,9 +28,12 @@
   #import "KWQButton.h"
   #import "KWQExceptions.h"
   #import "KWQKHTMLPart.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQView.h"
   #import "WebCoreBridge.h"
  +#import "render_form.h"
  +
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
   
   @interface KWQSlider : NSSlider <KWQWidgetHolder>
   {
  @@ -99,7 +102,10 @@
       BOOL become = [super becomeFirstResponder];
       if (become && slider) {
           if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(slider)) {
  -            [self _KWQ_scrollFrameToVisible];
  +            RenderWidget *widget = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(slider->eventFilterObject()));
  +            RenderLayer *layer = widget->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(widget->absoluteBoundingBoxRect());
           }
   
           if (slider) {
  
  
  
  1.72.6.5  +5 -2      WebCore/kwq/KWQTextArea.mm
  
  Index: KWQTextArea.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextArea.mm,v
  retrieving revision 1.72.6.4
  retrieving revision 1.72.6.5
  diff -u -r1.72.6.4 -r1.72.6.5
  --- KWQTextArea.mm	11 Nov 2005 16:40:32 -0000	1.72.6.4
  +++ KWQTextArea.mm	12 Nov 2005 01:57:45 -0000	1.72.6.5
  @@ -26,7 +26,6 @@
   #import "KWQTextArea.h"
   
   #import "KWQKHTMLPart.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQTextEdit.h"
   #import "render_replaced.h"
   #import "WebCoreBridge.h"
  @@ -34,6 +33,7 @@
   using DOM::EventImpl;
   using DOM::NodeImpl;
   using khtml::RenderWidget;
  +using khtml::RenderLayer;
   
   @interface NSTextView (WebCoreKnowsCertainAppKitSecrets)
   - (void)setWantsNotificationForMarkedText:(BOOL)wantsNotification;
  @@ -747,7 +747,10 @@
               [self selectAll:nil];
           }
           if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(widget)) {
  -            [[self enclosingScrollView] _KWQ_scrollFrameToVisible];
  +            RenderWidget *w = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(widget->eventFilterObject()));
  +            RenderLayer *layer = w->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(w->absoluteBoundingBoxRect());
           }
   	[self _KWQ_setKeyboardFocusRingNeedsDisplay];
   
  
  
  
  1.77.6.2  +10 -3     WebCore/kwq/KWQTextField.mm
  
  Index: KWQTextField.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextField.mm,v
  retrieving revision 1.77.6.1
  retrieving revision 1.77.6.2
  diff -u -r1.77.6.1 -r1.77.6.2
  --- KWQTextField.mm	11 Nov 2005 16:40:33 -0000	1.77.6.1
  +++ KWQTextField.mm	12 Nov 2005 01:57:45 -0000	1.77.6.2
  @@ -28,9 +28,12 @@
   #import "KWQAssertions.h"
   #import "KWQKHTMLPart.h"
   #import "KWQLineEdit.h"
  -#import "KWQNSViewExtras.h"
   #import "KWQView.h"
   #import "WebCoreBridge.h"
  +#import "render_form.h"
  +
  +using khtml::RenderWidget;
  +using khtml::RenderLayer;
   
   @interface NSString (KWQTextField)
   - (int)_KWQ_numComposedCharacterSequences;
  @@ -411,8 +414,12 @@
           if (lastSelectedRange.location != NSNotFound)
               [self setSelectedRange:lastSelectedRange];
           
  -        if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(widget))
  -            [field _KWQ_scrollFrameToVisible];
  +        if (!KWQKHTMLPart::currentEventIsMouseDownInWidget(widget)) {
  +            RenderWidget *w = const_cast<RenderWidget *> (static_cast<const RenderWidget *>(widget->eventFilterObject()));
  +            RenderLayer *layer = w->enclosingLayer();
  +            if (layer)
  +                layer->scrollRectToVisible(w->absoluteBoundingBoxRect());
  +        }
           
           if (widget) {
               QFocusEvent event(QEvent::FocusIn);
  
  
  
  1.383.6.3 +4 -3      WebCore/kwq/WebCoreBridge.mm
  
  Index: WebCoreBridge.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/WebCoreBridge.mm,v
  retrieving revision 1.383.6.2
  retrieving revision 1.383.6.3
  diff -u -r1.383.6.2 -r1.383.6.3
  --- WebCoreBridge.mm	14 Jul 2005 19:51:19 -0000	1.383.6.2
  +++ WebCoreBridge.mm	12 Nov 2005 01:57:45 -0000	1.383.6.3
  @@ -122,6 +122,7 @@
   using khtml::parseURL;
   using khtml::RenderCanvas;
   using khtml::RenderImage;
  +using khtml::RenderLayer;
   using khtml::RenderObject;
   using khtml::RenderPart;
   using khtml::RenderStyle;
  @@ -2120,9 +2121,9 @@
           return;
       
       QRect extentRect = renderer->caretRect(extent.offset(), _part->selection().extentAffinity());
  -    if (!NSContainsRect([documentView visibleRect], NSRect(extentRect))) {
  -        v->ensureRectVisibleCentered(extentRect, true);
  -    }
  +    RenderLayer *layer = renderer->enclosingLayer();
  +    if (layer)
  +        layer->scrollRectToVisible(extentRect);
   }
   
   // [info draggingLocation] is in window coords
  
  
  



More information about the webkit-changes mailing list