home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3.4.17 [SPARC, PA-RISC] / nextstep33_risc.iso / NextLibrary / TeX / tex / src / texview / PageView.m < prev    next >
Encoding:
Text File  |  1992-07-15  |  19.7 KB  |  941 lines

  1. /* Generated by Interface Builder */
  2.  
  3. #import "PageView.h"
  4. #import "SheetView.h"
  5. #import "appkit/Scroller.h"
  6. #import "TeXviewObject.h"
  7. #import "TVWindow.h"
  8. #import <dpsclient/wraps.h>
  9. #import "dviAccessors.h"
  10. #import <strings.h>
  11. #import <appkit/Application.h>
  12. #import "ComScroll.h"
  13. #import <appkit/TextField.h>
  14. #import <mach/mach.h>
  15.  
  16. extern real screendpi ;
  17. extern int paranoia ;
  18. extern PageView *myPageView ;
  19. extern Window *tvWindow ;
  20. extern SheetView *myView ;
  21. extern TeXviewObject *myTeXviewObject ;
  22. extern shalfword rvvsize, rhhsize ;
  23. extern Boolean mocked ;
  24. extern NXRect *initsizewindow() ;
  25. extern initWasOnScreen() ;
  26. extern void error() ;
  27.  
  28. extern void reportname() ;
  29. extern void recalculate() ;
  30. extern void PSflush(), TPSinit() ;
  31. extern void makenewdoc() ;
  32.  
  33. const char *legit_types[] = { "dvi", "tex", "latex", "ltx", NULL } ;
  34.  
  35. @implementation PageView
  36.  
  37. + newFrame:(const NXRect *)theFrame
  38. {
  39.     NXRect tempRect ;
  40.  
  41.     self = [super newFrame:theFrame];
  42.     [self setHorizScrollerRequired:YES];
  43.     [self setVertScrollerRequired:YES];
  44. /*  [self setDynamicScrolling:YES];
  45.     [self setBackgroundGray:0.433];
  46.     [self setAutoresizeSubviews:YES];
  47.     [self setBorderType:NX_NOBORDER]; */
  48.     myPageView = self ;
  49.     myOpenPanel = nil ;
  50.     NX_X(&tempRect) = 0 ;
  51.     NX_Y(&tempRect) = 0 ;
  52.     NX_WIDTH(&tempRect) = 1036 ;
  53.     NX_HEIGHT(&tempRect) = 1336 ;
  54.     myView = [SheetView newFrame:&tempRect] ;
  55.     [self setDocView:myView] ;
  56.     reportname(NOFILETITLE) ;
  57.     [[self window] setExcludedFromWindowsMenu:YES] ;
  58.     TPSinit() ;
  59.     recalculate() ;
  60.     return self;
  61. }
  62.  
  63. - drawSelf:(NXRect *)rects :(int)rectCount
  64. {
  65.    [super drawSelf:rects:rectCount] ;
  66.    return self ;
  67. }
  68.  
  69. - setPageNum:anObject
  70. {
  71.    pageNum = anObject ;
  72.    return self;
  73. }
  74.  
  75. - setConsole:anObject
  76. {
  77.    NXRect *tr ;
  78.  
  79.    console = anObject ;
  80.    [[console window] setExcludedFromWindowsMenu:YES] ;
  81.    if (tr=initsizewindow(1)) {
  82.       [[(ComScroll *)console window] placeWindow:tr] ;
  83.       if (initWasOnScreen()) {
  84.          [[console window] orderFront:self] ;
  85.       } else {
  86.          [[console window] orderOut:self] ;
  87.       }
  88.    }
  89.    return self;
  90. }
  91.  
  92. - getConsole
  93. {
  94.    return console ;
  95. }
  96.  
  97. - setTex:anObject
  98. {
  99.    NXRect *tr ;
  100.  
  101.    tex = anObject ;
  102.    [[tex window] setExcludedFromWindowsMenu:YES] ;
  103.    if (tr=initsizewindow(2)) {
  104.       [[(ComScroll *)tex window] placeWindow:tr] ;
  105.       if (initWasOnScreen()) {
  106.          [[tex window] orderFront:self] ;
  107.       } else {
  108.          [[tex window] orderOut:self] ;
  109.       }
  110.    }
  111.    return self;
  112. }
  113.  
  114. - getTeX
  115. {
  116.    return tex ;
  117. }
  118.  
  119. - setCommand:anObject
  120. {
  121.    NXRect *tr ;
  122.  
  123.    command = anObject ;
  124.    [command setExcludedFromWindowsMenu:YES] ;
  125.    [command removeFromEventMask:(NX_KEYDOWNMASK | NX_KEYUPMASK)] ;
  126.    if (tr=initsizewindow(3)) {
  127.       [command moveTo:tr->origin.x:tr->origin.y] ;
  128.       if (initWasOnScreen()) {
  129.          [command orderFront:self] ;
  130.       } else {
  131.          [command orderOut:self] ;
  132.       }
  133.    }
  134.    return self;
  135. }
  136.  
  137. - getCommand
  138. {
  139.    return command ;
  140. }
  141.  
  142. - setPageStuff:anObject
  143. {
  144.    pageStuff = anObject ;
  145.    pageStuff = [pageStuff setContentView:nil] ;
  146.    [self addSubview:pageStuff] ;
  147.    [self tile] ;
  148.    return self ;
  149. }
  150.  
  151. - getPageStuff;
  152. {
  153.    return pageStuff ;
  154. }
  155.  
  156. - tile
  157. {
  158.    NXRect r1, r2 ;
  159.    Scroller *h ;
  160.  
  161.    [super tile] ;
  162.    if (pageStuff == 0)
  163.       return self ;
  164.    h = [self horizScroller] ;
  165.    [h getFrame:&r2] ;
  166.    [pageStuff getFrame:&r1] ;
  167.    r2.size.width -= r1.size.width ;
  168.    r1.origin.x = r2.size.width + r2.origin.x ;
  169.    r1.origin.y = r2.origin.y ;
  170.    [h setFrame:&r2] ;
  171.    [pageStuff setFrame:&r1] ;
  172.    return self ;
  173. }
  174.  
  175. - lastPage:sender
  176. {
  177.     dviLastPage() ;
  178.     return self;
  179. }
  180.  
  181. - openPanel
  182.   if (!myOpenPanel) myOpenPanel = [OpenPanel new];
  183.   return (myOpenPanel);
  184. }
  185.  
  186. - update
  187. {
  188.    if ([self needsDisplay])
  189.       [self display] ;
  190.    return self ;
  191. }
  192.  
  193. - openFile:sender
  194. {
  195.     if ([[self openPanel] runModalForTypes:legit_types]) 
  196.     dviOpenFile((char *)[[self openPanel] filename]) ;
  197.     return self;
  198. }
  199.  
  200. - reOpenFile:sender
  201. {
  202.     dviReOpenFile() ;
  203.     return self;
  204. }
  205.  
  206. - nextPage:sender
  207. {
  208.     dviNextPage() ;
  209.     return self;
  210. }
  211.  
  212. - firstPage:sender
  213. {
  214.     dviFirstPage() ;
  215.     return self;
  216. }
  217.  
  218. - zoomUnzoom:sender
  219. {
  220.    dviZoomUnzoom() ;
  221.    return self;
  222. }
  223.  
  224. - mockUnmock:sender
  225. {
  226.    dviMock(-1) ;
  227.    return self;
  228. }
  229.  
  230. - mock:sender
  231. {
  232.    dviMock(1) ;
  233.    return self ;
  234. }
  235.  
  236. - unMock:sender
  237. {
  238.    dviMock(0) ;
  239.    return self ;
  240. }
  241.  
  242. - setMockSwitch:anObject
  243. {
  244.    mockSwitch = anObject ;
  245.    [self upMock] ;
  246.    return self ;
  247. }
  248.  
  249. void upmock(void) {
  250.    [myPageView upMock] ;
  251. }
  252.  
  253. - upMock {
  254.    [mockSwitch setState:mocked] ;
  255.    return self ;
  256. }
  257.  
  258. - unzoom:sender
  259. {
  260.     [myTeXviewObject unzoom] ;
  261.     dviUnzoom() ;
  262.     return self;
  263. }
  264.  
  265. - prevPage:sender
  266. {
  267.     dviPrevPage() ;
  268.     return self;
  269. }
  270.  
  271. - zoom:sender
  272. {
  273.     [myTeXviewObject zoom] ;
  274.     dviZoom() ;
  275.     return self;
  276. }
  277.  
  278. - closeFile:sender
  279. {
  280.     dviCloseFile() ;
  281.     return self;
  282. }
  283.  
  284. - gotoPage:sender
  285. {
  286.     dviGotoPage((char *)[sender stringValueAt:0]) ;
  287.     return self;
  288. }
  289.  
  290. void getpagenum(s)
  291. char *s ;
  292. {
  293.    [myPageView getpagenum:s] ;
  294. }
  295.  
  296. - getpagenum:(char *)s
  297. {
  298.    strcpy(s, [pageNum stringValue]) ;
  299.    return self ;
  300. }
  301.  
  302.  
  303. - fireRandom:sender
  304. {
  305.     [myTeXviewObject firePage] ;
  306.     return self ;
  307. }
  308.  
  309. void pagereport(pagenum, seq)
  310. integer pagenum, seq ;
  311. {
  312.    char str[30] ;
  313.  
  314.    if (seq == 0)
  315.       sprintf(str, "%ld", pagenum) ;
  316.    else
  317.       sprintf(str, "%ld.%ld", pagenum, seq) ;
  318.    [myTeXviewObject setPageNum:str] ;
  319.    PSflush() ;
  320. }
  321.  
  322. char realnameoffile[255] ;
  323.  
  324. void reportname(s)
  325. char *s ;
  326. {
  327.    static char *oldname ;
  328.  
  329.    if (s) {
  330.       oldname = s ;
  331.       if (*s != '*' || s[1] != ' ')
  332.          strcpy(realnameoffile, s) ;
  333.       else
  334.          realnameoffile[0] = 0 ;
  335.    } else
  336.       realnameoffile[0] = 0 ;
  337.    [[myPageView window] setTitleAsFilename:oldname] ;
  338. }
  339.  
  340. - changeDPI:(id)sender
  341. {
  342.    [myTeXviewObject popIt:sender] ;
  343.    return self ;
  344. }
  345.  
  346. #define MILLION 1000000
  347.  
  348. static int lastxsize = MILLION, lastysize = MILLION ;
  349.  
  350. - noScrollUpdates
  351. {
  352.    [myPageView setDisplayOnScroll:NO] ;
  353.    [myPageView setCopyOnScroll:NO] ;
  354.    return self ;
  355. }
  356.  
  357. - scrollUpdates
  358. {
  359.    [myPageView setDisplayOnScroll:YES] ;
  360.    [myPageView setCopyOnScroll:YES] ;
  361.    return self ;
  362. }
  363.  
  364. - cachePosition:(int)x:(int)y
  365. {
  366.    NXSize s ;
  367.  
  368.    [self getContentSize:&s] ;
  369.    if (s.width + 16 > lastxsize)
  370.       xcache = 0.5 ;
  371.    else
  372.       xcache = [[self horizScroller] floatValue] ;
  373.    if (s.height + 16 > lastysize)
  374.       ycache = 0.5 ;
  375.    else
  376.       ycache = [[self vertScroller] floatValue] ;
  377.    if (lastxsize == MILLION) { /* cheat these values in */
  378.       xcache = 0.5 ;
  379.       ycache = 0.0 ;
  380.    }
  381.    return self ;
  382. }
  383.  
  384. static float scroller_to_pos(float x1, float x2, float s) {
  385.    if (x2 < x1)
  386.       return s * (x1 - x2) ;
  387.    else
  388.       return 0 ;
  389. }
  390.  
  391. - unCachePosition:(int)x:(int)y
  392. {
  393.    NXSize size ;
  394.    NXPoint t ;
  395.  
  396.    [self getContentSize:&size] ;
  397.    t.x = scroller_to_pos((float)x, size.width, xcache) ;
  398.    t.y = scroller_to_pos((float)y, size.height, 1.0-ycache) ;
  399.    [myView scrollPoint:&t] ;
  400.    lastxsize = x ;
  401.    lastysize = y ;
  402.    return self ;
  403. }
  404.  
  405. /* moves down about a screenful. */
  406.  
  407. - (int)moveDown:(int)shiftstate;
  408. {
  409.    NXSize s ;
  410.    NXPoint t ;
  411.    float ypos = [[self vertScroller] floatValue] ;
  412.    float xpos = [[self horizScroller] floatValue] ;
  413.    float f ;
  414.  
  415.    shiftstate = 1 << (2 * shiftstate) ;
  416.    [self getContentSize:&s] ;
  417.    if (ypos > 0.95 || s.height + 16 >= rvvsize)
  418.       return 0 ;
  419.    if (2 * s.height < rvvsize)
  420.       f = s.height / (rvvsize - s.height) - 0.02 ;
  421.    else
  422.       f = 1.0 ;
  423.    if (f < 0.02)
  424.       f = 0.02 ;
  425.    f /= shiftstate ;
  426.    ypos += f ;
  427.    if (ypos > 1.0)
  428.       ypos = 1.0 ;
  429.    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ;
  430.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  431.    [myView scrollPoint:&t] ;
  432.    return 1 ;
  433. }
  434.  
  435. /* moves up about a screenful. */
  436.  
  437. - (int)moveUp:(int)shiftstate;
  438. {
  439.    NXSize s ;
  440.    NXPoint t ;
  441.    float ypos = [[self vertScroller] floatValue] ;
  442.    float xpos = [[self horizScroller] floatValue] ;
  443.    float f ;
  444.  
  445.    shiftstate = 1 << (2 * shiftstate) ;
  446.    [self getContentSize:&s] ;
  447.    if (ypos < 0.05 || s.height + 16 >= rvvsize)
  448.       return 0 ;
  449.    if (2 * s.height < rvvsize)
  450.       f = s.height / (rvvsize - s.height) - 0.02 ;
  451.    else
  452.       f = 1.0 ;
  453.    if (f < 0.02)
  454.       f = 0.02 ;
  455.    f /= shiftstate ;
  456.    ypos -= f ;
  457.    if (ypos < 0.0)
  458.       ypos = 0.0 ;
  459.    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ;
  460.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  461.    [myView scrollPoint:&t] ;
  462.    return 1 ;
  463. }
  464.  
  465. - (int)moveRight:(int)shiftstate
  466. {
  467.    NXSize s ;
  468.    NXPoint t ;
  469.    float ypos = [[self vertScroller] floatValue] ;
  470.    float xpos = [[self horizScroller] floatValue] ;
  471.    float f ;
  472.  
  473.    shiftstate = 1 << (2 * shiftstate) ;
  474.    [self getContentSize:&s] ;
  475.    if (s.width + 16 >= rhhsize)
  476.       return 0 ;
  477.    if (2 * s.width < rhhsize)
  478.       f = s.width / (rhhsize - s.width) - 0.02 ;
  479.    else
  480.       f = 1.0 ;
  481.    if (f < 0.02)
  482.       f = 0.02 ;
  483.    f /= shiftstate ;
  484.    xpos += f ;
  485.    if (xpos > 1.0)
  486.       xpos = 1.0 ;
  487.    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ;
  488.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  489.    [myView scrollPoint:&t] ;
  490.    return 1 ;
  491. }
  492.  
  493. - (int)moveLeft:(int)shiftstate
  494. {
  495.    NXSize s ;
  496.    NXPoint t ;
  497.    float ypos = [[self vertScroller] floatValue] ;
  498.    float xpos = [[self horizScroller] floatValue] ;
  499.    float f ;
  500.  
  501.    shiftstate = 1 << (2 * shiftstate) ;
  502.    [self getContentSize:&s] ;
  503.    if (s.width + 16 >= rhhsize)
  504.       return 0 ;
  505.    if (2 * s.width < rhhsize)
  506.       f = s.width / (rhhsize - s.width) - 0.02 ;
  507.    else
  508.       f = 1.0 ;
  509.    if (f < 0.02)
  510.       f = 0.02 ;
  511.    f /= shiftstate ;
  512.    xpos -= f ;
  513.    if (xpos < 0.0)
  514.       xpos = 0.0 ;
  515.    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ;
  516.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  517.    [myView scrollPoint:&t] ;
  518.    return 1 ;
  519. }
  520.  
  521. - Bot:(int)quiet;
  522. {
  523.    NXSize s ;
  524.    NXPoint t ;
  525.    float xpos = [[self horizScroller] floatValue] ;
  526.  
  527.    if (quiet)
  528.       [self noScrollUpdates] ;
  529.    [self getContentSize:&s] ;
  530.    t.y = scroller_to_pos((float)rvvsize, s.height, 0.0) ;
  531.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  532.    [myView scrollPoint:&t] ;
  533.    if (quiet)
  534.       [self scrollUpdates] ;
  535.    return self ;
  536. }
  537.  
  538. - Top:(int)quiet;
  539. {
  540.    NXSize s ;
  541.    NXPoint t ;
  542.    float xpos = [[self horizScroller] floatValue] ;
  543.  
  544.    if (quiet)
  545.       [self noScrollUpdates] ;
  546.    [self getContentSize:&s] ;
  547.    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0) ;
  548.    t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ;
  549.    [myView scrollPoint:&t] ;
  550.    if (quiet)
  551.       [self scrollUpdates] ;
  552.    return self ;
  553. }
  554.  
  555. void bringupwindow(void) {
  556.    NXRect *tr ;
  557.  
  558.    if (tr = initsizewindow(0))
  559.       [[myPageView window] placeWindow:tr] ;
  560.    tvWindow = [myPageView window] ;
  561.    [[myPageView window] makeKeyAndOrderFront:0] ;
  562. }
  563.  
  564. - setPositionText:anObject
  565. {
  566.    positionText = anObject ;
  567.    return self ;
  568. }
  569.  
  570. - setPositionRadio:anObject
  571. {
  572.    positionRadio = anObject ;
  573.    return self ;
  574. }
  575.  
  576. static float units[] = { 1.0, 2.54, 72.27, 72.0, 84.725 } ;
  577. static int curunits = 0 ;
  578. static NXPoint posevent = {0.0, 0.0}, prevposevent = {0.0, 0.0} ;
  579. static char *unitnames[] = { "inches", "centimeters", "points",
  580.     "PostScript units", "pico-light-seconds", 0 } ;
  581. - changeUnits:sender
  582. {
  583.    curunits = (curunits + 1) ;
  584.    if (unitnames[curunits] == 0)
  585.       curunits = 0 ;
  586.    [self updatePosition] ;
  587.    return self ;
  588. }
  589.  
  590. - updatePosition
  591. {
  592.    NXPoint pagepos ;
  593.    NXPoint deltapos ;
  594.    char tempbuf[300] ;
  595.  
  596.    if (positionText && screendpi > 1.0) {
  597.       pagepos = posevent ;
  598.       deltapos = prevposevent ;
  599.       pagepos.x *= units[curunits] / screendpi ;
  600.       pagepos.y *= units[curunits] / screendpi ;
  601.       deltapos.x *= units[curunits] / screendpi ;
  602.       deltapos.y *= units[curunits] / screendpi ;
  603.       sprintf(tempbuf,
  604.               "Click at (%.3g,%.3g) is (%.3g,%.3g) from previous click in %s.",
  605.        pagepos.x, pagepos.y, pagepos.x - deltapos.x, pagepos.y - deltapos.y,
  606.        unitnames[curunits]) ;
  607.       [(TextField *)positionText setStringValue:tempbuf] ;
  608.    }
  609.    return self ;
  610. }
  611.  
  612. - reportPosition:(NXEvent *)event
  613. {
  614.    if (myView && positionText && screendpi > 1.0) {
  615.       prevposevent = posevent ;
  616.       posevent = (event->location) ;
  617.       posevent.x -= 8.0 ;
  618.       posevent.y -= 8.0 ;
  619.       [myView convertPoint:&posevent fromView:nil] ;
  620.       [self updatePosition] ;
  621.    }
  622.    return self ;
  623. }
  624.  
  625. - mouseDown: (NXEvent *) ptr
  626. {
  627.     NXPoint     newLoc, oldLoc;
  628.     NXEvent     *nextEvent;
  629.     int         oldMask;
  630.     NXRect      myRect;
  631.     int numdrags = 0 ;
  632.  
  633.     oldMask =
  634.         [window addToEventMask:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
  635.     [self lockFocus];
  636.  
  637.     oldLoc = ptr->location;
  638.     [self convertPoint:&oldLoc fromView:nil];
  639.  
  640.     nextEvent =
  641.         [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
  642.     while (nextEvent->type == NX_LMOUSEDRAGGED){
  643.         numdrags++ ;
  644.         newLoc = nextEvent->location;
  645.         [self convertPoint:&newLoc fromView:nil];
  646.         [myView getVisibleRect:&myRect];
  647.         myRect.origin.x -= newLoc.x - oldLoc.x;
  648.         myRect.origin.y += newLoc.y - oldLoc.y;
  649.         [myView scrollRectToVisible: &myRect];
  650.         oldLoc = newLoc;
  651.         nextEvent =
  652.             [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
  653.     }
  654.     [self unlockFocus];
  655.     [window setEventMask:oldMask];
  656.     if (numdrags == 0)
  657.        [self reportPosition:nextEvent] ;
  658.     return self;
  659. }
  660.  
  661. void writeconsole(const char *s) {
  662.    static char wcbuf[1024] ;
  663.    strcpy(wcbuf, s) ;
  664.    strcat(wcbuf, "\n") ;
  665.    [((ComScroll *)[myPageView getConsole]) addText:wcbuf] ;
  666. }
  667.  
  668. void mysystem(const char *s) {
  669.    if (paranoia)
  670.       system(s) ;
  671.    else
  672.       [((ComScroll *)[myPageView getConsole]) logCommand:s inBack:0] ;
  673. }
  674.  
  675. void consoletofront() {
  676.    [[((ComScroll *)[myPageView getConsole]) window] makeKeyAndOrderFront:0] ;
  677. }
  678.  
  679. void textofront() {
  680.    [[((ComScroll *)[myPageView getTeX]) window] makeKeyAndOrderFront:0] ;
  681. }
  682.  
  683. void commandup() {
  684.    [[myPageView getCommand] orderFront:0] ;
  685. }
  686.  
  687. void previewtofront() {
  688.    [[myPageView window] makeKeyAndOrderFront:0] ;
  689. }
  690.  
  691. void myasyncsystem(const char *s) {
  692.    textofront() ;
  693.    [((ComScroll *)[myPageView getTeX]) logCommand:s inBack:1] ;
  694. }
  695.  
  696. extern void reTeXit() ;
  697.  
  698. - TeXtexit:sender {
  699.    reTeXit("tex -v \"%s\"") ;
  700.    return self ;
  701. }
  702. - TeXlatexit:sender {
  703.    reTeXit("latex -v \"%s\"") ;
  704.    return self ;
  705. }
  706. - TeXslitexit:sender {
  707.    reTeXit("slitex -v \"%s\"") ;
  708.    return self ;
  709. }
  710. - TeXbibtexit:sender {
  711.    reTeXit("bibtex \"%s\"") ;
  712.    return self ;
  713. }
  714. - TeXamstexit:sender {
  715.    reTeXit("amstex -v \"%s\"") ;
  716.    return self ;
  717. }
  718. - openManual:sender {
  719.    dviOpenFile("/usr/tex/ntman.dvi") ;
  720.    return self ;
  721. }
  722. - TeXcustomexit:sender {
  723.    reTeXit("%C -v \"%s\"") ;
  724.    return self ;
  725. }
  726. - TeXdefaultexit:sender {
  727.    reTeXit("%L -v \"%s\"") ;
  728.    return self ;
  729. }
  730. - TeXmakeit:sender {
  731.    reTeXit("make \"%s.dvi\"") ;
  732.    return self ;
  733. }
  734. - clearBuffer:sender {
  735.    ComScroll *c = 0 ;
  736.  
  737.    if (console && [[(ComScroll *)console window] isKeyWindow])
  738.       c = console ;
  739.    else if (tex && [[(ComScroll *)tex window] isKeyWindow])
  740.       c = tex ;
  741.    if (c)
  742.       [c clear] ;
  743.    return self ;
  744. }
  745.  
  746. - appDidBecomeActive:(id)sender;
  747. {
  748. /* [tvWindow makeKeyAndOrderFront:self] ; */
  749.    return self ;
  750. }
  751.  
  752. - servercalled
  753. {
  754.    return self ;
  755. }
  756.  
  757. /*
  758.  *   What we do here is we try to find data of type NXFilenamePboardType,
  759.  *   and then open it up.
  760.  */
  761. - serverOpen:(id)pb userData:(const char *)userData error:(char **)msg {
  762.    char *data ;
  763.    int len ;
  764.    char *const *s ;
  765.    char *const *types = [pb types] ;
  766.  
  767.    [self servercalled] ;
  768.    for (s=types; *s; s++)
  769.       if (*s == NXFilenamePboardType)
  770.          break ;
  771.    dviSaveFormat(userData) ;
  772.    if (*s && [pb readType:NXFilenamePboardType data:&data length:&len]) {
  773.       dviOpenFile(data) ;
  774.       vm_deallocate(task_self(), (vm_address_t)data, len) ;
  775.    }
  776.    return self ;
  777. }
  778.  
  779. /*
  780.  *   The rest actually ignore the filename, since the user may be editing
  781.  *   an auxilliary file.
  782.  */
  783. - serverReopen:(id)pb userData:(const char *)userData error:(char **)msg {
  784.    [self servercalled] ;
  785.    [self reOpenFile:self] ;
  786.    return self ;
  787. }
  788.  
  789. - serverCommand:(id)pb userData:(const char *)userData error:(char **)msg {
  790.    [self servercalled] ;
  791.    reTeXit(userData) ;
  792.    return self ;
  793. }
  794.  
  795. - serverMakeEquation:(id)pb userData:(const char *)userData
  796.             error:(char **)msg {
  797.    char *data, *p ;
  798.    int len ;
  799.    char *const *s ;
  800.    char *const *types = [pb types] ;
  801.    FILE *f ;
  802.    char tempname[40] ;
  803.    char cmd[120] ;
  804.    extern char *mktemp() ;
  805.    extern void unlink() ;
  806.    extern int system() ;
  807.  
  808.    [self servercalled] ;
  809.    for (s=types; *s; s++)
  810.       if (*s == NXAsciiPboardType)
  811.          break ;
  812.    if (*s && [pb readType:NXAsciiPboardType data:&data length:&len]) {
  813.       strcpy(tempname, "TeXEQN.XXXXXX") ;
  814.       p = mktemp(tempname) ;
  815.       p = p + strlen(p) ;
  816.       strcpy(p, ".tex") ;
  817.       f = fopen(tempname, "w") ;
  818.       if (f == 0) {
  819.          *msg = "Couldn't open temporary file" ;
  820.          return self ;
  821.       }
  822.       fwrite(data, 1, len, f) ;
  823.       fputs("\n \\nopagenumbers \\bye\n", f) ;
  824.       fclose(f) ;
  825.       *p = 0 ;
  826.       sprintf(cmd, ((userData && *userData) ? userData :
  827.          "tex %s.tex ; dvips %s.dvi -E -n 1 -o %s.eps -P epsf"),
  828.           tempname, tempname, tempname) ;
  829.       system(cmd) ; /* we want to use mysystem */
  830.       strcpy(p, ".eps") ;
  831.       f = fopen(tempname, "r") ;
  832.       if (f) {
  833.          int nlen ;
  834.          char *mbuf ;
  835.          const char *nt[1] ;
  836.  
  837.          nt[0] = NXPostScriptPboardType ;
  838.          fseek(f, 0L, 2) ;
  839.          nlen = ftell(f) ;
  840.          fseek(f, 0L, 0) ;
  841.          mbuf = malloc(nlen) ;
  842.          if (mbuf == 0)
  843.             error("! no memory?") ;
  844.          fread(mbuf, 1, nlen, f) ;
  845.          [pb declareTypes:nt num:1 owner:NULL] ;
  846.          [pb writeType:NXPostScriptPboardType data:mbuf length:nlen] ;
  847.          free(mbuf) ;
  848.          fclose(f) ;
  849.       } else
  850.          *msg = "Output file didn't get created, somehow" ;
  851.       vm_deallocate(task_self(), (vm_address_t)data, len) ;
  852.       strcpy(p, ".dvi") ; unlink(tempname) ;
  853.       strcpy(p, ".log") ; unlink(tempname) ;
  854.       strcpy(p, ".tex") ; unlink(tempname) ;
  855.       strcpy(p, ".eps") ; unlink(tempname) ;
  856.    }
  857.    return self ;
  858. }
  859.  
  860. extern char basename[] ;
  861.  
  862. - validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom)returnType {
  863.    printf("Someone's asking for %s but getting %s\n",
  864.       (sendType ? sendType : ""), (returnType ? returnType : "")) ;
  865.    if (sendType == NXFilenamePboardType && returnType == 0 && basename[0])
  866.       return self ;
  867.    else
  868.       return nil ;
  869. }
  870.  
  871. - (BOOL)writeSelectionToPasteboard:(Pasteboard *)pboard types:(NXAtom *)types
  872. /*
  873.  * If one of the requested types is one of the ones we handle,
  874.  * then we put our selection in the Pasteboard.
  875.  */
  876. {
  877.     while (types && *types) {
  878.     if (*types == NXFilenamePboardType)
  879.            break ;
  880.     types++;
  881.     }
  882.     if (types && *types && basename[0]) {
  883.         char tempname[1000] ;
  884.         strcpy(tempname, basename) ;
  885.         strcat(tempname, ".tex") ;
  886.         [pboard writeType:*types data:tempname length:(strlen(tempname))] ;
  887.     return YES;
  888.     } else {
  889.     return NO;
  890.     }
  891. }
  892.  
  893. extern char LastFormat[], CustomFormat[] ;
  894.  
  895. - setDefaultformat:sender {
  896.    defaultformat = sender ;
  897.    [self upDefaultformat:self] ;
  898.    return self ;
  899. }
  900. - setCustomformat:sender {
  901.    customformat = sender ;
  902.    [self upCustomformat:self] ;
  903.    return self ;
  904. }
  905. - newDefaultformat:sender {
  906.    char *p = (char *)[sender stringValueAt:0] ;
  907.    while (*p <= ' ' && *p)
  908.       p++ ;
  909.    strcpy(LastFormat, p) ;
  910.    p = LastFormat ;
  911.    while (*p > ' ')
  912.       p++ ;
  913.    *p = 0 ;
  914.    return self ;
  915. }
  916. - newCustomformat:sender {
  917.    char *p = (char *)[sender stringValueAt:0] ;
  918.    while (*p <= ' ' && *p)
  919.       p++ ;
  920.    strcpy(CustomFormat, p) ;
  921.    p = CustomFormat ;
  922.    while (*p > ' ')
  923.       p++ ;
  924.    *p = 0 ;
  925.    return self ;
  926. }
  927. - upDefaultformat:sender {
  928.    [(TextField *)defaultformat setStringValue:LastFormat] ;
  929.    return self ;
  930. }
  931. - upCustomformat:sender {
  932.    [(TextField *)customformat setStringValue:CustomFormat] ;
  933.    return self ;
  934. }
  935. void upformats(void) {
  936.    [myPageView upDefaultformat:0] ;
  937.    [myPageView upCustomformat:0] ;
  938. }
  939. @end
  940.