UISelectionPanel.st
author Claus Gittinger <cg@exept.de>
Thu, 05 Mar 1998 13:37:26 +0100
changeset 697 ca492fc8390a
parent 684 998a2d438fa7
child 709 b81a8a284267
permissions -rw-r--r--
better info-box message (if modieified and no class/selector is defined)

"
 COPYRIGHT (c) 1997 by Claus Gittinger / 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.
"



ApplicationModel subclass:#UISelectionPanel
	instanceVariableNames:'userClass userSpecs userLabels majorSelection clipBoardSpec'
	classVariableNames:'UserClass UserSpecs UserLabels'
	poolDictionaries:''
	category:'Interface-UIPainter'
!

Object subclass:#UserDefinedGallery
	instanceVariableNames:''
	classVariableNames:'LabelList SelectorList HolderList NextUniqueNumber'
	poolDictionaries:''
	privateIn:UISelectionPanel
!

!UISelectionPanel class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1997 by Claus Gittinger / 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
"
    implements a selection panel, keeping widgets which could be placed
    into the UIPainter by drag & drop.

    [start with:]
        UISelectionPanel open

    [author:]
        Claus Gittinger
        Claus Atzkern

    [see also:]
        TabView
        NoteBookView
        UIGalleryView
        UIPainter

"

! !

!UISelectionPanel class methodsFor:'initialization'!

initialize
    super initialize.
    UserClass  := UISelectionPanel::UserDefinedGallery.
    UserSpecs  := #listOfSelectors.
    UserLabels := #listOfLabels.

    "Modified: / 8.12.1997 / 18:53:06 / cg"
! !

!UISelectionPanel class methodsFor:'accessing'!

specifications

    ^ #(
        #( 'Standards'  #( 
                            #('Buttons' standardButtons)
                            #('Menus'   standardMenus)
                            #('Texts'   standardTexts)
                            #('Lists'   standardLists)
                            #('Groups'  standardGroups)
                            #('Misc'    standardMisc)
                         )
         )

        #( 'Clipboard'  #(
                            #('Copy & Paste Buffer'     clipBoardSpec)
                          )
         )

        #( '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'!

nameAndSelectorSpec
    "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 andSelector:#nameAndSelectorSpec
     UISelectionPanel new openInterface:#nameAndSelectorSpec
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'uIPainterView'
              #layout: #(#LayoutFrame 110 0 366 0 424 0 581 0)
              #label: 'Painter'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 110 366 425 582)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#LabelSpec
                    #name: 'title'
                    #layout: #(#Point 5 10)
                    #label: 'Class & selectors to access user specs:'
                    #adjust: #left
                    #resizeForLabel: true
                )
                 #(#LabelSpec
                    #name: 'classLabel'
                    #layout: #(#AlignmentOrigin 68 0.11 51 0 1 0.5)
                    #label: 'Class:'
                    #adjust: #right
                    #resizeForLabel: true
                )
                 #(#InputFieldSpec
                    #name: 'classField'
                    #layout: #(#LayoutFrame 74 0.11 39 0 -5 1.0 61 0)
                    #tabable: true
                    #model: #className
                    #type: #string
                )
                 #(#LabelSpec
                    #name: 'labelsLabel'
                    #layout: #(#AlignmentOrigin 68 0.11 74 0 1 0.5)
                    #label: 'Labels:'
                    #adjust: #right
                    #resizeForLabel: true
                )
                 #(#InputFieldSpec
                    #name: 'labelsField'
                    #layout: #(#LayoutFrame 74 0.11 64 0 -5 1.0 86 0)
                    #tabable: true
                    #model: #labelsKey
                    #type: #symbolOrNil
                )
                 #(#LabelSpec
                    #name: 'specsLabel'
                    #layout: #(#AlignmentOrigin 68 0.11 99 0 1 0.5)
                    #label: 'Specifications:'
                    #adjust: #right
                    #resizeForLabel: true
                )
                 #(#InputFieldSpec
                    #name: 'specsField'
                    #layout: #(#LayoutFrame 74 0.11 89 0 -5 1.0 111 0)
                    #tabable: true
                    #model: #specsKey
                    #type: #symbolOrNil
                )
                 #(#HorizontalPanelViewSpec
                    #name: 'commitPanel'
                    #layout: #(#LayoutFrame 0 0.0 -23 1.0 0 1.0 0 1.0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#ActionButtonSpec
                              #name: 'cancel'
                              #label: 'cancel'
                              #tabable: true
                              #model: #cancel
                              #extent: #(#Point 153 23)
                          )
                           #(#ActionButtonSpec
                              #name: 'accept'
                              #label: 'ok'
                              #tabable: true
                              #model: #accept
                              #isDefault: true
                              #extent: #(#Point 153 23)
                          )
                        )
                    )
                    #horizontalLayout: #fitSpace
                    #verticalLayout: #fit
                    #horizontalSpace: 3
                    #verticalSpace: 3
                )
                 #(#CheckBoxSpec
                    #name: 'updateDefaultResources'
                    #layout: #(#Point 5 133)
                    #model: #updateDefaultResources
                    #label: 'Update Default Resources'
                )
              )
          )
      )
