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