Difference between revisions of "Mac OS X Implementing HIView"
Line 70: | Line 70: | ||
InstallEventHandler ( | InstallEventHandler ( | ||
− | + | GetControlEventTarget (mhView), | |
− | + | NewEventHandlerUPP (HandleHIViewEvent), | |
− | + | GetEventTypeCount (cHIViewEvent), | |
− | + | cHIViewEvent, | |
− | + | (void*)mhView, // note the use of the pointer | |
− | + | NULL | |
− | + | ); | |
</pre> | </pre> |
Revision as of 16:36, 12 March 2007
Contributors
Eric Bachard[ericb]
Sébastien Plisson [plipli]
Introduction
The main idea behind HIView is to superpose plans, to create any view, using compositing possibilities of Quartz Graphical Engine. The final result is the superposition of all plans, following simple rules like :
- The last plan is always drawn on the previous one ; - Some plans can be declared visible, or not, very easely.
This page is part of [Native Controls Implementation] and the objective is to use HIView for HIComboboxes or other HI* controls.
Our objective is to bind vcl controls with HI* controls, from Carbon API.
e.g. : implement HICombobox as one control only.
The generic implementation, under tests (and not fully working), uses :
HI* events definitions in aquavclevents.hxx
Event handler implementation in HandleHIViewEvent()
The use of HandleHIViewEvent() in AquaSalFrame::CreateNewSystemWindow()
The use of HI* controls, in vcl, when ::CreateNewSystemWindow() is used, calling HandleHIViewEvent(), when HI* events are detected in the frame.
Note : we "or"- ed kWindowCompositingAttribute in nWindowAttributes, to see compositing effects.
[FIXME] : investigate, because use this attribute causes refresh issues
Current code implementation
Events for HIView
Two sorts of events are needed:
- for objects (ClasskEventClassHIObject ) :
kEventHIObjectConstruct kEventHIObjectInitialize kEventHIObjectDestruct
- for controls themselves ( Class kEventClassControl ) :
kEventControlDraw kEventControlInitialize kEventControlHitTest kEventControlGetPartRegion kEventControlBoundsChanged
Current implementation : see vcl/aqua/aquavclevents.hxx for more informations about the syntax.
Install Event Handler
Now we have to install event Handler, inside AquaSalFrame::CreateNewSystemWindow() :
InstallEventHandler ( GetControlEventTarget (mhView), NewEventHandlerUPP (HandleHIViewEvent), GetEventTypeCount (cHIViewEvent), cHIViewEvent, (void*)mhView, // note the use of the pointer NULL );
The HI* Event Handler
The Handler is OSStatus type, and is used when events are detected.
e.g. : we created HandleHIViewEvent()
using GetEventParameter, itself using the parameters described in Apple documentation.
Code sample :
OSStatus HandleHIViewEvent(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void* inUserData) { //lock ImplSalYieldMutexAcquire(); OSStatus status = noErr; // we use mrContext, global and seen from everywhere CGContextRef mrContext; // create HIRect, contianing the control bounds ( in local coordinates) HIRect bounds; status = GetEventParameter (inEvent, kEventParamCGContextRef, typeCGContextRef, NULL, sizeof (CGContextRef), NULL, &mrContext); // not used, but usefull //require_noerr(status, CantGetGraphicsContext); // 2 // We need to know the bounds containing the current control HIViewGetBounds ((HIViewRef) inUserData, &bounds); // not used, but usefull //require_noerr(status, CantGetBoundingRectangle); // unlock ImplSalYieldMutexRelease(); return status; }
HIView use in AquaSalFrame::CreateNewSystemWindow()
Code sample :
// TEST HIVIew part // Set mhView with HIView Content ViewRef HIRect myViewRect; myViewRect.origin.x = aContentRect.left; myViewRect.origin.y = aContentRect.right; myViewRect.size.width = aContentRect.right-aContentRect.left; myViewRect.size.height = aContentRect.bottom-aContentRect.top; OSStatus errval; errval = HIViewFindByID(HIViewGetRoot(mrWindow), kHIViewWindowContentID, &mhView); // make the view visible HIViewSetVisible (mhView, true); // set the frame HIViewSetFrame (mhView, &myViewRect);
Controls
[FIXME]
Usefull Links
Reference
HIVIew : [reference]
or : [same in .pdf format]