PopPrnt.mod: Translation to Stony Brook Modula-2

Last updated: 11. 1.1998, 17:16

<*/NOWARN:F*>
IMPLEMENTATION MODULE PopPrnt;
(*----------------------------------------------
   POPPRNT.C -- Popup Editor Printing Functions
  ----------------------------------------------*)

IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINGDI;
IMPORT COMMDLG;
IMPORT SYSTEM;
IMPORT h2d_PopPad;

VAR
  bUserAbort :  WIN32.BOOL;
  hDlgPrint  :  WIN32.HWND;
VAR di  :  WINGDI.DOCINFO;
    pd  :  COMMDLG.PRINTDLG;

<*/PUSH*>
%IF WIN32 %THEN
    <*/CALLS:WIN32SYSTEM*>
%ELSE
    <*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE PrintDlgProc (hDlg   : WIN32.HWND;
                  msg          : WIN32.UINT;
                  wParam       : WIN32.WPARAM;
                  lParam       : WIN32.LPARAM) : WIN32.BOOL [EXPORT];
(**********************************************************************)
BEGIN
     CASE (msg) OF
          | WINUSER.WM_INITDIALOG :
               WINUSER.EnableMenuItem (WINUSER.GetSystemMenu (hDlg, FALSE), WINUSER.SC_CLOSE,
                                                            WINUSER.MF_GRAYED);
               RETURN TRUE;

          | WINUSER.WM_COMMAND :
               bUserAbort := TRUE;
               WINUSER.EnableWindow (WINUSER.GetParent (hDlg), TRUE);
               WINUSER.DestroyWindow (hDlg);
               hDlgPrint := SYSTEM.CAST(WIN32.HWND,0);
               RETURN TRUE;
     ELSE
       RETURN FALSE;
     END;
END PrintDlgProc;
<*/POP*>


<*/PUSH*>
%IF WIN32 %THEN
    <*/CALLS:WIN32SYSTEM*>
%ELSE
    <*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE AbortProc (hPrinterDC     : WIN32.HDC;
                        iCode       : INTEGER) : WIN32.BOOL [EXPORT];
(**********************************************************************)
VAR
  msg   :  WINUSER.MSG;
BEGIN
     WHILE (bUserAbort=FALSE) AND (WINUSER.PeekMessage (msg, NIL, 0, 0, WINUSER.PM_REMOVE)=TRUE) DO
          IF (hDlgPrint=SYSTEM.CAST(WIN32.HWND,0)) OR (WINUSER.IsDialogMessage (hDlgPrint,msg)=FALSE) THEN
               WINUSER.TranslateMessage (msg);
               WINUSER.DispatchMessage (msg);
          END;
     END;
     RETURN NOT bUserAbort;
END AbortProc;
<*/POP*>


(*++++*****************************************************************)
PROCEDURE PrintFile (hInst        : WIN32.HINSTANCE;
                     hwnd         : WIN32.HWND;
                     hwndEdit     : WIN32.HWND;
                     szTitleName  : WIN32.LPSTR) : WIN32.BOOL;
(**********************************************************************)
VAR
  bSuccess       : WIN32.BOOL;
  pstrBuffer     : WIN32.LPCTSTR;
  yChar          : INTEGER;
  iCharsPerLine  : INTEGER;
  iLinesPerPage  : INTEGER;
  iTotalLines    : INTEGER;
  iTotalPages    : INTEGER;
  iPage          : INTEGER;
  iLine          : INTEGER;
  iLineNum       : INTEGER;
  tm             : WINGDI.TEXTMETRIC;
  iColCopy       : CARDINAL;
  iNoiColCopy    : CARDINAL;
  i              : CARDINAL;
  j              : CARDINAL;
  rc             : INTEGER;
