[etoys-notify] Etoys: PackageInfo-Base-bf.42.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Apr 25 21:09:35 EDT 2010


Bert Freudenberg uploaded a new version of PackageInfo-Base to project Etoys:
http://source.squeak.org/etoys/PackageInfo-Base-bf.42.mcz

==================== Summary ====================

Name: PackageInfo-Base-bf.42
Author: bf
Time: 19 April 2010, 2:59:54.127 am
UUID: 78ff57ba-4f49-4046-a25a-274c29fa036e
Ancestors: PackageInfo-Base-bp.41

- rename a temp shadowing an inst var

==================== Snapshot ====================

SystemOrganization addCategory: #'PackageInfo-Base'!

(PackageInfo named: 'PackageInfo-Base') postscript: 'nil'!

----- Method: MethodReference>>sourceCode (in category '*packageinfo-base') -----
sourceCode
	^ self actualClass sourceCodeAt: methodSymbol!

----- Method: Character>>escapeEntities (in category '*packageinfo-base') -----
escapeEntities
	#($< '&lt;' $> '&gt;' $& '&amp;') pairsDo:
		[:k :v |
		self = k ifTrue: [^ v]].
	^ String with: self!

----- Method: Collection>>gather: (in category '*packageinfo-base') -----
gather: aBlock
	^ Array streamContents:
		[:stream |
		self do: [:ea | stream nextPutAll: (aBlock value: ea)]]!

Object subclass: #PackageInfo
	instanceVariableNames: 'packageName methodCategoryPrefix preamble postscript preambleOfRemoval postscriptOfRemoval'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'PackageInfo-Base'!
PackageInfo class
	instanceVariableNames: 'default'!

!PackageInfo commentStamp: '<historical>' prior: 0!
Subclass this class to create new Packages.!
PackageInfo class
	instanceVariableNames: 'default'!

----- Method: PackageInfo class>>allPackages (in category 'packages access') -----
allPackages
	^PackageOrganizer default packages!

----- Method: PackageInfo class>>default (in category 'compatibility') -----
default
	^ self allPackages detect: [:ea | ea class = self] ifNone: [self new register]!

----- Method: PackageInfo class>>initialize (in category 'class initialization') -----
initialize
	self allSubclassesDo: [:ea | ea new register]!

----- Method: PackageInfo class>>named: (in category 'packages access') -----
named: aString
	^ PackageOrganizer default packageNamed: aString ifAbsent: [(self new packageName: aString) register]!

----- Method: PackageInfo class>>registerPackage: (in category 'as yet unclassified') -----
registerPackage: aString
	"for compatibility with old fileOuts"
	^ Smalltalk at: #FilePackageManager ifPresent: [:p | p registerPackage: aString]!

----- Method: PackageInfo class>>registerPackageName: (in category 'packages access') -----
registerPackageName: aString
	^ PackageOrganizer default registerPackageNamed: aString!

----- Method: PackageInfo>>= (in category 'comparing') -----
= other
	^ other species = self species and: [other packageName = self packageName]!

----- Method: PackageInfo>>addCoreMethod: (in category 'modifying') -----
addCoreMethod: aMethodReference
	| category |
	category := self baseCategoryOfMethod: aMethodReference.
	aMethodReference actualClass organization
		classify: aMethodReference methodSymbol
		under: category
		suppressIfDefault: false!

----- Method: PackageInfo>>addExtensionMethod: (in category 'modifying') -----
addExtensionMethod: aMethodReference
	| category |
	category := self baseCategoryOfMethod: aMethodReference.
	aMethodReference actualClass organization
		classify: aMethodReference methodSymbol
		under: self methodCategoryPrefix, '-', category!

----- Method: PackageInfo>>addMethod: (in category 'modifying') -----
addMethod: aMethodReference
	(self includesClass: aMethodReference class)
		ifTrue: [self addCoreMethod: aMethodReference]
		ifFalse: [self addExtensionMethod: aMethodReference]!

----- Method: PackageInfo>>allOverriddenMethods (in category 'listing') -----
allOverriddenMethods
	"search classes and meta classes"
	^ Array streamContents: [:stream |
		self allOverriddenMethodsDo: [:each | stream nextPut: each]]
!

----- Method: PackageInfo>>allOverriddenMethodsDo: (in category 'enumerating') -----
allOverriddenMethodsDo: aBlock
	"Evaluates aBlock with all the overridden methods in the system"
	^ ProtoObject withAllSubclassesDo: [:class | 
		self overriddenMethodsInClass: class do: aBlock]
