void DoSaveCommand() { WindowPtr targetWindow; DocRecHandle docH;
OSErr er; NavReplyRecord reply; NavDialogOptions dialogOptions; AEDesc defLoc; FSSpec defLocSpec; short fVolRef; long fDirID;
NavEventUPP neProc = NewNavEventProc(myNavEventProc);
if((targetWindow = FrontWindow()) != 0) { //アクティブなウインドウがあるとき docH = GetDocHandle(targetWindow); if(((**docH).isDarty & 2) == 0) { //保存されたかどうかを調べる //これが初めての保存作業の場合 HLock((Handle)docH); //このあと構造体のメンバーへのポインタを利用するのでロック NavGetDefaultDialogOptions(&dialogOptions); //ダイアログ設定は既定値 CopyCString(dialogOptions.savedFileName, (unsigned char *)"新しい文書ファイル名"); //最初から設定されているファイル名を文字列で指定できる er = FindFolder (kOnSystemDisk, kDocumentsFolderType, kDontCreateFolder, &fVolRef, &fDirID); //書類フォルダを探す er = FSMakeFSSpec(fVolRef, fDirID, "\p", &defLocSpec); //書類フォルダのFSSpecを構築 er = AECreateDesc(typeFSS, &defLocSpec, sizeof(FSSpec), &defLoc); //書類フォルダのAppleEventディスクリプタを生成
er = NavPutFile(&defLoc, &reply, &dialogOptions, neProc, myFileType, myCreator, NULL); //ファイル保存のダイアログボックスを表示 if(er == noErr && reply.validRecord) { //ファイル選択が指定されれば AEKeyword theKeyword; DescType actualType; Size actualSize; FSSpec documentFSSpec;
er = AEGetNthPtr(&(reply.selection), 1, typeFSS, &theKeyword, &actualType, &documentFSSpec, sizeof(FSSpec), &actualSize);
SaveToFile(&documentFSSpec, targetWindow); //ウインドウの書類を保存 //DocRecordのファイル関連のメンバーを更新 (**docH).vRefNum = documentFSSpec.vRefNum; (**docH).parID = documentFSSpec.parID; CopyString((**docH).fileName, documentFSSpec.name); SetWTitle(targetWindow, documentFSSpec.name); //ウインドウのタイトルを付けたファイル名に変更 } er = NavDisposeReply(&reply); AEDisposeDesc(&defLoc); } else { //すでに以前に1度保存している場合、ファイル名を整えて保存作業を行う FSSpec documentFSSpec; FSMakeFSSpec((**docH).vRefNum, (**docH).parID ,(**docH).fileName, &documentFSSpec); SaveToFile(&documentFSSpec, targetWindow); } (**docH).isDarty = 2; //すでに保存を行ったことを示すフラグを立てる。修正フラグをクリアする } }
//以下はイベントプロシージャで、NavGetFileのサンプルと同じもの void myNavEventProc( NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, NavCallBackUserData callBackUD) { EventRecord* thisEvent = ((callBackParms->eventData).eventDataParms).event; //イベント情報を取得しておく MyUserData userData = *(MyUserDataPtr)callBackUD; //ユーザデータを、コールバックルーチンで取り出す switch (callBackSelector) { //イベントの種類に応じ case kNavCBEvent: //一般的なイベントなら switch (thisEvent->what) { //イベントの種類に応じ case updateEvt: //アップデートイベントなら break; //ここでは何もしないけど… } break; case kNavCBCancel: //キャンセルボタンが押されたなら SysBeep(1); //システム警告音を鳴らす break; } //…という風にイベントごとの処理を記述する }
|