UIPainter.st
changeset 60 7542ab7fbbfe
parent 59 0a2b2ff030a0
child 61 85ef247db6b1
--- a/UIPainter.st	Tue Feb 25 14:15:56 1997 +0100
+++ b/UIPainter.st	Tue Feb 25 15:07:09 1997 +0100
@@ -1,3 +1,25 @@
+"
+ 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.
+"
+
+'From Smalltalk/X, Version:3.1.4 on 25-feb-1997 at 2:17:26 pm'                  !
+
+ApplicationModel subclass:#UIPainter
+	instanceVariableNames:'topView workView propertyView treeView elementMenu fileName
+		specClass specSelector specSuperclass aspects'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-UIPainter'
+!
+
 HorizontalPanelView subclass:#ButtonPanel
 	instanceVariableNames:'receiver argumentToSelector'
 	classVariableNames:''
@@ -5,6 +27,961 @@
 	privateIn: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'!
+
+nameAndSelectorSpec
+    "this window spec was automatically generated by the ST/X UIPainter"
+
+    "do not manually edit this - the painter/builder may not be able to
+     handle the specification if its corrupted."
+
+    "
+     UIPainter new openOnClass:UIPainter andSelector:#nameAndSelectorSpec
+     UIPainter new openInterface:#nameAndSelectorSpec
+    "
+
+    <resource: #canvas>
+
+    ^
+     
+       #(#FullSpec
+          #'isOpaque:' true
+          #'window:' 
+           #(#WindowSpec
+              #'name:' 'uIPainterView'
+              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #'isOpaque:' true
+              #'label:' 'unnamed'
+              #'bounds:' #(#Rectangle 0 0 300 300)
+          )
+          #'component:' 
+           #(#SpecCollection
+              #'collection:' 
+               #(
+                 #(#LabelSpec
+                    #'name:' 'label1'
+                    #'layout:' #(#LayoutFrame 10 0 50 0 110 0 70 0)
+                    #'isOpaque:' true
+                    #'label:' 'class:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #right
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label2'
+                    #'layout:' #(#LayoutFrame 10 0 90 0 110 0 110 0)
+                    #'isOpaque:' true
+                    #'label:' 'superclass:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #right
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#LabelSpec
+                    #'name:' 'label3'
+                    #'layout:' #(#LayoutFrame 10 0 130 0 110 0 150 0)
+                    #'isOpaque:' true
+                    #'label:' 'selector:'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #right
+                    #'hasCharacterOrientedLabel:' true
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'classNameField'
+                    #'layout:' #(#LayoutFrame 120 0 50 0 289 0 69 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #classNameChannel
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'superclassNameField'
+                    #'layout:' #(#LayoutFrame 120 0 90 0 289 0 109 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #superclassNameChannel
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'hasBorder:' false
+                )
+                 #(#InputFieldSpec
+                    #'name:' 'methodNameField'
+                    #'layout:' #(#LayoutFrame 120 0 130 0 289 0 149 0)
+                    #'isOpaque:' true
+                    #'initiallyDisabled:' false
+                    #'initiallyInvisible:' false
+                    #'model:' #methodNameChannel
+                    #'isReadOnly:' false
+                    #'tabable:' true
+                    #'immediateAccept:' false
+                    #'acceptOnLeave:' true
+                    #'acceptOnReturn:' true
+                    #'acceptOnTab:' true
+                    #'acceptOnLostFocus:' true
+                    #'numChars:' 5
+                    #'hasBorder:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'button1'
+                    #'layout:' #(#LayoutFrame 30 0 250 0 129 0 279 0)
+                    #'isOpaque:' true
+                    #'label:' 'cancel'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' true
+                    #'isDefault:' false
+                    #'defaultable:' false
+                    #'model:' #cancel
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#ActionButtonSpec
+                    #'name:' 'button2'
+                    #'layout:' #(#LayoutFrame 160 0 250 0 259 0 279 0)
+                    #'isOpaque:' true
+                    #'label:' 'ok'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'tabable:' true
+                    #'isDefault:' true
+                    #'defaultable:' false
+                    #'model:' #accept
+                    #'hasCharacterOrientedLabel:' true
+                    #'isDecorated:' false
+                    #'initiallyDisabled:' false
+                )
+                 #(#LabelSpec
+                    #'name:' 'boxLabel'
+                    #'layout:' #(#LayoutOrigin 78 0 11 0)
+                    #'isOpaque:' true
+                    #'label:' 'class & selector for code'
+                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
+                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
+                    #'initiallyInvisible:' false
+                    #'level:' 0
+                    #'adjust:' #center
+                    #'hasCharacterOrientedLabel:' true
+                )
+              )
+          )
+      )
+! !
+
+!UIPainter methodsFor:'BuilderView interface'!
+
+update:something
+
+    elementMenu deselect.
+    treeView     update:something.
+    propertyView update:something.
+! !
+
+!UIPainter methodsFor:'aspects'!
+
+aspectFor:aKey
+    ^ aspects at:aKey ifAbsent:[ super aspectFor:aKey ]
+
+! !
+
+!UIPainter methodsFor:'filein & fileout'!
+
+openFile:aFileName
+    |aStream |
+
+    aStream := FileStream readonlyFileNamed:aFileName.
+
+    aStream notNil ifTrue:[
+        workView fileInContentsFrom:aStream.
+        aStream close.
+        fileName := aFileName
+    ]
+
+!
+
+saveAs:aFileName
+    |aStream|
+
+    aStream := FileStream newFileNamed:aFileName.
+
+    aStream notNil ifTrue:[
+        workView storeContentsOn:aStream.
+        aStream close.
+        fileName := 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'!
+
+createCanvas 
+    |topView|
+
+    super initialize.
+
+    topView := StandardSystemView new.
+    topView label:'unnamed'.
+    topView extent:300@300.
+    topView application:self.
+
+    workView := UIPainterView in:topView.
+    workView layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
+
+    ^ workView.
+
+    "Builder new createCanvas open"
+!
+
+initChannels
+    |cls|
+
+    aspects := IdentityDictionary new.
+
+    aspects at:#classNameChannel put:(
+        (specClass notNil ifTrue:[specClass]
+                         ifFalse:['NewApplication']) asValue
+    ).
+    specSuperclass isNil ifTrue:[
+        specClass notNil ifTrue:[
+            (cls := Smalltalk at:specClass asSymbol) notNil ifTrue:[
+                specSuperclass := cls superclass name.
+            ]
+        ]
+    ].
+    aspects at:#superclassNameChannel put:(
+        (specSuperclass notNil ifTrue:[specSuperclass]
+                         ifFalse:['ApplicationModel']) asValue
+    ).
+    aspects at:#methodNameChannel put:(
+        (specSelector notNil ifTrue:[specSelector]
+                            ifFalse:[#windowSpec]) asValue
+    ).
+!
+
+initPullDownMenu:aMenu
+    aMenu labels:(resources  array:#(
+                                    'file'
+                                    'font'
+                                    'type'
+                                    'align'
+                                    'dimension'
+                                    'special'
+                                    'misc'
+                                    'code'
+                                    'test'
+                                 )).
+
+    aMenu selectors:#(#file
+                     #font
+                     #type
+                     #align 
+                     #dimension 
+                     #special
+                     #misc
+                     #code
+                     #test
+                    ).
+
+    aMenu at:#file 
+            putLabels:(resources  array:
+                      #('new'
+                        'from class ...' 
+                        'pick a view ' 
+                        '-'
+                        'load'
+                        'save' 
+                        'save as ...' 
+                        '-'
+                        'install spec' 
+                        'install aspects' 
+                        '-'
+"/                        'source' 
+                        'windowSpec' 
+                        'inspect me'
+                        'raise'
+                        '-'
+                        'print'
+                        '-'
+                        'quit'
+                       ))
+            selectors:#(doNew 
+                        doFromClass
+                        doPickAView
+                        nil
+                        doOpen
+                        doSave 
+                        doSaveAs
+                        nil 
+                        doInstallSpec 
+                        doInstallAspects 
+                        nil 
+"/                        doSource 
+                        doWindowSpec 
+                        inspect
+                        doRaise
+                        nil 
+                        doPrint
+                        nil 
+                        doFinish
+                       )
+             receiver:self.
+
+    aMenu at:#font putMenu:(workView subMenuFont menuView).
+
+    aMenu at:#type 
+            putLabels:(resources  array:#(
+                        'basic widgets' 
+                        'layout'
+                        'text'
+                        'interactors'
+                        'modal'
+                        'other'
+                        '-'
+                        'all'
+                       ) )
+            selectors:#(showBasicWidgets 
+                        showLayoutWidgets
+                        showTextWidgets
+                        showInteractorWidgets
+                        showModalWidgets
+                        showOtherWidgets
+                        nil
+                        showAllWidgets
+                       )
+             receiver:self.
+
+    aMenu at:#align     putMenu:(workView subMenuAlign menuView).
+    aMenu at:#dimension putMenu:(workView subMenuDimension menuView).
+
+    aMenu at:#special 
+            putLabels:(resources  array:#(
+                        'group radioButtons' 
+                        'group enterFields'
+                        '-'
+                        'delete undo history'
+                       ) )
+            selectors:#(
+                        groupRadioButtons 
+                        groupEnterFields
+                        nil
+                        removeUndoHistory
+                       )
+             receiver:workView.
+
+    aMenu at:#code 
+            putLabels:(resources  array:#(
+                        'class & method' 
+                       ) )
+            selectors:#(
+                        defineClassAndSelector
+                       )
+             receiver:self.
+
+    aMenu at:#misc putMenu:(self menuMisc).
+
+    aMenu at:#test 
+            putLabels:(resources array:#(
+                        '\c test mode' 
+                       ) )
+            selectors:#(doToggleTest 
+                       )
+             receiver:self.
+
+     (aMenu menuAt:#test) checkToggleAt:#doToggleTest put:(workView testMode).
+!
+
+openInterface 
+    |inset panel menu|
+
+    super initialize.
+    self  initChannels.
+    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.
+    panel := ButtonPanel  in:topView.
+    inset := menu preferredExtent y + panel preferredExtent y.
+
+    panel origin:0.0@(menu preferredExtent y) corner:1.0@inset  .
+    panel receiver:workView.
+
+    elementMenu := HVScrollableView for:SelectionInListView miniScrollerH:true in:topView.
+    elementMenu origin:0.0@0.0 corner:0.3 @ 1.0.
+    elementMenu topInset:inset  .
+    elementMenu := elementMenu scrolledView.
+
+    elementMenu action:[:selection |
+        workView testMode ifTrue:[
+            elementMenu deselect
+        ] ifFalse:[
+            selection notNil ifTrue:[
+                workView createWidgetWithClass:
+                        (Smalltalk at:(elementMenu selectionValue asSymbol))
+            ]
+        ]
+    ].
+
+    treeView := HVScrollableView for:UIPainterTreeView miniScrollerH:true in:topView.
+    treeView origin:0.3 @ 0.0 corner:0.6@1.0.
+    treeView topInset:inset  .
+    treeView := treeView scrolledView.
+    treeView builderView:workView.
+
+    propertyView  := View origin:(0.6 @ 0.0) corner:1.0@1.0 in:topView.
+    propertyView  topInset:inset  .
+    propertyView := UIPropertyView in:propertyView receiver:workView.
+
+    workView addDependent:self.
+    self initPullDownMenu:menu.
+    topView application:self.   
+    builder window:topView.
+    topView  beMaster.
+    workView topView beSlave.
+    topView  open.
+    workView topView openInGroup:(topView windowGroup).
+!
+
+openNewWindowCanvas
+    self open.
+
+
+!
+
+openOnClass:aClass andSelector:aSelector
+    "open up an interface builder, fetching a spec from someClass
+     via some selector"
+
+    |specArray|
+
+    specClass      := aClass name.
+    specSuperclass := aClass superclass name.
+    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.
+! !
+
+!UIPainter methodsFor:'menus'!
+
+menuMisc
+
+    |menuView menuGrid menuUndo|
+
+    menuView := MenuView labels:
+                        (resources array:#(
+                                        'grid' 
+                                        'undo'
+                                    )
+                                )
+                     selectors:#(
+                                        #grid
+                                        #undo
+                                )
+                       receiver:self.
+
+
+    menuGrid := PopUpMenu labels:(
+                        resources array:#(
+                                    '\c show' 
+                                    '\c align'
+                                  )
+                             )
+                  selectors:#(
+                                    #gridShown:
+                                    #gridAlign:
+                             )
+                    receiver:workView.
+
+    menuGrid checkToggleAt:#gridShown: put:(workView gridShown).
+    menuGrid checkToggleAt:#gridAlign: put:(workView gridAlign).
+    menuView subMenuAt:#grid put:menuGrid.
+
+    menuUndo := PopUpMenu labels:(
+                        resources array:#(
+                                        'last'
+                                        'menu'
+                                        '-'
+                                        'delete'
+                                  )
+                             )
+                  selectors:#(
+                                    #undoLast
+                                    #openUndoMenu
+                                    nil
+                                    #removeUndoHistory
+                             )
+                    receiver:workView.
+
+    menuView subMenuAt:#undo put:menuUndo.
+  ^ menuView
+! !
+
+!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 interaction'!
+
+closeRequest
+    workView  notNil ifTrue:[workView  release. workView := nil].
+    super closeRequest
+!
+
+closeRequestFor:aTopView
+    aTopView == topView ifTrue:[
+        super closeRequestFor:aTopView
+    ] ifFalse:[
+        topView device beep
+    ]
+! !
+
+!UIPainter methodsFor:'user interaction - dialogs'!
+
+checkClassAndSelector
+    "check for class & superclass"
+
+    |superclass cls|
+
+    specClass isNil ifTrue:[^ false].
+
+    specClass isBehavior ifFalse:[
+        cls := Smalltalk at:specClass asSymbol
+    ] ifTrue:[
+        cls := specClass
+    ].
+    cls isNil ifTrue:[
+        (superclass := Smalltalk at:specSuperclass asSymbol) isNil ifTrue:[
+            self warn:'no class named ' , specSuperclass , ' exists.'.
+            ^ false.
+        ].
+        (self confirm:'create ' , specClass , ' ?') ifTrue:[
+            superclass subclass:(specClass asSymbol)
+                       instanceVariableNames:''
+                       classVariableNames:''
+                       poolDictionaries:''
+                       category:'New-Applications'.
+            ^ true.
+        ].
+        ^ false.
+    ].
+    cls isBehavior ifFalse:[
+        self warn:'a global named ' , specClass , ' exists, but is no class.'.
+        ^ false.
+    ].
+
+    specSuperclass isBehavior ifFalse:[
+        superclass := Smalltalk at:specSuperclass asSymbol
+    ] ifTrue:[
+        superclass := specSuperclass
+    ].
+    specSuperclass notNil ifTrue:[
+        superclass isNil ifTrue:[
+            self warn:'no class named ' , specSuperclass , ' exists.'.
+            ^ false.
+        ].
+
+        (cls isSubclassOf:superclass) ifFalse:[
+            self warn:'a global named ' , specClass , ' exists, but is not a subclass of ' , superclass name , '.'.
+            ^ false.
+        ]
+    ].
+    ^ true
+!
+
+defineClassAndSelector
+    "launch a dialog to define class, superclass and method"
+
+    |again|
+
+    [
+        again := false.
+        (self openDialogInterface:#nameAndSelectorSpec) ifTrue:[
+
+            specClass := (self aspectFor:#classNameChannel) value.
+            specSelector := (self aspectFor:#methodNameChannel) value.
+            specSuperclass := (self aspectFor:#superclassNameChannel) value.
+
+            again := self checkClassAndSelector not.
+            again ifFalse:[
+                workView className:specClass superclassName:specSuperclass selector:specSelector.
+            ].
+        ]
+    ] doWhile:[again]
+
+! !
+
+!UIPainter methodsFor:'user interaction - menu'!
+
+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"
+!
+
+doInstallAspects
+    |code|
+
+    (specClass isNil or:[specSelector isNil]) ifTrue:[
+        self defineClassAndSelector
+    ].
+
+    self checkClassAndSelector ifFalse:[
+        ^ self
+    ].
+
+    workView className:specClass superclassName:specSuperclass selector:specSelector.
+
+    code := workView generateAspectMethods.
+    (ReadStream on:code) fileIn.
+
+    "Modified: 4.9.1995 / 17:06:10 / claus"
+!
+
+doInstallSpec
+    |code|
+
+    (specClass isNil or:[specSelector isNil]) ifTrue:[
+        self defineClassAndSelector
+    ].
+
+    self checkClassAndSelector ifFalse:[
+        ^ self
+    ].
+
+    workView className:specClass superclassName:specSuperclass selector:specSelector.
+
+    code := workView generateCode.
+    (ReadStream on:code) fileIn.
+
+    "Modified: 4.9.1995 / 17:06:10 / claus"
+!
+
+doNew
+    workView removeAll.
+!
+
+doOpen
+    |box|
+
+    box := FileSelectionBox new.
+    box title:(resources string:'Which file ?').
+    box selectingDirectory:false.
+    box pattern:'*.*'.
+    box action:[:aFile| self openFile:aFile ].
+    box open
+!
+
+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
+!
+
+doRaise
+    workView topView raise
+!
+
+doSave
+    fileName notNil ifTrue:[
+        self saveAs:fileName
+    ] ifFalse:[
+        self doSaveAs
+    ]
+!
+
+doSaveAs
+    |box|
+
+    box := FileSelectionBox new.
+    box title:(resources string:'Which file ?').
+    box selectingDirectory:false.
+    box pattern:'*.*'.
+    box action:[:aFile| self saveAs:aFile ].
+    box open
+! !
+
+!UIPainter ignoredMethodsFor:'user interaction - menu'!
+
+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"
+! !
+
+!UIPainter methodsFor:'user interaction - menu'!
+
+doToggleTest
+    workView testMode:(workView testMode not)
+!
+
+doWindowSpec
+   |code v|
+
+   code := workView generateWindowSpecMethodSource.
+   code := code , workView generateAspectMethods.
+   v := CodeView open.
+   v contents:code.
+   v label:'windowSpec'.
+    ^ self
+
+    "Modified: 5.9.1995 / 21:04:14 / claus"
+! !
+
+!UIPainter::ButtonPanel class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+! !
+
 !UIPainter::ButtonPanel methodsFor:'accessing'!
 
 receiver
@@ -114,3 +1091,8 @@
     ^ menu
 ! !
 
+!UIPainter class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+! !