UISpecificationTool.st
changeset 1307 52898ecde37d
parent 1296 a2e403565be2
child 1313 95ef9b917d82
--- a/UISpecificationTool.st	Mon Jan 24 17:37:26 2000 +0100
+++ b/UISpecificationTool.st	Tue Jan 25 14:01:07 2000 +0100
@@ -15,12 +15,19 @@
 
 ApplicationModel subclass:#UISpecificationTool
 	instanceVariableNames:'modifiedHolder aspects specification selection specChannel
-		scrolledView windowFrame acceptChannel'
+		buildInView listOfSpecViews'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-UIPainter'
 !
 
+ViewScroller subclass:#BuildInView
+	instanceVariableNames:'outerFrame'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:UISpecificationTool
+!
+
 !UISpecificationTool class methodsFor:'documentation'!
 
 copyright
@@ -650,39 +657,41 @@
 !UISpecificationTool class methodsFor:'interface specs'!
 
 windowSpec
-    "this window spec was automatically generated by the ST/X UIPainter"
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
 
-    "do not manually edit this - the painter/builder may not be able to
-     handle the specification if its corrupted."
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
 
     "
      UIPainter new openOnClass:UISpecificationTool andSelector:#windowSpec
      UISpecificationTool new openInterface:#windowSpec
+     UISpecificationTool open
     "
-    "UISpecificationTool open"
 
     <resource: #canvas>
 
-    ^
-     
-       #(#FullSpec
-          #'window:' 
-           #(#WindowSpec
-              #'name:' 'uIPainterView'
-              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-              #'label:' 'unnamed canvas'
-              #'bounds:' #(#Rectangle 0 0 300 300)
-          )
-          #'component:' 
-           #(#SpecCollection
-              #'collection:' 
-               #(
-                 #(#ViewSpec
-                    #'name:' 'Frame'
-                    #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-                )
-              )
-          )
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'unnamed canvas'
+          #name: 'unnamed canvas'
+          #bounds: #(#Rectangle 30 217 330 517)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#ArbitraryComponentSpec
+              #name: 'ArbitraryComponent1'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #hasBorder: false
+              #component: #buildInViewTop
+            )
+           )
+         
+        )
       )
 ! !
 
@@ -705,52 +714,33 @@
 specification:aSpec
     "sets current edit specification
     "
-    self releaseResources.
-
     aSpec isNil ifTrue:[
-        specChannel notNil ifTrue:[ specChannel release ].
-        aspects     notNil ifTrue:[ aspects     release ].
-
-        specChannel   := nil.
-        specification := nil.
-        aspects       := nil.
-    ] ifFalse:[
-        "/ same type of spec - simply change the spec;
-        "/ no need to setup everything
-
-        specification class == aSpec class ifTrue:[
-            specification := aSpec.
-          ^ specChannel value:specification.
-        ].
-
-        specChannel notNil ifTrue:[ specChannel release ].
-        aspects     notNil ifTrue:[ aspects     release ].
+        ^ self specificationChanged
+    ].
+    "/ same type of spec - simply change the spec;  no need to setup everything
 
-        specification  := aSpec.
-        
-        "/ some tricky specs need the builder
-        "/ during the addBindings phase.
-        "/ This is passed down in a special UIBindingsDictionary
-        "/ (remain backward compatible)
-
-        aspects        := UISpecification newBindingsDictionary.
-        aspects builder:builder.
-        aspects at:#modifiedChannel put:modifiedHolder.
-        aspects at:#acceptChannel put:self acceptChannel.
+    specification class == aSpec class ifTrue:[
+        specification := aSpec.
+      ^ specChannel value:specification.
+    ].
+    self specificationChanged.
+    specification := aSpec.
+    
+    "/ some tricky specs need the builder during the addBindings phase.
+    "/ This is passed down in a special UIBindingsDictionary
+    "/ (remain backward compatible)
 
-        specChannel    := specification asValue.
-        specification class addBindingsTo:aspects for:specification channel:specChannel.
-
-        "/ arrange for being notified, if any aspect changes
-        aspects do:[:el| el addDependent:self ].
-    ].
+    aspects := UISpecification newBindingsDictionary.
+    aspects builder:builder.
+    aspects at:#modifiedChannel put:modifiedHolder.
+    aspects at:#acceptChannel   put:self acceptChannel.
 
-    selection notNil ifTrue:[
-        self clearScrolledView.
-        selection := nil.
-    ].
+    specChannel := specification asValue.
+    specification class addBindingsTo:aspects for:specification channel:specChannel.
 
-    "Modified: / 16.7.1998 / 19:39:42 / cg"
+    "/ arrange for being notified, if any aspect changes
+    aspects do:[:el| el addDependent:self ].
+
 ! !
 
 !UISpecificationTool methodsFor:'accessing channels'!
@@ -759,9 +749,7 @@
     "set the value holder set to true in case of modifying attributes
     "
 
