This is TVwinMgr.m in view mode; [Download] [Up]
#import "TVController.h" #import <dpsclient/dpsNeXT.h> // for TimedEntry #import <appkit/Application.h> #import <appkit/publicWraps.h> #import <appkit/Control.h> #import <appkit/MenuCell.h> #import <appkit/workspaceRequest.h> #import <objc/NXBundle.h> /* LocalizedString */ #import <defaults/defaults.h> #import <stdio.h> #import <stdlib.h> #import <string.h> #import <objc/zone.h> #import <bsd/libc.h> #import <mach/mach_init.h> #import "ToyWin.h" #import "ToyView.h" #import "ImageOpCtr.h" #import "ImageSave.h" #import "common.h" #import "strfunc.h" #define MAXWindows 80 @implementation TVController (WindowManager) static int winp = 0, showp = 0; static ToyWin *wintab[MAXWindows]; static DPSTimedEntry teNum; - newWindow: (ToyWin *)win { if (winp < MAXWindows) wintab[winp++] = win; return self; } - checkWindow: (ToyWin *)win delete:(BOOL)delflag; { /* Return Value: nil: No such window, self: Success */ int i, j; j = -1; for (i = 0; i < winp; i++) if (wintab[i] == win) { j = i; break; } if (j < 0) return nil; if (delflag) { --winp; for (i = j; i < winp; i++) wintab[i] = wintab[i + 1]; } return self; } - deleteAllWindow: sender { int i, n; n = winp, winp = 0; for (i = 0; i < n; i++) [[wintab[i] window] performClose: sender]; return self; } static void wakeup(DPSTimedEntry te, double now, void *data) { if (showp >= winp) { DPSRemoveTimedEntry(teNum); showp = 0; }else [[wintab[showp++] window] orderFront: (id)data]; } - showAllWindow: sender { if (winp <= 0) return self; if (showp > 0) { DPSRemoveTimedEntry(teNum); showp = 0; }else { [[wintab[0] window] orderFront: sender]; teNum = DPSAddTimedEntry(0.8, &wakeup, self, NX_BASETHRESHOLD); showp = 1; } return self; } - keyWindow { int i; for (i = 0; i < winp; i++) if ([[wintab[i] window] isMainWindow]) return wintab[i]; return (winp > 0) ? wintab[winp - 1] : nil; } - (BOOL)isOpened: (const char *)newfile { int i; for (i = 0; i < winp; i++) if (strcmp(newfile, [wintab[i] filename]) == 0) { [[wintab[i] window] makeKeyAndOrderFront: self]; return YES; } return NO; } - (BOOL)isOpenedID: (ToyWin *)win { int i; for (i = 0; i < winp; i++) if (wintab[i] == win) return YES; return NO; } /****** Print *****************************/ - print: sender { id tw; if ((tw = [self keyWindow]) == nil) NXBeep(); else [tw print:sender]; return self; } /****** SaveAs... *************************/ /* Local Method */ - allocImageSave { static id classImgSv = nil; if (classImgSv == nil) { char bdir[MAXFILENAMELEN]; id bundle; int n; n = dircopy(bdir, NXArgv[0], YES); strcpy(&bdir[n], "ImageSave.bundle"); bundle = [[NXBundle alloc] initForDirectory: bdir]; if (bundle == nil) /* ERROR */ return nil; classImgSv = [bundle classNamed:"ImageSave"]; if (classImgSv == nil) /* ERROR */ return nil; } return [classImgSv alloc]; } - saveAs: sender { ToyWin *tw; id imgsv; commonInfo *cinf; char *p; if ((tw = (ToyWin *)[self keyWindow]) == nil) { NXBeep(); return self; } imgsv = [[self allocImageSave] initWithWin: tw]; switch ([sender selectedTag]) { case 0: [imgsv saveAsTiff: sender]; break; case 1: [imgsv saveAsEPS: sender]; break; case 2: [imgsv saveAsType: Type_bmp]; break; case 3: if ((p = [imgsv saveAsGif: NULL]) != NULL) { [imgsv free]; cinf = [[tw toyView] commonInfo]; if (cinf->type == Type_eps) [imageOpCtr newBitmap: self]; [imageOpCtr reduce: self]; tw = (ToyWin *)[self keyWindow]; imgsv = [[self allocImageSave] initWithWin: tw]; (void)[imgsv saveAsGif: p]; } break; case 4: [imgsv saveAsType: Type_jpg]; break; case 5: [imgsv saveAsType: Type_jbg]; break; case 6: [imgsv saveAsType: Type_ppm]; break; case 7: [imgsv saveAsXBM: sender]; break; case 8: [imgsv saveAsPng: sender]; break; } [imgsv free]; return self; } /****** Info.Panel attraction *************************/ - attraction: sender { static int cnt = 0; if ((++cnt & 0x7) == 0) { [sender setType: NX_TOGGLE]; [sender setState: 1]; }else { [sender setType: NX_MOMENTARYPUSH]; [sender setState: 0]; } return self; } #ifdef ToyViewer2_5 - attraction: sender { NXRect wrct, brct; NXPoint pnt[2]; NXImage *img; id ws, win; img = [sender image]; [sender getFrame:&brct]; [(win = [sender window]) getFrame:&wrct]; pnt[0].x = wrct.origin.x + brct.origin.x + 4; pnt[0].y = wrct.origin.y + brct.origin.y + 4; [[NXApp appIcon] getFrame:&wrct]; pnt[1].x = wrct.origin.x + 8; pnt[1].y = wrct.origin.y + 8; ws = [Application workspace]; [win performClose: self]; [ws slideImage:img from:&pnt[0] to:&pnt[1]]; sleep(1); [ws slideImage:img from:&pnt[1] to:&pnt[0]]; [win makeKeyAndOrderFront: self]; return self; } #endif @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.