!

windowSpec
    "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 andSelector:#windowSpec
     UISelectionPanel new openInterface:#windowSpec
    "
    "UISelectionPanel open"

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #'window:' 
           #(#WindowSpec
              #'name:' 'Widget Gallery'
              #'layout:' #(#LayoutFrame 78 0 70 0 598 0 352 0)
              #'label:' 'Widget Gallery'
              #'min:' #(#Point 100 280)
              #'max:' #(#Point 1160 870)
              #'bounds:' #(#Rectangle 78 70 599 353)
          )
          #'component:' 
           #(#SpecCollection
              #'collection:' 
               #(
                 #(#UIGalleryViewSpec
                    #'name:' 'gallery'
                    #'layout:' #(#LayoutFrame 0 0.0 0 0.0 -40 1.0 0 1.0)
                    #'tabable:' true
                    #'menu:' #galleryList
                    #'style:' 
                     #(#FontDescription
                        #helvetica #medium
                        #roman #'10'
                    )
                    #'model:' #galleryModel
                    #'useIndex:' true
                    #'minorKeys:' #minorKeys
                    #'clientSpec:' #clientSpec
                    #'raiseMenu:' #raiseMenu
                )
                 #(#TabViewSpec
                    #'name:' 'major'
                    #'layout:' #(#LayoutFrame -40 1.0 30 0.0 0 1.0 0 1.0)
                    #'menu:' #majorList
                    #'style:' 
                     #(#FontDescription
                        #helvetica #medium
                        #roman #'10'
                    )
                    #'model:' #majorChannel
                    #'direction:' #right
                    #'useIndex:' true
                )
              )
          )
      )
! !

!UISelectionPanel class methodsFor:'menus'!

menuSelected

    <resource: #menu>

    ^ #(#Menu #(
                #(#MenuItem
                        #'label:' 'copy'
                        #'value:' #copy
                 )
                #(#MenuItem
                        #'label:' 'cut'
                        #'value:' #cut
                 )
                )
               nil
               nil
        )

    "Modified: / 29.10.1997 / 03:20:30 / cg"
!

menuUnselected
    <resource: #menu>

    ^ #(#Menu #(
                #(#MenuItem
                        #'label:' 'paste'
                        #'value:' #paste
                 )
                )
               nil
               nil
        )

    "Modified: / 29.10.1997 / 03:20:38 / cg"
! !

!UISelectionPanel class methodsFor:'standard specifications'!

