PopPrnt.mod: Translation to XDS Modula-2

Last updated: 22. 1.1998, 23:16

<* +M2EXTENSIONS *>
IMPLEMENTATION MODULE PopPrnt;
(*----------------------------------------------
   POPPRNT.C -- Popup Editor Printing Functions
  ----------------------------------------------*)


IMPORT Windows;


IMPORT SYSTEM;
IMPORT h2d_PopPad;

VAR
  bUserAbort :  Windows.BOOL;
  hDlgPrint  :  Windows.HWND;
VAR di  :  Windows.DOCINFO;
    pd  :  Windows.PRINTDLG;



    

    

(*++++*****************************************************************)
PROCEDURE [Windows.CALLBACK] PrintDlgProc (hDlg   : Windows.HWND;
                                     msg          : Windows.UINT;
                                     wParam       : Windows.WPARAM;
                                     lParam       : Windows.LPARAM) : Windows.BOOL;
(**********************************************************************)
BEGIN
     CASE (msg) OF
          | Windows.WM_INITDIALOG :
               Windows.EnableMenuItem (Windows.GetSystemMenu (hDlg, FALSE), Windows.SC_CLOSE,
                                                            Windows.MF_GRAYED);
               RETURN TRUE;

          | Windows.WM_COMMAND :
               bUserAbort := TRUE;
               Windows.EnableWindow (Windows.GetParent (hDlg), TRUE);
               Windows.DestroyWindow (hDlg);
               hDlgPrint := SYSTEM.CAST(Windows.HWND,0);
               RETURN TRUE;
     ELSE
       RETURN FALSE;
     END;
END PrintDlgProc;





    

    

(*++++*****************************************************************)
PROCEDURE [Windows.CALLBACK] AbortProc (hPrinterDC     : Windows.HDC;
                                           iCode       : INTEGER) : Windows.BOOL;
(**********************************************************************)
VAR
  msg   :  Windows.MSG;
BEGIN
     WHILE (bUserAbort=FALSE) AND (Windows.PeekMessage (msg, NIL, 0, 0, Windows.PM_REMOVE)=TRUE) DO
          IF (hDlgPrint=SYSTEM.CAST(Windows.HWND,0)) OR (Windows.IsDialogMessage (hDlgPrint,msg)=FALSE) THEN
               Windows.TranslateMessage (msg);
               Windows.DispatchMessage (msg);
          END;
     END;
     RETURN NOT bUserAbort;
END AbortProc;



(*++++*****************************************************************)
PROCEDURE PrintFile (hInst        : Windows.HINSTANCE;
                     hwnd         : Windows.HWND;
                     hwndEdit     : Windows.HWND;
                     szTitleName  : Windows.PSTR) : Windows.BOOL;
(**********************************************************************)
VAR
  bSuccess       : Windows.BOOL;
  pstrBuffer     : Windows.PCTSTR;
  yChar          : INTEGER;
  iCharsPerLine  : INTEGER;
  iLinesPerPage  : INTEGER;
  iTotalLines    : INTEGER;
  iTotalPages    : INTEGER;
  iPage          : INTEGER;
  iLine          : INTEGER;
  iLineNum       : INTEGER;
  tm             : Windows.TEXTMETRIC;
  iColCopy       : CARDINAL;
  iNoiColCopy    : CARDINAL;
  i              : CARDINAL;
  j              : CARDINAL;
  rc             : INTEGER;
CONST
  prDi           =  "PrintDlgBox";
BEGIN
     di :=  Windows.DOCINFO{ SIZE (Windows.DOCINFO), NIL,NIL,NIL,0};
     pd.lStructSize         := SIZE (Windows.PRINTDLG);
     pd.hwndOwner           := hwnd;
     pd.hDevMode            := NIL;
     pd.hDevNames           := NIL;
     pd.hDC                 := NIL;
     pd.Flags               := Windows.PD_ALLPAGES + Windows.PD_COLLATE + Windows.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       := NIL;
     pd.lpfnSetupHook       := NIL;
     pd.lpPrintTemplateName := NIL;
     pd.lpSetupTemplateName := NIL;
     pd.hPrintTemplate      := NIL;
     pd.hSetupTemplate      := NIL;

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

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

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

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

     Windows.EnableWindow (hwnd, FALSE);

     bSuccess   := TRUE;
     bUserAbort := FALSE;

     hDlgPrint := Windows.CreateDialog (hInst,SYSTEM.ADR(prDi), hwnd, PrintDlgProc);
     Windows.SetDlgItemText (hDlgPrint, h2d_PopPad.IDD_FNAME, szTitleName^);

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

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

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

          iColCopy := 0;
          LOOP
               iPage := 0;
               LOOP
                 IF(pd.Flags - Windows.PD_COLLATE#SYSTEM.CAST(Windows.PD_SET,0)) THEN
                   j := VAL(CARDINAL,pd.nCopies);
                 ELSE
                   j := 1;
                 END;
                    iNoiColCopy := 0;
                    LOOP
                         IF (Windows.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(Windows.PCTSTR,SYSTEM.ADR(iCharsPerLine));

                              Windows.TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer^,
                                   Windows.SendMessage (hwndEdit, Windows.EM_GETLINE,
                                   iLineNum,
                                   SYSTEM.CAST(Windows.WPARAM,pstrBuffer)));
                              INC(iLine);
                              IF(iLine>iLinesPerPage) THEN
                                EXIT;
                              END;
                         END;
                         INC(iNoiColCopy);
                         IF(iNoiColCopy>j) THEN
                           EXIT;
                         END;
                         IF (Windows.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
          Windows.EndDoc (pd.hDC);
     END;
     IF ( NOT bUserAbort) THEN
          Windows.EnableWindow (hwnd, TRUE);
          Windows.DestroyWindow (hDlgPrint);
     END;

     Windows.HeapFree (Windows.GetProcessHeap (), SYSTEM.CAST(Windows.HEAP_SET,0), SYSTEM.CAST(Windows.PVOID,pstrBuffer));
     Windows.DeleteDC (pd.hDC);

     RETURN bSuccess AND NOT bUserAbort;
END PrintFile;

BEGIN
END PopPrnt.