This is IPFlyPanel.m in view mode; [Download] [Up]
#import "IPFlyPanel.h" @interface View (IPFlyHack) - getIconifyButton; @end @interface IPFlyPanel (IPFlyPanelPrivateMethods) - _syncIconifyButton; @end static const char *PANELPREFIX = "IPFLYPANEL"; @implementation IPFlyPanel - initContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag { [super initContent:contentRect style:aStyle backing:bufferingType buttonMask:mask defer:flag]; if([_borderView respondsTo:@selector(getIconifyButton)] && [_borderView getIconifyButton] != nil){ [[_borderView getIconifyButton] setType:NX_TOGGLE]; [[_borderView getIconifyButton] setIcon:"fly.tiff"]; [[_borderView getIconifyButton] setAltIcon:"flyH.tiff"]; } _floatingName = NULL; return self; } - free { NX_FREE(_floatingName); return [super free]; } - _syncIconifyButton { if ( [_borderView respondsTo:@selector(getIconifyButton)] && [_borderView getIconifyButton] != nil ) { [[_borderView getIconifyButton] setState:[self isFloatingPanel]]; [[_borderView getIconifyButton] update]; } return self; } - miniaturize:sender { [super setFloatingPanel:![self isFloatingPanel]]; if(_floatingName != NULL) [self saveFloatingUsingName:_floatingName]; return self; } - setFloatingPanel:(BOOL)flag { [super setFloatingPanel:flag]; [self _syncIconifyButton]; if(_floatingName != NULL) [self saveFloatingUsingName:_floatingName]; return self; } - (BOOL)setFloatingAutosaveName:(const char *)name { if(name != NULL){ if(_floatingName) _floatingName = (char *)NXZoneRealloc([self zone], _floatingName, strlen(name) + 1); else _floatingName = (char *)NXZoneMalloc([self zone], strlen(name) + 1); strcpy(_floatingName, name); if(![self setFloatingUsingName:_floatingName]) [self saveFloatingUsingName:_floatingName]; } else { if(_floatingName) NX_FREE(_floatingName); _floatingName = NULL; } return YES; } - (BOOL)setFloatingAutosaveLikeFrameName { return [self setFloatingAutosaveName:[self frameAutosaveName]]; } - (const char *)floatingAutosaveName { return _floatingName; } - (void)saveFloatingUsingName:(const char *)name { char *fname; if(name != NULL){ fname = (char *)NXZoneMalloc([self zone], strlen(name) + strlen(PANELPREFIX) + 1); strcpy(fname, PANELPREFIX); strcat(fname, name); if([self isFloatingPanel]) NXWriteDefault([NXApp appName], fname, "1"); else NXWriteDefault([NXApp appName], fname, "0"); NX_FREE(fname); } } - (BOOL)setFloatingUsingName:(const char *)name { const char *state; char *fname; if(name != NULL){ fname = (char *)NXZoneMalloc([self zone], strlen(name) + strlen(PANELPREFIX) + 1); strcpy(fname, PANELPREFIX); strcat(fname, name); state = NXGetDefaultValue([NXApp appName], fname); NX_FREE(fname); if(state != NULL){ [super setFloatingPanel:atoi( state )]; [self _syncIconifyButton]; return YES; } } return NO; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.