standardButtons
    "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 andSelector:#standardButtons
     UISelectionPanel new openInterface:#standardButtons
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Buttons'
              #layout: #(#LayoutFrame 96 0 292 0 574 0 633 0)
              #label: 'Buttons'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 96 292 575 634)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#ActionButtonSpec
                    #name: 'Button'
                    #layout: #(#LayoutFrame 15 0 15 0 140 0 37 0)
                    #activeHelpKey: #dss
                    #label: 'Button'
                )
                 #(#ActionButtonSpec
                    #name: 'Button - OK'
                    #layout: #(#LayoutFrame 15 0 47 0 140 0 69 0)
                    #label: 'OK'
                    #model: #accept
                )
                 #(#ActionButtonSpec
                    #name: 'Button - Cancel'
                    #layout: #(#LayoutFrame 15 0 79 0 140 0 101 0)
                    #label: 'Cancel'
                    #model: #cancel
                )
                 #(#ActionButtonSpec
                    #name: 'Button - Help'
                    #layout: #(#LayoutFrame 15 0 111 0 140 0 133 0)
                    #label: 'Help'
                    #model: #help
                )
                 #(#ActionButtonSpec
                    #name: 'Button - Close'
                    #layout: #(#LayoutFrame 15 0 143 0 140 0 165 0)
                    #label: 'Close'
                    #model: #closeRequest
                )
                 #(#ToggleSpec
                    #name: 'Toggle'
                    #layout: #(#LayoutFrame 157 0 15 0 293 0 37 0)
                    #label: 'Toggle'
                    #isTriggerOnDown: true
                    #showLamp: true
                    #lampColor: #(#Color 100.0 100.0 0.0)
                )
                 #(#RadioButtonSpec
                    #name: 'RadioButton'
                    #layout: #(#LayoutFrame 157 0.0 47 0 293 0 69 0)
                    #label: 'RadioButton'
                    #isTriggerOnDown: true
                    #showLamp: true
                    #lampColor: #(#Color 100.0 100.0 0.0)
                )
                 #(#CheckBoxSpec
                    #name: 'CheckBox'
                    #layout: #(#LayoutFrame 157 0 79 0 293 0 101 0)
                    #label: 'CheckBox'
                )
                 #(#CheckToggleSpec
                    #name: 'CheckToggle'
                    #layout: #(#LayoutFrame 157 0 111 0 176 0 130 0)
                    #isTriggerOnDown: true
                    #showLamp: false
                    #lampColor: #(#Color 100.0 100.0 0.0)
                )
                 #(#LabelSpec
                    #name: 'CheckToggleLabel'
                    #layout: #(#AlignmentOrigin 182 0 115 0 0 0)
                    #label: 'CheckToggle'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#ButtonSpec
                    #name: 'ModelButton'
                    #layout: #(#LayoutFrame 309 0 15 0 444 0 37 0)
                    #label: 'ModelButton'
                )
                 #(#LabelSpec
                    #name: 'UpDownButtonLabel'
                    #layout: #(#AlignmentOrigin 309 0 54 0 0 0)
                    #label: 'UpDownButton'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#UpDownButtonSpec
                    #name: 'UpDownButton'
                    #layout: #(#LayoutFrame 422 0 47 0 444 0 91 0)
                )
                 #(#LabelSpec
                    #name: 'ArrowButtonsLabel'
                    #layout: #(#AlignmentOrigin 309 0 86 0 0 0)
                    #label: 'ArrowButtons'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#ArrowButtonSpec
                    #name: 'ArrowButton - Up'
                    #layout: #(#LayoutFrame 309 0 111 0 331 0 133 0)
                    #isTriggerOnDown: true
                    #direction: #up
                )
                 #(#ArrowButtonSpec
                    #name: 'ArrowButton - Down'
                    #layout: #(#LayoutFrame 347 0 111 0 369 0 133 0)
                    #isTriggerOnDown: true
                    #direction: #down
                )
                 #(#ArrowButtonSpec
                    #name: 'ArrowButton - Left'
                    #layout: #(#LayoutFrame 385 0 111 0 407 0 133 0)
                    #isTriggerOnDown: true
                    #direction: #left
                )
                 #(#ArrowButtonSpec
                    #name: 'ArrowButton - Right'
                    #layout: #(#LayoutFrame 422 0 111 0 444 0 133 0)
                    #isTriggerOnDown: true
                    #direction: #right
                )
              )
          )
      )
!

standardGraphs
    "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 andSelector:#standardGraphs
     UISelectionPanel new openInterface:#standardGraphs
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Graphs'
              #layout: #(#LayoutFrame 114 0 373 0 583 0 615 0)
              #label: 'Graphs'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 114 373 584 616)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#GraphColumnView2DSpec
                    #name: 'GraphColumnView2D'
                    #layout: #(#LayoutFrame 15 0 15 0 220 0 110 0)
                    #gridX: 0
                    #gridY: 0
                )
                 #(#LabelSpec
                    #name: 'GraphColumnView2DLabel'
                    #layout: #(#AlignmentOrigin 19 0 19 0 0 0)
                    #label: 'GraphColumnViewView2D'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#GraphColumnView3DSpec
                    #name: 'GraphColumnView3D'
                    #layout: #(#LayoutFrame 240 0 15 0 445 0 110 0)
                )
                 #(#LabelSpec
                    #name: 'GraphColumnView3DLabel'
                    #layout: #(#AlignmentOrigin 244 0 19 0 0 0)
                    #label: 'GraphColumnViewView3D'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
              )
          )
      )
!

