This is UHInspector.m in view mode; [Download] [Up]
#import "UHInspector.h" #import "uhInspection.h" //inspection protocols @implementation UHInspector - init { id bundle; char path[MAXPATHLEN+1]; [super init]; /* Assumption is that the nib file is in the same bundle from which the inspector class was loaded. This could be the main bundle, or it could be a dynamically loaded bundle. */ bundle=[NXBundle bundleForClass:[self class]]; [bundle getPath:path forResource:[self name] ofType:"nib"]; [NXApp loadNibFile:path owner:self]; /* We want the panel to float forward, and not to stick around. */ [[inspectorPanel setFloatingPanel:YES] setHideOnDeactivate:YES]; return self; } /* To inspect a single object, without specifying the requestor. */ - inspect:anObject { return [self inspect:anObject requestor:nil]; } /* Inspect a single object, requestor gets notification of inspection. */ - inspect:anObject requestor:aRequestor { object=anObject; //save object to be inspected /* If object wants to know its inspector, tell it... */ if(object && [object respondsTo:@selector(setInspector:)]) [object setInspector:self]; /* If the object instance has a label, use it as the title of the panel. */ if(object && [object respondsTo:@selector(label)]) [inspectorPanel setTitle:[object label]]; /* ...else if item specifies a label for the inspector, use it. */ else if([object respondsTo:@selector(getLabelForInspector)]) [inspectorPanel setTitle:[object getLabelForInspector]]; objectList=nil; requestor=aRequestor; //save object to be notified of changes [self doRevert:self]; //init the panel to object's current values return self; } /* To inspect an object list, without specifying the requestor. */ - inspectList:aList { return [self inspectList:aList requestor:nil]; } /* Inspect an object list, requestor gets notification of inspection. */ - inspectList:aList requestor:aRequestor { objectList=aList; object=[aList objectAt:0]; requestor=aRequestor; //save object to be notified of changes [self doRevert:self]; //init the panel to first object's values return self; } /* Simply returns the current object being inspected. */ - object { return object; } /* Connect inspector panel's controls to this method. It calls doOk: */ - ok:sender { /* If a list of objects, call doOk: in a loop for each object in the list. */ if(objectList){ int i; for(i=0; i<[objectList count]; i++){ object=[objectList objectAt:i]; [self doOk:sender]; //call the method implemented by the subclass } if(requestor && [requestor respondsTo:@selector(objectListWasInspected:)]) [requestor objectListWasInspected:objectList]; } /* If a single object, simply doOk: for it. */ else{ [self doOk:sender]; //call the method implemented by the subclass if(requestor && [requestor respondsTo:@selector(objectWasInspected:)]) [requestor objectWasInspected:object]; } return self; } /* Never call this method, but override to implement it in the subclass. */ - doOk:sender { return self; } /* If you use a Revert button on the panel, connect it to this method. */ - revert:sender { [self doRevert:sender]; return self; } /* Never call this method, but override to implement it in the subclass. */ - doRevert:sender { return self; } /* Returns the single view in which all of the panel's controls should be grouped. Connect to this view, usually a Box, in IB. */ - inspectorView { return inspectorView; } /* Returns the inspector panel itself. Connect in IB. */ - inspectorPanel { return inspectorPanel; } /* Call this method to actually order the inspector panel forward. */ - showInspector:sender { [inspectorPanel makeKeyAndOrderFront:self]; return self; } /* Default is that we do not want Revert and OK buttons. */ - (BOOL)wantsButtons { return NO; } /* Free the panel with this inspector. */ - free { [inspectorPanel free]; return [super free]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.