-    modifiedHolder notNil ifTrue:[
-        modifiedHolder removeDependent:self. 
-    ].
+    modifiedHolder removeDependent:self.
 
     (modifiedHolder := aValueHolder) notNil ifTrue:[
         modifiedHolder addDependent:self.
@@ -810,19 +798,35 @@
 
 !
 
-releaseResources
-    "release resources
-    "
-    |frame appl|
+buildInViewTop
+    ^ buildInView superView
+
+
+!
+
+specificationChanged
 
-    builder notNil ifTrue:[
-        frame := self windowFrame.
-        appl  := builder application.
-        builder application:appl.
-        builder componentAt:#Frame put:frame.
+    specChannel notNil ifTrue:[
+        specChannel release.
+        specChannel := nil.
+    ].
+    aspects notNil ifTrue:[
+        aspects release.
+        aspects := nil.
     ].
+    selection     := nil.
+    specification := nil.
 
-    "Modified: / 20.6.1998 / 15:45:20 / cg"
+    listOfSpecViews notNil ifTrue:[
+        buildInView scrolledView:nil.
+
+        listOfSpecViews do:[:aView|
+            aView notNil ifTrue:[
+                aView destroy
+            ]
+        ].
+        listOfSpecViews := nil.
+    ].
 !
 
 specificationFor:aKey
@@ -830,16 +834,10 @@
      subspecifications or subcanvases.
      Get the subspecification from the current specification"
 
-    |cls|
-
-    cls := specification class.
-    (cls respondsTo:aKey) ifTrue:[
-        ^ cls perform:aKey
+    specification notNil ifTrue:[
+        ^ specification class perform:aKey ifNotUnderstood:nil
     ].
     ^ nil
-
-    "Created: / 4.2.1998 / 23:52:39 / stefan"
-    "Modified: / 4.2.1998 / 23:58:23 / stefan"
 ! !
 
 !UISpecificationTool methodsFor:'change & update'!
@@ -867,79 +865,90 @@
     "Modified: / 16.7.1998 / 19:25:59 / cg"
 ! !
 
+!UISpecificationTool methodsFor:'initialization'!
+
+initialize
+    |view|
+
+    super initialize.
+    view := ScrollableView for:BuildInView.
+    view verticalScrollable:true.
+    view verticalMini:true.
+    view autoHideScrollBars:true.
+    view level:0.
+    buildInView := view scrolledView.
+! !
+
 !UISpecificationTool methodsFor:'selection'!
 
 selection:something
     "selection changed
     "
-    |slices idx spec window|
+    |slices index spec window|
 
     specification notNil ifTrue:[
         slices := specification class slices.
-        idx:= slices findFirst:[:aSlice| aSlice first = something ].
+        index  := slices findFirst:[:aSlice| aSlice first = something ].
 
-        idx ~~ 0 ifTrue:[
-            spec := specification class perform:((slices at:idx) last).
+        index ~~ 0 ifTrue:[
+            spec := specification class perform:((slices at:index) last)
         ]
     ].
 
     spec ~= selection ifTrue:[
-        self releaseResources.
-        self clearScrolledView.
-
-        window  := self scrolledView scrolledView.
-
-        spec notNil ifTrue:[
-            builder buildFromSpec:spec in:window.
-
-            window allViewBackground:(self windowFrame viewBackground).
-            window extent:1.0@(window preferredExtent y).
-            window realizeAllSubViews.
-            self scrolledView sizeChanged:nil.
-        ]
+        (selection := spec) notNil ifTrue:[
+            listOfSpecViews isNil ifTrue:[
+                listOfSpecViews := Array new:(slices size).
+            ] ifFalse:[
+                window := listOfSpecViews at:index
+            ].
+            window isNil ifTrue:[
+                builder buildFromSpec:spec in:(window := SimpleView new).
+                listOfSpecViews at:index put:window.
+            ].
+        ].
+        buildInView scrolledView:window.
     ].
-    selection := spec.
 ! !
 
-!UISpecificationTool methodsFor:'spec. window'!
+!UISpecificationTool::BuildInView methodsFor:'accessing'!
 
-clearScrolledView
+scrolledView:aView
+    "set the view to be scrolled"
+    |scr|
+
+    scrolledView == aView ifTrue:[^ self].
 
-    scrolledView isNil ifFalse:[
-        scrolledView scrolledView destroySubViews.
-    ]
-!
+    outerFrame isNil ifTrue:[
+        self level:0.
+        outerFrame := SimpleView origin:0.0@0.0 corner:1.0@1.0 in:self.
+        realized ifTrue:[outerFrame realize].
+    ].
 
-scrolledView
-    |frame vscroller|
+    scrolledView notNil ifTrue:[scrolledView unmap].
 
-    scrolledView isNil ifTrue:[
-        frame     := self windowFrame.
-        vscroller := ScrollableView for:ViewScroller origin:0.0 @ 0.0 corner:1.0 @ 1.0 in:frame.
-        vscroller verticalScrollable:true.
-        vscroller verticalMini:true.
-        vscroller autoHideScrollBars:true.
-        scrolledView := vscroller scrolledView.
-        scrolledView scrolledView:View new.
-        frame realizeAllSubViews.
-        frame sizeChanged:nil.
+    (scrolledView := aView) isNil ifTrue:[
+        ^ self
+    ].
+
+    scrolledView superView == outerFrame ifFalse:[
+        scrolledView borderWidth:0; level:0.
 
-        "/ we dont want any 3D effect for the scrolled view.
-        "/ must change the slaveViews level late, after realization.
-        "/ (scrolledView has its own idea, changing the level of
-        "/ the scrolled view.
-        scrolledView level:0.
+        outerFrame addSubView:scrolledView.
+        scrolledView origin:0@0 corner:1.0 @ (scrolledView preferredExtent y).
+        scrolledView := scrolledView.
+        scrolledView allViewBackground:(self viewBackground).
     ].
-    ^ scrolledView
 
-    "Modified: / 21.5.1998 / 00:59:05 / cg"
-!
+    realized ifTrue:[
+        scrolledView realize.
+        self sizeChanged:nil.
+    ].
 
-windowFrame
-    windowFrame isNil ifTrue:[
-        windowFrame := builder componentAt:#Frame
-    ].
-    ^ windowFrame.
+
+
+
+
 ! !
 
 !UISpecificationTool class methodsFor:'documentation'!