ResourceSpecEditor.st
changeset 2097 7f078c4af09d
parent 2037 a99b25a83641
child 2102 ef76fea01343
--- 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 $'
 ! !