DataSetBuilder.st
author Claus Gittinger <cg@exept.de>
Mon, 18 Sep 2006 15:24:36 +0200
changeset 2093 03b06966a94f
parent 2074 e641cebacc5c
child 2126 312bad3ba846
permissions -rw-r--r--
removed via FileBrowser

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





"{ Package: 'stx:libtool2' }"

ResourceSpecEditor subclass:#DataSetBuilder
	instanceVariableNames:'rowClass rowSuperClass columnView columns selectedColumnIndex
		modalOpened listOfSpecViews'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-UIPainter'
!

Array variableSubclass:#Row
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	privateIn:DataSetBuilder
!

!DataSetBuilder 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
"
    create and modify or inspect dataset columns; used by UIPainter (DataSetColumnSpec)

    [see also:]
        DataSetColumnSpec
        DataSetSpec
        DataSetView
        DataSetColumn

    [author:]
        Claus Atzkern, eXept Software AG
"

! !

!DataSetBuilder class methodsFor:'accessing'!

resourceType
    "get the type of resource of the method generated by the MenuEditor"

    ^#tableColumns


! !

!DataSetBuilder class methodsFor:'aspects'!

aspects
    "get the aspects for the attributes of the table columns"

    ^#(
        id
        label
        canSelect
        choices
        translatedChoices
        editorType
        formatString
        labelIsImage
        labelButtonType
        translateLabel
        longStringCompression
        size
        type
        width
        minWidth
        usePreferredWidth
        isResizeable
        height
        menu
        foregroundSelector
        backgroundSelector
        selectedForegroundSelector
        selectedBackgroundSelector
        doubleClickedSelector
        rowSeparatorSelector
        selectSelector
        converterSelector
        showComboFieldSelector
        printSelector
        readSelector
        writeSelector
        visibilitySelector
        rendererType
        showColSeparator
        showSelectionHighLighted
        showRowSeparator
        backgroundColor
        foregroundColor
        selectedBackgroundColor
        selectedForegroundColor
        labelForegroundColor
        labelBackgroundColor
        labelFont
        labelActionSelector
        labelActionArgument
        labelAlignment
        columnAlignment
        minValue
        maxValue
     )

    "Modified: / 19.5.1998 / 21:27:06 / cg"
! !

!DataSetBuilder class methodsFor:'help specs'!

flyByHelpSpec
    "This resource specification was automatically generated
     by the UIHelpTool of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIHelpTool may not be able to read the specification."

    "
     UIHelpTool openOnClass:DataSetBuilder    
    "

    <resource: #help>

    ^ super flyByHelpSpec addPairsFrom:#(

#addColumn
'Add a Column'

#fileLoad
'Load Column Description from Method'

#fileNew
'New Column Description'

#fileSave
'Save Column Description as Method'

#fileSaveAs
'Save Column Description as Method'

#editCut
'Cut Column'

#editCopy
'Copy Column'

#editPaste
'Paste Column'

)
!

helpSpec
    "This resource specification was automatically generated
     by the UIHelpTool of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIHelpTool may not be able to read the specification."

    "
     UIHelpTool openOnClass:DataSetBuilder    
    "

    <resource: #help>

    ^ super helpSpec addPairsFrom:#(

#addColumn
'Adds a new column.'

#basicsEditor
'Default widget type or a selector returning an instance of a user defined widget opened in the cell.'

#basicsFont
'Sets the font of the labeled text.'

#basicsJustification
'Aligns the label to the left, right, or center in the cell.'

#basicsJustificationEditor
'Aligns the column editor to the left, right, or center in the cell.'

#basicsLabel
'The label of the column, a String or an array of Strings.'

#basicsLabelId
'Unique identifier of the column (optional).'

#basicsLabelIsImage
'Label is actually the selector of a message providing an image-label.'

#basicsLabelTranslate
'Translate the label via the resource mechanism to a national language string.'

#basicsRenderer
'Specifies displaying cell as Text, CheckToggle, ComboBox, ComboList or as a RowSelector.'

#browseRowClass
'Open a browser on the row class'

#colorsBackgroundCellColor
'The background color of the cell.'

#colorsBackgroundLabelColor
'The background color of the label.'

#colorsBackgroundSelector
'Optional selector returning the background color for the cell.'

#colorsForegroundCellColor
'The foreground color of the cell.'

#colorsForegroundLabelColor
'The foreground color of the label.'

#colorsForegroundSelector
'Optional selector returning the foreground color for a cell.'

#converterSelector
'Selector returning a TypeConverter on the model the argument or nil.'

#fileLoad
'Specify class/selector and edit that column description'

#fileNew
'Discard changes and continue with a new, empty column description'

#fileSave
'Install the column description'

#fileSaveAs
'Specify class/selector and install the column description'

#formatFormatSelector
'Selector sent to the row to get the Format string.'

#formatInputType
'A type converter symbol used by the input field.'

#formatMaxSize
'Maximum size of the string which can be typed in. 0 or nil means unlimited.'

#formatTextFormat
'Format string specifying the output format of the cell text. (for example: %5.4f gives 0.0000).'

#frameColumnWidth
'Width (fixed or relative) of a column (optional).'

#frameMinWidth
'Minimum width of the column (optional).'

#frameRowHeight
'Height of the row (optional).'

#frameShowColumnSeparator
'Turns on/off displaying column separators.'

#frameShowRowSeparator
'Turns on/off displaying row separators.'

#frameShowRowSeparatorSelector
'Message selector to test if the bottom separator is shown.'

#generateCode
'Generate code and install in the selected class/selector.'

#isResizable
'Column can be resized by user.'

#pickColumns
'Select an open view and readOut the column specification from it.'

#selectedBackgroundCellColor
'Optional background color of a selected cell.'

#selectedBackgroundCellColorSelector
'Optional selector returning the background color for a selected cell.'

#selectedForegroundCellColor
'Optional foreground color of a selected cell.'

#selectedForegroundCellColorSelector
'Optional selector returning the foreground color for a selected cell.'

#selectionCellClickSelector
'Message sent if cell is about to be selected - return boolean to en/disable editing'

#selectionCellDoubleClickSelector
'Message sent if cell is double clicked'

#selectionCellSelector
'Name of the message sent to the row to validate a selection.'

#selectionIsSelectable
'Turns on/off selection behavior of a column.'

#selectionLabelClickSelector
'Message sent if a columns label was clicked on'

#selectionLabelSelectorArgument
'An optional argument passed with the message above.'

#showComboFieldSelector
'Selector which returns true if the editor on the ComboBox/List has an input field.'

#showSelectionHighLighted
'Show selected cell highligthened (change fg/bg color).'

#usePreferredWidth
'Compute width from first 10 row items.'

#valuesChoicesSelector
'Selector to get a collection of choices for a cell having a ComboBox or a ComboList widget.'

#valuesMenuSelector
'Selector to retrive the middle button menu.'

#valuesPrintSelector
'Selector used to register images on a DSVColumnView (the arg). For more detailed info see #register... methods in DSVColumnView.'

#valuesReadSelector
'Selector returning the label to be displayed (string, bitmap or a collection).'

#valuesVisibilitySelector
'Boolean message selector controlling the columns visibility.'

#valuesWriteSelector
'Selector used to set the value derived from the editor.'

#valuesXChoicesSelector
'Selector to get a collection of translated choices for a cell having a ComboBox or a ComboList widget.'

)
! !

!DataSetBuilder class methodsFor:'image specs'!

newColumnIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self newColumnIcon inspect
     ImageEditor openOnClass:self andSelector:#newColumnIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'DataSetBuilder newColumnIcon'
        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UT@@@@UPUTUUUXUPUTZ**,UPUTZB",UPUTX*H,UYUTX*H,UPUTZB",UPQTZ**,UPUTX*H,UPUTX*H,UPUTX*H,UPUTXB@,UPUTZ**,UPUTZ**,UPUTX"H,UYUTXB@,UPUTX"@,UPUTX"H,UPUTZ**,UPUTZ**,UPUT/??<UPUT@@@@UP') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 127 127 127]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A??@A??@A??@A??@A??@A??@A??@A??@A??CA??@A??@A??@A??@A??CA??AA??@A??CA??@A??CA??@A??@A??A') ; yourself); yourself]
! !

!DataSetBuilder class methodsFor:'interface specs'!

basicsEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#basicsEditSpec
     DataSetBuilder new openInterface:#basicsEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: basicsEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Basic'
          name: 'DataSet Basic'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 389 319)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Header:'
              name: 'framedBox1'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 187 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'ID:'
                    name: 'idLabel'
                    layout: (AlignmentOrigin 94 0 14 0 1 0.5)
                    resizeForLabel: true
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'idField'
                    layout: (LayoutFrame 97 0 0 0 2 1.0 22 0)
                    activeHelpKey: basicsLabelId
                    tabable: true
                    model: id
                    group: inputGroup
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Label:'
                    name: 'label1'
                    layout: (AlignmentOrigin 94 0 39 0 1 0.5)
                    resizeForLabel: true
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'labelField'
                    layout: (LayoutFrame 97 0 28 0 2 1.0 50 0)
                    activeHelpKey: basicsLabel
                    tabable: true
                    model: label
                    group: inputGroup
                    type: smalltalkObject
                    immediateAccept: false
                    acceptOnLeave: false
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Font:'
                    name: 'LabelFont'
                    layout: (AlignmentOrigin 94 0 68 0 1 0.5)
                    resizeForLabel: true
                    adjust: left
                    translateLabel: true
                  )
                 (FontMenuSpec
                    name: 'fontMenu'
                    layout: (LayoutFrame 97 0 56 0 0 1.0 78 0)
                    activeHelpKey: labelFont
                    model: style
                  )
                 (LabelSpec
                    label: 'Type:'
                    name: 'Type'
                    layout: (AlignmentOrigin 52 0 105 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ComboListSpec
                    name: 'labelButtonType'
                    layout: (LayoutFrame 57 0 96 0 182 0 116 0)
                    tabable: true
                    model: labelButtonType
                    comboList: 
                   (None
                      Button Group
                    )
                    useIndex: false
                    hidePullDownMenuButton: false
                  )
                 (LabelSpec
                    label: 'Align:'
                    name: 'JustificationLabel'
                    layout: (LayoutFrame 186 0 97 0 243 0 118 0)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (PopUpListSpec
                    label: 'Alignment'
                    name: 'Alignment'
                    layout: (LayoutFrame 248 0 97 0 2 1.0 119 0)
                    activeHelpKey: basicsJustification
                    tabable: true
                    model: labelAlignment
                    menu: 
                   (left
                      right center
                    )
                  )
                 (CheckBoxSpec
                    label: 'Label Is Image'
                    name: 'labelIsImage'
                    layout: (LayoutOrigin -3 0 126 0)
                    activeHelpKey: basicsLabelIsImage
                    tabable: true
                    model: labelIsImage
                    translateLabel: true
                  )
                 (CheckBoxSpec
                    label: 'Translate Label'
                    name: 'CheckBox2'
                    layout: (LayoutOrigin 200 0 126 0)
                    activeHelpKey: basicsLabelTranslate
                    tabable: true
                    model: translateLabel
                    translateLabel: true
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Cell Type:'
              name: 'typesFrame'
              layout: (LayoutFrame 0 0.0 190 0 0 1.0 304 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Renderer:'
                    name: 'rendererLabel'
                    layout: (AlignmentOrigin 94 0 16 0 1 0.5)
                    resizeForLabel: true
                    translateLabel: true
                  )
                 (ComboListSpec
                    name: 'rendererField'
                    layout: (LayoutFrame 97 0 5 0 2 1.0 27 0)
                    activeHelpKey: basicsRenderer
                    tabable: true
                    model: rendererType
                    comboList: rendererTypeList
                    useIndex: false
                    hidePullDownMenuButton: false
                  )
                 (LabelSpec
                    label: 'Editor:'
                    name: 'editorLabel'
                    layout: (AlignmentOrigin 94 0 42 0 1 0.5)
                    resizeForLabel: true
                    translateLabel: true
                  )
                 (ComboBoxSpec
                    name: 'editorField'
                    layout: (LayoutFrame 97 0 31 0 2 1.0 53 0)
                    activeHelpKey: basicsEditor
                    tabable: true
                    model: editorType
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                    comboList: editorTypeList
                    useIndex: false
                    isFilenameBox: false
                  )
                 (LabelSpec
                    label: 'Align:'
                    name: 'JustificationC'
                    layout: (LayoutFrame 185 0 58 0 243 0 79 0)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (PopUpListSpec
                    label: 'Alignment'
                    name: 'AlignmentC'
                    layout: (LayoutFrame 248 0 58 0 2 1.0 80 0)
                    activeHelpKey: basicsJustificationEditor
                    tabable: true
                    model: columnAlignment
                    menu: 
                   (left
                      right center
                      decimal
                    )
                  )
                 (CheckBoxSpec
                    label: 'Compress Long Strings'
                    name: 'LongStringCompressionCheckBox'
                    layout: (LayoutFrame -3 0 58 0 188 0 79 0)
                    activeHelpKey: basicsLabelTranslate
                    tabable: true
                    model: longStringCompression
                    translateLabel: true
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

colorsEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#colorsEditSpec
     DataSetBuilder new openInterface:#colorsEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: colorsEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Misc'
          name: 'DataSet Misc'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 369 451)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Label Colors:'
              name: 'ColorsBox'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 86 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Foreground:'
                    name: 'label1'
                    layout: (AlignmentOrigin 112 0 14 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'colorMenu1'
                    layout: (LayoutFrame 115 0 2 0 -3 1.0 24 0)
                    activeHelpKey: colorsForegroundLabelColor
                    model: labelForegroundColor
                    labelsAreColored: true
                  )
                 (LabelSpec
                    label: 'Background:'
                    name: 'label2'
                    layout: (AlignmentOrigin 112 0 42 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'colorMenu2'
                    layout: (LayoutFrame 115 0 30 0 -3 1.0 52 0)
                    activeHelpKey: colorsBackgroundLabelColor
                    model: labelBackgroundColor
                    labelsAreColored: false
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Cell Colors:'
              name: 'defaultColorsBox'
              layout: (LayoutFrame 0 0.0 91 0 0 1.0 232 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Foreground:'
                    name: 'fgLabel'
                    layout: (AlignmentOrigin 112 0 11 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'fgMenu'
                    layout: (LayoutFrame 115 0 -1 0 -3 1.0 21 0)
                    activeHelpKey: colorsForegroundCellColor
                    model: foregroundColor
                    labelsAreColored: true
                  )
                 (LabelSpec
                    label: 'Background:'
                    name: 'bgLabel'
                    layout: (AlignmentOrigin 112 0 39 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'bgMenu'
                    layout: (LayoutFrame 115 0 27 0 -3 1.0 49 0)
                    activeHelpKey: colorsBackgroundCellColor
                    model: backgroundColor
                    labelsAreColored: false
                  )
                 (LabelSpec
                    label: 'FG-Selector:'
                    name: 'fgSelLabel'
                    layout: (AlignmentOrigin 112 0 73 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'fgSelField'
                    layout: (LayoutFrame 115 0 62 0 0 1.0 84 0)
                    activeHelpKey: colorsForegroundSelector
                    tabable: true
                    model: foregroundSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'BG-Selector:'
                    name: 'bgSelLabel'
                    layout: (AlignmentOrigin 112 0 98 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'bgSelField'
                    layout: (LayoutFrame 115 0 87 0 0 1.0 109 0)
                    activeHelpKey: colorsBackgroundSelector
                    tabable: true
                    model: backgroundSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Selected Cell Colors:'
              name: 'selectedCellColorsBox'
              layout: (LayoutFrame 0 0.0 236 0 0 1.0 377 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Foreground:'
                    name: 'selFgLabel'
                    layout: (AlignmentOrigin 112 0 11 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'selFgMenu'
                    layout: (LayoutFrame 115 0 -1 0 -3 1.0 21 0)
                    activeHelpKey: selectedForegroundCellColorSelector
                    model: selectedForegroundColor
                    labelsAreColored: true
                  )
                 (LabelSpec
                    label: 'Background:'
                    name: 'selBgLabel'
                    layout: (AlignmentOrigin 112 0 39 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (ColorMenuSpec
                    name: 'selBgMenu'
                    layout: (LayoutFrame 115 0 27 0 -3 1.0 49 0)
                    activeHelpKey: colorsBackgroundCellColor
                    model: selectedBackgroundColor
                    labelsAreColored: false
                  )
                 (LabelSpec
                    label: 'FG-Selector:'
                    name: 'Label3'
                    layout: (AlignmentOrigin 112 0 73 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'EntryField1'
                    layout: (LayoutFrame 115 0 62 0 0 1.0 84 0)
                    activeHelpKey: colorsForegroundSelector
                    tabable: true
                    model: selectedForegroundSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'BG-Selector:'
                    name: 'Label4'
                    layout: (AlignmentOrigin 112 0 98 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'EntryField2'
                    layout: (LayoutFrame 115 0 87 0 0 1.0 109 0)
                    activeHelpKey: colorsBackgroundSelector
                    tabable: true
                    model: selectedBackgroundSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

defineClassNameSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#defineClassNameSpec
     DataSetBuilder new openInterface:#defineClassNameSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: defineClassNameSpec
        window: 
       (WindowSpec
          label: 'Data Set Builder'
          name: 'Data Set Builder'
          min: (Point 10 10)
          bounds: (Rectangle 14 46 341 182)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Class for code'
              name: 'framedBox1'
              layout: (LayoutFrame 0 0.0 3 0.0 0 1.0 -34 1.0)
              labelPosition: topLeft
              translateLabel: true
            )
           (LabelSpec
              label: 'Class:'
              name: 'classLabel'
              layout: (AlignmentOrigin 73 0.11 38 0 1 0.5)
              translateLabel: true
              resizeForLabel: true
              adjust: right
            )
           (InputFieldSpec
              name: 'classNameInputField'
              layout: (LayoutFrame 77 0.11 27 0 -16 1.0 49 0)
              tabable: true
              model: classNameChannel
              acceptOnPointerLeave: false
            )
           (LabelSpec
              label: 'Superclass:'
              name: 'superClassLabel'
              layout: (AlignmentOrigin 73 0.11 65 0 1 0.5)
              translateLabel: true
              resizeForLabel: true
              adjust: right
            )
           (InputFieldSpec
              name: 'superclassNameInputField'
              layout: (LayoutFrame 76 0.11 55 0 -16 1.0 77 0)
              tabable: true
              model: superclassNameChannel
              acceptOnPointerLeave: false
            )
           (UISubSpecification
              name: 'SubSpecification'
              layout: (LayoutFrame 0 0.0 -29 1 0 1.0 -5 1.0)
              majorKey: ToolApplicationModel
              minorKey: windowSpecForCommitWithoutChannels
            )
           )
         
        )
      )
!

formatEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#formatEditSpec
     DataSetBuilder new openInterface:#formatEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: formatEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Details'
          name: 'DataSet Details'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 388 149)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Input Format'
              name: 'framedBox1'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 149 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Input Type:'
                    name: 'typeLabel'
                    layout: (AlignmentOrigin 115 0 26 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                  )
                 (ComboListSpec
                    name: 'typeCombo'
                    layout: (LayoutFrame 118 0 15 0 3 1.0 37 0)
                    activeHelpKey: formatInputType
                    tabable: true
                    model: type
                    comboList: 
                   (string
                      password number
                      numberOrNil symbolOrNil
                    )
                    useIndex: false
                    hidePullDownMenuButton: false
                  )
                 (LabelSpec
                    label: 'Max Size:'
                    name: 'sizeLabel'
                    layout: (AlignmentOrigin 115 0 52 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                  )
                 (InputFieldSpec
                    name: 'sizeField'
                    layout: (LayoutFrame 118 0 41 0 3 1.0 63 0)
                    activeHelpKey: formatMaxSize
                    tabable: true
                    model: size
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Text Format:'
                    name: 'formatLabel'
                    layout: (AlignmentOrigin 115 0 77 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                  )
                 (InputFieldSpec
                    name: 'formatField'
                    layout: (LayoutFrame 118 0 66 0 3 1.0 88 0)
                    activeHelpKey: formatTextFormat
                    tabable: true
                    model: formatString
                    group: inputGroup
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Format Selector:'
                    name: 'formatSelectorLabel'
                    layout: (AlignmentOrigin 115 0 103 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                  )
                 (InputFieldSpec
                    name: 'formatSelector'
                    layout: (LayoutFrame 118 0 92 0 3 1.0 114 0)
                    activeHelpKey: formatTextFormat
                    tabable: true
                    model: formatSelector
                    group: inputGroup
                    formatString: ''
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

frameEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#frameEditSpec
     DataSetBuilder new openInterface:#frameEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: frameEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Dimension'
          name: 'DataSet Dimension'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 396 313)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Separators'
              name: 'separatorBox'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 132 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (CheckBoxSpec
                    label: 'Show Row-Separator'
                    name: 'showRowSeparator'
                    layout: (LayoutFrame 5 0 15 0 293 0 38 0)
                    activeHelpKey: frameShowRowSeparator
                    tabable: true
                    model: showRowSeparator
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'rowSeparatorSelector'
                    layout: (LayoutFrame 142 0 41 0 2 1.0 63 0)
                    activeHelpKey: frameShowRowSeparatorSelector
                    tabable: true
                    model: rowSeparatorSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (CheckBoxSpec
                    label: 'Show Column-Separator'
                    name: 'showColSeparator'
                    layout: (LayoutFrame 5 0 70 0 294 0 93 0)
                    activeHelpKey: frameShowColumnSeparator
                    tabable: true
                    model: showColSeparator
                    translateLabel: true
                  )
                 (LabelSpec
                    label: 'Selector:'
                    name: 'Label1'
                    layout: (LayoutFrame 80 0.0 44 0 140 0.0 61 0)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Dimensions:'
              name: 'framedBox1'
              layout: (LayoutFrame 0 0.0 133 0 0 1.0 305 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Column Width:'
                    name: 'widthLabel'
                    layout: (AlignmentOrigin 140 0.0 23 0 1 0.5)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'widthField'
                    layout: (LayoutFrame 142 0 12 0 2 1.0 34 0)
                    activeHelpKey: frameColumnWidth
                    tabable: true
                    model: width
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Min. Width:'
                    name: 'minWidthLabel'
                    layout: (AlignmentOrigin 140 0.0 51 0 1 0.5)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'minWidthField'
                    layout: (LayoutFrame 142 0 40 0 2 1.0 62 0)
                    activeHelpKey: frameMinWidth
                    tabable: true
                    model: minWidth
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Row Height:'
                    name: 'heightLabel'
                    layout: (AlignmentOrigin 140 0.0 79 0 1 0.5)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'heightField'
                    layout: (LayoutFrame 142 0 68 0 2 1.0 90 0)
                    activeHelpKey: frameRowHeight
                    tabable: true
                    model: height
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (CheckBoxSpec
                    label: 'Compute Width from Items'
                    name: 'usePreferredWidth'
                    layout: (LayoutFrame 5 0 96 0 -5 1 118 0)
                    activeHelpKey: usePreferredWidth
                    tabable: true
                    model: usePreferredWidth
                    translateLabel: true
                  )
                 (CheckBoxSpec
                    label: 'Is Resizeable'
                    name: 'isResizeable'
                    layout: (LayoutFrame 5 0 121 0 -5 1.0 144 0)
                    activeHelpKey: isResizeable
                    tabable: true
                    model: isResizeable
                    translateLabel: true
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

selectionEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#selectionEditSpec
     DataSetBuilder new openInterface:#selectionEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: selectionEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Basic'
          name: 'DataSet Basic'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 331 328)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Label Select Action:'
              name: 'LabelSelectAction'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 97 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Selector:'
                    name: 'ActionLabel'
                    layout: (AlignmentOrigin 95 0 20 0 1 0.5)
                    resizeForLabel: true
                    adjust: left
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'ActionSelector'
                    layout: (LayoutFrame 98 0 9 0 3 1.0 31 0)
                    activeHelpKey: selectionLabelClickSelector
                    tabable: true
                    model: labelActionSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Argument:'
                    name: 'ArgumentLabel'
                    layout: (AlignmentOrigin 95 0 48 0 1 0.5)
                    resizeForLabel: true
                    adjust: left
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'ArgumentValue'
                    layout: (LayoutFrame 98 0 37 0 3 1.0 59 0)
                    activeHelpKey: selectionLabelSelectorArgument
                    tabable: true
                    model: labelActionArgument
                    group: inputGroup
                    type: string
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Cell Selection:'
              name: 'CellSelection'
              layout: (LayoutFrame 0 0.0 105 0 0 1.0 215 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (CheckBoxSpec
                    label: 'Is Selectable'
                    name: 'canSelect'
                    layout: (Point 95 -4)
                    activeHelpKey: selectionIsSelectable
                    tabable: true
                    model: canSelect
                    translateLabel: true
                  )
                 (LabelSpec
                    label: 'Selector:'
                    name: 'selectorLabel'
                    layout: (AlignmentOrigin 95 0 37 0 1 0.5)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'selectSelector'
                    layout: (LayoutFrame 98 0 26 0 3 1.0 48 0)
                    activeHelpKey: selectionCellClickSelector
                    tabable: true
                    model: selectSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (CheckBoxSpec
                    label: 'Show Selection HighLightened'
                    name: 'showSelectionHighLightened'
                    layout: (LayoutFrame 95 0 53 0 3 1.0 77 0)
                    activeHelpKey: showSelectionHighLighted
                    tabable: true
                    model: showSelectionHighLighted
                    translateLabel: true
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Cell Double Click:'
              name: 'CellDoubleClick'
              layout: (LayoutFrame 0 0.0 227 0 0 1.0 293 0)
              labelPosition: topLeft
                    translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Selector:'
                    name: 'doubleLabel'
                    layout: (AlignmentOrigin 95 0 19 0 1 0.5)
                    resizeForLabel: true
                    adjust: right
                    translateLabel: true
                  )
                 (InputFieldSpec
                    name: 'doubleClicked'
                    layout: (LayoutFrame 98 0 8 0 3 1.0 30 0)
                    activeHelpKey: selectionCellDoubleClickSelector
                    tabable: true
                    model: doubleClickedSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

slices
    ^#(
        (Basics         basicsEditSpec)
        (Values         valuesEditSpec)
        (Format         formatEditSpec)
        (Selection      selectionEditSpec)
        (Frame          frameEditSpec)
        (Colors         colorsEditSpec)
    )
!

valuesEditSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#valuesEditSpec
     DataSetBuilder new openInterface:#valuesEditSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: valuesEditSpec
        window: 
       (WindowSpec
          label: 'DataSet Basic'
          name: 'DataSet Basic'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 436 387)
        )
        component: 
       (SpecCollection
          collection: (
           (FramedBoxSpec
              label: 'Value Selectors:'
              name: 'valuesBox'
              layout: (LayoutFrame 0 0.0 3 0 0 1.0 163 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Read:'
                    name: 'readLabel'
                    layout: (AlignmentOrigin 94 0 15 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'readSelector'
                    layout: (LayoutFrame 97 0 4 0 2 1.0 26 0)
                    activeHelpKey: valuesReadSelector
                    tabable: true
                    model: readSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Write:'
                    name: 'writeLabel'
                    layout: (AlignmentOrigin 94 0 40 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'writeSelector'
                    layout: (LayoutFrame 97 0 29 0 2 1.0 51 0)
                    activeHelpKey: valuesWriteSelector
                    tabable: true
                    model: writeSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Converter:'
                    name: 'converterLabel'
                    layout: (AlignmentOrigin 94 0 65 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'converterField'
                    layout: (LayoutFrame 97 0 54 0 2 1.0 76 0)
                    activeHelpKey: converterSelector
                    tabable: true
                    model: converterSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Print:'
                    name: 'printLabel'
                    layout: (AlignmentOrigin 94 0 90 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'printSelector'
                    layout: (LayoutFrame 97 0 79 0 2 1.0 101 0)
                    activeHelpKey: valuesPrintSelector
                    tabable: true
                    model: printSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Visibility:'
                    name: 'visibilityLabel'
                    layout: (AlignmentOrigin 94 0 115 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'visibilitySelector'
                    layout: (LayoutFrame 97 0 104 0 2 1.0 126 0)
                    activeHelpKey: valuesVisibilitySelector
                    tabable: true
                    model: visibilitySelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Range:'
              name: 'rangeBox'
              layout: (LayoutFrame 0 0.0 162 0 0 1.0 218 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Min:'
                    name: 'Label1'
                    layout: (LayoutFrame 11 0 3 0 94 0 20 0)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'EntryField1'
                    layout: (LayoutFrame 97 0 1 0 20 0.5 23 0)
                    activeHelpKey: valuesMenuSelector
                    tabable: true
                    model: minValue
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLeave: true
                    acceptOnLostFocus: true
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: true
                  )
                 (LabelSpec
                    label: 'Max:'
                    name: 'Label2'
                    layout: (LayoutFrame 21 0.5 3 0 70 0.5 20 0)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'EntryField2'
                    layout: (LayoutFrame 70 0.5 1 0 -2 1.0 23 0)
                    activeHelpKey: valuesMenuSelector
                    tabable: true
                    model: maxValue
                    group: inputGroup
                    type: numberOrNil
                    acceptOnLeave: true
                    acceptOnLostFocus: true
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: true
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Menu Selector:'
              name: 'menusBox'
              layout: (LayoutFrame 0 0.0 216 0 0 1.0 272 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Selector:'
                    name: 'menuLabel'
                    layout: (AlignmentOrigin 94 0 12 0 1 0.5)
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'menuSelector'
                    layout: (LayoutFrame 97 0 1 0 2 1.0 23 0)
                    activeHelpKey: valuesMenuSelector
                    tabable: true
                    model: menu
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           (FramedBoxSpec
              label: 'Combo List/Box Selectors:'
              name: 'comboSelectorsBox'
              layout: (LayoutFrame 1 0.0 271 0 1 1.0 378 0)
              labelPosition: topLeft
              translateLabel: true
              component: 
             (SpecCollection
                collection: (
                 (LabelSpec
                    label: 'Choices:'
                    name: 'ChoicesLabel'
                    layout: (AlignmentOrigin 94 0 15 0 1 0.5)
                    activeHelpKey: valuesChoicesSelector
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'ChoicesField'
                    layout: (LayoutFrame 97 0 4 0 2 1.0 26 0)
                    activeHelpKey: valuesChoicesSelector
                    tabable: true
                    model: choices
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLeave: false
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Translated Choices:'
                    name: 'XChoicesLabel'
                    layout: (AlignmentOrigin 94 0 40 0 1 0.5)
                    activeHelpKey: valuesXChoicesSelector
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'XChoicesField'
                    layout: (LayoutFrame 97 0 29 0 2 1.0 51 0)
                    activeHelpKey: valuesXChoicesSelector
                    tabable: true
                    model: translatedChoices
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLeave: false
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 (LabelSpec
                    label: 'Editable:'
                    name: 'EditableLabel'
                    layout: (AlignmentOrigin 94 0 65 0 1 0.5)
                    activeHelpKey: showComboFieldSelector
                    translateLabel: true
                    resizeForLabel: true
                    adjust: right
                  )
                 (InputFieldSpec
                    name: 'EditableField'
                    layout: (LayoutFrame 97 0 54 0 2 1.0 76 0)
                    activeHelpKey: showComboFieldSelector
                    tabable: true
                    model: showComboFieldSelector
                    group: inputGroup
                    type: symbolOrNil
                    acceptOnLeave: false
                    acceptOnLostFocus: false
                    acceptChannel: acceptChannel
                    modifiedChannel: modifiedChannel
                    acceptOnPointerLeave: false
                  )
                 )
               
              )
            )
           )
         
        )
      )
!

windowSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:DataSetBuilder andSelector:#windowSpec
     DataSetBuilder new openInterface:#windowSpec
     DataSetBuilder open
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: windowSpec
        window: 
       (WindowSpec
          label: 'Data Set Builder'
          name: 'Data Set Builder'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 633 658)
          menu: menu
        )
        component: 
       (SpecCollection
          collection: (
           (MenuPanelSpec
              name: 'menuToolbarView'
              layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 32 0)
              tabable: true
              menu: menuToolbar
            )
           (VariableVerticalPanelSpec
              name: 'mainPanel'
              layout: (LayoutFrame 0 0.0 38 0.0 0 1.0 -26 1.0)
              component: 
             (SpecCollection
                collection: (
                 (FramedBoxSpec
                    label: 'Table Columns'
                    name: 'FramedBox'
                    labelPosition: topLeft
                    translateLabel: true
                    component: 
                   (SpecCollection
                      collection: (
                       (DataSetSpec
                          name: 'columnView'
                          layout: (LayoutFrame 2 0.0 6 0.0 2 1.0 6 1.0)
                          hasHorizontalScrollBar: true
                          hasVerticalScrollBar: false
                          miniScrollerHorizontal: true
                          useIndex: false
                          has3Dseparators: true
                        )
                       )
                     
                    )
                  )
                 (VariableHorizontalPanelSpec
                    name: 'VariablePanel'
                    level: -1
                    component: 
                   (SpecCollection
                      collection: (
                       (ViewSpec
                          name: 'labelsView'
                          component: 
                         (SpecCollection
                            collection: (
                             (SequenceViewSpec
                                name: 'labelAndColumns'
                                layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
                                tabable: true
                                model: selectedColumnModel
                                menu: menuEdit
                                hasHorizontalScrollBar: true
                                hasVerticalScrollBar: true
                                miniScrollerHorizontal: true
                                useIndex: true
                                sequenceList: seqList
                              )
                             )
                           
                          )
                        )
                       (ViewSpec
                          name: 'specView'
                          level: -1
                          component: 
                         (SpecCollection
                            collection: (
                             (NoteBookViewSpec
                                name: 'NoteBook'
                                layout: (LayoutFrame 1 0.0 0 0.0 0 1.0 -30 1.0)
                                tabable: true
                                model: tabModel
                                menu: tabList
                                useIndex: true
                                canvas: canvasHolder
                                keepCanvasAlive: true
                              )
                             (UISubSpecification
                                name: 'SubSpecification'
                                layout: (LayoutFrame 2 0.0 -26 1 -2 1.0 -2 1.0)
                                majorKey: ToolApplicationModel
                                minorKey: windowSpecForCommit
                              )
                             )
                           
                          )
                        )
                       )
                     
                    )
                    handles: (Any 0.235387 1.0)
                  )
                 )
               
              )
              handles: (Any 0.208748 1.0)
            )
           (UISubSpecification
              name: 'infoBarSubSpec'
              layout: (LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0)
              majorKey: ToolApplicationModel
              minorKey: windowSpecForInfoBar
            )
           )
         
        )
      )
! !

!DataSetBuilder class methodsFor:'menu specs'!

menu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."

    "
     MenuEditor new openOnClass:DataSetBuilder andSelector:#menu
     (Menu new fromLiteralArrayEncoding:(DataSetBuilder menu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            label: 'File'
            translateLabel: true
            submenu: 
           (Menu
              (
               (MenuItem
                  activeHelpKey: fileNew
                  label: 'New'
                  itemValue: doNew
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                )
               (MenuItem
                  activeHelpKey: fileLoad
                  label: 'Load...'
                  itemValue: doLoad
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                )
               (MenuItem
                  activeHelpKey: fileSave
                  label: 'Save'
                  itemValue: doSave
                  translateLabel: true
                )
               (MenuItem
                  activeHelpKey: fileSaveAs
                  label: 'Save As...'
                  itemValue: doSaveAs
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                )
               (MenuItem
                  activeHelpKey: pickColumns
                  label: 'Pick Columns...'
                  itemValue: doPickColumns
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                  isVisible: isStandAlone
                )
               (MenuItem
                  activeHelpKey: fileBrowseClass
                  label: 'Browse Class'
                  itemValue: doBrowseClass
                  translateLabel: true
                  isVisible: isStandAlone
                )
               (MenuItem
                  label: '-'
                  isVisible: isStandAlone
                )
               (MenuItem
                  activeHelpKey: fileExit
                  label: 'Exit'
                  itemValue: closeRequest
                  translateLabel: true
                  isVisible: isStandAlone
                )
               )
              nil
              nil
            )
          )
         (MenuItem
            label: 'Edit'
            translateLabel: true
            submenuChannel: menuEdit
          )
         (MenuItem
            label: 'Add'
            translateLabel: true
            submenu: 
           (Menu
              (
               (MenuItem
                  activeHelpKey: addColumn
                  enabled: columnIsNotEditing
                  label: 'Column'
                  itemValue: doCreateColumn
                  translateLabel: true
                  labelImage: (ResourceRetriever nil newColumnIcon 'Column')
                )
               )
              nil
              nil
            )
          )
         (MenuItem
            label: 'Generate'
            translateLabel: true
            submenu: 
           (Menu
              (
               (MenuItem
                  activeHelpKey: fileDefineClass
                  label: 'Define Row Class...'
                  itemValue: doDefineRowClass
                  translateLabel: true
                )
               (MenuItem
                  activeHelpKey: browseRowClass
                  label: 'Browse Row Class'
                  itemValue: doBrowseRowClass
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                )
               (MenuItem
                  activeHelpKey: generateCode
                  label: 'Generate Code'
                  itemValue: doGenerateCode
                  translateLabel: true
                )
               )
              nil
              nil
            )
          )
         (MenuItem
            label: 'History'
            translateLabel: true
            isVisible: isStandAlone
            submenuChannel: menuHistory
          )
         (MenuItem
            label: 'Help'
            translateLabel: true
            startGroup: right
            submenuChannel: menuHelp
          )
         )
        nil
        nil
      )
!

menuEdit
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."

    "
     MenuEditor new openOnClass:DataSetBuilder andSelector:#menuEdit
     (Menu new fromLiteralArrayEncoding:(DataSetBuilder menuEdit)) startUp
    "

    <resource: #menu>

    ^
     
       #(#Menu
          
           #(
             #(#MenuItem
                #label: 'Cut'
                #translateLabel: true
                #value: #doCut
                #activeHelpKey: #editCut
                #enabled: #isColumnSelected
            )
             #(#MenuItem
                #label: 'Copy'
                #translateLabel: true
                #value: #doCopy
                #activeHelpKey: #editCopy
                #enabled: #isColumnSelected
            )
             #(#MenuItem
                #label: 'Paste'
                #translateLabel: true
                #value: #doPaste
                #activeHelpKey: #editPaste
                #enabled: #valueOfHavingClipboard
            )
             #(#MenuItem
                #label: 'Delete'
                #translateLabel: true
                #value: #doDelete
                #activeHelpKey: #editDelete
                #enabled: #valueOfHavingClipboard
            )
             #(#MenuItem
                #label: '-'
            )
             #(#MenuItem
                #label: 'Move Up'
                #translateLabel: true
                #value: #doMoveColumn:
                #activeHelpKey: #editMoveUp
                #enabled: #isColumnSelected
                #argument: #up
                #labelImage: #(#ResourceRetriever #Icon #upIcon 'Move Up')
            )
             #(#MenuItem
                #label: 'Move Down'
                #translateLabel: true
                #value: #doMoveColumn:
                #activeHelpKey: #editMoveDown
                #enabled: #isColumnSelected
                #argument: #down
                #labelImage: #(#ResourceRetriever #Icon #downIcon 'Move Down')
            )
          ) nil
          nil
      )
!

menuToolbar
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."

    "
     MenuEditor new openOnClass:DataSetBuilder andSelector:#menuToolbar
     (Menu new fromLiteralArrayEncoding:(DataSetBuilder menuToolbar)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            activeHelpKey: fileNew
            label: 'New'
            itemValue: doNew
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary newDataSetIcon)
          )
         (MenuItem
            activeHelpKey: fileLoad
            label: 'Load'
            itemValue: doLoad
            translateLabel: true
            isButton: true
            submenuChannel: menuHistory
            labelImage: (ResourceRetriever ToolbarIconLibrary loadFromMethodIcon)
          )
         (MenuItem
            activeHelpKey: fileSave
            label: 'Save'
            itemValue: doSave
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary saveAsMethodIcon)
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            activeHelpKey: editCut
            enabled: isColumnSelected
            label: 'Cut'
            itemValue: doCut
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary cutWidgetIcon)
          )
         (MenuItem
            activeHelpKey: editCopy
            enabled: isColumnSelected
            label: 'Copy'
            itemValue: doCopy
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary copyWidgetIcon)
          )
         (MenuItem
            activeHelpKey: editPaste
            enabled: canPasteHolder
            label: 'Paste'
            itemValue: doPaste
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary pasteWidgetIcon)
          )
         (MenuItem
            activeHelpKey: editDelete
            enabled: isColumnSelected
            label: 'Delete'
            itemValue: doDelete
            translateLabel: true
            isButton: true
            isVisible: false
            labelImage: (ResourceRetriever ToolbarIconLibrary deleteWidgetIcon)
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            activeHelpKey: addColumn
            enabled: columnIsNotEditing
            label: 'Add Column'
            itemValue: doCreateColumn
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever nil newColumnIcon)
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            activeHelpKey: editMoveUp
            enabled: isColumnSelected
            label: 'Move Up'
            itemValue: doMoveColumn:
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever Icon upIcon)
            argument: up
          )
         (MenuItem
            activeHelpKey: editMoveDown
            enabled: isColumnSelected
            label: 'Move Down'
            itemValue: doMoveColumn:
            translateLabel: true
            isButton: true
            labelImage: (ResourceRetriever Icon downIcon)
            argument: down
          )
         )
        nil
        nil
      )
! !

!DataSetBuilder methodsFor:'accessing'!

columns
    "returns list of columns"

    ^ columns
!

columns:aListOfColumns
    "setup columns from a column view"

    |list|

    columns    := OrderedCollection new.
    list       := self seqList.

    list removeAll.

    aListOfColumns size ~~ 0 ifTrue:[
        aListOfColumns do:[:aColumn||column|
            (column := aColumn) isSequenceable ifTrue:[
                column := DataSetColumnSpec new fromLiteralArrayEncoding:aColumn
            ] ifFalse:[
                column := aColumn copy
            ].
            columns add:column.
            list add:(self labelFromColumn:column).  
        ]
    ].
    self updateColumnView.

!

resolveRowClass
    "returns the resolved row class
    "
    ^ Smalltalk resolveName:rowClass inClass:self class
!

rowClassName

    ^ self resolveRowClass notNil ifTrue:[rowClass] ifFalse:[nil]
!

rowClassName:aClassName

    |cls|

    rowSuperClass := nil.

    (rowClass := aClassName) notNil ifTrue:[
        (cls := self resolveRowClass) notNil 
            ifTrue: [rowSuperClass := cls superclass name asString] 
            ifFalse:[rowSuperClass := 'Object']
    ]

! !

!DataSetBuilder methodsFor:'aspects'!

canvasHolder
    "returns a value holder which keeps selected column"

    |holder|

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

columnIsNotEditing
    "returns a boolean value holder which is set to true if column is not editing"

    |holder|

    (holder := builder bindingAt:#columnIsNotEditing) isNil ifTrue:[
        holder := BlockValue forLogicalNot:(self modifiedChannel).
        builder aspectAt:#columnIsNotEditing put:holder.
    ].
    ^ holder

!

editorTypeList
    "generate list of supported editor types"

    |list|

    (list := builder bindingAt:#editorTypeList) isNil ifTrue:[
        list := (DataSetColumnSpec slices collect:[:eachSlice | eachSlice at:1]) asSet.
        list := list asOrderedCollection sort.
        builder aspectAt:#editorTypeList put:list
    ].
    ^list
!

isColumnSelected
    "returns a boolean value holder which is set to true if something is modified
     and not accepted"

    ^builder valueAspectFor:#isColumnSelected initialValue: false



!

menuEdit
    "redefined to access my menu and not of the UIPainter
    "
    ^ self class menuEdit
!

rendererTypeList
    "generate list of supported renderer types"

    |list|

    (list := builder bindingAt:#rendererTypeList) isNil ifTrue:[
        list := (DataSetColumnSpec slices collect:[:eachSlice | eachSlice at:2]) asSet.
        list := list asOrderedCollection sort.
        builder aspectAt:#rendererTypeList put:list
    ].
    ^list
!

selectedColumnModel
    "returns a value holder which keeps selected column"

    |holder|

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

seqList
    ^ builder listAspectFor:#seqList
!

style

    ^self aspectFor:#labelFont
!

tabList

    ^self class slices collect:[:aSlice|aSlice first]

! !

!DataSetBuilder methodsFor:'building'!

buildFromResourceSpec:aResourceSpec

    self columns:aResourceSpec.

"/    columns notEmpty ifTrue: [
"/        self tabModel value: 1. 
"/        self selectedColumnModel value:nil; value:1.    "/ toggle to force change
"/        self updateInputFields.
"/        self updateInfoLabel.
"/        self updateHistory
"/    ].

!

loadFromClass:aClass andSelector:aSelector
    |updateBlock cls list|

    self assert:(aClass isNil or:[aClass isClass]).

    selectedColumnIndex := 0.

    updateBlock := [
        columns notEmpty ifTrue: [
            self tabModel value:0; value:1.                 "/ toggle to force change
            self selectedColumnModel value:nil; value:1.    "/ toggle to force change
            self updateColumnView.
            self updateInputFields.
            self updateInfoLabel.
            self updateHistory.
            self clearModifiedFlag.
            self enablingCommitButtonsHolder value:false.
        ]
    ].

    "if opened on table columns"  

    aClass isNil ifTrue: [ 
        self tabModel value: 0. 
        self columns removeAll.
        self seqList removeAll.
        self updateColumnView.
        self updateInfoLabel.
        self isColumnSelected value: false.
        ^ self.
    ].

    specSelector isNil ifTrue: [updateBlock value. ^self].

    list := nil.

    (aClass notNil or:[self isStandAlone or:[self window shown]]) ifTrue:[
        (aClass notNil and:[aSelector notNil]) ifTrue:[
            cls := aClass isBehavior ifTrue:[ aClass ] ifFalse:[ self resolveName:aClass].

            (cls respondsTo: aSelector) ifTrue:[ 
                list := cls perform: aSelector.
            ].
        ]
    ] ifFalse:[
        list := columns
    ].
    self columns:list.
    updateBlock value.
! !

!DataSetBuilder methodsFor:'code generation'!

compile:aCode forClass:aClass inCategory:aCategory
    "compile method for class in a category"

    aClass 
        compile:(aCode withCRs) 
        classified:aCategory
!

generateBackgroundSelectorIn:aClass
    "generate code for #backgroundSelector"

    |sel catg code bCode|

    catg := #'accessing look'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "specific background color for a cell"\'
            , '\'
            .

    columns do:
    [:aColumn|
        ((sel := aColumn backgroundSelector) notNil and:[(aClass includesSelector:sel) not]) 
        ifTrue:
        [
            bCode := sel asString, code, '    ^nil'.
            self compile:bCode forClass:aClass inCategory:catg
        ]
    ]
!

generateChoicesIn:aClass
    "generate code for #choices"

    |sel catg code edt|

    catg := #'accessing menu'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "get choices for visual editor; (a list of labels)..."\'
            , '\'
            , '    ^ #( foo bar baz )'
            .

    columns do:[:aColumn|
        edt := aColumn editorType.

        (      aColumn canSelect
          and:[(sel := aColumn choices) notNil
          and:[(edt == #ComboBox or:[edt == #ComboList])
          and:[(aClass includesSelector:sel) not]]]
        ) ifTrue:[
            self compile:(sel asString, code) forClass:aClass inCategory:catg
        ]
    ]
!

generateDoubleClickSelectorIn:aClass
    "generate code for #foregroundSelector"

    |sel catg code bCode|

    catg := #'accessing-action'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "specific selector to be called on double click"\'
            , '\'
            .

    columns do:
    [:aColumn|
        ((sel := aColumn doubleClickedSelector) notNil 
        and:[(aClass includesSelector:sel) not]) 
        ifTrue:
        [
            bCode := sel asString, code.
            self compile:bCode forClass:aClass inCategory:catg
        ]
    ]
!

generateForegroundSelectorIn:aClass
    "generate code for #foregroundSelector
    "
    |sel catg code bCode|

    catg := #'accessing-look'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "specific foreground color for a cell"\'
            , '\'
            .

    columns do:
    [:aColumn|
        ((sel := aColumn foregroundSelector) notNil 
        and:[(aClass includesSelector:sel) not]) 
        ifTrue:
        [
            bCode := sel asString, code, '    ^ nil'.
            self compile:bCode forClass:aClass inCategory:catg
        ]
    ]
!

generateMenuIn:aClass
    "generate code for #menu"

    |sel catg code|

    catg := #'accessing menu'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "get middleButton menu for selected cell in column"\'
            , '\'
            , '    ^nil'
            .

    columns do:
    [:aColumn|
        (aColumn canSelect
        and:[(sel := aColumn menu) notNil
        and:[(aClass includesSelector:sel) not]]) 
        ifTrue:
        [
            self compile:(sel asString, code) forClass:aClass inCategory:catg
        ]
    ]
!

generatePrintSelectorIn:aClass
    "generate code for #printSelector"

    |sel catg code|

    catg := #'accessing'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "get drawable image or text on a gc"\'
            , '\'
            , '    ^ '
            .

    columns do:[:aColumn|
        (     aColumn rendererType ~~ #rowSelector
         and:[(sel := aColumn printSelector) notNil
         and:[(aClass includesSelector:sel) not]]
        ) ifTrue:[
            |numArgs bcode keys|
            bcode   := sel asString.
            numArgs    := sel numArgs.

            numArgs ~~ 0 ifTrue:[
                numArgs == 1 ifTrue:[
                    bcode := bcode, 'aGC'
                ] ifFalse:[
                    keys := sel keywords.
                    bcode := (keys at:1), 'aGC ', (keys at:2), 'aColNr'.
                ]
            ].
            self compile:(bcode, code, '''', bcode, '''') forClass:aClass inCategory:catg
        ]
    ]
!

generateReadSelectorIn:aClass
    "generate code for #readSelector"

    |sel catg code bCode|

    catg := #'accessing'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "get value"\'
            , '\'
            .

    columns do:
    [:aColumn|
        (aColumn rendererType ~~ #rowSelector 
        and:[(sel := aColumn readSelector) notNil
        and:[(aClass includesSelector:sel) not]]) 
        ifTrue:
        [
            (aColumn printSelector isNil or:[aColumn canSelect]) 
            ifTrue:
            [
                |selName|
                selName := sel asString.

                sel numArgs == 0 
                    ifTrue: [bCode := selName, code] 
                    ifFalse:[bCode := selName, 'anIndex\', code].
                aColumn rendererType == #CheckToggle 
                    ifFalse:[bCode := bCode, '    ^ ''', selName, ''''] 
                    ifTrue: [bCode := bCode, '    ^true']. 
                self compile:bCode forClass:aClass inCategory:catg
            ]
        ]
    ]
!

generateRowSeparatorSelectorIn:aClass
    "generate code for #rowSeparatorSelector"

    |sel catg code bCode|

    catg := #'accessing look'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "specific row separator visibility for a cell"\'
            , '\'
            .

    columns do:
    [:aColumn|
        ((sel := aColumn rowSeparatorSelector) notNil and:[(aClass includesSelector:sel) not]) 
        ifTrue:
        [
            bCode := sel asString, code, '    ^true'.
            self compile:bCode forClass:aClass inCategory:catg
        ]
    ]
!

generateSelectSelectorIn:aClass
    "generate code for #selectSelector
    "
    |sel catg code bCode|

    catg := #'accessing selection'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "can select cell in column"\'
            , '\'
            .

    columns do:
    [:aColumn|
        (aColumn rendererType ~~ #rowSelector 
         and:[(sel := aColumn selectSelector) notNil
         and:[(aClass includesSelector:sel) not]]) 
         ifTrue:
         [
            aColumn canSelect 
            ifTrue:
            [
                bCode := sel asString, code, '    ^true'.
                self compile:bCode forClass:aClass inCategory:catg
            ]
        ]
    ]
!

generateShowComboFieldSelectorIn:aClass
    "generate code for #showComboFieldSelector
    "
    |sel catg code bCode edt state|

    catg := #'accessing menu'.
    code :=   '\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "open an editField on a combo list or box"\'
            , '\'
            .

    columns do:[:aColumn|
        edt := aColumn editorType.

        (      aColumn canSelect
          and:[(sel := aColumn showComboFieldSelector) notNil
          and:[(edt == #ComboBox or:[edt == #ComboList])
          and:[(aClass includesSelector:sel) not]]]
        ) ifTrue:[
            state := edt == #ComboBoxView.

            bCode := sel asString, code, '    ^ ', state printString.
            self compile:bCode forClass:aClass inCategory:catg
        ]
    ]
!

generateWriteSelectorIn:aClass
    "generate code for #writeSelector"

    |sel catg code bCode sz|

    catg := #'accessing'.
    code :=   'aValue\'
            , '    "automatically generated by DataSetBuilder ..."\'
            , '\'
            , '    "set value"\'
            .

    columns do:
    [:aColumn|
        ((sel := aColumn writeSelector) notNil
         and:[aColumn editorType ~~ #None
         and:[aColumn canSelect
         and:[(aClass includesSelector:sel) not]]]) 
        ifTrue:
        [
            sel numArgs == 1 
            ifTrue:
            [
                bCode := sel asString
            ] 
            ifFalse:
            [
                sz := sel indexOf:$:.
                bCode := sel copyTo:sz.
                bCode := bCode, 'anIndex ', (sel copyFrom:sz + 1)
            ].
            self compile:(bCode, code) forClass:aClass inCategory:catg
        ]
    ]
! !

!DataSetBuilder methodsFor:'initialization'!

initialize
    "initializes"

    super initialize.

    selectedColumnIndex := 0.
    columns     := OrderedCollection new.
    modalOpened := false.
    listOfSpecViews := Array new:(self class slices size).

!

setDefaultValuesInNewColumn:aDataSetColumnSpec
"/    aDataSetColumnSpec readSelector: #'valueAtColumnIndex:'.
"/    aDataSetColumnSpec writeSelector: #'valueAtColumnIndex:put:'.
"/    aDataSetColumnSpec backgroundSelector: #'bgAtRowIndex:columnIndex:'.
"/    aDataSetColumnSpec foregroundSelector: #'fgAtRowIndex:columnIndex:'.
"/    aDataSetColumnSpec selectSelector: #'selectAtColumnIndex:'.
"/    aDataSetColumnSpec editorType: #InputField.
! !

!DataSetBuilder methodsFor:'private'!

labelFromColumn:aColumn
    |label|

    aColumn rendererType == #rowSelector ifTrue:[
        ^ 'Row Selector'
    ].
    label := aColumn label.
    label ifNil:[^ nil].

    label isString ifTrue:[^ label].

    label size > 0 ifTrue:[
         label := label at:1.
    ].
    ^ label printString
!

labelInPreviewPressed:anIndex
   (self componentAt:#labelAndColumns) selection:anIndex
!

updateColumnView
    "updates column view from column descriptions
    "   
    |size|

    columnView notNil ifTrue:[
        |previewColumns columnItems columnList|
        columnList     := List new.
        previewColumns := OrderedCollection new.

        (size := columns size) ~~ 0 ifTrue:[
            columns do:[:aCol|
                previewColumns add:(aCol copy)
            ].
            previewColumns keysAndValuesDo:[:anIndex :column| 
                column 
                    readSelector:  #at:;
                    writeSelector: #at:put:;
                    backgroundSelector:nil;
                    foregroundSelector:nil;
                    rowSeparatorSelector:nil;
                    selectSelector: nil;
                    showComboFieldSelector: nil;
                    selectSelector: nil;
                    doubleClickedSelector: nil;
                    printSelector: nil;
                    visibilitySelector: nil;
                    menu: nil;
                    labelActionSelector:#labelInPreviewPressed:;
                    labelActionArgument:anIndex;
                    choices:#choices
            ].
            #(' 1' ' 2' ' x') do:[:suffix|
                columnItems := Row new:size.
                1 to:size do:[:i| columnItems at: i put: ('Cell', suffix)].
                columnList add: columnItems.
            ]
        ].
        columnView list: #().
        columnView columnDescriptors: previewColumns.
        columnView list: columnList.
    ].

    "Modified: / 27.10.1998 / 14:41:16 / cg"
!

updateInputFields
    "reloads item value into input fields"

    |column notifyValue|

    (column := self selectedColumn) isNil ifTrue:[
        self tabModel value:0.
    ] ifFalse:[
        notifyValue := nil.     "/ old: '' -> problems with Toggles (asBoolean)

        aspects do:[:anAspect| anAspect value:notifyValue ].
        aspects keysAndValuesDo:[:aKey :aModel |
            aModel value:(column perform:aKey) withoutNotifying: self
        ].

"/ REPALCE nil by empty string for specific inputFields without an adapter
        #( #labelActionArgument #formatString #id ) do:[:aKey| |model|
            model := aspects at:aKey.
            model value isNil ifTrue:[model value:notifyValue withoutNotifying: self]
        ].

        tabSelection == 0 ifTrue:[self tabModel value:1].
    ].
! !

!DataSetBuilder methodsFor:'selection'!

selectedColumn
    "returns selected column or nil"

    ^selectedColumnIndex == 0 
        ifFalse:[columns at:selectedColumnIndex ifAbsent: nil]
        ifTrue: [nil]
!

selectedColumnIndex
    "returns selected column index or 0"

    ^selectedColumnIndex
!

selectedColumnIndex:something
    "changes selected column and update specifications"

    something == selectedColumnIndex ifFalse:[
        selectedColumnIndex := something ? 0.
        self isColumnSelected value: true
    ].
!

tabSelection:something
    "changes selected tab and set corresponding specification"

    |view spec|

    something == tabSelection ifTrue:[^self].

    (tabSelection := something) isNil ifTrue:[
        tabSelection == 0 ifTrue:[^ self].
        tabSelection := 0.
    ].

    self selectedColumn isNil ifTrue:[
        tabSelection ~~ 0 ifTrue:[
            self tabModel value:0
        ] ifFalse:[
            self canvasHolder value:nil
        ].
        ^ self
    ].

    tabSelection == 0 ifTrue:[
        ^ self tabModel value:1.
    ].

    (view := listOfSpecViews at:tabSelection) isNil ifTrue:[
        view := SimpleView new.
        spec := (self class slices at:tabSelection) last.

"/        view client:nil spec:(self class interfaceSpecFor:spec) builder:(self builder).
        view client:self spec:spec builder:(self builder).
        listOfSpecViews at:tabSelection put:view.
    ].
    self canvasHolder value:view
! !

!DataSetBuilder methodsFor:'startup & release'!

commonPostBuild
    columnView := self componentAt:#columnView.

    columns notEmpty ifTrue: [
        self tabModel value: 1. 
        self selectedColumnModel value:nil; value:1.    "/ toggle to force change
        self updateInputFields.
        self updateInfoLabel.
        self updateHistory
    ].

    (self componentAt: #labelAndColumns) 
        selectConditionBlock: [:i|self askForItemModification];
        action: [:i|self cancel];
        selection: 1.

    "/ using masters infoHolder ?
    (builder aspectAt:#useAlienInfoLabelHolder) == true ifTrue:[
        (builder componentAt:#mainPanel) layout bottomOffset:0.
        (builder componentAt:#infoBarSubSpec) beInvisible
    ]                         
!

openModal
    "sets the modalOpened flag, so later, 
     there is no need to ask for saving into a class"

    modalOpened := true.

    super openModal


!

openModalOnResourceSpec: aListSpec
    "sets the modalOpened flag, so later, 
     there is no need to ask for saving into a class"

    modalOpened := true.
    super openModalOnResourceSpec: aListSpec


!

postOpenWith:aBuilder
    "reset keyboardProcessor for menuBar"

    super postOpenWith: aBuilder.
    aBuilder keyboardProcessor menuBar:nil.
! !

!DataSetBuilder methodsFor:'user actions'!

accept
    "accept changes made"

    |column type|

    super accept.

    (column := self selectedColumn) isNil ifTrue: [^self cancel].

    type := (aspects at:#rendererType) value.

    type == #rowSelector ifTrue:[
        #(label 
          width minWidth usePreferredWidth editorType choices translatedChoices
          readSelector writeSelector printSelector visibilitySelector
          formatString type converterSelector size height canSelect selectSelector showComboFieldSelector
          minValue maxValue
         ) do:[:aKey|
            (aspects at:aKey) value:nil
        ]
    ].
    aspects keysAndValuesDo:[:aKey :aModel| 
        column perform:(aKey , ':') asSymbol with: aModel value
    ].
    self seqList at:selectedColumnIndex put:(self labelFromColumn:column).
    self updateColumnView.
    self cancel.
    self clearModified.
!

cancel
    "remove all changes and reload selected column values"

    self updateInputFields.
    self enablingCommitButtonsHolder value:false.
    self clearModifiedFlag.
    self enablingCommitButtonsHolder value:false.

    "Modified: / 27.10.1998 / 14:41:41 / cg"
!

cutOrDelete:isCut
    "remove selected column and optionally put it to the clipboard"

    |idx model|

    ((idx := selectedColumnIndex) ~~ 0 and:[self askForItemModification]) ifFalse:[
        ^ self
    ].
    model := self selectedColumnModel.
    model value:0.

    isCut ifTrue:[
        self clipboard: (columns at: idx)
    ].
    columns removeIndex:idx.

    self  seqList removeIndex:idx.
    model value:(idx min:(columns size)).
    self  updateColumnView.
    self  updateInputFields.

    columns isEmpty ifTrue:[
        self isColumnSelected value: false
    ].
    self cancel.
    self setModified.
!

doBrowseRowClass
    "browse class of columns spec"

    |cls|

    (cls := self resolveRowClass) notNil 
        ifTrue: [UserPreferences systemBrowserClass openInClass:cls] 
        ifFalse:[self information:'No class defined !!']

    "Modified: / 20.5.1998 / 03:48:04 / cg"
!

doCopy
    "copy selected column to the clipboard"

    |idx|

    (idx := selectedColumnIndex) ~~ 0 
    ifTrue:
    [
        self clipboard: (columns at: idx) deepCopy
    ]
!

doCreateColumn
    "create a new column after selected column or at left (nothing selected)"

    |label list dscs |

    list := self seqList.
    label := 'Column ', (list size + 1) printString.
    columns add:(dscs := DataSetColumnSpec label:label selector:nil) afterIndex:selectedColumnIndex.
    self setDefaultValuesInNewColumn:dscs.
    self seqList add:label afterIndex:selectedColumnIndex.
    self enablingCommitButtonsHolder value ifFalse:[
        self selectedColumnModel value:selectedColumnIndex + 1
    ].
    self cancel.
    self updateColumnView.
    self setModified.
!

doCut
    "remove selected column and put it to the clipboard"

    self cutOrDelete:true
!

doDefineRowClass
    "launch a dialog to define class and superclass"

    |aspects cls oldClass oldSuper val classNameChannel superclassNameChannel|

    aspects  := IdentityDictionary new.
    oldClass := rowClass.
    oldSuper := rowSuperClass.

    [true] 
    whileTrue:
    [
        rowClass notNil ifTrue:[
            (cls := self resolveRowClass) notNil ifTrue:[
                rowSuperClass := cls superclass name asString
            ].
            val := rowClass
        ] ifFalse:[
            val := 'DSVRow'
        ].
        aspects at:#classNameChannel put:(classNameChannel := ValueHolder with:val).

        rowSuperClass notNil 
            ifTrue: [val := rowSuperClass] 
            ifFalse:[val := 'Object'].
        aspects at:#superclassNameChannel put:(superclassNameChannel := ValueHolder with:val).

        (self openDialogInterface:#defineClassNameSpec withBindings:aspects) 
        ifFalse:
        [
            rowClass := oldClass.
            rowSuperClass := oldSuper.
            ^self
        ].
        rowClass      := (classNameChannel value)      withoutSeparators.
        rowSuperClass := (superclassNameChannel value) withoutSeparators.

        rowClass size == 0 
        ifTrue:
        [
            rowClass := nil.
            self information:'no valid className'
        ] 
        ifFalse: 
        [
            cls := self resolveRowClass.

            cls notNil ifTrue:[cls := cls superclass name asString].

            rowSuperClass size == 0 
            ifTrue:
            [        
                cls notNil ifTrue:[
                    rowSuperClass := cls
                ] ifFalse:[
                    rowSuperClass := 'Object'
                ].
                self information: 'set superclassName'
            ] 
            ifFalse:
            [
                (cls isNil or:[rowSuperClass = cls]) ifTrue:[^self].
                self information:('A global named ' , rowClass , ' exists,\' ,
                                  'but is not a subclass of ' , rowSuperClass, '.\\' ,
                                  'Check and try again if that is not what you want.') withCRs.

                rowSuperClass := cls
            ]
        ]
    ]

    "Modified: / 21.5.1998 / 03:08:42 / cg"
!

doDelete
    "remove selected column and put it to the clipboard"

    self cutOrDelete:false

!

doGenerateCode
    "generate code for column values"

    |cls superclass|

    rowClass isNil ifTrue:[^self information:'No class defined!!'].
    cls := self resolveRowClass.

    cls isNil 
    ifTrue:
    [
        superclass := Smalltalk resolveName:rowSuperClass inClass:self class.

        superclass isNil ifTrue:[^self information:'No superclass defined!!'].
        (self confirm:'create ' , rowClass , ' ?') ifFalse:[^self].
        cls := superclass subclass:rowClass asSymbol
                     instanceVariableNames:''
                     classVariableNames:''
                     poolDictionaries:''
                     category:'Applications'.
    ].

    self generateChoicesIn:cls.
    self generateMenuIn:cls.
    self generatePrintSelectorIn:cls.
    self generateReadSelectorIn:cls.
    self generateBackgroundSelectorIn:cls.
    self generateForegroundSelectorIn:cls.
    self generateSelectSelectorIn:cls.
    self generateWriteSelectorIn:cls.
    self generateDoubleClickSelectorIn:cls.
    self generateRowSeparatorSelectorIn:cls.
    self generateShowComboFieldSelectorIn:cls.

!

doMoveColumn:upOrDown
    "move selected column up or down"

    |idx list label col size|

    (idx := selectedColumnIndex) == 0 ifTrue:[^self].
    list := self seqList.
    size := list size.

    size == 1 ifTrue:[^self].
    selectedColumnIndex := 0.
    label := list at:idx.
    col   := columns at:idx.
    list    removeIndex:idx.
    columns removeIndex:idx.

    upOrDown == #up 
    ifTrue:
    [
        idx == 1 ifTrue:[idx := size]
                ifFalse:[idx := idx - 1]
    ] 
    ifFalse:
    [
        idx == size ifTrue:[idx := 1]
                   ifFalse:[idx := idx + 1]
    ].
    columns add:col   beforeIndex:idx.
    list    add:label beforeIndex:idx.  
    self selectedColumnModel value:idx.
    self updateColumnView.
    self setModified.
!

doPaste
    "paste clipboard copy column after selected column or at left (nothing selected)"

    |col lbl|

    self askForItemModification ifFalse: [^nil].
    col := self class clipboard deepCopy.
    lbl := self labelFromColumn:col.

    columns add:col afterIndex:selectedColumnIndex.
    self seqList add:lbl afterIndex:selectedColumnIndex.

    self enablingCommitButtonsHolder value ifFalse:[
        self selectedColumnModel value:selectedColumnIndex + 1
    ].
    self updateColumnView.
    self updateInputFields.
    self setModified.
!

doPickColumns

    |view cls|

    view := Screen current viewFromUser.
    cls  := view class.

    (cls == DSVColumnView or:[cls == DataSetView or:[cls == DSVLabelView]]) ifTrue:[
        self columns:(view columnView columnDescriptors)
    ]
!

doSave
    |cls dst spc category mthd excla code resourceType|

    (columns size ~~ 0 and:[super doSave]) ifFalse:[
        ^ nil
    ].

    cls := self resolveName:specClass.
    dst := columns collect:[:aCol| aCol literalArrayEncoding ].
    spc := WriteStream on:String new.
    spc nextPutAll:'    ^'.
    UISpecification prettyPrintSpecArray:dst asArray on:spc indent:4.
    spc := spc contents.

    "/ if that method already exists, do not overwrite the category

    resourceType := self class resourceType.
    category     := resourceType, ' specs'.

    (mthd := cls class compiledMethodAt:specSelector) notNil ifTrue:[
        category := mthd category.
    ].

    excla := Character excla asString.

    code := excla
            , (cls name , ' class methodsFor:' , category storeString)
            , excla , '\\'

            , specSelector , '\'
            , (self class codeGenerationComment replChar:$!! withString:'!!!!')
            , '\\    "\'
            , ('     DataSetBuilder new openOnClass:' , cls name , ' andSelector:#' , specSelector , '\')
            , '    "\'.

    code := code 
            , '\'
            , '    <resource: #', resourceType, '>\\'
            , spc
            , '\'
            , (excla , ' ' , excla)
            , '\\'.

    code := code withCRs.
    (ReadStream on:code) fileIn.

"/    self isStandAlone ifTrue: [self helpTool installHelpSpecsOnClass:self specClass].

    self updateHistory.
    self updateInfoLabel.

    hasSaved := true.
    self clearModified.
!

openDocumentation
   self openHTMLDocument:'tools/uipainter/DataSetBuilder.html'.
! !

!DataSetBuilder::Row methodsFor:'accessing'!

choices
    ^ #( 'foo' 'bar' 'baz' )


! !

!DataSetBuilder::Row methodsFor:'message handling'!

doesNotUnderstand:aMessage
    "does not understand message; delegate to column view
    "
    ^ nil

! !

!DataSetBuilder class methodsFor:'documentation'!

version
    ^ '$Header$'
! !