This is Inspector.m in view mode; [Download] [Up]
{\rtf0\ansi{\fonttbl\f0\fmodern Courier;\f1\ftech Symbol;\f2\fmodern Ohlfs;}
\margl40
\margr40
{\colortbl;\red0\green0\blue0;}
\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b0\i0\ulnone\fs24\fc0\cf0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\i
\b FILENAME
\b0 :
\b\i0 Inspector.m \
\b0 //
\i
\b SUMMARY
\b0 :
\b\i0 Implementation of a NeXTSTEP-style inspector using <Inspectable>\
\b0 //
\b\i SUPERCLASS
\b0 :
\i0
\b Object:Inspector
\b0 \
//
\b\i PROTOCOLS
\b0 :
\i0
\b <Inspectable>
\b0 \
//
\b\i INTERFACE
\b0 :
\i0
\b Inspector.nib
\b0 \
//
\b\i AUTHOR
\b0 :
\b\i0 Rohit Khare
\b0 \
//
\b\i COPYRIGHT
\b0 :
\f1\i0 Ó
\f0\b 1993,94 California Institure of Technology, eText Project\
\b0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b\i Implementation Comments
\b0\i0 \
// Still uses the neato self-inspection trick for "No Selection"\
// This panel uses Andrew Stone's WidePopUpManager to mediate.\
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b\i History
\b0\i0 \
// 10/30/93:
\b Added refresh: (see setDocPath in eTDocInfo)
\b0 \
// 10/30/93:
\b Removed invalidate: (Obsolete, not called)
\b0 \
// 10/30/94:
\b Modified to implement <InspectorTarget> protocol.
\b0 \
// 09/27/94:
\b Revamped for eText5; added WidePopupManager.
\b0 \
// 02/04/94:
\b Modified invalidate to "tunnel" through to display etDocInfoUI
\b0 \
// 01/12/94:
\b Reworked header file dependency
\b0 \
// 08/22/93:
\b Added invalidate:
\b0 \
// 08/18/93:
\b Created. Derived almost wholly from Version 1.0
\b0 \
//
\i Version 1.0 tracking notes:
\i0 \
// 06/29/93:
\b Added conformance for touch (currentDoc)
\b0 \
// 06/27/93:
\b Created (Rohit Khare)
\b0 \
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b Imported Interfaces
\b0 \
//\
#import "
\b Inspector.h
\b0 "\
#import "
\b Kludges
\b0 .subproj/
\b WidePopupManager.h
\b0 "\
\
\i @implementation Inspector\
\i0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b Class Management
\b0 \
//\
-
\b init
\b0 \{\
[
\b super
\b0
\b init
\b0 ];\
\b current
\b0 =
\b nil
\b0 ;\
\b currentTarget
\b0 =
\b nil
\b0 ;\
\b currentView
\b0 =
\b nil
\b0 ;\
\b currentType
\b0 =
\b NULL
\b0 ;\
\b typesForInspector
\b0 =
\b NULL
\b0 ;\
[NXApp
\b loadNibSection
\b0 :"
\b Inspector
\b0 .
\b nib
\b0 "
\b owner
\b0 :
\b self
\b0 withNames:NO];\
\i //if ([[NXApp userModel] boolQuery:"InspectorFloat"])\
\i0 [panel
\b setFloatingPanel
\b0 :
\b YES
\b0 ];\
[panel
\b setExcludedFromWindowsMenu
\b0 :
\b YES
\b0 ];\
[panel
\b setFrameAutosaveName
\b0 :"
\b etInspectorPanel
\b0 "];\
[panel setFrameUsingName:"etInspectorPanel"];\
[self
\b inspect
\b0 :
\b self
\b0 ];\
\b return self
\b0 ;\
\}\
\
-
\b free
\b0 \{\
panel = [
\b panel
\b0 free];\
invalidPanel = [
\b invalidPanel
\b0 free];\
infoPanel = [
\b infoPanel
\b0 free];\
return self = [
\b super
\b0 free];\
\}\
\
-
\b awakeFromNib
\b0 \{\
\b cover
\b0 =
\b popup
\b0 ;\
\b if
\b0 (
\b !
\b0 [
\b popup
\b0
\b isKindOf
\b0 :[
\b PopUpList
\b0 class]])
\b popup
\b0 = [
\b popup
\b0
\b target
\b0 ];\
[[
\b popup
\b0 setTarget:self]
\b setAction
\b0 :@selector(
\b swap
\b0 :)];\
\fc1\cf1 [[
\b WidePopupManager
\b0 alloc]
\b initForButton
\b0 :cover
\b andList
\b0 :popup];\
\fc0\cf0
\b invalidView
\b0 = [invalidPanel
\b contentView
\b0 ];\
\b infoView
\b0 = [infoPanel
\b contentView
\b0 ];\
return self;\
\}\
\
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b User Interface
\b0 \
//\
-
\b showInspector
\b0 \{\
[
\b panel
\b0
\b makeKeyAndOrderFront
\b0 :self];\
return self;\
\}\
\
-
\b swap
\b0 :sender \{\
\b if
\b0 (
\b strcmp
\b0 ([popup
\b selectedItem
\b0 ],
\b currentType
\b0 )) \{\
[panel
\b disableDisplay
\b0 ]; //
\i Disable display
\i0 \
[
\b current
\b0
\b resignInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ];\
[
\b currentView
\b0
\b removeFromSuperview
\b0 ];\
//
\i Swap in the view for the selected cell of the popup
\i0 \
\b currentType
\b0 = (char *) [popup
\b selectedItem
\b0 ];\
\b currentView
\b0 = [
\b current
\b0
\b inspectorForType
\b0 :
\b currentType
\b0 ];\
[
\b currentView
\b0
\b sizeTo
\b0 :INSPECTOR_W :INSPECTOR_H];\
[[panel contentView]
\b addSubview
\b0 :
\b currentView
\b0 ];\
[
\b current
\b0
\b activateInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ];\
[panel
\b reenableDisplay
\b0 ]; //
\i Reenable display
\i0 \
[panel
\b display
\b0 ];\
\}\
\b if
\b0 (
\b strcmp
\b0 ([popup
\b selectedItem
\b0 ], [cover
\b title
\b0 ])) \{\
[cover
\b setTitle
\b0 :[popup
\b selectedItem
\b0 ]];\
\}\
return self;\
\}\
\
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b Public Inspector API
\b0 \
//\
\
-
\b inspect
\b0 :
\b newObj
\b0 \{ //
\i Can be
\i0 <
\b Inspectable
\b0 >
\i or
\i0 <
\b InspectableTarget
\b0 >
\i ;\
\i0 int i,j;\
char **
\b types
\b0 ;\
char str[256];\
\
if (
\b newObj
\b0 ==
\b nil
\b0 )
\b newObj
\b0 =
\b self
\b0 ; //
\i Sanity Check: is this a nil object?\
\i0 //
\i Sanity Check: is this a new target or
\i0 <InspectableTarget>
\i object?
\i0 \
if (([
\b newObj
\b0
\b respondsTo
\b0 :@selector(
\b inspectableDelegate
\b0 )] \
&& (
\b newObj == currentTarget
\b0 ))\
|| (
\b newObj
\b0 ==
\b current
\b0 ))\
\b return
\b0 self;\
\
[panel
\b disableDisplay
\b0 ]; //
\i Disable display
\i0 \
[
\b current
\b0
\b resignInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ];\
if ([
\b currentView
\b0
\b window
\b0 ] ==
\b panel
\b0 )\
[currentView
\b removeFromSuperview
\b0 ]; \
i = [popup
\b count
\b0 ]; //
\i Empty out the current popup
\i0 \
for (j = 0; j < i; j++) [popup
\b removeItemAt
\b0 :
\b j
\b0 ];\
\
//
\i Now reset current, currentTarget, potentially using <InspectableTarget>\
\i0 if ([
\b newObj
\b0
\b respondsTo
\b0 :@selector(
\b inspectableDelegate
\b0 )]) \{\
\b current
\b0 = [
\b newObj
\b0
\b inspectableDelegate
\b0 ];\
\b currentTarget
\b0 =
\b newObj
\b0 ;\
\} else \{\
\b current
\b0 =
\b newObj
\b0 ;\
\b currentTarget
\b0 =
\b nil
\b0 ;\
\}\
\
\b types
\b0 = (char **)[
\b current
\b0
\b types
\b0 ];\
i = 0;\
while (types[i]) \{ //
\i Load in the new popup with names and actions\
\i0 [[
\b popup
\b0
\b addItem
\b0 :NXUniqueString(
\b types[i]
\b0 )] \
\b setKeyEquivalent
\b0 :(i < 5) ? ('
\b 5
\b0 '+
\b i
\b0 ) : '
\b \\0
\b0 '];\
i++;\
\}\
[
\b cover
\b0
\b setTitle
\b0 :
\b types
\b0 [
\b 0
\b0 ]]; //
\i Load in the default inspector
\i0 \
[[
\b popup
\b0 itemList]
\b selectCellAt
\b0 :
\b 0
\b0 :0];\
\b currentType
\b0 = (char *)
\b types
\b0 [
\b 0
\b0 ];\
\b currentView
\b0 = [current
\b inspectorForType
\b0 :
\b currentType
\b0 ];\
[currentView
\b sizeTo
\b0 :INSPECTOR_W :INSPECTOR_H];\
[[panel contentView]
\b addSubview
\b0 :currentView];\
[current
\b activateInspector
\b0 :
\b currentView
\b0 ofType:currentType];\
sprintf(str, "
\b %s Inspector
\b0 ", [current
\b inspectorTitle
\b0 ]);\
[
\b panel
\b0
\b setTitle
\b0 :NXUniqueString(
\b str
\b0 )];\
//[self
\b showInspector
\b0 ]; //
\i Redisplay
\i0 \
[[panel
\b reenableDisplay
\b0 ]
\b display
\b0 ];\
return self;\
\}\
\
-
\b invalidate
\b0 \{ //
\i Obsolete! Not called in kernel, comp. warnings\
\i0 id it;\
\
if (
\b current
\b0 ==
\b self
\b0 )
\b return
\b0 self;\
if (
\b it
\b0 =[[[NXApp mainWindow] delegate]
\b etDoc
\b0 ])\{\
[
\b it
\b0
\b setSelectedObj
\b0 :
\b nil
\b0 ];\
[self
\b inspect
\b0 :[
\b it
\b0
\b selectedObj
\b0 ]];\
\}
\b else
\b0 \{\
[self
\b inspect
\b0 :
\b nil
\b0 ];\
\}\
return self;\
\}\
\
-
\b currentObj
\b0 \{
\b return
\b0 (
\b currentTarget
\b0 ?
\b currentTarget
\b0 :
\b current
\b0 );\}\
\
-
\b makeFirstResponder
\b0 :aView \{\
\b return
\b0 (([[panel
\b contentView
\b0 ]
\b findAncestorSharedWith
\b0 :
\b aView
\b0 ] == panel) ? [
\b panel
\b0
\b makeFirstResponder
\b0 :aView] :
\b nil
\b0 );\
\}\
\
-
\b refresh
\b0 \{\
[
\b current
\b0
\b activateInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ]; return self;\}\
\
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b Private Inspector API
\b0 \
//\
-
\b freeze
\b0 \{\
[panel
\b disableDisplay
\b0 ];\
[
\b current
\b0
\b resignInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ];\
return self;\
\}\
-
\b thaw
\b0 \{\
[
\b current
\b0
\b activateInspector
\b0 :
\b currentView
\b0
\b ofType
\b0 :
\b currentType
\b0 ];\
[[panel
\b reenableDisplay
\b0 ]
\b display
\b0 ];\
return self;\
\}\
\
//ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\
//
\b Introspection: <Inspectable> Obligations
\b0 \
//\
#define
\b NOSEL
\b0 "
\b No Selection
\b0 "\
#define
\b INFO
\b0 "
\b Info
\b0 "\
\
- (const NXAtom *)
\b types
\b0 \{\
if (
\b !typesForInspector
\b0 ) \{\
\b typesForInspector
\b0 =
\b malloc
\b0 (
\b 3
\b0 *sizeof(char *));\
typesForInspector[0] = (char *) NXUniqueString(
\b NOSEL
\b0 );\
typesForInspector[1] = (char *) NXUniqueString(
\b INFO
\b0 );\
typesForInspector[2] =
\b NULL
\b0 ;\
\}\
return
\b typesForInspector
\b0 ;\
\}\
\
-
\b inspectorForType
\b0 :(const char *)
\b type
\b0 \{\
if(
\b !strcmp
\b0 (type,NXUniqueString(
\b NOSEL
\b0 )))\
return
\b invalidView
\b0 ;\
else if (
\b !strcmp
\b0 (type,NXUniqueString(
\b INFO
\b0 )))\
return
\b infoView
\b0 ;\
NXLogError("
\b Massive Inspector Failure: Asked Inspector for: %s
\b0 ",
\b type
\b0 );\
return
\b invalidView
\b0 ;\
\}\
\
-
\b resignInspector
\b0 : (View *) oldInspector
\b ofType
\b0 : (const char *) type \{\
\b return
\b0 self;\}\
\
-
\b activateInspector
\b0 : (View *) newInspector
\b ofType
\b0 : (const char *) type \{\
\b return
\b0 self;\}\
\
- (const char *)
\b inspectorTitle
\b0 \{return NXUniqueString("
\b eText
\b0 ");\}\
\
@end
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.