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.
TestFinderEvents.c
// |
// Complaints and kudos to: |
// |
// Pete Gontier |
// Apple Macintosh Developer Technical Support |
// <gurgle@apple.com> |
// |
#define OLDROUTINELOCATIONS 0 |
#define OLDROUTINENAMES 0 |
#define SystemSevenOrLater 1 |
#ifndef __FONTS__ |
# include <Fonts.h> |
#endif |
#ifndef __DIALOGS__ |
# include <Dialogs.h> |
#endif |
#ifndef __RESOURCES__ |
# include <Resources.h> |
#endif |
#ifndef __STANDARDFILE__ |
# include <StandardFile.h> |
#endif |
#ifndef __APPLEEVENTS__ |
# include <AppleEvents.h> |
#endif |
#include "MoreFinderEvents.h" |
static Boolean gQuitting; |
static pascal OSErr QuitAppleEventHandler (const AppleEvent *, AppleEvent *, long) |
{ |
gQuitting = true; |
return noErr; |
} |
static pascal OSErr InitMac (void) |
{ |
MaxApplZone ( ); |
InitGraf (&(qd.thePort)); |
InitFonts ( ); |
InitWindows ( ); |
InitMenus ( ); |
TEInit ( ); |
InitDialogs (nil); |
return noErr; |
} |
static pascal void AppleMenuCommand (short) |
{ |
} |
static pascal short DlgHookYDProc (short item, DialogRef dRef, void *ydP) |
{ |
if (GetWRefCon (dRef) == sfMainDialogRefCon) |
{ |
if (item == sfHookFirstCall) |
{ |
Handle messageDitlH = Get1Resource ('DITL',*(short*)ydP); |
if (!ResError ( ) && messageDitlH) |
{ |
DetachResource (messageDitlH); |
if (ResError ( )) |
ReleaseResource (messageDitlH); |
else |
{ |
AppendDITL (dRef,messageDitlH,appendDITLBottom); |
DisposeHandle (messageDitlH); |
} |
} |
} |
} |
return item; |
} |
static pascal OSErr SelectAndAct (pascal OSErr (*actor) (const AliasRecord **), Boolean useParent) |
{ |
OSErr err = noErr; |
StandardFileReply *replyP = (StandardFileReply *) NewPtr (sizeof (StandardFileReply)); |
if (!(err = MemError ( ))) |
{ |
Point sfPoint = { -1, -1 }; |
short msgDitlResID = useParent ? 129 : 128; |
CustomGetFile (nil,-1,nil,replyP,sfGetDialogID,sfPoint,DlgHookYDProc,nil,nil,nil,&msgDitlResID); |
if (replyP->sfGood) |
{ |
if (!useParent || !(err = FSMakeFSSpec (replyP->sfFile.vRefNum,replyP->sfFile.parID,nil,&(replyP->sfFile)))) |
{ |
AliasHandle aliasH = nil; |
if (!(err = NewAliasMinimal (&(replyP->sfFile), &aliasH))) |
{ |
err = actor (aliasH); |
DisposeHandle ((Handle) aliasH); |
if (!err) err = MemError ( ); |
} |
} |
} |
DisposePtr ((Ptr) replyP); |
if (!err) err = MemError ( ); |
} |
return err; |
} |
static pascal Boolean VolFileFilterYDProc (CInfoPBPtr, void *) |
{ |
return true; |
} |
static pascal short VolDlgHookYDProc (short item, DialogRef, void *) |
{ |
switch (item) |
{ |
case sfHookFirstCall : |
item = sfHookGoToDesktop; |
break; |
case sfHookGoToAliasTarget : |
case sfHookGoToPrevDrive : |
case sfHookGoToNextDrive : |
case sfHookChangeSelection : |
SysBeep (10); |
item = sfHookNullEvent; |
break; |
case sfHookOpenFolder : |
item = sfItemOpenButton; |
break; |
} |
return item; |
} |
static pascal OSErr ChooseAndUnmount (void) |
{ |
OSErr err = noErr; |
StandardFileReply reply; |
Point sfWhere = {-1,-1}; |
CustomGetFile (VolFileFilterYDProc,-1,nil,&reply,sfGetDialogID,sfWhere,VolDlgHookYDProc,nil,nil,nil,nil); |
if (reply.sfGood) |
err = MFE_UnmountVolume (reply.sfFile.vRefNum); |
return err; |
} |
static pascal OSErr PageSetupAndPrint (const AliasRecord **aliasH) |
{ |
OSErr err = MFE_PageSetup (aliasH); |
if (!err) err = MFE_PrintWindow (aliasH); |
return err; |
} |
static const AliasRecord **gAliasToDrag; |
static pascal OSErr MoveFile2 (const AliasRecord **destAlias) |
{ |
return MFE_Move (gAliasToDrag,destAlias); |
} |
static pascal OSErr CopyFile2 (const AliasRecord **destAlias) |
{ |
return MFE_Copy (gAliasToDrag,destAlias); |
} |
static pascal OSErr CopyFile (const AliasRecord **aliasToDrag) |
{ |
gAliasToDrag = aliasToDrag; |
return SelectAndAct (CopyFile2,true); |
} |
static pascal OSErr MoveFile (const AliasRecord **aliasToDrag) |
{ |
gAliasToDrag = aliasToDrag; |
return SelectAndAct (MoveFile2,true); |
} |
static pascal OSErr FinderMenuCommand (short menuItem) |
{ |
OSErr err = unimpErr; |
enum |
{ |
kMenuItem_Title, |
kMoveFile, |
kCopyFile, |
kMenuItem_Divider2, |
kMenuItem_Reveal, |
kMenuItem_OpenParent, |
kMenuItem_CloseParent, |
kMenuItem_Divider3, |
kMenuItem_PageSetupParent, |
kMenuItem_PrintParent, |
kMenuItem_Divider4, |
kMenuItem_MakeAlias, |
kMenuItem_Duplicate, |
kMenuItem_OpenSelection, |
kMenuItem_PrintSelection, |
kMenuItem_Divider5, |
kMenuItem_PutAway, |
kMenuItem_UnmountVol, |
kMenuItem_Divider6, |
kMenuItem_GetInfo, |
kMenuItem_CloseGetInfo, |
kMenuItem_Divider7, |
kMenuItem_Sharing, |
kMenuItem_CloseSharing, |
kMenuItem_Divider8, |
kMenuItem_Sleep, |
kMenuItem_Restart, |
kMenuItem_ShutDown, |
kMenuItem_Divider9, |
kMenuItem_EmptyTrash, |
kMenuItem_Divider10, |
kMenuItem_ShowAbout, |
kMenuItem_HideAbout, |
kMenuItem_Divider11, |
kMenuItem_ShowClip, |
kMenuItem_HideClip |
}; |
switch (menuItem) |
{ |
case kCopyFile : |
err = SelectAndAct (CopyFile,false); |
break; |
case kMoveFile : |
err = SelectAndAct (MoveFile,false); |
break; |
case kMenuItem_PutAway : |
err = SelectAndAct (MFE_PutAway,false); |
break; |
case kMenuItem_MakeAlias : |
err = SelectAndAct (MFE_MakeAlias,false); |
break; |
case kMenuItem_Duplicate : |
err = SelectAndAct (MFE_Duplicate,false); |
break; |
case kMenuItem_OpenSelection : |
err = SelectAndAct (MFE_OpenSelection,false); |
break; |
case kMenuItem_PrintSelection : |
err = SelectAndAct (MFE_PrintSelection,false); |
break; |
case kMenuItem_PageSetupParent : |
err = SelectAndAct (MFE_PageSetup,true); |
break; |
case kMenuItem_PrintParent : |
err = SelectAndAct (PageSetupAndPrint,true); |
break; |
case kMenuItem_OpenParent : |
err = SelectAndAct (MFE_OpenSelection,true); |
break; |
case kMenuItem_CloseParent : |
err = SelectAndAct (MFE_CloseWindow,true); |
break; |
case kMenuItem_CloseGetInfo : |
err = SelectAndAct (MFE_CloseGetInfo,false); |
break; |
case kMenuItem_GetInfo : |
err = SelectAndAct (MFE_OpenGetInfo,false); |
break; |
case kMenuItem_CloseSharing : |
err = SelectAndAct (MFE_CloseSharing,true); |
break; |
case kMenuItem_Sharing : |
err = SelectAndAct (MFE_OpenSharing,true); |
break; |
case kMenuItem_EmptyTrash : |
err = MFE_EmptyTrash ( ); |
break; |
case kMenuItem_ShowAbout : |
err = MFE_ShowAbout ( ); |
break; |
case kMenuItem_HideAbout : |
err = MFE_HideAbout ( ); |
break; |
case kMenuItem_ShowClip : |
err = MFE_ShowClipboard ( ); |
break; |
case kMenuItem_HideClip : |
err = MFE_HideClipboard ( ); |
break; |
case kMenuItem_Reveal : |
err = SelectAndAct (MFE_Reveal,false); |
break; |
case kMenuItem_UnmountVol : |
err = ChooseAndUnmount ( ); |
break; |
case kMenuItem_Sleep : |
err = MFE_Sleep ( ); |
break; |
case kMenuItem_Restart : |
err = MFE_Restart ( ); |
break; |
case kMenuItem_ShutDown : |
err = MFE_ShutDown ( ); |
break; |
} |
return err; |
} |
static pascal void EditMenuCommand (short) |
{ |
} |
static pascal OSErr Command (long ms) |
{ |
OSErr err = noErr; |
short menuID = ms >> 16, |
menuItem = ms; |
enum |
{ |
kMenuID_File = 129, |
kMenuID_Apple, |
kMenuID_Finder, |
kMenuID_Edit |
}; |
switch (menuID) |
{ |
case kMenuID_File : |
gQuitting = true; |
break; |
case kMenuID_Apple : |
AppleMenuCommand (menuItem); |
break; |
case kMenuID_Finder : |
err = FinderMenuCommand (menuItem); |
break; |
case kMenuID_Edit : |
EditMenuCommand (menuItem); |
break; |
} |
return err; |
} |
static pascal OSErr HandleEvent (const EventRecord *eventP) |
{ |
OSErr err = noErr; |
if (eventP->what == kHighLevelEvent) |
AEProcessAppleEvent (eventP); |
else if (eventP->what == mouseDown) |
{ |
WindowRef whichWindow; |
short partCode = FindWindow (eventP->where, &whichWindow); |
if (partCode == inMenuBar) |
{ |
long ms = MenuSelect (eventP->where); |
if (ms) |
err = Command (ms); |
HiliteMenu (0); |
} |
} |
return err; |
} |
static pascal Boolean SetUpMenuBar (void) |
{ |
Boolean result = false; |
Handle mBar = GetNewMBar (128); |
if (!ResError ( ) && mBar) |
{ |
SetMenuBar (mBar); |
AppendResMenu (GetMenuHandle (130), 'DRVR'); |
DrawMenuBar ( ); |
result = true; |
ReleaseResource (mBar); |
} |
return result; |
} |
void main (void) |
{ |
if (!InitMac ( )) |
{ |
if (SetUpMenuBar ( )) |
{ |
if (!(AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, |
NewAEEventHandlerProc (QuitAppleEventHandler), 0, false))) |
{ |
do |
{ |
OSErr err = noErr; |
EventRecord event; |
InitCursor ( ); |
WaitNextEvent (everyEvent, &event, -1, nil); |
err = HandleEvent (&event); |
if (err) SysBeep (10); |
} |
while (!gQuitting); |
} |
} |
} |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14