《ソースファイル:DoCommand.c》
// File-Save Asを選択したとき(レコーディングには非対応) void DoSaveAsCommand() { WindowPtr targetWindow; DocRecHandle docH; OSErr er; AEDesc defLoc; FSSpec defLocSpec; NavReplyRecord reply; NavDialogOptions dialogOptions; NavMenuItemSpecArrayHandle extPMenu; NavMenuItemSpecArrayPtr menuArrayPtr; NavEventUPP neProc = NewNavEventProc(myNavEventProc2); MyUserData2Handle popSelection;
popSelection = (MyUserData2Handle)NewHandle(sizeof(MyUserData)); (**popSelection).selectedType = myFileType;
if((targetWindow = FrontWindow()) != 0) { //アクティブなウインドウが存在する場合 docH = (DocRecHandle)GetWRefCon(targetWindow); // FSMakeFSSpec((**docH).vRefNum, (**docH).parID , //保存ファイル名を整える // (unsigned char*)(**docH).fileName, &savingFile);
NavGetDefaultDialogOptions(&dialogOptions); //ダイアログ設定は既定値 dialogOptions.dialogOptionFlags -= kNavAllowStationery; //既定のステーショナリ指定を表示しない //ポップアップメニューの構造体を作成する extPMenu = (NavMenuItemSpecArrayHandle)NewHandle( 3*sizeof(NavMenuItemSpec)); //構造体のメモリ領域を確保。ここが構造体の配列のようにふるまわせる dialogOptions.popupExtension = extPMenu; //オプションに設定
menuArrayPtr = *extPMenu; //一連のメモリ領域を構造体の配列として認識させる menuArrayPtr[0].version = kNavMenuItemSpecVersion; //1つめの構造体 menuArrayPtr[0].menuCreator = myCreator; menuArrayPtr[0].menuType = ’TEXT’; CopyString(menuArrayPtr[0].menuItemName, (unsigned char*)"\pテキストファイル"); menuArrayPtr[1].version = kNavMenuItemSpecVersion; //2つ目の構造体 menuArrayPtr[1].menuCreator = myCreator; menuArrayPtr[1].menuType = ’PICT’; CopyString(menuArrayPtr[1].menuItemName, (unsigned char*)"\pPICTファイル"); menuArrayPtr[2].version = kNavMenuItemSpecVersion; //3つ目の構造体 menuArrayPtr[2].menuCreator = myCreator; menuArrayPtr[2].menuType = ’tdST’; CopyString(menuArrayPtr[2].menuItemName, (unsigned char*)"\pステーショナリ");
CopyString(dialogOptions.savedFileName, (unsigned char*)(**docH).fileName); //最初から設定されているファイル名を文字列で指定できる er = FSMakeFSSpec((**docH).vRefNum, (**docH).parID, "\p", &defLocSpec); //ファイルのあるフォルダのFSSpecを構築 er = AECreateDesc(typeFSS, &defLocSpec, sizeof(FSSpec), &defLoc); //書類フォルダのAppleEventディスクリプタを生成
er = NavPutFile(&defLoc, &reply, &dialogOptions, neProc, myFileType, myCreator, popSelection); //ファイル保存のダイアログボックスを表示 DisposeHandle((Handle)extPMenu); 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); //指定したファイルの情報を取得する switch((**popSelection).selectedType) { //保存するファイルのタイプに応じ case myFileType: //TextDrawの書類ファイルの場合 SaveToFile(&documentFSSpec, targetWindow); //アクティブウインドウの内容を保存 (**docH).vRefNum = documentFSSpec.vRefNum; //DocRecordの更新 (**docH).parID = documentFSSpec.parID; CopyString((**docH).fileName, documentFSSpec.name); SetWTitle(targetWindow, documentFSSpec.name); //ウインドウタイトルを変更 (**docH).isDarty = 2; case ’tdST’: //ステーショナリとして保存する場合 SaveToFile(&documentFSSpec, targetWindow); //アクティブウインドウの内容を保存 SetStatBit(&documentFSSpec); break; case ’PICT’: //PICTに保存するのなら SaveToPict(&documentFSSpec, targetWindow); break; case ’TEXT’: //TEXTに保存するのなら SaveToText(&documentFSSpec, targetWindow); break; } } } DisposeHandle((Handle)popSelection); }
|