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