This is PageView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "PageView.h" #import "SheetView.h" #import "appkit/Scroller.h" #import "TeXviewObject.h" #import "TVWindow.h" #import <dpsclient/wraps.h> #import "dviAccessors.h" #import <strings.h> #import <appkit/Application.h> #import "ComScroll.h" #import <appkit/TextField.h> #import <mach/mach.h> #include <kpathsea/c-fopen.h> #include <kpathsea/c-pathch.h> #include <kpathsea/concatn.h> #include <kpathsea/db.h> #include <kpathsea/fn.h> #include <kpathsea/magstep.h> #include <kpathsea/readable.h> #include <kpathsea/tex-make.h> #include <kpathsea/variable.h> extern real screendpi ; extern int paranoia ; extern PageView *myPageView ; extern Window *tvWindow ; extern SheetView *myView ; extern TeXviewObject *myTeXviewObject ; extern shalfword rvvsize, rhhsize ; extern Boolean mocked ; extern NXRect *initsizewindow() ; extern initWasOnScreen() ; extern void error() ; extern void reportname() ; extern void recalculate() ; extern void PSflush(), TPSinit() ; extern void makenewdoc() ; const char *legit_types[] = { "dvi", "tex", "latex", "ltx", "texinfo", NULL } ; @implementation PageView + newFrame:(const NXRect *)theFrame { NXRect tempRect ; self = [super newFrame:theFrame]; [self setHorizScrollerRequired:YES]; [self setVertScrollerRequired:YES]; /* [self setDynamicScrolling:YES]; [self setBackgroundGray:0.433]; [self setAutoresizeSubviews:YES]; [self setBorderType:NX_NOBORDER]; */ myPageView = self ; myOpenPanel = nil ; NX_X(&tempRect) = 0 ; NX_Y(&tempRect) = 0 ; NX_WIDTH(&tempRect) = 1036 ; NX_HEIGHT(&tempRect) = 1336 ; myView = [SheetView newFrame:&tempRect] ; [self setDocView:myView] ; reportname(NOFILETITLE) ; [[self window] setExcludedFromWindowsMenu:YES] ; TPSinit() ; recalculate() ; return self; } - drawSelf:(NXRect *)rects :(int)rectCount { [super drawSelf:rects:rectCount] ; return self ; } - setPageNum:anObject { pageNum = anObject ; return self; } - setConsole:anObject { NXRect *tr ; console = anObject ; [[console window] setExcludedFromWindowsMenu:YES] ; if (tr=initsizewindow(1)) { [[(ComScroll *)console window] placeWindow:tr] ; if (initWasOnScreen()) { [[console window] orderFront:self] ; } else { [[console window] orderOut:self] ; } } return self; } - getConsole { return console ; } - setTex:anObject { NXRect *tr ; tex = anObject ; [[tex window] setExcludedFromWindowsMenu:YES] ; if (tr=initsizewindow(2)) { [[(ComScroll *)tex window] placeWindow:tr] ; if (initWasOnScreen()) { [[tex window] orderFront:self] ; } else { [[tex window] orderOut:self] ; } } return self; } - getTeX { return tex ; } - setCommand:anObject { NXRect *tr ; command = anObject ; [command setExcludedFromWindowsMenu:YES] ; [command removeFromEventMask:(NX_KEYDOWNMASK | NX_KEYUPMASK)] ; if (tr=initsizewindow(3)) { [command moveTo:tr->origin.x:tr->origin.y] ; if (initWasOnScreen()) { [command orderFront:self] ; } else { [command orderOut:self] ; } } return self; } - getCommand { return command ; } - setPageStuff:anObject { pageStuff = anObject ; pageStuff = [pageStuff setContentView:nil] ; [self addSubview:pageStuff] ; [self tile] ; return self ; } - getPageStuff; { return pageStuff ; } - tile { NXRect r1, r2 ; Scroller *h ; [super tile] ; if (pageStuff == 0) return self ; h = [self horizScroller] ; [h getFrame:&r2] ; [pageStuff getFrame:&r1] ; r2.size.width -= r1.size.width ; r1.origin.x = r2.size.width + r2.origin.x ; r1.origin.y = r2.origin.y ; [h setFrame:&r2] ; [pageStuff setFrame:&r1] ; return self ; } - lastPage:sender { dviLastPage() ; return self; } - openPanel { if (!myOpenPanel) myOpenPanel = [OpenPanel new]; return (myOpenPanel); } - update { if ([self needsDisplay]) [self display] ; return self ; } - openFile:sender { if ([[self openPanel] runModalForTypes:legit_types]) dviOpenFile((char *)[[self openPanel] filename]) ; return self; } - reOpenFile:sender { dviReOpenFile() ; return self; } - nextPage:sender { dviNextPage() ; return self; } - firstPage:sender { dviFirstPage() ; return self; } - zoomUnzoom:sender { dviZoomUnzoom() ; return self; } - mockUnmock:sender { dviMock(-1) ; return self; } - mock:sender { dviMock(1) ; return self ; } - unMock:sender { dviMock(0) ; return self ; } - setMockSwitch:anObject { mockSwitch = anObject ; [self upMock] ; return self ; } void upmock(void) { [myPageView upMock] ; } - upMock { [mockSwitch setState:mocked] ; return self ; } - unzoom:sender { [myTeXviewObject unzoom] ; dviUnzoom() ; return self; } - prevPage:sender { dviPrevPage() ; return self; } - zoom:sender { [myTeXviewObject zoom] ; dviZoom() ; return self; } - closeFile:sender { dviCloseFile() ; return self; } - gotoPage:sender { dviGotoPage((char *)[sender stringValueAt:0]) ; return self; } void getpagenum(s) char *s ; { [myPageView getpagenum:s] ; } - getpagenum:(char *)s { strcpy(s, [pageNum stringValue]) ; return self ; } - fireRandom:sender { [myTeXviewObject firePage] ; return self ; } void pagereport(pagenum, seq) integer pagenum, seq ; { char str[30] ; if (seq == 0) sprintf(str, "%ld", pagenum) ; else sprintf(str, "%ld.%ld", pagenum, seq) ; [myTeXviewObject setPageNum:str] ; PSflush() ; } char realnameoffile[255] ; void reportname(s) char *s ; { static char *oldname ; if (s) { oldname = s ; if (*s != '*' || s[1] != ' ') strcpy(realnameoffile, s) ; else realnameoffile[0] = 0 ; } else realnameoffile[0] = 0 ; [[myPageView window] setTitleAsFilename:oldname] ; } - changeDPI:(id)sender { [myTeXviewObject popIt:sender] ; return self ; } #define MILLION 1000000 static int lastxsize = MILLION, lastysize = MILLION ; - noScrollUpdates { [myPageView setDisplayOnScroll:NO] ; [myPageView setCopyOnScroll:NO] ; return self ; } - scrollUpdates { [myPageView setDisplayOnScroll:YES] ; [myPageView setCopyOnScroll:YES] ; return self ; } - cachePosition:(int)x:(int)y { NXSize s ; [self getContentSize:&s] ; if (s.width + 16 > lastxsize) xcache = 0.5 ; else xcache = [[self horizScroller] floatValue] ; if (s.height + 16 > lastysize) ycache = 0.5 ; else ycache = [[self vertScroller] floatValue] ; if (lastxsize == MILLION) { /* cheat these values in */ xcache = 0.5 ; ycache = 0.0 ; } return self ; } static float scroller_to_pos(float x1, float x2, float s) { if (x2 < x1) return s * (x1 - x2) ; else return 0 ; } - unCachePosition:(int)x:(int)y { NXSize size ; NXPoint t ; [self getContentSize:&size] ; t.x = scroller_to_pos((float)x, size.width, xcache) ; t.y = scroller_to_pos((float)y, size.height, 1.0-ycache) ; [myView scrollPoint:&t] ; lastxsize = x ; lastysize = y ; return self ; } /* moves down about a screenful. */ - (int)moveDown:(int)shiftstate; { NXSize s ; NXPoint t ; float ypos = [[self vertScroller] floatValue] ; float xpos = [[self horizScroller] floatValue] ; float f ; shiftstate = 1 << (2 * shiftstate) ; [self getContentSize:&s] ; if (ypos > 0.95 || s.height + 16 >= rvvsize) return 0 ; if (2 * s.height < rvvsize) f = s.height / (rvvsize - s.height) - 0.02 ; else f = 1.0 ; if (f < 0.02) f = 0.02 ; f /= shiftstate ; ypos += f ; if (ypos > 1.0) ypos = 1.0 ; t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; return 1 ; } /* moves up about a screenful. */ - (int)moveUp:(int)shiftstate; { NXSize s ; NXPoint t ; float ypos = [[self vertScroller] floatValue] ; float xpos = [[self horizScroller] floatValue] ; float f ; shiftstate = 1 << (2 * shiftstate) ; [self getContentSize:&s] ; if (ypos < 0.05 || s.height + 16 >= rvvsize) return 0 ; if (2 * s.height < rvvsize) f = s.height / (rvvsize - s.height) - 0.02 ; else f = 1.0 ; if (f < 0.02) f = 0.02 ; f /= shiftstate ; ypos -= f ; if (ypos < 0.0) ypos = 0.0 ; t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; return 1 ; } - (int)moveRight:(int)shiftstate { NXSize s ; NXPoint t ; float ypos = [[self vertScroller] floatValue] ; float xpos = [[self horizScroller] floatValue] ; float f ; shiftstate = 1 << (2 * shiftstate) ; [self getContentSize:&s] ; if (s.width + 16 >= rhhsize) return 0 ; if (2 * s.width < rhhsize) f = s.width / (rhhsize - s.width) - 0.02 ; else f = 1.0 ; if (f < 0.02) f = 0.02 ; f /= shiftstate ; xpos += f ; if (xpos > 1.0) xpos = 1.0 ; t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; return 1 ; } - (int)moveLeft:(int)shiftstate { NXSize s ; NXPoint t ; float ypos = [[self vertScroller] floatValue] ; float xpos = [[self horizScroller] floatValue] ; float f ; shiftstate = 1 << (2 * shiftstate) ; [self getContentSize:&s] ; if (s.width + 16 >= rhhsize) return 0 ; if (2 * s.width < rhhsize) f = s.width / (rhhsize - s.width) - 0.02 ; else f = 1.0 ; if (f < 0.02) f = 0.02 ; f /= shiftstate ; xpos -= f ; if (xpos < 0.0) xpos = 0.0 ; t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; return 1 ; } - Bot:(int)quiet; { NXSize s ; NXPoint t ; float xpos = [[self horizScroller] floatValue] ; if (quiet) [self noScrollUpdates] ; [self getContentSize:&s] ; t.y = scroller_to_pos((float)rvvsize, s.height, 0.0) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; if (quiet) [self scrollUpdates] ; return self ; } - Top:(int)quiet; { NXSize s ; NXPoint t ; float xpos = [[self horizScroller] floatValue] ; if (quiet) [self noScrollUpdates] ; [self getContentSize:&s] ; t.y = scroller_to_pos((float)rvvsize, s.height, 1.0) ; t.x = scroller_to_pos((float)rhhsize, s.width, xpos) ; [myView scrollPoint:&t] ; if (quiet) [self scrollUpdates] ; return self ; } void bringupwindow(void) { NXRect *tr ; if (tr = initsizewindow(0)) [[myPageView window] placeWindow:tr] ; tvWindow = [myPageView window] ; [[myPageView window] makeKeyAndOrderFront:0] ; } - setPositionText:anObject { positionText = anObject ; return self ; } - setPositionRadio:anObject { positionRadio = anObject ; return self ; } static float units[] = { 1.0, 2.54, 72.27, 72.0, 84.725 } ; static int curunits = 0 ; static NXPoint posevent = {0.0, 0.0}, prevposevent = {0.0, 0.0} ; static char *unitnames[] = { "inches", "centimeters", "points", "PostScript units", "pico-light-seconds", 0 } ; - changeUnits:sender { curunits = (curunits + 1) ; if (unitnames[curunits] == 0) curunits = 0 ; [self updatePosition] ; return self ; } - updatePosition { NXPoint pagepos ; NXPoint deltapos ; char tempbuf[300] ; if (positionText && screendpi > 1.0) { pagepos = posevent ; deltapos = prevposevent ; pagepos.x *= units[curunits] / screendpi ; pagepos.y *= units[curunits] / screendpi ; deltapos.x *= units[curunits] / screendpi ; deltapos.y *= units[curunits] / screendpi ; sprintf(tempbuf, "Click at (%.3g,%.3g) is (%.3g,%.3g) from previous click in %s.", pagepos.x, pagepos.y, pagepos.x - deltapos.x, pagepos.y - deltapos.y, unitnames[curunits]) ; [(TextField *)positionText setStringValue:tempbuf] ; } return self ; } - reportPosition:(NXEvent *)event { if (myView && positionText && screendpi > 1.0) { prevposevent = posevent ; posevent = (event->location) ; posevent.x -= 8.0 ; posevent.y -= 8.0 ; [myView convertPoint:&posevent fromView:nil] ; [self updatePosition] ; } return self ; } - mouseDown: (NXEvent *) ptr { NXPoint newLoc, oldLoc; NXEvent *nextEvent; int oldMask; NXRect myRect; int numdrags = 0 ; oldMask = [window addToEventMask:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)]; [self lockFocus]; oldLoc = ptr->location; [self convertPoint:&oldLoc fromView:nil]; nextEvent = [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)]; while (nextEvent->type == NX_LMOUSEDRAGGED){ numdrags++ ; newLoc = nextEvent->location; [self convertPoint:&newLoc fromView:nil]; [myView getVisibleRect:&myRect]; myRect.origin.x -= newLoc.x - oldLoc.x; myRect.origin.y += newLoc.y - oldLoc.y; [myView scrollRectToVisible: &myRect]; oldLoc = newLoc; nextEvent = [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)]; } [self unlockFocus]; [window setEventMask:oldMask]; if (numdrags == 0) [self reportPosition:nextEvent] ; return self; } void writeconsole(const char *s) { static char wcbuf[1024] ; strcpy(wcbuf, s) ; strcat(wcbuf, "\n") ; [((ComScroll *)[myPageView getConsole]) addText:wcbuf] ; } void misstex P2C(kpse_file_format_type, format, const_string, cmd) { static FILE *missfont = NULL; /* If we weren't trying to make a font, do nothing. Maybe should allow people to specify what they want recorded? */ if (format > kpse_any_glyph_format && format != kpse_tfm_format && format != kpse_vf_format) return; /* If this is the first time, have to open the log file. */ if (!missfont) { const_string missfont_name = "missfont.log"; missfont = fopen (missfont_name, FOPEN_A_MODE); if (!missfont && getenv ("TEXMFOUTPUT")) { missfont_name = concat3 (getenv ("TEXMFOUTPUT"), DIR_SEP_STRING, missfont_name); missfont = fopen (missfont_name, FOPEN_A_MODE); } /* Should we really be unconditionally shouting this message? */ if (missfont) { char tmp[160]; sprintf (tmp, "kpathsea: Appending font creation commands to %s.\n", missfont_name); [((ComScroll *)[myPageView getConsole]) addText:tmp]; } } /* Write the command if we have a log file. */ if (missfont) { fputs (cmd, missfont); putc ('\n', missfont); } } string maketex P2C(kpse_file_format_type, format, const_string, cmd) { string ret; string fn; /* The final filename. */ fn_type output=fn_init(); /* Collect the script output. */ unsigned len; [((ComScroll *)[myPageView getConsole]) logCommand:cmd inBack:0] ; ret=[((ComScroll *)[myPageView getConsole]) getLastLine] ; output=fn_copy0(ret,strlen(ret)); len = FN_LENGTH (output); fn = FN_STRING (output); /* If no output from script, return NULL. Otherwise check what it output. */ ret = len == 1 ? NULL : kpse_readable_file (fn); /* Free the name if we're not returning it. */ if (fn != ret) free (fn); return ret; if (ret == NULL) misstex (format, cmd); else db_insert (ret); return ret; } void mysystem(const char *s) { if (paranoia) system(s) ; else [((ComScroll *)[myPageView getConsole]) logCommand:s inBack:0] ; } void consoletofront() { [[((ComScroll *)[myPageView getConsole]) window] makeKeyAndOrderFront:0] ; } void textofront() { [[((ComScroll *)[myPageView getTeX]) window] makeKeyAndOrderFront:0] ; } void commandup() { [[myPageView getCommand] orderFront:0] ; } void previewtofront() { [[myPageView window] makeKeyAndOrderFront:0] ; } void myasyncsystem(const char *s) { textofront() ; [((ComScroll *)[myPageView getTeX]) logCommand:s inBack:1] ; } extern void reTeXit() ; - TeXtexit:sender { reTeXit("tex -v \"%s\"") ; return self ; } - TeXlatexit:sender { reTeXit("latex -v \"%s\"") ; return self ; } - TeXslitexit:sender { reTeXit("slitex -v \"%s\"") ; return self ; } - TeXbibtexit:sender { reTeXit("bibtex \"%s\"") ; return self ; } - TeXamstexit:sender { reTeXit("amstex -v \"%s\"") ; return self ; } - TeXlatex209it:sender { reTeXit("latex209 -v \"%s\"") ; return self ; } - TeXeplainit:sender { reTeXit("eplain -v \"%s\"") ; return self ; } - openManual:sender { dviOpenFile("/usr/tex/ntman.dvi") ; return self ; } - TeXcustomexit:sender { reTeXit("%C -v \"%s\"") ; return self ; } - TeXdefaultexit:sender { reTeXit("%L -v \"%s\"") ; return self ; } - TeXmakeit:sender { reTeXit("make \"%s.dvi\"") ; return self ; } - clearBuffer:sender { ComScroll *c = 0 ; if (console && [[(ComScroll *)console window] isKeyWindow]) c = console ; else if (tex && [[(ComScroll *)tex window] isKeyWindow]) c = tex ; if (c) [c clear] ; return self ; } - appDidBecomeActive:(id)sender; { /* [tvWindow makeKeyAndOrderFront:self] ; */ return self ; } - servercalled { return self ; } /* * What we do here is we try to find data of type NXFilenamePboardType, * and then open it up. */ - serverOpen:(id)pb userData:(const char *)userData error:(char **)msg { char *data ; int len ; char *const *s ; char *const *types = [pb types] ; [self servercalled] ; for (s=types; *s; s++) if (*s == NXFilenamePboardType) break ; dviSaveFormat(userData) ; if (*s && [pb readType:NXFilenamePboardType data:&data length:&len]) { dviOpenFile(data) ; vm_deallocate(task_self(), (vm_address_t)data, len) ; } return self ; } /* * The rest actually ignore the filename, since the user may be editing * an auxilliary file. */ - serverReopen:(id)pb userData:(const char *)userData error:(char **)msg { [self servercalled] ; [self reOpenFile:self] ; return self ; } - serverCommand:(id)pb userData:(const char *)userData error:(char **)msg { [self servercalled] ; reTeXit(userData) ; return self ; } - serverMakeEquation:(id)pb userData:(const char *)userData error:(char **)msg { char *data, *p ; int len ; char *const *s ; char *const *types = [pb types] ; FILE *f ; char tempname[40] ; char cmd[120] ; extern char *mktemp() ; extern void unlink() ; extern int system() ; [self servercalled] ; for (s=types; *s; s++) if (*s == NXAsciiPboardType) break ; if (*s && [pb readType:NXAsciiPboardType data:&data length:&len]) { strcpy(tempname, "TeXEQN.XXXXXX") ; p = mktemp(tempname) ; p = p + strlen(p) ; strcpy(p, ".tex") ; f = fopen(tempname, "w") ; if (f == 0) { *msg = "Couldn't open temporary file" ; return self ; } fwrite(data, 1, len, f) ; fputs("\n \\nopagenumbers \\bye\n", f) ; fclose(f) ; *p = 0 ; sprintf(cmd, ((userData && *userData) ? userData : "tex %s.tex ; dvips %s.dvi -E -n 1 -o %s.eps -P epsf"), tempname, tempname, tempname) ; system(cmd) ; /* we want to use mysystem */ strcpy(p, ".eps") ; f = fopen(tempname, "r") ; if (f) { int nlen ; char *mbuf ; const char *nt[1] ; nt[0] = NXPostScriptPboardType ; fseek(f, 0L, 2) ; nlen = ftell(f) ; fseek(f, 0L, 0) ; mbuf = malloc(nlen) ; if (mbuf == 0) error("! no memory?") ; fread(mbuf, 1, nlen, f) ; [pb declareTypes:nt num:1 owner:NULL] ; [pb writeType:NXPostScriptPboardType data:mbuf length:nlen] ; free(mbuf) ; fclose(f) ; } else *msg = "Output file didn't get created, somehow" ; vm_deallocate(task_self(), (vm_address_t)data, len) ; strcpy(p, ".dvi") ; unlink(tempname) ; strcpy(p, ".log") ; unlink(tempname) ; strcpy(p, ".tex") ; unlink(tempname) ; strcpy(p, ".eps") ; unlink(tempname) ; } return self ; } extern char Tbasename[] ; - validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom)returnType { printf("Someone's asking for %s but getting %s\n", (sendType ? sendType : ""), (returnType ? returnType : "")) ; if (sendType == NXFilenamePboardType && returnType == 0 && Tbasename[0]) return self ; else return nil ; } - (BOOL)writeSelectionToPasteboard:(Pasteboard *)pboard types:(NXAtom *)types /* * If one of the requested types is one of the ones we handle, * then we put our selection in the Pasteboard. */ { while (types && *types) { if (*types == NXFilenamePboardType) break ; types++; } if (types && *types && Tbasename[0]) { char tempname[1000] ; strcpy(tempname, Tbasename) ; strcat(tempname, ".tex") ; [pboard writeType:*types data:tempname length:(strlen(tempname))] ; return YES; } else { return NO; } } extern char LastFormat[], CustomFormat[] ; - setDefaultformat:sender { defaultformat = sender ; [self upDefaultformat:self] ; return self ; } - setCustomformat:sender { customformat = sender ; [self upCustomformat:self] ; return self ; } - newDefaultformat:sender { char *p = (char *)[sender stringValueAt:0] ; while (*p <= ' ' && *p) p++ ; strcpy(LastFormat, p) ; p = LastFormat ; while (*p > ' ') p++ ; *p = 0 ; return self ; } - newCustomformat:sender { char *p = (char *)[sender stringValueAt:0] ; while (*p <= ' ' && *p) p++ ; strcpy(CustomFormat, p) ; p = CustomFormat ; while (*p > ' ') p++ ; *p = 0 ; return self ; } - upDefaultformat:sender { [(TextField *)defaultformat setStringValue:LastFormat] ; return self ; } - upCustomformat:sender { [(TextField *)customformat setStringValue:CustomFormat] ; return self ; } void upformats(void) { [myPageView upDefaultformat:0] ; [myPageView upCustomformat:0] ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.