--- a/ResourceSpecEditor.st Fri Feb 03 16:29:51 2006 +0100
+++ b/ResourceSpecEditor.st Mon Feb 13 09:50:23 2006 +0100
@@ -17,7 +17,8 @@
"{ Package: 'stx:libview2' }"
ToolApplicationModel subclass:#ResourceSpecEditor
- instanceVariableNames:'specClass specSelector aspects modified hasSaved tabSelection'
+ instanceVariableNames:'specClass specClassName specSelector aspects modified hasSaved
+ tabSelection'
classVariableNames:''
poolDictionaries:''
category:'Interface-Framework'
@@ -81,7 +82,7 @@
openOnClass:aClass andSelector:aSelector
"opens the Resource Spec Editor on aClass and aSelector"
- ^self new openOnClass:aClass andSelector:aSelector
+ ^ self new openOnClass:aClass theNonMetaclass andSelector:aSelector
! !
!ResourceSpecEditor class methodsFor:'accessing'!
@@ -161,6 +162,10 @@
!ResourceSpecEditor methodsFor:'accessing'!
+clearModified
+ modified := false
+!
+
modified
"returns whether the resource spec was modified"
@@ -173,17 +178,30 @@
modified := aBoolean
!
+setModified
+ modified := true
+!
+
specClass
"returns the class where the resource spec is implemented"
- ^specClass
+self halt.
+ ^ specClass
!
-specClass:aClass
+specClass:aClassOrClassName
"sets the class (or name) where the resource spec is (or should be) implemented"
- aClass isClass ifTrue: [specClass := aClass name]
- ifFalse:[specClass := aClass asSymbol]
+ aClassOrClassName isBehavior
+ ifTrue: [ specClass := aClassOrClassName ]
+ ifFalse:[ specClass := Smalltalk classNamed:aClassOrClassName ]
+!
+
+specClassName
+ "returns the classes name where the resource spec is implemented"
+
+self halt.
+ ^ specClass name
!
specSelector
@@ -256,13 +274,24 @@
!ResourceSpecEditor methodsFor:'building'!
buildFromClass: aClass andSelector: aSelector
- ^self subclassResponsibility
+ ^ self loadFromClass: aClass andSelector: aSelector
!
buildFromResourceSpec: aResourceSpec
"concrete subclass has to reimplement this method
in order to build its resource spec from aResourceSpec"
+ ^ self loadFromResourceSpec:aResourceSpec
+!
+
+loadFromClass: aClass andSelector: aSelector
+ ^ self subclassResponsibility
+!
+
+loadFromResourceSpec: aResourceSpec
+ "concrete subclass has to reimplement this method
+ in order to build its resource spec from aResourceSpec"
+
^self subclassResponsibility
! !
@@ -301,20 +330,16 @@
defaultInfoLabel
"returns the default label for the info bar"
- |cls|
- (specClass isSymbol and: [(cls := Smalltalk at: specClass) isClass])
- ifTrue:
- [
- (cls class includesSelector: specSelector)
- ifFalse:
- [
- ^specSelector isNil
- ifTrue: [specClass, ' >> ? (no selector defined)']
- ifFalse: [specClass, ' >> ', specSelector, ' (not implemented)']
+ specClass isBehavior ifTrue:[
+ (specClass respondsTo:specSelector) ifTrue:[
+ ^ specClass name, ' >> ', specSelector
].
- ^specClass, ' >> ', specSelector
+ specSelector isNil ifTrue:[
+ ^ specClass name, ' >> ? (no selector defined)'
+ ].
+ ^ specClass name, ' >> ', specSelector, ' (not implemented)'
].
- ^'No class and selector defined.'
+ ^ 'No class and selector defined.'
! !
!ResourceSpecEditor methodsFor:'initialization'!
@@ -365,7 +390,7 @@
] ifFalse:[
anythingChangedHolder value: false.
self clearModifiedFlag.
- modified := false.
+ self clearModified.
].
].
^true
@@ -383,7 +408,7 @@
yesText:(resources string:'Discard Changes and Proceed');
showAtPointer;
accepted) ifFalse: [^ false].
- modified := false
+ self clearModified
].
^ true
@@ -397,45 +422,55 @@
!
-resolveClassNamed
- "returns current class or nil"
+extractClassAndSelectorFrom:aString
+ "extracts class and selector from a resource string. On success
+ an association with the key a class and the selector as value
+ is returned. Otherwise nil is returned
+ "
+ |words newClass newSel|
+
+ aString size ~~ 0 ifTrue:[
+ words := aString asCollectionOfWords.
- ^Smalltalk resolveName:specClass inClass:self class
+ words size == 2 ifTrue:[
+ newClass := self resolveName:(words first).
+
+ (newClass isClass and:[newClass isLoaded]) ifTrue:[
+ newSel := words last asSymbol.
+
+ (newClass class includesSelector:newSel) ifTrue:[
+ ^ Association key:newClass value:newSel
+ ].
+ ].
+ ].
+ ].
+ ^ nil
!
-resourceMessage: aString
- "extracts from aString the specClass and the specSelector"
+updateHistory
+ "updates the history, if there was loaded a resource spec"
+
+ specClass notNil ifTrue:[
+ self addHistoryEntryForClass:specClass selector:specSelector
+ ]
+!
- (aString notNil and: [self askForModification])
- ifTrue:
- [
- |msg cls sel|
+xxresourceMessage:aString
+ "extracts the specClass and the specSelector from aString "
+
+ |msg cls|
+
+ (aString notNil and:[self askForModification]) ifTrue:[
msg := aString asCollectionOfWords.
- (msg size == 2 and:
- [(cls := self resolveName:(msg at:1)) notNil])
- ifTrue:
- [
- specClass := cls name.
+ (msg size == 2
+ and: [ (cls := self resolveName:(msg at:1)) notNil ])
+ ifTrue:[
+ specClass := cls.
specSelector := (msg at: 2) asSymbol.
^true
]
].
^false
-!
-
-updateHistory
- "updates the history, if there was loaded a resource spec"
-
- |cls|
- ((cls := self resolveClassNamed) notNil and: [cls class includesSelector: specSelector])
- ifTrue:
- [
- |className message|
- specClass isClass ifTrue: [className := specClass name].
- specClass isString ifTrue: [className := specClass].
- message := className, ' ', specSelector.
- self addToHistory: message -> #loadFromMessage:
- ]
! !
!ResourceSpecEditor methodsFor:'queries'!
@@ -447,8 +482,14 @@
!
+isNotStandAlone
+ "returns true if the editor was not started from or in another tool"
+
+ ^self masterApplication notNil
+!
+
isStandAlone
- "returns true if the editor was not started from another tool"
+ "returns true if the editor was started from or in another tool"
^self masterApplication isNil
! !
@@ -471,27 +512,20 @@
!
-loadFromMessage:aString
+loadFromMessage:classAndSelector
"builds by evaluating aString the resource spec for editing"
- (aString notNil and: [self askForModification])
- ifTrue:
- [
- |msg cls sel|
+ |cls sel|
+
+ self askForModification ifFalse:[ ^ false].
+ classAndSelector isNil ifTrue:[^ false].
- msg := aString asCollectionOfWords.
- (msg size == 2 and:
- [(cls := self resolveName:(msg at:1)) notNil and:
- [cls class includesSelector: (sel := (msg at: 2) asSymbol)]])
- ifTrue:
- [
- self isStandAlone
- ifFalse: [self buildFromResourceSpec: (cls perform: sel)]
- ifTrue: [self buildFromClass: (specClass := cls name) andSelector: (specSelector := sel)].
- ^true
- ]
- ].
- ^false
+ cls := classAndSelector methodClass.
+ sel := classAndSelector methodSelector.
+ self isStandAlone
+ ifFalse: [self loadFromResourceSpec: (cls perform: sel).]
+ ifTrue: [self loadFromClass:cls andSelector:sel ].
+ ^ true
"Modified: / 21.5.1998 / 02:56:46 / cg"
!
@@ -499,7 +533,7 @@
openModalOnClass:aClass andSelector:aSelector
"sets the specClass and specSelector and opens modal the interface"
- specClass := aClass isClass ifTrue: [aClass name] ifFalse: [aClass asSymbol].
+ specClass := aClass isClass ifTrue: [aClass] ifFalse: [ Smalltalk classNamed:aClass].
specSelector := aSelector.
self openInterfaceModal.
@@ -510,15 +544,14 @@
then opens modal the interface"
self allButOpen.
- self buildFromResourceSpec: aListSpec.
+ self loadFromResourceSpec:aListSpec.
self openWindowModal.
-
!
openOnClass:aClass andSelector:aSelector
"sets the specClass and specSelector and opens the interface"
- specClass := aClass isClass ifTrue: [aClass name] ifFalse: [aClass asSymbol].
+ specClass := aClass isBehavior ifTrue: [aClass] ifFalse: [ Smalltalk classNamed:aClass].
specSelector := aSelector.
self openInterface.
@@ -540,8 +573,9 @@
super postOpenWith:aBuilder.
- self buildFromClass: specClass andSelector: specSelector
-
+ specClass notNil ifTrue:[
+ self loadFromClass: specClass andSelector: specSelector
+ ]
!
uninitialize
@@ -566,50 +600,43 @@
self valueOfEnablingCommitButtons value: false.
self clearModifiedFlag.
- modified := true
+ self setModified
!
doBrowseClass
"opens a System Browser on the specClass and specSelector"
- |cls|
-
- (cls := self resolveClassNamed) notNil
- ifTrue: [UserPreferences systemBrowserClass openInClass:cls class selector: specSelector]
+ specClass notNil
+ ifTrue: [UserPreferences systemBrowserClass openInClass:specClass class selector: specSelector]
ifFalse:[self information:'No class defined!!']
!
doEditImage
"opens a Image Editor on the resource retriever and the icon selector"
- |cls resourceClass resourceSelector imageResourceMessage readStream icon retriever|
+ |resourceClass resourceSelector classAndSelector retrieverName|
- (icon := (aspects at:#icon) value) size > 0
- ifTrue: [resourceSelector := icon]
- ifFalse: [resourceSelector := #icon].
+ resourceSelector := (aspects at:#icon) value.
+ resourceSelector isEmptyOrNil ifTrue:[ resourceSelector := #icon ].
- (retriever := (aspects at:#retriever) value) size > 0
- ifTrue:[
- resourceClass := retriever
+ retrieverName := (aspects at:#retriever) value.
+ retrieverName notEmptyOrNil ifTrue:[
+ resourceClass := Smalltalk classNamed:retrieverName
] ifFalse:[
- (cls := self resolveName: specClass) notNil
- ifTrue:[
- resourceClass := cls withAllSuperclasses detect: [:cls| cls class includesSelector: resourceSelector] ifNone: [cls]
+ specClass notNil ifTrue:[
+ resourceClass := specClass withAllSuperclasses
+ detect:[:cls| cls class includesSelector: resourceSelector]
+ ifNone:[specClass]
]
].
- (imageResourceMessage := ImageEditor openModalOnClass: resourceClass andSelector: resourceSelector) notNil
+ (classAndSelector := ImageEditor openModalOnClass: resourceClass andSelector: resourceSelector) notNil
ifTrue: [
- readStream := imageResourceMessage readStream.
- resourceClass := (readStream upTo: $ ) asSymbol.
- resourceSelector := readStream upToEnd asSymbol.
- resourceClass size > 0 ifTrue: [
- (aspects at:#retriever) value: resourceClass
- ].
- resourceSelector size > 0 ifTrue: [
- (aspects at:#icon) value: resourceSelector.
- self valueOfEnablingCommitButtons value: true
- ]
+ resourceClass := classAndSelector at:1.
+ resourceSelector := classAndSelector at:2.
+ (aspects at:#retriever) value: resourceClass name.
+ (aspects at:#icon) value: resourceSelector.
+ self valueOfEnablingCommitButtons value: true
]
"Modified: / 21.5.1998 / 02:44:04 / cg"
@@ -618,19 +645,19 @@
doLoad
"opens a Resource Selection Browser in order to get a resource message"
- |myResourceType|
+ |myResourceType classAndSelector|
myResourceType := self class resourceType.
- self loadFromMessage:
- (ResourceSelectionBrowser
+ classAndSelector := ResourceSelectionBrowser
request: 'Load ', myResourceType asUppercaseFirst, ' Spec From Class'
onSuperclass: nil
andClass: specClass
andSelector: specSelector ? myResourceType
- withResourceTypes: (Array with: myResourceType))
+ withResourceTypes: (Array with: myResourceType).
- "Modified: / 21.5.1998 / 02:59:02 / cg"
+ classAndSelector isNil ifTrue:[ ^ self ].
+ ^ self loadFromClass:(classAndSelector methodClass) andSelector:(classAndSelector methodSelector)
!
doNew
@@ -640,7 +667,7 @@
self askForModification ifTrue:[
self isStandAlone ifTrue: [specClass := specSelector := nil].
- self buildFromClass: nil andSelector: self class resourceType.
+ self loadFromClass:nil andSelector:(self class resourceType).
^ true
].
^ false
@@ -654,9 +681,9 @@
(specClass isNil or:[specSelector isNil]) ifTrue:[
self doSaveAs.
- ^false
+ ^ false
].
- ^true
+ ^ true
!
doSaveAs
@@ -671,24 +698,22 @@
myResourceType := self class resourceType.
- (resourceMessage := ResourceSelectionBrowser
+ resourceMessage := ResourceSelectionBrowser
request: 'Save ', myResourceType asUppercaseFirst, ' Spec In Class'
onSuperclass: #Object
- andClass: specClass
+ andClass: specClass name
andSelector: specSelector ? myResourceType
- withResourceTypes: (Array with: myResourceType)) notNil
- ifTrue:
- [
- modified := false.
- (self resourceMessage: resourceMessage)
- ifTrue:
- [
- self doSave.
- self buildFromClass: specClass andSelector: specSelector.
- ^true
- ]
- ].
- ^false
+ withResourceTypes: (Array with: myResourceType).
+
+ resourceMessage isNil ifTrue:[ ^ false ].
+
+ self clearModified.
+ specClass := resourceMessage methodClass.
+ specSelector := resourceMessage methodSelector.
+ self doSave.
+ self loadFromClass: specClass andSelector: specSelector.
+self halt.
+ ^ true
"Modified: / 21.5.1998 / 02:59:46 / cg"
! !
@@ -696,5 +721,5 @@
!ResourceSpecEditor class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview2/ResourceSpecEditor.st,v 1.30 2005-03-17 15:26:23 penk Exp $'
+ ^ '$Header: /cvs/stx/stx/libview2/ResourceSpecEditor.st,v 1.31 2006-02-13 08:50:23 cg Exp $'
! !