&ANALYZE-SUSPEND _VERSION-NUMBER UIB_v9r12 GUI &ANALYZE-RESUME &Scoped-define WINDOW-NAME CURRENT-WINDOW &Scoped-define FRAME-NAME Dialog-Frame &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Dialog-Frame /*------------------------------------------------------------------------ File: WinPDFPrint.w Description: Will print a PDF document to the default Printer Input Parameters: pPDFFile - full path and name of PDF document pSilent - TRUE OR FALSE If TRUE, then uses the currently assigned Default Printer. If FALSE then the following process is run: - Store original Defaul Printer ID - prompts for Printer to use - sets Selected Printer to default printer - Prints PDF - sets 'original' Default back to Default Output Parameters: Author: Gordon Campbell - PRO-SYS Consultants Ltd Created: November 20, 2003 ------------------------------------------------------------------------*/ /* This .W file was created with the Progress AppBuilder. */ /*----------------------------------------------------------------------*/ /* *************************** Definitions ************************** */ /* Parameters Definitions --- */ DEFINE INPUT PARAMETER pPDFFile AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pSilent AS LOGICAL NO-UNDO. /* Local Variable Definitions --- */ DEFINE VARIABLE OriginalDefault AS CHARACTER NO-UNDO. DEFINE VARIABLE DriverAndPort AS CHARACTER NO-UNDO. DEFINE VARIABLE ReturnValue AS INTEGER NO-UNDO. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK /* ******************** Preprocessor Definitions ******************** */ &Scoped-define PROCEDURE-TYPE Dialog-Box &Scoped-define DB-AWARE no /* Name of first Frame and/or Browse and/or first Query */ &Scoped-define FRAME-NAME Dialog-Frame /* Standard List Definitions */ &Scoped-Define ENABLED-OBJECTS Btn_Print PrinterSelect Btn_Cancel &Scoped-Define DISPLAYED-OBJECTS vFile PrinterSelect /* Custom List Definitions */ /* List-1,List-2,List-3,List-4,List-5,List-6 */ /* _UIB-PREPROCESSOR-BLOCK-END */ &ANALYZE-RESUME /* *********************** Control Definitions ********************** */ /* Define a dialog box */ /* Definitions of the field level widgets */ DEFINE BUTTON Btn_Cancel AUTO-END-KEY LABEL "Cancel" SIZE 15 BY 1.14 BGCOLOR 8 . DEFINE BUTTON Btn_Print AUTO-GO LABEL "Print" SIZE 15 BY 1.14 BGCOLOR 8 . DEFINE VARIABLE PrinterSelect AS CHARACTER FORMAT "X(256)":U LABEL "Printer" VIEW-AS COMBO-BOX INNER-LINES 5 LIST-ITEMS "Item 1" DROP-DOWN-LIST SIZE 49.8 BY 1 NO-UNDO. DEFINE VARIABLE vFile AS CHARACTER FORMAT "X(256)":U LABEL "File" VIEW-AS FILL-IN SIZE 50 BY 1 NO-UNDO. /* ************************ Frame Definitions *********************** */ DEFINE FRAME Dialog-Frame vFile AT ROW 1.71 COL 6 COLON-ALIGNED Btn_Print AT ROW 1.71 COL 61 PrinterSelect AT ROW 2.91 COL 6.2 COLON-ALIGNED Btn_Cancel AT ROW 2.95 COL 61 SPACE(1.99) SKIP(0.52) WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER SIDE-LABELS NO-UNDERLINE THREE-D SCROLLABLE TITLE "Print PDF Document" DEFAULT-BUTTON Btn_Print CANCEL-BUTTON Btn_Cancel. /* *********************** Procedure Settings ************************ */ &ANALYZE-SUSPEND _PROCEDURE-SETTINGS /* Settings for THIS-PROCEDURE Type: Dialog-Box Allow: Basic,Browse,DB-Fields,Query Other Settings: COMPILE */ &ANALYZE-RESUME _END-PROCEDURE-SETTINGS /* *********** Runtime Attributes and AppBuilder Settings *********** */ &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES /* SETTINGS FOR DIALOG-BOX Dialog-Frame */ ASSIGN FRAME Dialog-Frame:SCROLLABLE = FALSE. /* SETTINGS FOR FILL-IN vFile IN FRAME Dialog-Frame NO-ENABLE */ /* _RUN-TIME-ATTRIBUTES-END */ &ANALYZE-RESUME /* ************************ Control Triggers ************************ */ &Scoped-define SELF-NAME Dialog-Frame &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Dialog-Frame Dialog-Frame ON WINDOW-CLOSE OF FRAME Dialog-Frame /* Print PDF Document */ DO: APPLY "END-ERROR":U TO SELF. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &Scoped-define SELF-NAME Btn_Print &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL Btn_Print Dialog-Frame ON CHOOSE OF Btn_Print IN FRAME Dialog-Frame /* Print */ DO: ASSIGN FRAME {&FRAME-NAME} PrinterSelect. /* validate */ IF PrinterSelect = "" THEN DO: MESSAGE "No Printer has been selected - Please re-select or Cancel!" VIEW-AS ALERT-BOX ERROR. APPLY "ENTRY" TO PrinterSelect. RETURN NO-APPLY. END. RUN SetNewDefaultPrinter. RUN PrintPDF. RUN SetOriginalDefaultPrinter. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &UNDEFINE SELF-NAME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Dialog-Frame /* *************************** Main Block *************************** */ IF pSilent THEN DO: RUN printPDF. RETURN. END. /* Parent the dialog-box to the ACTIVE-WINDOW, if there is no parent. */ IF VALID-HANDLE(ACTIVE-WINDOW) AND FRAME {&FRAME-NAME}:PARENT eq ? THEN FRAME {&FRAME-NAME}:PARENT = ACTIVE-WINDOW. /* Now enable the interface and wait for the exit condition. */ /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ MAIN-BLOCK: DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: vFile = pPDFFile. RUN GetOriginalDefaultPrinter. RUN GetListOfPrinters. RUN enable_UI. WAIT-FOR GO OF FRAME {&FRAME-NAME}. END. RUN disable_UI. /* External Procs obtained from www.global-shared.com */ PROCEDURE GetProfileStringA EXTERNAL "kernel32" : DEFINE INPUT PARAMETER lpAppName AS CHAR. DEFINE INPUT PARAMETER lpKeyName AS CHAR. DEFINE INPUT PARAMETER lpDefault AS CHAR. DEFINE OUTPUT PARAMETER lpReturnedString AS CHAR. DEFINE INPUT PARAMETER nSize AS LONG. DEFINE RETURN PARAMETER nReturnedChars AS LONG. END PROCEDURE. PROCEDURE GetPrivateProfileStringA EXTERNAL "kernel32" : DEFINE INPUT PARAMETER lpszSection AS CHAR. DEFINE INPUT PARAMETER lpszEntry AS LONG. DEFINE INPUT PARAMETER lpszDefault AS CHAR. DEFINE INPUT PARAMETER memBuffer AS LONG. /* memptr */ DEFINE INPUT PARAMETER cbReturnBuffer AS LONG. DEFINE INPUT PARAMETER lpszFilename AS CHAR. DEFINE RETURN PARAMETER cbReturnedChars AS LONG. END PROCEDURE. PROCEDURE WritePrivateProfileStringA EXTERNAL "kernel32": DEFINE INPUT PARAMETER lpszSection AS CHAR. DEFINE INPUT PARAMETER lpszEntry AS CHAR. DEFINE INPUT PARAMETER lpszString AS CHAR. DEFINE INPUT PARAMETER lpszFilename AS CHAR. DEFINE RETURN PARAMETER lpszValue AS LONG. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME /* ********************** Internal Procedures *********************** */ &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI Dialog-Frame _DEFAULT-DISABLE PROCEDURE disable_UI : /*------------------------------------------------------------------------------ Purpose: DISABLE the User Interface Parameters: Notes: Here we clean-up the user-interface by deleting dynamic widgets we have created and/or hide frames. This procedure is usually called when we are ready to "clean-up" after running. ------------------------------------------------------------------------------*/ /* Hide all frames. */ HIDE FRAME Dialog-Frame. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI Dialog-Frame _DEFAULT-ENABLE PROCEDURE enable_UI : /*------------------------------------------------------------------------------ Purpose: ENABLE the User Interface Parameters: Notes: Here we display/view/enable the widgets in the user-interface. In addition, OPEN all queries associated with each FRAME and BROWSE. These statements here are based on the "Other Settings" section of the widget Property Sheets. ------------------------------------------------------------------------------*/ DISPLAY vFile PrinterSelect WITH FRAME Dialog-Frame. ENABLE Btn_Print PrinterSelect Btn_Cancel WITH FRAME Dialog-Frame. {&OPEN-BROWSERS-IN-QUERY-Dialog-Frame} END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE GetKey Dialog-Frame PROCEDURE GetKey : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEF INPUT PARAMETER i-section AS CHAR. DEF INPUT PARAMETER i-key AS CHAR. DEF INPUT PARAMETER i-filename AS CHAR. DEF OUTPUT PARAMETER o-value AS CHAR. DEF VAR EntryPointer AS INTEGER NO-UNDO. DEF VAR mem1 AS MEMPTR NO-UNDO. DEF VAR mem2 AS MEMPTR NO-UNDO. DEF VAR mem1size AS INT NO-UNDO. DEF VAR mem2size AS INT NO-UNDO. DEF VAR i AS INT NO-UNDO. DEF VAR cbReturnSize AS INT NO-UNDO. ASSIGN SET-SIZE(mem1) = 4000 mem1size = 4000. IF i-key = "" THEN EntryPointer = 0. ELSE DO: /* Must fill memory with desired key name and EntryPointer must point to it */ ASSIGN SET-SIZE(mem2) = 128 mem2size = 128 EntryPointer = GET-POINTER-VALUE(mem2) PUT-STRING(mem2,1) = i-key. END. RUN getprivateprofilestringA (i-section, EntryPointer, "", GET-POINTER-VALUE(mem1), INPUT mem1size, i-filename, OUTPUT cbReturnSize). /* if i-key was "", Windows will return a list of all keys in i-section. This list is not comma-separated but separated by CHR(0). Progress can not handle that easily so we'll now replace every 0 by a comma: */ DO i = 1 TO cbReturnSize: /* If this is a list convert null character into a comma to generate a csv type variable */ o-value = IF (GET-BYTE(mem1, i) = 0 AND i NE cbReturnSize) THEN o-value + "," ELSE o-value + CHR(GET-BYTE(mem1, i)). END. SET-SIZE(mem1) = 0. SET-SIZE(mem2) = 0. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE GetListOfPrinters Dialog-Frame PROCEDURE GetListOfPrinters : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE ListOfPrinters AS CHARACTER NO-UNDO. PrinterSelect:LIST-ITEMS IN FRAME {&FRAME-NAME} = ?. RUN getkey (INPUT "devices", /* The section name */ INPUT "", /* The key name */ INPUT "win.ini", /* Name of ini file */ OUTPUT ListOfPrinters). /* Returned stuff */ PrinterSelect:LIST-ITEMS IN FRAME {&FRAME-NAME} = ListOfPrinters. PrinterSelect = ENTRY(1, OriginalDefault). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE GetOriginalDefaultPrinter Dialog-Frame PROCEDURE GetOriginalDefaultPrinter : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ OriginalDefault = FILL(" ",100). /* = allocate memory, don't forget! */ RUN GetProfileStringA ("windows", "device", "-unknown-,", OUTPUT OriginalDefault, LENGTH(OriginalDefault), OUTPUT ReturnValue). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE PrintPDF Dialog-Frame PROCEDURE PrintPDF : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE ch_AcroExch AS COM-HANDLE NO-UNDO. DEFINE VARIABLE NumOfPages AS INTEGER NO-UNDO. /* Open the Document and determine the number of Pages */ CREATE "AcroExch.PDDoc" ch_AcroExch NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN "Cannot Find Acobat COM Automation Object". Returnvalue = ch_AcroExch:open(pPDFFile). IF ReturnValue = 0 THEN DO: MESSAGE "Error: During Open of File" VIEW-AS ALERT-BOX. RETURN. END. NumOfPages = ch_AcroExch:GetNumPages(). ch_AcroExch:close(). RELEASE OBJECT ch_AcroExch. /* Now connect to the App and Print the Document */ CREATE "AcroExch.AvDoc" ch_AcroExch NO-ERROR. IF ERROR-STATUS:ERROR THEN RETURN "Cannot Find Acobat COM Automation Object". Returnvalue = ch_AcroExch:open(pPDFFile,""). IF ReturnValue = 0 THEN DO: MESSAGE "Error: During Open of File" VIEW-AS ALERT-BOX. RETURN. END. ReturnValue = ch_AcroExch:PrintPagesSilent(0,NumOfPages - 1,1,1,1). ch_AcroExch:close(1). RELEASE OBJECT ch_AcroExch. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE PutKey Dialog-Frame PROCEDURE PutKey : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEF INPUT PARAMETER i-section AS CHAR. DEF INPUT PARAMETER i-key AS CHAR. DEF INPUT PARAMETER i-filename AS CHAR. DEF INPUT PARAMETER i-value AS CHAR. DEF VAR cbReturnSize AS INTEGER. RUN writeprivateprofilestringA (i-section, i-key, i-value, i-filename, OUTPUT cbReturnSize ). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE SetNewDefaultPrinter Dialog-Frame PROCEDURE SetNewDefaultPrinter : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ RUN putkey (INPUT "windows", INPUT "device", INPUT "win.ini", INPUT PrinterSelect + "," + DriverAndPort). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE SetOriginalDefaultPrinter Dialog-Frame PROCEDURE SetOriginalDefaultPrinter : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ RUN putkey (INPUT "windows", INPUT "device", INPUT "win.ini", INPUT OriginalDefault + "," + DriverAndPort). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME