ftp.nice.ch/pub/next/text/tex/apps/texview.3.a9.s.tar.gz#/texview/PageView.m

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>

extern real screendpi ;
extern PageView *myPageView ;
extern Window *tvWindow ;
extern SheetView *myView ;
extern TeXviewObject *myTeXviewObject ;
extern shalfword rvvsize, rhhsize ;
extern Boolean mocked ;
extern Boolean startHidden ;
extern integer autostat ;
extern NXRect *initsizewindow() ;
extern initWasOnScreen() ;

extern void reportname() ;
extern void recalculate() ;
extern void PSflush(), TPSinit() ;
extern void makenewdoc() ;

const char *legit_types[] = { "dvi", "tex", "latex", "ltx", 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 ;
}

- setIconStuff:anObject
{
   iconStuff = anObject ;
   iconStuff = [iconStuff setContentView:nil] ;
   return self ;
}

- getIconStuff;
{
   return iconStuff ;
}

- 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;
}

- hidUnhid:sender
{
   dviHid([sender state]) ;
   return self ;
}

- setHid:anObject
{
   hid = anObject ;
   [self upHid] ;
   return self ;
}

- getHid
{
   return hid ;
}

- upHid
{
   [hid setState:startHidden] ;
   return self ;
}

void uphid(void) {
   [myPageView upHid] ;
}

- statUnstat:sender
{
   dviStat([sender selectedRow]) ;
   return self;
}

- mock:sender
{
   dviMock(1) ;
   return self ;
}

- unMock:sender
{
   dviMock(0) ;
   return self ;
}

- setMockSwitch:anObject
{
   mockSwitch = anObject ;
   [self upMock] ;
   return self ;
}

- setStatSwitch:anObject
{
   statSwitch = anObject ;
   [self upStat] ;
   return self ;
}

void upmock(void) {
   [myPageView upMock] ;
}

- upMock {
   [mockSwitch setState:mocked] ;
   return self ;
}

void upstat(void) {
   [myPageView upStat] ;
}

- upStat {
   [statSwitch selectCellAt:autostat :0] ;
   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;
}


- fireRandom:sender
{
    [myTeXviewObject firePage] ;
    return self ;
}

void pagereport(pagenum, seq)
integer pagenum, seq ;
{
   char str[30] ;

   if (seq == 0)
      sprintf(str, "%d", pagenum) ;
   else
      sprintf(str, "%d.%d", 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] ;
}

void upwindow(void) {
   [[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.666667 } ;
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 mysystem(const char *s) {
   [((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 ;
}
- 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] ;
   [[NXApp appIcon] setContentView:iconStuff] ;
   [[NXApp appIcon] display] ;
   return self ;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.