home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / anwend / qed453 / src / prn_out.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-12  |  5.6 KB  |  315 lines

  1. #include <gemx.h>
  2. #include <support.h>
  3. #include <time.h>
  4.  
  5. #include "global.h"
  6. #include "aktion.h"
  7. #include "block.h"
  8. #include "memory.h"
  9. #include "rsc.h"
  10. #include "wp-print.h"
  11. #include "printer.h"
  12.  
  13. /*
  14.  * aus prn_cfg.c
  15. */
  16. extern bool open_printer    (void);
  17. extern void close_printer    (void);
  18.  
  19. /*
  20.  * lokales 
  21. */
  22. static int    prn_y, line_height;
  23. static int    channel;
  24.  
  25. /* --------------------------------------------------------------------------- */
  26. static bool prn_ready (void)
  27. {
  28.     switch (channel)
  29.     {
  30.         case 0 :
  31.             return Cprnos() != 0;
  32.         case 1 :
  33.             return Cauxos() != 0;
  34.         default:
  35.             return FALSE;
  36.     }
  37. }
  38.  
  39. static bool prn_check (int wait_time)
  40. {
  41.     /* Schnittstelle nur bei !WDIALOG prüfen */
  42.     if (!prn->use_pdlg && prn->pruef_prn)
  43.     {
  44.         bool    ok = FALSE,
  45.                 cancel = FALSE;
  46.         long    timer;
  47.  
  48.         while (!ok && !cancel)
  49.         {
  50.             timer = 200 * wait_time + clock();
  51.             ok = prn_ready();
  52.             while (!ok && (timer > clock()))
  53.                 ok = prn_ready();
  54.             if (!ok)
  55.                  cancel = (note(1, 2, PRNOTRDY) == 2);
  56.         }
  57.         return (ok && !cancel);
  58.     }
  59.     else
  60.         return TRUE;
  61. }
  62.  
  63. static void plot_ff(void)
  64. {
  65.     if (prn->use_gdos)
  66.     {
  67.         prn_y = 0;
  68.         v_updwk(prn->handle);
  69.         v_clrwk(prn->handle);
  70.     }
  71.     else
  72.         wp_formfeed();
  73. }
  74.  
  75. static void plot_nl(void)
  76. {
  77.     if (prn->use_gdos)
  78.         prn_y += line_height;
  79.     else
  80.         wp_write_ln();
  81. }
  82.  
  83. static void plot_line(char *s)        /* Zeile mit Vorschub */
  84. {
  85.     int    l;
  86.     
  87.     if (prn->use_gdos)
  88.     {
  89.         v_gtext(prn->handle, 0, prn_y, s);
  90.         prn_y += line_height;
  91.     }
  92.     else
  93.     {
  94.         l = (int)strlen(s);
  95.         if (l > prn->wp_z_len)            /* Clipping */
  96.             s[prn->wp_z_len] = EOS;
  97.         wp_write_string(s);
  98.         wp_write_ln();
  99.     }
  100. }
  101.  
  102. /* --------------------------------------------------------------------------- */
  103. static void expand_line(char *buffer, char *line, bool tab, int tab_size)
  104. {
  105.     int    tabH;
  106.     char    *p;
  107.     
  108.     tabH = 0;
  109.     p = buffer + strlen(buffer);
  110.     while    (*line != '\0')
  111.     {
  112.         if (!tabH)
  113.             tabH = tab_size;
  114.         if (tab && *line == '\t')
  115.         {
  116.             while (tabH > 0)
  117.             {
  118.                 *p = ' ';
  119.                 p++;
  120.                 tabH--;
  121.             }
  122.             tabH = tab_size;
  123.         }
  124.         else
  125.         {
  126.             *p = *line;
  127.             p++;
  128.             tabH --;
  129.         }
  130.         line++;
  131.     }
  132.     *p = EOS;
  133. }
  134.  
  135. /* --------------------------------------------------------------------------- */
  136. static void drucken(char *name, RINGP t, TEXTP t_ptr)
  137. {
  138.     int        seite, lzeile, zeilen_pro_seite, update;
  139.     char        datum[11], *buffer = NULL, str[80];
  140.     long        zeile, buf_len;
  141.     ZEILEP    lauf;
  142.  
  143.     /* Schnittstelle ermitteln */
  144.     channel = ((Setprt(-1) & 16) != 0);
  145.  
  146.     if (prn->use_gdos)
  147.     {
  148.         int    p_xy[8], d, eff[3];
  149.  
  150.         if (!open_printer())
  151.             return;
  152.     
  153.         if (!prn_check(0))
  154.         {
  155.             close_printer();
  156.             return;
  157.         }
  158.     
  159.         vst_font(prn->handle, prn->font_id);
  160.         vst_point(prn->handle, prn->font_pts, &d, &d, &d, &d);
  161.     
  162.         vqt_fontinfo(prn->handle, &d, &d, p_xy, &d, eff);
  163.         line_height = p_xy[0] + p_xy[4] + 1;
  164.         vst_alignment(prn->handle, TA_LEFT , TA_ASCENT, &d, &d);
  165.     
  166.         if (vs_document_info(prn->handle, 0, "qed", 0))
  167.             vs_document_info(prn->handle, 1, name, 0);
  168.  
  169.         zeilen_pro_seite = prn->height/line_height;
  170.     }
  171.     else
  172.     {
  173.         if (!prn_check(0))
  174.             return;
  175.     
  176.         if (channel == 0)
  177.             strcpy(str, "PRN:");
  178.         else
  179.             strcpy(str, "AUX:");
  180.     
  181.         if (!wp_open(str))
  182.             return;
  183.     
  184.         wp_send_init(prn->wp_nlq);
  185.         wp_set_mode(prn->wp_mode);
  186.  
  187.         zeilen_pro_seite = prn->wp_s_len;
  188.     }
  189.     
  190.     get_datum(datum);
  191.     lzeile = zeilen_pro_seite;
  192.     seite = 1;
  193.     zeile = 0;
  194.     prn_y = 0;
  195.  
  196.     strcpy(str, rsc_string(PRINTSTR));
  197.     strcat(str, name);
  198.     start_aktion(str, TRUE, t->lines);
  199.     if (t->lines > 200)
  200.         update = 100;
  201.     else
  202.         update = 10;
  203.  
  204.     /* Puffer für eine komplette Zeile dynamisch anfordern */
  205.     if (t_ptr->max_line == NULL)        /* Projekt! */
  206.         buf_len = MAX_PATH_LEN + prn->rand_len;
  207.     else
  208.         buf_len = t_ptr->max_line->exp_len + prn->rand_len;
  209.     if (prn->num_zeilen)
  210.         buf_len += 6;                        /* für Zeilennummer */
  211.     buffer = malloc(buf_len);
  212.     
  213.     if (buffer == NULL)
  214.     {
  215.         note(1, 0, NOMEMORY);
  216.         return;
  217.     }
  218.     
  219.     graf_mouse(HOURGLASS, NULL);
  220.     lauf = FIRST(t);
  221.     while (TRUE)
  222.     {
  223.         if (!prn_check(5))
  224.             break;
  225.  
  226.         if (lzeile == zeilen_pro_seite)
  227.         {
  228.             lzeile = 0;
  229.             if (zeile != 0) 
  230.                 plot_ff();
  231.             if (prn->num_seiten)
  232.             {
  233.                 sprintf(str, "    %s%s    %s%d    %s%s", rsc_string(FILESTR), name,
  234.                                                                       rsc_string(PAGESTR), seite,
  235.                                                                       rsc_string(DATESTR), datum);
  236.                 plot_line(str);
  237.                 plot_nl();
  238.                 lzeile = 2;
  239.                 seite++;
  240.             }
  241.         }
  242.         
  243.         if ((zeile % update == 0) && !do_aktion("", zeile))
  244.         {
  245.             if (note(1, 2, BREAK) == 1) 
  246.                 break;
  247.             else
  248.                 redraw_aktion();
  249.         }
  250.  
  251.         zeile++;
  252.         lzeile++;
  253.  
  254.         /* Zeile aufbauen: Rand, Nummer, Text */
  255.         buffer[0] = EOS;
  256.         if (prn->rand_len > 0)
  257.         {
  258.             memset(buffer, 32, prn->rand_len);
  259.             buffer[prn->rand_len] = EOS;
  260.         }
  261.  
  262.         if (prn->num_zeilen)
  263.         {
  264.             sprintf(str, "%4ld  ", zeile);
  265.             strcat(buffer, str);
  266.         }
  267.         
  268.         expand_line(buffer, TEXT(lauf), t_ptr->loc_opt->tab, t_ptr->loc_opt->tabsize);
  269.         plot_line(buffer);
  270.  
  271.         NEXT(lauf);
  272.         if (IS_TAIL(lauf)) 
  273.             break;
  274.     }
  275.     if (prn->use_gdos)
  276.     {
  277.         v_updwk(prn->handle);
  278.         if (!prn->use_pdlg && prn->vorschub)
  279.             v_clrwk(prn->handle);
  280.         close_printer();
  281.     }
  282.     else
  283.     {
  284.         if (prn->wp_s_len && zeile && prn->vorschub)
  285.             plot_ff();
  286.         wp_send_exit();
  287.         wp_close();
  288.     }
  289.     end_aktion();
  290.  
  291.     free(buffer);
  292.     graf_mouse(ARROW, NULL);
  293. }
  294.  
  295. /* --------------------------------------------------------------------------- */
  296. void blk_drucken(char *name, TEXTP t_ptr)
  297. {
  298.     RING t;
  299.  
  300.     if (prn == NULL)
  301.         return;
  302.  
  303.     block_copy(t_ptr,&t);
  304.     drucken(name, &t, t_ptr);
  305.     kill_textring(&t);
  306. }
  307.  
  308. void txt_drucken(char *name, TEXTP t_ptr)
  309. {
  310.     if (prn == NULL)
  311.         return;
  312.  
  313.     drucken(name, &t_ptr->text, t_ptr);
  314. }
  315.