UISelectionPanel.st
changeset 387 8fa6afe1b929
parent 359 6193ef5b6e74
child 397 be1357e3bf7f
--- a/UISelectionPanel.st	Thu Dec 04 16:22:51 1997 +0100
+++ b/UISelectionPanel.st	Mon Dec 08 18:55:19 1997 +0100
@@ -19,9 +19,9 @@
 	category:'Interface-UIPainter'
 !
 
-Object subclass:#ExampleUserDefinedGallery
+Object subclass:#UserDefinedGallery
 	instanceVariableNames:''
-	classVariableNames:''
+	classVariableNames:'LabelList SelectorList HolderList NextUniqueNumber'
 	poolDictionaries:''
 	privateIn:UISelectionPanel
 !
@@ -70,9 +70,11 @@
 
 initialize
     super initialize.
-    UserClass  := UISelectionPanel::ExampleUserDefinedGallery.
+    UserClass  := UISelectionPanel::UserDefinedGallery.
     UserSpecs  := #listOfSelectors.
     UserLabels := #listOfLabels.
+
+    "Modified: / 8.12.1997 / 18:53:06 / cg"
 ! !
 
 !UISelectionPanel class methodsFor:'accessing'!
@@ -99,6 +101,32 @@
 
         #( 'User Def.'   #userDefined )
      )
+!
+
+userClass
+    "return the class which provides the user defined gallery specs."
+
+    ^ UserClass
+
+    "Created: / 5.12.1997 / 15:12:50 / cg"
+!
+
+userClass:aClass specSelector:aSpecAccessSelector labelSelector:aLabelListAccessSelector
+    "change the class which provides the user defined gallery specs."
+
+    UserClass := aClass.
+    UserSpecs := aSpecAccessSelector.
+    UserLabels := aLabelListAccessSelector.
+
+    "
+     UISelectionPanel 
+        userClass:UISelectionPanel::VariableUserDefinedGallery
+        specSelector:#listOfSelectors
+        labelSelector:#listOfLabels
+    "
+
+    "Modified: / 5.12.1997 / 13:54:47 / cg"
+    "Created: / 5.12.1997 / 13:56:10 / cg"
 ! !
 
 !UISelectionPanel class methodsFor:'interface specification'!
@@ -1662,7 +1690,140 @@
   ^ nil
 ! !
 
-!UISelectionPanel::ExampleUserDefinedGallery class methodsFor:'user defined gallery'!
+!UISelectionPanel::UserDefinedGallery class methodsFor:'class initialization'!
+
+initialize
+    "initialize my default user-def from the superclasses specs.
+     I.e. provide a clocks entry"
+
+    LabelList := self defaultListOfLabels asOrderedCollection.
+    SelectorList := self defaultListOfSelectors asOrderedCollection.
+    HolderList := OrderedCollection new grow:(SelectorList size).
+    NextUniqueNumber := 1.
+
+    UISelectionPanel 
+        userClass:self
+        specSelector:#listOfSelectors
+        labelSelector:#listOfLabels.
+
+    "
+     self initialize
+    "
+
+    "Modified: / 5.12.1997 / 14:25:22 / cg"
+    "Created: / 8.12.1997 / 18:49:42 / cg"
+! !
+
+!UISelectionPanel::UserDefinedGallery class methodsFor:'defaults'!
+
+defaultListOfLabels
+    ^ #( 'clocks' )
+
+    "Created: / 8.12.1997 / 18:50:06 / cg"
+!
+
+defaultListOfSelectors
+    ^ #( clocksSpec )
+
+    "Modified: / 5.12.1997 / 14:03:55 / cg"
+    "Created: / 8.12.1997 / 18:50:21 / cg"
+! !
+
+!UISelectionPanel::UserDefinedGallery class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1997 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+
+
+!
+
+documentation
+"
+    The standard user-defined selectionPanel entry.
+    Here, a single item named 'clocks' is provided, containing
+    an analog and digital clock.
+    This is a dump example; the actual user-defined panel may be
+    extended dynamically.
+
+    Frameworks which provide additional widgets may dynamically
+    add more entries, by sending #addUserSpecHolder:label:
+    or #removeUserSpecWithLabel:.
+    Typically, this is done when a framework is loaded, by one of the
+    frameworks class-initialization methods.
+
+    [start with:]
+        UISelectionPanel open
+
+    [author:]
+        Claus Gittinger
+        Claus Atzkern
+
+    [see also:]
+        TabView
+        NoteBookView
+        UIGalleryView
+        UIPainter
+
+"
+
+
+! !
+
+!UISelectionPanel::UserDefinedGallery class methodsFor:'installation / deinstallation'!
+
+addUserSpecHolder:aValueHolder label:aLabelString
+    "add a new entry with the given label.
+     The specHolder is typically either a spec, a valueHolder or a block.
+     In any case, it should return a valid spec from the #value message.
+     This spec is installed under that label."
+
+    |syntheticSelector idx|
+
+    syntheticSelector := ('userSpec' , NextUniqueNumber printString) asSymbol.
+    NextUniqueNumber := NextUniqueNumber + 1.
+
+    idx := LabelList indexOf:aLabelString.
+    idx ~~ 0 ifTrue:[
+        SelectorList at:idx put:syntheticSelector.
+        HolderList at:idx put:aValueHolder
+    ] ifFalse:[
+        LabelList addLast:aLabelString.
+        SelectorList addLast:syntheticSelector.
+        HolderList addLast:aValueHolder
+    ]
+
+    "Modified: / 5.12.1997 / 14:13:17 / cg"
+    "Created: / 8.12.1997 / 18:50:55 / cg"
+!
+
+removeUserSpecWithLabel:aLabelString
+    "remove the spec which was previously installed under the given label"
+
+    |idx|
+
+    idx := LabelList indexOf:aLabelString.
+    idx ~~ 0 ifTrue:[
+        LabelList removeIndex:idx.
+        SelectorList removeIndex:idx.
+        HolderList removeIndex:idx
+    ].
+
+    "Modified: / 5.12.1997 / 14:13:45 / cg"
+    "Created: / 8.12.1997 / 18:51:03 / cg"
+! !
+
+!UISelectionPanel::UserDefinedGallery class methodsFor:'user defined gallery'!
 
 clocksSpec
     "this window spec was automatically generated by the ST/X UIPainter"
