"
COPYRIGHT (c) 1995 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
ApplicationModel subclass:#UIPainter
instanceVariableNames:'menu nameField elementMenu workView treeView outletView stringBox
actionBox listBox fileBox currentFileName topView propertyFrame
whichProperty changeSelectorHolder changeChannel
aspectSelectorHolder aspectChannel nameChannel fgChannel
bgChannel applyAction leftFractionHolder leftOffsetHolder
rightFractionHolder rightOffsetHolder topFractionHolder
topOffsetHolder bottomFractionHolder bottomOffsetHolder specClass
specSelector leftAlignmentFractionHolder
topAlignmentFractionHolder propertyShown specShown'
classVariableNames:''
poolDictionaries:''
category:'Interface-UIPainter'
!
!UIPainter class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1995 by Claus Gittinger
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
"
not yet finished, not yet published, not yet released.
[start with:]
UIPainter open
"
! !
!UIPainter class methodsFor:'interface specs'!
actionButtonModelSpec
"UIPainter new openOnClass:self andSelector:#actionButtonModelSpec"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 78 0 216 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
#'label:' 'aspect:'
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 119 0 62 0 143 0)
#'label:' 'change:'
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 80 0 24 0 231 0 214 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'name:' 'aspectInput'
#'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
#model: #aspectChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'name:' 'changeInput'
#'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
#model: #changeChannel
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
#'label:' 'apply'
#'model:' #setModelAspects
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
colorSpec
"UIBuilder new openOnClass:self andSelector:#colorSpec"
"Builder new openInterface:#colorSpec"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 252 0 290 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 100 0 215 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 47 0 87 0 71 0)
#'label:' 'foreground:'
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 119 0 93 0 143 0)
#'label:' 'background:'
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 114 0 24 0 233 0 213 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
#model: #foregroundChannel
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
#model: #backgroundChannel
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
#'label:' 'apply'
#'model:' #setColors
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
geometrySpecForAlignmentOrigin
"UIBuilder new openOnClass:self andSelector:#geometrySpecForAlignmentOrigin"
"Builder new openInterface:#geometrySpecForAlignmentOrigin"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
#'label:' 'left'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 63 0 31 0 87 0)
#'label:' 'top'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 107 0 41 0 131 0)
#'label:' 'align H'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 151 0 61 0 175 0)
#'label:' 'align V'
#'adjust:' #left
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
#'type:' #numberOrNil
#model: #leftFractionChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
#'type:' #numberOrNil
#'model:' #'topFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 107 0 71 0 128 0)
#'type:' #numberOrNil
#model: #'leftAlignmentFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 150 0 71 0 171 0)
#'type:' #numberOrNil
#'model:' #'topAlignmentFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
#'type:' #numberOrNil
#model: #leftOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
#'type:' #numberOrNil
#model: #topOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
#'label:' 'frame'
#'model:' #setLayoutFrame
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
#'label:' 'origin'
#'model:' #setLayoutOrigin
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
#'label:' 'align'
#'model:' #setAlignmentOrigin
#'initiallyDisabled:' true
)
#(#ActionButtonSpec
#'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
#'label:' 'apply'
#'model:' #setDimensionForAlignmentOrigin
#tabable: true
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
#'label:' 'relative'
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 167 0 9 0 213 0 30 0)
#'label:' 'offset'
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'indy: unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
geometrySpecForLayoutFrame
"UIBuilder new openOnClass:self andSelector:#geometrySpecForLayoutFrame"
"Builder new openInterface:#geometrySpecForLayoutFrame"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
#'label:' 'left'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 63 0 30 0 87 0)
#'label:' 'top'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 107 0 40 0 131 0)
#'label:' 'right'
#'adjust:' #left
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 151 0 40 0 175 0)
#'label:' 'bottom'
#'adjust:' #left
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
#'type:' #numberOrNil
#model: #leftFractionChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
#'type:' #numberOrNil
#'model:' #'topFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 107 0 71 0 128 0)
#'type:' #numberOrNil
#model: #'rightFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 150 0 71 0 171 0)
#'type:' #numberOrNil
#'model:' #'bottomFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
#'type:' #numberOrNil
#model: #leftOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
#'type:' #numberOrNil
#model: #topOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 107 0 114 0 128 0)
#'type:' #numberOrNil
#'model:' #rightOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 150 0 114 0 171 0)
#'type:' #numberOrNil
#'model:' #bottomOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
#'label:' 'frame'
#'model:' #setLayoutFrame
#'initiallyDisabled:' true
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
#'label:' 'origin'
#'model:' #setLayoutOrigin
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
#'label:' 'align'
#'model:' #setAlignmentOrigin
)
#(#ActionButtonSpec
#'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
#'label:' 'apply'
#'model:' #setDimensionForLayoutFrame
#tabable: true
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
#'label:' 'relative'
)
#(#LabelSpec
#'layout:' #(#LayoutFrame 167 0 9 0 213 0 30 0)
#'label:' 'offset'
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'indy: unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
geometrySpecForLayoutOrigin
"UIPainter new openOnClass:self andSelector:#geometrySpecForLayoutOrigin"
"Builder new openInterface:#geometrySpecForLayoutOrigin"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'name:' 'framedBox'
#'layout:' #(#LayoutFrame 0 0 -1 0 253 0 291 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'name:' 'verticalPanelView'
#'layout:' #(#LayoutFrame 6 0 26 0 85 0 219 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 19 0 30 0 43 0)
#'label:' 'left'
#'adjust:' #left
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 63 0 31 0 87 0)
#'label:' 'top'
#'adjust:' #left
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'name:' 'verticalPanelView'
#'layout:' #(#LayoutFrame 80 0 24 0 124 0 217 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 71 0 42 0)
#'type:' #numberOrNil
#model: #leftFractionChannel
#'acceptOnLostFocus:' true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 71 0 85 0)
#'type:' #numberOrNil
#'model:' #'topFractionChannel'
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'name:' 'verticalPanelView'
#'layout:' #(#LayoutFrame 150 0 24 0 220 0 216 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 21 0 114 0 42 0)
#'type:' #numberOrNil
#model: #leftOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'layout:' #(#LayoutFrame 0 0 64 0 114 0 85 0)
#'type:' #numberOrNil
#model: #topOffsetChannel
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 16 0 210 0 76 0 240 0)
#'label:' 'frame'
#'model:' #setLayoutFrame
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 96 0 210 0 156 0 240 0)
#'label:' 'origin'
#'model:' #setLayoutOrigin
#'initiallyDisabled:' true
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 176 0 210 0 236 0 240 0)
#'label:' 'align'
#'model:' #setAlignmentOrigin
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 96 0 260 0 156 0 290 0)
#'label:' 'apply'
#'model:' #setDimensionForLayoutOrigin
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 77 0 9 0 137 0 31 0)
#'label:' 'relative'
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 159 0 9 0 205 0 30 0)
#'label:' 'offset'
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'indy: unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
miscSpec
"UIBuilder new openOnClass:self andSelector:#miscSpec"
"Builder new openInterface:#miscSpec"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 61 0 215 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
#'label:' 'name:'
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 60 0 24 0 230 0 213 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#model: #nameChannel
#'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
#'label:' 'apply'
#'model:' #setMiscAspects
#tabable: true
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
!
modelSpec
"UIBuilder new openOnClass:self andSelector:#modelSpec"
"Builder new openInterface:#modelSpec"
<resource: #canvas>
^
#(#FullSpec
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#FramedBoxSpec
#'layout:' #(#LayoutFrame 0 0 -1 0 251 0 289 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 6 0 26 0 78 0 216 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 47 0 57 0 71 0)
#'label:' 'aspect:'
)
#(#LabelSpec
#'name:' 'label'
#'layout:' #(#LayoutFrame 0 0 119 0 62 0 143 0)
#'label:' 'change:'
)
)
)
#'horizontalLayout:' #left
#'verticalLayout:' #spreadSpace
)
#(#VerticalPanelViewSpec
#'layout:' #(#LayoutFrame 80 0 24 0 231 0 214 0)
#'component:'
#(#SpecCollection
#'collection:'
#(
#(#InputFieldSpec
#'name:' 'aspectInput'
#'layout:' #(#LayoutFrame 0 0 49 0 163 0 69 0)
#model: #aspectChannel
#acceptOnLostFocus: true
#tabable: true
)
#(#InputFieldSpec
#'name:' 'changeInput'
#'layout:' #(#LayoutFrame 0 0 119 0 163 0 142 0)
#model: #changeChannel
#acceptOnLostFocus: true
#tabable: true
)
)
)
#'horizontalLayout:' #fit
#'verticalLayout:' #spreadSpace
)
#(#ActionButtonSpec
#'name:' 'button'
#'layout:' #(#LayoutFrame 102 0 246 0 153 0 272 0)
#'label:' 'apply'
#'model:' #setModelAspects
)
)
)
#'labelPosition:' #topLeft
#'showFrame:' false
)
)
)
#'window:'
#(#WindowSpec
#'label:' 'unnamed'
#'bounds:' #(#Rectangle 0 0 255 292)
)
)
! !
!UIPainter methodsFor:'BuilderView interface'!
setUndoLabel:aString
aString isNil ifTrue:[
(menu menuAt:#edit) labelAt:#undoAction put:'undo'.
(menu menuAt:#edit) disable:#undoAction
] ifFalse:[
(menu menuAt:#edit) labelAt:#undoAction put:'undo: ' , aString.
(menu menuAt:#edit) enable:#undoAction
]
!
update:something with:parameter
|singleSelection|
elementMenu deselect.
something == #undoHistory ifTrue:[
^ self setUndoLabel:parameter
].
singleSelection := workView singleSelection.
(something == #layout or:[something == #any]) ifTrue:[
singleSelection notNil ifTrue:[
self fetchLayoutFrom:singleSelection
].
^ self
].
(something == #aspects or:[something == #any]) ifTrue:[
singleSelection notNil ifTrue:[
self fetchModelAspectsFrom:singleSelection
].
^ self
].
(something == #selection or:[something == #any]) ifTrue:[
self showPropertyView.
self showOutletsFor:(workView selection).
singleSelection isNil ifFalse:[
nameChannel isNil ifTrue:[self nameChannel].
nameChannel value:singleSelection name.
self fetchLayoutFrom:singleSelection.
self fetchModelAspectsFrom:singleSelection.
].
^ self
].
! !
!UIPainter methodsFor:'aspects'!
aspectChannel
^ aspectChannel
"Modified: 6.9.1995 / 01:00:30 / claus"
!
backgroundChannel
^ bgChannel
!
bottomFractionChannel
^ bottomFractionHolder
!
bottomOffsetChannel
^ bottomOffsetHolder
!
changeChannel
^ changeChannel
"Modified: 6.9.1995 / 01:00:33 / claus"
!
foregroundChannel
^ fgChannel
!
leftAlignmentFractionChannel
^ leftAlignmentFractionHolder
!
leftFractionChannel
^ leftFractionHolder
!
leftOffsetChannel
^ leftOffsetHolder
!
nameChannel
nameChannel isNil ifTrue:[
nameChannel := '' asValue.
].
^ nameChannel
"Modified: 6.9.1995 / 00:38:00 / claus"
!
rightFractionChannel
^ rightFractionHolder
!
rightOffsetChannel
^ rightOffsetHolder
!
topAlignmentFractionChannel
^ topAlignmentFractionHolder
!
topFractionChannel
^ topFractionHolder
!
topOffsetChannel
^ topOffsetHolder
! !
!UIPainter methodsFor:'filein & fileout'!
openFile:aFileName
|aStream |
aStream := FileStream readonlyFileNamed:aFileName.
aStream notNil ifTrue:[
workView fileInContentsFrom:aStream.
aStream close.
currentFileName := aFileName
]
!
saveAs:aFileName
|aStream|
aStream := FileStream newFileNamed:aFileName.
aStream notNil ifTrue:[
workView storeContentsOn:aStream.
aStream close
].
currentFileName := aFileName
! !
!UIPainter methodsFor:'help'!
helpTextFor:aComponent
|sel|
(aComponent isKindOf:Button) ifTrue:[
(sel := aComponent changeMessage) notNil ifTrue:[
"/ take the buttons change symbol as resource-key
^ resources string:(sel asString)
]
].
^ nil
"Modified: 31.8.1995 / 20:49:58 / claus"
! !
!UIPainter methodsFor:'initialization'!
buttonPanelSpec
"return a spec for the buttons in the panel;
entries consists of selector and bitmap-filename.
nil selectors are taken as separators (see setupButtonPanel)"
^ #(
#(alignSelectionLeft true 'b_alignL.xbm' nil false)
#(alignSelectionRight true 'b_alignR.xbm' nil false)
#(alignSelectionLeftAndRight true 'b_alignLR.xbm' nil false)
#(nil nil nil nil)
#(alignSelectionTop true 'b_alignT.xbm' nil false)
#(alignSelectionBottom true 'b_alignB.xbm' nil false)
#(alignSelectionTopAndBottom true 'b_alignTB.xbm' nil false)
#(nil nil nil nil)
#(alignSelectionCenterHor true 'b_alignCH.xbm' nil false)
#(alignSelectionCenterVer true 'b_alignCV.xbm' nil false)
#(nil nil nil nil)
#(moveSelectionLeft true 'b_moveLeft.xbm' nil true)
#(moveSelectionRight true 'b_moveRight.xbm' nil true)
#(moveSelectionUp true 'b_moveUp.xbm' nil true)
#(moveSelectionDown true 'b_moveDown.xbm' nil true)
#(moveSelectionLeft10 true 'b_moveLeft2.xbm' nil true)
#(moveSelectionRight10 true 'b_moveRight2.xbm' nil true)
#(moveSelectionUp10 true 'b_moveUp2.xbm' nil true)
#(moveSelectionDown10 true 'b_moveDown2.xbm' nil true)
)
"Modified: 5.9.1995 / 22:20:36 / claus"
!
createCanvas
|topView|
super initialize.
topView := StandardSystemView new.
topView label:'unnamed'.
topView extent:300@300.
workView := UIPainterView in:topView.
workView layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
^ workView.
"Builder new createCanvas open"
!
createPaletteIn:aViewOrNil
|topView v|
aViewOrNil isNil ifTrue:[
topView := StandardSystemView new.
topView label:'element palette'.
topView extent:200@400.
] ifFalse:[
topView := aViewOrNil
].
v := HVScrollableView for:SelectionInListView miniScrollerH:true in:topView.
v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
elementMenu := v scrolledView.
^ elementMenu.
"(Builder new createPaletteIn:nil) topView open"
"Modified: 5.9.1995 / 23:52:57 / claus"
!
initChannels
bottomFractionHolder := nil asValue.
bottomOffsetHolder := nil asValue.
leftFractionHolder := nil asValue.
leftOffsetHolder := nil asValue.
rightFractionHolder := nil asValue.
rightOffsetHolder := nil asValue.
topFractionHolder := nil asValue.
topOffsetHolder := nil asValue.
leftAlignmentFractionHolder := nil asValue.
topAlignmentFractionHolder := nil asValue.
fgChannel := nil asValue.
bgChannel := nil asValue.
aspectChannel := nil asValue.
changeChannel := nil asValue.
!
initPullDownMenu
menu labels:(resources array:#(
'file'
'edit'
'font'
'type'
'align'
'dimension'
'form'
'special'
'code'
'debug'
'test'
)).
menu selectors:#(#file
#edit
#font
#type
#align
#dimension
#form
#special
#code
#debugging
#test
).
menu at:#file
putLabels:(resources array:
#('new'
'from class'
'pick a view '
'-'
'save'
'save as ...'
'-'
'compile'
'-'
'source'
'windowSpec'
'inspect me'
'-'
'print'
'-'
'quit'
))
selectors:#(doNew
doFromClass
doPickAView
nil
doSave
doSaveAs
nil
doCompile
nil
doSource
doWindowSpec
inspect
nil
doPrint
nil
doFinish
)
receiver:self.
menu at:#edit
putLabels:(resources array:#(
'undo'
"/ 'copy'
'cut'
"/ 'paste'
))
selectors:#(
undoAction
"/ copySelection
deleteSelection
"/ pasteBuffer
)
receiver:workView.
menu at:#font
putLabels:(resources array:#(
'larger'
'smaller'
'-'
'normal'
'bold'
'italic'
'bold italic'
'-'
'font panel'
) )
selectors:#(largerFont
smallerFont
nil
normalFont
boldFont
italicFont
boldItalicFont
nil
showFontPanel
)
receiver:workView.
menu at:#type
putLabels:(resources array:#(
'basic widgets'
'layout'
'text'
'interactors'
'modal'
'other'
'-'
'all'
) )
selectors:#(showBasicWidgets
showLayoutWidgets
showTextWidgets
showInteractorWidgets
showModalWidgets
showOtherWidgets
nil
showAllWidgets
)
receiver:self.
menu at:#align
putLabels:(resources array:#(
"/ 'raise'
"/ 'lower'
"/ '-'
'align left'
'align right'
'align left & right'
'align top'
'align bottom'
'align centered vertical'
'align centered horizontal'
'-'
'spread horizontal'
'spread vertical'
'center horizontal in frame'
'center vertical in frame'
) )
selectors:#(
"/ raiseSelection
"/ lowerSelection
"/ nil
alignSelectionLeft
alignSelectionRight
alignSelectionLeftAndRight
alignSelectionTop
alignSelectionBottom
alignSelectionCenterHor
alignSelectionCenterVer
nil
spreadSelectionHor
spreadSelectionVer
centerSelectionHor
centerSelectionVer
)
receiver:workView.
menu at:#dimension
putLabels:(resources array:#(
'default extent'
'default width'
'default height'
'-'
'copy extent'
'paste extent'
'paste width'
'paste height'
'-'
'insert'
) )
selectors:#(
setToDefaultExtent
setToDefaultWidth
setToDefaultHeight
nil
copyExtent
pasteExtent
pasteWidth
pasteHeight
nil
insertSelection
)
receiver:workView.
menu at:#form
putLabels:(resources array:#(
'align to grid'
'show grid'
) )
selectors:#(
alignOn
toggleGrid
)
receiver:self.
menu at:#special
putLabels:(resources array:#(
'group radioButtons'
'group enterFields'
) )
selectors:#(
groupRadioButtons
groupEnterFields
)
receiver:workView.
menu at:#code
putLabels:(resources array:#(
'class'
'method'
"/ 'variables'
) )
selectors:#(
changeClass
changeMethod
"/ changeVariables
)
receiver:self.
menu at:#debugging
putLabels:(resources array:#(
'inspect'
'inspect attributes'
) )
selectors:#(
inspectSelection
inspectAttributes
)
receiver:workView.
menu at:#test
putLabels:(resources array:#(
'test on'
) )
selectors:#(toggleTest
)
receiver:self.
self setUndoLabel:nil.
!
openInterface
|list panel topPane botPanel v
leftPanel middlePanel rightPanel buttonPanel propSelector|
super initialize.
self initChannels.
whichProperty := SelectionInList new.
whichProperty list:#('dimension' 'colors' 'model' 'misc' 'attribute list').
whichProperty onChangeSend:#propertySelectionChanged to:self.
workView :=self createCanvas.
topView := StandardSystemView new.
topView label:'Interface Builder'.
topView icon:(Image fromFile:'bitmaps/Builder.xbm' resolution:100).
topView extent:(600 @ 400).
menu := PullDownMenu in:topView.
buttonPanel := self setupButtonPanelIn:topView below:menu.
leftPanel := View in:topView.
leftPanel origin:(0.0 @ 0.0) corner:0.3@1.0.
leftPanel topInset:menu height + buttonPanel height + View viewSpacing.
middlePanel := View in:topView.
middlePanel origin:(0.3 @ 0.0) corner:0.6@1.0.
middlePanel topInset:menu height + buttonPanel height + View viewSpacing.
rightPanel := View in:topView.
rightPanel origin:(0.6 @ 0.0) corner:1.0@1.0.
rightPanel topInset:menu height + buttonPanel height + View viewSpacing.
v := HVScrollableView for:UIPainterTreeView miniScrollerH:true in:middlePanel.
v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
treeView := v scrolledView.
propSelector := PopUpList label:'properties' in:rightPanel.
propSelector origin:(0.0 @ 0.0) corner:1.0@(propSelector preferredExtent y).
propSelector horizontalInset:View viewSpacing.
propSelector model:whichProperty.
propertyFrame := View in:rightPanel.
propertyFrame origin:(0.0 @ 0.0) corner:1.0@1.0.
propertyFrame topInset:propSelector height + View viewSpacing.
"/ panel := VariableVerticalPanel in:topView.
"/ panel origin:(0.0 @ 0.0) corner:0.5@1.0.
"/ panel topInset:menu height + buttonPanel height + View viewSpacing.
"/ topPane := View in:panel.
"/ topPane origin:(0.0 @ 0.0) corner:(1.0 @ 0.5).
"/ topPane borderWidth:0.
"/ botPanel := VariableHorizontalPanel in:panel.
"/ botPanel origin:(0.0 @ 0.5) corner:(1.0 @ 1.0).
"/ botPanel borderWidth:0.
elementMenu := self createPaletteIn:leftPanel.
"/ v := ScrollableView for:UIPainterTreeView in:botPanel.
"/ v origin:(0.0 @ 0.0) corner:(0.5 @ 1.0).
"/ treeView := v scrolledView.
"/ v := ScrollableView for:SelectionInListView in:botPanel.
"/ v origin:(0.5 @ 0.0) corner:(1.0 @ 1.0).
"/ outletView := v scrolledView.
"/ outletView action:[:lineNr | self selectOutlet:lineNr].
"/ v := ScrollableView for:TextCollector in:topPane.
"/ v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
"/ infoView := v scrolledView.
treeView builderView:workView. "link workview with treeview"
workView addDependent:treeView.
workView addDependent:self.
self initPullDownMenu.
elementMenu action:[:selection |
workView testMode ifTrue:[
elementMenu deselect
] ifFalse:[
selection notNil ifTrue:[
workView createWidgetWithClass:
(Smalltalk at:(elementMenu selectionValue asSymbol))
]
]
].
topView application:self.
builder window:topView.
topView beMaster.
workView topView beSlave.
"/ can be created as embedded or side-menu
elementMenu topView ~~ topView ifTrue:[
elementMenu topView beSlave.
].
topView open.
workView topView openInGroup:(topView windowGroup).
elementMenu topView ~~ topView ifTrue:[
elementMenu topView openInGroup:(topView windowGroup).
]
"
Builder open
"
"Modified: 6.9.1995 / 00:26:59 / claus"
!
openNewWindowCanvas
self open.
!
openOnClass:aClass andSelector:aSelector
"open up an interface builder, fetching a spec from someClass
via some selector"
|specArray|
specClass := aClass.
specSelector := aSelector.
self openInterface.
workView className:aClass name.
workView methodName:aSelector.
workView setupFromSpec:(aClass perform:aSelector).
!
openOnSpec:aSpecOrSpecArray
"open up an interface builder, given some specArray"
|newBuilder|
newBuilder := self new.
!
setupButtonPanelIn:aTopView below:aMenu
"create the buttonPanel"
|spc mh buttonPanel|
spc := View viewSpacing // 2.
buttonPanel := HorizontalPanelView in:aTopView.
buttonPanel level:-1; borderWidth:0.
buttonPanel horizontalLayout:#leftSpace.
self buttonPanelSpec do:[:entry |
|sel toCanvas imgFile label b sep autoRepeat|
sel := entry at:1.
sel isNil ifTrue:[
sep := View in:buttonPanel.
sep extent:20@1; borderWidth:0.
] ifFalse:[
toCanvas := entry at:2.
imgFile := entry at:3.
label := entry at:4.
autoRepeat := entry at:5.
b := Button in:buttonPanel.
autoRepeat ifTrue:[
b autoRepeat:autoRepeat.
b controller beTriggerOnDown.
].
imgFile notNil ifTrue:[
b logo:(Image fromFile:imgFile).
] ifFalse:[
b logo:label
].
toCanvas ifTrue:[
b model:workView
] ifFalse:[
b model:self
].
b changeMessage:sel
]
].
mh := aMenu height.
buttonPanel origin:0.0 @ (mh + spc)
corner:(1.0 @ (mh + spc + buttonPanel preferredExtent y)).
buttonPanel leftInset:spc; rightInset:spc.
^ buttonPanel
"Modified: 5.9.1995 / 22:23:13 / claus"
! !
!UIPainter methodsFor:'misc'!
listOfOutletsFor:aViewClass
"return a list of outlets for a view-class"
|l1 l2 all rej|
(aViewClass == Object) ifTrue:[^ nil].
l1 := self listOfOutletsFor:(aViewClass superclass).
l2 := self listOfOutletsForClass:aViewClass.
l2 isNil ifTrue:[
all := l1
] ifFalse:[
l1 isNil ifTrue:[
all := l2
] ifFalse:[
all := l1 , l2
]
].
rej := self rejectOutletsForClass:aViewClass.
rej notNil ifTrue:[
rej do:[:x |
all := all copyWithout:x
]
].
^ all
!
listOfOutletsForClass:aViewClass
"return a list of outlets for a view-class"
"could this be done automatically ?"
(aViewClass == Label) ifTrue:[
^ #('label'
'iconic-label'
'label layout'
'fixed size'
'foreground-color'
'background-color'
)
].
(aViewClass == Button) ifTrue:[
^ #(
'active foreground-color'
'active background-color'
'active level'
'passive level'
'press action'
)
].
(aViewClass == Toggle) ifTrue:[
^ #(
'release action'
)
].
(aViewClass == CheckBox) ifTrue:[
^ #(
'label'
)
].
(aViewClass == FramedBox) ifTrue:[
^ #(
'label'
'label position'
'frame shown'
)
].
(aViewClass == VerticalPanelView) ifTrue:[
^ #(
'horizontal layout'
'vertical layout'
)
].
(aViewClass == HorizontalPanelView) ifTrue:[
^ #(
'horizontal layout'
'vertical layout'
)
].
(aViewClass == VariableVerticalPanel) ifTrue:[
^ #(
'handle position'
'style'
)
].
(aViewClass == ListView) ifTrue:[
^ #(
'contents'
)
].
(aViewClass == SelectionInListView) ifTrue:[
^ #(
'press action'
)
].
(aViewClass == EditField) ifTrue:[
^#(
'initialText'
'field type'
'field length'
)
].
(aViewClass == View) ifTrue:[
^ #(
'level'
'view background-color'
)
].
(aViewClass == Scroller) ifTrue:[
^ #(
'scroll action'
'asynchronous'
'synchronous'
)
].
(aViewClass == ScrollBar) ifTrue:[
^ #(
'scroll action'
'scrollDown action'
'scrollUp action'
'asynchronous'
'synchronous'
)
].
(aViewClass == HorizontalScrollBar) ifTrue:[
^ #(
'scrollLeft action'
'scrollRight action'
)
].
(aViewClass == PullDownMenu) ifTrue:[
^ #(
'labels'
'actions'
)
].
(aViewClass == Separator) ifTrue:[
^ #(
'orientation'
)
].
^ nil
"Modified: 6.9.1995 / 13:42:09 / claus"
!
rejectOutletsForClass:aViewClass
"return a list of suppressed outlets for a view-class"
"could this be done automatically ?"
(aViewClass == CheckToggle) ifTrue:[
^ #(
'iconic-label'
)
].
(aViewClass == CheckBox) ifTrue:[
^ #(
'horizontal layout'
'vertical layout'
)
].
(aViewClass == HorizontalScrollBar) ifTrue:[
^ #(
'scrollUp action'
'scrollDown action'
)
].
^ nil
"Modified: 4.9.1995 / 18:55:03 / claus"
!
setupPropertyFromSpec:aSpec
"setup menu from spec
"
outletView := nil.
specShown ~= aSpec ifTrue:[
propertyFrame destroySubViews.
builder buildFromSpec:aSpec in:propertyFrame.
propertyFrame realizeAllSubViews.
].
specShown := aSpec
!
showOutletsFor:aView
|c outlets|
outletView isNil ifTrue:[^ self].
(aView isKindOf:SimpleView) ifFalse:[
outletView list:nil.
^ self
].
c := aView class.
outlets := self listOfOutletsFor:c.
outletView list:outlets
"Modified: 5.9.1995 / 21:51:57 / claus"
! !
!UIPainter methodsFor:'private - fetch'!
fetchLayoutFrom:aView
|layout extent|
layout := aView geometryLayout.
layout isNil ifTrue:[^ self].
layout isLayout ifFalse:[
layout isRectangle ifTrue:[
leftOffsetHolder value:(layout left).
rightOffsetHolder value:(layout right).
topOffsetHolder value:(layout top).
bottomOffsetHolder value:(layout bottom).
^ self
].
layout isPoint ifTrue:[
leftOffsetHolder value:(layout left).
rightOffsetHolder value:(layout right).
^ self
].
].
leftOffsetHolder value:(layout leftOffset).
leftFractionHolder value:(layout leftFraction).
topFractionHolder value:(layout topFraction).
topOffsetHolder value:(layout topOffset).
layout isLayoutFrame ifTrue:[
rightOffsetHolder value:(layout rightOffset).
bottomOffsetHolder value:(layout bottomOffset).
rightFractionHolder value:(layout rightFraction).
bottomFractionHolder value:(layout bottomFraction).
leftAlignmentFractionHolder value:0.
topAlignmentFractionHolder value:0.
] ifFalse:[
extent := aView extent.
rightOffsetHolder value:(layout leftOffset + extent x).
bottomOffsetHolder value:(layout topOffset + extent y).
rightFractionHolder value:0.
bottomFractionHolder value:0.
layout isAlignmentOrigin ifTrue:[
leftAlignmentFractionHolder value:(layout leftAlignmentFraction).
topAlignmentFractionHolder value:(layout topAlignmentFraction)
] ifFalse:[
leftAlignmentFractionHolder value:0.
topAlignmentFractionHolder value:0
]
].
!
fetchModelAspectsFrom:aView
aspectChannel value:(workView aspectSelectorForView:aView).
changeChannel value:(workView changeSelectorForView:aView).
! !
!UIPainter methodsFor:'setup choices'!
showAllWidgets
"create list of basic widgets"
self showWidgetsWhere:[:class | true]
!
showBasicWidgets
"create list of basic widgets"
self showWidgetsInCategory:'Views-Basic'
butNot:[:class | class isKindOf:ModalBox class]
!
showInteractorWidgets
"create list of interactor widgets"
self showWidgetsInCategory:'Views-Interactors'
butNot:[:class | class isKindOf:ModalBox class]
!
showLayoutWidgets
"create list of basic widgets"
self showWidgetsInCategory:'Views-Layout'
butNot:[:class | class isKindOf:ModalBox class]
!
showModalWidgets
"create list of modal widgets"
self showWidgetsWhere:[:class | class isKindOf:ModalBox class]
!
showOtherWidgets
"create list of other widgets"
|check cat|
check := [:class |
(#('Views-Basic'
'Views-Interactors'
'Views-Layout'
'Views-Text') includes:class category) not].
self showWidgetsWhere:check
butNot:[:class | class isKindOf:ModalBox class]
!
showTextWidgets
"create list of basic widgets"
self showWidgetsInCategory:'Views-Text'
butNot:[:class | class isKindOf:ModalBox class]
!
showWidgetsInCategory:aCategory
"create list of basic widgets"
self showWidgetsWhere:[:class | class category = aCategory]
!
showWidgetsInCategory:aCategory butNot:excludeBlock
"create list of basic widgets"
self showWidgetsWhere:[:class | class category = aCategory]
butNot:excludeBlock
!
showWidgetsWhere:aBlock
"create list of widgets where aBlock avaluates to true"
self showWidgetsWhere:aBlock butNot:[:class | false]
!
showWidgetsWhere:aBlock butNot:excludeBlock
"create list of widgets where aBlock evaluates to true and excludeBlock
evaluates to false"
|list|
list := OrderedCollection new:0.
SimpleView allSubclassesDo:[:aSubclass |
(aBlock value:aSubclass) ifTrue:[
(excludeBlock value:aSubclass) ifFalse:[
list add:(aSubclass name)
]
]
].
(aBlock value:View) ifTrue:[
(excludeBlock value:View) ifFalse:[
list add:'View'
]
].
(list size == 0) ifFalse:[
list sort
].
elementMenu list:list
! !
!UIPainter methodsFor:'user actions - dimension'!
setAlignmentOrigin
"apply is pressed in the geometry-sub view, with a alignmentOrigin selected
"
self setupPropertyFromSpec:(self class geometrySpecForAlignmentOrigin)
!
setDimensionForAlignmentOrigin
|view layout|
view := workView singleSelection.
view notNil ifTrue:[
layout := AlignmentOrigin new.
layout leftOffset:(leftOffsetHolder value) ? 0.
layout topOffset:(topOffsetHolder value) ? 0.
layout leftFraction:(leftFractionHolder value) ? 0.
layout topFraction:(topFractionHolder value) ? 0.
layout leftAlignmentFraction:(leftAlignmentFractionHolder value) ? 0.
layout topAlignmentFraction:(topAlignmentFractionHolder value) ? 0.
workView setDimension:layout.
]
!
setDimensionForLayoutFrame
|view layout|
view := workView singleSelection.
view notNil ifTrue:[
layout := LayoutFrame new.
layout leftOffset:(leftOffsetHolder value) ? 0.
layout rightOffset:(rightOffsetHolder value) ? 0.
layout topOffset:(topOffsetHolder value) ? 0.
layout bottomOffset:(bottomOffsetHolder value) ? 0.
layout leftFraction:(leftFractionHolder value) ? 0.
layout rightFraction:(rightFractionHolder value) ? 0.
layout topFraction:(topFractionHolder value) ? 0.
layout bottomFraction:(bottomFractionHolder value) ? 0.
workView setDimension:layout.
]
!
setDimensionForLayoutOrigin
|view layout|
view := workView singleSelection.
view notNil ifTrue:[
layout := LayoutOrigin new.
layout leftOffset:(leftOffsetHolder value) ? 0.
layout topOffset:(topOffsetHolder value) ? 0.
layout leftFraction:(leftFractionHolder value) ? 0.
layout topFraction:(topFractionHolder value) ? 0.
workView setDimension:layout.
]
!
setLayoutFrame
"apply is pressed in the geometry-sub view, with a layoutFrame selected
"
self setupPropertyFromSpec:(self class geometrySpecForLayoutFrame)
!
setLayoutOrigin
"apply is pressed in the geometry-sub view, with a layoutOrigin selected
"
self setupPropertyFromSpec:(self class geometrySpecForLayoutOrigin)
! !
!UIPainter methodsFor:'user actions - form'!
alignOff
|m|
m := menu menuAt:#form.
m labelAt:#alignOff put:(resources string:'align to grid').
m selectorAt:#alignOff put:#alignOn.
workView alignOff
!
alignOn
|m|
m := menu menuAt:#form.
m labelAt:#alignOn put:(resources string:'do not align to grid').
m selectorAt:#alignOn put:#alignOff.
workView alignOn
!
toggleGrid
|m|
m := menu menuAt:#form.
workView gridShown ifFalse:[
m labelAt:#toggleGrid put:(resources string:'hide grid').
workView showGrid
] ifTrue:[
m labelAt:#toggleGrid put:(resources string:'show grid').
workView hideGrid
]
! !
!UIPainter methodsFor:'user interaction'!
closeRequest
workView notNil ifTrue:[workView release].
fileBox notNil ifTrue:[fileBox destroy].
stringBox notNil ifTrue:[stringBox destroy].
actionBox notNil ifTrue:[actionBox destroy].
listBox notNil ifTrue:[listBox destroy].
super closeRequest
!
doCompile
|code|
code := workView generateCode.
(ReadStream on:code) fileIn.
"Modified: 4.9.1995 / 17:06:10 / claus"
!
doFinish
self closeRequest
!
doFromClass
|className methodName cls sel accepted failed spec s|
className := '' asValue.
methodName := '' asValue.
(s := workView className) notNil ifTrue:[
className value:s
].
(s := workView methodName) notNil ifTrue:[
methodName value:s
].
failed := false.
[
accepted :=
(DialogBox new
addTextLabel:'Classes name:';
addInputFieldOn:className;
addVerticalSpace;
addTextLabel:'methods name:';
addInputFieldOn:methodName;
addAbortButton;
addOkButton;
open
) accepted.
accepted ifTrue:[
cls := Smalltalk classNamed:className value.
cls isNil ifTrue:[
failed := true.
self warn:'no such class'.
] ifFalse:[
sel := methodName value asSymbol.
(cls respondsTo:sel ) ifFalse:[
failed := true.
self warn:'no such method'
] ifTrue:[
spec := cls perform:sel.
spec isArray ifFalse:[
failed := true.
self warn:'not a windowSpec method'
].
"/ ok, got it
workView className:className value.
workView methodName:methodName value.
workView setupFromSpec:spec.
^ self
]
]
]
] doWhile:[accepted and:[failed]].
"Modified: 5.9.1995 / 18:47:57 / claus"
!
doNew
workView removeAll.
^ self
"Modified: 5.9.1995 / 20:52:21 / claus"
!
doOpen
fileBox isNil ifTrue:[
fileBox := FileSelectionBox
title:''
"pattern:'*.sib'"
okText:''
abortText:(Resource name:'BUILDER_ABORT_LABEL'
fromFile:'Builder.rs')
action:[nil]
].
fileBox title:(Resource name:'BUILDER_OPEN_TITLE' fromFile:'Builder.rs').
fileBox action:[:fileName | self openFile:fileName].
fileBox okText:(Resource name:'BUILDER_OPEN_OK_LABEL' fromFile:'Builder.rs').
fileBox showAtPointer
!
doPickAView
|view className methodName cls sel accepted spec s|
view := Display viewFromUser.
view isNil ifTrue:[^ self].
spec := UISpecification fromView:view topView.
"/ ok, got it
workView setupFromSpec:spec.
workView className:view class name.
workView methodName:#newSpec.
^ self
"Modified: 5.9.1995 / 23:25:53 / claus"
!
doPrint
^ self
!
doSave
currentFileName notNil ifTrue:[
self saveAs:currentFileName
] ifFalse:[
self doSaveAs
]
!
doSaveAs
fileBox isNil ifTrue:[
fileBox := FileSelectionBox
title:''
"pattern:'*.draw'"
okText:''
abortText:(Resource name:'BUILDER_ABORT_LABEL'
fromFile:'Builder.rs')
action:[nil]
].
fileBox title:(Resource name:'BUILDER_SAVE_TITLE' fromFile:'Builder.rs').
fileBox action:[:fileName | self saveAs:fileName].
fileBox okText:(Resource name:'BUILDER_SAVE_OK_LABEL' fromFile:'Builder.rs').
fileBox showAtPointer
!
doSource
|code v|
code := workView generateCode.
v := CodeView open.
v contents:code.
v label:(workView applicationName).
^ self
"Modified: 5.9.1995 / 21:02:05 / claus"
!
doWindowSpec
|code v|
code := workView generateWindowSpec.
v := CodeView open.
v contents:code.
v label:'windowSpec'.
^ self
"Modified: 5.9.1995 / 21:04:14 / claus"
!
propertySelectionChanged
workView singleSelectionDo:[:selectedView |
propertyShown := whichProperty selection.
self showPropertyView
]
!
selectOutlet:nr
|outlet type sel text box action initialText initialList
view prop t val|
outlet := outletView selectionValue.
outletView deselect.
view := workView selection.
view isNil ifTrue:[
self notify:'select something first'.
^ self
].
action := [:s | self setOutlet:sel type:type to:s in:view].
(outlet = 'label') ifTrue:[
type := #string.
sel := #label:.
text := 'label-text:'.
initialText := view label
].
(outlet = 'fixed size') ifTrue:[
type := #boolean.
sel := #sizeFixed:.
text := 'size is fix:'.
].
(outlet = 'frame shown') ifTrue:[
type := #boolean.
sel := #showFrame:.
text := 'frame is to be drawn:'.
].
(outlet = 'labels') ifTrue:[
type := #strings.
sel := #labels:.
initialText := view labels
].
(outlet = 'contents') ifTrue:[
type := #text.
sel := #contents:.
initialText := view contents
].
(outlet = 'initialText') ifTrue:[
type := #string.
sel := #initialText:.
initialText := view contents
].
(outlet = 'field type') ifTrue:[
type := #fieldTypeSymbol.
sel := #type:.
initialList := #(number
string
password
).
initialText := view converter isNil ifTrue:[#string] ifFalse:[view converter type].
].
(outlet = 'field length') ifTrue:[
type := #numberOrNil.
sel := #maxChars:.
text := 'field length (empty -> unlimited)'.
initialText := view maxChars isNil ifTrue:[''] ifFalse:[view maxChars printString].
].
(outlet = 'level') ifTrue:[
type := #number.
sel := #level:.
initialText := view level printString
].
(outlet = 'active level') ifTrue:[
type := #number.
sel := #onLevel:.
initialText := view onLevel printString
].
(outlet = 'passive level') ifTrue:[
type := #number.
sel := #offLevel:.
initialText := view offLevel printString
].
(outlet = 'iconic-label') ifTrue:[
type := #form.
sel := #label:.
text := 'label-icon:'
].
(outlet = 'view background-color') ifTrue:[
type := #color.
sel := #viewBackground:.
text := 'view background color'.
initialText := 'Black'
].
(outlet = 'foreground-color') ifTrue:[
type := #color.
sel := #foregroundColor:.
text := 'foreground color'.
initialText := 'Black'
].
(outlet = 'background-color') ifTrue:[
type := #color.
sel := #backgroundColor:.
text := 'background color'.
initialText := 'Grey'
].
(outlet = 'active foreground-color') ifTrue:[
type := #color.
sel := #activeForegroundColor:.
text := 'active foreground color'.
initialText := 'Yellow'
].
(outlet = 'active background-color') ifTrue:[
type := #color.
sel := #activeBackgroundColor:.
text := 'active background color'.
initialText := 'Grey'
].
(outlet = 'scroll action') ifTrue:[
type := #block.
sel := #scrollAction:.
text := 'action block when scrolled'
].
(outlet = 'scrollUp action') ifTrue:[
type := #block.
sel := #scrollUpAction:.
text := 'action block when scrolled up'
].
(outlet = 'scrollDown action') ifTrue:[
type := #block.
sel := #scrollDownAction:.
text := 'action block when scrolled down'
].
(outlet = 'scrollLeft action') ifTrue:[
type := #block.
sel := #scrollLeftAction:.
text := 'action block when scrolled left'
].
(outlet = 'scrollRight action') ifTrue:[
type := #block.
sel := #scrollRightAction:.
text := 'action block when scrolled right'
].
(outlet = 'press action') ifTrue:[
type := #block.
sel := #pressAction:.
text := 'action block when pressed'
].
(outlet = 'release action') ifTrue:[
type := #block.
sel := #releaseAction:.
text := 'action block when released'
].
(outlet = 'style') ifTrue:[
type := #symbol.
sel := #style:.
initialList := #(motif next)
].
(outlet = 'handle position') ifTrue:[
type := #symbol.
sel := #handlePosition:.
initialList := #(left center right)
].
(outlet = 'horizontal layout') ifTrue:[
type := #symbol.
sel := #horizontalLayout:.
text := 'horizontal components layout'.
initialList := #(left
leftSpace
leftMax
leftSpaceMax
center
centerMax
right
rightSpace
rightMax
rightSpaceMax
spread
spreadSpace
spreadMax
spreadSpaceMax
fit
fitSpace).
initialText := view horizontalLayout printString
].
(outlet = 'vertical layout') ifTrue:[
type := #symbol.
sel := #verticalLayout:.
text := 'vertical components layout'.
initialList := #(top
topSpace
center
bottom
bottomSpace
spread
spreadSpace
fit
fitSpace).
initialText := view verticalLayout printString
].
(outlet = 'label position') ifTrue:[
type := #symbol.
sel := #labelPosition:.
initialList := #(topLeft topCenter topRight bottomLeft bottomCenter bottomRight).
initialText := view labelPosition printString
].
(outlet = 'label layout') ifTrue:[
type := #symbol.
sel := #adjust:.
initialList := #( left right center centerLeft centerRight fit ).
initialText := view adjust printString
].
(outlet = 'orientation') ifTrue:[
type := #symbol.
sel := #orientation:.
initialList := #( horizontal vertical ).
initialText := view orientation printString
].
(type == #color) ifTrue:[
initialList := #('Black'
'White'
'LightGrey'
'Grey'
'DarkGrey'
'Yellow'
'Red'
'Green'
'Blue'
)
].
text isNil ifTrue:[
text := outlet
].
"what type of box do we need"
t := type.
((type == #color) or:[type == #symbol or:[type == #fieldTypeSymbol]]) ifTrue:[
t := #list
].
((type == #number) or:[type == #numberOrNil]) ifTrue:[
t := #string
].
(type == #strings) ifTrue:[
t := #text
].
(type == #block) ifTrue:[
t := #text.
initialText := workView outletValueOf:sel for:view.
initialText isNil ifTrue:[initialText := '[statements]']
].
(type == #block1) ifTrue:[
t := #text.
type := #block.
initialText := workView outletValueOf:sel for:view.
initialText isNil ifTrue:[initialText := '[:argument | statements ]']
].
(type == #block2) ifTrue:[
t := #text.
type := #block.
initialText := workView outletValueOf:sel for:view.
initialText isNil ifTrue:[initialText := '[:arg1 :arg2 | statements ]']
].
"show a box to enter thing"
(t == #boolean) ifTrue:[
val := Dialog confirmWithCancel:text.
(val == true or:[val == false]) ifTrue:[
action value:val
].
^ self
].
(t == #string) ifTrue:[
"/ stringBox isNil ifTrue:[
stringBox := EnterBox new.
"/ ].
box := stringBox
].
(t == #list) ifTrue:[
"/ listBox isNil ifTrue:[
listBox := ListSelectionBox new.
"/ ].
listBox list:initialList.
box := listBox
].
(t == #text) ifTrue:[
"/ actionBox isNil ifTrue:[
actionBox := TextBox new.
"/ ].
actionBox initialText:initialText.
box := actionBox
].
"
Transcript show:'outlet: '. Transcript showCR:outlet.
Transcript show:'type: '. Transcript showCR:type.
Transcript show:'sel: '. Transcript showCR:sel.
Transcript show:'text: '. Transcript showCR:text.
"
box isNil ifTrue:[
self notify:'not yet implemented'
] ifFalse:[
box initialText:initialText.
box title:text.
box action:action.
box showAtPointer
]
"Modified: 6.9.1995 / 13:46:29 / claus"
!
setColors
|fg bg|
fg := fgChannel value.
(fg notNil and:[fg notEmpty]) ifTrue:[
fg := Color readFrom:fg.
workView singleSelectionDo:[:selectedView |
selectedView ~~ workView ifTrue:[
selectedView foregroundColor:fg
].
].
].
bg := bgChannel value.
(bg notNil and:[bg notEmpty]) ifTrue:[
bg := Color readFrom:bg.
workView singleSelectionDo:[:selectedView |
selectedView ~~ workView ifTrue:[
selectedView backgroundColor:bg
].
].
].
!
setMiscAspects
"sent when apply is pressen in the misc-sub view"
workView singleSelectionDo:[:selectedView |
selectedView ~~ workView ifTrue:[
workView changeVariableNameOf:selectedView to:nameChannel value
]
].
!
setModelAspects
"sent when apply is pressen in the model-sub view"
|aspectSymbol|
aspectSymbol := aspectChannel value.
(aspectSymbol notNil and:[aspectSymbol notEmpty]) ifTrue:[
aspectSymbol := aspectSymbol asSymbol.
workView singleSelectionDo:[:selectedView |
selectedView ~~ workView ifTrue:[
workView setAspectSelector:aspectSymbol forView:selectedView
].
].
].
!
setOutlet:outletSymbol type:type to:outletValue in:aView
|block val messageSymbol|
messageSymbol := outletSymbol.
val := outletValue.
(type == #block) ifTrue:[
block := Compiler evaluate:val.
(block == #Error) ifTrue:[
self warn:'action will not work in test-mode'.
workView addOutletDefinitionFor:outletSymbol
type:type
value:outletValue
for:aView.
^ self
].
val := block
].
(type == #number) ifTrue:[
val := Number readFromString:outletValue onError:0
].
(type == #numberOrNil) ifTrue:[
val := Number readFromString:outletValue onError:nil
].
(type == #text) ifTrue:[
val := outletValue asString
].
(type == #strings) ifTrue:[
val := outletValue asText
].
(type == #symbol) ifTrue:[
val := outletValue asSymbol.
].
(type == #fieldTypeSymbol) ifTrue:[
val := outletValue asSymbol.
val == #password ifTrue:[
aView passwordCharacter:$*
] ifFalse:[
aView passwordCharacter:nil
].
val := (PrintConverter new initFor:val).
messageSymbol := #converter:
].
(type == #color) ifTrue:[
val := Color name:outletValue.
val isNil ifTrue:[
self warn:('no such color:' , outletValue).
^ self
]
].
Transcript show:(val printString).
Transcript showCR:('(' , val class printString , ')').
workView selectionHiddenDo:[
aView perform:messageSymbol with:val.
workView elementChanged:aView.
aView redraw.
].
workView addOutletDefinitionFor:outletSymbol
type:type
value:outletValue
for:aView
"Modified: 6.9.1995 / 13:44:46 / claus"
!
showPropertyView
|v l spec|
workView singleSelectionDo:[:selectedView |
propertyShown = 'dimension' ifTrue:[
(l := selectedView geometryLayout) notNil ifTrue:[
l isLayout ifTrue:[
l isAlignmentOrigin ifTrue:[
spec := self class geometrySpecForAlignmentOrigin
] ifFalse:[
l isLayoutFrame ifFalse:[
spec := self class geometrySpecForLayoutOrigin
]
]
]
].
spec isNil ifTrue:[
spec := self class geometrySpecForLayoutFrame
].
^ self setupPropertyFromSpec:spec
].
propertyShown = 'colors' ifTrue:[
^ self setupPropertyFromSpec:(self class colorSpec)
].
propertyShown = 'model' ifTrue:[
^ self setupPropertyFromSpec:(self class modelSpec)
].
propertyShown = 'misc' ifTrue:[
^ self setupPropertyFromSpec:(self class miscSpec)
].
propertyShown = 'attribute list' ifTrue:[
specShown ~~ #attributeList ifTrue:[
propertyFrame destroySubViews.
v := ScrollableView for:SelectionInListView in:propertyFrame.
v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
outletView := v scrolledView.
outletView action:[:lineNr | lineNr notNil ifTrue:[self selectOutlet:lineNr]].
propertyFrame realizeAllSubViews.
specShown := #attributeList.
].
self showOutletsFor:(workView selection).
^ self
].
].
propertyFrame destroySubViews.
outletView := nil.
specShown := nil.
!
toggleTest
|m t|
m := menu menuAt:#test.
t := workView testMode not.
t ifTrue:[
m labelAt:#toggleTest put:(resources string:'test off')
] ifFalse:[
m labelAt:#toggleTest put:(resources string:'test on')
].
workView testMode:t
! !
!UIPainter class methodsFor:'documentation'!
version
^ '$Header$'
! !