"
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
editorType
formatString
labelIsImage
labelButtonType
translateLabel
size
type
width
minWidth
usePreferredWidth
isResizeable
height
menu
foregroundSelector
backgroundSelector
doubleClickedSelector
rowSeparatorSelector
selectSelector
converterSelector
showComboFieldSelector
printSelector
readSelector
writeSelector
rendererType
showColSeparator
showSelectionHighLighted
showRowSeparator
backgroundColor
foregroundColor
labelForegroundColor
labelBackgroundColor
labelFont
labelActionSelector
labelActionArgument
labelAlignment
columnAlignment
)
"Modified: / 19.5.1998 / 21:27:06 / cg"
! !
!DataSetBuilder class methodsFor:'help specs'!
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 (String or StringCollection) or a selector returning the label.'
#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
'Sets the background color of the column.'
#colorsBackgroundLabelColor
'Sets the background color of the label.'
#colorsBackgroundSelector
'Selector returning the background color for a cell (optional).'
#colorsForegroundCellColor
'Sets the foreground color of the column.'
#colorsForegroundLabelColor
'Sets the foreground color of the label.'
#colorsForegroundSelector
'Selector returning the foreground color for a cell (optional).'
#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'
#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. In this release, only numbers are supported (for example: 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
'An optional selector, which is used to test whether the row separator at the bottom is shown.'
#generateCode
'Generate code and install in the selected class/selector.'
#pickColumns
'Select an open view and readOut the column specification from it.'
#selectionCellClickSelector
'A selector called if cell was selected.'
#selectionCellDoubleClickSelector
'A selector called if cell was 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
'A selector called if a cell was clicked.'
#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).'
#valuesChoiceSelector
'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).'
#valuesWriteSelector
'Selector used to set the value derived from the editor.'
)
! !
!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)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 10 149 399 475)
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Header:'
#name: 'framedBox1'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 189 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'ID:'
#name: 'idLabel'
#layout: #(#AlignmentOrigin 94 0 14 0 1 0.5)
#resizeForLabel: true
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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
)
#(#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
)
#(#ComboListSpec
#attributes:
#(#tabable
true
)
#name: 'labelButtonType'
#layout: #(#LayoutFrame 57 0 96 0 182 0 116 0)
#tabable: true
#model: #labelButtonType
#comboList:
#(#None
#Button #Group
)
#useIndex: false
)
#(#LabelSpec
#label: 'Align:'
#name: 'JustificationLabel'
#layout: #(#LayoutFrame 191 0 97 0 236 0 118 0)
#resizeForLabel: true
#adjust: #left
)
#(#PopUpListSpec
#attributes:
#(#tabable
true
)
#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
)
#useIndex: false
)
#(#CheckBoxSpec
#attributes:
#(#tabable
true
)
#label: 'Label Is Image'
#name: 'labelIsImage'
#layout: #(#LayoutOrigin -3 0 122 0)
#activeHelpKey: #basicsLabelIsImage
#tabable: true
#model: #labelIsImage
)
#(#CheckBoxSpec
#attributes:
#(#tabable
true
)
#label: 'Translate Label'
#name: 'CheckBox2'
#layout: #(#LayoutOrigin 160 0 122 0)
#activeHelpKey: #basicsLabelTranslate
#tabable: true
#model: #translateLabel
)
)
)
)
#(#FramedBoxSpec
#label: 'Cell Type:'
#name: 'typesFrame'
#layout: #(#LayoutFrame 0 0.0 193 0 0 1.0 305 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Renderer:'
#name: 'rendererLabel'
#layout: #(#AlignmentOrigin 94 0 16 0 1 0.5)
#resizeForLabel: true
)
#(#ComboListSpec
#attributes:
#(#tabable
true
)
#name: 'rendererField'
#layout: #(#LayoutFrame 97 0 5 0 2 1.0 27 0)
#activeHelpKey: #basicsRenderer
#tabable: true
#model: #rendererType
#comboList: #rendererTypeList
#useIndex: false
)
#(#LabelSpec
#label: 'Editor:'
#name: 'editorLabel'
#layout: #(#AlignmentOrigin 94 0 42 0 1 0.5)
#resizeForLabel: true
)
#(#ComboBoxSpec
#attributes:
#(#tabable
true
)
#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
)
#(#LabelSpec
#label: 'Align:'
#name: 'JustificationC'
#layout: #(#LayoutFrame 191 0 58 0 236 0 79 0)
#resizeForLabel: true
#adjust: #left
)
#(#PopUpListSpec
#attributes:
#(#tabable
true
)
#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
)
#useIndex: false
)
)
)
)
)
)
)
!
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'
#layout: #(#LayoutFrame 699 0 270 0 1067 0 569 0)
#level: 0
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 699 270 1068 570)
#usePreferredExtent: false
#returnIsOKInDialog: true
#escapeIsCancelInDialog: true
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Label Colors:'
#name: 'ColorsBox'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 95 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Foreground:'
#name: 'label1'
#layout: #(#AlignmentOrigin 112 0 24 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#ColorMenuSpec
#name: 'colorMenu1'
#layout: #(#LayoutFrame 115 0 12 0 -3 1.0 34 0)
#activeHelpKey: #colorsForegroundLabelColor
#model: #labelForegroundColor
#labelsAreColored: true
)
#(#LabelSpec
#label: 'Background:'
#name: 'label2'
#layout: #(#AlignmentOrigin 112 0 52 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#ColorMenuSpec
#name: 'colorMenu2'
#layout: #(#LayoutFrame 115 0 40 0 -3 1.0 62 0)
#activeHelpKey: #colorsBackgroundLabelColor
#model: #labelBackgroundColor
#labelsAreColored: false
)
)
)
)
#(#FramedBoxSpec
#label: 'Cell Colors:'
#name: 'defaultColorsBox'
#layout: #(#LayoutFrame 0 0.0 108 0 0 1.0 263 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Foreground:'
#name: 'fgLabel'
#layout: #(#AlignmentOrigin 112 0 28 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#ColorMenuSpec
#name: 'fgMenu'
#layout: #(#LayoutFrame 115 0 16 0 -3 1.0 38 0)
#activeHelpKey: #colorsForegroundCellColor
#model: #foregroundColor
#labelsAreColored: true
)
#(#LabelSpec
#label: 'Background:'
#name: 'bgLabel'
#layout: #(#AlignmentOrigin 112 0 56 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#ColorMenuSpec
#name: 'bgMenu'
#layout: #(#LayoutFrame 115 0 44 0 -3 1.0 66 0)
#activeHelpKey: #colorsBackgroundCellColor
#model: #backgroundColor
#labelsAreColored: false
)
#(#LabelSpec
#label: 'FG-Selector:'
#name: 'fgSelLabel'
#layout: #(#AlignmentOrigin 112 0 90 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#name: 'fgSelField'
#layout: #(#LayoutFrame 115 0 79 0 0 1.0 101 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 115 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#name: 'bgSelField'
#layout: #(#LayoutFrame 115 0 104 0 0 1.0 126 0)
#activeHelpKey: #colorsBackgroundSelector
#tabable: true
#model: #backgroundSelector
#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
#window:
#(#WindowSpec
#name: 'Data Set Builder'
#layout: #(#LayoutFrame 414 0 336 0 740 0 471 0)
#label: 'Data Set Builder'
#min: #(#Point 10 10)
#max: #(#Point 1152 900)
#bounds: #(#Rectangle 414 336 741 472)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#FramedBoxSpec
#name: 'framedBox1'
#layout: #(#LayoutFrame 0 0.0 3 0.0 0 1.0 -34 1.0)
#label: 'Class for code'
#translateLabel: true
#labelPosition: #topLeft
)
#(#LabelSpec
#name: 'classLabel'
#layout: #(#AlignmentOrigin 73 0.11 38 0 1 0.5)
#label: 'Class:'
#translateLabel: true
#adjust: #right
#resizeForLabel: true
)
#(#InputFieldSpec
#name: 'classNameInputField'
#layout: #(#LayoutFrame 77 0.11 27 0 -16 1.0 49 0)
#tabable: true
#model: #classNameChannel
)
#(#LabelSpec
#name: 'superClassLabel'
#layout: #(#AlignmentOrigin 73 0.11 65 0 1 0.5)
#label: 'Superclass:'
#translateLabel: true
#adjust: #right
#resizeForLabel: true
)
#(#InputFieldSpec
#name: 'superclassNameInputField'
#layout: #(#LayoutFrame 76 0.11 55 0 -16 1.0 77 0)
#tabable: true
#model: #superclassNameChannel
)
#(#UISubSpecification
#name: 'SubSpecification'
#layout: #(#LayoutFrame 0 0.0 -29 1 0 1.0 -5 1.0)
#majorKey: #ToolApplicationModel
#minorKey: #windowSpecForCommitWithoutChannels
)
)
)
)
"Modified: / 20.5.1998 / 03:46:17 / cg"
!
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'
#layout: #(#LayoutFrame 699 0 270 0 1086 0 561 0)
#level: 0
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 699 270 1087 562)
#usePreferredExtent: false
#returnIsOKInDialog: true
#escapeIsCancelInDialog: true
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Input Format'
#name: 'framedBox1'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 127 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Input Type:'
#name: 'typeLabel'
#layout: #(#AlignmentOrigin 115 0 26 0 1 0.5)
#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
)
#(#LabelSpec
#label: 'Max Size:'
#name: 'sizeLabel'
#layout: #(#AlignmentOrigin 115 0 52 0 1 0.5)
#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)
#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
)
)
)
)
)
)
)
!
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)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 12 22 408 365)
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Separators'
#name: 'separatorBox'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 132 0)
#labelPosition: #topLeft
#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
)
#(#InputFieldSpec
#name: 'rowSeparatorSelector'
#layout: #(#LayoutFrame 29 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
)
)
)
)
#(#FramedBoxSpec
#label: 'Dimensions:'
#name: 'framedBox1'
#layout: #(#LayoutFrame 0 0.0 151 0 0 1.0 297 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Column Width:'
#name: 'widthLabel'
#layout: #(#AlignmentOrigin 140 0.0 23 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#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
)
#(#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
)
#(#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: 'Use Preferred Width'
#name: 'usePreferredWidth'
#layout: #(#LayoutFrame 5 0 96 0 141 0 118 0)
#tabable: true
#model: #usePreferredWidth
)
#(#CheckBoxSpec
#label: 'Is Resizeable'
#name: 'isResizeable'
#layout: #(#AlignmentOrigin 0 1.0 107 0 1 0.5)
#tabable: true
#model: #isResizeable
)
)
)
)
)
)
)
!
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)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 67 116 398 444)
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Label Select Action:'
#name: 'LabelSelectAction'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 97 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Selector:'
#name: 'ActionLabel'
#layout: #(#AlignmentOrigin 95 0 20 0 1 0.5)
#resizeForLabel: true
#adjust: #left
)
#(#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
)
#(#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
#component:
#(#SpecCollection
#collection: #(
#(#CheckBoxSpec
#label: 'Is Selectable'
#name: 'canSelect'
#layout: #(#Point 95 1)
#activeHelpKey: #selectionIsSelectable
#tabable: true
#model: #canSelect
)
#(#LabelSpec
#label: 'Selector:'
#name: 'selectorLabel'
#layout: #(#AlignmentOrigin 95 0 37 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#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
)
)
)
)
#(#FramedBoxSpec
#label: 'Cell Double Click:'
#name: 'CellDoubleClick'
#layout: #(#LayoutFrame 0 0.0 227 0 0 1.0 293 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Selector:'
#name: 'doubleLabel'
#layout: #(#AlignmentOrigin 95 0 19 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#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)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 13 23 309 329)
)
#component:
#(#SpecCollection
#collection: #(
#(#FramedBoxSpec
#label: 'Value Selectors:'
#name: 'valuesBox'
#layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 138 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Read:'
#name: 'readLabel'
#layout: #(#AlignmentOrigin 94 0 15 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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
)
)
)
)
#(#FramedBoxSpec
#label: 'Menu:'
#name: 'menusBox'
#layout: #(#LayoutFrame 0 0.0 143 0 0 1.0 200 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Selector:'
#name: 'menuLabel'
#layout: #(#AlignmentOrigin 94 0 12 0 1 0.5)
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#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: 'framedBox1'
#layout: #(#LayoutFrame 1 0.0 205 0 1 1.0 293 0)
#labelPosition: #topLeft
#component:
#(#SpecCollection
#collection: #(
#(#LabelSpec
#label: 'Choices:'
#name: 'ChoicesLabel'
#layout: #(#AlignmentOrigin 94 0 15 0 1 0.5)
#activeHelpKey: #valuesChoiceSelector
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#name: 'ChoicesField'
#layout: #(#LayoutFrame 97 0 4 0 2 1.0 26 0)
#activeHelpKey: #valuesChoiceSelector
#tabable: true
#model: #choices
#group: #inputGroup
#type: #symbolOrNil
#acceptOnLeave: false
#acceptOnLostFocus: false
#acceptChannel: #acceptChannel
#modifiedChannel: #modifiedChannel
#acceptOnPointerLeave: false
)
#(#LabelSpec
#label: 'Editable:'
#name: 'ShowInputFieldLabel'
#layout: #(#AlignmentOrigin 94 0 41 0 1 0.5)
#activeHelpKey: #showComboFieldSelector
#resizeForLabel: true
#adjust: #right
)
#(#InputFieldSpec
#attributes:
#(#tabable
true
)
#name: 'ShowInputFieldField'
#layout: #(#LayoutFrame 97 0 30 0 2 1.0 52 0)
#activeHelpKey: #showComboFieldSelector
#tabable: true
#model: #showComboFieldSelector
#group: #inputGroup
#type: #symbolOrNil
#acceptOnLeave: false
#acceptOnLostFocus: false
#acceptChannel: #acceptChannel
#modifiedChannel: #modifiedChannel
#acceptOnPointerLeave: false
)
)
)
)
)
)
)
"Modified: / 30.1.2000 / 02:39:03 / cg"
!
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)
#max: #(#Point 1152 900)
#bounds: #(#Rectangle 12 22 645 589)
#menu: #menu
)
#component:
#(#SpecCollection
#collection: #(
#(#MenuPanelSpec
#attributes:
#(#tabable
true
)
#name: 'menuToolbarView'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 32 0)
#tabable: true
#menu: #menuToolbar
)
#(#VariableVerticalPanelSpec
#name: 'VariableVerticalPanel1'
#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
#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
#has3Dsepartors: true
#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
#attributes:
#(#tabable
true
)
#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.25 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
#activeHelpKey: #file
#submenu:
#(#Menu
#(
#(#MenuItem
#label: 'New'
#translateLabel: true
#value: #doNew
#activeHelpKey: #fileNew
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Load...'
#translateLabel: true
#value: #doLoad
#activeHelpKey: #fileLoad
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Save'
#translateLabel: true
#value: #doSave
#activeHelpKey: #fileSave
)
#(#MenuItem
#label: 'Save As...'
#translateLabel: true
#value: #doSaveAs
#activeHelpKey: #fileSaveAs
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Pick Columns...'
#translateLabel: true
#value: #doPickColumns
#activeHelpKey: #pickColumns
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Browse Class'
#translateLabel: true
#value: #doBrowseClass
#activeHelpKey: #fileBrowseClass
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Exit'
#translateLabel: true
#value: #closeRequest
#activeHelpKey: #fileExit
)
) nil
nil
)
)
#(#MenuItem
#label: 'Edit'
#translateLabel: true
#activeHelpKey: #edit
#submenuChannel: #menuEdit
)
#(#MenuItem
#label: 'Add'
#translateLabel: true
#submenu:
#(#Menu
#(
#(#MenuItem
#label: 'Column'
#translateLabel: true
#value: #doCreateColumn
#activeHelpKey: #addColumn
#enabled: #columnIsNotEditing
#labelImage: #(#ResourceRetriever nil #newColumnIcon 'Column')
)
) nil
nil
)
)
#(#MenuItem
#label: 'Generate'
#translateLabel: true
#activeHelpKey: #generate
#submenu:
#(#Menu
#(
#(#MenuItem
#label: 'Define Row Class...'
#translateLabel: true
#value: #doDefineRowClass
#activeHelpKey: #fileDefineClass
)
#(#MenuItem
#label: 'Browse Row Class'
#translateLabel: true
#value: #doBrowseRowClass
#activeHelpKey: #browseRowClass
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Generate Code'
#translateLabel: true
#value: #doGenerateCode
#activeHelpKey: #generateCode
)
) nil
nil
)
)
"/ #(#MenuItem
"/ #label: 'Settings'
"/ #translateLabel: true
"/ #activeHelpKey: #settings
"/ #submenu:
"/ #(#Menu
"/
"/ #(
"/ #(#MenuItem
"/ #label: 'Fonts'
"/ #translateLabel: true
"/ #submenuChannel: #menuFont
"/ )
"/ ) nil
"/ nil
"/ )
"/ )
#(#MenuItem
#label: 'History'
#translateLabel: true
#activeHelpKey: #history
#submenuChannel: #menuHistory
)
#(#MenuItem
#label: 'Help'
#translateLabel: true
#startGroup: #right
#submenuChannel: #menuHelp
)
) nil
nil
)
"Modified: / 19.5.1998 / 23:10:01 / cg"
!
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
#label: 'New'
#isButton: true
#value: #doNew
#activeHelpKey: #fileNew
#labelImage: #(#ResourceRetriever #Icon #newIcon)
)
#(#MenuItem
#label: 'Load'
#isButton: true
#value: #doLoad
#activeHelpKey: #fileLoad
#labelImage: #(#ResourceRetriever #Icon #loadIcon)
)
#(#MenuItem
#label: 'Save'
#isButton: true
#value: #doSave
#activeHelpKey: #fileSave
#labelImage: #(#ResourceRetriever #Icon #saveIcon)
)
#(#MenuItem
#label: ''
)
#(#MenuItem
#label: 'Cut'
#isButton: true
#value: #doCut
#activeHelpKey: #editCut
#enabled: #isColumnSelected
#labelImage: #(#ResourceRetriever #Icon #cutIcon)
)
#(#MenuItem
#label: 'Copy'
#isButton: true
#value: #doCopy
#activeHelpKey: #editCopy
#enabled: #isColumnSelected
#labelImage: #(#ResourceRetriever #Icon #copyIcon)
)
#(#MenuItem
#label: 'Paste'
#isButton: true
#value: #doPaste
#activeHelpKey: #editPaste
#enabled: #valueOfCanPaste
#labelImage: #(#ResourceRetriever #Icon #pasteIcon)
)
#(#MenuItem
#label: 'Delete'
#isButton: true
#value: #doDelete
#activeHelpKey: #editDelete
#enabled: #isColumnSelected
#labelImage: #(#ResourceRetriever #Icon #deleteIcon)
)
#(#MenuItem
#label: ''
)
#(#MenuItem
#label: 'Add Column'
#isButton: true
#value: #doCreateColumn
#activeHelpKey: #addColumn
#enabled: #columnIsNotEditing
#labelImage: #(#ResourceRetriever nil #newColumnIcon)
)
#(#MenuItem
#label: ''
)
#(#MenuItem
#label: 'Move Up'
#isButton: true
#value: #doMoveColumn:
#activeHelpKey: #editMoveUp
#enabled: #isColumnSelected
#argument: #up
#labelImage: #(#ResourceRetriever #Icon #upIcon)
)
#(#MenuItem
#label: 'Move Down'
#isButton: true
#value: #doMoveColumn:
#activeHelpKey: #editMoveDown
#enabled: #isColumnSelected
#argument: #down
#labelImage: #(#ResourceRetriever #Icon #downIcon)
)
) 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 := OrderedCollection new.
DataSetColumnSpec slices do:
[:aSlice||type|
type := aSlice at:1.
(list includes:type) ifFalse:[list add:type]
].
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
!
rendererTypeList
"generate list of supported renderer types"
|list|
(list := builder bindingAt:#rendererTypeList) isNil
ifTrue:
[
list := OrderedCollection new.
DataSetColumnSpec slices do:
[:aSlice||type|
type := aSlice at:2.
(list includes:type) ifFalse:[list add:type]
].
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'!
buildFromClass:aClass andSelector:aSelector
|updateBlock cls list|
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 valueOfEnablingCommitButtons 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.
].
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 := self resolveName:aClass.
(cls respondsTo:aSelector) ifTrue:[
list := cls perform:aSelector
]
]
] ifFalse:[
list := columns
].
self columns:list.
updateBlock value.
!
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
"/ ].
! !
!DataSetBuilder methodsFor:'code generation'!
compile:aCode forClass:aClass inCategory:aCategory
"compile method for class in a category"
ByteCodeCompiler compile:aCode withCRs forClass:aClass inCategory:aCategory
!
generateBackgroundSelectorIn:aClass
"generate code for #backgroundSelector"
|sel catg code bCode|
catg := 'accessing look' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "specific background color for a cell"\'
, '\'
.
columns do:
[:aColumn|
((sel := aColumn backgroundSelector) notNil and:[(aClass implements: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' asSymbol.
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 implements: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' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "specific selector to be called on double click"\'
, '\'
.
columns do:
[:aColumn|
((sel := aColumn doubleClickedSelector) notNil
and:[(aClass implements: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' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "specific foreground color for a cell"\'
, '\'
.
columns do:
[:aColumn|
((sel := aColumn foregroundSelector) notNil
and:[(aClass implements: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' asSymbol.
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 implements:sel) not]])
ifTrue:
[
self compile:(sel asString, code) forClass:aClass inCategory:catg
]
]
!
generatePrintSelectorIn:aClass
"generate code for #printSelector"
|sel catg code|
catg := 'accessing' asSymbol.
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 implements:sel) not]]
) ifTrue:[
|args bcode keys|
bcode := sel asString.
args := sel numArgs.
args ~~ 0 ifTrue:[
args == 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' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "get value"\'
, '\'
.
columns do:
[:aColumn|
(aColumn rendererType ~~ #rowSelector
and:[(sel := aColumn readSelector) notNil
and:[(aClass implements: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' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "specific row separator visibility for a cell"\'
, '\'
.
columns do:
[:aColumn|
((sel := aColumn rowSeparatorSelector) notNil and:[(aClass implements: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' asSymbol.
code := '\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "can select cell in column"\'
, '\'
.
columns do:
[:aColumn|
(aColumn rendererType ~~ #rowSelector
and:[(sel := aColumn selectSelector) notNil
and:[(aClass implements: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' asSymbol.
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 implements: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' asSymbol.
code := 'aValue\'
, ' "automatically generated by DataSetBuilder ..."\'
, '\'
, ' "set value"\'
.
columns do:
[:aColumn|
((sel := aColumn writeSelector) notNil
and:[aColumn editorType ~~ #None
and:[aColumn canSelect
and:[(aClass implements: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).
! !
!DataSetBuilder methodsFor:'private'!
askForListModification
"asks for resource modification"
modalOpened ifFalse:[
^ super askForListModification
].
^true
!
labelFromColumn:aColumn
^ aColumn rendererType == #rowSelector ifFalse:[aColumn label]
ifTrue: ['Row Selector'].
!
labelInPreviewPressed:anIndex
(builder 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;
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|
(column := self selectedColumn) isNil ifTrue:[
self tabModel value:0.
] ifFalse:[
aspects do:[:anAspect| anAspect value:'' ].
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:'' 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'!
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
!
postBuildWith:builder
columnView := self builder componentAt:#columnView.
"/ columnView labelView enabled:false.
super postBuildWith:builder.
columns notEmpty ifTrue: [
self tabModel value: 1.
self selectedColumnModel value:nil; value:1. "/ toggle to force change
self updateInputFields.
self updateInfoLabel.
self updateHistory
].
(builder componentAt: #labelAndColumns)
selectConditionBlock: [:i|self askForItemModification];
action: [:i|self cancel];
selection: 1.
!
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 readSelector writeSelector printSelector
formatString type converterSelector size height canSelect selectSelector showComboFieldSelector
) 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.
modified := true.
!
cancel
"remove all changes and reload selected column values"
self updateInputFields.
self valueOfEnablingCommitButtons value:false.
self clearModifiedFlag.
self valueOfEnablingCommitButtons 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.
modified := true.
!
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|
list := self seqList.
label := 'Column ', (list size + 1) printString.
columns add:(DataSetColumnSpec label:label selector:nil) afterIndex:selectedColumnIndex.
self seqList add:label afterIndex:selectedColumnIndex.
self valueOfEnablingCommitButtons value ifFalse:[
self selectedColumnModel value:selectedColumnIndex + 1
].
self cancel.
self updateColumnView.
modified := true.
!
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.
modified := true.
!
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 valueOfEnablingCommitButtons value ifFalse:[
self selectedColumnModel value:selectedColumnIndex + 1
].
self updateColumnView.
self updateInputFields.
modified := true.
!
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.
modified := false.
! !
!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$'
! !