@@ -1709,60 +1870,57 @@
           )
       )
 
-    "Modified: 4.10.1997 / 15:12:27 / cg"
-!
-
-funSpec
-    "this window spec was automatically generated by the ST/X UIPainter"
-
-    "do not manually edit this - the painter/builder may not be able to
-     handle the specification if its corrupted."
-
-    "
-     UIPainter new openOnClass:UISelectionPanel::ExampleUserDefinedGallery andSelector:#funSpec
-     UISelectionPanel::ExampleUserDefinedGallery new openInterface:#funSpec
-    "
-
-    <resource: #canvas>
-
-    ^
-     
-       #(#FullSpec
-          #'window:' 
-           #(#WindowSpec
-              #'name:' 'uIPainterView'
-              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-              #'label:' 'Interface Builder'
-              #'bounds:' #(#Rectangle 0 0 393 182)
-          )
-          #'component:' 
-           #(#SpecCollection
-              #'collection:' 
-               #(
-                 #(#ArbitraryComponentSpec
-                    #'name:' 'arbitraryComponent1'
-                    #'layout:' #(#LayoutFrame 54 0 27 0 287 0 145 0)
-                    #'hasHorizontalScrollBar:' false
-                    #'hasVerticalScrollBar:' false
-                    #'hasBorder:' false
-                    #'miniScrollerHorizontal:' false
-                    #'miniScrollerVertical:' false
-                )
-              )
-          )
-      )
+    "Modified: / 4.10.1997 / 15:12:27 / cg"
+    "Created: / 8.12.1997 / 18:40:22 / cg"
 !
 
 listOfLabels
-    ^ #( 'clocks' 'fun')
+    ^ LabelList
 
-
+    "Created: / 5.12.1997 / 13:43:03 / cg"
+    "Modified: / 8.12.1997 / 18:51:20 / cg"
 !
 
 listOfSelectors
-    ^ #( clocksSpec funSpec )
+    ^ SelectorList
+
+    "Created: / 5.12.1997 / 13:43:13 / cg"
+    "Modified: / 8.12.1997 / 18:51:28 / cg"
+! !
+
+!UISelectionPanel::UserDefinedGallery class methodsFor:'user spec access'!
+
+doesNotUnderstand:aMessage
+    "catch queries for a userSpec"
+
+    |sel idx|
 
+    ((sel := aMessage selector) startsWith:'userSpec') ifTrue:[
+        idx := SelectorList indexOf:sel.
+        idx ~~ 0 ifTrue:[
+            ^ (HolderList at:idx) value
+        ]
+    ].
+    ^ super doesNotUnderstand:aMessage
 
+    "Modified: / 5.12.1997 / 14:23:24 / cg"
+    "Created: / 8.12.1997 / 18:51:50 / cg"
+!
+
+respondsTo:aSelector
+    "catch queries for a userSpec"
+
+    |idx|
+
+    (aSelector startsWith:'userSpec') ifTrue:[
+        idx := Number fromString:(aSelector copyFrom:9).
+        idx := SelectorList indexOf:aSelector.
+        idx ~~ 0 ifTrue:[^ true].
+    ].
+    ^ super respondsTo:aSelector
+
+    "Modified: / 5.12.1997 / 14:19:55 / cg"
+    "Created: / 8.12.1997 / 18:51:57 / cg"
 ! !
 
 !UISelectionPanel class methodsFor:'documentation'!