This is ToyWin.m in view mode; [Download] [Up]
#import <appkit/Application.h> #import <appkit/publicWraps.h> #import <appkit/Control.h> #import <appkit/TextField.h> #import <appkit/ScrollView.h> #import <appkit/Panel.h> #import <appkit/graphics.h> #import <stdio.h> #import <stdlib.h> #import <string.h> #import "ToyWin.h" #import "ToyView.h" #import "TVController.h" #import "strfunc.h" #define MiniIcon "miniwin.tiff" #define DiffStep 18.0 #define MinWinXSIZE 120.0 #define MinWinYSIZE 32.0 #define MinResizeXSIZE 200.0 #define MinResizeYSIZE 150.0 #define FixedXPos 280.0 #define FixedYPos 12.0 @implementation ToyWin /* extern */ BOOL displayOverKeyWindowFlag = NO; + (BOOL)displayOverKeyWindow:(BOOL)flag { BOOL old = displayOverKeyWindowFlag; displayOverKeyWindowFlag = flag; return old; } - init { parental = nil; operation = 0; scaleFactor = 1.0; imageFilename = NULL; miniFlag = mini_YET; makeMapOnly = NO; return self; } - init: parent by:(int)op { [self init]; [NXApp loadNibSection:"ToyWin.nib" owner:self]; [thiswindow setFreeWhenClosed: YES]; parental = parent; operation = op; return self; } - initMapOnly { /* An instance of ToyWin initialized by this method does not display a window. It is used to make the bitmap of a image file to support pasteboard service. */ [self init]; makeMapOnly = YES; return self; } - free { // printf("FREE(%s)\n", imageFilename); if (imageFilename) free((void *)imageFilename); if (scalePanel) [scalePanel free]; [super free]; return nil; } - (const char *)filename { return (const char *)imageFilename; } - resetFilename:(const char *)fileName { if (imageFilename) free((void *)imageFilename); imageFilename = str_dup(fileName); [thiswindow setTitleAsFilename: imageFilename]; return self; } - (Window *)window { return thiswindow; } - toyView { return [scView docView]; } - parent { return parental; } - (int)madeby { return operation; } /* ---------------------------------------------------------------- ¡ü¥¦¥£¥ó¥É¥¦¥µ¥¤¥º·èÄêÊý¿Ë ¢¦½é´ü²½»þ ¡¦É½¼¨¥µ¥¤¥º ²èÁü¤ÎÂ礤µ¤Ë¹ç¤ï¤»¤ë¡£ ¤¿¤À¤·¡¢¥¹¥¯¥ê¡¼¥óÉý¤è¤ê²èÁüÉý¤¬Â礤¤¾ì¹ç¤Ï¥¹¥¯¥ê¡¼¥óÉý¡£ ¹â¤µ¤âƱÍÍ¡£ ¤Þ¤¿¡¢¤·¤¤¤ÃÍ(MinWinXSIZE=120, MinWinYSIZE=32)¤è¤ê¾®¤µ¤¤ ¾ì¹ç¤Ï¤·¤¤¤Ãͤò»È¤¦¡£ ¡¦É½¼¨°ÌÃÖ atpoint¤Î°ÌÃÖ¤Ëɽ¼¨¡£NULL¤Ê¤é¥¦¥£¥ó¥É¥¦¤ÎÈÖ¹æ¤Ë¤è¤Ã¤Æ·èÄê¡£ ¤¿¤À¤·¡¢¥¹¥¯¥ê¡¼¥óÉý¤è¤ê²èÁüÉý¤¬Â礤¤¾ì¹ç¤Ïº¸Ã¼¡£ ¥¹¥¯¥ê¡¼¥ó¹â¤è¤ê²èÁü¹â¤¬Â礤¤¾ì¹ç¤Ï¾åü¡£ ¡¦¥ê¥µ¥¤¥º¤ÎºÇÂ祵¥¤¥º ²èÁü¼«ÂΤÎÂ礤µ¤Ë¹ç¤ï¤»¤ë¡£ ¡Êº£¤Î¤È¤³¤í¡¢¥¹¥¯¥ê¡¼¥ó¤ÎÂ礤µ¤Ç²¡¤µ¤¨¤ë¤³¤È¤Ï¤·¤Ê¤¤¡Ë ¡¦¥ê¥µ¥¤¥º¤ÎºÇ¾®¥µ¥¤¥º Äê¿ô(MinResizeXSIZE=200, MinResizeYSIZE=150)¤È¤¹¤ë¡£ ¤¿¤À¤·¡¢¤³¤ì¤è¤ê²èÁü¤¬¾®¤µ¤¤¾ì¹ç¤Ï²èÁü¤Ë¹ç¤ï¤»¤ë¡£ ¢¦¥¤¥á¡¼¥¸¤Î¥ê¥µ¥¤¥º»þ ¡¦É½¼¨¥µ¥¤¥º ¸µ¤è¤êÂ礤¯¤Ê¤Ã¤¿¾ì¹ç¤ÏÊѲ½¤Ê¤·¡£ ¾®¤µ¤¯¤Ê¤Ã¤¿¾ì¹ç¤Ç¡¢¸µ¤Î¥¦¥£¥ó¥É¥¦¤Ç¤ÏÂ礤¤¾ì¹ç¤Ï¾å¤Îµ¬Â§ ¤Ë¤è¤Ã¤ÆÊѲ½¤µ¤»¤ë¡£ ¡¦É½¼¨°ÌÃÖ ÊѲ½¤Ê¤·¡£ ¡¦¥ê¥µ¥¤¥º¤ÎºÇÂ硦ºÇ¾®¥µ¥¤¥º ¸µ¤Î¥µ¥¤¥º¤¬¾å¤Î¡Ö¥ê¥µ¥¤¥º¤ÎºÇ¾®¥µ¥¤¥º¡×¤è¤ê¾®¤µ¤¤¾ì¹ç¤Ï ¤½¤ì¤òºÇ¾®¥µ¥¤¥º¤È¤¹¤ë¡£ ¤½¤ì°Ê³°¤Ï¾å¤ÎÄ̤ꡣ ---------------------------------------------------------------- */ #define loc_INIT 0 /* Window is initialized */ #define loc_RESZ 1 /* Window is resized */ #define loc_SPEC 2 /* Window is initialized */ /* and displayed at specified point */ /* Local Method */ - locateWindow: (int)width : (int)height by:(int)is_init : (NXPoint *)atpoint; /* width, height ¥¤¥á¡¼¥¸¤ÎÂ礤µ */ { NXSize screenSize; NXSize req; /* ¥¤¥á¡¼¥¸¤ò´Ý¤´¤Èɽ¼¨¤Ç¤¤ëÂ礤µ */ NXSize rsmin; /* ¥ê¥µ¥¤¥º¤ÎºÇ¾®¥µ¥¤¥º */ NXRect orig; /* ¸½ºß¤Î¥¦¥£¥ó¥É¥¦¤Î¾öÊó */ NXRect wrect; double xp, yp; /* ¥¦¥£¥ó¥É¥¦°ÌÃÖ */ static int winCounter = 6; /* because small window is under the menu */ [NXApp getScreenSize: &screenSize]; req.width = ((MinWinXSIZE > width) ? MinWinXSIZE : width) + 23.0; req.height = ((MinWinYSIZE > height) ? MinWinYSIZE : height) + 74.0; rsmin.width = (req.width < MinResizeXSIZE) ? req.width : MinResizeXSIZE; rsmin.height = (req.height < MinResizeYSIZE) ? req.height : MinResizeYSIZE; wrect.size = req; if (is_init == loc_RESZ) { [thiswindow getFrame: &orig]; wrect.origin = orig.origin; if (req.width > orig.size.width) wrect.size.width = orig.size.width; if (req.height >= orig.size.height) wrect.size.height = orig.size.height; else wrect.origin.y += orig.size.height - wrect.size.height; if (orig.size.width < rsmin.width) rsmin.width = orig.size.width; if (orig.size.height < rsmin.height) rsmin.height = orig.size.height; }else { screenSize.width -= 64.0; if (is_init == loc_INIT || atpoint == NULL) { int xm = 13, ym = 15; if (screenSize.height <= 600.0) xm = 7, ym = 9; xp = (req.width > screenSize.width) ? 0.0 : (120.0 + (winCounter % xm) * DiffStep); yp = (req.height > screenSize.height) ? 0.0 : (20.0 + (winCounter % ym) * DiffStep); }else { /* loc_SPEC */ double w; xp = atpoint->x; yp = screenSize.height - atpoint->y; if (xp < 0) xp = 0.0; else if (xp > (w = screenSize.width - MinResizeXSIZE)) xp = w; if (yp < 0) yp = 0.0; else if (yp > (w = screenSize.height - MinResizeYSIZE)) yp = w; } if (xp + req.width > screenSize.width) wrect.size.width = screenSize.width - xp; if (yp + req.height > screenSize.height) wrect.size.height = screenSize.height - yp; wrect.origin.x = xp; yp = screenSize.height - wrect.size.height - yp; wrect.origin.y = (yp > 0.0) ? yp : 0.0; winCounter++; } [thiswindow placeWindow: &wrect]; [thiswindow setMaxSize: &req]; [thiswindow setMinSize: &rsmin]; return self; } /* Scroll image to be top & center */ - scrollProperly { NXSize imgsz; NXRect wrect; NXPoint scorig; int xp, yp; id tv; tv = [self toyView]; [[tv image] getSize: &imgsz]; [scView getDocVisibleRect: &wrect]; scorig.x = ((xp = imgsz.width - wrect.size.width) > 0) ? (xp / 2) : 0; scorig.y = ((yp = imgsz.height - wrect.size.height) > 0) ? yp : 0; if (xp > 0 || yp > 0) [tv scrollPoint: &scorig]; return self; } #define FilenameLimit 120 static void stripHistory(char *buf) { int n, lx, rx; if ((n = strlen(buf)) < FilenameLimit || buf[n-1] != ')') return; for (rx = n-1; buf[rx] != '('; ) if (--rx <= 0) return; for (lx = 0; buf[lx] != '('; ) if (++lx >= n) return; if (lx == rx) return; if (lx > 0 && buf[lx-1] != '_') buf[lx++] = '_'; while (lx <= n) buf[lx++] = buf[rx++]; } - initLocateWindow:(const char *)fileName width:(int)width height:(int)height { ToyWin *keytw; BOOL hasKey; NXPoint point; NXRect rect; imageFilename = str_dup(fileName); stripHistory(imageFilename); keytw = [theController keyWindow]; hasKey = (keytw != nil && keytw->miniFlag != mini_MINI); if (displayOverKeyWindowFlag) { if (hasKey) { [[keytw window] getFrame: &rect]; point = rect.origin; point.y += rect.size.height; }else { NXSize screenSize; [NXApp getScreenSize: &screenSize]; point.x = FixedXPos; point.y = screenSize.height - FixedYPos; } [self locateWindow: width : height by:loc_SPEC : &point]; }else [self locateWindow: width : height by:loc_INIT : NULL]; [thiswindow setTitleAsFilename: imageFilename]; if (hasKey) [thiswindow orderWindow:NX_BELOW relativeTo:[[keytw window] windowNum]]; else [thiswindow orderFront: self]; NXPing(); [thiswindow display]; return self; } /* Local */ - Do_reScale: (float)factor { float r; NXSize *sz; BOOL showmsg; r = (scaleFactor > factor) ? (scaleFactor / factor):(factor / scaleFactor); if (r < 1.0025) return self; sz = [[self toyView] resize: factor]; if (sz == NULL) { NXBeep(); return self; } scaleFactor = factor; showmsg = (r > 1.7 || (sz->width * sz->height) > 60000); if (showmsg) [theController messageDisplay:"Resizing..."]; [self locateWindow: sz->width : sz->height by:loc_RESZ : NULL]; // DON'T -> [scView sizeTo: sz->width + 21.0 : sz->height + 21.0]; [self scrollProperly]; [thiswindow display]; if (showmsg) [theController messageDisplay:NULL]; return self; } /* Local */ - select_reScale: sender { static float scale[13] = { 0.0, /* never */ 4.0, 3.0, 2.0, 1.5, 1.2, 1.0, 0.86603, 0.7071, 0.5, 0.33333, 0.25, 0.125 }; return [self Do_reScale: scale[[sender selectedTag]]]; } /* Local */ - setScaleValue:(float)val { char buf[24]; int i = val * 100.0; int f = (val * 100.0 - (float)i) * 10.0 + 0.5; if (f) sprintf(buf, "%d.%01d", i, f); else sprintf(buf, "%d", i); [scaleText setStringValue: buf]; return self; } - reScale: sender { if ([sender selectedTag] == 0) { /* Set... */ [self setScaleValue: scaleFactor]; [scalePanel makeKeyAndOrderFront: self]; [scaleText selectText:self]; }else { [scalePanel close]; [self perform:@selector(select_reScale:) with:sender afterDelay: 5 cancelPrevious: YES]; } return self; } #ifdef OLD_VERSIONS - fitScale: sender { NXSize screenSize, *sz; float wf, hf, sc; [NXApp getScreenSize: &screenSize]; sz = [[self toyView] originalSize]; wf = screenSize.width / sz->width; hf = screenSize.height / sz->height; sc = ([sender selectedTag] == 0) ? ((wf < hf) ? wf : hf) /* Entire Image */ : ((wf > hf) ? wf : hf); /* Cover Screen */ return [self setScaleValue: sc]; } #endif /* OLD_VERSIONS */ - setScale: sender { if ([sender selectedTag] == 0) { float f = (int)([scaleText floatValue] * 1000.0 + 0.5) / 100000.0; [scalePanel close]; if (f >= 0.01 && f <= 100.0) [self Do_reScale: f]; }else [scalePanel close]; return self; } - windowWillMiniaturize:sender toMiniwindow:miniwindow { [[self toyView] clearDraggedLine]; if (miniFlag == mini_YET) [thiswindow setMiniwindowIcon: MiniIcon]; miniFlag = mini_MINI; return self; } - windowDidDeminiaturize:sender { miniFlag = mini_DEMINI; return self; } - windowWillClose:sender { // printf("Window will be freed\n"); [theController checkWindow: self delete: YES]; [scView free]; [thiswindow setDelegate: nil]; [self free]; return thiswindow; } - windowDidBecomeKey:sender { id tv = [self toyView]; [thiswindow makeFirstResponder: tv]; [tv setDraggedLine: self]; return self; } - windowDidExpose:sender { [[self toyView] setDraggedLine: self]; return self; } - windowDidMove:sender { [[self toyView] setDraggedLine: self]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.