home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Magazin 1995 June / CDROM6.BIN / share100 / tops / tops.txt < prev   
Text File  |  1995-04-19  |  40KB  |  1,044 lines

  1. //==================================================================
  2. // TOPS.TXT - EXAMPLE FILE FOR TOPS - by ETS Inc.
  3. // This is simply an example text file. It was clipped out
  4. // of a piece of the actual .CPP (C++) Windows source files
  5. // used to create TOPS. This material is not copyrighted.
  6. //
  7. // note: TABS are set to THREE in this source file, so the
  8. // spacing won't look proper unless you set Misc Setup to
  9. // TABS 3. (Tabs 3 is common in the new C++)
  10. //
  11. // ABOUT YOUR FILE   DIALOG
  12. // BORDER STYLES     DIALOG
  13. // FONT SELECTION    DIALOG
  14. // FREE RESOURCES    DIALOG
  15. // HEADER FOOTER     DIALOG
  16. // LAYOUT SELECTION  DIALOG
  17. // MISC SETUPS       DIALOG
  18. // OPEN / VIEW FILE  DIALOG
  19. // PAGE BREAKS ERR   DIALOG
  20. // PAGE LAYOUT       DIALOG
  21. // PRINT                    DIALOG
  22. // PRINT PREVIEW        DIALOG
  23. // PRINTER SETUP        DIALOG
  24. // SHEET MARGINS     DIALOG
  25. // SIDES 0NE-BOTH    DIALOG
  26. // TEXT MARGINS      DIALOG
  27. // TITLE PAGES            DIALOG
  28. // TURN PAPER OVER    DIALOG
  29. //
  30. //        AUTHOR: VAL PATTERSON, ETS, INC
  31. //       CREATED: JUL 28 1994
  32. // LAST MODIFIED: MAR 11 1995 windows version 1
  33. //
  34. //==================================================================
  35. #include "main.h"
  36. //==================================================================
  37. // EXTERNAL PROTOTYPES
  38. //==================================================================
  39. extern    void        save_config( void );                        // MISC.CPP
  40. extern    void        restore_config( void );                    // MISC.CPP
  41. extern    void        check_config( void );                    // MISC.CPP
  42. extern    void        clear_memory_file( void );                // MAIN.CPP
  43. extern    int        get_doublespaced_flag( int page );    // PRINT.CPP
  44. extern    void        delete_preview_bitmaps( void );        // PREVIEW.CPP
  45. extern    void        preview_destroy( void );                // PREVIEW.CPP
  46. extern    void        print_destroy( void );                    // PRINT.CPP
  47. extern    void        destroy_viewfile( void );                // FVIEW.CPP
  48. extern    void        setup_pm_from_config( void );            // PRINT.CPP
  49. extern    char        *withpath( char *filename );            // MAIN.CPP
  50. extern    void        ets_delay( int ms );                        // MAIN.CPP
  51. //==================================================================
  52. // EXTERNAL VARIABLES
  53. //==================================================================
  54. extern    HINSTANCE hInstance;                // INSTANCE OF THIS PROGRAM
  55. extern    HWND        MainWindow;                // THIS PROGRAMS MAIN WINDOW
  56. extern    int        major_version;            // THIS PROGRAMS MAJOR VERSION NUMBER
  57. extern    int        minor_version;            // THIS PROGRAMS MINOR VERSION NUMBER
  58. extern    char        buffer[350];            // ANYBODY CAN USE
  59. extern    char        line_buffer[350];        // ANYBODY CAN USE
  60. extern    char        exepath[125];            // Path where .EXE was called from
  61. extern    char        pathname[150];            // STRING STORAGE FOR withpath( )
  62. extern    struct     configuration config;
  63. extern    struct    mainstruct ms;              // MAIN GLOBAL DATA
  64. extern    struct    analyzefilestruct az; // THE "az"   ANALYZE FILE STRUCTURE
  65. extern    struct    readfilestruct rf;     // READFILE PARAMATERS
  66. extern    struct    printmanagement pm;     // PRINT MANAGEMENT STRUCTURE
  67. extern    struct    printfilestruct pf;     // THE "pf"   PRINT FILE   STRUCTURE
  68. extern    struct    printpreviewstruct pv;// PREVIEW FILE STRUCTURE
  69. //==================================================================
  70. // VARIABLES
  71. //==================================================================
  72. WNDPROC    OldEditFloat;    // SUBCLASSING EDIT CONTROLS FOR FLOATING POINT ONLY
  73. FARPROC    NewEditFloat;
  74. LRESULT    CALLBACK _export NewEditFloatProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam);
  75. static    layout_selection;    // 0=QUIT 1=BOOK 2=SIMPLE 3=ADVANCED 4=WORDWRAP
  76. //==================================================================
  77. // PROTOTYPES
  78. //==================================================================
  79.             char    *add_commas( DWORD number );
  80.             void    build_font_string( LOGFONT FAR *lf, char *buf, int charsize );
  81.             void    master_clear( void);
  82. static    BOOL    paint_current_layout( DRAWITEMSTRUCT *dis );
  83. static    void    find_panel_size( RECT *ib, int rows, int cols, int *hinc, int *vinc, int *iheight, int *iwidth );
  84. static    int    getthefont( HWND, LOGFONT FAR * );        // DEBUG
  85. static    int    sheet_numbers_ok( HWND hwnd );
  86. static    void    validate_margin_range( char *buf, float *who );
  87. //==================================================================
  88. // DIALOG PROTOTYPES
  89. //==================================================================
  90.             void    border_styles_dialog( HWND );
  91.             void    font_select_dialog( HWND );
  92.             void    free_resources_dialog( HWND );
  93.             void    header_footer_dialog( HWND );
  94.             void    page_breaks_dialog( void );
  95.             void    page_layout_dialog( HWND );
  96.             void    print_dialog( HWND );
  97.             void    print_preview_dialog( HWND );
  98.             int    printer_setup( HWND );
  99.             void    misc_setups_dialog( HWND );
  100.             void    text_margins_dialog( HWND );
  101.             void    title_pages_dialog( HWND );
  102.             void    sheet_margins_dialog( HWND );
  103.             void    sides_one_both_dialog( HWND );
  104.             BOOL    turn_paper_over_dialog( void );
  105.  
  106. static    FARPROC    lpfnAdvancedPageImageProc;            // SELECTING A FLAT STYLE
  107. static    FARPROC    lpfnAboutFileProc;        // ABOUT YOUR FILE DIALOG
  108. static    FARPROC    lpfnBordersProc;            // BORDERS DIALOG
  109. static    FARPROC    lpfnFreeResourcesProc;    // BORDERS DIALOG
  110. static    FARPROC    lpfnHeaderFooterProc;    // HEADER FOOTER DIALOG
  111. static    FARPROC    lpfnLayoutTypeProc;        // PAGE LAYOUTS
  112. static    FARPROC    lpfnPageBreaksProc;        // FILE DIDN'T HAVE PAGE BREAKS
  113. static    FARPROC    lpfnPrintProc;                // PRINT
  114. static    FARPROC    lpfnPreviewProc;            // PRINT PREVIEW
  115. static    FARPROC    lpfnMiscSetupsProc;         // SETUP DIALOG
  116. static    FARPROC    lpfnTextMarginsProc;        // TEXT FILE MARGIN SETUPS DIALOG
  117. static    FARPROC    lpfnTitlePagesProc;        // TITLE & CERT PAGES PROC
  118. static    FARPROC    lpfnSheetMarginsProc;    // SHEET MARGIN SETUPS DIALOG
  119. static    FARPROC    lpfnSidesProc;                // SIDES ONE-OR-BOTH DIALOG
  120. static    FARPROC    lpfnTurnPaperOverProc;    // TURN PAPER OVER DIALOG
  121.  
  122. static    BOOL       CALLBACK _export AdvancedPageImageProc( HWND, WORD, WORD, LONG );
  123. static    BOOL       CALLBACK _export AboutFileProc( HWND, WORD, WORD, LONG );
  124. static    BOOL       CALLBACK _export BordersProc( HWND, WORD, WORD, LONG );
  125. static    BOOL       CALLBACK _export FreeResourcesProc( HWND, WORD, WORD, LONG );
  126. static    BOOL       CALLBACK _export HeaderFooterProc( HWND, WORD, WORD, LONG );
  127. static    BOOL       CALLBACK _export LayoutTypeProc( HWND, WORD, WORD, LONG );
  128. static    BOOL       CALLBACK _export PrintProc( HWND, WORD, WORD, LONG );
  129. static    BOOL       CALLBACK _export PageBreaksProc( HWND, WORD, WORD, LONG );
  130. static    LRESULT CALLBACK _export PreviewProc( HWND, WORD, WORD, LONG );
  131. static    BOOL      CALLBACK _export MiscSetupsProc( HWND, WORD, WORD, LONG );
  132. static    BOOL       CALLBACK _export TextMarginsProc( HWND, WORD, WORD, LONG );
  133. static    BOOL       CALLBACK _export TitlePagesProc( HWND, WORD, WORD, LONG );
  134. static    BOOL       CALLBACK _export TurnPaperOverProc( HWND, WORD, WORD, LONG );
  135. static    BOOL       CALLBACK _export SheetMarginsProc( HWND, WORD, WORD, LONG );
  136. static    BOOL       CALLBACK _export SidesProc( HWND, WORD, WORD, LONG );
  137.  
  138. //=====================================================================
  139. // DESTROY THE FILE IN MEMORY & ERASE ANY ASSOCIATED WINDOWS
  140. // (JUST LIKE NO FILE WAS EVER OPENED)
  141. //=====================================================================
  142. void    master_clear( void )
  143. {
  144.     clear_memory_file();
  145.     delete_preview_bitmaps();
  146.     preview_destroy();        // JUST IN CASE THE PREVIEW WINDOW WAS UP
  147.     print_destroy();            // JUST IN CASE A PRINT DC WAS ACTIVE
  148.     destroy_viewfile();        // JUST IN CASE VIEWFILE WINDOW WAS UP
  149. }
  150.  
  151. //=======================================================================
  152. // RUN THE "ABOUT FILE" DIALOG
  153. //=======================================================================
  154. void    about_file_dialog( HWND hwnd )
  155. {
  156.     //--------------------------------------------------------------------
  157.     // IF THERE WERE LESS THAN 8 PAGES IN THE FILE, WE CAN'T SHOW THE DATA
  158.     //--------------------------------------------------------------------
  159.     if(az.totalpages<8)
  160.     {
  161.      MessageBox(hwnd, "Sorry, but this file is too small.\r\n"
  162.                             "It must have at least 8 pages for\r\n"
  163.                             "this option to work properly.","SORRY",MB_OK);
  164.      return;
  165.     }
  166.     // CREATE AN INSTANCE FOR THE -TITLE PAGES- DIALOG BOX
  167.     lpfnAboutFileProc = MakeProcInstance((FARPROC)AboutFileProc,hInstance);
  168.     DialogBox(hInstance,"AboutFileProc",hwnd,(DLGPROC)lpfnAboutFileProc);
  169.     FreeProcInstance(lpfnAboutFileProc);
  170.     InvalidateRect(hwnd,NULL,FALSE);
  171. }
  172.  
  173. //=======================================================================
  174. // ABOUT FILE DIALOG - SHOW THE USER DETAILS ABOUT HIS FILE
  175. // PAGES, SHEETS, PAGE BREAKS, LINES PER PAGE, DOUBLESPACED
  176. //=======================================================================
  177. static BOOL CALLBACK _export AboutFileProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  178. {
  179.     int     j,k,pg;
  180.     char    *ww;
  181.  
  182.     switch( Msg )
  183.     {
  184.      case WM_INITDIALOG:
  185.       // SET THE "PAGES IN FILE", "PAGE BREAKS FOUND", AND "SHEETS REQUIRED"
  186.       // 0th IS HARD-CODED TO ID#101 TO SAVE TIME
  187.       sprintf(buffer,"Pages in file: %d",az.totalpages);
  188.       SetDlgItemText(hwnd,101,buffer);
  189.       sprintf(buffer,"Page breaks found: %d",rf.PAGEBREAKCT);
  190.       SetDlgItemText(hwnd,102,buffer);
  191.       sprintf(buffer,"Sheets required to print: %d",pm.max_sheet);
  192.       SetDlgItemText(hwnd,103,buffer);
  193.       // SET ALL OF THE "ANALYSE FILE" DATA TEXTBOXES, THERE ARE 8 OF 'EM
  194.       // 0th IS HARD-CODED TO ID#104-->#111 TO SAVE TIME
  195.       for(j=104,k=1;j<112;j++,k++)
  196.       {
  197.         pg=k;
  198.         if(k==7)
  199.          pg=az.totalpages-1;        // ITEM 7 IS 2nd TO LAST PAGE
  200.         if(k==8)
  201.          pg=az.totalpages;        // ITEM 8 IS LAST PAGE
  202.         if(get_doublespaced_flag(pg))    // SEE IF PAGE WAS DOUBLE OR SINGLE SPACED
  203.          ww="double";
  204.         else
  205.          ww="single";
  206.         sprintf(buffer,"Page %d: %d lines - %sspaced",pg,az.page_about[k-1],ww);
  207.         SetDlgItemText(hwnd,j,buffer);
  208.       }
  209.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  210.  
  211.      //-------------------------------------------------------
  212.      // IF USING ETS-OWNERDRAW BUTTONS:
  213.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  214.      //-------------------------------------------------------
  215.      case WM_DRAWITEM:
  216.       //------------------------------------
  217.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  218.       //------------------------------------
  219.       DrawDialogEtsButton( (DRAWITEMSTRUCT *)lParam );
  220.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  221.  
  222.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  223.       EndDialog(hwnd,FALSE);
  224.       return FALSE;
  225.  
  226.      case WM_COMMAND:
  227.       switch( wParam )
  228.       {
  229.         case ETSOK:
  230.          EndDialog(hwnd,TRUE);    // RETURN ZERO
  231.          return FALSE;
  232.  
  233.         case ETSHELP:
  234.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,About_your_File);
  235.          return TRUE;
  236.       }
  237.       break;
  238.     }
  239.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  240. }
  241.  
  242. //=======================================================================
  243. // ADD COMMAS TO BIG NUMBERS     EG: 25550550 becomes 25,550,550
  244. // PASS: (DWORD) NUMBER (unsigned long, 32 bits)
  245. // RETURNS: POINTER TO STATIC DATA STRING
  246. // SUBSEQUENT CALLS CHANGE THE STATIC STRING
  247. //=======================================================================
  248. char    *add_commas( DWORD number )
  249. {
  250.     static    char    finishedbuf[20];    // MAX: ULONG = 4,294,967,295
  251.     char    workbuf[20];
  252.     int    j;
  253.     char    *ss;
  254.     char    *dd;
  255.     memset(&finishedbuf[0],0,sizeof(finishedbuf));
  256.     sprintf(workbuf,"%ld",number);    // PRINT WITHOUT COMMAS FIRST
  257.     ss=&workbuf[0];                        // POINTER TO SOURCE BUF
  258.     dd=&finishedbuf[0];                    // POINTER TO DEST BUF
  259.     j=strlen(workbuf);
  260.     while( *ss )                            // GO UNTIL THE TERMINATING NULL
  261.     {
  262.      *dd++ = *ss++;                        // COPY THE NUMBER OVER
  263.      j--;
  264.      if( j>=3 )                                // DON'T USE THE LAST 3 DIGITS
  265.       if( ((j%3)==0) )
  266.         *dd++ = ',';                         // ADD A COMMA
  267.     }
  268.     return &finishedbuf[0];                // RETURN A POINTER TO THE NEW NUMBER
  269. }
  270.  
  271. //=======================================================================
  272. // RUN THE BORDER STYLES DIALOG
  273. //=======================================================================
  274. void    border_styles_dialog( HWND hwnd )
  275. {
  276.     lpfnBordersProc = MakeProcInstance((FARPROC)BordersProc,hInstance);
  277.     DialogBox(hInstance,"BordersProc",hwnd,(DLGPROC)lpfnBordersProc);
  278.     FreeProcInstance(lpfnBordersProc);
  279. }
  280.  
  281. //=====================================================
  282. // LET THE USER SELECT HIS BORDER STYLE
  283. //=====================================================
  284. static BOOL CALLBACK _export BordersProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  285. {
  286.                 PAINTSTRUCT    paint;
  287.     static    HBITMAP        oldbitmap,picsbitmap,textbitmap=NULL;
  288.                 HDC            memdc,screendc;
  289.                 int            j,left,top;
  290.     static    int            newselection;
  291.     static    char            borders[]={0,1,2,3,4,5,6,1,2,3,4,6};
  292.     static    char            shades[]= {0,0,0,0,0,0,0,1,1,1,1,1};
  293.     static    char            xlate[]=  {0,1,2,3,4,5,6,0,7,8,9,10,0,11};
  294.  
  295.     switch( Msg )
  296.     {
  297.      case WM_INITDIALOG:
  298.       //----------------------------------------------
  299.       // THERE ARE 14 IMAGES EACH 66 TALL AND 50 WIDE
  300.       // WE'RE GOING TO DO 7 ON TOP AND 7 ON BOTTOM
  301.       //----------------------------------------------
  302.       picsbitmap = LoadBitmap( hInstance, MAKEINTRESOURCE(BORDERSBITMAP) );
  303.       textbitmap = LoadBitmap( hInstance, MAKEINTRESOURCE(BORDERSTEXTBITMAP) );
  304.       newselection = config.border;
  305.       if(newselection!=0 && newselection!=5)
  306.         if(config.shade) newselection+=7;
  307.       j=xlate[newselection];
  308.       CheckDlgButton(hwnd,BORDERSA+j,1);
  309.       save_config();
  310.       return TRUE;        // DEFAULT DIALOG CONTROL GETS KEYBOARD FOCUS
  311.      //-------------------------------------------------------
  312.      // IF USING ETS-OWNERDRAW BUTTONS:
  313.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  314.      //------------------------------------------------------
  315.      case WM_DRAWITEM:
  316.       //------------------------------------
  317.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  318.       //------------------------------------
  319.       DrawDialogEtsButton( (DRAWITEMSTRUCT *)lParam );
  320.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  321.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  322.       EndDialog(hwnd,TRUE);
  323.       return FALSE;
  324.      case WM_COMMAND:
  325.       //-----------------------------------------------
  326.       // SEE IF HE MOUSED ON ONE OF THE CHOICES BUTTONS
  327.       //-----------------------------------------------
  328.       if(wParam>=BORDERSA && wParam<=BORDERSL)
  329.       {
  330.         newselection=wParam-BORDERSA;
  331.         j=newselection;
  332.         if(newselection==11)
  333.          newselection+=2;
  334.         else
  335.          if(newselection>6)
  336.           newselection++;
  337.         // DRAW THE TEXT DESCRIPTION...
  338.         screendc=GetDC(hwnd);
  339.         memdc=CreateCompatibleDC(screendc);
  340.         oldbitmap=SelectBitmap(memdc,textbitmap);
  341.         BitBlt(screendc,15,235,145,16,memdc,0,newselection*16,SRCCOPY);
  342.         newselection=j;
  343.  
  344.         SelectObject(memdc,oldbitmap);
  345.         DeleteDC(memdc);
  346.         ReleaseDC(hwnd,screendc);
  347.         return FALSE;
  348.       }
  349.       switch( wParam )
  350.       {
  351.         case ETSOK:
  352.          config.shade=shades[newselection];
  353.          config.border=borders[newselection];
  354.          check_config();            // SET "ms.setup_changed" IF ANYTHING CHANGED
  355.          EndDialog(hwnd,FALSE);
  356.          return FALSE;
  357.         case ETSCANCEL:
  358.          restore_config();
  359.          EndDialog(hwnd,FALSE);    // RETURN ZERO
  360.          return FALSE;
  361.         case ETSHELP:
  362.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,Border_Styles);
  363.          return TRUE;
  364.       }
  365.       break;
  366.      case WM_PAINT:
  367.       BeginPaint(hwnd,&paint);
  368.       if( picsbitmap==NULL ) return FALSE;
  369.       if( textbitmap==NULL ) return FALSE;
  370.       memdc = CreateCompatibleDC(paint.hdc);
  371.       // DRAW ALL OF THE PICTURES...
  372.       oldbitmap = SelectBitmap(memdc,picsbitmap);
  373.       top=25;left=15;
  374.       for(j=0;j<14;j++)
  375.       {
  376.         if(j==7){top=135;left=15;}
  377.         //--------------------------------------------------
  378.         // STYLES 7 AND 12 ARE NOT USED
  379.         // 7=NO BORDER,CAN'T SHADOW  12=TIC-TAC CAN'T SHADOW
  380.         //--------------------------------------------------
  381.         if(j==7 || j==12){ left+=65; continue; }
  382.         BitBlt(paint.hdc,left,top,50,66,memdc,j*50,0,SRCCOPY);
  383.         left+=65;
  384.       }
  385.       // DRAW THE TEXT DESCRIPTION...
  386.       SelectBitmap(memdc,textbitmap);
  387.       BitBlt(paint.hdc,15,235,145,16,memdc,0,newselection*16,SRCCOPY);
  388.       SelectObject(memdc,oldbitmap);
  389.       DeleteObject(memdc);
  390.       EndPaint(hwnd,&paint);
  391.       break;
  392.      case WM_DESTROY:
  393.       DeleteObject(picsbitmap);
  394.       DeleteObject(textbitmap);
  395.       break;
  396.     }
  397.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  398. }
  399.  
  400. //=======================================================================
  401. // RUN THE FONT SELECT DIALOG
  402. // NOTE: THIS DIALOG ONLY CHOOSES THE BODY TEXT FONT,
  403. //=======================================================================
  404. void    font_select_dialog( HWND hwnd )
  405. {
  406.     CHOOSEFONT    cf;
  407.     LOGFONT        lf;
  408.     int            result;
  409.     HFONT       hFont;
  410.  
  411.     save_config();        // IN CASE ANYTHING CHANGES
  412.     memset(&cf,0,sizeof(cf));
  413.  
  414.     // MAKE A LOGFONT STRUCTURE OF THE BODY TEXT FONT
  415.     GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf );
  416.     hFont = CreateFontIndirect(&lf);
  417.     strcpy(lf.lfFaceName,config.body_font_name);
  418.     lf.lfWeight = config.body_font_weight;
  419.     lf.lfItalic = config.body_font_italic;
  420.  
  421.     strcpy(buffer,config.body_font_name);    // INIT OUR CURRENT FONT
  422.  
  423.     cf.lStructSize = sizeof(cf);
  424.     cf.hwndOwner    = hwnd;
  425.     cf.lpLogFont     = &lf;
  426.     cf.hDC             = CreateDC( config.printer_driver,config.printer_device,
  427.                                         config.printer_output,NULL );
  428.     cf.Flags =
  429.         CF_INITTOLOGFONTSTRUCT |   // USE THE LOG FONT SURUCTURE
  430.         CF_BOTH |                        // PRINTER AND DISPLAY FONTS
  431.         CF_TTONLY |                        // TRUETYPE ONLY
  432.         CF_EFFECTS |                    // ENABLE STRIKEOUT, UNDERLINE & COLORS
  433.         CF_FORCEFONTEXIST |             // FONT MUST EXIST, OR USER WILL GET AN ERROR
  434.         CF_NOVECTORFONTS |            // NO PLOTTER FONTS
  435.         CF_SCALABLEONLY |                // ONLY SCALABLE FONTS
  436.         CF_WYSIWYG;                        // ONLY PRINTER AND DISPLAY FONTS WILL BE SHOWN
  437.     cf.lpszStyle = buffer;            // THE FONT WHICH IS CURRENTLY SELECTED
  438.  
  439.     result = ChooseFont(&cf);        // CALL THE WINDOWS COMMON DIALOG
  440.     DeleteDC(cf.hDC);        // REMOVE THE DC WE JUST CREATED
  441.     DeleteFont(hFont);    // REMOVE THE FONT WE CREATED
  442.     if( result == FALSE )
  443.      return;
  444.     //----------------------------------
  445.     // SAVE THE NEW FONT NAME AND WEIGHT
  446.     //----------------------------------
  447.     if( lf.lfFaceName != NULL )
  448.      strcpy(config.body_font_name,lf.lfFaceName);
  449.     config.body_font_weight = lf.lfWeight;
  450.     check_config();            // SEE IF THE FONT CHANGED
  451. }
  452.  
  453. //=======================================================================
  454. // RUN THE FREE SYSTEM RESOURCES DIALOG
  455. //=======================================================================
  456. void    free_resources_dialog( HWND hwnd )
  457. {
  458. //    etswin_set_font(0);            // SET THE FIXED PITCH FONT
  459.     // CREATE AN INSTANCE FOR THE -TITLE PAGES- DIALOG BOX
  460.     lpfnFreeResourcesProc = MakeProcInstance((FARPROC)FreeResourcesProc,hInstance);
  461.     DialogBox(hInstance,"FreeResourcesProc",hwnd,(DLGPROC)lpfnFreeResourcesProc);
  462.     FreeProcInstance(lpfnFreeResourcesProc);
  463.     InvalidateRect(hwnd,NULL,FALSE);
  464. //    etswin_set_font(1);            // RESTORE OUR CUSTOM FONT
  465. }
  466.  
  467. //=======================================================================
  468. // TITLE PAGES PROC - CHOOSE HOW MANY TITLE & CERTIFICATE PAGES IN FILE
  469. // PRINTS THESE PAGES IN A FIXED PITCH FONT, LIKE COURIER
  470. //=======================================================================
  471. static BOOL CALLBACK _export FreeResourcesProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  472. {
  473.     static    struct    diskfree_t df;
  474.     static    long        diskfree;        // FREE DISK SPACE
  475.     static    DWORD        contigfree;        // FREE CONTIGUOUS MEMORY
  476.     static    DWORD        memfree;            // FREE MEMORY IN GENERAL
  477.     static    int        sysfree;            // % FREE SYSTEM
  478.     static    int        gdifree;            // % FREE GDI
  479.     static    int        usrfree;            // % FREE USER
  480.  
  481.     switch( Msg )
  482.     {
  483.      case WM_INITDIALOG:
  484.       // CALCULATE ALL OF THE FREE RESOURCES
  485.       _dos_getdiskfree(0,&df);
  486.       diskfree     =(long)df.avail_clusters
  487.                     *(long)df.bytes_per_sector
  488.                     *(long)df.sectors_per_cluster;  // USE "%ld" TO PRINT "avail"
  489.       contigfree = GlobalCompact(0);
  490.       memfree = GetFreeSpace(0);
  491.       sysfree = GetFreeSystemResources(GFSR_SYSTEMRESOURCES);
  492.       gdifree = GetFreeSystemResources(GFSR_GDIRESOURCES);
  493.       usrfree = GetFreeSystemResources(GFSR_USERRESOURCES);
  494.       // THE DIALOG CONTAINS HARD-CODED TEXT FIELDS, IT'S TOO EASY
  495.       SetDlgItemText(hwnd,101,add_commas(diskfree));    // 101 = DISK FREE SPACE
  496.       SetDlgItemText(hwnd,102,add_commas(memfree));        // 102 = TOTAL FREE MEMORY
  497.       SetDlgItemText(hwnd,103,add_commas(contigfree));    // 103 = TOTAL CONTIGUOUS FREE MEMORY
  498.       sprintf( buffer,"%d%%",sysfree);
  499.       SetDlgItemText(hwnd,104,buffer);                        // 104 = FREE SYSTEM RESOURCES
  500.       sprintf( buffer,"%d%%",gdifree);
  501.       SetDlgItemText(hwnd,105,buffer);                        // 105 = FREE GDI RESOURCES
  502.       sprintf( buffer,"%d%%",usrfree);
  503.       SetDlgItemText(hwnd,106,buffer);                        // 106 = FREE USER RESOURCES
  504.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  505.  
  506.      //-------------------------------------------------------
  507.      // IF USING ETS-OWNERDRAW BUTTONS:
  508.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  509.      //------------------------------------------------------
  510.      case WM_DRAWITEM:
  511.       //------------------------------------
  512.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  513.       //------------------------------------
  514.       DrawDialogEtsButton( (DRAWITEMSTRUCT *)lParam );
  515.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  516.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  517.       EndDialog(hwnd,TRUE);
  518.       return FALSE;
  519.      case WM_COMMAND:
  520.       switch( wParam )
  521.       {
  522.         case ETSOK:
  523.          EndDialog(hwnd,FALSE);    // RETURN ZERO
  524.          return FALSE;          // SHOULD NEVER GET HERE
  525.       }
  526.       break;
  527.     }
  528.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  529. }
  530.  
  531. //=======================================================================
  532. // RUN THE HEADER-FOOTER DIALOG
  533. //=======================================================================
  534. void    header_footer_dialog( HWND hwnd )
  535. {
  536.     // CREATE AN INSTANCE FOR THE -HEADER FOOTER- DIALOG BOX
  537.     lpfnHeaderFooterProc = MakeProcInstance((FARPROC)HeaderFooterProc,hInstance);
  538.     DialogBox(hInstance,"HeaderFooterProc",hwnd,(DLGPROC)lpfnHeaderFooterProc);
  539.     FreeProcInstance(lpfnHeaderFooterProc);
  540. }
  541.  
  542. //=======================================================================
  543. // HEADER FOOTER PROC - PICK THE HEADER, FOOTER LINE & FONTS
  544. // TOPS HAS ONLY 1 HEADER, 1 FOOTER
  545. //=======================================================================
  546. static BOOL CALLBACK _export HeaderFooterProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  547. {
  548.     int    k;
  549.     switch( Msg )
  550.     {
  551.      case WM_INITDIALOG:
  552.       save_config();
  553.       // EXPLANATION OF THE HARD-CODED IDENTIFIERS IN THIS DIALOG:
  554.       // DESCRIPTION                   INDEX
  555.       // Text of Header or Footer         0
  556.       // Auto Radiobutton "NONE"          1
  557.       // Auto Radiobutton "LEFT"          2
  558.       // Auto Radiobutton "CENTER"        3
  559.       // Auto Radiobutton "RIGHT"         4
  560.       // Description of Font              5
  561.       // Pushbutton "CHANGE FONT"         6
  562.       // TOPS HAS ONLY 1 HEADER, 1 FOOTER
  563.       SetDlgItemText(hwnd,HDR1,config.header_text[0]);
  564.       SetDlgItemText(hwnd,FTR1,config.footer_text[0]);
  565.       CheckDlgButton(hwnd,HDR1+1+config.header_enabled[0],1);
  566.       CheckDlgButton(hwnd,FTR1+1+config.footer_enabled[0],1);
  567.       // FILL IN THE HEADER DESCRIPTION
  568.       build_font_string( &config.hdrftr_logfont[0], buffer, config.hdrftr_pointsize[0] );
  569.       SetDlgItemText(hwnd,HDR1+5,buffer);
  570.       // FILL IN THE FOOTER DESCRIPTION
  571.       build_font_string( &config.hdrftr_logfont[3], buffer, config.hdrftr_pointsize[3] );
  572.       SetDlgItemText(hwnd,FTR1+5,buffer);
  573.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  574.  
  575.      //-------------------------------------------------------
  576.      // IF USING ETS-OWNERDRAW BUTTONS:
  577.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  578.      //------------------------------------------------------
  579.      case WM_DRAWITEM:
  580.       //------------------------------------
  581.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  582.       //------------------------------------
  583.       DrawDialogEtsButton( (DRAWITEMSTRUCT *)lParam );
  584.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  585.  
  586.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  587.       restore_config();
  588.       EndDialog(hwnd,TRUE);
  589.       return FALSE;
  590.  
  591.      case WM_COMMAND:
  592.       switch( wParam )
  593.       {
  594.         // HEADER LINE STARTS AT INDEX 0 INTO THE ARRAY
  595.         case HDR1+6:    // HE PRESSED A "CHANGE FONT" (INDEX 6) BUTTON
  596.          k = getthefont(hwnd,&config.hdrftr_logfont[0]);
  597.          if( k!=0 )        // RETURNS POINT SIZE OR ZERO IF CANCELLED
  598.          {
  599.           config.hdrftr_pointsize[0] = k;    // SET THE TRUE POINT SIZE
  600.           build_font_string( &config.hdrftr_logfont[0], buffer, k );
  601.           SetDlgItemText(hwnd,HDR1+5,buffer);
  602.          }
  603.          return TRUE;
  604.         // FOOTER LINE STARTS AT INDEX 3 INTO THE ARRAY
  605.         case FTR1+6:   // HE PRESSED A "CHANGE FONT" (INDEX 6) BUTTON
  606.          k = getthefont(hwnd,&config.hdrftr_logfont[3]);
  607.          if( k!=0 )        // RETURNS POINT SIZE OR ZERO IF CANCELLED
  608.          {
  609.           config.hdrftr_pointsize[3] = k;    // SET THE TRUE POINT SIZE
  610.           build_font_string( &config.hdrftr_logfont[3], buffer, k );
  611.           SetDlgItemText(hwnd,FTR1+5,buffer);
  612.          }
  613.          return TRUE;
  614.  
  615.         case ETSOK:
  616.          // EXTRACT ALL HEADER INFORMATION
  617.          GetDlgItemText(hwnd,HDR1,config.header_text[0],sizeof(config.header_text[0])-1);
  618.          for(k=0;k<4;k++)
  619.           if(IsDlgButtonChecked(hwnd,HDR1+1+k))
  620.             config.header_enabled[0]=k;    // 0=NO 1=LEFT 2=CENTER 3=RIGHT
  621.          // EXTRACT ALL FOOTER INFORMATION
  622.          GetDlgItemText(hwnd,FTR1,config.footer_text[0],sizeof(config.footer_text[0])-1);
  623.          for(k=0;k<4;k++)
  624.           if(IsDlgButtonChecked(hwnd,FTR1+1+k))
  625.             config.footer_enabled[0]=k;    // 0=NO 1=LEFT 2=CENTER 3=RIGHT
  626.          check_config();
  627.          EndDialog(hwnd,FALSE);    // RETURN ZERO
  628.          return FALSE;
  629.  
  630.         case ETSCANCEL:
  631.          restore_config();
  632.          EndDialog(hwnd,TRUE);    // RETURN ZERO
  633.          return FALSE;
  634.  
  635.         case ETSHELP:
  636.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,Headers_and_Footers);
  637.          return TRUE;
  638.       }
  639.       break;
  640.     }
  641.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  642. }
  643. //=====================================================
  644. // CALLED FROM HEADER FOOTER PROC (ABOVE)
  645. // RETURNS THE TRUE POINT SIZE OF THE SELECTED FONT
  646. // -or- FALSE IF USER CANCELLED
  647. //=====================================================
  648. static    int    getthefont( HWND hwnd, LOGFONT FAR *lf )
  649. {
  650.     int    result;
  651.     CHOOSEFONT    cf;
  652.     int    realpointsize;
  653.  
  654.     memset(&cf,0,sizeof(CHOOSEFONT));
  655.     cf.lStructSize = sizeof(CHOOSEFONT);
  656.     cf.hwndOwner = hwnd;
  657.     cf.lpLogFont = lf;
  658.     cf.Flags =
  659.         CF_INITTOLOGFONTSTRUCT |   // USE THE LOG FONT SURUCTURE
  660.         CF_SCREENFONTS |                // FONTS PRINTABLE TO THE SCREEN ONLY
  661.         CF_TTONLY |                        // TRUETYPE ONLY
  662.         CF_EFFECTS |                    // ENABLE STRIKEOUT, UNDERLINE & COLORS
  663.         CF_FORCEFONTEXIST;             // FONT MUST EXIST, OR USER WILL GET AN ERROR
  664.     result = ChooseFont(&cf);
  665.     if( result == FALSE )
  666.      return FALSE;
  667.     // FEB 17 1995: ChooseFont RETURNS WITH THE USER'S FONT "POINTS" CHOICE
  668.     // IN cf.iPointSize (times ten: eg: if he chose 72 points: iPointSize = 720)
  669.     // WE USE THIS NUMBER TO SET lf->lfHeight TO THE NEGATIVE OF THIS NUMBER/10.
  670.     //
  671.     // WINDOWS (THIS TOOK ME A LOT OF TROUBLE) RETURNS THE WRONG VALUE IN lfHeight
  672.     // (HE USES THE CURRENTLY ACTIVE VERTICAL DPI OF THE SCREEN)
  673.     // EG: IF YOU HAVE A 96 DPI SCREEN, HE WILL SET 72 POINT lfHeight = -96 (SHD BE -72)
  674.     // IF YOU ARE USING A 1280x1024 LARGE FONT, HE WILL SET A 72 POINT TO -140
  675.     // I SIMPLY WISH TO AVOID ALL THAT BULLSHIT, AND SET THE USERS POINT SIZE
  676.     // TO THE VALUE THE USER CHOSE, NOT SOME "ARBITRARY" VALUE WINDOWS USED!
  677.     realpointsize = (cf.iPointSize/10);
  678.     return realpointsize;
  679. }
  680.  
  681. //==================================================================
  682. // SUBROUTINE: BUILD FONT STRING:
  683. // BUILDS AN ENGLISH FONT DESCRIPTION FROM A LOGFONT STRUCTURE
  684. // EG: Courier New 12 pt Extra Bold Italic
  685. // PASS:
  686. // Pointer to LOGFONT structure &
  687. // Pointer to the dest string( usually "buffer[]") to hold string
  688. // Point Size of font (usually from config.hdrftr_pointsize[])
  689. //
  690. // I will build the string into your dest (usally "buffer[]")
  691. //==================================================================
  692. void    build_font_string( LOGFONT FAR *lf, char *buf, int pointsize )
  693. {
  694.     char     minibuf[15];
  695.  
  696.     sprintf( buf," %s ", lf->lfFaceName );    // 1 BLANK BEFORE STARTING STRING
  697.     sprintf( minibuf,"%d",pointsize);        // FONT HEIGHT IN POINTS
  698.     strcat( buf,minibuf );
  699.     strcat( buf," Pt " );
  700.     //-------------------------------
  701.     // FIGURE OUT NORMAL, BOLD.. ETC.
  702.     //-------------------------------
  703.     switch( lf->lfWeight )
  704.     {
  705.      case 100:    strcat(buf,"Thin");          break;
  706.      case 200:  strcat(buf,"Extra Light");break;
  707.      case 300:  strcat(buf,"Light");          break;
  708.      case 400:  strcat(buf,"Normal");     break;
  709.      case 500:  strcat(buf,"Medium");     break;
  710.      case 600:  strcat(buf,"SemiBold");   break;
  711.      case 700:  strcat(buf,"Bold");       break;
  712.      case 800:  strcat(buf,"Extra Bold"); break;
  713.      case 900:  strcat(buf,"Heavy");
  714.     }
  715.     //------------------
  716.     // IS IT IN ITALICS?
  717.     //------------------
  718.     if( lf->lfItalic )
  719.      strcat( buf," Italic" );
  720.     //------------------
  721.     // IS IT UNDERLINED?
  722.     //------------------
  723.     if( lf->lfUnderline )
  724.      strcat( buf," Underlined");
  725. }
  726.  
  727. //==================================================================
  728. // RUN THE "PAGE BREAKS" DIALOG:
  729. // CALLED at the END of "open file" if NO PAGE BREAKS WERE FOUND,
  730. // AND WE WERE SET TO "USE EMBEDDED"
  731. // COMPUTER SETS "config.page_breaks" TO A BEST GUESS BEFORE CALLING
  732. //==================================================================
  733. void    page_breaks_dialog( void )
  734. {
  735.       lpfnPageBreaksProc = MakeProcInstance((FARPROC)PageBreaksProc,hInstance);
  736.       DialogBox(hInstance,"PageBreaksProc",NULL,(DLGPROC)lpfnPageBreaksProc);
  737.       FreeProcInstance(lpfnPageBreaksProc);
  738. }
  739. //=====================================================
  740. // PAGE BREAKS DIALOG PROCEDURE:
  741. // THE SINGLE EDIT CONTROL IS HARD CODED TO: 101
  742. //=====================================================
  743. BOOL CALLBACK _export PageBreaksProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  744. {
  745.     int    j;
  746.     BOOL    translated;
  747.     switch( Msg )
  748.     {
  749.      case WM_INITDIALOG:
  750.       sprintf(buffer,"%d",config.page_breaks);
  751.       SetDlgItemText(hwnd,101,buffer);
  752.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  753.  
  754.      case WM_DRAWITEM:
  755.       //------------------------------------
  756.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  757.       //------------------------------------
  758.       DrawDialogEtsButton((DRAWITEMSTRUCT *)lParam );
  759.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  760.  
  761.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  762.       EndDialog(hwnd,TRUE);
  763.       return FALSE;
  764.  
  765.      case WM_COMMAND:
  766.       switch( wParam )
  767.       {
  768.         case ETSCANCEL:
  769.          EndDialog(hwnd,TRUE);            // RETURN OK
  770.          break;
  771.         case ETSOK:
  772.          // ASK WINDOWS TO TRANSLATE THE NUMBER FOR ME..
  773.          j = GetDlgItemInt(hwnd,101,&translated,FALSE);
  774.          if( translated==TRUE )            // WINDOWS LIKED HIS INTEGER
  775.           if( j>MINIMUMLINESPERPAGE && j<=MAXIMUMLINESPERPAGE )
  776.             config.page_breaks=j;
  777.          EndDialog(hwnd,TRUE);    // RETURN OK
  778.          break;
  779.  
  780.         case ETSHELP:
  781.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,Page_Breaks_Error);
  782.          return TRUE;
  783.       }
  784.       break;
  785.     }
  786.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  787. }
  788.  
  789. //=======================================================================
  790. // RUN THE PRINT DIALOG
  791. //=======================================================================
  792. void    print_dialog( HWND hwnd )
  793. {
  794.       ms.dialog_cancelled=0;
  795.       lpfnPrintProc = MakeProcInstance((FARPROC)PrintProc,hInstance);
  796.       DialogBox(hInstance,"PrintProc",hwnd,(DLGPROC)lpfnPrintProc);
  797.       FreeProcInstance(lpfnPrintProc);
  798. }
  799.  
  800. //=========================================================================
  801. // PRINT PROC DIALOG:
  802. // - GET THE NUMBER OF COPIES
  803. // - GET HIS SHEET RANGE
  804. // - HANDLE CANCEL & HELP
  805. // - GET: ONE SIDE PRINTING
  806. //        BOTH SIDES PRINTING
  807. //         FRONT SIDES, THEN STOP
  808. //         BACK SIDES, THEN STOP
  809. //=========================================================================
  810. BOOL CALLBACK _export PrintProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  811. {
  812.     switch( Msg )
  813.     {
  814.      case WM_INITDIALOG:
  815.       ms.dialog_cancelled=0;
  816.       sprintf(buffer,"PRINTER: %s on %s",config.printer_device,config.printer_output);
  817.       SetDlgItemText(hwnd,PRINTERANDPORT,buffer);
  818.       sprintf(buffer,"Printing on ");
  819.       if( config.both_sides ) strcat(buffer,"Both Sides.");
  820.       else strcat(buffer,"One Side.");
  821.       SetDlgItemText(hwnd,PRINTONEORBOTHSIDES,buffer);
  822.  
  823.       if( config.both_sides )
  824.       {
  825.         switch( config.both_sides_method )
  826.         {
  827.          case 0:    strcpy(buffer,"Print Fronts, Pause, then Print Backs."); break;
  828.          case 1: strcpy(buffer,"Print all Front Sides, then Stop.");        break;
  829.          case 2: strcpy(buffer,"Print all Back Sides, then Stop.");            break;
  830.          case 3:    strcpy(buffer,"Printing on a Duplexing Printer.");            break;
  831.         }
  832.       }
  833.       else strcpy(buffer,"Front sides of paper only.");
  834.       SetDlgItemText(hwnd,PRINTMETHOD,buffer);
  835.  
  836.       PostMessage(hwnd,WM_RECALCULATE,0,0);
  837.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  838.  
  839.      case WM_RECALCULATE:
  840.       pm.copies = 1;
  841.       pm.start_sheet = pm.min_sheet;
  842.       if(pm.both_sides)
  843.         pm.max_sheet = (pm.total_sides+1)/2;
  844.       else
  845.         pm.max_sheet = pm.total_sides;
  846.       pm.end_sheet = pm.max_sheet;
  847.       SetDlgItemText(hwnd,NUMBEROFCOPIES,"1");
  848.       sprintf(buffer," Print Range Min: %d  Max: %d",pm.min_sheet,pm.max_sheet);
  849.       SetDlgItemText(hwnd,MINMAX,buffer);
  850.       SetDlgItemText(hwnd,STARTSHEET,"1");
  851.       sprintf(buffer,"%d",pm.max_sheet);
  852.       SetDlgItemText(hwnd,ENDSHEET,buffer);
  853.       //InvalidateRect(GetDlgItem(hwnd,MINMAX),NULL,TRUE);
  854.       return TRUE;    // REPAINT ANY UPDATED WINDOWS
  855.      //-------------------------------------------------------
  856.      // IF USING ETS-OWNERDRAW BUTTONS:
  857.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  858.      //------------------------------------------------------
  859.      case WM_DRAWITEM:
  860.       //------------------------------------
  861.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  862.       //------------------------------------
  863.       DrawDialogEtsButton((DRAWITEMSTRUCT *)lParam );
  864.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  865.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  866.       ms.dialog_cancelled = 1;
  867.       EndDialog(hwnd,TRUE);
  868.       return FALSE;
  869.      case WM_COMMAND:
  870.       switch( wParam )
  871.       {
  872.         case PRINTTOFILE:
  873.          pm.print_to_file = IsDlgButtonChecked(hwnd,PRINTTOFILE);
  874.          break;
  875.         case COLLATEDCOPIES:
  876.          pm.collated_copies = IsDlgButtonChecked(hwnd,COLLATEDCOPIES);
  877.          break;
  878.         case STARTSHEET:
  879.         case ENDSHEET:
  880.         case NUMBEROFCOPIES:
  881.          break;
  882.         case ETSCANCEL:
  883.          ms.dialog_cancelled = 1;        // SHOW HE WANTS TO ABORT
  884.          EndDialog(hwnd,TRUE);            // RETURN OK
  885.          break;
  886.         case ETSOK:
  887.          // VALIDATE START SHEET AND END SHEET
  888.          GetDlgItemText(hwnd,STARTSHEET,buffer,4);
  889.          pm.start_sheet=atoi(buffer);
  890.          GetDlgItemText(hwnd,ENDSHEET,buffer,4);
  891.          pm.end_sheet=atoi(buffer);
  892.          if(!sheet_numbers_ok(hwnd))
  893.          {
  894.           PostMessage(hwnd,WM_RECALCULATE,0,0);
  895.           break;
  896.          }
  897.          // VALIDATE NUMBER OF COPIES
  898.          GetDlgItemText(hwnd,NUMBEROFCOPIES,buffer,3);
  899.          pm.copies = atoi(buffer);
  900.          if(pm.copies<1 || pm.copies>99)
  901.           pm.copies = 1;
  902.          EndDialog(hwnd,TRUE);    // RETURN OK
  903.          break;
  904.         case ETSHELP:
  905.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,Printing_your_File);
  906.          return TRUE;
  907.       }
  908.       break;
  909.     }
  910.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  911. }
  912.  
  913. //===========================================================
  914. // CHECK TO SEE THAT THE SHEET NUMBERS TO PRINT ARE IN RANGE:
  915. // PLACES MESSAGE AND RETURNS FALSE IF ANY ERROR
  916. // CALLED BY: print_dialog()
  917. //===========================================================
  918. static    int    sheet_numbers_ok( HWND hwnd )
  919. {
  920.     int    j=0;
  921.     //----------------------------------------------------------
  922.     // CHECK TO SEE THAT HIS START AND/OR END SHEET ARE IN RANGE
  923.     //----------------------------------------------------------
  924.     if(pm.start_sheet<pm.min_sheet || pm.start_sheet>pm.max_sheet)
  925.      j++;
  926.     if(pm.end_sheet<pm.min_sheet   || pm.end_sheet>pm.max_sheet  )
  927.      j++;
  928.     if(pm.start_sheet>pm.end_sheet || pm.end_sheet<pm.start_sheet)
  929.      j++;
  930.     if(j)
  931.     {
  932.      MessageBox(hwnd,
  933.       "INCORRECT SHEET NUMBER(s) ENTERED.\r\n"
  934.       "PLEASE TRY AGAIN.","Error Entering Numbers",MB_ICONASTERISK);
  935.      return FALSE;
  936.     }
  937.     return TRUE;
  938. }
  939.  
  940. //=======================================================================
  941. // RUN THE ONE OR BOTH SIDES PRINT DIALOG
  942. //=======================================================================
  943. void    sides_one_both_dialog( HWND hwnd )
  944. {
  945.     lpfnSidesProc = MakeProcInstance((FARPROC)SidesProc,hInstance);
  946.     DialogBox(hInstance,"SidesProc",hwnd,(DLGPROC)lpfnSidesProc);
  947.     FreeProcInstance(lpfnSidesProc);
  948. }
  949.  
  950. //=========================================================================
  951. // PRINT ONE OR BOTH SIDES DIALOG:
  952. // - GET: ONE SIDE PRINTING
  953. //        BOTH SIDES PRINTING
  954. //        FRONT SIDES, THEN STOP
  955. //        BACK SIDES, THEN STOP
  956. //             DUPLEXING PRINTER
  957. //=========================================================================
  958. BOOL CALLBACK _export SidesProc(HWND hwnd,WORD Msg,WORD wParam,LONG lParam)
  959. {
  960.     switch( Msg )
  961.     {
  962.      case WM_INITDIALOG:
  963.       ms.dialog_cancelled=0;
  964.       save_config();
  965.       sprintf(buffer,"PRINTER: %s on %s",config.printer_device,config.printer_output);
  966.       SetDlgItemText(hwnd,PRINTERANDPORT,buffer);
  967.       if( config.both_sides==TRUE )
  968.         CheckDlgButton(hwnd,BOTHSIDES,1);
  969.       else
  970.         CheckDlgButton(hwnd,ONESIDE,1);
  971.       if( config.duplexing_printer==TRUE )
  972.         CheckDlgButton(hwnd,DUPLEXPRINTER,1);
  973.       switch( config.both_sides_method )
  974.       {
  975.         case 1:            // PRINT FRONTS ONLY, THEN STOP
  976.          CheckDlgButton(hwnd,FRONTSONLY,1);
  977.          break;
  978.         case 2:            // PRINT BACKS ONLY, THEN STOP
  979.          CheckDlgButton(hwnd,BACKSONLY,1);
  980.          break;
  981.         case 3:            // DUPLEXING PRINTER, BOTH SIDES AT ONCE
  982.          CheckDlgButton(hwnd,DUPLEXPRINTER,1);
  983.       }
  984.       return TRUE;        // TRUE = SET KEYBOARD FOCUS TO THIS WINDOW
  985.      //-------------------------------------------------------
  986.      // IF USING ETS-OWNERDRAW BUTTONS:
  987.      // YOU MUST INTERCEPT WM_DRAWITEM MESSAGES, & RETURN TRUE
  988.      //------------------------------------------------------
  989.      case WM_DRAWITEM:
  990.       //------------------------------------
  991.       // IF THE ITEM IS ONE OF OUR BUTTONS..
  992.       //------------------------------------
  993.       DrawDialogEtsButton((DRAWITEMSTRUCT *)lParam );
  994.       return TRUE;        // TRUE = I PROCESSED THIS MESSAGE
  995.      case WM_CLOSE:                // HE SELECTED CLOSE (ALT+F4) BUTTON
  996.       ms.dialog_cancelled = 1;
  997.       restore_config();
  998.       EndDialog(hwnd,TRUE);
  999.       return FALSE;
  1000.      case WM_COMMAND:
  1001.       switch( wParam )
  1002.       {
  1003.         // config.duplexing_printer    TRUE = YES
  1004.         // config.both_sides                TRUE = YES
  1005.         // config.both_sides_method    0=NORMAL, FRONTS, PAUSE, BACKS
  1006.         //                                        1=FRONTS, STOP
  1007.         //                                        2=BACKS,  STOP
  1008.         //                                        3=DUPLEXING, BOTH SIDES AT ONCE
  1009.         case ONESIDE:
  1010.          config.both_sides=FALSE;
  1011.          break;
  1012.         case BOTHSIDES:
  1013.          config.both_sides=TRUE;
  1014.          break;
  1015.         case FRONTSONLY:
  1016.          config.both_sides_method=1;
  1017.          break;
  1018.         case BACKSONLY:
  1019.          config.both_sides_method=2;
  1020.          break;
  1021.         case DUPLEXPRINTER:
  1022.          config.both_sides_method=3;
  1023.          config.duplexing_printer=TRUE;
  1024.          break;
  1025.         case ETSCANCEL:
  1026.          ms.dialog_cancelled = 1;        // SHOW HE WANTS TO ABORT
  1027.          restore_config();
  1028.          EndDialog(hwnd,TRUE);            // RETURN OK
  1029.          break;
  1030.         case ETSOK:
  1031.          // VALIDATES ONE SIDE, BOTH SIDES AND METHOD
  1032.          check_config();
  1033.          setup_pm_from_config();        // INSTALL THE NEW DATA INTO THE pm. STRUCTURE
  1034.          EndDialog(hwnd,TRUE);            // RETURN OK
  1035.          break;
  1036.         case ETSHELP:
  1037.          WinHelp(hwnd,MAINHELP,HELP_CONTEXT,Printing_Both_Sides);
  1038.          return TRUE;
  1039.       }
  1040.       break;
  1041.     }
  1042.     return FALSE;        // DEFAULT WINDOWS DIALOG HANDLER
  1043. }
  1044.