home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3.4.17 [SPARC, PA-RISC] / nextstep33_risc.iso / NextLibrary / TeX / tex / src / texview / TVPrint.m < prev    next >
Encoding:
Text File  |  1992-05-26  |  6.5 KB  |  311 lines

  1. /* Generated by Interface Builder */
  2.  
  3. #import "TVPrint.h"
  4. #import "FaxView.h"
  5. #import "stdio.h"
  6. #import "strings.h"
  7. #import "appkit/SavePanel.h"
  8.  
  9. FaxView *faxView ;
  10.  
  11. @implementation TVPrint
  12.  
  13. /******************************************************************************/
  14. struct printVals printVals = {
  15.    1270, 0, 1, 0, 0, 0, 1, ""
  16. } ;
  17. extern char realnameoffile[] ;
  18. extern FILE *dvifile, *search() ;
  19. extern char *configpath ;
  20. extern void mysystem(const char *s) ;
  21. extern void configure() ;
  22. extern void error() ;
  23. extern void qstatus() ;
  24.  
  25. - setUpRealPanel
  26. {
  27.    static int inited = 0 ;
  28.  
  29.    if (inited == 0) {
  30.       realPanel = [TVPPanel new] ;
  31.       [realPanel setAccessoryView:[self setContentView:nil]] ;
  32.       configure() ;
  33.       pi = [NXApp printInfo] ;
  34.       [self loadPanel] ;
  35.       inited = 1 ;
  36.    }
  37.    return self ;
  38. }
  39.  
  40. - makeKeyAndOrderFront:anObject;
  41. {
  42.    if (dvifile == NULL) {
  43.       error("no file in window") ;
  44.       return self ;
  45.    }
  46.    [self setUpRealPanel] ;
  47.    [self callDvips:[realPanel runModal]] ;
  48.    [realPanel orderOut:anObject] ;
  49.    return self ;
  50. }
  51.  
  52. - setReversed:anObject
  53. {
  54.     Reversed = anObject;
  55.     return self;
  56. }
  57.  
  58. - setSynch:anObject
  59. {
  60.    Synch = anObject;
  61.    return self ;
  62. }
  63.  
  64. - setOptions:anObject
  65. {
  66.     Options = anObject;
  67.     return self;
  68. }
  69.  
  70. - setCustomDPI:anObject
  71. {
  72.     CustomDPI = anObject;
  73.     return self;
  74. }
  75.  
  76. - setCollated:anObject
  77. {
  78.     Collated = anObject;
  79.     return self;
  80. }
  81.  
  82. - setCompressed:anObject
  83. {
  84.     Compressed = anObject;
  85.     return self;
  86. }
  87.  
  88. static const char *numberp(const char *s, int *p)
  89. {
  90.    int negative = 0 ;
  91.    int val = 0 ;
  92.  
  93.    while (*s && *s <= ' ')
  94.       s++ ;
  95.    if (*s == '-') {
  96.       negative = 1 ;
  97.       s++ ;
  98.    }
  99.    while ('0' <= *s && *s <= '9')
  100.       val = val * 10 + (*s++ - '0') ;
  101.    while (*s && *s <= ' ')
  102.       s++ ;
  103.    *p = val ;
  104.    if (*s)
  105.       return s ;
  106.    else
  107.       return 0 ;
  108. }
  109.  
  110. /*
  111. static const char *pagep(const char *s, int *p, int *seq)
  112. {
  113.    const char *pp = numberp(s, p) ;
  114.  
  115.    if (pp == 0) {
  116.       *seq = -1 ;
  117.       return pp ;
  118.    }
  119.    if (*pp != '.')
  120.       return pp ;
  121.    return numberp(pp+1, seq) ;
  122. }
  123.  */
  124.  
  125. - SetCustomdpi:sender
  126. {
  127.     printVals.customchosen = [sender state] ;
  128.     if (numberp([CustomDPI stringValue], &printVals.customdpi) == 0)
  129.        ;
  130.     else
  131.        [CustomDPI selectText:sender] ;
  132.     return self;
  133. }
  134.  
  135. - SetOptions:sender
  136. {
  137.     strcpy(printVals.options, [Options stringValue]) ;
  138.     return self;
  139. }
  140.  
  141. - SetCompressed:sender
  142. {
  143.     printVals.compressed = [sender state] ;
  144.     return self;
  145. }
  146.  
  147. - SetCustomResolution:sender
  148. {
  149.     if (numberp([CustomDPI stringValue], &printVals.customdpi) == 0)
  150.        ;
  151.     else
  152.        [CustomDPI selectText:sender] ;
  153.     return self;
  154. }
  155.  
  156. - SetReversed:sender
  157. {
  158.     printVals.reversed = [sender state] ;
  159.     return self;
  160. }
  161.  
  162. - SetSync:sender
  163. {
  164.     printVals.sync = [sender state] ;
  165.     return self;
  166. }
  167.  
  168. - SetCollated:sender
  169. {
  170.     printVals.collated = [sender state] ;
  171.     return self;
  172. }
  173.  
  174. - SetResolution:sender
  175. {
  176.     return self;
  177. }
  178.  
  179. const char *faxname ;
  180.  
  181. - callDvips:(int)tofile;
  182. {
  183. #define EOSB (sysbuffer+strlen(sysbuffer))
  184.    char sysbuffer[1024] ;
  185.    int resolution = 0 ;
  186.    const char *p ;
  187.    char tempname[40] ;
  188.    extern char *mktemp() ;
  189.    extern void unlink() ;
  190.  
  191. /*  We get these two values to be sure they are up to date */
  192.    strcpy(printVals.options, [Options stringValue]) ;
  193.    (void)numberp([CustomDPI stringValue], &printVals.customdpi) ;
  194.    if (tofile == NX_CANCELTAG || tofile == NX_PREVIEWTAG)
  195.       return self ;
  196.    if (realnameoffile[0] == 0)
  197.       return self ;
  198.    strcpy(sysbuffer, "dvips") ;
  199.    if ([pi copies] > 1) {
  200.       if (printVals.collated)
  201.          strcat(sysbuffer, " -C ") ;
  202.       else
  203.          strcat(sysbuffer, " -c ") ;
  204.       sprintf(EOSB, "%d", [pi copies]) ;
  205.    }
  206.    if (! [pi isAllPages]) {
  207.       if ([pi firstPage] > -2000000000) {
  208.          strcat(sysbuffer, " -p ") ;
  209.          sprintf(EOSB, "%d", [pi firstPage]) ;
  210.       }
  211.       if ([pi lastPage] < 2000000000) {
  212.          strcat(sysbuffer, " -l ") ;
  213.          sprintf(EOSB, "%d", [pi lastPage]) ;
  214.       }
  215.    }
  216.    if (p = [pi valueForJobFeature:"Resolution"])
  217.       if (sscanf(p, "%d", &resolution) != 1)
  218.          resolution = 0 ;
  219.    if (resolution == 0) {
  220.       if (p = [[pi printer] stringForKey:"DefaultResolution" inTable:"PPD"])
  221.          if (sscanf(p, "%d", &resolution) != 1)
  222.             resolution = 0 ;
  223.    }
  224.    if (printVals.customchosen || resolution) {
  225.       strcat(sysbuffer, " -D ") ;
  226.       sprintf(EOSB, "%d",
  227.          printVals.customchosen ? printVals.customdpi : resolution) ;
  228.    }
  229.    if (printVals.reversed)
  230.       strcat(sysbuffer, " -r") ;
  231.    else
  232.       strcat(sysbuffer, " -r0") ;
  233.    p = [pi paperFeed] ;
  234.    if (p && strcmp(p, "NXManual") == 0)
  235.       strcat(sysbuffer, " -m") ;
  236.    if (printVals.compressed)
  237.       strcat(sysbuffer, " -Z") ;
  238.    else
  239.       strcat(sysbuffer, " -Z0") ;
  240.    if (tofile == NX_SAVETAG) {
  241. /* this is a kludge; anyone got a better way? */
  242.       strcat(sysbuffer, " -o \"") ;
  243.       strcat(sysbuffer, [[SavePanel new] filename]) ;
  244.       strcat(sysbuffer, "\"") ;
  245.    } else if (tofile == NX_OKTAG) {
  246.       p = [[pi printer] name] ;
  247.       if (p) {
  248.          FILE *f ;
  249.          char configname[200] ;
  250.  
  251.          sprintf(configname, "config.%s", p) ;
  252.          if (f=search(configpath, configname)) {
  253.             fclose(f) ;
  254.             strcat(sysbuffer, " -P ") ;
  255.             strcat(sysbuffer, p) ;
  256.          }
  257.          strcat(sysbuffer, " -o \"\\!lpr -P ") ;
  258.          strcat(sysbuffer, p) ;
  259.          strcat(sysbuffer, "\"") ;
  260.       } else
  261.          strcat(sysbuffer, " -o \\!lpr") ;
  262.    } else if (tofile == NX_FAXTAG) {
  263.       strcat(sysbuffer, " -P fax") ;
  264.       strcpy(tempname, "TeXFAX.XXXXXX") ;
  265.       p = mktemp(tempname) ;
  266.       strcat(sysbuffer, " -o "); 
  267.       strcat(sysbuffer, p) ;
  268.       faxname = p ;
  269.    }
  270.    if (printVals.options[0]) {
  271.       strcat(sysbuffer, " ") ;
  272.       strcat(sysbuffer, printVals.options) ;
  273.    }
  274.    strcat(sysbuffer, " \"") ;
  275.    strcat(sysbuffer, realnameoffile) ;
  276.    strcat(sysbuffer, "\"") ;
  277.    if (printVals.sync == 0)
  278.       strcat(sysbuffer, " &") ;
  279.    qstatus(sysbuffer) ;
  280.    mysystem(sysbuffer) ;
  281.    if (tofile == NX_FAXTAG) {
  282.       if (faxView == 0)
  283.          faxView = [FaxView new] ;
  284.       [faxView faxPSCode:self] ;
  285.       unlink(faxname) ;
  286.    }
  287.    return self ;
  288. }
  289.  
  290. - loadPanel
  291. {
  292.    [CustomDPI setIntValue:printVals.customdpi] ;
  293.    [Collated setState:printVals.collated] ;
  294.    [Reversed setState:printVals.reversed] ;
  295.    [Compressed setState:printVals.compressed] ;
  296.    [Synch setState:printVals.sync] ;
  297.    [Options setStringValue:printVals.options] ;
  298.    return self ;
  299. }
  300.  
  301. @end
  302.  
  303. @implementation TVPPanel
  304.  
  305. + new
  306. {
  307.    return [super new] ;
  308. }
  309.  
  310. @end
  311.