!

----- Method: PackageInfo>>baseCategoryOfMethod: (in category 'modifying') -----
baseCategoryOfMethod: aMethodReference
	| oldCat oldPrefix tokens | 
	oldCat := aMethodReference category.
	({ 'as yet unclassified'. 'all' } includes: oldCat) ifTrue: [ oldCat := '' ].
	tokens := oldCat findTokens: '*-' keep: '*'.

	"Strip off any old prefixes"
	((tokens at: 1 ifAbsent: [ '' ]) = '*') ifTrue: [
		[ ((tokens at: 1 ifAbsent: [ '' ]) = '*') ]
			whileTrue: [ tokens removeFirst ].
		oldPrefix := tokens removeFirst asLowercase.
		[ (tokens at: 1 ifAbsent: [ '' ]) asLowercase = oldPrefix ]
			whileTrue: [ tokens removeFirst ].
	].

	tokens isEmpty ifTrue: [^ 'as yet unclassified'].
	^ String streamContents:
		[ :s |
		tokens
			do: [ :tok | s nextPutAll: tok ]
			separatedBy: [ s nextPut: $- ]]!

----- Method: PackageInfo>>category:matches: (in category 'testing') -----
category: categoryName matches: prefix
	| prefixSize catSize |
	categoryName ifNil: [ ^false ].
	catSize := categoryName size.
	prefixSize := prefix size.
	catSize < prefixSize ifTrue: [ ^false ].
	(categoryName findString: prefix startingAt: 1 caseSensitive: false) = 1
		ifFalse: [ ^false ].
	^(categoryName at: prefix size + 1 ifAbsent: [ ^true ]) = $-!

----- Method: PackageInfo>>categoryName (in category 'naming') -----
categoryName
	|category|
	category := self class category.
	^ (category endsWith: '-Info')
		ifTrue: [category copyUpToLast: $-]
		ifFalse: [category]!