standardGroups
    "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 andSelector:#standardGroups
     UISelectionPanel new openInterface:#standardGroups
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Groups'
              #layout: #(#LayoutFrame 93 0 141 0 593 0 380 0)
              #label: 'Groups'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 93 141 594 381)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#ViewSpec
                    #name: 'Box'
                    #layout: #(#LayoutFrame 15 0 15 0 220 0 110 0)
                )
                 #(#LabelSpec
                    #name: 'ViewLabel'
                    #layout: #(#AlignmentOrigin 18 0 17 0 0 0)
                    #label: 'Box'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#LabelSpec
                    #name: 'VPanelLabel'
                    #layout: #(#LayoutFrame 15 0 116 0 220 0 139 0)
                    #label: 'Variable Panels'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #canUIDrag: false
                )
                 #(#VariableHorizontalPanelSpec
                    #name: 'VariableHorizontalPanel'
                    #layout: #(#LayoutFrame 15 0 140 0 110 0 230 0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#LabelSpec
                              #name: 'label4'
                              #label: 'A'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label5'
                              #label: 'B'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #canUIDrag: false
                          )
                        )
                    )
                    #handles: #(#Any 0.5 1.0)
                )
                 #(#VariableVerticalPanelSpec
                    #name: 'VariableVerticalPanel'
                    #layout: #(#LayoutFrame 125 0 140 0 220 0 230 0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#LabelSpec
                              #name: 'label9'
                              #label: 'A'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label10'
                              #label: 'B'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #canUIDrag: false
                          )
                        )
                    )
                    #handles: #(#Any 0.5 1.0)
                )
                 #(#FramedBoxSpec
                    #name: 'FramedBox'
                    #layout: #(#LayoutFrame 240 0 15 0 445 0 110 0)
                    #label: 'FramedBox'
                    #labelPosition: #topLeft
                )
                 #(#LabelSpec
                    #name: 'PanelLabel'
                    #layout: #(#LayoutFrame 240 0 116 0 445 0 139 0)
                    #label: 'Panels'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #canUIDrag: false
                )
                 #(#HorizontalPanelViewSpec
                    #name: 'HorizontalPanelView'
                    #layout: #(#LayoutFrame 240 0 140 0 324 0 230 0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#LabelSpec
                              #name: 'label1'
                              #label: 'A'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label2'
                              #label: 'B'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label3'
                              #label: 'C'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                        )
                    )
                    #horizontalLayout: #center
                    #verticalLayout: #center
                    #horizontalSpace: 3
                    #verticalSpace: 3
                )
                 #(#VerticalPanelViewSpec
                    #name: 'VerticalPanelView'
                    #layout: #(#LayoutFrame 332 0 140 0 379 0 230 0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#LabelSpec
                              #name: 'label6'
                              #label: 'A'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label7'
                              #label: 'B'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label8'
                              #label: 'C'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                        )
                    )
                    #horizontalLayout: #center
                    #verticalLayout: #center
                    #horizontalSpace: 3
                    #verticalSpace: 3
                )
                 #(#PanelViewSpec
                    #name: 'PanelView'
                    #layout: #(#LayoutFrame 387 0 140 0 445 0 230 0)
                    #component: 
                     #(#SpecCollection
                        #collection: 
                         #(
                           #(#LabelSpec
                              #name: 'label11'
                              #label: 'A'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label12'
                              #label: 'B'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label13'
                              #label: 'C'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label14'
                              #label: 'D'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                           #(#LabelSpec
                              #name: 'label15'
                              #label: 'E'
                              #style: #(#FontDescription #helvetica #medium #roman 12)
                              #level: 2
                              #extent: #(#Point 23 23)
                              #canUIDrag: false
                          )
                        )
                    )
                    #horizontalLayout: #fitSpace
                    #verticalLayout: #fitSpace
                    #horizontalSpace: 3
                    #verticalSpace: 3
                )
              )
          )
      )
!

standardLists
    "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 andSelector:#standardLists
     UISelectionPanel new openInterface:#standardLists
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Lists'
              #layout: #(#LayoutFrame 121 0 286 0 590 0 528 0)
              #label: 'Lists'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 121 286 591 529)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#SequenceViewSpec
                    #name: 'SelectionInListView'
                    #layout: #(#LayoutFrame 15 0 15 0 220 0 110 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                    #useIndex: false
                )
                 #(#LabelSpec
                    #name: 'SelectionInListLabel'
                    #layout: #(#AlignmentOrigin 42 0 19 0 0 0)
                    #label: 'SelectionInListView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#SelectionInTreeViewSpec
                    #name: 'SelectionInTreeView'
                    #layout: #(#LayoutFrame 15 0 130 0 220 0 225 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                    #hierarchicalList: #exampleTree
                )
                 #(#LabelSpec
                    #name: 'SelectionInTreeLabel'
                    #layout: #(#AlignmentOrigin 42 0 134 0 0 0)
                    #label: 'SelectionInTreeView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#DataSetSpec
                    #name: 'DataSetView'
                    #layout: #(#LayoutFrame 240 0 15 0 445 0 110 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                )
                 #(#LabelSpec
                    #name: 'DataSetSpecLabel'
                    #layout: #(#AlignmentOrigin 267 0 19 0 0 0)
                    #label: 'DataSetView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#FileSelectionTreeSpec
                    #name: 'FileSelectionTree'
                    #layout: #(#LayoutFrame 240 0 130 0 445 0 225 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                )
                 #(#LabelSpec
                    #name: 'FileSelectionTreeLabel'
                    #layout: #(#AlignmentOrigin 267 0 134 0 0 0)
                    #label: 'FileSelectionTree'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
              )
          )
      )
!

