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 >
Text File  |  1994-11-25  |  8KB  |  271 lines

  1. //******************************************************************************
  2. //*                                            *
  3. //*    Macintosh プログラム作成の勉強                    *
  4. //*    This Program is lesson for Macintohs.                    *
  5. //*                                            *
  6. //*    1994/11/ 9 By SAGAWA KAZUYOSHI                        *
  7. //*                                            *
  8. //******************************************************************************
  9. #include    "Constants.h"
  10. #include    "ListPrint.h"
  11.  
  12. #define        sfItemDone        10
  13. #define        sfItemAddAll        11
  14. #define        sfItemRemove        13
  15. #define        sfItemScrlList        14
  16.  
  17. typedef struct {
  18.         StandardFileReply    *repPtr[2];    /* 選択ファイル情報ポインタ    */
  19.         ListInfoData        lt[2];        /* 0:元 1:選択側        */
  20.  
  21.         OSType            selType;
  22.         Boolean            selStnry;
  23. } SFData, *SFDataPtr;
  24.  
  25.  
  26. //**************************************************************************
  27. //*
  28. //*    本モジュールの中だけで使用されている関数プロトタイプ宣言
  29. //*
  30. //**************************************************************************
  31. pascal short        AddDlgHook    (short, DialogPtr, Ptr);
  32. pascal Boolean        AddModalFilter    (DialogPtr, EventRecord *, short *, Ptr);
  33.  
  34. void        DoDone    (ListInfoData *);
  35. void        AddScrollListSetUp    (short, DialogPtr, Ptr);
  36.  
  37. /**************************************************************************
  38.  *
  39.  *    FUC    連続ファイル選択カスタムダイアログ
  40.  *
  41.  *    IN    無し
  42.  *    OT    無し
  43.  *    EX    無し
  44.  *
  45.  *************************************************************************/
  46. void    DoAddDialog(void)
  47. {
  48.     Point            where = {-1,-1};    /* 中央表示    */
  49.     StandardFileReply    sfReply;
  50.     SFData            sfUserData;
  51.     OSErr            err;
  52.     Boolean            targetIsFolder, wasAliased;
  53.     SFTypeList        FlType;
  54.  
  55.     FlType[0] = 'TEXT';
  56.  
  57.     sfUserData.repPtr[0] = &sfReply;
  58.                                 /* 選択ファイル情報保存ハンドル確保    */
  59.     sfUserData.lt[0].hStFl = (SelectFileInfo **) NewHandle(sizeof(SelectFileInfo));
  60.     (*sfUserData.lt[0].hStFl)->nextFile = 0;
  61.     sfUserData.lt[1].hStFl = (SelectFileInfo **) NewHandle(sizeof(SelectFileInfo));
  62.     (*sfUserData.lt[1].hStFl)->nextFile = 0;
  63.  
  64.     CustomGetFile(    0,                        /* ファイル選択関数        */
  65.             1,                        /* ファイルのタイプ数        */
  66.             FlType,                        /* ファイルのタイプを示す配列 */
  67.             &sfReply,                    /* ファイル選択結果        */
  68.             openDialogID,                    /* リソースID番号        */
  69.             where,                        /* 表示位置            */
  70.             (DlgHookYDProcPtr)AddDlgHook,        /* フック関数            */
  71.             (ModalFilterYDProcPtr)AddModalFilter,    /* ModalFilter関数    */
  72.             0,                        /* アイテムのリスト        */
  73.             0,                        /* activateProc        */
  74.             &sfUserData);                    /* 各関数へ渡されるポインタ    */
  75.  
  76.     DisposeHandle( (Handle)sfUserData.lt[0].hStFl );
  77.     DisposeHandle( (Handle)sfUserData.lt[1].hStFl );
  78.     DoButtonHilite();
  79. }
  80.  
  81. pascal short    AddDlgHook(short item, DialogPtr theDlg, Ptr userData)
  82. {
  83.     SFDataPtr    uP;
  84.     Rect        box;
  85.     Cell        theCell;
  86.     Handle        hItem;
  87.     static short    ex = false;
  88.     short        itemType;
  89.  
  90.     if (GetWRefCon(theDlg) != sfMainDialogRefCon)
  91.         return item;
  92.  
  93.     uP = (SFDataPtr) userData;
  94.     switch( item ) {
  95.         case    sfItemCancelButton:
  96.                 break;
  97.         case    sfItemBalloonHelp:
  98.         case    sfItemVolumeUser:
  99.         case    sfItemEjectButton:
  100.         case    sfItemDesktopButton:
  101.         case    sfItemFileListUser:
  102.         case    sfItemPopUpMenuUser:
  103.                 break;
  104.  
  105.         case    sfHookFirstCall:            /* スクロールリストを作成する    */
  106.                 AddScrollListSetUp(item, theDlg, userData);
  107.                 GetDItem(theDlg, sfItemAddAll, &itemType, &hItem, &box);
  108.                 HiliteControl((ControlHandle)hItem, 255);
  109.                 break;
  110.         case    sfHookNullEvent:
  111.                 if ( !ex ) {            /* スクロールリスト外枠を描画する    */
  112.                     box = (*uP->lt[1].hList)->rView;    /*     */
  113.                     InsetRect(&box, -1, -1), FrameRect(&box);
  114.                     ex = true;
  115.                 }
  116.                 GetDItem(theDlg, sfItemRemove, &itemType, &hItem, &box);
  117.                 theCell = LLastClick(uP->lt[1].hList);
  118.                 if ( (theCell.v >= 0) && (theCell.v <= uP->lt[1].CellNum) )
  119.                     HiliteControl((ControlHandle)hItem, 0);        /* itmeActive   */
  120.                 else    HiliteControl((ControlHandle)hItem, 255);        /* itmeInactive */
  121.  
  122.                 GetDItem(theDlg, sfItemDone, &itemType, &hItem, &box);
  123.                 (uP->lt[1].CellNum < 0)    ? HiliteControl((ControlHandle)hItem, 255)
  124.                                 : HiliteControl((ControlHandle)hItem, 0);
  125.  
  126.                 break;
  127.         case    sfHookRebuildList:
  128.         case    sfHookFolderPopUp:
  129.         case    sfHookOpenFolder:
  130.         case    sfHookOpenAlias:
  131.         case    sfHookGoToDesktop:
  132.         case    sfHookGoToAliasTarget:
  133.         case    sfHookGoToParent:
  134.         case    sfHookGoToNextDrive:
  135.         case    sfHookGoToPrevDrive:
  136.         case    sfHookChangeSelection:
  137.                 SysBeep(0);/***/
  138.         case    sfHookLastCall:        /* Dailog処理終了直前        */
  139.                 ex = false;
  140.                 break;
  141.  
  142.         case    sfItemDone:
  143.                 DoDone(&uP->lt[1]);
  144.                 item = sfItemOpenButton;
  145.                 break;
  146.         case    sfItemOpenButton:    /* case sfItemAddFile: */
  147. //                if (uP->repPtr[0]->sfGood) {/* この段階ではまだTRUEが設定されていない*/
  148.                     ScrollListAddCell(uP->repPtr[0]->sfFile.name, &uP->lt[1]);
  149.                     SelectFileSetUp(uP->repPtr[0]->sfFile, &uP->lt[1]);
  150. //                }
  151.                 item = 0;
  152.                 break;
  153.         case    sfItemAddAll:
  154.                 break;
  155.         case    sfItemRemove:
  156.                 if ( ScrollListDelCell(&uP->lt[1]) )
  157.                     SelectFileDelete(uP->lt[1].DelCell.v, &uP->lt[1]);
  158.                 break;
  159.         case    sfItemScrlList:
  160.                 break;
  161.         default:
  162. //                SysBeep(0),SysBeep(0);/***/
  163.                 break;
  164.     }
  165.     return item;
  166. }
  167.  
  168. pascal Boolean        AddModalFilter(DialogPtr theDlg, EventRecord *ev, short *itemHit, Ptr userData)
  169. {
  170.     SFDataPtr    uP;
  171.     Boolean     evHandled;
  172.     char         keyPressed;
  173.     short        itemType;
  174.     Rect        box;
  175.     Point        LocalMouse;
  176.     Handle        popupCntlH, hList;
  177.  
  178.     if (GetWRefCon(theDlg) != sfMainDialogRefCon)
  179.         return false;
  180.  
  181.     uP           = (SFDataPtr) userData;
  182.     evHandled    = false;
  183.     LocalMouse.h = ev->where.h, LocalMouse.v = ev->where.v;
  184.     GlobalToLocal(&LocalMouse);
  185.     switch (ev->what) {
  186.         case keyDown:
  187.         case autoKey:
  188.             break;
  189.         case mouseDown:
  190.             box = (*uP->lt[1].hList)->rView;
  191.             box.right += scrollBarWidth;
  192.             if ( PtInRect(LocalMouse, &box ) )
  193.                 LClick(LocalMouse, ev->modifiers, uP->lt[1].hList);
  194.             break;
  195.     }
  196.     return evHandled;
  197. }
  198.  
  199. /**************************************************************************
  200.  *
  201.  *    FUC    Done処理
  202.  *
  203.  *    IN    スクローリングリスト情報のポインタ
  204.  *    OT    無し
  205.  *    EX    無し
  206.  *
  207.  *************************************************************************/
  208. void    DoDone(ListInfoData *lP)
  209. {
  210.     int    i;
  211.     FSSpec    fileSpec;
  212.     SelectFileInfoHandle    nextInfoHandle;        /* 選択ファイル情報リスト        */
  213.  
  214.     nextInfoHandle = lP->hStFl;                /* 選択ファイル情報リストの親    */
  215.  
  216.     for (i = 0; i <= lP->CellNum; i++) {        /* 選択ファイル情報リストの子サーチ    */
  217.         if (i == 0) {
  218.             fileSpec = (*lP->hStFl)->flSpec;                /* 親    */
  219.         }
  220.         else {                                        /* 子    */
  221.             if ( (*nextInfoHandle)->nextFile == 0) {
  222.                 break;
  223.             }
  224.             else {
  225.                 fileSpec       = (*(*nextInfoHandle)->nextFile)->flSpec;
  226.                 nextInfoHandle =   (*nextInfoHandle)->nextFile;
  227.             }
  228.         }
  229.         ScrollListAddCell(fileSpec.name, &listData);
  230.         SelectFileSetUp(fileSpec, &listData);
  231. ////DisposeHandle(hReadData);
  232.     }
  233. }
  234.  
  235. //#########################################################################
  236. //
  237. //    FUC    スクローリングリスト初期配置(配備・組立)
  238. //
  239. //    IN    アイテム番号 ダイアログポインタ データへのポインタ
  240. //    OT    無し
  241. //    EX    無し
  242. //
  243. //#########################################################################
  244. void    AddScrollListSetUp(short item, DialogPtr theDlg, Ptr userData)
  245. {
  246.     SFDataPtr    uP;
  247.     short        itemType;
  248.     Rect        boxView, boxRect, boxDataBounds;
  249.     Point        cSize;
  250.     Handle        hScrlList;
  251.  
  252.     uP = (SFDataPtr) userData;
  253.     GetDItem(theDlg, sfItemScrlList, &itemType, &hScrlList, &boxView);
  254.  
  255.     boxView.right -= scrollBarWidth;            /* スクロールバーの幅分小さくする    */
  256.     SetPt(&cSize, 0, 0);
  257.     SetRect(&boxDataBounds, 0, 0,  1, 0);
  258.  
  259.     uP->lt[1].hList = LNew(    &boxView,        /* 表示用 Rectalgle            */
  260.                     &boxDataBounds,    /* 初期配列寸法            */
  261.                     cSize,            /* 各cellの希望の奥行と幅        */
  262.                     0,            /* resourceID                */
  263.                     thePort,        /* */
  264.                     true,            /* */
  265.                     false,            /* hasGrow    (scrollBar幅)        */
  266.                     false,            /* scrollHoriz    (横scrollBar)        */
  267.                     true);            /* scrollVert    (縦scrollBar)        */
  268.  
  269.     uP->lt[1].CellNum = -1;                /* セル数(0〜  -1:未データ)    */
  270. }
  271.