home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperLib 1997 Winter - Disc 1
/
HYPERLIB-1997-Winter-CD1.ISO.7z
/
HYPERLIB-1997-Winter-CD1.ISO
/
オンラインウェア
/
PRG
/
ListPrint.sit
/
ListPrint
/
OpenDialog.c
< prev
next >
Wrap
Text File
|
1994-11-25
|
8KB
|
271 lines
//******************************************************************************
//* *
//* Macintosh プログラム作成の勉強 *
//* This Program is lesson for Macintohs. *
//* *
//* 1994/11/ 9 By SAGAWA KAZUYOSHI *
//* *
//******************************************************************************
#include "Constants.h"
#include "ListPrint.h"
#define sfItemDone 10
#define sfItemAddAll 11
#define sfItemRemove 13
#define sfItemScrlList 14
typedef struct {
StandardFileReply *repPtr[2]; /* 選択ファイル情報ポインタ */
ListInfoData lt[2]; /* 0:元 1:選択側 */
OSType selType;
Boolean selStnry;
} SFData, *SFDataPtr;
//**************************************************************************
//*
//* 本モジュールの中だけで使用されている関数プロトタイプ宣言
//*
//**************************************************************************
pascal short AddDlgHook (short, DialogPtr, Ptr);
pascal Boolean AddModalFilter (DialogPtr, EventRecord *, short *, Ptr);
void DoDone (ListInfoData *);
void AddScrollListSetUp (short, DialogPtr, Ptr);
/**************************************************************************
*
* FUC 連続ファイル選択カスタムダイアログ
*
* IN 無し
* OT 無し
* EX 無し
*
*************************************************************************/
void DoAddDialog(void)
{
Point where = {-1,-1}; /* 中央表示 */
StandardFileReply sfReply;
SFData sfUserData;
OSErr err;
Boolean targetIsFolder, wasAliased;
SFTypeList FlType;
FlType[0] = 'TEXT';
sfUserData.repPtr[0] = &sfReply;
/* 選択ファイル情報保存ハンドル確保 */
sfUserData.lt[0].hStFl = (SelectFileInfo **) NewHandle(sizeof(SelectFileInfo));
(*sfUserData.lt[0].hStFl)->nextFile = 0;
sfUserData.lt[1].hStFl = (SelectFileInfo **) NewHandle(sizeof(SelectFileInfo));
(*sfUserData.lt[1].hStFl)->nextFile = 0;
CustomGetFile( 0, /* ファイル選択関数 */
1, /* ファイルのタイプ数 */
FlType, /* ファイルのタイプを示す配列 */
&sfReply, /* ファイル選択結果 */
openDialogID, /* リソースID番号 */
where, /* 表示位置 */
(DlgHookYDProcPtr)AddDlgHook, /* フック関数 */
(ModalFilterYDProcPtr)AddModalFilter, /* ModalFilter関数 */
0, /* アイテムのリスト */
0, /* activateProc */
&sfUserData); /* 各関数へ渡されるポインタ */
DisposeHandle( (Handle)sfUserData.lt[0].hStFl );
DisposeHandle( (Handle)sfUserData.lt[1].hStFl );
DoButtonHilite();
}
pascal short AddDlgHook(short item, DialogPtr theDlg, Ptr userData)
{
SFDataPtr uP;
Rect box;
Cell theCell;
Handle hItem;
static short ex = false;
short itemType;
if (GetWRefCon(theDlg) != sfMainDialogRefCon)
return item;
uP = (SFDataPtr) userData;
switch( item ) {
case sfItemCancelButton:
break;
case sfItemBalloonHelp:
case sfItemVolumeUser:
case sfItemEjectButton:
case sfItemDesktopButton:
case sfItemFileListUser:
case sfItemPopUpMenuUser:
break;
case sfHookFirstCall: /* スクロールリストを作成する */
AddScrollListSetUp(item, theDlg, userData);
GetDItem(theDlg, sfItemAddAll, &itemType, &hItem, &box);
HiliteControl((ControlHandle)hItem, 255);
break;
case sfHookNullEvent:
if ( !ex ) { /* スクロールリスト外枠を描画する */
box = (*uP->lt[1].hList)->rView; /* */
InsetRect(&box, -1, -1), FrameRect(&box);
ex = true;
}
GetDItem(theDlg, sfItemRemove, &itemType, &hItem, &box);
theCell = LLastClick(uP->lt[1].hList);
if ( (theCell.v >= 0) && (theCell.v <= uP->lt[1].CellNum) )
HiliteControl((ControlHandle)hItem, 0); /* itmeActive */
else HiliteControl((ControlHandle)hItem, 255); /* itmeInactive */
GetDItem(theDlg, sfItemDone, &itemType, &hItem, &box);
(uP->lt[1].CellNum < 0) ? HiliteControl((ControlHandle)hItem, 255)
: HiliteControl((ControlHandle)hItem, 0);
break;
case sfHookRebuildList:
case sfHookFolderPopUp:
case sfHookOpenFolder:
case sfHookOpenAlias:
case sfHookGoToDesktop:
case sfHookGoToAliasTarget:
case sfHookGoToParent:
case sfHookGoToNextDrive:
case sfHookGoToPrevDrive:
case sfHookChangeSelection:
SysBeep(0);/***/
case sfHookLastCall: /* Dailog処理終了直前 */
ex = false;
break;
case sfItemDone:
DoDone(&uP->lt[1]);
item = sfItemOpenButton;
break;
case sfItemOpenButton: /* case sfItemAddFile: */
// if (uP->repPtr[0]->sfGood) {/* この段階ではまだTRUEが設定されていない*/
ScrollListAddCell(uP->repPtr[0]->sfFile.name, &uP->lt[1]);
SelectFileSetUp(uP->repPtr[0]->sfFile, &uP->lt[1]);
// }
item = 0;
break;
case sfItemAddAll:
break;
case sfItemRemove:
if ( ScrollListDelCell(&uP->lt[1]) )
SelectFileDelete(uP->lt[1].DelCell.v, &uP->lt[1]);
break;
case sfItemScrlList:
break;
default:
// SysBeep(0),SysBeep(0);/***/
break;
}
return item;
}
pascal Boolean AddModalFilter(DialogPtr theDlg, EventRecord *ev, short *itemHit, Ptr userData)
{
SFDataPtr uP;
Boolean evHandled;
char keyPressed;
short itemType;
Rect box;
Point LocalMouse;
Handle popupCntlH, hList;
if (GetWRefCon(theDlg) != sfMainDialogRefCon)
return false;
uP = (SFDataPtr) userData;
evHandled = false;
LocalMouse.h = ev->where.h, LocalMouse.v = ev->where.v;
GlobalToLocal(&LocalMouse);
switch (ev->what) {
case keyDown:
case autoKey:
break;
case mouseDown:
box = (*uP->lt[1].hList)->rView;
box.right += scrollBarWidth;
if ( PtInRect(LocalMouse, &box ) )
LClick(LocalMouse, ev->modifiers, uP->lt[1].hList);
break;
}
return evHandled;
}
/**************************************************************************
*
* FUC Done処理
*
* IN スクローリングリスト情報のポインタ
* OT 無し
* EX 無し
*
*************************************************************************/
void DoDone(ListInfoData *lP)
{
int i;
FSSpec fileSpec;
SelectFileInfoHandle nextInfoHandle; /* 選択ファイル情報リスト */
nextInfoHandle = lP->hStFl; /* 選択ファイル情報リストの親 */
for (i = 0; i <= lP->CellNum; i++) { /* 選択ファイル情報リストの子サーチ */
if (i == 0) {
fileSpec = (*lP->hStFl)->flSpec; /* 親 */
}
else { /* 子 */
if ( (*nextInfoHandle)->nextFile == 0) {
break;
}
else {
fileSpec = (*(*nextInfoHandle)->nextFile)->flSpec;
nextInfoHandle = (*nextInfoHandle)->nextFile;
}
}
ScrollListAddCell(fileSpec.name, &listData);
SelectFileSetUp(fileSpec, &listData);
////DisposeHandle(hReadData);
}
}
//#########################################################################
//
// FUC スクローリングリスト初期配置(配備・組立)
//
// IN アイテム番号 ダイアログポインタ データへのポインタ
// OT 無し
// EX 無し
//
//#########################################################################
void AddScrollListSetUp(short item, DialogPtr theDlg, Ptr userData)
{
SFDataPtr uP;
short itemType;
Rect boxView, boxRect, boxDataBounds;
Point cSize;
Handle hScrlList;
uP = (SFDataPtr) userData;
GetDItem(theDlg, sfItemScrlList, &itemType, &hScrlList, &boxView);
boxView.right -= scrollBarWidth; /* スクロールバーの幅分小さくする */
SetPt(&cSize, 0, 0);
SetRect(&boxDataBounds, 0, 0, 1, 0);
uP->lt[1].hList = LNew( &boxView, /* 表示用 Rectalgle */
&boxDataBounds, /* 初期配列寸法 */
cSize, /* 各cellの希望の奥行と幅 */
0, /* resourceID */
thePort, /* */
true, /* */
false, /* hasGrow (scrollBar幅) */
false, /* scrollHoriz (横scrollBar) */
true); /* scrollVert (縦scrollBar) */
uP->lt[1].CellNum = -1; /* セル数(0〜 -1:未データ) */
}