Home | History | Annotate | Download | only in platform
      1 /*
      2  * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
      3  * Copyright (C) 2013 Google Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "config.h"
     28 #include "core/platform/Widget.h"
     29 
     30 #include "core/platform/HostWindow.h"
     31 #include "core/platform/ScrollView.h"
     32 #include "core/platform/graphics/IntRect.h"
     33 
     34 #include "wtf/Assertions.h"
     35 
     36 namespace WebCore {
     37 
     38 Widget::Widget()
     39     : m_parent(0)
     40     , m_selfVisible(false)
     41     , m_parentVisible(false)
     42 {
     43 }
     44 
     45 Widget::~Widget()
     46 {
     47     ASSERT(!parent());
     48 }
     49 
     50 void Widget::setCursor(const Cursor& cursor)
     51 {
     52     if (ScrollView* view = root())
     53         view->hostWindow()->setCursor(cursor);
     54 }
     55 
     56 void Widget::removeFromParent()
     57 {
     58     if (parent())
     59         parent()->removeChild(this);
     60 }
     61 
     62 void Widget::setParent(ScrollView* view)
     63 {
     64     ASSERT(!view || !m_parent);
     65     if (!view || !view->isVisible())
     66         setParentVisible(false);
     67     m_parent = view;
     68     if (view && view->isVisible())
     69         setParentVisible(true);
     70 }
     71 
     72 ScrollView* Widget::root() const
     73 {
     74     const Widget* top = this;
     75     while (top->parent())
     76         top = top->parent();
     77     if (top->isFrameView())
     78         return const_cast<ScrollView*>(static_cast<const ScrollView*>(top));
     79     return 0;
     80 }
     81 
     82 IntRect Widget::convertFromRootView(const IntRect& rootRect) const
     83 {
     84     if (const ScrollView* parentScrollView = parent()) {
     85         IntRect parentRect = parentScrollView->convertFromRootView(rootRect);
     86         return convertFromContainingView(parentRect);
     87     }
     88     return rootRect;
     89 }
     90 
     91 IntRect Widget::convertToRootView(const IntRect& localRect) const
     92 {
     93     if (const ScrollView* parentScrollView = parent()) {
     94         IntRect parentRect = convertToContainingView(localRect);
     95         return parentScrollView->convertToRootView(parentRect);
     96     }
     97     return localRect;
     98 }
     99 
    100 IntPoint Widget::convertFromRootView(const IntPoint& rootPoint) const
    101 {
    102     if (const ScrollView* parentScrollView = parent()) {
    103         IntPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
    104         return convertFromContainingView(parentPoint);
    105     }
    106     return rootPoint;
    107 }
    108 
    109 IntPoint Widget::convertToRootView(const IntPoint& localPoint) const
    110 {
    111     if (const ScrollView* parentScrollView = parent()) {
    112         IntPoint parentPoint = convertToContainingView(localPoint);
    113         return parentScrollView->convertToRootView(parentPoint);
    114     }
    115     return localPoint;
    116 }
    117 
    118 IntRect Widget::convertFromContainingWindow(const IntRect& windowRect) const
    119 {
    120     if (const ScrollView* parentScrollView = parent()) {
    121         IntRect parentRect = parentScrollView->convertFromContainingWindow(windowRect);
    122         return convertFromContainingView(parentRect);
    123     }
    124     return windowRect;
    125 }
    126 
    127 IntRect Widget::convertToContainingWindow(const IntRect& localRect) const
    128 {
    129     if (const ScrollView* parentScrollView = parent()) {
    130         IntRect parentRect = convertToContainingView(localRect);
    131         return parentScrollView->convertToContainingWindow(parentRect);
    132     }
    133     return localRect;
    134 }
    135 
    136 IntPoint Widget::convertFromContainingWindow(const IntPoint& windowPoint) const
    137 {
    138     if (const ScrollView* parentScrollView = parent()) {
    139         IntPoint parentPoint = parentScrollView->convertFromContainingWindow(windowPoint);
    140         return convertFromContainingView(parentPoint);
    141     }
    142     return windowPoint;
    143 }
    144 
    145 IntPoint Widget::convertToContainingWindow(const IntPoint& localPoint) const
    146 {
    147     if (const ScrollView* parentScrollView = parent()) {
    148         IntPoint parentPoint = convertToContainingView(localPoint);
    149         return parentScrollView->convertToContainingWindow(parentPoint);
    150     }
    151     return localPoint;
    152 }
    153 
    154 IntRect Widget::convertToContainingView(const IntRect& localRect) const
    155 {
    156     if (const ScrollView* parentScrollView = parent()) {
    157         IntRect parentRect(localRect);
    158         parentRect.setLocation(parentScrollView->convertChildToSelf(this, localRect.location()));
    159         return parentRect;
    160     }
    161     return localRect;
    162 }
    163 
    164 IntRect Widget::convertFromContainingView(const IntRect& parentRect) const
    165 {
    166     if (const ScrollView* parentScrollView = parent()) {
    167         IntRect localRect = parentRect;
    168         localRect.setLocation(parentScrollView->convertSelfToChild(this, localRect.location()));
    169         return localRect;
    170     }
    171 
    172     return parentRect;
    173 }
    174 
    175 IntPoint Widget::convertToContainingView(const IntPoint& localPoint) const
    176 {
    177     if (const ScrollView* parentScrollView = parent())
    178         return parentScrollView->convertChildToSelf(this, localPoint);
    179 
    180     return localPoint;
    181 }
    182 
    183 IntPoint Widget::convertFromContainingView(const IntPoint& parentPoint) const
    184 {
    185     if (const ScrollView* parentScrollView = parent())
    186         return parentScrollView->convertSelfToChild(this, parentPoint);
    187 
    188     return parentPoint;
    189 }
    190 
    191 } // namespace WebCore
    192