standardMenus
    "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 andSelector:#standardMenus
     UISelectionPanel new openInterface:#standardMenus
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Menus'
              #layout: #(#LayoutFrame 103 0 141 0 579 0 330 0)
              #label: 'Menus'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 103 141 580 331)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#MenuPanelSpec
                    #name: 'MenuPanel'
                    #layout: #(#LayoutFrame 15 0 15 0 140 0 38 0)
                    #menu: #menuPanelMenu
                )
                 #(#LabelSpec
                    #name: 'MenuPanelLabel'
                    #layout: #(#Point 18 22)
                    #label: 'MenuPanel'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#PopUpListSpec
                    #name: 'PopUpList'
                    #layout: #(#LayoutFrame 15 0 55 0 140 0 77 0)
                    #label: 'PopUpList'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #useIndex: false
                )
                 #(#ComboListSpec
                    #name: 'ComboListView'
                    #layout: #(#LayoutFrame 15 0 94 0 140 0 114 0)
                    #useIndex: false
                )
                 #(#LabelSpec
                    #name: 'ComboListLabel'
                    #layout: #(#LayoutFrame 17 0 96 0 95 0 114 0)
                    #label: 'ComboListView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#ComboBoxSpec
                    #name: 'ComboBoxView'
                    #layout: #(#LayoutFrame 15 0 130 0 140 0 150 0)
                )
                 #(#LabelSpec
                    #name: 'ComboBoxLabel'
                    #layout: #(#LayoutFrame 17 0 132 0 96 0 150 0)
                    #label: 'ComboBoxView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#TabViewSpec
                    #name: 'TabView'
                    #layout: #(#LayoutFrame 157 0 15 0 292 0 51 0)
                )
                 #(#LabelSpec
                    #name: 'TabLabel'
                    #layout: #(#Point 160 35)
                    #label: ' TabView '
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#NoteBookViewSpec
                    #name: 'NoteBookView'
                    #layout: #(#LayoutFrame 157 0 58 0 292 0 150 0)
                )
                 #(#LabelSpec
                    #name: 'NoteBookLabel'
                    #layout: #(#Point 161 134)
                    #label: 'NoteBookView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#UIGalleryViewSpec
                    #name: 'GalleryView'
                    #layout: #(#LayoutFrame 309 0 15 0 445 0 150 0)
                )
                 #(#LabelSpec
                    #name: 'GalleryLabel'
                    #layout: #(#Point 313 134)
                    #label: 'GalleryView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
              )
          )
      )
!

standardMisc
    "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 andSelector:#standardMisc
     UISelectionPanel new openInterface:#standardMisc
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Misc'
              #layout: #(#LayoutFrame 95 0 307 0 562 0 591 0)
              #label: 'Misc'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 95 307 563 592)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#ArbitraryComponentSpec
                    #name: 'ArbitraryComponent'
                    #layout: #(#LayoutFrame 15 0 15 0 140 0 110 0)
                    #hasBorder: false
                )
                 #(#LabelSpec
                    #name: 'ArbitraryComponentLabel'
                    #layout: #(#AlignmentOrigin 19 0 19 0 0 0)
                    #label: 'ArbitraryComponent'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#UISubSpecification
                    #name: 'SubSpecification'
                    #layout: #(#LayoutFrame 157 0 15 0 292 0 110 0)
                )
                 #(#LabelSpec
                    #name: 'SubSpecificationLabel'
                    #layout: #(#Point 161 19)
                    #label: 'SubSpecification'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#SubCanvasSpec
                    #name: 'SubCanvas'
                    #layout: #(#LayoutFrame 309 0 15 0 445 0 110 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                )
                 #(#LabelSpec
                    #name: 'SubCanvasLabel'
                    #layout: #(#AlignmentOrigin 336 0 19 0 0 0)
                    #label: 'SubCanvas'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#LabelSpec
                    #name: 'SliderLabel'
                    #layout: #(#AlignmentOrigin 93 0 129 0 1 0)
                    #label: 'Slider'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#SliderSpec
                    #name: 'Slider'
                    #layout: #(#LayoutFrame 103 0 126 0 218 0 144 0)
                    #orientation: #horizontal
                    #start: 0
                    #stop: 100
                    #step: 1
                )
                 #(#LabelSpec
                    #name: 'ThumbWheelLabel'
                    #layout: #(#AlignmentOrigin 93 0 166 0 1 0)
                    #label: 'ThumbWheel'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#ThumbWheelSpec
                    #name: 'ThumbWheel'
                    #layout: #(#LayoutFrame 103 0 161 0 218 0 181 0)
                    #orientation: #horizontal
                    #start: 0
                    #stop: 360
                    #step: 1
                )
                 #(#LabelSpec
                    #name: 'ProgressIndicatorLabel'
                    #layout: #(#AlignmentOrigin 339 0 129 0 1 0)
                    #label: 'ProgressIndicator'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#ProgressIndicatorSpec
                    #name: 'ProgressIndicator'
                    #layout: #(#LayoutFrame 350 0 126 0 445 0 144 0)
                    #showPercentage: true
                )
                 #(#LabelSpec
                    #name: 'SeparatorLabel'
                    #layout: #(#AlignmentOrigin 339 0 161 0 1 0)
                    #label: 'Separator'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#DividerSpec
                    #name: 'Separator'
                    #layout: #(#LayoutFrame 350 0 167 0 445 0 171 0)
                    #orientation: #horizontal
                )
                 #(#LabelSpec
                    #name: 'VisualRegionLabel'
                    #layout: #(#AlignmentOrigin 339 0 201 0 1 0)
                    #label: 'VisualRegion'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#RegionSpec
                    #name: 'VisualRegion'
                    #layout: #(#LayoutFrame 350 0 183 0 445 0 236 0)
                    #lineWidth: 2
                    #regionType: #ellipse
                )
              )
          )
      )
