| /* |
| * Copyright (C) 2005, 2006, 2007, 2008, 2009 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "WKViewPrivate.h" |
| |
| #if PLATFORM(IOS_FAMILY) |
| |
| #import "WAKViewInternal.h" |
| #import "WAKWindow.h" |
| #import "WKUtilities.h" |
| #import <wtf/Assertions.h> |
| |
| void _WKViewSetSuperview (WKViewRef view, WKViewRef superview) |
| { |
| // Not retained. |
| view->superview = superview; |
| } |
| |
| void _WKViewWillRemoveSubview(WKViewRef view, WKViewRef subview) |
| { |
| if (view->context && view->context->willRemoveSubviewCallback) |
| view->context->willRemoveSubviewCallback(view, subview); |
| } |
| |
| void _WKViewSetWindow (WKViewRef view, WAKWindow *window) |
| { |
| if (view->window == window) |
| return; |
| |
| [window retain]; |
| [view->window release]; |
| |
| view->window = window; |
| |
| // Set the window on all subviews. |
| WKViewRef firstChild = WKViewFirstChild(view); |
| if (firstChild) { |
| _WKViewSetWindow (firstChild, window); |
| WKViewRef nextSibling = WKViewNextSibling(firstChild); |
| while (nextSibling) { |
| _WKViewSetWindow (nextSibling, window); |
| nextSibling = WKViewNextSibling(nextSibling); |
| } |
| } |
| |
| if (view->context && view->context->notificationCallback) |
| view->context->notificationCallback (view, WKViewNotificationViewDidMoveToWindow, view->context->notificationUserInfo); |
| } |
| |
| static void _WKViewClearSuperview(const void *value, void *context) |
| { |
| UNUSED_PARAM(context); |
| _WKViewSetSuperview(static_cast<WKViewRef>(const_cast<void*>(value)), 0); |
| } |
| |
| static void _WKViewDealloc (WKObjectRef v) |
| { |
| WKViewRef view = (WKViewRef)v; |
| |
| if (view->subviews) { |
| CFArrayApplyFunction(view->subviews, CFRangeMake(0, CFArrayGetCount(view->subviews)), _WKViewClearSuperview, NULL); |
| CFRelease (view->subviews); |
| view->subviews = 0; |
| } |
| |
| [view->window release]; |
| view->window = nil; |
| } |
| |
| void WKViewInitialize (WKViewRef view, CGRect frame, WKViewContext *context) |
| { |
| view->origin = frame.origin; |
| view->bounds.origin = CGPointZero; |
| view->bounds.size = frame.size; |
| |
| view->context = context; |
| view->autoresizingMask = NSViewNotSizable; |
| view->scale = 1.0f; |
| } |
| |
| WKClassInfo WKViewClassInfo = { &WKObjectClass, "WKView", _WKViewDealloc }; |
| |
| WKViewRef WKViewCreateWithFrame (CGRect frame, WKViewContext *context) |
| { |
| WKViewRef view = static_cast<WKViewRef>(const_cast<void*>(WKCreateObjectWithSize(sizeof(struct _WKView), &WKViewClassInfo))); |
| if (!view) |
| return 0; |
| |
| WKViewInitialize (view, frame, context); |
| |
| return view; |
| } |
| |
| void _WKViewSetViewContext (WKViewRef view, WKViewContext *context) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| view->context = context; |
| } |
| |
| CGRect WKViewGetBounds (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| return view->bounds; |
| } |
| |
| CGRect WKViewGetFrame (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| return WKViewConvertRectToSuperview(view, view->bounds); |
| } |
| |
| CGPoint WKViewGetOrigin(WKViewRef view) |
| { |
| if (!view) { |
| WKError("invalid parameter"); |
| return CGPointZero; |
| } |
| |
| return view->origin; |
| } |
| |
| static void _WKViewRecursivelyInvalidateGState(WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| |
| if (view->context && view->context->invalidateGStateCallback) |
| view->context->invalidateGStateCallback(view); |
| |
| WKViewRef subview = WKViewFirstChild(view); |
| while (subview) { |
| _WKViewRecursivelyInvalidateGState(subview); |
| subview = WKViewNextSibling(subview); |
| } |
| } |
| |
| void WKViewSetFrameOrigin (WKViewRef view, CGPoint newOrigin) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| |
| ASSERT(!isinf(newOrigin.x)); |
| ASSERT(!isnan(newOrigin.x)); |
| ASSERT(!isinf(newOrigin.y)); |
| ASSERT(!isnan(newOrigin.y)); |
| |
| if (!CGPointEqualToPoint(view->origin, newOrigin)) { |
| view->origin = newOrigin; |
| _WKViewRecursivelyInvalidateGState(view); |
| } |
| } |
| |
| #define XSIZING_BITS(mask) ((mask) & 7) |
| #define YSIZING_BITS(mask) (((mask) >> 3) & 7) |
| |
| static void _WKViewAutoresizeCoord(bool bByHeight, unsigned int sizingMethod, const CGRect *origSuperFrame, const CGRect *newSuperFrame, CGRect *newFrame) |
| { |
| CGFloat origSuperFrameWidthOrHeight; |
| CGFloat newSuperFrameWidthOrHeight; |
| CGFloat *origFrameXorY; |
| CGFloat *origFrameWidthOrHeight; |
| CGFloat prop; |
| CGFloat tmp; |
| CGFloat xOrY; |
| CGFloat widthOrHeight; |
| CGFloat origMarginsTotal; |
| CGFloat origWidthMinusMinMargin; |
| |
| if (bByHeight) { |
| sizingMethod = YSIZING_BITS(sizingMethod); |
| origSuperFrameWidthOrHeight = origSuperFrame->size.height; |
| newSuperFrameWidthOrHeight = newSuperFrame->size.height; |
| origFrameXorY = &newFrame->origin.y; |
| origFrameWidthOrHeight = &newFrame->size.height; |
| } else { |
| sizingMethod = XSIZING_BITS(sizingMethod); |
| origSuperFrameWidthOrHeight = origSuperFrame->size.width; |
| newSuperFrameWidthOrHeight = newSuperFrame->size.width; |
| origFrameXorY = &newFrame->origin.x; |
| origFrameWidthOrHeight = &newFrame->size.width; |
| } |
| |
| xOrY = *origFrameXorY; |
| widthOrHeight = *origFrameWidthOrHeight; |
| |
| switch (sizingMethod) { |
| case NSViewNotSizable: |
| case NSViewMaxXMargin: |
| break; |
| case NSViewWidthSizable: |
| widthOrHeight = newSuperFrameWidthOrHeight - (origSuperFrameWidthOrHeight - widthOrHeight); |
| if (widthOrHeight < 0.0f) |
| widthOrHeight = 0.0f; |
| break; |
| case NSViewWidthSizable | NSViewMaxXMargin: |
| origWidthMinusMinMargin = origSuperFrameWidthOrHeight - xOrY; |
| if (widthOrHeight) { |
| if (origWidthMinusMinMargin != 0.0f) { |
| prop = widthOrHeight / origWidthMinusMinMargin; |
| } else { |
| prop = 0.0f; |
| } |
| } else { |
| prop = 1.0f; |
| } |
| widthOrHeight = ((newSuperFrameWidthOrHeight - xOrY)) * prop; |
| if (widthOrHeight < 0.0f) |
| widthOrHeight = 0.0f; |
| break; |
| case NSViewMinXMargin: |
| xOrY = newSuperFrameWidthOrHeight - (origSuperFrameWidthOrHeight - xOrY); |
| if (xOrY < 0.0f) |
| xOrY = 0.0f; |
| break; |
| case NSViewMinXMargin | NSViewMaxXMargin: |
| origMarginsTotal = origSuperFrameWidthOrHeight - widthOrHeight; |
| if (xOrY && origMarginsTotal != 0.0f) { |
| prop = xOrY / origMarginsTotal; |
| } |
| // Do the 50/50 split even if XorY = 0 and the WidthOrHeight is only |
| // one pixel shorter... |
| // FIXME: If origMarginsTotal is in the range (0, 1) then we won't do the 50/50 split. Is this right? |
| else if (origMarginsTotal == 0.0f |
| || (abs(static_cast<int>(origMarginsTotal)) == 1)) { |
| prop = 0.5f; // Then split it 50:50. |
| } |
| else { |
| prop = 1.0f; |
| } |
| xOrY = ((newSuperFrameWidthOrHeight - widthOrHeight)) * prop; |
| if (xOrY < 0.0f) |
| xOrY = 0.0f; |
| break; |
| case NSViewMinXMargin | NSViewWidthSizable: |
| tmp = xOrY + widthOrHeight; |
| if (tmp) |
| prop = xOrY / tmp; |
| else |
| prop = 0.5f; |
| xOrY = ((newSuperFrameWidthOrHeight - (origSuperFrameWidthOrHeight - tmp))) * prop; |
| widthOrHeight = newSuperFrameWidthOrHeight - (xOrY + (origSuperFrameWidthOrHeight - tmp)); |
| if (xOrY < 0.0f) |
| xOrY = 0.0f; |
| if (widthOrHeight < 0.0f) |
| widthOrHeight = 0.0f; |
| break; |
| case NSViewMinXMargin | NSViewWidthSizable | NSViewMaxXMargin: |
| if (origSuperFrameWidthOrHeight) |
| prop = xOrY / origSuperFrameWidthOrHeight; |
| else |
| prop = 1.0f / 3.0f; |
| xOrY = (newSuperFrameWidthOrHeight * prop); |
| if (origSuperFrameWidthOrHeight) |
| prop = widthOrHeight / origSuperFrameWidthOrHeight; |
| else |
| prop = 1.0f / 3.0f; |
| widthOrHeight = (newSuperFrameWidthOrHeight * prop); |
| break; |
| } |
| |
| *origFrameXorY = floorf(xOrY); |
| *origFrameWidthOrHeight = floorf(widthOrHeight); |
| } |
| |
| void _WKViewAutoresize(WKViewRef view, const CGRect *oldSuperFrame, const CGRect *newSuperFrame) |
| { |
| if (view->autoresizingMask != NSViewNotSizable) { |
| CGRect newFrame = WKViewGetFrame(view); |
| _WKViewAutoresizeCoord(false, view->autoresizingMask, oldSuperFrame, newSuperFrame, &newFrame); |
| _WKViewAutoresizeCoord(true, view->autoresizingMask, oldSuperFrame, newSuperFrame, &newFrame); |
| WKViewSetFrameOrigin(view, newFrame.origin); |
| WKViewSetFrameSize(view, newFrame.size); |
| } |
| } |
| |
| static void _WKViewAutoresizeChildren(WKViewRef view, const CGRect *oldSuperFrame, const CGRect *newSuperFrame) |
| { |
| WKViewRef child; |
| for (child = WKViewFirstChild(view); child != NULL; child = WKViewNextSibling(child)) { |
| _WKViewAutoresize(child, oldSuperFrame, newSuperFrame); |
| } |
| } |
| |
| void WKViewSetFrameSize (WKViewRef view, CGSize newSize) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| |
| ASSERT(!isinf(newSize.width)); |
| ASSERT(!isnan(newSize.width)); |
| ASSERT(!isinf(newSize.height)); |
| ASSERT(!isnan(newSize.height)); |
| |
| CGRect frame; |
| frame.origin = CGPointZero; |
| frame.size = newSize; |
| CGSize boundsSize = WKViewConvertRectFromSuperview(view, frame).size; |
| WKViewSetBoundsSize(view, boundsSize); |
| } |
| |
| void WKViewSetBoundsSize (WKViewRef view, CGSize newSize) |
| { |
| if (CGSizeEqualToSize(view->bounds.size, newSize)) |
| return; |
| |
| CGRect oldFrame = WKViewGetFrame(view); |
| view->bounds.size = newSize; |
| CGRect newFrame = WKViewGetFrame(view); |
| |
| if (view->context && view->context->notificationCallback) |
| view->context->notificationCallback (view, WKViewNotificationViewFrameSizeChanged, view->context->notificationUserInfo); |
| |
| _WKViewAutoresizeChildren(view, &oldFrame, &newFrame); |
| _WKViewRecursivelyInvalidateGState(view); |
| } |
| |
| void WKViewSetBoundsOrigin(WKViewRef view, CGPoint newOrigin) |
| { |
| if (CGPointEqualToPoint(view->bounds.origin, newOrigin)) |
| return; |
| |
| view->bounds.origin = newOrigin; |
| |
| _WKViewRecursivelyInvalidateGState(view); |
| } |
| |
| void WKViewSetScale(WKViewRef view, float scale) |
| { |
| ASSERT(!isinf(scale)); |
| ASSERT(!isnan(scale)); |
| |
| if (view->scale == scale) |
| return; |
| |
| view->scale = scale; |
| |
| if (view->context && view->context->notificationCallback) |
| view->context->notificationCallback (view, WKViewNotificationViewFrameSizeChanged, view->context->notificationUserInfo); |
| } |
| |
| float WKViewGetScale(WKViewRef view) |
| { |
| return view->scale; |
| } |
| |
| WAKWindow *WKViewGetWindow (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| |
| return view->window; |
| } |
| |
| CFArrayRef WKViewGetSubviews (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| |
| return view->subviews; |
| } |
| |
| void WKViewAddSubview (WKViewRef view, WKViewRef subview) |
| { |
| if (!view || !subview) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| |
| if (!view->subviews) { |
| view->subviews = CFArrayCreateMutable(NULL, 0, &WKCollectionArrayCallBacks); |
| } |
| CFArrayAppendValue (view->subviews, subview); |
| _WKViewSetSuperview (subview, view); |
| |
| // Set the window on subview and all it's children. |
| _WKViewSetWindow (subview, view->window); |
| } |
| |
| void WKViewRemoveFromSuperview (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| |
| _WKViewSetWindow (view, 0); |
| |
| if (!view->superview) { |
| return; |
| } |
| |
| CFMutableArrayRef svs = view->superview->subviews; |
| if (!svs) { |
| WKError ("superview has no subviews"); |
| return; |
| } |
| |
| CFIndex index = WKArrayIndexOfValue (svs, view); |
| if (index < 0) { |
| WKError ("view not in superview subviews"); |
| return; |
| } |
| |
| _WKViewWillRemoveSubview(view->superview, view); |
| |
| CFArrayRemoveValueAtIndex (svs, index); |
| |
| _WKViewSetSuperview (view, 0); |
| } |
| |
| WKViewRef WKViewFirstChild (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| |
| CFArrayRef sv = view->subviews; |
| |
| if (!sv) |
| return 0; |
| |
| CFIndex count = CFArrayGetCount (sv); |
| if (!count) |
| return 0; |
| |
| return static_cast<WKViewRef>(const_cast<void*>(CFArrayGetValueAtIndex(sv, 0))); |
| } |
| |
| WKViewRef WKViewNextSibling (WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| |
| if (!view->superview) |
| return 0; |
| |
| CFArrayRef svs = view->superview->subviews; |
| if (!svs) |
| return 0; |
| |
| CFIndex thisIndex = WKArrayIndexOfValue (svs, view); |
| if (thisIndex < 0) { |
| WKError ("internal error, view is not present in superview subviews"); |
| return 0; |
| } |
| |
| CFIndex count = CFArrayGetCount (svs); |
| if (thisIndex+1 >= count) |
| return 0; |
| |
| return static_cast<WKViewRef>(const_cast<void*>(CFArrayGetValueAtIndex(svs, thisIndex + 1))); |
| } |
| |
| // To remove, see: <rdar://problem/10360425> Remove WKViewTraverseNext from Skankphone |
| WKViewRef WKViewTraverseNext(WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| |
| WKViewRef firstChild = WKViewFirstChild(view); |
| if (firstChild) |
| return firstChild; |
| |
| WKViewRef nextSibling = WKViewNextSibling(view); |
| if (nextSibling) |
| return nextSibling; |
| |
| while (view && !WKViewNextSibling(view)) { |
| WAKView *wakView = WAKViewForWKViewRef(view); |
| WAKView *superView = [wakView superview]; |
| view = [superView _viewRef]; |
| } |
| |
| if (view) |
| return WKViewNextSibling(view); |
| |
| return 0; |
| } |
| |
| CGAffineTransform _WKViewGetTransform(WKViewRef view) |
| { |
| CGAffineTransform transform; |
| transform = CGAffineTransformMakeTranslation(view->origin.x, view->origin.y); |
| transform = CGAffineTransformScale(transform, view->scale, view->scale); |
| transform = CGAffineTransformTranslate(transform, -view->bounds.origin.x, -view->bounds.origin.y); |
| return transform; |
| } |
| |
| CGRect WKViewGetVisibleRect(WKViewRef viewRef) |
| { |
| if (!viewRef) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| WKViewRef view = viewRef; |
| CGRect rect = WKViewGetBounds(view); |
| WKViewRef superview = view->superview; |
| |
| while (superview != NULL) { |
| rect = WKViewConvertRectToSuperview(view, rect); |
| rect = CGRectIntersection(WKViewGetBounds(superview), rect); |
| view = superview; |
| superview = superview->superview; |
| } |
| |
| if (view != viewRef) { |
| rect = WKViewConvertRectToBase(view, rect); |
| rect = WKViewConvertRectFromBase(viewRef, rect); |
| } |
| |
| return rect; |
| } |
| |
| CGRect WKViewConvertRectToSuperview(WKViewRef view, CGRect r) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| return CGRectApplyAffineTransform(r, _WKViewGetTransform(view)); |
| } |
| |
| CGRect WKViewConvertRectToBase(WKViewRef view, CGRect r) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| CGRect aRect = r; |
| |
| while (view) { |
| aRect = WKViewConvertRectToSuperview (view, aRect); |
| view = view->superview; |
| } |
| |
| return aRect; |
| } |
| |
| CGPoint WKViewConvertPointToSuperview(WKViewRef view, CGPoint p) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGPointZero; |
| } |
| |
| return CGPointApplyAffineTransform(p, _WKViewGetTransform(view)); |
| } |
| |
| CGPoint WKViewConvertPointFromSuperview(WKViewRef view, CGPoint p) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGPointZero; |
| } |
| |
| CGAffineTransform transform = CGAffineTransformInvert(_WKViewGetTransform(view)); |
| return CGPointApplyAffineTransform(p, transform); |
| } |
| |
| CGPoint WKViewConvertPointToBase(WKViewRef view, CGPoint p) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGPointZero; |
| } |
| |
| CGPoint aPoint = p; |
| |
| while (view) { |
| aPoint = WKViewConvertPointToSuperview (view, aPoint); |
| view = view->superview; |
| } |
| |
| return aPoint; |
| } |
| |
| #define VIEW_ARRAY_SIZE 128 |
| |
| static void _WKViewGetAncestorViewsIncludingView (WKViewRef view, WKViewRef *views, unsigned maxViews, unsigned *viewCount) |
| { |
| unsigned count = 0; |
| |
| views[count++] = view; |
| WKViewRef superview = view->superview; |
| while (superview) { |
| views[count++] = superview; |
| if (count >= maxViews) { |
| WKError ("Exceeded maxViews, use malloc/realloc"); |
| *viewCount = 0; |
| return; |
| } |
| superview = superview->superview; |
| } |
| *viewCount = count; |
| } |
| |
| CGPoint WKViewConvertPointFromBase(WKViewRef view, CGPoint p) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGPointZero; |
| } |
| |
| WKViewRef views[VIEW_ARRAY_SIZE]; |
| unsigned viewCount = 0; |
| |
| _WKViewGetAncestorViewsIncludingView (view, views, VIEW_ARRAY_SIZE, &viewCount); |
| if (viewCount == 0) |
| return CGPointZero; |
| |
| CGPoint aPoint = p; |
| int i; |
| for (i = viewCount-1; i >= 0; i--) { |
| aPoint = WKViewConvertPointFromSuperview (views[i], aPoint); |
| } |
| |
| return aPoint; |
| } |
| |
| CGRect WKViewConvertRectFromSuperview(WKViewRef view, CGRect r) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| CGAffineTransform transform = CGAffineTransformInvert(_WKViewGetTransform(view)); |
| return CGRectApplyAffineTransform(r, transform); |
| } |
| |
| CGRect WKViewConvertRectFromBase(WKViewRef view, CGRect r) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return CGRectZero; |
| } |
| |
| WKViewRef views[VIEW_ARRAY_SIZE]; |
| unsigned viewCount = 0; |
| |
| _WKViewGetAncestorViewsIncludingView (view, views, VIEW_ARRAY_SIZE, &viewCount); |
| if (viewCount == 0) |
| return CGRectZero; |
| |
| CGRect aRect = r; |
| int i; |
| for (i = viewCount-1; i >= 0; i--) { |
| aRect = WKViewConvertRectFromSuperview (views[i], aRect); |
| } |
| |
| return aRect; |
| } |
| |
| bool WKViewAcceptsFirstResponder (WKViewRef view) |
| { |
| bool result = TRUE; |
| if (view && view->context && view->context->responderCallback) |
| result = view->context->responderCallback(view, WKViewResponderAcceptsFirstResponder, view->context->responderUserInfo); |
| return result; |
| } |
| |
| bool WKViewBecomeFirstResponder (WKViewRef view) |
| { |
| bool result = TRUE; |
| if (view && view->context && view->context->responderCallback) |
| result = view->context->responderCallback(view, WKViewResponderBecomeFirstResponder, view->context->responderUserInfo); |
| return result; |
| } |
| |
| bool WKViewResignFirstResponder (WKViewRef view) |
| { |
| bool result = TRUE; |
| if (view && view->context && view->context->responderCallback) |
| result = view->context->responderCallback(view, WKViewResponderResignFirstResponder, view->context->responderUserInfo); |
| return result; |
| } |
| |
| unsigned int WKViewGetAutoresizingMask(WKViewRef view) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return 0; |
| } |
| return view->autoresizingMask; |
| } |
| |
| void WKViewSetAutoresizingMask (WKViewRef view, unsigned int mask) |
| { |
| if (!view) { |
| WKError ("invalid parameter"); |
| return; |
| } |
| view->autoresizingMask = mask; |
| } |
| |
| #endif // PLATFORM(IOS_FAMILY) |