Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
TestHIView.cp
/* |
File: TestHIView.cp |
Contains: Minimal application to test HIViews. |
Version: 1.0.1 |
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. |
("Apple") in consideration of your agreement to the following terms, and your |
use, installation, modification or redistribution of this Apple software |
constitutes acceptance of these terms. If you do not agree with these terms, |
please do not use, install, modify or redistribute this Apple software. |
In consideration of your agreement to abide by the following terms, and subject |
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs |
copyrights in this original Apple software (the "Apple Software"), to use, |
reproduce, modify and redistribute the Apple Software, with or without |
modifications, in source and/or binary forms; provided that if you redistribute |
the Apple Software in its entirety and without modifications, you must retain |
this notice and the following text and disclaimers in all such redistributions of |
the Apple Software. Neither the name, trademarks, service marks or logos of |
Apple Computer, Inc. may be used to endorse or promote products derived from the |
Apple Software without specific prior written permission from Apple. Except as |
expressly stated in this notice, no other rights or licenses, express or implied, |
are granted by Apple herein, including but not limited to any patent rights that |
may be infringed by your derivative works or by other works in which the Apple |
Software may be incorporated. |
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO |
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED |
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN |
COMBINATION WITH YOUR PRODUCTS. |
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION |
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT |
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN |
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Copyright © 2002 Apple Computer, Inc., All Rights Reserved |
*/ |
#include <Carbon/Carbon.h> |
#include "HIDoubleSlider.h" |
// Common stuff to all samples |
void InitToolbox(void); |
void InitMenuBar(void); |
pascal OSErr HandlePref(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon); |
pascal OSErr HandleOapp(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon); |
pascal OSErr HandleOdoc(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon); |
pascal OSErr HandlePdoc(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon); |
void InstallAppleEventHandlers(void); |
pascal OSStatus CommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); |
void InstallApplicationCarbonEventHandlers(void); |
void DoCloseWindow(WindowRef theWind); |
void RecursiveCloseWindow(WindowRef theWind); |
void CloseAllWindows(); |
void InitApplication(void); |
void TermApplication(void); |
// End of common stuff |
void DoAboutBox(void); |
void DoPreferences(void); |
void DoNewWindow(void); |
int main(void) |
{ |
InitToolbox(); |
InitApplication(); |
RunApplicationEventLoop(); |
TermApplication(); |
return 0; |
} |
//------------------------------- Initializations ------------------------------ |
void InitToolbox(void) |
{ |
InitCursor(); |
} |
void InitApplication(void) |
{ |
long response; |
OSErr err; |
// Can we run this particular demo application? |
err = Gestalt(gestaltSystemVersion, &response); |
Boolean ok = ((err == noErr) && (response >= 0x00001020)); |
if (!ok) |
{ |
StandardAlert(kAlertStopAlert, "\pMac OS X 10.2 (minimum) is required for this application", "\p", NULL, NULL); |
ExitToShell(); |
} |
InstallAppleEventHandlers(); |
InstallApplicationCarbonEventHandlers(); |
InitMenuBar(); |
DoNewWindow(); |
} |
void InitMenuBar(void) |
{ |
// Getting our menu bar |
Handle aHand = GetNewMBar(128); |
SetMenuBar(aHand); |
// Enabling Preferences menu item |
EnableMenuCommand(NULL, kHICommandPreferences); |
// Adding some menu item commands |
MenuHandle menu = GetMenuHandle(128); |
SetMenuItemCommandID(menu, 1, kHICommandNew); |
SetMenuItemCommandID(menu, 2, kHICommandClose); |
SetMenuItemCommandID(GetMenuHandle(1), 1, kHICommandAbout); |
// Adding a standard Window menu |
CreateStandardWindowMenu(0, &menu); |
InsertMenu(menu, 0); |
DrawMenuBar(); |
DisposeHandle(aHand); |
} |
//------------------------------- Apple Events --------------------------------- |
void InstallAppleEventHandlers(void) |
{ |
OSErr err; |
err = AEInstallEventHandler(kCoreEventClass, kAEShowPreferences, NewAEEventHandlerUPP(HandlePref), 0, false); |
if (err) DebugStr("\pAEInstallEventHandler failed for kAEOpenApplication"); |
err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerUPP(HandleOapp), 0, false); |
if (err) DebugStr("\pAEInstallEventHandler failed for kAEOpenApplication"); |
err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP(HandleOdoc), 0, false); |
if (err) DebugStr("\pAEInstallEventHandler failed for kAEOpenDocuments"); |
err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerUPP(HandlePdoc), 0, false); |
if (err) DebugStr("\pAEInstallEventHandler failed for kAEPrintDocuments"); |
// Note: Since RunApplicationEventLoop installs a Quit AE Handler, we no longer have to do it here. |
} |
pascal OSErr HandlePref(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon) |
{ |
return errAEEventNotHandled; |
} |
pascal OSErr HandleOapp(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon) |
{ |
return noErr; |
} |
pascal OSErr HandleOdoc(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon) |
{ |
return errAEEventNotHandled; |
} |
pascal OSErr HandlePdoc(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon) |
{ |
return errAEEventNotHandled; |
} |
//------------------------------- Carbon Events -------------------------------- |
void InstallApplicationCarbonEventHandlers(void) |
{ |
EventTypeSpec eventType = {kEventClassCommand, kEventCommandProcess}; |
InstallEventHandler(GetApplicationEventTarget(), NewEventHandlerUPP(CommandProcess), 1, &eventType, NULL, NULL); |
} |
pascal OSStatus CommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) |
{ |
HICommand aCommand; |
OSStatus status = noErr; |
GetEventParameter(theEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &aCommand); |
switch (aCommand.commandID) |
{ |
case kHICommandAbout: |
DoAboutBox(); |
break; |
case kHICommandPreferences: |
DoPreferences(); |
break; |
case kHICommandNew: |
DoNewWindow(); |
break; |
case kHICommandClose: |
DoCloseWindow(FrontNonFloatingWindow()); |
break; |
default: |
status = eventNotHandledErr; |
break; |
} |
return status; |
} |
//------------------------------- Terminating ---------------------------------- |
void TermApplication(void) |
{ |
CloseAllWindows(); |
} |
void CloseAllWindows() |
{ |
WindowRef theWind = FrontWindow(); |
if (theWind) |
{ |
RecursiveCloseWindow(theWind); |
} |
} |
void RecursiveCloseWindow(WindowRef theWind) |
{ |
WindowRef nextWind = GetNextWindow(theWind); |
if (nextWind) RecursiveCloseWindow(nextWind); |
DoCloseWindow(theWind); |
} |
void DoCloseWindow(WindowRef theWind) |
{ |
EventRef theEvent; |
CreateEvent(NULL, kEventClassWindow, kEventWindowClose, 0, 0, &theEvent); |
SetEventParameter(theEvent, kEventParamDirectObject, typeWindowRef, sizeof(WindowRef), &theWind); |
SendEventToEventTarget(theEvent, GetWindowEventTarget(theWind)); |
ReleaseEvent(theEvent); |
} |
//------------------------------- End of common stuff -------------------------- |
void DoAboutBox(void) |
{ |
StandardAlert(kAlertNoteAlert, "\pHIDoubleSlider 1.2 by DTS, Apple © 2002-2003", "\p", NULL, NULL); |
} |
void DoPreferences(void) |
{ |
StandardAlert(kAlertNoteAlert, "\pNo Preferences yet!", "\p", NULL, NULL); |
} |
pascal OSStatus WindowCommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) |
{ |
HICommand aCommand; |
OSStatus status = eventNotHandledErr; |
GetEventParameter(theEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &aCommand); |
if ((aCommand.attributes & kHICommandFromControl) != 0) |
{ |
HICommandExtended * extCom = (HICommandExtended *)&aCommand; |
ControlRef theControl = extCom->source.control; |
ControlRef theAssociatedControl = (ControlRef)GetControlReference(theControl); |
SInt32 curValue; |
switch (aCommand.commandID) |
{ |
case 'SLM2': |
curValue = GetControlLoValue(theAssociatedControl); |
SetControlLoValue(theAssociatedControl, curValue - 25); |
status = noErr; |
break; |
case 'SLP2': |
curValue = GetControlLoValue(theAssociatedControl); |
SetControlLoValue(theAssociatedControl, curValue + 25); |
status = noErr; |
break; |
case 'SHP5': |
curValue = GetControlHiValue(theAssociatedControl); |
SetControlHiValue(theAssociatedControl, curValue + 50); |
status = noErr; |
break; |
case 'SHM5': |
curValue = GetControlHiValue(theAssociatedControl); |
SetControlHiValue(theAssociatedControl, curValue - 50); |
status = noErr; |
break; |
case 'MES1': |
{ |
HIRect frame; |
HIViewGetFrame(theAssociatedControl, &frame); |
float delta = (frame.origin.x == 30.0)?15:-15; |
status = HIViewMoveBy(theAssociatedControl, delta, -delta); |
} |
break; |
case 'MES2': |
{ |
HIRect frame; |
HIViewGetFrame(theAssociatedControl, &frame); |
float delta = (frame.origin.x == 330.0)?30:-30; |
status = HIViewMoveBy(theAssociatedControl, delta, delta); |
} |
break; |
} |
} |
return status; |
} |
pascal OSStatus HiValueFieldChanged(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) |
{ |
OSStatus status = eventNotHandledErr; |
ControlRef theSlider; |
GetEventParameter(theEvent, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &theSlider); |
ControlRef theText; |
theText = (ControlRef)GetControlReference(theSlider); |
SInt32 theValue = GetControlHiValue(theSlider); |
Str255 theString; |
NumToString(theValue, theString); |
SetControlData(theText, kControlEntireControl, kControlEditTextTextTag, theString[0], &theString[1]); |
HIViewSetNeedsDisplay(theText, true); |
return status; |
} |
void DoNewWindow(void) |
{ |
WindowRef theWind; |
Rect bounds = {50, 10, 470, 630}; |
OSStatus theStatus = CreateNewWindow( |
kDocumentWindowClass, |
kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowStandardHandlerAttribute | kWindowCompositingAttribute, |
&bounds, &theWind); |
if ((theStatus != noErr) || (theWind == NULL)) {DebugStr("\pCreateNewWindow failed!"); return;} |
SetWTitle(theWind, "\pHIDoubleSlider"); |
EventTypeSpec eventType = {kEventClassCommand, kEventCommandProcess}; |
InstallEventHandler(GetWindowEventTarget(theWind), NewEventHandlerUPP(WindowCommandProcess), 1, &eventType, NULL, NULL); |
// some labels |
ControlRef txtControl; |
Rect txtRect = {10, 20, 25, 70}; |
CreateStaticTextControl(theWind, &txtRect, CFSTR("Simple"), NULL, &txtControl); |
Rect txtRect2 = {10, 110, 25, 180}; |
CreateStaticTextControl(theWind, &txtRect2, CFSTR("Overrided"), NULL, &txtControl); |
ControlRef grpControl; |
Rect grpRect = {10, 330, 330, 570}; |
CreateGroupBoxControl(theWind, &grpRect, CFSTR("Embedded"), true, &grpControl); |
// |
// |
// creating a simple double slider |
// |
// |
HIViewRef theSimpleSlider; |
HIRect frame = { {30.0, 30.0}, {26.0, 380.0} }; |
theStatus = HICreateDoubleSlider(&frame, 0, 300, 50, 250, &theSimpleSlider); |
// place the view into the Window content view |
// we need to do this because CreateLabelSubButton needs a valid parent for our view. |
HIViewRef contentView; |
HIViewFindByID(HIViewGetRoot(theWind), kHIViewWindowContentID, &contentView); |
HIViewAddSubview(contentView, theSimpleSlider); |
// views are initially invisible, so make it visible |
HIViewSetVisible(theSimpleSlider, true); |
// |
// |
// let's create a more complex slider starting the same way |
// |
// |
HIViewRef theOverridedSlider; |
frame = CGRectOffset(frame, 100, 0); |
theStatus = HICreateDoubleSlider(&frame, 0, 300, 50, 250, &theOverridedSlider); |
HIViewAddSubview(contentView, theOverridedSlider); |
HIViewSetVisible(theOverridedSlider, true); |
// and add some new behavior (continuous display of the hi value) |
EventTypeSpec eventType2 = {kEventClassDoubleSlider, kEventControlHiValueFieldChanged}; |
InstallEventHandler(GetControlEventTarget(theOverridedSlider), NewEventHandlerUPP(HiValueFieldChanged), 1, &eventType2, NULL, NULL); |
// and a static text view to display the value |
ControlRef theStaticText; |
Rect statBounds = {90, 160, 110, 290}; |
CreateStaticTextControl(theWind, &statBounds, CFSTR("Move the hi slider!"), NULL, &theStaticText); |
// and link them together |
SetControlReference(theOverridedSlider, (SInt32)theStaticText); |
// let's add 4 buttons to set different lo and hi values |
SInt32 bottom = bounds.bottom - bounds.top - 20; |
SInt32 right = bounds.right - bounds.left - 320; |
Rect buttonRect = {bottom - 20, right - 110, bottom, right}; |
ControlRef button; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Set Lo to -25"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'SLM2'); |
SetControlReference(button, (SInt32)theOverridedSlider); |
HIViewSetVisible(button, true); |
buttonRect.bottom = buttonRect.top - 12; buttonRect.top = buttonRect.bottom - 20; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Set Hi to +50"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'SHP5'); |
SetControlReference(button, (SInt32)theOverridedSlider); |
HIViewSetVisible(button, true); |
buttonRect.bottom = buttonRect.top - 24; buttonRect.top = buttonRect.bottom - 20; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Set Lo to +25"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'SLP2'); |
SetControlReference(button, (SInt32)theOverridedSlider); |
HIViewSetVisible(button, true); |
buttonRect.bottom = buttonRect.top - 12; buttonRect.top = buttonRect.bottom - 20; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Set Hi to -50"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'SHM5'); |
SetControlReference(button, (SInt32)theOverridedSlider); |
HIViewSetVisible(button, true); |
// |
// |
// and let's test embedding |
// |
// |
HIViewRef theEmbeddedSlider; |
HIRect embFrame = { {30.0, 45.0}, {26.0, 245.0} }; |
theStatus = HICreateDoubleSlider(&embFrame, 0, 300, 50, 250, &theEmbeddedSlider); |
// place the view into the group box control |
HIViewAddSubview(grpControl, theEmbeddedSlider); |
// views are initially invisible, so make it visible |
HIViewSetVisible(theEmbeddedSlider, true); |
buttonRect.bottom = bottom; buttonRect.top = bottom - 20; |
buttonRect.right = right + 300; buttonRect.left = buttonRect.right - 130; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Move Slider"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'MES1'); |
SetControlReference(button, (SInt32)theEmbeddedSlider); |
HIViewSetVisible(button, true); |
buttonRect.left = 330; buttonRect.right = buttonRect.left + 130; |
CreatePushButtonControl(NULL, &buttonRect, CFSTR("Move Embedder"), &button); |
theStatus = HIViewAddSubview(contentView, button); |
SetControlCommandID(button, 'MES2'); |
SetControlReference(button, (SInt32)grpControl); |
HIViewSetVisible(button, true); |
ShowWindow(theWind); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-10-27