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> #import "MiscList.h" #import "TeXviewSwitchBoard.h" #include "external.h" #import "FREE.h" #define MILLION 1000000 Window *page_cache ; extern int process_ht_click(); extern real screendpi; extern int paranoia; //extern PageView *myPageView; /* No longer needed */ extern Window *tvWindow; //extern SheetView *myView; /* No longer needed */ extern TeXviewObject *myTeXviewObject; //extern id positionText ; /* moved to TeXviewSwitchBoard */ extern TeXviewSwitchBoard *myTeXviewSwitchBoard ; extern shalfword rvvsize, rhhsize; //extern Boolean mocked; extern NXRect * initsizewindow(); /* extern initWasOnScreen(); */ extern void error(); extern MiscList *visited_tags; extern void reportname(); extern void recalculate(); extern void PSflush(), TPSinit(), TPSnewfontarray(), TPSgetfontarray() ; extern void makenewdoc(); extern void save_context(); extern void get_context(); extern id ht_last_clicked_tag ; extern id ht_highlight_tag ; extern Boolean cloned ; extern int debugon ; @implementation PageView - initFrame:(const NXRect *)theFrame { NXRect tempRect; self = [super initFrame:theFrame]; [self setHorizScrollerRequired:YES]; [self setVertScrollerRequired:YES]; /* [self setDynamicScrolling:YES]; [self setBackgroundGray:0.433]; [self setAutoresizeSubviews:YES]; [self setBorderType:NX_NOBORDER]; */ lastxsize = MILLION; lastysize = MILLION; // myPageView = self; // myOpenPanel = nil; NX_X(&tempRect) = 0; NX_Y(&tempRect) = 0; NX_WIDTH(&tempRect) = 1036; NX_HEIGHT(&tempRect) = 1336; myView = [SheetView newFrame:&tempRect]; if (!cloned) { htags = [HashTable alloc]; [htags initKeyDesc:"*" valueDesc:"@" capacity:10]; htpages = [HashTable alloc]; [htpages initKeyDesc:"i" valueDesc:"@" capacity:5]; } else { htpages = [myTeXviewSwitchBoard getCurrentHtpages] ; htags = [myTeXviewSwitchBoard getCurrentHtags] ; ht_last_clicked_tag = [myTeXviewSwitchBoard getCurrent_ht_last_clicked_tag] ; ht_highlight_tag = [myTeXviewSwitchBoard getCurrent_ht_highlight_tag]; } // [myTeXviewSwitchBoard setCurrentWindow:[self window]]; [myTeXviewSwitchBoard setCurrentPageView:self]; [myTeXviewSwitchBoard setCurrentSheetView:myView]; if (!cloned) { [myTeXviewSwitchBoard setCurrentHtpages:htpages]; [myTeXviewSwitchBoard setCurrentHtags:htags]; [myTeXviewSwitchBoard setCurrent_ht_last_clicked_tag:ht_last_clicked_tag]; [myTeXviewSwitchBoard setCurrent_ht_highlight_tag:ht_highlight_tag] ; } // [myTeXviewSwitchBoard setCurrentZoomed:zoomed]; // [myTeXviewSwitchBoard setCurrentPageForm:pageForm]; // currentView = [SheetView newFrame:&tempRect]; [self setDocView:myView]; // [self setDocView:currentView]; absolute_fn[0] = '\0' ; reportname(NOFILETITLE); [[self window] setExcludedFromWindowsMenu:YES]; // TPSinit(); TPSnewfontarray([myTeXviewSwitchBoard getDocViewNum]); TPSgetfontarray([myTeXviewSwitchBoard getDocViewNum]) ; recalculate(); return self; } - free { if ([[self window] getMaster] == -1) { FREE_LIST(htags) ; FREE_LIST(htpages) ; FREE_OBJECT(ht_highlight_tag) ; FREE_OBJECT(ht_last_clicked_tag) ; } return [super free] ; } - drawSelf:(NXRect *)rects :(int)rectCount { [super drawSelf:rects :rectCount]; return self; } - setPageNum:anObject { pageNum = anObject; return self; } - getHtags { return htags ; } - getHtpages { return htpages ; } - getHt_highlight_tag { return ht_highlight_tag ; } - setHt_highlight_tag:anObject { ht_highlight_tag = anObject; return self ; } - getHt_last_clicked_tag { return ht_last_clicked_tag ; } - setHt_last_clicked_tag:anObject { ht_last_clicked_tag = anObject ; return self ; } - setPageStuff:anObject { pageStuff = anObject; pageStuff = [pageStuff setContentView:nil]; [self addSubview:pageStuff]; [myTeXviewSwitchBoard setCurrentZoomed:zoomed]; [myTeXviewSwitchBoard setCurrentPageForm:pageForm]; [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 { dviLastPage(); return self; } - update { if ([self needsDisplay]) [self display]; return self; } - nextPage { dviNextPage(); return self; } - firstPage { dviFirstPage(); return self; } - mockUnmock { dviMock(-1); return self; } - mock { dviMock(1); return self; } - unMock { dviMock(0); return self; } - prevPage { dviPrevPage(); return self; } - closeFile { dviCloseFile(); return self; } - gotoPage:sender { dviGotoPage((char *)[sender stringValueAt:0]); return self; } - getpagenum:(char *)s { strcpy(s,[pageNum stringValue]); printf("in getpagenum, arg is %s\n", s); return self; } - fireRandom { [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); /* printf("in page report with %ld, %ld\n", pagenum, seq) ; */ [myTeXviewObject setPageNum:str]; PSflush(); } - noScrollUpdates { // [myPageView setDisplayOnScroll:NO]; // [myPageView setCopyOnScroll:NO]; [self setDisplayOnScroll:NO]; [self setCopyOnScroll:NO]; return self; } - scrollUpdates { // [myPageView setDisplayOnScroll:YES]; // [myPageView setCopyOnScroll:YES]; [self setDisplayOnScroll:YES]; [self 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; } 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 { curunits = (curunits + 1); if (unitnames[curunits] == 0) curunits = 0; [self updatePosition]; return self; } - updatePosition { NXPoint pagepos; NXPoint deltapos; char tempbuf[300]; if ([myTeXviewSwitchBoard getPositionText] && 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 *) [myTeXviewSwitchBoard getPositionText] setStringValue:tempbuf]; } return self; } - reportPosition:(NXEvent *)event { if (myView && [myTeXviewSwitchBoard getPositionText] && 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, savedLoc; NXEvent *nextEvent; int oldMask; NXRect myRect; int numdrags = 0; int command_click = 0; command_click = (int) (ptr->flags & NX_COMMANDMASK) ; //To bring up slave #ifdef DEBUG if (debugon > 2 ) { printf("command_click is %i\n", command_click); } #endif oldMask = [window addToEventMask:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)]; [self lockFocus]; savedLoc = 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]; { NXRect tmpR; [[self docView] getFrame:&tmpR]; [[self docView] convertPoint:&savedLoc fromView:nil]; if (!process_ht_click((int)savedLoc.x, (int)tmpR.size.height - (int)savedLoc.y,(id)myView, command_click)) { [self reportPosition:nextEvent]; return self ; } } if (numdrags == 0) [self reportPosition:nextEvent]; return self; } void writeconsole(const char *s) { static char wcbuf[1024]; strcpy(wcbuf, s); strcat(wcbuf, "\n"); [((ComScroll *)[myTeXviewSwitchBoard 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 *)[myTeXviewSwitchBoard 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 *)[myTeXviewSwitchBoard getConsole]) logCommand:cmd inBack:0] ; ret=[((ComScroll *)[myTeXviewSwitchBoard 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 *)[myTeXviewSwitchBoard getConsole]) logCommand :s inBack:0]; } void consoletofront() { [[((ComScroll *)[myTeXviewSwitchBoard getConsole]) window] makeKeyAndOrderFront:0]; } void textofront() { [[((ComScroll *)[myTeXviewSwitchBoard getTeX]) window] makeKeyAndOrderFront:0]; } void commandup() { [[myTeXviewSwitchBoard getCommand] orderFront:0]; } void myasyncsystem(const char *s) { textofront(); [((ComScroll *)[myTeXviewSwitchBoard getTeX]) logCommand :s inBack:1]; } extern void reTeXit(); - TeXtexit { reTeXit("tex -v \"%s\""); return self; } - TeXlatexit { reTeXit("latex -v \"%s\""); return self; } - TeXslitexit { reTeXit("slitex -v \"%s\""); return self; } - TeXbibtexit { reTeXit("bibtex \"%s\""); return self; } - TeXamstexit { reTeXit("amstex -v \"%s\""); return self; } - TeXlatex209it { reTeXit("latex209 -v \"%s\""); return self; } - TeXeplainit { reTeXit("eplain -v \"%s\""); return self; } - openManual { dviOpenFile("/usr/tex/ntman.dvi"); return self; } - TeXcustomexit { reTeXit("%C -v \"%s\""); return self; } - TeXdefaultexit { reTeXit("%L -v \"%s\""); return self; } - TeXmakeit { reTeXit("make \"%s.dvi\""); 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]; 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; } } - moveBackInHistory { writeconsole("back pushed"); [[visited_tags setPreviousObject] goToTarget:0]; return self; } - moveForwardInHistory { writeconsole("forward pushed"); [[visited_tags setNextObject] goToTarget:0]; return self; } - getDviContext { get_context(&dc) ; return self ; } - saveDviContext { save_context(&dc) ; return self ; } - setPageForm:anObject { pageForm = anObject; return self; } - getPageForm { return pageForm ; } - setZoomed:anObject { zoomed = anObject ; return self ; } - getZoomed { return zoomed ; } - setAbsoluteFn:(char *)fn { strcpy(absolute_fn, fn) ; return self; } - (char *)getAbsoluteFn { return absolute_fn ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.