!

standardTexts
    "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 andSelector:#standardTexts
     UISelectionPanel new openInterface:#standardTexts
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #window: 
           #(#WindowSpec
              #name: 'Texts'
              #layout: #(#LayoutFrame 160 0 217 0 626 0 423 0)
              #label: 'Texts'
              #min: #(#Point 10 10)
              #max: #(#Point 1280 1024)
              #bounds: #(#Rectangle 160 217 627 424)
              #usePreferredExtent: false
          )
          #component: 
           #(#SpecCollection
              #collection: 
               #(
                 #(#TextEditorSpec
                    #name: 'TextView'
                    #layout: #(#LayoutFrame 15 0 15 0 220 0 110 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                )
                 #(#LabelSpec
                    #name: 'EditTextLabel'
                    #layout: #(#AlignmentOrigin 53 0 19 0 0 0)
                    #label: 'TextView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#HTMLViewSpec
                    #name: 'HTMLView'
                    #layout: #(#LayoutFrame 240 0 15 0 445 0 110 0)
                    #hasHorizontalScrollBar: true
                    #hasVerticalScrollBar: true
                )
                 #(#LabelSpec
                    #name: 'HTMLViewLabel'
                    #layout: #(#AlignmentOrigin 267 0 19 0 0 0)
                    #label: 'HTMLView'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#InputFieldSpec
                    #name: 'EditField'
                    #layout: #(#LayoutFrame 15 0 125 0 220 0 147 0)
                )
                 #(#LabelSpec
                    #name: 'EditFieldLabel'
                    #layout: #(#LayoutFrame 53 0 127 0 106 0 147 0)
                    #label: 'EditField'
                    #style: #(#FontDescription #helvetica #medium #roman 10)
                    #adjust: #left
                    #resizeForLabel: true
                    #canUIDrag: false
                )
                 #(#LabelSpec
                    #name: 'Label'
                    #layout: #(#LayoutFrame 240 0 125 0 445 0 147 0)
                    #label: 'Label'
                )
              )
          )
      )
!

standardUserPanel
    "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 andSelector:#standardUserPanel
     UISelectionPanel new openInterface:#standardUserPanel
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #'window:' 
           #(#WindowSpec
              #'name:' 'UserPanel'
              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
              #'label:' 'UserPanel'
              #'bounds:' #(#Rectangle 0 0 445 162)
          )
          #'component:' 
           #(#SpecCollection
              #'collection:' 
               #(
                 #(#LabelSpec
                    #'name:' 'helpText'
                    #'layout:' #(#Point 10 0)
                    #'labelChannel:' #userDefinedHelpText
                    #'resizeForLabel:' true
                    #'canUIDrag:' false
                )
              )
          )
      )
! !

!UISelectionPanel methodsFor:'actions'!

