File: 
 
[RetroPC.NET] / 
np2 / 
macos9 / 
dialog / 
dialogs.cpp
 Revision 
1.2: 
download - view: 
text, 
annotated - 
select for diffs
Thu Oct 23 21:58:44 2003 JST (22 years ago) by 
yui
Branches: 
MAIN
CVS tags: 
VER_0_82_x64,
VER_0_82,
VER_0_81A,
VER_0_81,
VER_0_80,
VER_0_79,
VER_0_78,
VER_0_77,
VER_0_76,
VER_0_75,
VER_0_74,
VER_0_73,
VER_0_72,
VER_0_71,
VER_0_70,
HEAD
fix MacOS9 (T.Yui)
#include	"compiler.h"
#include	"strres.h"
#include	"dialogs.h"
Handle GetDlgItem(DialogPtr hWnd, short pos) {
	Handle	ret;
	Rect	rct;
	short	s;
	GetDialogItem(hWnd, pos, &s, &ret, &rct);
	return(ret);
}
// ---- file select
static const BYTE pathsep[2] = {0x01, ':'};
static void backpalcalcat(char *dst, int leng, const BYTE *src) {
	int		dlen;
	int		slen;
	if (leng < 2) {
		return;
	}
	slen = src[0];
	dlen = strlen(dst);
	if ((slen + dlen + 1) > leng) {
		if (slen >= leng) {
			slen = leng - 1;
			dlen = 0;
		}
		else {
			dlen = leng - slen - 1;
		}
	}
	dst[slen + dlen] = '\0';
	while(dlen--) {
		dst[slen + dlen] = dst[dlen];
	}
	CopyMemory(dst, (char *)src + 1, slen);
}
static void fsspec2path(FSSpec *fs, char *dst, int leng) {
	CInfoPBRec	cipbr;
	Str255		dname;
	if (!leng) {
		return;
	}
	dst[0] = '\0';
	backpalcalcat(dst, leng, fs->name);
	cipbr.dirInfo.ioVRefNum = fs->vRefNum;
	cipbr.dirInfo.ioDrParID = fs->parID;
	cipbr.dirInfo.ioFDirIndex = -1;
	cipbr.dirInfo.ioNamePtr = dname;
	do {
		cipbr.dirInfo.ioDrDirID = cipbr.dirInfo.ioDrParID;
		if (PBGetCatInfo(&cipbr, FALSE) != noErr) {
			break;
		}
		backpalcalcat(dst, leng, pathsep);
		backpalcalcat(dst, leng, dname);
	} while(cipbr.dirInfo.ioDrDirID != fsRtDirID);
}
#if TARGET_API_MAC_CARBON
static pascal void dummyproc(NavEventCallbackMessage sel, NavCBRecPtr prm,
													NavCallBackUserData ud) {
	(void)sel;
	(void)prm;
	(void)ud;
}
BOOL dlgs_selectfile(char *name, int size) {
	BOOL				ret;
	OSErr				err;
	NavDialogOptions	opt;
	NavReplyRecord		reply;
	NavEventUPP			proc;
	long				count;
	long				i;
	FSSpec				fss;
	ret = FALSE;
	err = NavGetDefaultDialogOptions(&opt);
	if (err != noErr) {
		goto fsel_exit;
	}
	opt.dialogOptionFlags &= ~kNavAllowPreviews;
	opt.dialogOptionFlags &= ~kNavAllowMultipleFiles;
	proc = NewNavEventUPP(dummyproc);
	err = NavGetFile(NULL, &reply, &opt, proc, NULL, NULL, NULL, NULL);
	DisposeNavEventUPP(proc);
	if ((!reply.validRecord) && (ret != noErr)) {
		goto fsel_exit;
	}
	err = AECountItems(&reply.selection, &count);
	if (err == noErr) {
		for (i=1; i<= count; i++) {
			err = AEGetNthPtr(&reply.selection, i, typeFSS, NULL, NULL,
													&fss, sizeof(fss), NULL);
			if (err == noErr) {
				fsspec2path(&fss, name, size);
				ret = TRUE;
				break;
			}
		}
		err = NavDisposeReply(&reply);
	}
fsel_exit:
	return(ret);
}
BOOL dlgs_selectwritefile(char *name, int size, const char *def) {
	BOOL				ret;
	OSErr				err;
	NavDialogOptions	opt;
	NavReplyRecord		reply;
	NavEventUPP			proc;
	long				count;
	long				i;
	FSSpec				fss;
	ret = FALSE;
	err = NavGetDefaultDialogOptions(&opt);
	if (err != noErr) {
		goto fswf_exit;
	}
	opt.dialogOptionFlags |= kNavNoTypePopup;
	mkstr255(opt.savedFileName, def);
	proc = NewNavEventUPP(dummyproc);
	err = NavPutFile(NULL, &reply, &opt, proc, '????', '????', NULL);
	DisposeNavEventUPP(proc);
	if ((!reply.validRecord) && (ret != noErr)) {
		goto fswf_exit;
	}
	err = AECountItems(&reply.selection, &count);
	if (err == noErr) {
		for (i=1; i<= count; i++) {
			err = AEGetNthPtr(&reply.selection, i, typeFSS, NULL, NULL,
													&fss, sizeof(fss), NULL);
			if (err == noErr) {
				fsspec2path(&fss, name, size);
				ret = TRUE;
				break;
			}
		}
		err = NavDisposeReply(&reply);
	}
fswf_exit:
	return(ret);
}
#else
BOOL dlgs_selectfile(char *name, int size) {
	StandardFileReply	sfr;
	StandardGetFile(NULL, -1, NULL, &sfr);
	if (sfr.sfGood) {
		fsspec2path(&sfr.sfFile, name, size);
		return(TRUE);
	}
	else {
		return(FALSE);
	}
}
BOOL dlgs_selectwritefile(char *name, int size, const char *def) {
	Str255				defname;
	StandardFileReply	sfr;
	mkstr255(defname, def);
	StandardPutFile(NULL, defname, &sfr);
	if (sfr.sfGood) {
		fsspec2path(&sfr.sfFile, name, size);
		return(TRUE);
	}
	else {
		return(FALSE);
	}
}
#endif
RetroPC.NET-CVS <cvs@retropc.net>