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 / Print.c < prev    next >
Text File  |  1994-11-25  |  10KB  |  384 lines

  1. //******************************************************************************
  2. //*                                            *
  3. //*    Macintosh プログラム作成の勉強                    *
  4. //*    This Program is lesson for Macintohs.                    *
  5. //*                                            *
  6. //*    1994/ 9/23 By SAGAWA KAZUYOSHI                        *
  7. //*    1994/11/15 By SAGAWA KAZUYOSHI                        *
  8. //*                                            *
  9. //******************************************************************************
  10. /*
  11.  *    インクルード
  12.  */
  13. #include    "Constants.h"
  14. #include    "ListPrint.h"
  15.  
  16. #define        LeftMarginPixel    20        /* 左端からのオフセット    */
  17.  
  18. //**************************************************************************
  19. //*
  20. //*    本モジュールの中だけで使用されている関数プロトタイプ宣言
  21. //*
  22. //**************************************************************************
  23. void    TabMoveDrawText    (Ptr, int, int);
  24. void    TabSpaceDrawText    (Ptr, int, int);
  25. int    FnameDrawString    (Str63, int);
  26. void    LineNumberDrawText    (int);
  27. void    PageNumberDrawText    (int, int);
  28. int    PrintCancelCheck    (void);
  29.  
  30.  
  31. /**************************************************************************
  32.  *
  33.  *    FUC    印刷
  34.  *
  35.  *    IN    印刷データHandle ファイル名
  36.  *    OT    true:印刷キャンセル  false:印刷実行
  37.  *    EX    fontItemNow sizeItemNow
  38.  *
  39.  *************************************************************************/
  40. int    PrintDoc(Handle hGetData, Str63 fName)
  41. {
  42.     int        i, length, editLength, lineNumber, lineSpace;
  43.     char        *ptr, *pw;
  44.     char        editBuf[256];                /* 編集後印刷データ    */
  45.                 /* @@@@        後でハンドルにする    @@@@@*/
  46.     TPPrPort    printPort;                /* 印刷用グラフポート            */
  47.     TPrStatus    prStatus;
  48.     FontInfo    info;                    /* フォント情報            */
  49.     int        lineHight, lineBase;
  50.     int        linesPerPage;                /* 1ページの行数            */
  51.     int        line = 0;
  52.     int        lastLineOnPage = 0;
  53.     int        leftPosition;                /* 左側書き出し位置            */
  54.     int        pageNumber = 1;            /* ページ番号                */
  55.     short        fontID;
  56.     long        sizeID;
  57.     Str255        fontName, sizeName;
  58.     long        dtSize;                    /* データサイズ            */
  59.     DialogPtr    atDialog;                /* 印刷中断メッセージ表示処理用    */
  60.     GrafPtr        savePort;                /* */
  61.     int        printCan = false;            /* */
  62.     short        itemNo, itemType;            /* */
  63.     Rect        box;                    /* */
  64.     Handle        hMsg;                    /* */
  65.     Str255        tPrintCanMsg;                /* */
  66.  
  67.     /*---------------------------------------------------------------*/
  68.     atDialog = GetNewDialog(printCancelDailogID, 0, (WindowPtr)-1L);
  69.     GetPort(&savePort);
  70.     SetPort((GrafPtr)atDialog);
  71.     GetDItem(atDialog, 1, &itemType, &hMsg, &box);    /* メッセージを表示させる        */
  72.     GetIText(hMsg, tPrintCanMsg);
  73.     SetIText(hMsg, tPrintCanMsg);
  74.     SetPort((GrafPtr)savePort);
  75.  
  76.     /*---------------------------------------------------------------*/
  77.     printPort = PrOpenDoc(hPrint, 0L, 0L);
  78.     SetPort( (GrafPtr)printPort );
  79.  
  80.     GetItem(GetMHandle(fontMenuID), fontItemNow, fontName);
  81.     GetFNum(fontName, &fontID);
  82.     TextFont( fontID );                    /* フォント                */
  83.  
  84.     GetItem(GetMHandle(sizeMenuID), sizeItemNow, sizeName);
  85.     StringToNum(sizeName, &sizeID);
  86.     TextSize( sizeID );                    /* サイズ                */
  87.  
  88.     GetFontInfo( &info );                    /* フォント情報            */
  89.     lineSpace = GetCtlValue(hControl[lineSpaceNormalCntlNumber]);
  90.     (lineSpace)    ? (lineHight = info.ascent + info.descent + info.leading)
  91.             : (lineHight = info.ascent + info.descent);
  92.  
  93.     linesPerPage =    ((**hPrint).prInfo.rPage.bottom - (**hPrint).prInfo.rPage.top) / lineHight;
  94.     linesPerPage-=3;
  95.  
  96.     lineNumber = GetCtlValue(hControl[lineNumCntlNumber]);    /* 行番号の表示の有無        */
  97.  
  98.     /*---------------------------------------------------------------*/
  99.     dtSize = GetHandleSize(hGetData);
  100.     ptr = pw = (*hGetData);                /* 印刷元データのポインタ        */
  101.  
  102.     leftPosition = (**hPrint).prInfo.rPage.left + LeftMarginPixel;
  103.  
  104.     do {
  105.         PrOpenPage( printPort, 0L );
  106.         lastLineOnPage += linesPerPage;
  107.  
  108.         lineBase = FnameDrawString(fName, lineHight);            /* ヘッダ印刷    */
  109.  
  110.         do {
  111.             MoveTo(leftPosition, (lineBase += lineHight));        /* 1改行    */
  112.  
  113.             while ( (ptr <= (*hGetData) + dtSize) && 
  114.                 (*ptr != (char)'¥r') && (*ptr != (char)'¥f') )    /* 改行     改頁    */
  115.             {
  116.                 ptr++;
  117.             }
  118.             ptr++;                            /* 1行    分のデータ位置    */
  119.  
  120.             if ((length = (int)(ptr - pw) - 1) > 0) {
  121.                 TabMoveDrawText(pw, length, lineNumber);
  122. //                TabSpaceDrawText(pw, length, lineNumber);
  123.             }
  124.             else if (length == 0) {
  125.                 if (*(ptr - 1) == (char)'¥r') {
  126.                     LineNumberDrawText( lineNumber );
  127.                 }
  128.                 else {
  129.                     pw = ptr;
  130.                     break;
  131.                 }
  132.             }
  133.             if (lineNumber != 0) lineNumber++;
  134.             pw = ptr;
  135.         } while ((++line != lastLineOnPage) && (ptr < (*hGetData) + dtSize));
  136.  
  137.         /*---------------------------------------------------------------*/
  138. //        if (line != lastLineOnPage) {
  139. //            for (i = 0; i < lastLineOnPage-line; i++)
  140. //                MoveTo(leftPosition, (lineBase += lineHight));    /* 1改行    */
  141. //        }
  142.         PageNumberDrawText(pageNumber, lineBase + lineHight);
  143.         pageNumber++;
  144.  
  145.         PrClosePage( printPort );
  146.  
  147.         if ( PrintCancelCheck() ) {
  148.             printCan = true;                    /* Cancel ON */
  149.             break;
  150.         }
  151.     } while (ptr < (*hGetData) + dtSize);
  152.  
  153.     PrCloseDoc ( printPort );
  154.  
  155.     if ( !printCan )        /* キャンセルされていなければ印刷実行    */
  156.         PrPicFile(hPrint, 0L, 0L, 0L, &prStatus);
  157.  
  158.     /*---------------------------------------------------------------*/
  159.     DisposeDialog(atDialog);
  160.  
  161.     return( printCan );
  162. }
  163.  
  164. /**************************************************************************
  165.  *
  166.  *    FUC    データの編集と印刷
  167.  *
  168.  *    IN    編集データ データサイズ(1行分) 行番号値
  169.  *    OT    無し
  170.  *    EX    tabsItemNow
  171.  *
  172.  *************************************************************************/
  173. void    TabMoveDrawText(Ptr p, int count, int lineNumber)
  174. {
  175.     register char    *p1, *p2, nEdit[8];
  176.     int        i, len, tabWidth;
  177.     Point        pt;
  178.     int        leftMargin;                /* 文字の書き出し位置    */
  179.  
  180.     if (lineNumber != 0) {                /* 行番号有り    */
  181.         LineNumberDrawText( lineNumber );
  182.     }
  183.     else {                            /* 行番号無し    */
  184.         nEdit[0] = 6;
  185.         for (i = 1; i < 8; i++) nEdit[i] = ' ';
  186.         DrawString((ConstStr255Param)nEdit);
  187.     }
  188.  
  189.     leftMargin = StringWidth("¥p1") * 6 + LeftMarginPixel;
  190.     tabWidth   = StringWidth("¥p1") * tabsItemNow;
  191.  
  192.     p1 = p;                            /* データ先頭        */
  193.     p2 = p + count;                    /* データの最後    */
  194.     while (p < p2) {
  195.         while ( (p1 < p2) && (*p1 != '¥t') ) *p1++;
  196.         if ((len = p1 - p) > 0) {
  197.             DrawText(p, 0, p1 - p);        /* 文字列印刷        */
  198.         }
  199.         if (*p1 == '¥t') {                /* TAB移動        */
  200.             GetPen( &pt );
  201.             Move( (tabWidth - (pt.h - leftMargin) % tabWidth), 0 );
  202. //            Move( tabWidth - pt.h % tabWidth, 0 );
  203.             *p1++;
  204.         }
  205.         p = p1;                        /* 先頭位置移動    */
  206.     }
  207. }
  208.  
  209. /**************************************************************************
  210.  *
  211.  *    FUC    データの編集と印刷(SoloWriter Mode)
  212.  *
  213.  *    IN    編集データ データサイズ(1行分) 行番号値
  214.  *    OT    無し
  215.  *    EX    tabsItemNow        @@@@@未完成@@@@@
  216.  *
  217.  *************************************************************************/
  218. void    TabSpaceDrawText(Ptr p, int count, int lineNumber)
  219. //int    PrintDataEdit(long count, Ptr iPtr, Ptr oPtr)
  220. //#define    LEFTTAB        7 #define    CENTERTAB    8 #define    RIGHTTAB    9
  221. {
  222.     int    i, j;
  223.     int    TabCount, TabSize, colunm, sp, length;
  224.     char    eText[256], *eP, nEdit[8];
  225. //    Str255    iPtr, oPtr;
  226.  
  227.     if (lineNumber != 0) {                /* 行番号有り    */
  228.         LineNumberDrawText( lineNumber );
  229.     }
  230.     else {                            /* 行番号無し    */
  231.         nEdit[0] = 6;
  232.         for (i = 1; i < 8; i++) nEdit[i] = ' ';
  233.         DrawString((ConstStr255Param)nEdit);
  234.     }
  235.  
  236.     TabSize  = 9;    //LEFTTAB; CENTERTAB; RIGHTTAB;
  237.     TabCount = TabSize;
  238.  
  239.     eP     = eText;
  240.     length = 0;                            /* 編集後のデータサイズ    */
  241.     colunm = 1;
  242.     for (i = 0; i < count; i++) {
  243.         if (*p == '¥t') {                    /* TabをSPに変換        */
  244.             sp = TabCount - colunm;
  245.             if (sp == 0) sp = TabSize - 1;
  246.             for (j = 0; j < sp; j++) {
  247.                 *eP++ = ' ', length++;
  248.             }
  249.             if (colunm >= TabCount) {
  250.                 TabCount += TabSize;
  251.                 TabCount--;
  252.             }
  253.             colunm += sp;
  254.         }
  255.         else {
  256.             *eP++ = *p;
  257.             length++;
  258.             if (*p == '¥r') {
  259.                 TabCount = TabSize;
  260.                 colunm   = 1;
  261.             }
  262.             else {
  263.                 if (colunm >= TabCount) {
  264.                     TabCount += TabSize;
  265.                     TabCount--;
  266.                 }
  267.                 colunm++;
  268.             }
  269.         }
  270.         *p++;                /* 次データ    */
  271.     }
  272.     *eP = 0;                    /* NULL 止め    */
  273.  
  274. //    return(length);
  275.     DrawText(eText, 0, length);
  276. }
  277.  
  278. int    FnameDrawString(Str63 fName, int lineHight)
  279. {
  280.     int    lineBase, pHead, len, i, j;
  281.     short    *p;
  282.     Str255    dateString, wSt;
  283.     DateTimeRec    dt;
  284.  
  285.     fName[++fName[0]] = ' ';            /* ファイル名の後に space を入れる    */
  286.  
  287.     for (len = 0; len < 63; len ++) { dateString[len] = ' '; }
  288.     GetTime( &dt );                    /* 年月日時分秒取り込み    */
  289.     p = (short *) &dt;
  290.     for (j = len = 0; j < 3; j++) {            /* 年月日            */
  291.         NumToString(*p++, wSt);
  292.         for (i = 1; i <= wSt[0]; i++) { dateString[len+i] = wSt[i]; }
  293.         if (j < 2) dateString[len+i] = '.';
  294.         len += (wSt[0]+1);
  295.     }
  296.     dateString[0] = len;
  297.  
  298.     pHead = (fName[0] + dateString[0] + 4) * 5;        
  299.     MoveTo( (**hPrint).prInfo.rPage.right - pHead,        /* 印刷位置(右上隅)    */
  300.          (lineBase = (**hPrint).prInfo.rPage.top + lineHight) );
  301.  
  302.     DrawString( (ConstStr255Param)fName );
  303.     DrawString( (ConstStr255Param)dateString );
  304.  
  305.     return(lineBase);
  306. }
  307. //    long    dateTime;
  308. //    GetDateTime(&dateTime);            /* 現在までの秒数    */
  309. //    IUDatePString(dateTime, 1, dateString, 0);    /* この関数無い    */
  310.  
  311. void    LineNumberDrawText(int lineNumber)
  312. {
  313.     char    nEdit[8];
  314.  
  315.     if (lineNumber != 0) {            /* 行番号    */
  316.         nEdit[0] = 6;                /* 文字長    */
  317.         nEdit[1] = (lineNumber / 10000)        + '0';
  318.         nEdit[2] = (lineNumber % 10000) / 1000 + '0';
  319.         nEdit[3] = (lineNumber %  1000) / 100  + '0';
  320.         nEdit[4] = (lineNumber %   100) / 10   + '0';
  321.         nEdit[5] = (lineNumber %    10)        + '0';
  322.         nEdit[6] = ' ';
  323.         nEdit[7] = ' ';
  324.         DrawString((ConstStr255Param)nEdit);
  325.     }
  326. }
  327.  
  328. void    PageNumberDrawText(int pageNumber, int line)
  329. {
  330.     char    pEdit[8];
  331.  
  332.                                 /* センタリング    */
  333.     MoveTo( ((**hPrint).prInfo.rPage.right - (**hPrint).prInfo.rPage.left) / 2, line );
  334.  
  335.     if (pageNumber < 10) {                /* ページ番号編集    */
  336.         pEdit[0] = 1;
  337.         pEdit[1] = pageNumber + '0';
  338.     }
  339.     else if(pageNumber < 100) {
  340.         pEdit[0] = 2;
  341.         pEdit[1] = (pageNumber % 100) / 10 + '0';
  342.         pEdit[2] = (pageNumber %  10)      + '0';
  343.     }
  344.     else {
  345.         pEdit[0] = 3;
  346.         pEdit[1] = (pageNumber % 1000) / 100 + '0';
  347.         pEdit[2] = (pageNumber %  100) /  10 + '0';
  348.         pEdit[3] = (pageNumber %   10)       + '0';
  349.     }
  350.     DrawString( (ConstStr255Param)pEdit );                /* ページ番号印刷    */
  351. }
  352.  
  353. /**************************************************************************
  354.  *
  355.  *    FUC    印刷中断確認
  356.  *
  357.  *    IN    無し
  358.  *    OT    false:継続 true:キャンセル
  359.  *    EX    無し
  360.  *
  361.  *************************************************************************/
  362. int    PrintCancelCheck(void)
  363. {
  364.     int    ret;
  365.     EventRecord    event;
  366.     unsigned char    asc;
  367.  
  368.     ret = false;
  369.     if (GetNextEvent(everyEvent, &event)) {
  370.         switch (event.what) {
  371.             case keyDown:
  372.             case autoKey:
  373.                 asc = event.message & charCodeMask;
  374.                 if ((event.modifiers & cmdKey) && asc == '.')
  375.                     ret = true;
  376.                 break;
  377.             default:
  378.                 break;
  379.  
  380.         }
  381.     }
  382.     return(ret);
  383. }
  384.