defineClassAndSelector
    |bd cls sel lbl|

    bd := IdentityDictionary new.
    bd at:#className put:( userClass asValue).
    bd at:#specsKey  put:( (userSpecs  ? '') asValue).
    bd at:#labelsKey put:( (userLabels ? '') asValue).
    bd at:#updateDefaultResources put:(false asValue).

    (self openDialogInterface:#nameAndSelectorSpec withBindings:bd) ifTrue:[
        (      (cls := (bd at:#className) value) notNil
          and:[(sel := (bd at:#specsKey)  value) notNil
          and:[(lbl := (bd at:#labelsKey) value) notNil]]
        ) ifTrue:[
            userClass  := cls.
            userSpecs  := sel.
            userLabels := lbl.

            (bd at:#updateDefaultResources) value ifTrue:[
                UserClass  := userClass.
                UserSpecs  := userSpecs.
                UserLabels := userLabels.
            ]
        ]
    ].
!

paste:something
    "paste something at a point
    "
    |coll specs point device gallery ext spec|

    clipBoardSpec isNil ifTrue:[
        clipBoardSpec := SpecCollection new.
        clipBoardSpec collection:(OrderedCollection new).
    ].
    coll    := clipBoardSpec collection.
    gallery := self builder componentAt:#gallery.
    device  := gallery device.

    point   := device translatePoint:(device pointerPosition)
                                from:(device rootView id)
                                  to:(gallery canvas id).

    point y < 1 ifTrue:[point y:1].
    ext := gallery extent - (10@10).

    (specs := something) isCollection ifFalse:[
        specs := Array with:something
    ].

    specs do:[:aSpec|
        point x > ext x ifTrue:[point x:1].
        point y > ext y ifTrue:[point y:1].

        spec := aSpec copy.
        spec layout:(LayoutOrigin fromPoint:point).
        coll add:spec.
        point := point + (20@20).
    ].
    gallery update.
!

raiseMenu
    "can open menu
    "
    |spec menu value paste|

    spec := self clientSpec value.

    spec notNil ifTrue:[
        menu := self class menuSelected decodeAsLiteralArray.
        self isClipBoard ifFalse:[
            (menu someMenuItemWithValue:#cut) disable.
        ].

        (value := menu startUp) == #cut ifTrue:[
            clipBoardSpec collection remove:spec ifAbsent:nil.
            (self builder componentAt:#gallery) update.
        ] ifFalse:[
            value == #copy ifTrue:[
                self window setSelection:spec
            ]
        ].
      ^ self
    ].

    self isUserBoard ifTrue:[
        ^ self defineClassAndSelector
    ].

    paste := self window getSelection.

    (self canPaste:paste) ifTrue:[
        menu := self class menuUnselected decodeAsLiteralArray.

        (menu startUp) == #paste ifTrue:[
            self paste:paste
        ]
    ].
! !

!UISelectionPanel methodsFor:'aspects'!

clientSpec
    "automatically generated by UIPainter ..."

    |holder|

    (holder := builder bindingAt:#clientSpec) isNil ifTrue:[
        builder aspectAt:#clientSpec put:(holder :=  ValueHolder new).
        holder addDependent:self.
    ].
    ^ holder
!

clipBoardSpec
    ^ clipBoardSpec
!

galleryList
    "automatically generated by UIPainter ..."

    |holder|

    (holder := builder bindingAt:#galleryList) isNil ifTrue:[
        builder aspectAt:#galleryList put:(holder :=  ValueHolder new).
    ].
    ^ holder
!

galleryModel
    "automatically generated by UIPainter ..."

    |holder|

    (holder := builder bindingAt:#galleryModel) isNil ifTrue:[
        builder aspectAt:#galleryModel put:(holder :=  ValueHolder new).
    ].
    ^ holder
!

majorChannel
    "automatically generated by UIPainter ..."

    |holder|

    (holder := builder bindingAt:#majorChannel) isNil ifTrue:[
        holder := AspectAdaptor new subject:self; forAspect:#majorSelection.
        builder aspectAt:#majorChannel put:holder.
    ].
    ^ holder
!

majorList
    "automatically generated by UIPainter ...
    "
  ^ self class specifications collect:[:el| el first]
!

minorKeys
    "automatically generated by UIPainter ..."

    |holder|

    (holder := builder bindingAt:#minorKeys) isNil ifTrue:[
        builder aspectAt:#minorKeys put:(holder :=  ValueHolder new).
    ].
    ^ holder
! !

!UISelectionPanel methodsFor:'change & update'!

update:something with:aParameter from:changedObject
    "one of my models changed its value
    "
    |channel label topView|

    (channel := self clientSpec) == changedObject ifTrue:[
        topView := builder window topView.

        (label := channel value) notNil ifTrue:[
            topView label:label name, ' '.
        ] ifFalse:[
            topView label:'Widget Gallery '
        ]
    ].

    super update:something with:aParameter from:changedObject.


! !

!UISelectionPanel methodsFor:'drag & drop'!

canDrop:something in:aComponent
    ^ self canPaste:(something collect:[:el| el theObject ]).
!

drop:something in:aComponent at:aPoint

    |spc top|

    top := DragAndDropManager dragOriginatorQuerySignal raise topView.

    top == aComponent topView ifTrue:[
        spc := self clientSpec value.
        spc isNil ifTrue:[^ self].

        (clipBoardSpec collection remove:spc ifAbsent:nil) isNil ifTrue:[
            ^ self
        ].
    ] ifFalse:[
        spc := something collect:[:el| el theObject].
    ].
    self paste:spc.
! !

!UISelectionPanel methodsFor:'queries'!

canPaste:something
    "returns true if something could be paste
    "
    (self isClipBoard and:[something notNil]) ifTrue:[
        something isCollection ifTrue:[
            something notEmpty ifTrue:[
                ^ (something at:1) isKindOf:UISpecification
            ]
        ] ifFalse:[
            ^ something isKindOf:UISpecification
        ]
    ].
    ^ false

!

isClipBoard
    "returns true if current view is clip board
    "
    majorSelection ~~ 0 ifTrue:[
        ^ (self majorList at:majorSelection) startsWith:'Clip'
    ].
  ^ false
!

isUserBoard
    "returns true if current view is clip board
    "
    majorSelection ~~ 0 ifTrue:[
        ^ (self majorList at:majorSelection) startsWith:'User'
    ].
  ^ false
! !

!UISelectionPanel methodsFor:'selection'!

majorSelection
    ^ majorSelection ? 0
!

majorSelection:aSelection
    |spec gallery|

    (majorSelection == aSelection or:[aSelection == 0]) ifTrue:[
        ^ self
    ].

    (self builder componentAt:#gallery) builder:nil.

    majorSelection := aSelection.
    spec := ((self class specifications) at:majorSelection) last.

    gallery := self galleryModel.
    gallery value:0.
    self minorKeys value:nil.

    spec isSymbol ifFalse:[
        self galleryList  value:(spec collect:[:a| a first]).
        self minorKeys setValue:(spec collect:[:a| a last]).
    ] ifTrue:[
        self perform:spec.
    ].
    gallery value:1.


! !

!UISelectionPanel methodsFor:'startup / release'!

closeRequest
    |sav|

    (sav := masterApplication) notNil ifTrue:[
        masterApplication := nil.
        sav closeRequestFor:(self window).
        masterApplication := sav.
    ] ifFalse:[
        super closeRequest.
    ]

    "Modified: 28.7.1997 / 09:44:40 / cg"
!

initialize
    super initialize.

    userClass  := UserClass.
    userSpecs  := UserSpecs.
    userLabels := UserLabels.

    majorSelection := 0.
!

postOpenWith:aBuilder
    self majorChannel value:1.
! !

!UISelectionPanel methodsFor:'user defined'!

userDefined
    |cls lbl sel builder|

    cls := self resolveName:userClass.

    (cls notNil and:[(cls respondsTo:userLabels)]) ifTrue:[
        lbl := cls perform:userLabels.
        sel := Array new:(lbl size) withAll:#userDefinedSpec.
        self galleryList value:lbl.
        self minorKeys   value:sel.
    ] ifFalse:[
        builder := UIBuilder new isEditing:true.

        builder application:self.
        (self builder componentAt:#gallery) builder:builder. 
        self galleryList value:#( '???' ).
        self minorKeys   value:#( standardUserPanel ).
    ]
!

userDefinedHelpText

^ '
no user defined specifications are configured yet. To assign
user defined specifications to the gallery press the middle
button of your mouse to open a dialog.
'
!

userDefinedSpec
    |cls spc idx|

    cls := self resolveName:userClass.

    (cls notNil and:[(cls respondsTo:userSpecs)]) ifTrue:[
        spc := cls perform:userSpecs.
        idx := self galleryModel value.

        idx <= spc size ifTrue:[
            spc := spc at:idx.
            (cls respondsTo:spc) ifTrue:[
                ^ cls perform:spc
            ]
        ]
    ].
  ^ nil
! !

!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"

    "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:#clocksSpec
     UISelectionPanel::ExampleUserDefinedGallery new openInterface:#clocksSpec
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #'window:' 
           #(#WindowSpec
              #'name:' 'Interface Builder'
              #'layout:' #(#LayoutFrame 22 0 236 0 401 0 506 0)
              #'label:' 'Interface Builder'
              #'min:' #(#Point 10 10)
              #'max:' #(#Point 1280 1024)
              #'bounds:' #(#Rectangle 22 236 402 507)
          )
          #'component:' 
           #(#SpecCollection
              #'collection:' 
               #(
                 #(#ArbitraryComponentSpec
                    #'name:' 'ClockView'
                    #'layout:' #(#LayoutFrame 11 0 11 0 125 0 123 0)
                    #'component:' #ClockView
                    #'hasBorder:' false
                )
                 #(#ArbitraryComponentSpec
                    #'name:' 'DigitalClockView'
                    #'layout:' #(#LayoutOrigin 136 0 11 0)
                    #'component:' #DigitalClockView
                    #'hasBorder:' false
                )
              )
          )
      )

    "Modified: / 4.10.1997 / 15:12:27 / cg"
    "Created: / 8.12.1997 / 18:40:22 / cg"
!

listOfLabels
    ^ LabelList

    "Created: / 5.12.1997 / 13:43:03 / cg"
    "Modified: / 8.12.1997 / 18:51:20 / cg"
!

listOfSelectors
    ^ 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'!

version
    ^ '$Header$'
! !
UISelectionPanel initialize!