Important: The information in this document is obsolete and should not be used for new development.
Selecting a Volume
You can present the recommended user interface for selecting a volume by calling theCustomGetFileprocedure and passing it the addresses of a custom file filter function and a dialog hook function. See "Selecting Volumes and Directories" on page 3-10 for a description of the appearance and behavior of the volume selection dialog box.The file filter function used to select volumes is quite simple; it ensures that only volumes, not files or directories, are listed in the dialog box displayed by
CustomGetFile. Listing 3-16 defines a file filter function you can use to do this.Listing 3-20 A file filter function that lists only volumes
FUNCTION MyCustomFileFilter (pb: CInfoPBPtr; myDataPtr: Ptr): Boolean; CONST kFolderBit = 4; {bit set in ioFlAttrib for a directory} BEGIN {list volumes only} MyCustomFileFilter := TRUE; {assume you don't list the item} IF BTst(pb^.ioFlAttrib, kFolderBit) AND (pb^.ioDrParID = fsRtParID) THEN MyCustomFileFilter := FALSE; END;The functionMyCustomFileFilterinspects the appropriate bit in the file attributes (ioFlAttrib) field of the catalog information parameter block passed to it. If the directory bit is set,MyCustomFileFilterchecks whether the parent directory ID of the directory is equal tofsRtParID, which is always the parent directory ID of a volume's root directory. If it is, the file filter function returnsFALSE, indicating that the item should appear in the list of volumes; otherwise, the file filter function returnsTRUEto exclude the item from the list.A dialog hook function for handling the items in the volume selection dialog box is defined in Listing 3-21.
Listing 3-21 Handling user selections in the volume selection dialog box
FUNCTION MyDlgHook (item: Integer; theDialog: DialogPtr; myDataPtr: Ptr): Integer; VAR myType: Integer; {menu item selected} myHandle: Handle; {needed for GetDItem} myRect: Rect; {needed for GetDItem} myName: Str255; {new title for Open button} BEGIN MyDlgHook := item; {default, except in special cases below} IF GetWRefCon(WindowPtr(theDialog)) <> LongInt(sfMainDialogRefCon) THEN Exit(MyDlgHook); {this function is only for main dialog box} CASE item OF sfHookFirstCall: BEGIN {Set button title and go to desktop.} myName := 'Select'; GetDItem(theDialog, sfItemOpenButton, myType, myHandle, myRect); SetCTitle(ControlHandle(myHandle), myName); MyDlgHook := sfHookGoToDesktop; END; sfHookGoToDesktop: {map Cmd-D to a null event} MyDlgHook := sfHookNullEvent; sfHookChangeSelection: MyDlgHook := sfHookGoToDesktop; sfHookGoToNextDrive: {map Cmd-Left Arrow to a null event} MyDlgHook := sfHookNullEvent; sfHookGoToPrevDrive: {map Cmd-Right Arrow to a null event} MyDlgHook := sfHookNullEvent; sfItemOpenButton, sfHookOpenFolder: MyDlgHook := sfItemOpenButton; OTHERWISE ; END; END;You can prompt the user to select a volume by calling the functionDoGetVolumedefined in Listing 3-22.Listing 3-22 Presenting the volume selection dialog box
FUNCTION DoGetVolume: StandardFileReply; VAR myReply: StandardFileReply; myTypes: SFTypeList; {types of files to display} myPoint: Point; {upper-left corner of box} myNumTypes: Integer; myModalFilter: ModalFilterYDProcPtr; myActiveList: Ptr; myActivateProc: ActivateYDProcPtr; CONST rGetVolumeDLOG = 129; {resource ID of custom dialog box} BEGIN myNumTypes := -1; {pass all types of files} myPoint.h := -1; {center dialog box on screen} myPoint.v := -1; myModalFilter := NIL; myActiveList := NIL; myActivateProc := NIL; CustomGetFile(@MyCustomFileFilter, myNumTypes, myTypes, myReply, rGetVolumeDLOG, myPoint, @MyDlgHook, myModalFilter, myActiveList, myActivateProc, @myReply); DoGetVolume := myReply; END;