タイトル【Carbon化シリーズ】プログラム-DoSaveAsCommandカテゴリーCarbon/CF, Carbon化
作成日2000/7/4 19:37:4作成者新居雅行

《ソースファイル: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);
}
関連リンク