BEGIN
     di :=  WINGDI.DOCINFO{ SIZE (WINGDI.DOCINFO), NIL,NIL};
     pd.lStructSize         := SIZE (COMMDLG.PRINTDLG);
     pd.hwndOwner           := hwnd;
     pd.hDevMode            := NIL;
     pd.hDevNames           := NIL;
     pd.hDC                 := NIL;
     pd.Flags               := COMMDLG.PD_ALLPAGES BOR COMMDLG.PD_COLLATE BOR COMMDLG.PD_RETURNDC;
     pd.nFromPage           := 1;           (* Korrektur von G. Born    *)
     pd.nToPage             := 0FFFFh;      (* Werte von 0 auf 1 bzw.   *)
     pd.nMinPage            := 1;           (* 0xFFFF gesetzt, damit    *)
     pd.nMaxPage            := 0FFFFh;      (* Sortieren funktioniert   *)
     pd.nCopies             := 1;
     pd.hInstance           := NIL;
     pd.lCustData           := 0000h;
     pd.lpfnPrintHook       := SYSTEM.CAST(COMMDLG.LPPRINTHOOKPROC,NIL);
     pd.lpfnSetupHook       := SYSTEM.CAST(COMMDLG.LPSETUPHOOKPROC,NIL);
     pd.lpPrintTemplateName := NIL;
     pd.lpSetupTemplateName := NIL;
     pd.hPrintTemplate      := NIL;
     pd.hSetupTemplate      := NIL;

     IF ( NOT COMMDLG.PrintDlg (pd)) THEN
          RETURN TRUE;
     END;  (* *)
     iTotalLines := SYSTEM.CAST(WIN32.SHORT, WINUSER.SendMessage (hwndEdit, WINUSER.EM_GETLINECOUNT, 0, 0000h));

     IF (iTotalLines = 0) THEN
          RETURN TRUE;
     END;
     WINGDI.GetTextMetrics (pd.hDC, tm);
     yChar := tm.tmHeight + tm.tmExternalLeading;

     iCharsPerLine := WINGDI.GetDeviceCaps (pd.hDC, WINGDI.HORZRES) / tm.tmAveCharWidth;
     iLinesPerPage := WINGDI.GetDeviceCaps (pd.hDC, WINGDI.VERTRES) / yChar;
     iTotalPages   := (iTotalLines + iLinesPerPage - 1) / iLinesPerPage;

     pstrBuffer := SYSTEM.CAST(WIN32.LPCTSTR,WIN32.HeapAlloc (WIN32.GetProcessHeap (),
                                               WIN32.HEAP_NO_SERIALIZE, iCharsPerLine + 1));

     WINUSER.EnableWindow (hwnd, FALSE);

     bSuccess   := TRUE;
     bUserAbort := FALSE;

     hDlgPrint := WINUSER.CreateDialog (hInst,"PrintDlgBox", hwnd, PrintDlgProc);
     WINUSER.SetDlgItemText (hDlgPrint, h2d_PopPad.IDD_FNAME, szTitleName^);

     rc := WINGDI.SetAbortProc (pd.hDC, SYSTEM.CAST(WINGDI.ABORTPROC,AbortProc));

     WINUSER.GetWindowText (hwnd, di.lpszDocName^, SIZE (WIN32.PTSTR));

     IF (WINGDI.StartDoc (pd.hDC, di) > 0) THEN
          IF((SYSTEM.CAST(WIN32.WORD,pd.Flags - COMMDLG.PD_COLLATE))#0) THEN
            i := VAL(CARDINAL,pd.nCopies);
          ELSE
            i := 1;
          END;

          iColCopy := 0;
          LOOP
               iPage := 0;
               LOOP
                 IF(pd.Flags - COMMDLG.PD_COLLATE#0) THEN
                   j := VAL(CARDINAL,pd.nCopies);
                 ELSE
                   j := 1;
                 END;
                    iNoiColCopy := 0;
                    LOOP
                         IF (WINGDI.StartPage (pd.hDC) < 0) THEN
                              bSuccess := FALSE;
                            EXIT;
                         END;

                         iLine := 0;
                         LOOP

                              iLineNum := iLinesPerPage * iPage + iLine;

                              IF (iLineNum > iTotalLines) THEN
                                 EXIT;
                              END;
                              pstrBuffer := SYSTEM.CAST(WIN32.LPCTSTR,SYSTEM.ADR(iCharsPerLine));  

                              WINGDI.TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer^,
                                   WINUSER.SendMessage (hwndEdit, WINUSER.EM_GETLINE,
                                   iLineNum,
                                   SYSTEM.CAST(WIN32.WPARAM,pstrBuffer)));
                              INC(iLine);
                              IF(iLine>iLinesPerPage) THEN
                                EXIT;
                              END;
                         END;
                         INC(iNoiColCopy);
                         IF(iNoiColCopy>j) THEN
                           EXIT;
                         END;
                         IF (WINGDI.EndPage (pd.hDC) < 0) THEN
                              bSuccess := FALSE;
                              EXIT;
                         END;

                         IF (bUserAbort) THEN
                              EXIT;
                         END;
                    END;
                    IF ( NOT bSuccess OR bUserAbort) THEN
                         EXIT;
                    END;
                    INC(iPage);
                    IF(iPage>=iTotalPages) THEN
                      EXIT;
                    END;
               END;
               IF ( NOT bSuccess OR bUserAbort) THEN
                    EXIT;
               END;
               INC(iColCopy);
               IF(iColCopy>i-1) THEN
                 EXIT;
               END;
          END;
     ELSE
          bSuccess := FALSE;
     END;
     IF (bSuccess) THEN
          WINGDI.EndDoc (pd.hDC);
     END;
     IF ( NOT bUserAbort) THEN
          WINUSER.EnableWindow (hwnd, TRUE);
          WINUSER.DestroyWindow (hDlgPrint);
     END;

     WIN32.HeapFree (WIN32.GetProcessHeap (), 0, SYSTEM.CAST(WIN32.LPVOID,pstrBuffer));
     WINGDI.DeleteDC (pd.hDC);

     RETURN bSuccess AND NOT bUserAbort;
END PrintFile;

BEGIN
END PopPrnt.