18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __LP64__
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HIWebView.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "CarbonWindowAdapter.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HIViewAdapter.h"
355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import "QuickDrawCompatibility.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKit.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h>
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import <objc/objc-runtime.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSWindow (AppKitSecretsHIWebViewKnows)
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removeWindowRef;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (AppKitSecretsHIWebViewKnows)
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_clearDirtyRectsForTree;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern "C" void HIWebViewRegisterClass();
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface MenuItemProxy : NSObject <NSValidatedUserInterfaceItem>
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int     _tag;
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL _action;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithAction:(SEL)action;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (SEL)action;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (int)tag;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation MenuItemProxy
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithAction:(SEL)action
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super init];
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (self == nil) return nil;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _action = action;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (SEL)action
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       return _action;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (int)tag
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct HIWebView
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HIViewRef							fViewRef;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView*							fWebView;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView*								fFirstResponder;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CarbonWindowAdapter	*				fKitWindow;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool								fIsComposited;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRunLoopObserverRef				fUpdateObserver;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct HIWebView HIWebView;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSAppKitPropertyCreator = 'akit';
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThese constants are not used. Commented out to make the compiler happy.
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlViewPropertyTag = 'view';
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlAutodisplayPropertyTag = 'autd';
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlFirstResponderViewPropertyTag = 'frvw';
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSCarbonWindowPropertyTag = 'win ';
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int typeByteCount = typeSInt32;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic SEL _NSSelectorForHICommand( const HICommand* hiCommand );
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const EventTypeSpec kEvents[] = {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassHIObject, kEventHIObjectConstruct },
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassHIObject, kEventHIObjectDestruct },
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassMouse, kEventMouseUp },
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassMouse, kEventMouseMoved },
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassMouse, kEventMouseDragged },
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassMouse, kEventMouseWheelMoved },
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassKeyboard, kEventRawKeyDown },
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassKeyboard, kEventRawKeyRepeat },
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassCommand, kEventCommandProcess },
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassCommand, kEventCommandUpdateStatus },
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlInitialize },
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlDraw },
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlHitTest },
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlGetPartRegion },
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlGetData },
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlBoundsChanged },
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlActivate },
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlDeactivate },
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlOwningWindowChanged },
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlClick },
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlContextualMenuClick },
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{ kEventClassControl, kEventControlSetFocusPart }
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define kHIViewBaseClassID		CFSTR( "com.apple.hiview" )
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define kHIWebViewClassID		CFSTR( "com.apple.HIWebView" )
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HIWebView*		HIWebViewConstructor( HIViewRef inView );
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				HIWebViewDestructor( HIWebView* view );
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			HIWebViewEventHandler(
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								EventHandlerCallRef	inCallRef,
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								EventRef			inEvent,
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								void *				inUserData );
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt32			GetBehaviors();
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlKind		GetKind();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				Draw( HIWebView* inView, RgnHandle limitRgn, CGContextRef inContext );
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlPartCode	HitTest( HIWebView* view, const HIPoint* where );
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			GetRegion( HIWebView* view, ControlPartCode inPart, RgnHandle outRgn );
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				BoundsChanged(
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								HIWebView*			inView,
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								UInt32				inOptions,
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								const HIRect*		inOriginalBounds,
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								const HIRect*		inCurrentBounds );
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				OwningWindowChanged(
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								HIWebView*			view,
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								WindowRef			oldWindow,
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								WindowRef			newWindow );
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				ActiveStateChanged( HIWebView* view );
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			Click( HIWebView* inView, EventRef inEvent );
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			ContextMenuClick( HIWebView* inView, EventRef inEvent );
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			MouseUp( HIWebView* inView, EventRef inEvent );
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			MouseMoved( HIWebView* inView, EventRef inEvent );
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			MouseDragged( HIWebView* inView, EventRef inEvent );
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			MouseWheelMoved( HIWebView* inView, EventRef inEvent );
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			ProcessCommand( HIWebView* inView, const HICommand* inCommand );
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			UpdateCommandStatus( HIWebView* inView, const HICommand* inCommand );
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			SetFocusPart(
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								HIWebView*				view,
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								ControlPartCode 		desiredFocus,
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								RgnHandle 				invalidRgn,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								Boolean 				focusEverything,
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								ControlPartCode* 		actualFocus );
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView*			AdvanceFocus( HIWebView* view, bool forward );
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				RelinquishFocus( HIWebView* view, bool inAutodisplay );
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WindowRef		GetWindowRef( HIWebView* inView );
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				SyncFrame( HIWebView* inView );
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus			WindowHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData );
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				StartUpdateObserver( HIWebView* view );
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void				StopUpdateObserver( HIWebView* view );
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void HIRectToQDRect( const HIRect* inRect, Rect* outRect )
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outRect->top = (SInt16)CGRectGetMinY( *inRect );
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outRect->left = (SInt16)CGRectGetMinX( *inRect );
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outRect->bottom = (SInt16)CGRectGetMaxY( *inRect );
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outRect->right = (SInt16)CGRectGetMaxX( *inRect );
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewCreate
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOSStatus
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewCreate(HIViewRef* outControl)
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HIWebViewRegisterClass();
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return HIObjectCreate(kHIWebViewClassID, NULL, (HIObjectRef*)outControl);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewGetWebView
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebView*
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewGetWebView( HIViewRef inView )
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView* 	view = (HIWebView*)HIObjectDynamicCast( (HIObjectRef)inView, kHIWebViewClassID );
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	WebView*			result = NULL;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( view )
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		result = view->fWebView;
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return result;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewConstructor
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HIWebView*
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewConstructor( HIViewRef inView )
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*		view = (HIWebView*)malloc( sizeof( HIWebView ) );
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( view )
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		NSRect		frame = { { 0, 0 }, { 400, 400  } };
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		view->fViewRef = inView;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                WebView *webView = [[WebView alloc] initWithFrame: frame];
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CFRetain(webView);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [webView release];
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		view->fWebView = webView;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		[HIViewAdapter bindHIViewToNSView:inView nsView:view->fWebView];
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		view->fFirstResponder = NULL;
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		view->fKitWindow = NULL;
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view->fIsComposited = false;
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view->fUpdateObserver = NULL;
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return view;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewDestructor
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewDestructor( HIWebView* inView )
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [HIViewAdapter unbindNSView:inView->fWebView];
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(inView->fWebView);
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    free(inView);
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewRegisterClass
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewRegisterClass()
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	static bool sRegistered;
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( !sRegistered )
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		HIObjectRegisterSubclass( kHIWebViewClassID, kHIViewBaseClassID, 0, HIWebViewEventHandler,
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			GetEventTypeCount( kEvents ), kEvents, 0, NULL );
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		sRegistered = true;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetBehaviors
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt32
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetBehaviors()
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return kControlSupportsDataAccess | kControlSupportsGetRegion | kControlGetsFocusOnClick;
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Draw
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDraw( HIWebView* inView, RgnHandle limitRgn, CGContextRef inContext )
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIRect				bounds;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	Rect				drawRect;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIRect				hiRect;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	bool				createdContext = false;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!inView->fIsComposited)
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GrafPtr port;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Rect portRect;
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GetPort( &port );
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GetPortBounds( port, &portRect );
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CreateCGContextForPort( port, &inContext );
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SyncCGContextOriginWithPort( inContext, port );
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextTranslateCTM( inContext, 0, (portRect.bottom - portRect.top) );
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextScaleCTM( inContext, 1, -1 );
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        createdContext = true;
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIViewGetBounds( inView->fViewRef, &bounds );
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CGContextRef savedContext = WKNSWindowOverrideCGContext(inView->fKitWindow, inContext);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSGraphicsContext setCurrentContext:[inView->fKitWindow graphicsContext]];
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	GetRegionBounds( limitRgn, &drawRect );
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( !inView->fIsComposited )
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OffsetRect( &drawRect, (SInt16)-bounds.origin.x, (SInt16)-bounds.origin.y );
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	hiRect.origin.x = drawRect.left;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	hiRect.origin.y = bounds.size.height - drawRect.bottom; // flip y
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	hiRect.size.width = drawRect.right - drawRect.left;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	hiRect.size.height = drawRect.bottom - drawRect.top;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    printf( "Drawing: drawRect is (%g %g) (%g %g)\n", hiRect.origin.x, hiRect.origin.y,
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            hiRect.size.width, hiRect.size.height );
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: We need to do layout before Carbon has decided what region needs drawn.
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In Cocoa we make sure to do layout and invalidate any new regions before draw, so everything
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // can be drawn in one pass. Doing a layout here will cause new regions to be invalidated, but they
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // will not all be drawn in this pass since we already have a fixed rect we are going to display.
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *documentView = [[[inView->fWebView mainFrame] frameView] documentView];
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([documentView isKindOfClass:[WebHTMLView class]])
3545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        [(WebHTMLView *)documentView _web_updateLayoutAndStyleIfNeededRecursive];
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( inView->fIsComposited )
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [inView->fWebView displayIfNeededInRect: *(NSRect*)&hiRect];
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [inView->fWebView displayRect:*(NSRect*)&hiRect];
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WKNSWindowRestoreCGContext(inView->fKitWindow, savedContext);
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( !inView->fIsComposited )
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HIViewRef      view;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HIViewFindByID( HIViewGetRoot( GetControlOwner( inView->fViewRef ) ), kHIViewWindowGrowBoxID, &view );
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( view )
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIRect     frame;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewGetBounds( view, &frame );
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewConvertRect( &frame, view, NULL );
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hiRect.origin.x = drawRect.left;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hiRect.origin.y = drawRect.top;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hiRect.size.width = drawRect.right - drawRect.left;
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hiRect.size.height = drawRect.bottom - drawRect.top;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewConvertRect( &hiRect, inView->fViewRef, NULL );
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( CGRectIntersectsRect( frame, hiRect ) )
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                HIViewSetNeedsDisplay( view, true );
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     }
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( createdContext )
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextSynchronize( inContext );
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRelease( inContext );
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HitTest
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlPartCode
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHitTest( HIWebView* view, const HIPoint* where )
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIRect		bounds;
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIViewGetBounds( view->fViewRef, &bounds );
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( CGRectContainsPoint( bounds, *where ) )
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 1;
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return kControlNoPart;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetRegion
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetRegion(
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*			inView,
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	ControlPartCode		inPart,
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	RgnHandle			outRgn )
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSStatus	 err = eventNotHandledErr;
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( inPart == -3 ) // kControlOpaqueMetaPart:
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( [inView->fWebView isOpaque] )
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			HIRect	bounds;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			Rect	temp;
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			HIViewGetBounds( inView->fViewRef, &bounds );
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			temp.top = (SInt16)bounds.origin.y;
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			temp.left = (SInt16)bounds.origin.x;
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			temp.bottom = (SInt16)CGRectGetMaxY( bounds );
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			temp.right = (SInt16)CGRectGetMaxX( bounds );
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			RectRgn( outRgn, &temp );
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			err = noErr;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return err;
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WindowRef
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetWindowRef( HIWebView* inView )
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       return GetControlOwner( inView->fViewRef );
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Click
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectClick(HIWebView* inView, EventRef inEvent)
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEvent *kitEvent = WKCreateNSEventWithCarbonClickEvent(inEvent, GetWindowRef(inView));
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!inView->fIsComposited)
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StartUpdateObserver(inView);
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!inView->fIsComposited)
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StopUpdateObserver(inView);
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [kitEvent release];
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return noErr;
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseUp
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseUp( HIWebView* inView, EventRef inEvent )
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [kitEvent release];
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return noErr;
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseMoved
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseMoved( HIWebView* inView, EventRef inEvent )
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEvent *kitEvent = WKCreateNSEventWithCarbonMouseMoveEvent(inEvent, inView->fKitWindow);
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	[kitEvent release];
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return noErr;
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseDragged
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseDragged( HIWebView* inView, EventRef inEvent )
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	[kitEvent release];
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return noErr;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseDragged
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseWheelMoved( HIWebView* inView, EventRef inEvent )
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	[kitEvent release];
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return noErr;
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ContextMenuClick
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectContextMenuClick( HIWebView* inView, EventRef inEvent )
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *webView = inView->fWebView;
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *window = [webView window];
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the point out of the event.
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HIPoint point;
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GetEventParameter(inEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(point), NULL, &point);
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HIViewConvertPoint(&point, inView->fViewRef, NULL);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Flip the Y coordinate, since Carbon is flipped relative to the AppKit.
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPoint location = NSMakePoint(point.x, [window frame].size.height - point.y);
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make up an event with the point and send it to the window.
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEvent *kitEvent = [NSEvent mouseEventWithType:NSRightMouseDown
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                           location:location
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                      modifierFlags:0
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                          timestamp:GetEventTime(inEvent)
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                       windowNumber:[window windowNumber]
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                            context:0
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        eventNumber:0
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                         clickCount:1
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                           pressure:0];
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [inView->fKitWindow sendEvent:kitEvent];
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return noErr;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetKind
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlKind
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetKind()
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	const ControlKind kMyKind = { 'appl', 'wbvw' };
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return kMyKind;
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// BoundsChanged
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBoundsChanged(
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*			inView,
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	UInt32				inOptions,
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	const HIRect*		inOriginalBounds,
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	const HIRect*		inCurrentBounds )
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( inView->fWebView )
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		SyncFrame( inView );
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// OwningWindowChanged
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOwningWindowChanged(
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*			view,
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	WindowRef			oldWindow,
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	WindowRef			newWindow )
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( newWindow ){
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WindowAttributes	attrs;
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OSStatus err = GetWindowProperty(newWindow, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &view->fKitWindow);
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( err != noErr )
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const EventTypeSpec kWindowEvents[] = {
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassWindow, kEventWindowClosed },
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassMouse, kEventMouseMoved },
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassMouse, kEventMouseUp },
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassMouse, kEventMouseDragged },
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassMouse, kEventMouseWheelMoved },
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassKeyboard, kEventRawKeyDown },
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassKeyboard, kEventRawKeyRepeat },
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassKeyboard, kEventRawKeyUp },
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { kEventClassControl, kEventControlClick },
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            view->fKitWindow = [[CarbonWindowAdapter alloc] initWithCarbonWindowRef: newWindow takingOwnership: NO disableOrdering:NO carbon:YES];
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SetWindowProperty(newWindow, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), &view->fKitWindow);
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InstallWindowEventHandler( newWindow, WindowHandler, GetEventTypeCount( kWindowEvents ), kWindowEvents, newWindow, NULL );
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[view->fKitWindow contentView] addSubview:view->fWebView];
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GetWindowAttributes( newWindow, &attrs );
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view->fIsComposited = ( ( attrs & kWindowCompositingAttribute ) != 0 );
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SyncFrame( view );
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Be sure to detach the cocoa view, too.
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( view->fWebView )
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view->fWebView removeFromSuperview];
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view->fKitWindow = NULL; // break the ties that bind
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------------------------------------------------------
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	WindowHandler
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------------------------------------------------------
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	Redirect mouse events to the views beneath them. This is required for WebKit to work
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 	properly. We install it once per window. We also tap into window close to release
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	the NSWindow that shadows our Carbon window.
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWindowHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	WindowRef	window = (WindowRef)inUserData;
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSStatus	result = eventNotHandledErr;
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch( GetEventClass( inEvent ) )
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	case kEventClassControl:
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch( GetEventKind( inEvent ) )
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case kEventControlClick:
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    {
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        CarbonWindowAdapter *kitWindow;
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        OSStatus err;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow);
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // We must be outside the HIWebView, relinquish focus.
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        [kitWindow relinquishFocus];
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	case kEventClassKeyboard:
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		{
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NSWindow*		kitWindow;
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                OSStatus		err;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				NSEvent*		kitEvent;
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				// if the first responder in the kit window is something other than the
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				// window, we assume a subview of the webview is focused. we must send
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				// the event to the window so that it goes through the kit's normal TSM
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				// logic, and -- more importantly -- allows any delegates associated
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   				// with the first responder to have a chance at the event.
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow);
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( err == noErr )
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					NSResponder* responder = [kitWindow firstResponder];
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					if ( responder != kitWindow )
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						[kitWindow sendEvent:kitEvent];
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						[kitEvent release];
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		}
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		break;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kEventClassWindow:
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NSWindow*	kitWindow;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                OSStatus	err;
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow);
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ( err == noErr )
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                {
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [kitWindow _removeWindowRef];
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [kitWindow close];
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result = noErr;
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kEventClassMouse:
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (GetEventKind(inEvent))
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case kEventMouseMoved:
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    {
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Point where;
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        GetEventParameter(inEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &where);
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        WindowRef temp;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        FindWindow(where, &temp);
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (temp == window)
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        {
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            Rect bounds;
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            GetWindowBounds(window, kWindowStructureRgn, &bounds);
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            where.h -= bounds.left;
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            where.v -= bounds.top;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            SetEventParameter(inEvent, kEventParamWindowRef, typeWindowRef, sizeof(WindowRef), &window);
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            SetEventParameter(inEvent, kEventParamWindowMouseLocation, typeQDPoint, sizeof(Point), &where);
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            OSStatus err = noErr;
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            HIViewRef view = NULL;
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            err = HIViewGetViewForMouseEvent(HIViewGetRoot(window), inEvent, &view);
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (err == noErr && view && HIObjectIsOfClass((HIObjectRef)view, kHIWebViewClassID))
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                result = SendEventToEventTargetWithOptions(inEvent, HIObjectGetEventTarget((HIObjectRef)view), kEventTargetDontPropagate);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case kEventMouseUp:
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case kEventMouseDragged:
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case kEventMouseWheelMoved:
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    {
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        OSStatus err = noErr;
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HIViewRef view = NULL;
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        err = HIViewGetViewForMouseEvent(HIViewGetRoot(window), inEvent, &view);
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (err == noErr && view && HIObjectIsOfClass((HIObjectRef)view, kHIWebViewClassID))
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = SendEventToEventTargetWithOptions(inEvent, HIObjectGetEventTarget((HIObjectRef)view), kEventTargetDontPropagate);
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return result;
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// SyncFrame
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSyncFrame( HIWebView* inView )
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIViewRef	parent = HIViewGetSuperview( inView->fViewRef );
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( parent )
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( inView->fIsComposited )
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIRect		frame;
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIRect		parentBounds;
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSPoint		origin;
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewGetFrame( inView->fViewRef, &frame );
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewGetBounds( parent, &parentBounds );
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            origin.x = frame.origin.x;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            origin.y = parentBounds.size.height - CGRectGetMaxY( frame );
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    printf( "syncing to (%g %g) (%g %g)\n", origin.x, origin.y,
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            frame.size.width, frame.size.height );
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [inView->fWebView setFrameOrigin: origin];
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [inView->fWebView setFrameSize: *(NSSize*)&frame.size];
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            GrafPtr			port = GetWindowPort( GetControlOwner( inView->fViewRef ) );
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PixMapHandle	portPix = GetPortPixMap( port );
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect			bounds;
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIRect			rootFrame;
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIRect			frame;
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            GetControlBounds( inView->fViewRef, &bounds );
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            OffsetRect( &bounds, -(**portPix).bounds.left, -(**portPix).bounds.top );
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            printf( "control lives at %d %d %d %d in window-coords\n", bounds.top, bounds.left,
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                bounds.bottom, bounds.right );
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HIViewGetFrame( HIViewGetRoot( GetControlOwner( inView->fViewRef ) ), &rootFrame );
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame.origin.x = bounds.left;
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame.origin.y = rootFrame.size.height - bounds.bottom;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame.size.width = bounds.right - bounds.left;
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame.size.height = bounds.bottom - bounds.top;
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            printf( "   before frame convert (%g %g) (%g %g)\n", frame.origin.x, frame.origin.y,
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                frame.size.width, frame.size.height );
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [inView->fWebView convertRect:*(NSRect*)&frame fromView:nil];
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            printf( "   moving web view to (%g %g) (%g %g)\n", frame.origin.x, frame.origin.y,
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                frame.size.width, frame.size.height );
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [inView->fWebView setFrameOrigin: *(NSPoint*)&frame.origin];
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [inView->fWebView setFrameSize: *(NSSize*)&frame.size];
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// SetFocusPart
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSetFocusPart(
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*				view,
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	ControlPartCode 		desiredFocus,
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	RgnHandle 				invalidRgn,
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	Boolean 				focusEverything,
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	ControlPartCode* 		actualFocus )
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *	freshlyMadeFirstResponderView;
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SInt32 		partCodeToReturn;
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Do what Carbon is telling us to do.
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( desiredFocus == kControlFocusNoPart )
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Relinquish the keyboard focus.
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RelinquishFocus( view, true ); //(autodisplay ? YES : NO));
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        freshlyMadeFirstResponderView = nil;
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        partCodeToReturn = kControlFocusNoPart;
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//NSLog(@"Relinquished the key focus because we have no choice.");
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else if ( desiredFocus == kControlFocusNextPart || desiredFocus == kControlFocusPrevPart )
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL goForward = (desiredFocus == kControlFocusNextPart );
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Advance the keyboard focus, maybe right off of this view.  Maybe a subview of this one already has the keyboard focus, maybe not.
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        freshlyMadeFirstResponderView = AdvanceFocus( view, goForward );
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (freshlyMadeFirstResponderView)
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            partCodeToReturn = desiredFocus;
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            partCodeToReturn = kControlFocusNoPart;
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        //NSLog(freshlyMadeFirstResponderView ? @"Advanced the key focus." : @"Relinquished the key focus.");
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// What's this?
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (desiredFocus != kControlIndicatorPart) {
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    check(false);
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		freshlyMadeFirstResponderView = nil;
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		partCodeToReturn = desiredFocus;
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	view->fFirstResponder = freshlyMadeFirstResponderView;
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	*actualFocus = partCodeToReturn;
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// Done.
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return noErr;
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// AdvanceFocus
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView*
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAdvanceFocus( HIWebView* view, bool forward )
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder*		oldFirstResponder;
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView*				currentKeyView;
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView*				viewWeMadeFirstResponder;
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //	Focus on some part (subview) of this control (view).  Maybe
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	a subview of this one already has the keyboard focus, maybe not.
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	oldFirstResponder = [view->fKitWindow firstResponder];
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// If we tab out of our NSView, it will no longer be the responder
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// when we get here. We'll try this trick for now. We might need to
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// tag the view appropriately.
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( view->fFirstResponder && ( (NSResponder*)view->fFirstResponder != oldFirstResponder ) )
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return NULL;
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( [oldFirstResponder isKindOfClass:[NSView class]] )
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		NSView*		tentativeNewKeyView;
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Some view in this window already has the keyboard focus.  It better at least be a subview of this one.
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSView*	oldFirstResponderView = (NSView *)oldFirstResponder;
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        check( [oldFirstResponderView isDescendantOf:view->fWebView] );
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( oldFirstResponderView != view->fFirstResponder
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			&& ![oldFirstResponderView isDescendantOf:view->fFirstResponder] )
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Despite our efforts to record what view we made the first responder
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// (for use in the next paragraph) we couldn't keep up because the user
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// has clicked in a text field to make it the key focus, instead of using
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// the tab key.  Find a control on which it's reasonable to invoke
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// -[NSView nextValidKeyView], taking into account the fact that
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// NSTextFields always pass on first-respondership to a temporarily-
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// contained NSTextView.
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			NSView *viewBeingTested;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			currentKeyView = oldFirstResponderView;
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			viewBeingTested = currentKeyView;
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			while ( viewBeingTested != view->fWebView )
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( [viewBeingTested isKindOfClass:[NSTextField class]] )
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					currentKeyView = viewBeingTested;
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				else
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					viewBeingTested = [viewBeingTested superview];
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// We recorded which view we made into the first responder the
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// last time the user hit the tab key, and nothing has invalidated
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			// our recorded value since.
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			currentKeyView = view->fFirstResponder;
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Try to move on to the next or previous key view.  We use the laboriously
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// recorded/figured currentKeyView instead of just oldFirstResponder as the
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// jumping-off-point when searching for the next valid key view.  This is so
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// we don't get fooled if we recently made some view the first responder, but
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// it passed on first-responder-ness to some temporary subview.
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // You can't put normal views in a window with Carbon-control-wrapped views.
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// Stuff like this would break.  M.P. Notice - 12/2/00
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tentativeNewKeyView = forward ? [currentKeyView nextValidKeyView] : [currentKeyView previousValidKeyView];
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( tentativeNewKeyView && [tentativeNewKeyView isDescendantOf:view->fWebView] )
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The user has tabbed to another subview of this control view.  Change the keyboard focus.
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            //NSLog(@"Tabbed to the next or previous key view.");
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view->fKitWindow makeFirstResponder:tentativeNewKeyView];
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            viewWeMadeFirstResponder = tentativeNewKeyView;
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The user has tabbed past the subviews of this control view.  The window is the first responder now.
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            //NSLog(@"Tabbed past the first or last key view.");
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view->fKitWindow makeFirstResponder:view->fKitWindow];
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            viewWeMadeFirstResponder = nil;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // No view in this window has the keyboard focus.  This view should
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// try to select one of its key subviews.  We're not interested in
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// the subviews of sibling views here.
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//NSLog(@"No keyboard focus in window. Attempting to set...");
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		NSView *tentativeNewKeyView;
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		check(oldFirstResponder==fKitWindow);
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( [view->fWebView acceptsFirstResponder] )
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			tentativeNewKeyView = view->fWebView;
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			tentativeNewKeyView = [view->fWebView nextValidKeyView];
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( tentativeNewKeyView && [tentativeNewKeyView isDescendantOf:view->fWebView] )
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // This control view has at least one subview that can take the keyboard focus.
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( !forward )
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // The user has tabbed into this control view backwards.  Find
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				// and select the last subview of this one that can take the
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				// keyboard focus.  Watch out for loops of valid key views.
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NSView *firstTentativeNewKeyView = tentativeNewKeyView;
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NSView *nextTentativeNewKeyView = [tentativeNewKeyView nextValidKeyView];
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                while ( nextTentativeNewKeyView
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						&& [nextTentativeNewKeyView isDescendantOf:view->fWebView]
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						&& nextTentativeNewKeyView!=firstTentativeNewKeyView)
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    tentativeNewKeyView = nextTentativeNewKeyView;
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    nextTentativeNewKeyView = [tentativeNewKeyView nextValidKeyView];
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Set the keyboard focus.
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            //NSLog(@"Tabbed into the first or last key view.");
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view->fKitWindow makeFirstResponder:tentativeNewKeyView];
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            viewWeMadeFirstResponder = tentativeNewKeyView;
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		else
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // This control view has no subviews that can take the keyboard focus.
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            //NSLog(@"Can't tab into this view.");
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            viewWeMadeFirstResponder = nil;
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Done.
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewWeMadeFirstResponder;
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// RelinquishFocus
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRelinquishFocus( HIWebView* view, bool inAutodisplay )
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder*  firstResponder;
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apparently Carbon thinks that some subview of this control view has the keyboard focus,
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// or we wouldn't be being asked to relinquish focus.
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	firstResponder = [view->fKitWindow firstResponder];
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( [firstResponder isKindOfClass:[NSView class]] )
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// Some subview of this control view really is the first responder right now.
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		check( [(NSView *)firstResponder isDescendantOf:view->fWebView] );
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// Make the window the first responder, so that no view is the key view.
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [view->fKitWindow makeFirstResponder:view->fKitWindow];
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// 	If this control is not allowed to do autodisplay, don't let
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	it autodisplay any just-changed focus rings or text on the
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	next go around the event loop. I'm probably clearing more
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	dirty rects than I have to, but it doesn't seem to hurt in
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	the print panel accessory view case, and I don't have time
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	to figure out exactly what -[NSCell _setKeyboardFocusRingNeedsDisplay]
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	is doing when invoked indirectly from -makeFirstResponder up above.  M.P. Notice - 12/4/00
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( !inAutodisplay )
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			[[view->fWebView opaqueAncestor] _clearDirtyRectsForTree];
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	else
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//  The Cocoa first responder does not correspond to the Carbon
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	control that has the keyboard focus.  This can happen when
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	you've closed a dialog by hitting return in an NSTextView
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	that's a subview of this one; Cocoa closed the window, and
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	now Carbon is telling this control to relinquish the focus
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		//	as it's being disposed.  There's nothing to do.
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		check(firstResponder==window);
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ActiveStateChanged
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectActiveStateChanged( HIWebView* view )
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( [view->fWebView respondsToSelector:@selector(setEnabled)] )
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		[(NSControl*)view->fWebView setEnabled: IsControlEnabled( view->fViewRef )];
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		HIViewSetNeedsDisplay( view->fViewRef, true );
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ProcessCommand
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectProcessCommand( HIWebView* inView, const HICommand* inCommand )
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSStatus		result = eventNotHandledErr;
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	NSResponder*	resp;
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	resp = [inView->fKitWindow firstResponder];
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( [resp isKindOfClass:[NSView class]] )
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		NSView*	respView = (NSView*)resp;
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( respView == inView->fWebView
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			|| [respView isDescendantOf: inView->fWebView] )
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			switch ( inCommand->commandID )
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kHICommandCut:
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kHICommandCopy:
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kHICommandPaste:
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kHICommandClear:
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kHICommandSelectAll:
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						SEL selector = _NSSelectorForHICommand( inCommand );
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						if ( [respView respondsToSelector:selector] )
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						{
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							[respView performSelector:selector withObject:nil];
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							result = noErr;
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						}
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return result;
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// UpdateCommandStatus
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUpdateCommandStatus( HIWebView* inView, const HICommand* inCommand )
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSStatus		result = eventNotHandledErr;
11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	MenuItemProxy* 	proxy = NULL;
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	NSResponder*	resp;
11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	resp = [inView->fKitWindow firstResponder];
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( [resp isKindOfClass:[NSView class]] )
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		NSView*	respView = (NSView*)resp;
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( respView == inView->fWebView
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			|| [respView isDescendantOf: inView->fWebView] )
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		{
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( inCommand->attributes & kHICommandFromMenu )
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				SEL selector = _NSSelectorForHICommand( inCommand );
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( selector )
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					if ( [resp respondsToSelector: selector] )
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						proxy = [[MenuItemProxy alloc] initWithAction: selector];
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Can't use -performSelector:withObject: here because the method we're calling returns BOOL, while
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // -performSelector:withObject:'s return value is assumed to be an id.
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        BOOL (*validationFunction)(id, SEL, id) = (BOOL (*)(id, SEL, id))objc_msgSend;
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (validationFunction(resp, @selector(validateUserInterfaceItem:), proxy))
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							EnableMenuItem( inCommand->menu.menuRef, inCommand->menu.menuItemIndex );
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						else
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							DisableMenuItem( inCommand->menu.menuRef, inCommand->menu.menuItemIndex );
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( proxy )
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		[proxy release];
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return result;
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Blatantly stolen from AppKit and cropped a bit
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _NSSelectorForHICommand
11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------
11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic SEL
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project_NSSelectorForHICommand( const HICommand* inCommand )
11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch ( inCommand->commandID )
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandUndo: return @selector(undo:);
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandRedo: return @selector(redo:);
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandCut  : return @selector(cut:);
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandCopy : return @selector(copy:);
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandPaste: return @selector(paste:);
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandClear: return @selector(delete:);
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kHICommandSelectAll: return @selector(selectAll:);
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: return NULL;
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------------
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	HIWebViewEventHandler
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------------
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	Our object's virtual event handler method. I'm not sure if we need this these days.
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//	We used to do various things with it, but those days are long gone...
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewEventHandler(
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	EventHandlerCallRef	inCallRef,
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	EventRef			inEvent,
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	void *				inUserData )
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSStatus			result = eventNotHandledErr;
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIPoint				where;
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	OSType				tag;
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	void *				ptr;
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	Size				size;
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	UInt32				features;
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	RgnHandle			region = NULL;
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	ControlPartCode		part;
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*			view = (HIWebView*)inUserData;
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // [NSApp setWindowsNeedUpdate:YES] must be called before events so that ActivateTSMDocument is called to set an active document.
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Without an active document, TSM will use a default document which uses a bottom-line input window which we don't want.
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [NSApp setWindowsNeedUpdate:YES];
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	switch ( GetEventClass( inEvent ) )
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case kEventClassHIObject:
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			switch ( GetEventKind( inEvent ) )
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventHIObjectConstruct:
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						HIObjectRef		object;
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = GetEventParameter( inEvent, kEventParamHIObjectInstance,
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								typeHIObjectRef, NULL, sizeof( HIObjectRef ), NULL, &object );
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						require_noerr( result, MissingParameter );
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						// on entry for our construct event, we're passed the
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						// creation proc we registered with for this class.
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						// we use it now to create the instance, and then we
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						// replace the instance parameter data with said instance
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						// as type void.
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						view = HIWebViewConstructor( (HIViewRef)object );
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						if ( view )
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						{
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							SetEventParameter( inEvent, kEventParamHIObjectInstance,
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project									typeVoidPtr, sizeof( void * ), &view );
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						}
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventHIObjectDestruct:
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					HIWebViewDestructor( view );
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					// result is unimportant
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case kEventClassKeyboard:
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent);
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				[view->fKitWindow sendSuperEvent:kitEvent];
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				[kitEvent release];
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				result = noErr;
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case kEventClassMouse:
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			switch ( GetEventKind( inEvent ) )
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventMouseUp:
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = MouseUp( view, inEvent );
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventMouseWheelMoved:
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = MouseWheelMoved( view, inEvent );
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventMouseMoved:
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = MouseMoved( view, inEvent );
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventMouseDragged:
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = MouseDragged( view, inEvent );
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case kEventClassCommand:
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				HICommand		command;
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				result = GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL,
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( HICommand ), NULL, &command );
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				require_noerr( result, MissingParameter );
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				switch ( GetEventKind( inEvent ) )
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				{
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					case kEventCommandProcess:
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = ProcessCommand( view, &command );
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						break;
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					case kEventCommandUpdateStatus:
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = UpdateCommandStatus( view, &command );
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						break;
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		case kEventClassControl:
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			switch ( GetEventKind( inEvent ) )
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			{
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlInitialize:
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					features = GetBehaviors();
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					SetEventParameter( inEvent, kEventParamControlFeatures, typeUInt32,
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							sizeof( UInt32 ), &features );
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = noErr;
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlDraw:
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						CGContextRef		context = NULL;
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamRgnHandle, typeQDRgnHandle, NULL,
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( RgnHandle ), NULL, &region );
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamCGContextRef, typeCGContextRef, NULL,
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( CGContextRef ), NULL, &context );
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						Draw( view, region, context );
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlHitTest:
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter( inEvent, kEventParamMouseLocation, typeHIPoint, NULL,
13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							sizeof( HIPoint ), NULL, &where );
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					part = HitTest( view, &where );
13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, sizeof( ControlPartCode ), &part );
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = noErr;
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlGetPartRegion:
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL,
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							sizeof( ControlPartCode ), NULL, &part );
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter( inEvent, kEventParamControlRegion, typeQDRgnHandle, NULL,
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							sizeof( RgnHandle ), NULL, &region );
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = GetRegion( view, part, region );
13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlGetData:
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter(inEvent, kEventParamControlPart, typeControlPartCode, NULL, sizeof(ControlPartCode), NULL, &part);
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter(inEvent, kEventParamControlDataTag, typeEnumeration, NULL, sizeof(OSType), NULL, &tag);
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter(inEvent, kEventParamControlDataBuffer, typePtr, NULL, sizeof(Ptr), NULL, &ptr);
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					GetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, NULL, sizeof(Size), NULL, &size);
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					if (tag == kControlKindTag) {
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						Size outSize;
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						if (ptr) {
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							if (size != sizeof(ControlKind))
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								result = errDataSizeMismatch;
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							else
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								(*(ControlKind *)ptr) = GetKind();
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						}
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						outSize = sizeof(ControlKind);
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						SetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, sizeof(Size), &outSize);
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlBoundsChanged:
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						HIRect		prevRect, currRect;
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						UInt32		attrs;
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamAttributes, typeUInt32, NULL,
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( UInt32 ), NULL, &attrs );
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamOriginalBounds, typeHIRect, NULL,
14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( HIRect ), NULL, &prevRect );
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamCurrentBounds, typeHIRect, NULL,
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( HIRect ), NULL, &currRect );
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						BoundsChanged( view, attrs, &prevRect, &currRect );
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlActivate:
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					ActiveStateChanged( view );
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = noErr;
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlDeactivate:
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					ActiveStateChanged( view );
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = noErr;
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlOwningWindowChanged:
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						WindowRef		fromWindow, toWindow;
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = GetEventParameter( inEvent, kEventParamControlOriginalOwningWindow, typeWindowRef, NULL,
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project										sizeof( WindowRef ), NULL, &fromWindow );
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						require_noerr( result, MissingParameter );
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = GetEventParameter( inEvent, kEventParamControlCurrentOwningWindow, typeWindowRef, NULL,
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project										sizeof( WindowRef ), NULL, &toWindow );
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						require_noerr( result, MissingParameter );
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						OwningWindowChanged( view, fromWindow, toWindow );
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = noErr;
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlClick:
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = Click( view, inEvent );
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlContextualMenuClick:
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					result = ContextMenuClick( view, inEvent );
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				case kEventControlSetFocusPart:
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					{
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						ControlPartCode		desiredFocus;
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						RgnHandle			invalidRgn;
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						Boolean				focusEverything;
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						ControlPartCode		actualFocus;
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL,
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project										sizeof( ControlPartCode ), NULL, &desiredFocus );
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						require_noerr( result, MissingParameter );
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamControlInvalRgn, typeQDRgnHandle, NULL,
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( RgnHandle ), NULL, &invalidRgn );
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						focusEverything = false; // a good default in case the parameter doesn't exist
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						GetEventParameter( inEvent, kEventParamControlFocusEverything, typeBoolean, NULL,
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project								sizeof( Boolean ), NULL, &focusEverything );
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						result = SetFocusPart( view, desiredFocus, invalidRgn, focusEverything, &actualFocus );
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project						if ( result == noErr )
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project							verify_noerr( SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode,
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project									sizeof( ControlPartCode ), &actualFocus ) );
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					}
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				// some other kind of Control event
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				default:
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					break;
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		// some other event class
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		default:
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			break;
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMissingParameter:
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return result;
14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void UpdateObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info);
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStartUpdateObserver( HIWebView* view )
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	CFRunLoopObserverContext	context;
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	CFRunLoopObserverRef		observer;
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRunLoopRef				mainRunLoop;
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    check( view->fIsComposited == false );
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    check( view->fUpdateObserver == NULL );
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	context.version = 0;
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	context.info = view;
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	context.retain = NULL;
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	context.release = NULL;
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	context.copyDescription = NULL;
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mainRunLoop = (CFRunLoopRef)GetCFRunLoopFromEventLoop( GetMainEventLoop() );
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	observer = CFRunLoopObserverCreate( NULL, kCFRunLoopEntry | kCFRunLoopBeforeWaiting, true, 0, UpdateObserver, &context );
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	CFRunLoopAddObserver( mainRunLoop, observer, kCFRunLoopCommonModes );
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->fUpdateObserver = observer;
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    printf( "Update observer started\n" );
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStopUpdateObserver( HIWebView* view )
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    check( view->fIsComposited == false );
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    check( view->fUpdateObserver != NULL );
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRunLoopObserverInvalidate( view->fUpdateObserver );
15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease( view->fUpdateObserver );
15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->fUpdateObserver = NULL;
15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    printf( "Update observer removed\n" );
15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void
15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUpdateObserver( CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info )
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	HIWebView*			view = (HIWebView*)info;
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RgnHandle			region = NewRgn();
15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    printf( "Update observer called\n" );
15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( region )
15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GetWindowRegion( GetControlOwner( view->fViewRef ), kWindowUpdateRgn, region );
15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( !EmptyRgn( region ) )
15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RgnHandle		ourRgn = NewRgn();
15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect			rect;
15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            GetWindowBounds( GetControlOwner( view->fViewRef ), kWindowStructureRgn, &rect );
15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//            printf( "Update region is non-empty\n" );
15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( ourRgn )
15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Rect		rect;
15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GrafPtr		savePort, port;
15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Point		offset = { 0, 0 };
15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                port = GetWindowPort( GetControlOwner( view->fViewRef ) );
15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GetPort( &savePort );
15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SetPort( port );
15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GlobalToLocal( &offset );
15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                OffsetRgn( region, offset.h, offset.v );
15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GetControlBounds( view->fViewRef, &rect );
15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RectRgn( ourRgn, &rect );
15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                printf( "our control is at %d %d %d %d\n",
15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        rect.top, rect.left, rect.bottom, rect.right );
15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GetRegionBounds( region, &rect );
15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                printf( "region is at %d %d %d %d\n",
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        rect.top, rect.left, rect.bottom, rect.right );
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SectRgn( ourRgn, region, ourRgn );
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                GetRegionBounds( ourRgn, &rect );
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                printf( "intersection is  %d %d %d %d\n",
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                       rect.top, rect.left, rect.bottom, rect.right );
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ( !EmptyRgn( ourRgn ) )
15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                {
15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    RgnHandle	saveVis = NewRgn();
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                    printf( "looks like we should draw\n" );
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if ( saveVis )
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    {
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        RGBColor	kRedColor = { 0xffff, 0, 0 };
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        GetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis );
15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), ourRgn );
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        RGBForeColor( &kRedColor );
15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        PaintRgn( ourRgn );
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        QDFlushPortBuffer( port, NULL );
15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                        Delay( 15, NULL );
15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Draw1Control( view->fViewRef );
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        ValidWindowRgn( GetControlOwner( view->fViewRef ), ourRgn );
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis );
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        DisposeRgn( saveVis );
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SetPort( savePort );
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                DisposeRgn( ourRgn );
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DisposeRgn( region );
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1616