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 / ListPrint.c < prev    next >
Text File  |  1995-07-25  |  12KB  |  469 lines

  1. //******************************************************************************
  2. //*                                            *
  3. //*    Macintosh プログラム作成の勉強                    *
  4. //*    This Program is lesson for Macintohs.                    *
  5. //*                                            *
  6. //*    Symantec C++ Ver 6.0 (Symantec THINK C Ver 5.0.4 から)        *
  7. //*                                            *
  8. //*    リスト印刷を行うプログラム                            *
  9. //*        ① ファイル選択・取り消し                        *
  10. //*        ② 文字フォント設定                            *
  11. //*        ③ 文字サイズ設定                            *
  12. //*        ④ タブサイズ設定                            *
  13. //*        ⑤ 行番号の有無設定                            *
  14. //*        ⑥ 行間隔設定                                *
  15. //*        ⑦ 用紙サイズ・方向(縦・横)                    *
  16. //*        ⑧ 印刷                                *
  17. //*                                            *
  18. //*        参考資料                                *
  19. //*            Symantec THINK C 5.0.4        *
  20. //*            サンプルプログラム                        *
  21. //*                                            *
  22. //*            漢字Talk7プログラミング THINK C        *
  23. //*            著 者:新居 雅行                        *
  24. //*            発行所:株式会社ビー・エヌ・エヌ                *
  25. //*                                            *
  26. //*            Macintoshツールボックス                *
  27. //*            著 者:J.C.メイ J.B.ホイットル            *
  28. //*            発行所:株式会社トッパン                    *
  29. //*                                            *
  30. //*            Macintoshプログラミングライブラリ            *
  31. //*             改訂版TOOLBOX 100の定石            *
  32. //*            著 者:小池 邦人                        *
  33. //*            発行所:株式会社アスキー                    *
  34. //*                                            *
  35. //*                                            *
  36. //*    1994/ 1/26 By SAGAWA KAZUYOSHI    作成(調査)開始日            *
  37. //*    1994/ 4/26 By SAGAWA KAZUYOSHI                        *
  38. //*    1994/ 9/20 By SAGAWA KAZUYOSHI                        *
  39. //*    1994/11/12 By SAGAWA KAZUYOSHI    Symantec THINK C Ver 5.0.4 から    *
  40. //*                        Symantec C++ Ver 6.0 に変更        *
  41. //*                        注) C++ に変換したわけではない    *
  42. //*    1995/02/09    カラーアイコンボタン                        *
  43. //*    1995/02/24    カーソル形状設定                        *
  44. //*                                            *
  45. //*                                            *
  46. //******************************************************************************
  47. //       1         2         3         4         5         6         7         8
  48. //345678901234567890123456789012345678901234567890123456789012345678901234567890
  49. //***********************************************************************
  50. //*
  51. //*    FUC    機能説明(FUNCTION)
  52. //*
  53. //*    IN    入力情報(INPUT)
  54. //*    OT    出力情報(OUTPUT)
  55. //*    EX    外部エリア(EXTERNAL) 参照・更新
  56. //*
  57. //***********************************************************************
  58. /*
  59.  *    インクルード
  60.  */
  61. #include    "Constants.h"
  62. #include    <PrintTraps.h>
  63. #include    "ListPrint.h"
  64.  
  65. //**************************************************************************
  66. //*
  67. //*    本モジュールの中だけで使用されている関数プロトタイプ宣言
  68. //*
  69. //**************************************************************************
  70. void    ListPrint_MacInitial    (void);
  71. void    EventLoop        (void);
  72. void    DoMouse            (void);
  73. void    DoKey            (void);
  74. void    DoUpdate        (void);
  75. void    DoActivate        (void);
  76. void    DoDeactivate        (void);
  77. void    DoMenuDown        (void);
  78. //void    DoMenu            (long);
  79. void    DoAppMenu        (int);
  80. void    DoFileMenu        (int);
  81. void    DoStyleMenu        (int);
  82. void    DoSourceMenu        (int);
  83. void    DoResume        (void);
  84. void    DoSuspend        (void);
  85.  
  86.  
  87. /*
  88.  *    外部ワーク定義
  89.  */
  90. WindowRecord    wRecord;        /* */
  91. EventRecord    event;            /* イベント取得用[ローレベルイベント]        */
  92. //WindowPtr    masterWindow;
  93. WindowPtr    CurrentWindow;
  94. Boolean        finish = false;
  95. int        fontItemNow, sizeItemNow, tabsItemNow;    /* 現在選択されている項目番号*/
  96.  
  97. ControlHandle    hControl[controlNumber];    /* コントロール部品ハンドル値の保存用    */
  98.  
  99. ListInfoData    listData;        /* スクローリングリスト情報データ            */
  100.  
  101. THPrint        hPrint = NULL;        /* プリントレコード                    */
  102. Handle        hFileIn;        /* ファイル読み込み用ハンドル            */
  103.  
  104. TEHandle    TEHtab;            /* タブ値(テキストエディットハンドル)        */
  105. Rect        destRect = { 100, 180, 125, 205 };/* 文字列を表示する枠をRectで指定    */
  106. Rect        viewRect;        /* TextEditを表示する枠をRectで指定            */
  107.  
  108. CiconInfoData    cIconData[colorIconNumber];    /* カラーアイコン情報データ            */
  109.  
  110. //int        linesInFolder;
  111. ControlHandle    vScroll;
  112.  
  113.  
  114. //##############################################################################
  115. //#                                            #
  116. //#    FUC    関数メイン                                #
  117. //#                                            #
  118. //#    IN    無し                                    #
  119. //#    OT    無し                                    #
  120. //#                                            #
  121. //##############################################################################
  122. void    main(void)
  123. {
  124.     int        r, i, j;
  125.     long        theNum;
  126.     Str255        theString;
  127.     Boolean        isEvent, isWNE;
  128.  
  129.     ListPrint_MacInitial();
  130.  
  131.     r = ListPrint_window_SetUp();
  132.  
  133.     for (i = 0; i < controlNumber; i++)                /* 部品ハンドル保存        */
  134.         hControl[i] = GetNewControl(removeCntlID+i, CurrentWindow);
  135.  
  136.                                 /* 選択ファイル情報保存ハンドル    */
  137.     listData.hStFl = (SelectFileInfo **) NewHandle(sizeof(SelectFileInfo));
  138.     (*listData.hStFl)->nextFile = 0;
  139.  
  140.     SetCtlValue(hControl[fontCntlNumber], fontItemNow);    /* PopUpMenuの表示を変更    */
  141.     SetCtlValue(hControl[sizeCntlNumber], sizeItemNow);    /* PopUpMenuの表示を変更    */
  142.  
  143.     TEActivate(TEHtab);
  144.  
  145.     for (i = 0; i < colorIconNumber; i++) {            /* カラーアイコンボタン    */
  146.         cIconData[i].ciHandle[0] = GetCIcon(printIconID+i);    /* ハンドル        */
  147.         cIconData[i].ciHandle[1] = GetCIcon(printIconID+i+colorIconOffSet);
  148.  
  149.         for (j = 1; j <= 4; j++) {                    /* 表示位置        */
  150.             GetIndString(theString, cIconRectSTRid, i*4+j);
  151.             StringToNum(theString, &theNum);
  152.  
  153.             if     (j == 1)    cIconData[i].rect.top  = theNum;
  154.             else if (j == 2)    cIconData[i].rect.left = theNum;
  155.             else if (j == 3)    cIconData[i].rect.bottom  = theNum;
  156.             else if (j == 4)    cIconData[i].rect.right   = theNum;
  157.         }
  158.     }
  159.  
  160.  
  161.     isWNE = true;
  162.     while ( !finish ) {
  163.         TEIdle(TEHtab);                /* 挿入ポインタの点滅            */
  164.  
  165.         if ( isWNE )
  166.             isEvent = WaitNextEvent(everyEvent, &event, 2, 0);
  167.         else {
  168.             isEvent = GetNextEvent(everyEvent, &event);
  169.         }
  170.         if (isEvent) EventLoop();
  171.         SystemTask();                    /* DAに一定時間を配分する        */
  172.     };
  173.     DisposeHandle( (Handle)listData.hStFl );
  174.  
  175. //    SetPort(CurrentWindow);
  176. //    DisposeWindow( CurrentWindow );        7.5 だとエラー終了する
  177. }
  178.  
  179. void    ListPrintScreenDisp(void)
  180. {
  181.     int        i;
  182.     Str255        Title;
  183.     Point        Local;
  184.     Rect        tempRect;
  185.     Cell        theCell;
  186.     Handle        hICON;
  187.  
  188.     DrawControls    (CurrentWindow);            /* コントロールを全て描く        */
  189.  
  190.     for (i = 0; i < colorIconNumber; i++) {        /* カラーアイコンボタン        */
  191.         PlotCIcon(&cIconData[i].rect, cIconData[i].ciHandle[0]);
  192.     }
  193.  
  194. //    LDoDraw(true, listData.hList);
  195. //    LUpdate(&CurrentWindow->visRgn, listData.hList);
  196.     tempRect = (*listData.hList)->rView;        /* スクローリングリスト枠描画    */
  197.     InsetRect(&tempRect, -1, -1), FrameRect(&tempRect);
  198.     Local.v = tempRect.top  - 2;
  199.     Local.h = tempRect.left + 5;
  200.     MoveTo(Local.h, Local.v), DrawString("¥p印刷対象ファイル");
  201.  
  202.     GetCTitle(hControl[fontCntlNumber], Title);
  203.     Local.v = (**hControl[fontCntlNumber]).contrlRect.top  + 15;
  204.     Local.h = (**hControl[fontCntlNumber]).contrlRect.left - 35;
  205.     MoveTo(Local.h, Local.v), DrawString(Title);    /* Locate printf */
  206.  
  207.     GetCTitle(hControl[sizeCntlNumber], Title);
  208.     Local.v = (**hControl[sizeCntlNumber]).contrlRect.top  + 15;
  209.     Local.h = (**hControl[sizeCntlNumber]).contrlRect.left - 35;
  210.     MoveTo(Local.h, Local.v), DrawString(Title);
  211.  
  212.     Local.v = (**TEHtab).viewRect.top  + 10;
  213.     Local.h = (**TEHtab).viewRect.left - 40;
  214.     MoveTo(Local.h, Local.v), DrawString("¥pTabs:");
  215.  
  216.     Local.v = (*hControl[lineSpaceNormalCntlNumber])->contrlRect.top  + 15;
  217.     Local.h = (*hControl[lineSpaceNormalCntlNumber])->contrlRect.left - 35;
  218.     MoveTo(Local.h, Local.v), DrawString("¥p行間隔");
  219.  
  220. //    TEActivate(TEHtab);
  221.     TEUpdate(&viewRect, TEHtab);
  222. ////    (**TEHtab).isSelect = true;        /* 選択フラグON    */
  223. ////    i = (**TEHtab).active;
  224.     FrameRect(&destRect);            /* 箱を描画する    */
  225.  
  226.     theCell.h = 0;
  227.     for (i = 0; i <= listData.CellNum; i++) {
  228.         theCell.v = i;
  229.         LDraw(theCell, listData.hList);
  230.     }
  231. }
  232.  
  233.  /*
  234.   *    マックマネージャー初期化
  235.   */
  236. void    ListPrint_MacInitial(void)
  237. {
  238.     InitGraf(&thePort);        /* Quick Draw(現在のgraph portへのPointer)    */
  239.     InitFonts();            /* Font Manager                */
  240.     FlushEvents(everyEvent, 0);    /* イベントキュークリアー            */
  241.     InitWindows();            /* ウィンドウManager                */
  242.     InitMenus();            /* Menu Manager                */
  243.     TEInit();            /* テキストエディット                */
  244.     InitDialogs(0L);        /* Dialog Manager                */
  245.     InitCursor();            /* 矢印カーソルを設定                */
  246.     MaxApplZone();            /* Appl Heapの大きさを上限まで広げる    */
  247. }
  248.  
  249. /**************************************************************************
  250.  *
  251.  *    FUC    システムカーソル設定
  252.  *
  253.  *    IN    カーソル形状
  254.  *    OT    無し
  255.  *    EX    無し
  256.  *
  257.  *    1995/02/24 新規作成
  258.  *************************************************************************/
  259. void    ListPrint_SetSystemCursor(int form)
  260. {
  261.     CursHandle    hCur;
  262.  
  263.     if (form >= iBeamCursor && form <= watchCursor) {
  264.         hCur = GetCursor(form);
  265.         SetCursor(*hCur);
  266.     }
  267. //    else {            矢印は印刷処理(System)が設定しているので不用
  268. //        SetCursor(&arrow);
  269. //    }
  270. }
  271.  
  272. /**************************************************************************
  273.  *
  274.  *    FUC    イベント種別判定と実行
  275.  *
  276.  *    IN    無し
  277.  *    OT    無し
  278.  *    EX    event.what
  279.  *
  280.  *************************************************************************/
  281. void    EventLoop(void)
  282. {
  283.     switch(event.what) {
  284.         case/*1*/    mouseDown:    DoMouse();    break;
  285.         case/*3*/    keyDown:    DoKey();    break;
  286.         case        autoKey:    DoKey();    break;
  287.         case/*6*/    updateEvt:    DoUpdate();    break;
  288.         case/*8*/    activateEvt:
  289.                     if( BitAnd(event.modifiers, activeFlag) != 1 )
  290.                         DoDeactivate();
  291.                     else
  292.                         DoActivate();
  293.                     break;
  294.     }
  295. }
  296.  
  297. void    DoMouse(void)
  298. {
  299.     int        Click;
  300.     WindowPtr    whichWindow;
  301.  
  302.     Click = FindWindow(event.where, &whichWindow);
  303.     switch(Click) {
  304.         case/*1*/    inMenuBar:    DoMenuDown();                break;
  305.         case/*2*/    inSysWindow:    SystemClick(&event, whichWindow);    break;
  306.         case/*3*/    inContent:    DoContent(whichWindow);        break;
  307.         case/*4*/    inDrag:        DoDrag(whichWindow);            break;
  308.         case/*5*/    inGrow:        DoGrow(whichWindow);            break;
  309.         case/*6*/    inGoAway:    DoGoAway(whichWindow, event.where);    break;
  310.         case/*7*/    inZoomIn:
  311.         case/*8*/    inZoomOut:    DoZoom(whichWindow, event.where, Click);    break;
  312.     }
  313. }
  314.  
  315. void    DoKey(void)
  316. {
  317.     long    itemID;
  318.     char    theChar;
  319.  
  320.     if (BitAnd(event.modifiers, cmdKey)) {
  321.         itemID = MenuKey(BitAnd(event.message, charCodeMask));
  322.         if(itemID) DoMenu(itemID);
  323.     }
  324.     else {
  325.         theChar = event.message & charCodeMask;
  326.         if ( (**TEHtab).active ) {
  327.             DoTab(theChar);
  328.         }
  329.         else {
  330.             DoScrollList(theChar);
  331.         }
  332.     }
  333. }
  334.  
  335. void    DoUpdate(void)
  336. {
  337.     WindowPtr    TargetWindow;
  338.  
  339.     TargetWindow = (WindowPtr)event.message;
  340.     SetPort        (TargetWindow);
  341.  
  342. /*    FillRect    (&TargetWindow->portRect, (ConstPatternParam)&gray);*/
  343.     BeginUpdate    (TargetWindow);
  344.     EraseRect    (&TargetWindow->portRect);
  345. //    DrawTextList    ();
  346.  
  347.     ListPrintScreenDisp();
  348.  
  349.     DoButtonHilite();
  350.  
  351.     EndUpdate    (TargetWindow);
  352. }
  353.  
  354. void    DoActivate(void)
  355. {
  356.     WindowPtr    TargetWindow;
  357.  
  358.     TargetWindow = FrontWindow();
  359.     SetPort(TargetWindow);
  360. }
  361.  
  362. void    DoDeactivate(void)
  363. {
  364.     WindowPtr    TargetWindow;
  365.  
  366.     TargetWindow = FrontWindow();
  367.     SetPort(TargetWindow);
  368. //    DrawGrowIcon(TargetWindow);
  369. }
  370.  
  371.  /*
  372.   *    メニュー選択
  373.   */
  374. void    DoMenuDown(void)
  375. {
  376.     long    itemID;
  377.  
  378.     itemID = MenuSelect(event.where);
  379.     if(itemID) DoMenu(itemID);        /* 選択されたら処理を行う    */
  380. }
  381.  
  382. void    DoMenu(long item)
  383. {
  384.     int    MenuID, SelectID;
  385.  
  386.     MenuID   = HiWord(item);
  387.     SelectID = LoWord(item);
  388.  
  389.     switch(MenuID) {
  390.         case    appleMenuID:    DoAppMenu  (SelectID);    break;
  391.         case    fileMenuID:    DoFileMenu (SelectID);    break;
  392.         case    styleMenuID:    DoStyleMenu(SelectID);    break;
  393.         case    fontMenuID:    CheckFontMenu (SelectID);    break;
  394.         case    sizeMenuID:    CheckSizeMenu (SelectID);    break;
  395.         case    sourceMenuID:    DoSourceMenu(SelectID);    break;
  396.         default:        break;
  397.     }
  398.     HiliteMenu(0);
  399. }
  400.  
  401. void    DoAppMenu(int ID)
  402. {
  403.     int    DAstat;
  404.     Str255    DAname;
  405.  
  406.     switch(ID) {
  407.         case        aboutItem:    CautionAlert(aboutAlertID, 0);    break;
  408.  
  409.         default:    GetItem(GetMHandle(appleMenuID), ID, DAname);
  410.                 DAstat = OpenDeskAcc(DAname);
  411.                 break;
  412.     }
  413. }
  414.  
  415. void    DoFileMenu(int ID)
  416. {
  417.     switch(ID) {
  418.         case    openItem:    DoOpenCommand();    break;
  419.         case    printItem:    DoPrintCommand();    break;
  420.         case    pageSetupItem:    DoPageSetupCommand();    break;
  421.  
  422.         case    quitItem:    DoQuitCommand();
  423.                     finish = true;        break;
  424.         default:        break;
  425.     }
  426. }
  427.  
  428. void    DoStyleMenu(int ID)
  429. {
  430.     switch(ID) {
  431. //        case    fontItem:    この項目が選択された場合、FontMenuID値が返される為
  432. //        case    sizeItem:    ここには飛んでこない。
  433.  
  434.         case    setTabsFontItem:    SetTabsFontDialog();    break;
  435.         case    addItem:        DoAddDialog();        break;
  436.         case    removeItem:        if ( ScrollListDelCell(&listData) )
  437.                             SelectFileDelete(listData.DelCell.v, &listData);
  438.                         DoButtonHilite();
  439.                         break;
  440.         default:            break;
  441.     }
  442. }
  443.  
  444. void    DoSourceMenu(int ID)
  445. {
  446.     switch(ID) {
  447.         case    sAddItem:    DoAddDialog();
  448.                     break;
  449.         case    sRemoveItem:    if ( ScrollListDelCell(&listData) )
  450.                         SelectFileDelete(listData.DelCell.v, &listData);
  451.                     DoButtonHilite();
  452.                     break;
  453.         default:        break;
  454.     }
  455. }
  456.  
  457. /*
  458.  *    
  459.  */
  460. void    DoResume(void)
  461. {
  462.     DoActivate();
  463. }
  464.  
  465. void    DoSuspend(void)
  466. {
  467.     DoDeactivate();
  468. }
  469.