This is GraphicsView.m in view mode; [Download] [Up]
/* Copyright 1991 Gustavus Adolphus College. All rights reserved.
*
* Schematik was developed by Gustavus Adolphus College (GAC) with
* support from NeXT Computer, Inc. Permission to copy this software,
* to redistribute it, and to use it for any purpose is granted,
* subject to the following restrictions and understandings.
*
* 1. Any copy made of this software must include this copyright
* notice in full.
*
* 2. Users of this software agree to make their best efforts (a) to
* return to the GAC Mathematics and Computer Science Department any
* improvements or extensions that they make, so that these may be
* included in future releases; and (b) to inform GAC of noteworthy
* uses of this software.
*
* 3. All materials developed as a consequence of the use of this
* software shall duly acknowledge such use, in accordance with the
* usual standards of acknowledging credit in academic research.
*
* 4. GAC makes no express or implied warranty or representation of
* any kind with respect to this software, including any warranty
* that the operation of this software will be error-free. ANY
* IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
* PURPOSE IS HEREBY DISCLAIMED. GAC is under no obligation to
* provide any services, by way of maintenance, update, or otherwise.
*
* 5. In conjunction with products arising from the use of this
* material, there shall be no use of the name of Gustavus Adolphus
* College nor of any adaptation thereof in any advertising,
* promotional, or sales literature without prior written consent
* from GAC in each case.
*/
#import "GraphicsView.h"
#import "../defines.h"
#import Main_h
#import SchemeProtocol_h
#import PrefAgent_h
#import <appkit/NXCachedImageRep.h>
#import <appkit/NXImage.h>
#import <appkit/ScrollView.h>
#import <appkit/Window.h>
#import <appkit/nextstd.h>
#import <appkit/publicWraps.h>
#import <dpsclient/wraps.h>
#import <objc/Storage.h>
#import <defaults.h>
#import <mach.h>
#import <string.h>
static void flushTEHandler(DPSTimedEntry, double, id);
#define GRAPHICSZONENAME "Graphics"
#define MINIWINDOWICON "GraphicsWin.tiff"
#define TEMPSTRINGLENGTH 1040
#define WINDOWOFFSET 20
#define WINDOWTOPBOUND 830
#define WINDOWROLLBOUND 800
#define WINDOWRIGHTBOUND 1050
#define AUTOFLUSHMODE 1
#define NONFLUSHMODE 0
#define MINDOCVIEWSIZE {120.0,60.0}
static unsigned windowNumber=0;
static NXSize minWindowSize;
@implementation GraphicsView
+ initialize
{
NXSize minDocSize=MINDOCVIEWSIZE,size1;
NXRect tempFrame,tempRect;
[ScrollView getFrameSize:&size1 forContentSize:&minDocSize horizScroller:YES vertScroller:YES borderType:NX_NOBORDER];
NXSetRect(&tempRect,0.0,0.0,size1.width,size1.height);
[Window getFrameRect:&tempFrame forContentRect:&tempRect style:NX_RESIZEBARSTYLE];
minWindowSize.width=tempFrame.size.width;
minWindowSize.height=tempFrame.size.height;
return self;
}
- initFrame:(NXRect *)frameRect window:(unsigned)winNum
{
NXSize size1,size2,size3,size4=MINDOCVIEWSIZE,size5;
NXRect contentRect;
id theWindow,scrollView;
char buffer[TEMPSTRINGLENGTH];
unsigned int globalWinNum;
DEBUG_FUNC1(DEBUGLEVEL);
[super initFrame:frameRect];
number = winNum;
windowNum = windowNumber++;
flushMode = NONFLUSHMODE;
flushTE = (DPSTimedEntry)0;
cache = [[Window allocFromZone:[self zone]] initContent:&bounds style:NX_PLAINSTYLE backing:NX_RETAINED buttonMask:0 defer:NO];
imageRep = [[NXCachedImageRep allocFromZone:[self zone]] initFromWindow:cache rect:&bounds];
theImage = [[NXImage allocFromZone:[self zone]] initSize:&(bounds.size)];
[theImage setUnique:YES];
[theImage useRepresentation:imageRep];
[theImage setScalable:YES];
[ScrollView getFrameSize:&size3 forContentSize:&(bounds.size) horizScroller:YES vertScroller:YES borderType:NX_NOBORDER];
NXSetRect(&contentRect,0.0,0.0,size3.width,size3.height);
[Window getFrameRect:frameRect forContentRect:&contentRect style:NX_RESIZEBARSTYLE];
maxWindowSize.width = frameRect->size.width;
maxWindowSize.height = frameRect->size.height;
NXConvertWinNumToGlobal([cache windowNum], &globalWinNum);
[[NXApp protocolObj] sendGraphicsWindow:globalWinNum];
[[NXApp prefAgent] getGraphicsSize:&size1];
[[NXApp prefAgent] getGraphicsTolerance:&size2];
size1.width = (((size1.width+size2.width)<bounds.size.width)?size1.width:bounds.size.width);
size1.height = (((size1.height+size2.height)<bounds.size.height)?size1.height:bounds.size.height);
[ScrollView getFrameSize:&size3 forContentSize:&size1 horizScroller:YES vertScroller:YES borderType:NX_NOBORDER];
[ScrollView getFrameSize:&size5 forContentSize:&size4 horizScroller:YES vertScroller:YES borderType:NX_NOBORDER];
size3.width = MAX(size3.width, size5.width);
size3.height = MAX(size3.height, size5.height);
NXSetRect(frameRect,0.0,0.0,size3.width,size3.height);
scrollView = [[ScrollView allocFromZone:[self zone]] initFrame:frameRect];
[scrollView setBorderType:NX_NOBORDER];
[scrollView setHorizScrollerRequired:YES];
[scrollView setVertScrollerRequired:YES];
[scrollView setDocView:self];
theWindow = [[Panel allocFromZone:[self zone]] initContent:frameRect style:NX_RESIZEBARSTYLE backing:NX_BUFFERED buttonMask:NX_RESIZEBUTTONMASK|NX_MINIATURIZEBUTTONMASK defer:NO];
[theWindow setFreeWhenClosed:YES];
[theWindow setHideOnDeactivate:NO];
[theWindow setMiniwindowIcon:MINIWINDOWICON];
[theWindow setDelegate:self];
[theWindow moveTopLeftTo:(WINDOWRIGHTBOUND-frameRect->size.width) :(WINDOWTOPBOUND-((windowNum*WINDOWOFFSET)%WINDOWROLLBOUND))];
sprintf(buffer, GENERICTITLE, windowNum);
[theWindow setTitle:buffer];
[theWindow setContentView:scrollView];
[theWindow display];
[NXApp addWindowsItem:theWindow title:buffer filename:NO];
[theWindow orderWindow:NX_BELOW relativeTo:[[NXApp mainWindow] windowNum]];
return self;
}
- drawSelf:(NXRect *)r :(int)rectCount
{
DEBUG_FUNC1(DEBUGLEVEL);
[theImage composite:NX_COPY fromRect:r toPoint:&(r->origin)];
return self;
}
- free
{
DEBUG_FUNC1(DEBUGLEVEL);
[theImage free];
[cache free];
return [super free];
}
- setFlushMode:(unsigned)mode
{
switch (mode)
{
case AUTOFLUSHMODE: flushTE = DPSAddTimedEntry(0.1, (DPSTimedEntryProc)flushTEHandler, self, NX_MODALRESPTHRESHOLD-1);
flushMode = mode; break;
case NONFLUSHMODE: if (flushTE) DPSRemoveTimedEntry(flushTE);
flushTE = (DPSTimedEntry)0; flushMode = mode;
}
return [self display];
}
@end
@implementation GraphicsView (Delegate)
- windowWillResize:sender toSize:(NXSize *)aSize
{
DEBUG_FUNC1(DEBUGLEVEL);
if (aSize->width > maxWindowSize.width)
aSize->width = maxWindowSize.width;
if (aSize->width < minWindowSize.width)
aSize->width = minWindowSize.width;
if (aSize->height > maxWindowSize.height)
aSize->height = maxWindowSize.height;
if (aSize->height < minWindowSize.height)
aSize->height = minWindowSize.height;
return self;
}
@end
static void flushTEHandler(DPSTimedEntry te, double time, id self)
{
[self display];
}
@interface Window (FrameView)
- _setCloseEnabled:(BOOL)aBoolean andDisplay:(BOOL)anotherBool;
@end
@implementation Window (GraphicsExt)
- setCloseEnabled
{
DEBUG_FUNC1(DEBUGLEVEL);
[_borderView _setCloseEnabled:YES andDisplay:YES];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.