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 theCustomGetFile
procedure 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 functionMyCustomFileFilter
inspects the appropriate bit in the file attributes (ioFlAttrib
) field of the catalog information parameter block passed to it. If the directory bit is set,MyCustomFileFilter
checks 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 returnsTRUE
to 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 functionDoGetVolume
defined 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;