----- Method: PackageInfo>>changeRecordForOverriddenMethod: (in category 'testing') -----
changeRecordForOverriddenMethod: aMethodReference
	| sourceFilesCopy method position |
	method := aMethodReference actualClass compiledMethodAt: aMethodReference methodSymbol.
	position := method filePosition.
	sourceFilesCopy := SourceFiles collect:
		[:x | x isNil ifTrue: [ nil ]
				ifFalse: [x readOnlyCopy]].
	[ | file prevPos prevFileIndex chunk stamp methodCategory tokens |
	method fileIndex == 0 ifTrue: [^ nil].
	file := sourceFilesCopy at: method fileIndex.
	[position notNil & file notNil]
		whileTrue:
		[file position: (0 max: position-150).  "Skip back to before the preamble"
		[file position < (position-1)]  "then pick it up from the front"
			whileTrue: [chunk := file nextChunk].

		"Preamble is likely a linked method preamble, if we're in
			a changes file (not the sources file).  Try to parse it
			for prior source position and file index"
		prevPos := nil.
		stamp := ''.
		(chunk findString: 'methodsFor:' startingAt: 1) > 0
			ifTrue: [tokens := Scanner new scanTokens: chunk]
			ifFalse: [tokens := Array new  "ie cant be back ref"].
		((tokens size between: 7 and: 8)
			and: [(tokens at: tokens size-5) = #methodsFor:])
			ifTrue:
				[(tokens at: tokens size-3) = #stamp:
				ifTrue: ["New format gives change stamp and unified prior pointer"
						stamp := tokens at: tokens size-2.
						prevPos := tokens last.
						prevFileIndex := sourceFilesCopy fileIndexFromSourcePointer: prevPos.
						prevPos := sourceFilesCopy filePositionFromSourcePointer: prevPos]
				ifFalse: ["Old format gives no stamp; prior pointer in two parts"
						prevPos := tokens at: tokens size-2.
						prevFileIndex := tokens last].
				(prevPos = 0 or: [prevFileIndex = 0]) ifTrue: [prevPos := nil]].
		((tokens size between: 5 and: 6)
			and: [(tokens at: tokens size-3) = #methodsFor:])
			ifTrue:
				[(tokens at: tokens size-1) = #stamp:
				ifTrue: ["New format gives change stamp and unified prior pointer"
						stamp := tokens at: tokens size]].
		methodCategory := tokens after: #methodsFor: ifAbsent: ['as yet unclassifed'].
		(self includesMethodCategory: methodCategory ofClass: aMethodReference actualClass) ifTrue:
			[methodCategory = (Smalltalk at: #Categorizer ifAbsent: [Smalltalk at: #ClassOrganizer]) default ifTrue: [methodCategory := methodCategory, ' '].
			^ ChangeRecord new file: file position: position type: #method
						class: aMethodReference classSymbol category: methodCategory meta: aMethodReference classIsMeta stamp: stamp].
		position := prevPos.
		prevPos notNil ifTrue:
			[file := sourceFilesCopy at: prevFileIndex]].
		^ nil]
			ensure: [sourceFilesCopy do: [:x | x notNil ifTrue: [x close]]]
	!

----- Method: PackageInfo>>classes (in category 'listing') -----
classes
	^(self systemCategories gather:
		[:cat |
		(SystemOrganization listAtCategoryNamed: cat)
			collect: [:className | Smalltalk at: className]])
				sortBy: [:a :b | a className <= b className]!

----- Method: PackageInfo>>classesAndMetaClasses (in category 'listing') -----
classesAndMetaClasses
	"Return a Set with all classes and metaclasses belonging to this package"

	| baseClasses result |
	baseClasses := self classes.
	result := (Set new: baseClasses size * 2) 
		addAll: baseClasses;
		yourself.
	baseClasses do: [ :c | 
		result add: c classSide].
	^result
!

----- Method: PackageInfo>>coreCategoriesForClass: (in category 'testing') -----
coreCategoriesForClass: aClass
	^ aClass organization categories select: [:cat | (self isForeignClassExtension: cat) not]!

----- Method: PackageInfo>>coreMethods (in category 'listing') -----
coreMethods
	^ self classesAndMetaClasses gather: [:class | self coreMethodsForClass: class]!

----- Method: PackageInfo>>coreMethodsForClass: (in category 'testing') -----
coreMethodsForClass: aClass
	^ (aClass selectors difference:
		((self foreignExtensionMethodsForClass: aClass) collect: [:r | r methodSymbol]))
			asArray collect: [:sel | self referenceForMethod: sel ofClass: aClass]!

----- Method: PackageInfo>>extensionCategoriesForClass: (in category 'testing') -----
extensionCategoriesForClass: aClass
	^ aClass organization categories select: [:cat | self isYourClassExtension: cat]!

----- Method: PackageInfo>>extensionClasses (in category 'listing') -----
extensionClasses
	^ self externalBehaviors reject: [:classOrTrait | (self extensionCategoriesForClass: classOrTrait) isEmpty]!

----- Method: PackageInfo>>extensionMethods (in category 'listing') -----
extensionMethods
	^ self externalBehaviors gather: [:classOrTrait | self extensionMethodsForClass: classOrTrait]!

----- Method: PackageInfo>>extensionMethodsForClass: (in category 'testing') -----
extensionMethodsForClass: aClass
	^ (self extensionCategoriesForClass: aClass)
		gather: [:cat | self methodsInCategory: cat ofClass: aClass ]!

----- Method: PackageInfo>>extensionMethodsFromClasses: (in category 'testing') -----
extensionMethodsFromClasses: classes
	^classes
		gather: [:class | self extensionMethodsForClass: class]!

----- Method: PackageInfo>>externalBehaviors (in category 'modifying') -----
externalBehaviors
	^self externalClasses , self externalTraits!

----- Method: PackageInfo>>externalCallers (in category 'dependencies') -----
externalCallers
	^ self 
		externalRefsSelect: [:literal | literal isKindOf: Symbol] 
		thenCollect: [:l | l].!

----- Method: PackageInfo>>externalClasses (in category 'dependencies') -----
externalClasses
	| myClasses |
	myClasses := self classesAndMetaClasses.
	^ Array streamContents:
		[:s |
		ProtoObject withAllSubclassesDo:
			[:class |
			(myClasses includes: class) ifFalse: [s nextPut: class]]]!

----- Method: PackageInfo>>externalName (in category 'naming') -----
externalName
	^ self packageName!

----- Method: PackageInfo>>externalRefsSelect:thenCollect: (in category 'dependencies') -----
externalRefsSelect: selBlock thenCollect: colBlock
	| pkgMethods dependents extMethods otherClasses otherMethods classNames |

	classNames := self classes collect: [:c | c name].
	extMethods := self extensionMethods collect: [:mr | mr methodSymbol].
	otherClasses := self externalClasses difference: self externalSubclasses.
	otherMethods :=  otherClasses gather: [:c | c selectors].
	pkgMethods := self methods asSet collect: [:mr | mr methodSymbol].
	pkgMethods removeAllFoundIn: otherMethods.

	dependents := Set new.
	otherClasses do: [:c |
		c selectorsAndMethodsDo:
			[:sel :compiled |
			| refs |
			(extMethods includes: sel) ifFalse: 
				[refs := compiled literals select: selBlock thenCollect: colBlock.
				refs do: [:ea |
					((classNames includes: ea) or: [pkgMethods includes: ea])
							ifTrue: [dependents add: (self referenceForMethod: sel ofClass: c) -> ea]]]]].
	^ dependents!

----- Method: PackageInfo>>externalSubclasses (in category 'dependencies') -----
externalSubclasses
	| pkgClasses subClasses |
	pkgClasses := self classes.
	subClasses := Set new.
	pkgClasses do: [:c | subClasses addAll: (c allSubclasses)].
	^ subClasses difference: pkgClasses
!

----- Method: PackageInfo>>externalTraits (in category 'modifying') -----
externalTraits
	^ Array streamContents: [:s |
		| behaviors |
		behaviors := self classesAndMetaClasses.
		Smalltalk allTraits do: [:trait |
			(behaviors includes: trait) ifFalse: [s nextPut: trait].
			(behaviors includes: trait classSide) ifFalse: [s nextPut: trait classSide]]].			!

----- Method: PackageInfo>>externalUsers (in category 'dependencies') -----
externalUsers
	^ self 
		externalRefsSelect: [:literal | literal isVariableBinding] 
		thenCollect: [:l | l key]!

----- Method: PackageInfo>>foreignClasses (in category 'listing') -----
foreignClasses
	| s |
	s := IdentitySet new.
	self foreignSystemCategories
		do: [:c | (SystemOrganization listAtCategoryNamed: c)
				do: [:cl | 
					| cls | 
					cls := Smalltalk at: cl. 
					s add: cls;
					  add: cls class]].
	^ s!

----- Method: PackageInfo>>foreignExtensionCategoriesForClass: (in category 'testing') -----
foreignExtensionCategoriesForClass: aClass
	^ aClass organization categories select: [:cat | self isForeignClassExtension: cat]!

----- Method: PackageInfo>>foreignExtensionMethodsForClass: (in category 'testing') -----
foreignExtensionMethodsForClass: aClass
	^ (self foreignExtensionCategoriesForClass: aClass)
		gather: [:cat | (aClass organization listAtCategoryNamed: cat)
						  collect: [:sel | self referenceForMethod: sel ofClass: aClass]]!

----- Method: PackageInfo>>foreignSystemCategories (in category 'listing') -----
foreignSystemCategories
	^ SystemOrganization categories
		reject: [:cat | self includesSystemCategory: cat] !

----- Method: PackageInfo>>hasPostscript (in category 'preamble/postscript') -----
hasPostscript

	^ postscript notNil!

----- Method: PackageInfo>>hasPostscriptOfRemoval (in category 'preamble/postscript') -----
hasPostscriptOfRemoval

	^ postscriptOfRemoval notNil!

----- Method: PackageInfo>>hasPreamble (in category 'preamble/postscript') -----
hasPreamble
	^ preamble notNil!

----- Method: PackageInfo>>hasPreambleOfRemoval (in category 'preamble/postscript') -----
hasPreambleOfRemoval

	^ preambleOfRemoval notNil!

----- Method: PackageInfo>>hash (in category 'comparing') -----
hash
	^ packageName hash!

----- Method: PackageInfo>>includesChangeRecord: (in category 'testing') -----
includesChangeRecord: aChangeRecord
	^ aChangeRecord methodClass notNil and:
		[self
			includesMethodCategory: aChangeRecord category
			ofClass: aChangeRecord methodClass]!

----- Method: PackageInfo>>includesClass: (in category 'testing') -----
includesClass: aClass
	^ self includesSystemCategory: aClass theNonMetaClass category!

----- Method: PackageInfo>>includesClassNamed: (in category 'testing') -----
includesClassNamed: aClassName
	^ self includesSystemCategory: ((SystemOrganization categoryOfElement: aClassName) ifNil: [^false])!

----- Method: PackageInfo>>includesMethod:ofClass: (in category 'testing') -----
includesMethod: aSymbol ofClass: aClass
	aClass ifNil: [^ false].
	^ self
		includesMethodCategory: ((aClass organization categoryOfElement: aSymbol)
										ifNil: [' '])
		ofClass: aClass!

----- Method: PackageInfo>>includesMethodCategory:ofClass: (in category 'testing') -----
includesMethodCategory: categoryName ofClass: aClass
	^ (self isYourClassExtension: categoryName)
		or: [(self includesClass: aClass)
				and: [(self isForeignClassExtension: categoryName) not]]!

----- Method: PackageInfo>>includesMethodCategory:ofClassNamed: (in category 'testing') -----
includesMethodCategory: categoryName ofClassNamed: aClass
	^ (self isYourClassExtension: categoryName)
		or: [(self includesClassNamed: aClass)
				and: [(self isForeignClassExtension: categoryName) not]]!

----- Method: PackageInfo>>includesMethodReference: (in category 'testing') -----
includesMethodReference: aMethodRef
	^ self includesMethod: aMethodRef methodSymbol ofClass: aMethodRef actualClass!

----- Method: PackageInfo>>includesSystemCategory: (in category 'testing') -----
includesSystemCategory: categoryName
	^ self category: categoryName matches: self systemCategoryPrefix!

----- Method: PackageInfo>>isForeignClassExtension: (in category 'testing') -----
isForeignClassExtension: categoryName
	^ categoryName first = $* and: [(self isYourClassExtension: categoryName) not]!

----- Method: PackageInfo>>isOverrideCategory: (in category 'testing') -----
isOverrideCategory: aString
	^ aString endsWith: '-override'!

----- Method: PackageInfo>>isOverrideMethod: (in category 'testing') -----
isOverrideMethod: aMethodReference
	^ self isOverrideCategory: aMethodReference category!

----- Method: PackageInfo>>isOverrideOfYourMethod: (in category 'testing') -----
isOverrideOfYourMethod: aMethodReference
	"Answers true if the argument overrides a method in this package"
	^ (self isYourClassExtension: aMethodReference category) not and:
		[(self changeRecordForOverriddenMethod: aMethodReference) notNil]!

----- Method: PackageInfo>>isYourClassExtension: (in category 'testing') -----
isYourClassExtension: categoryName
	^ categoryName notNil and: [self category: categoryName asLowercase matches: self methodCategoryPrefix]!

----- Method: PackageInfo>>linesOfCode (in category 'source code management') -----
linesOfCode
	"An approximate measure of lines of code.
	Includes comments, but excludes blank lines."
	^self methods inject: 0 into: [:sum :each | sum + each compiledMethod linesOfCode]!

----- Method: PackageInfo>>methodCategoryPrefix (in category 'naming') -----
methodCategoryPrefix
	^ methodCategoryPrefix ifNil: [methodCategoryPrefix := '*', self packageName asLowercase]!

----- Method: PackageInfo>>methods (in category 'listing') -----
methods
	^ (self extensionMethods, self coreMethods) select: [:method |
		method isValid
			and: [method isLocalSelector
			and: [method methodSymbol isDoIt not]]]!

----- Method: PackageInfo>>methodsInCategory:ofClass: (in category 'testing') -----
methodsInCategory: aString ofClass: aClass 
	^Array streamContents: [:stream |
		self methodsInCategory: aString ofClass: aClass 
			do: [:each | stream nextPut: each]]
!

----- Method: PackageInfo>>methodsInCategory:ofClass:do: (in category 'enumerating') -----
methodsInCategory: aString ofClass: aClass do: aBlock
	((aClass organization listAtCategoryNamed: aString) ifNil: [^self])
		do: [:sel | aBlock value: (self referenceForMethod: sel ofClass: aClass)]!

----- Method: PackageInfo>>name (in category 'preamble/postscript') -----
name

^ self packageName!

----- Method: PackageInfo>>outsideClasses (in category 'testing') -----
outsideClasses
	^ProtoObject withAllSubclasses asSet difference: self classesAndMetaClasses!

----- Method: PackageInfo>>overriddenMethods (in category 'listing') -----
overriddenMethods
	^ Array streamContents: [:stream |
		self overriddenMethodsDo: [:each | stream nextPut: each]]
!

----- Method: PackageInfo>>overriddenMethodsDo: (in category 'enumerating') -----
overriddenMethodsDo: aBlock
	"Enumerates the methods the receiver contains which have been overridden by other packages"
	^ self allOverriddenMethodsDo: [:ea |
		(self isOverrideOfYourMethod: ea)
			ifTrue: [aBlock value: ea]]!

----- Method: PackageInfo>>overriddenMethodsInClass: (in category 'listing') -----
overriddenMethodsInClass: aClass
	^Array streamContents: [:stream |
		self overriddenMethodsInClass: aClass
			do: [:each | stream nextPut: each]]
!

----- Method: PackageInfo>>overriddenMethodsInClass:do: (in category 'enumerating') -----
overriddenMethodsInClass: aClass do: aBlock
	"Evaluates aBlock with the overridden methods in aClass"
	^ self overrideCategoriesForClass: aClass do: [:cat |
		self methodsInCategory: cat ofClass: aClass do: aBlock]!

----- Method: PackageInfo>>overrideCategoriesForClass: (in category 'testing') -----
overrideCategoriesForClass: aClass
	^Array streamContents: [:stream |
		self overrideCategoriesForClass: aClass
			do: [:each | stream nextPut: each]]
!

----- Method: PackageInfo>>overrideCategoriesForClass:do: (in category 'enumerating') -----
overrideCategoriesForClass: aClass do: aBlock
	"Evaluates aBlock with all the *foo-override categories in aClass"
	^ aClass organization categories do: [:cat |
		(self isOverrideCategory: cat) ifTrue: [aBlock value: cat]]!

----- Method: PackageInfo>>overrideMethods (in category 'listing') -----
overrideMethods
	^ self extensionMethods select: [:ea | self isOverrideMethod: ea]!

----- Method: PackageInfo>>packageName (in category 'naming') -----
packageName
	^ packageName ifNil: [packageName := self categoryName]!

----- Method: PackageInfo>>packageName: (in category 'naming') -----
packageName: aString
	packageName := aString!

----- Method: PackageInfo>>postscript (in category 'preamble/postscript') -----
postscript

^ postscript ifNil: [postscript := StringHolder new contents: '"below, add code to be run after the loading of this package"'].!

----- Method: PackageInfo>>postscript: (in category 'preamble/postscript') -----
postscript: aString

postscript := StringHolder new contents: aString!

----- Method: PackageInfo>>postscriptOfRemoval (in category 'preamble/postscript') -----
postscriptOfRemoval

^ postscriptOfRemoval ifNil: [postscriptOfRemoval := StringHolder new contents: '"below, add code to clean up after the unloading of this package"']!

----- Method: PackageInfo>>postscriptOfRemoval: (in category 'preamble/postscript') -----
postscriptOfRemoval: aString

postscriptOfRemoval := StringHolder new contents: aString
!

----- Method: PackageInfo>>preamble (in category 'preamble/postscript') -----
preamble

	^ preamble ifNil: [preamble := StringHolder new contents: '"below, add code to be run before the loading of this package"'].
!

----- Method: PackageInfo>>preamble: (in category 'preamble/postscript') -----
preamble: aString

preamble := StringHolder new contents: aString!

----- Method: PackageInfo>>preambleOfRemoval (in category 'preamble/postscript') -----
preambleOfRemoval

^ preambleOfRemoval ifNil: [preambleOfRemoval := StringHolder new contents: '"below, add code to prepare for the unloading of this package"']!

----- Method: PackageInfo>>preambleOfRemoval: (in category 'preamble/postscript') -----
preambleOfRemoval: aString

preambleOfRemoval := StringHolder new contents: aString
!

----- Method: PackageInfo>>printOn: (in category 'printing') -----
printOn: aStream
	super printOn: aStream.
	aStream
		nextPut: $(;
		nextPutAll: self packageName;
		nextPut: $)!

----- Method: PackageInfo>>referenceForMethod:ofClass: (in category 'testing') -----
referenceForMethod: aSymbol ofClass: aClass
	^ MethodReference new setStandardClass: aClass methodSymbol: aSymbol!

----- Method: PackageInfo>>register (in category 'registering') -----
register
	PackageOrganizer default registerPackage: self!

----- Method: PackageInfo>>removeMethod: (in category 'modifying') -----
removeMethod: aMethodReference!

----- Method: PackageInfo>>selectors (in category 'listing') -----
selectors
	^ self methods collect: [:ea | ea methodSymbol]!

----- Method: PackageInfo>>systemCategories (in category 'listing') -----
systemCategories
	^ SystemOrganization categories select: [:cat | self includesSystemCategory: cat]!

----- Method: PackageInfo>>systemCategoryPrefix (in category 'naming') -----
systemCategoryPrefix
	^ self packageName!

Object subclass: #PackageList
	instanceVariableNames: 'selectedPackage packages'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'PackageInfo-Base'!

----- Method: PackageList class>>initialize (in category 'as yet unclassified') -----
initialize
	TheWorldMenu registerOpenCommand: {'Package List'. {self. #open}}!

----- Method: PackageList class>>open (in category 'as yet unclassified') -----
open
	^ self new openInWorld!

----- Method: PackageList>>addPackage (in category 'actions') -----
addPackage
	| packageName |
	packageName := UIManager default request: 'Package name:'.
	packageName isEmpty ifFalse:
		[selectedPackage := self packageOrganizer registerPackageNamed: packageName.
		self changed: #packageSelection]!

----- Method: PackageList>>buildList (in category 'morphic') -----
buildList
	^ PluggableListMorph
		on: self
		list: #packageList
		selected: #packageSelection
		changeSelected: #packageSelection:
		menu: #packageMenu:!

----- Method: PackageList>>buildWindow (in category 'morphic') -----
buildWindow
	| window |
	window := SystemWindow labelled: self label.
	window model: self.
	window addMorph: self buildList fullFrame: (LayoutFrame fractions: (0 at 0 corner: 1 at 1)).
	^ window!

----- Method: PackageList>>defaultBackgroundColor (in category 'morphic') -----
defaultBackgroundColor 
	^ Color white!

----- Method: PackageList>>defaultExtent (in category 'morphic') -----
defaultExtent
	^ 200 at 200!

----- Method: PackageList>>label (in category 'morphic') -----
label
	^ 'Packages'!

----- Method: PackageList>>openInWorld (in category 'morphic') -----
openInWorld
	self packageOrganizer addDependent: self.
	self buildWindow openInWorldExtent: self defaultExtent!

----- Method: PackageList>>packageContextMenu: (in category 'morphic') -----
packageContextMenu: aMenu
	aMenu
		addLine;
		add: 'remove package' action: #removePackage;
		addServices: PackageServices allServices for: selectedPackage extraLines: #()!

----- Method: PackageList>>packageList (in category 'morphic') -----
packageList
	^ self packages collect: [:ea | ea packageName]!

----- Method: PackageList>>packageMenu: (in category 'morphic') -----
packageMenu: aMenu
	aMenu
		defaultTarget: self;
		add: 'add package' action: #addPackage.
	selectedPackage ifNotNil: [self packageContextMenu: aMenu].
	^ aMenu!

----- Method: PackageList>>packageOrganizer (in category 'actions') -----
packageOrganizer
	^ PackageOrganizer default!

----- Method: PackageList>>packageSelection (in category 'morphic') -----
packageSelection
	^ self packages indexOf: selectedPackage!

----- Method: PackageList>>packageSelection: (in category 'morphic') -----
packageSelection: aNumber
	selectedPackage := self packages at: aNumber ifAbsent: [].
	self changed: #packageSelection!

----- Method: PackageList>>packages (in category 'as yet unclassified') -----
packages
	^ packages ifNil: [packages := self packageOrganizer packages asSortedCollection:
									[:a :b | a packageName <= b packageName]]!

----- Method: PackageList>>perform:orSendTo: (in category 'morphic') -----
perform: selector orSendTo: otherTarget
	"Selector was just chosen from a menu by a user.  If can respond, then
perform it on myself. If not, send it to otherTarget, presumably the
editPane from which the menu was invoked."

	(self respondsTo: selector)
		ifTrue: [^ self perform: selector]
		ifFalse: [^ otherTarget perform: selector]!

----- Method: PackageList>>removePackage (in category 'actions') -----
removePackage
	self packageOrganizer unregisterPackage: selectedPackage!

----- Method: PackageList>>update: (in category 'actions') -----
update: aSymbol
	aSymbol = #packages ifTrue:
		[packages := nil.
		self changed: #packageList; changed: #packageSelection]!

Object subclass: #PackageOrganizer
	instanceVariableNames: 'packages'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'PackageInfo-Base'!
PackageOrganizer class
	instanceVariableNames: 'default'!
PackageOrganizer class
	instanceVariableNames: 'default'!

----- Method: PackageOrganizer class>>default (in category 'as yet unclassified') -----
default
	^ default ifNil: [default := self new]!

----- Method: PackageOrganizer class>>new (in category 'as yet unclassified') -----
new
	^ self basicNew initialize!

----- Method: PackageOrganizer>>initialize (in category 'initializing') -----
initialize
	packages := Dictionary new!

----- Method: PackageOrganizer>>noPackageFound (in category 'searching') -----
noPackageFound
	self error: 'No package found'!

----- Method: PackageOrganizer>>packageNamed:ifAbsent: (in category 'searching') -----
packageNamed: aString ifAbsent: errorBlock
	^ packages at: aString ifAbsent: errorBlock!

----- Method: PackageOrganizer>>packageNames (in category 'accessing') -----
packageNames
	^ packages keys!

----- Method: PackageOrganizer>>packageOfClass: (in category 'searching') -----
packageOfClass: aClass
	^ self packageOfClass: aClass ifNone: [self noPackageFound]!

----- Method: PackageOrganizer>>packageOfClass:ifNone: (in category 'searching') -----
packageOfClass: aClass ifNone: errorBlock
	^ self packages detect: [:ea | ea includesClass: aClass] ifNone: errorBlock!

----- Method: PackageOrganizer>>packageOfMethod: (in category 'searching') -----
packageOfMethod: aMethodReference
	^ self packageOfMethod: aMethodReference ifNone: [self noPackageFound]!

----- Method: PackageOrganizer>>packageOfMethod:ifNone: (in category 'searching') -----
packageOfMethod: aMethodReference ifNone: errorBlock
	^ self packages detect: [:ea | ea includesMethodReference: aMethodReference] ifNone: errorBlock!

----- Method: PackageOrganizer>>packageOfMethodCategory:ofClass: (in category 'searching') -----
packageOfMethodCategory: categoryName ofClass: aClass
	^self packageOfMethodCategory: categoryName ofClass: aClass ifNone: [ self noPackageFound ]
!

----- Method: PackageOrganizer>>packageOfMethodCategory:ofClass:ifNone: (in category 'searching') -----
packageOfMethodCategory: categoryName ofClass: aClass ifNone: errorBlock
	^ self packages detect: [:ea | ea includesMethodCategory: categoryName ofClassNamed: aClass] ifNone: errorBlock
	
	
!

----- Method: PackageOrganizer>>packageOfSystemCategory: (in category 'searching') -----
packageOfSystemCategory: aSystemCategory
	^ self packageOfSystemCategory: aSystemCategory ifNone: [ self noPackageFound ]
!

----- Method: PackageOrganizer>>packageOfSystemCategory:ifNone: (in category 'searching') -----
packageOfSystemCategory: aSystemCategory ifNone: errorBlock
	^ self packages detect: [:ea | ea includesSystemCategory: aSystemCategory] ifNone: errorBlock
!

----- Method: PackageOrganizer>>packages (in category 'accessing') -----
packages
	^ packages values!

----- Method: PackageOrganizer>>registerPackage: (in category 'registering') -----
registerPackage: aPackageInfo
	packages at: aPackageInfo packageName put: aPackageInfo.
	self changed: #packages; changed: #packageNames.
!

----- Method: PackageOrganizer>>registerPackageNamed: (in category 'registering') -----
registerPackageNamed: aString
	^ self registerPackage: (PackageInfo named: aString)!

----- Method: PackageOrganizer>>unregisterPackage: (in category 'registering') -----
unregisterPackage: aPackageInfo
	packages removeKey: aPackageInfo packageName ifAbsent: [].	
	self changed: #packages; changed: #packageNames.
!

----- Method: PackageOrganizer>>unregisterPackageNamed: (in category 'registering') -----
unregisterPackageNamed: aString
	self unregisterPackage: (self packageNamed: aString ifAbsent: [^ self])!

Object subclass: #PackageServices
	instanceVariableNames: ''
	classVariableNames: 'ServiceClasses'
	poolDictionaries: ''
	category: 'PackageInfo-Base'!

----- Method: PackageServices class>>allServices (in category 'as yet unclassified') -----
allServices
	^ ServiceClasses gather: [:ea | ea services]!

----- Method: PackageServices class>>initialize (in category 'as yet unclassified') -----
initialize
	ServiceClasses := Set new!

----- Method: PackageServices class>>register: (in category 'as yet unclassified') -----
register: aClass
	ServiceClasses add: aClass!

----- Method: PackageServices class>>unregister: (in category 'as yet unclassified') -----
unregister: aClass
	ServiceClasses remove: aClass!

----- Method: PositionableStream>>untilEnd:displayingProgress: (in category '*packageinfo-base') -----
untilEnd: aBlock displayingProgress: aString
	aString
		displayProgressAt: Sensor cursorPoint
		from: 0 to: self size
		during:
			[:bar |
			[self atEnd] whileFalse:
				[bar value: self position.
				aBlock value]].!

----- Method: String>>escapeEntities (in category '*packageinfo-base') -----
escapeEntities
	^ self species streamContents: [:s | self do: [:c | s nextPutAll: c escapeEntities]]
!



More information about the etoys-notify mailing list