home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 7.6 KB | 297 lines | [TEXT/PJMM] |
- unit MyStandardFile;
- { DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
-
- interface
-
- uses
- Types, OSUtils, Files, Dialogs, StandardFile, MyTypes, MyUtilities, MyFileSystem;
-
- type
- MySFReply = record
- Rgood: boolean;
- Rfolder: boolean;
- RfType: OSType;
- RvRefNum: integer;
- RdirID: longInt;
- RfName: str63;
- end;
-
- function MFSPt: point;
- procedure GetFile (ffilter: Ptr; numTypes: integer; typeList: SFTypeList; var reply: MYSFReply);
- procedure GetFile1 (t: OSType; var reply: MySFReply);
- procedure GetFolder (ffilter: Ptr; numTypes: integer; typeList: SFTypeList; id: integer; var reply: MySFReply);
- { NOTE: GetFolder must be passed a Dialog ID with Button 11 being a folder button }
- { NOTE: reply.copy should be interpreted as reply.folder }
- procedure PutFile (str, origName: str255; var reply: MySFreply);
- procedure PutFolder (str, origName: str255; id: integer; var reply: MySFreply);
- { NOTE: PutFolder must be passed a Dialog ID with Button 9 being a folder button }
- { NOTE: reply.copy should be interpreted as reply.folder }
- function Button11Hook (item: integer; dlg: DialogPtr): integer;
- { NOTE: Button11Hook sets Button11 when it converts Button 11 to Button 1 (Open) }
- function Button9Hook (item: integer; dlg: DialogPtr): integer;
- { NOTE: Button9Hook sets Button9 when it converts Button 9 to Button 1 (Save) }
- procedure SetSFFile (wdrn: integer; dirID: longInt);
-
- implementation
-
- procedure SetSFFile (wdrn: integer; dirID: longInt);
- var
- oe: OSErr;
- vrn: integer;
- procID: longInt;
- s: str255;
- begin
- if dirID = 0 then
- oe := GetWDInfo(wdrn, vrn, dirID, procID)
- else
- vrn := wdrn;
- integerP(SFSaveDiskA)^ := -vrn;
- longIntP(CurDirStoreA)^ := dirID;
- end;
-
- function MFSPt: point;
- var
- pt: point;
- begin
- pt.v := 40;
- pt.h := 40;
- MFSPt := pt;
- end;
-
- procedure SetStdReply (var reply: MySFReply; stdReply: StandardFileReply);
- begin
- with reply do begin
- Rgood := stdReply.sfGood;
- Rfolder := ord(stdReply.sfIsFolder) <> 0; { Argghhh! Bloody Apple and there C booleans! }
- RfType := stdReply.sfType;
- RvRefNum := stdReply.sfFile.vRefNum;
- RdirID := stdReply.sfFile.parID;
- RfName := stdReply.sfFile.name;
- end;
- end;
-
- procedure SetOldReply (var reply: MySFReply; oldReply: SFReply);
- var
- oe: OSErr;
- begin
- with reply do begin
- Rgood := oldReply.good;
- Rfolder := oldReply.copy;
- RfType := oldReply.fType;
- oe := GetDirID(oldReply.vRefNum, RvRefNum, RdirID);
- RfName := oldReply.fName;
- end;
- end;
-
- procedure GetFile (ffilter: Ptr; numTypes: integer; typeList: SFTypeList; var reply: MySFReply);
- var
- stdReply: StandardFileReply;
- oldReply: SFReply;
- begin
- with reply do
- if has_newStdFile then begin
- StandardGetFile(ffilter, numTypes, typeList, stdReply);
- SetStdReply(reply, stdReply);
- end
- else begin
- SFGetFile(MFSPt, '', ffilter, numTypes, typeList, nil, oldReply);
- oldReply.copy := false;
- SetOldReply(reply, oldReply);
- end;
- end;
-
- procedure GetFile1 (t: OSType; var reply: MySFReply);
- var
- typeList: SFTypeList;
- begin
- if t = OSType(noType) then
- GetFile(nil, -1, typeList, reply)
- else begin
- typeList[0] := t;
- GetFile(nil, 1, typeList, reply);
- end;
- end;
-
- procedure PutFile (str, origName: str255; var reply: MySFreply);
- var
- stdReply: StandardFileReply;
- oldReply: SFReply;
- begin
- with reply do
- if has_newStdFile then begin
- StandardPutFile(str, origname, stdReply);
- SetStdReply(reply, stdReply);
- end
- else begin
- SFPutFile(MFSPt, str, origname, nil, oldReply);
- oldReply.copy := false;
- SetOldReply(reply, oldReply);
- end;
- end;
-
- procedure GrayButton (dlg: dialogPtr; item: integer);
- var
- kind: integer;
- h: handle;
- r: rect;
- ps: PenState;
- begin
- GetDItem(dlg, item, kind, h, r);
- InsetRect(r, 4, 2);
- GetPenState(ps);
- PenPat(gray);
- PenMode(patBic);
- PaintRoundRect(r, 3, 3);
- SetPenState(ps);
- end;
-
- procedure UngrayButton (dlg: dialogPtr; item: integer);
- var
- kind: integer;
- h: handle;
- r: rect;
- begin
- GetDItem(dlg, item, kind, h, r);
- Draw1Control(controlHandle(h));
- end;
-
- procedure UpdateButton (dlg: dialogPtr; item: integer; active: boolean);
- begin
- if not active then
- GrayButton(dlg, item);
- end;
-
- procedure InitButton (dlg: dialogPtr; item: integer; var active: boolean; new: boolean);
- var
- kind: integer;
- h: handle;
- r: rect;
- ps: PenState;
- begin
- active := new;
- GetDItem(dlg, item, kind, h, r);
- if active then
- HiliteControl(controlHandle(h), 0)
- else
- HiliteControl(controlHandle(h), 255);
- end;
-
- procedure SetButton (dlg: dialogPtr; item: integer; var active: boolean; new: boolean);
- begin
- if active <> new then begin
- if new then
- UngrayButton(dlg, item)
- else
- GrayButton(dlg, item);
- InitButton(dlg, item, active, new);
- end;
- end;
-
- var
- oldReply: SFReply;
- newReply: StandardFileReply;
- { item1 is ThisFolder }
- item1: integer;
- button1: boolean;
- active1: boolean;
-
- procedure SetButtons (dlg: dialogPtr);
- var
- new1: boolean;
- begin
- if has_newStdFile then begin
- new1 := newReply.sfFile.parID <> 1; { everywhere except desktop???? }
- end
- else begin
- new1 := true;
- end;
- SetButton(dlg, item1, active1, new1);
- end;
-
- function ButtonModalFilter (dlg: dialogPtr; var er: eventRecord; var item: integer): boolean;
- begin
- SetButtons(dlg);
- if (er.what = updateEvt) and (dlg = dialogPtr(er.message)) then begin
- UpdateButton(dlg, item1, active1);
- end;
- ButtonModalFilter := false;
- end;
-
- function ButtonModalFilterSys7 (dlg: dialogPtr; var er: eventRecord; var item: integer; data: ptr): boolean;
- begin
- ButtonModalFilterSys7 := ButtonModalFilter(dlg, er, item);
- end;
-
- function ButtonHook (item: integer; dlg: DialogPtr): integer;
- begin
- if not has_newStdFile or (GetWRefCon(dlg) = longint(sfMainDialogRefCon)) then begin
- if item = sfHookFirstCall then begin
- button1 := false;
- InitButton(dlg, item1, active1, active1);
- SetButtons(dlg);
- end;
- if active1 then begin
- if item <> sfHookLastCall then begin
- button1 := item = item1;
- if button1 then
- item := sfItemOpenButton;
- end;
- end;
- end;
- ButtonHook := item;
- end;
-
- function ButtonHookSys7 (item: integer; dlg: DialogPtr; data: ptr): integer;
- begin
- ButtonHookSys7 := ButtonHook(item, dlg);
- end;
-
- procedure PutFolder (str, origName: str255; id: integer; var reply: MySFreply);
- begin
- if has_newStdFile then begin
- item1 := 13;
- active1 := true;
- CustomPutFile(str, origName, newReply, id + 1, MFSPt, @ButtonHookSys7, @ButtonModalFilterSys7, nil, nil, nil); {@ButtonModalFilterSys7}
- SetStdReply(reply, newReply);
- reply.Rfolder := button1;
- end
- else begin
- item1 := 9;
- active1 := true;
- SFPPutFile(MFSPt, str, origname, @ButtonHook, oldReply, id, nil);
- oldReply.copy := button1;
- SetOldReply(reply, oldReply);
- end;
- end;
-
- function CallFileFilterSys7 (pb: CInfoPBPtr; addr: ptr): boolean;
- inline
- $205F, $4E90;
-
- function FileFilterSys7 (pb: CInfoPBPtr; addr: ptr): boolean;
- begin
- if (BAND(pb^.ioFlAttrib, $0010) = 0) and (addr <> nil) then
- FileFilterSys7 := CallFileFilterSys7(pb, addr)
- else
- FileFilterSys7 := false;
- end;
-
- procedure GetFolder (ffilter: Ptr; numTypes: integer; typeList: SFTypeList; id: integer; var reply: MySFReply);
- begin
- if has_newStdFile then begin
- item1 := 10;
- active1 := true;
- CustomGetFile(@FileFilterSys7, numTypes, typeList, newReply, id + 1, MFSpt, @ButtonHookSys7, @ButtonModalFilterSys7, nil, nil, ffilter);
- SetStdReply(reply, newReply);
- reply.Rfolder := button1;
- end
- else begin
- item1 := 11;
- active1 := true;
- SFPGetFile(MFSPt, '', ffilter, numTypes, typeList, @ButtonHook, oldReply, id, nil);
- oldReply.copy := button1;
- SetOldReply(reply, oldReply);
- end;
- end;
-
- end.