UIPainter.st
author Claus Gittinger <cg@exept.de>
Tue, 14 May 2019 09:46:21 +0200
changeset 3663 9d49ecf8661a
parent 3648 474d54e24cab
child 3670 3b90ebd379e9
permissions -rw-r--r--
#UI_ENHANCEMENT by cg
class: TabListEditor class
changed:
#canvasSpec
#menu
#windowSpec
     1 "{ Encoding: utf8 }"
     2 
     3 "
     4  COPYRIGHT (c) 1995-1998 by eXept Software AG
     5               All Rights Reserved
     6 
     7  This software is furnished under a license and may be used
     8  only in accordance with the terms of that license and with the
     9  inclusion of the above copyright notice.   This software may not
    10  be provided or otherwise made available to, or used by, any
    11  other person.  No title to or ownership of the software is
    12  hereby transferred.
    13 "
    14 "{ Package: 'stx:libtool2' }"
    15 
    16 "{ NameSpace: Smalltalk }"
    17 
    18 ResourceSpecEditor subclass:#UIPainter
    19 	instanceVariableNames:'specSuperclassName treeView selectionPanel specTool layoutTool
    20 		helpTool painterView painter lastPort lastPage'
    21 	classVariableNames:'SelectionPanelClass UseViewScroller LastPort LastPage
    22 		DefaultEditToolBarVisible DefaultToolBarVisible'
    23 	poolDictionaries:''
    24 	category:'Interface-UIPainter'
    25 !
    26 
    27 Query subclass:#ApplicationClassQuery
    28 	instanceVariableNames:''
    29 	classVariableNames:''
    30 	poolDictionaries:''
    31 	privateIn:UIPainter
    32 !
    33 
    34 SelectionInTreeView subclass:#TreeView
    35 	instanceVariableNames:'lastDrawnMaster canvasEventsDisabled windowSpec windowSpecClass
    36 		painter'
    37 	classVariableNames:''
    38 	poolDictionaries:''
    39 	privateIn:UIPainter
    40 !
    41 
    42 !UIPainter class methodsFor:'documentation'!
    43 
    44 copyright
    45 "
    46  COPYRIGHT (c) 1995-1998 by eXept Software AG
    47               All Rights Reserved
    48 
    49  This software is furnished under a license and may be used
    50  only in accordance with the terms of that license and with the
    51  inclusion of the above copyright notice.   This software may not
    52  be provided or otherwise made available to, or used by, any
    53  other person.  No title to or ownership of the software is
    54  hereby transferred.
    55 "
    56 
    57 !
    58 
    59 documentation
    60 "
    61     The GUI Painter provides the user with a graphical user interface for building own 
    62     interfaces by interactively assembling widgets and defining the behavior of the widgets.
    63     The resulting interface specifications can be saved as methods on the application
    64     classes, typically subclasses of the class ApplicationModel. These specifications
    65     are used by the UIBuilder to generate the application window and its widgets when 
    66     opening the application.
    67 
    68     [start with:]
    69         UIPainter open
    70 
    71     [author:]
    72         Claus Gittinger, eXept Software AG
    73         Claus Atzkern, eXept Software AG
    74         Thomas Zwick, eXept Software AG
    75 
    76     [see also:]
    77         UIBuilder
    78         ApplicationModel
    79         UISpecification
    80 
    81     [instance variables:]                                                  
    82         isSpecOnlyPainter       true if this painter is for a spec only (as used by expecco),
    83                                 as opposed to a regular painter, which stores the spec in a class.
    84                                 A spec-only painter has no class to store additional specs (esp.
    85                                 menu- and tabSpecs) and should not offer postBuild and other
    86                                 callback functions.
    87 "
    88 ! !
    89 
    90 !UIPainter class methodsFor:'initialization'!
    91 
    92 initialize
    93     SelectionPanelClass isNil ifTrue:[
    94         SelectionPanelClass := UISelectionPanel
    95     ].
    96 ! !
    97 
    98 !UIPainter class methodsFor:'instance creation'!
    99 
   100 openOnClass:aClass andSelector:aSelector
   101     "open a GUI Painter on aClass and (windowSpec) aSelector"
   102 
   103     ^ self new openOnClass:aClass theNonMetaclass andSelector:aSelector
   104 ! !
   105 
   106 !UIPainter class methodsFor:'ST-80 queries'!
   107 
   108 preferenceFor:aSymbol
   109     "ST-80 compatible; always returns false
   110     "
   111     ^ false
   112 
   113 
   114 ! !
   115 
   116 !UIPainter class methodsFor:'defaults'!
   117 
   118 defaultEditToolbarVisible
   119     ^ DefaultEditToolBarVisible ? true
   120 !
   121 
   122 defaultNameOfCanvas
   123     "returns the default name of the application"
   124 
   125     ^ 'NewApplication'
   126 !
   127 
   128 defaultToolbarVisible
   129     ^ DefaultToolBarVisible ? true
   130 !
   131 
   132 selectionPanelClass
   133     ^ SelectionPanelClass
   134 
   135     "
   136      UIPainter selectionPanelClass.
   137      UIPainter selectionPanelClass:UISelectionPanel
   138     "
   139 !
   140 
   141 selectionPanelClass:something
   142     "set the class used as selection panel.
   143      this is UISelectionPanel as default"
   144 
   145     SelectionPanelClass := something.
   146 
   147     "
   148      UIPainter selectionPanelClass:UISelectionPanel
   149     "
   150 ! !
   151 
   152 !UIPainter class methodsFor:'help specs'!
   153 
   154 helpSpec
   155     "This resource specification was automatically generated
   156      by the UIHelpTool of ST/X."
   157 
   158     "Do not manually edit this!! If it is corrupted,
   159      the UIHelpTool may not be able to read the specification."
   160 
   161     "
   162      UIHelpTool openOnClass:UIPainter    
   163     "
   164 
   165     <resource: #help>
   166 
   167     ^ super helpSpec addPairsFrom:#(
   168 
   169 #align
   170 'Widget alignment functions'
   171 
   172 #alignResizeSelectionBottom
   173 'Resize the selected widgets'' bottom edges to align them with the bottom of the dominant widget'
   174 
   175 #alignResizeSelectionLeft
   176 'Resize the selected widgets'' left edges to align them with the left edge of the dominant widget'
   177 
   178 #alignResizeSelectionRight
   179 'Resize the selected widgets'' right edges to align them with the right edge of the dominant widget'
   180 
   181 #alignResizeSelectionTop
   182 'Resize the selected widgets'' top edges to align them with the top edge of the dominant widget'
   183 
   184 #alignSelectionBottom
   185 'Aligns the selected widgets'' bottom edges with the bottom of the dominant widget'
   186 
   187 #alignSelectionCenterHor
   188 'Aligns the selected widgets'' centers vertically with the center of the dominant widget'
   189 
   190 #alignSelectionCenterVer
   191 'Aligns the selected widgets'' centers horizontally with the center of the dominant widget'
   192 
   193 #alignSelectionLeft
   194 'Aligns the selected widgets'' left edges with the left edge of the dominant widget'
   195 
   196 #alignSelectionLeftAndRight
   197 'Aligns the selected widgets'' left & right edges with the dominant widget'
   198 
   199 #alignSelectionRight
   200 'Aligns the selected widgets'' right edges with the right edge of the dominant widget'
   201 
   202 #alignSelectionTop
   203 'Aligns the selected widgets'' top edges with the top edge of the dominant widget'
   204 
   205 #alignSelectionTopAndBottom
   206 'Aligns the selected widgets'' top and bottom edges with the dominant widget'
   207 
   208 #alignToGrid
   209 'Align to grid'
   210 
   211 #centerSelectionHor
   212 'Centers the selected widgets horizontally within their containing widget'
   213 
   214 #centerSelectionVer
   215 'Centers the selected widgets vertically within their containing widget'
   216 
   217 #changePositionDown
   218 'Moves the selected widget(s) towards the bottom (by %1 pixels)'
   219 
   220 #changePositionLeft
   221 'Moves the selected widget(s) towards the left (by %1 pixels)'
   222 
   223 #changePositionRight
   224 'Moves the selected widget(s) towards the right (by %1 pixels)'
   225 
   226 #changePositionUp
   227 'Moves the selected widget(s) towards the top (by %1 pixels)'
   228 
   229 #'changeMoveDelta'
   230 'Click to change the delta by which the buttons to the left move the selected widget(s)'
   231 
   232 #editBrowseViewClass
   233 'Opens a browser on the class of the selected widget'
   234 
   235 #editDimensionCopyExtent
   236 'Copies the extent of the selected widget'
   237 
   238 #editDimensionCopyLayout
   239 'Copies the layout of the selected widget'
   240 
   241 #editDimensionDefaultExtent
   242 'Sets the selected widget(s) extent to their default'
   243 
   244 #editDimensionDefaultHeight
   245 'Sets the selected widget(s) height to their default'
   246 
   247 #editDimensionDefaultWidth
   248 'Sets the selected widget(s) width to their default'
   249 
   250 #editDimensionPasteExtent
   251 'Sets the extent of the selected widget(s) to the last copied extent'
   252 
   253 #editDimensionPasteHeight
   254 'Sets the height of the selected widget(s) to the height of the last copied layout/extent'
   255 
   256 #editDimensionPasteLayout
   257 'Sets the layout of the selected widget(s) to the last copied layout'
   258 
   259 #editDimensionPasteWidth
   260 'Sets the width of the selected widget(s) to the width of the last copied layout/extent'
   261 
   262 #editInspectSpec
   263 'Opens an inspector on the spec of the selected widget'
   264 
   265 #editInspectView
   266 'Opens an inspector on the selected widget'
   267 
   268 #editOpenSpecDocumentation
   269 'Opens the documentation of the selected widget'
   270 
   271 #editSaveSpecForSelection
   272 'Generate a sub-spec method for the selected element only.\Useful when refactoring an existing spec into sub specifications.'
   273 
   274 #fileBrowseAspectMethods
   275 'Opens a System Browser on the application''s aspect methods'
   276 
   277 #fileBrowseClass
   278 'Open a System Browser on the application''s class'
   279 
   280 #fileLoad
   281 'Opens a dialog to load a window specification from a classes spec method'
   282 
   283 #fileLoadSubspec
   284 'Opens a dialog to load a sub specification from a classes windowSpec method'
   285 
   286 #fileNew
   287 'Creates a new window spec'
   288 
   289 #filePickAnInterface
   290 'Select a view on the screen, generate a window spec for it and edit this spec'
   291 
   292 #fileSave
   293 'Saves the window spec in the current class (as spec method)'
   294 
   295 #fileSaveAs
   296 'Opens a dialog to select class and selector for saving the window spec'
   297 
   298 #fileShowWindowSpec
   299 'Opens a Workspace showing the current window spec'
   300 
   301 #generateAspectMethods
   302 'Generates aspect methods for defined aspect selectors of the widgets'
   303 
   304 #generateHookMethods
   305 'Generates startup/release methods. (#closeRequest, #postBuildWith:, #postOpenWith:)'
   306 
   307 #helpExamples
   308 'Show some examples uses of the GUI Painter'
   309 
   310 #helpFunctions
   311 'Show the documentation on the GUI Painters menu and button functions'
   312 
   313 #helpLayoutTool
   314 'Show the Layout Tools documentation'
   315 
   316 #helpSelectedWidget
   317 'Show the documentation of the selected widget'
   318 
   319 #helpTutorial
   320 'Show the GUI Painters documentation'
   321 
   322 #historyMenuItem
   323 'Edit this windowSpec'
   324 
   325 #moveWidgetDown
   326 'Moves the selected widget down in the list (brings it to the front)'
   327 
   328 #moveWidgetInto
   329 'Moves the selected widget into next widget as child widget'
   330 
   331 #moveWidgetOut
   332 'Moves the selected widget out of its parent widget'
   333 
   334 #moveWidgetUp
   335 'Moves the selected widget up in the list (brings it to the back)'
   336 
   337 #openColorEditor
   338 'Open a color editor'
   339 
   340 #pasteBuffer
   341 'Pastes the widgets of the clipboard at the current mouse position'
   342 
   343 #pasteWithLayout
   344 'Pastes the widgets of the clipboard without changing their layouts'
   345 
   346 #pickColorFromScreen
   347 'Pick a color from the screen'
   348 
   349 #recentlyUsedColors
   350 'Pick a recently used color'
   351 
   352 #settingsAspectsAsInstances
   353 'Generate aspects as instance variables (or bindings, if off)'
   354 
   355 #settingsCanvas
   356 'Shows or hides the canvas window'
   357 
   358 #settingsGallery
   359 'Shows or hides the gallery window'
   360 
   361 #settingsGenerateCommentedCode
   362 'Enables/disables comments in the generated code, especially in aspect and hook methods'
   363 
   364 #settingsGridManager
   365 'Opens a dialog to toggle grid display or to change the grids spacing'
   366 
   367 #settingsRedefineAspectMethods
   368 'Toggles the permission to overwrite existing aspect methods'
   369 
   370 #settingsTranscriptHelp
   371 'Toggles display of help texts (after opening a new GUI Painter)'
   372 
   373 #settingsUndoManager
   374 'Opens a dialog to undo modifications'
   375 
   376 #shadesOfBlue
   377 'Blue color tones'
   378 
   379 #shadesOfCyan
   380 'Cyan color tones'
   381 
   382 #shadesOfGray
   383 'Gray color tones (not 50 shades)'
   384 
   385 #shadesOfGreen
   386 'Green color tones'
   387 
   388 #shadesOfMagenta
   389 'Magenta color tones'
   390 
   391 #shadesOfRed
   392 'Red color tones'
   393 
   394 #shadesOfYellow
   395 'Yellow color tones'
   396 
   397 #showGrid
   398 'Show the grid'
   399 
   400 #sortItems
   401 'Sort the selected items by position (left to right, top to bottom)'
   402 
   403 #spreadSelectionHor
   404 'Sets the horizontal spaces between the selected widgets to the same value'
   405 
   406 #spreadSelectionVer
   407 'Sets the vertical spaces between the selected widgets to the same value'
   408 
   409 #testGeometryTestMode
   410 'Toggles geometry test mode (to define ratios of variable panels and top-window dimension)'
   411 
   412 #testStartApplication
   413 'Starts the application with the current window spec'
   414 
   415 #useDefaultColorToggle
   416 'Toggle between default and explicit color'
   417 
   418 #useDefaultFontToggle
   419 'Toggle between default and explicit font'
   420 
   421 #concreteFontsFamily
   422 'Choose a font family'
   423 
   424 #concreteFontsFace
   425 'Choose a font face'
   426 
   427 #concreteFontsStyle
   428 'Choose a font style'
   429 
   430 #concreteFontsSize
   431 'Choose a font size (in points, not pixels)'
   432 
   433 )
   434 
   435     "Modified: / 01-06-2018 / 12:41:23 / Claus Gittinger"
   436 ! !
   437 
   438 !UIPainter class methodsFor:'helpers'!
   439 
   440 convertString:aString maxLineSize:maxCharactersPerLine skipLineFeed:skipLineFeed
   441     "converts a string to a string collection with maximum characters
   442      per line
   443     "
   444     |stream
   445         max     "{ Class:SmallInteger }"
   446         size    "{ Class:SmallInteger }"
   447         start   "{ Class:SmallInteger }"
   448         stop    "{ Class:SmallInteger }"
   449         cpySz   "{ Class:SmallInteger }"
   450         lnSz    "{ Class:SmallInteger }"
   451         atBeginOfLine|
   452 
   453     maxCharactersPerLine < 20 ifFalse:[max := maxCharactersPerLine - 1]
   454                                ifTrue:[max := 20].
   455 
   456     (size := aString size) <= max ifTrue:[
   457         ^ aString
   458     ].
   459     start  := 1.
   460     lnSz   := 0.
   461     stream := (String new:size) writeStream.
   462 
   463     atBeginOfLine := true.
   464 
   465     [start <= size] whileTrue:[
   466         (start := aString indexOfNonSeparatorStartingAt:start) == 0 ifTrue:[
   467             ^ stream contents
   468         ].
   469         (aString at:start) == $\ ifTrue:[
   470             skipLineFeed ifFalse:[
   471                 stream nextPut:$\
   472             ].
   473             start := start + 1.
   474             stream cr.
   475             start := start + 1.
   476             lnSz := 0.
   477         ] ifFalse:[
   478             (stop := aString indexOfSeparatorStartingAt:start) == 0 ifTrue:[
   479                 stop := size + 1
   480             ].
   481             (aString at:(stop - 1)) == $\ ifTrue:[
   482                 stop := stop - 1
   483             ].
   484             cpySz := stop - start.
   485 
   486             lnSz == 0 ifFalse:[
   487                 (lnSz := lnSz + cpySz) >= max ifTrue:[stream cr.    lnSz := cpySz. atBeginOfLine := true. ]
   488                                              ifFalse:[stream space. lnSz := lnSz + 1]
   489             ] ifTrue:[
   490                 lnSz := cpySz
   491             ].
   492             stream nextPutAll:aString startingAt:start to:(stop - 1).
   493             start := stop.
   494         ]
   495     ].
   496     ^ stream contents
   497 
   498     "Modified: / 1.2.1998 / 14:42:56 / cg"
   499 ! !
   500 
   501 !UIPainter class methodsFor:'image specs'!
   502 
   503 arrowDown
   504     <resource: #image>
   505     "This resource specification was automatically generated
   506      by the ImageEditor of ST/X."
   507     "Do not manually edit this!! If it is corrupted,
   508      the ImageEditor may not be able to read the specification."
   509     "
   510      self arrowDown inspect
   511      ImageEditor openOnClass:self andSelector:#arrowDown
   512      Icon flushCachedIcons"
   513     
   514     ^ Icon constantNamed:'UIPainter class arrowDown'
   515         ifAbsentPut:[
   516             (Depth1Image new)
   517                 width:11;
   518                 height:11;
   519                 photometric:(#palette);
   520                 bitsPerSample:(#[ 1 ]);
   521                 samplesPerPixel:(1);
   522                 bits:(ByteArray fromPackedString:'?>C?8O? ?>C@XNC <^C;8O? ?>C?8@@a');
   523                 colorMapFromArray:#[ 0 0 0 255 255 255 ];
   524                 mask:((ImageMask new)
   525                             width:11;
   526                             height:11;
   527                             bits:(ByteArray 
   528                                         fromPackedString:'
   529 @@@@@@@@@@@? A<@C @D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   530 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a');
   531                             yourself);
   532                 yourself
   533         ]
   534 !
   535 
   536 arrowLeft
   537     <resource: #image>
   538     "This resource specification was automatically generated
   539      by the ImageEditor of ST/X."
   540     "Do not manually edit this!! If it is corrupted,
   541      the ImageEditor may not be able to read the specification."
   542     "
   543      self arrowLeft inspect
   544      ImageEditor openOnClass:self andSelector:#arrowLeft
   545      Icon flushCachedIcons"
   546     
   547     ^ Icon constantNamed:'UIPainter class arrowLeft'
   548         ifAbsentPut:[
   549             (Depth1Image new)
   550                 width:11;
   551                 height:11;
   552                 photometric:(#palette);
   553                 bitsPerSample:(#[ 1 ]);
   554                 samplesPerPixel:(1);
   555                 bits:(ByteArray fromPackedString:'?>C?8O7 >^C18NG <^C98O7 ?>C?8@@a');
   556                 colorMapFromArray:#[ 0 0 0 255 255 255 ];
   557                 mask:((ImageMask new)
   558                             width:11;
   559                             height:11;
   560                             bits:(ByteArray fromPackedString:'@@@@@@H@A @N@A8@C PF@@H@@@@@@@@a');
   561                             yourself);
   562                 yourself
   563         ]
   564 !
   565 
   566 arrowRight
   567     <resource: #image>
   568     "This resource specification was automatically generated
   569      by the ImageEditor of ST/X."
   570     "Do not manually edit this!! If it is corrupted,
   571      the ImageEditor may not be able to read the specification."
   572     "
   573      self arrowRight inspect
   574      ImageEditor openOnClass:self andSelector:#arrowRight
   575      Icon flushCachedIcons"
   576     
   577     ^ Icon constantNamed:'UIPainter class arrowRight'
   578         ifAbsentPut:[
   579             (Depth1Image new)
   580                 width:11;
   581                 height:11;
   582                 photometric:(#palette);
   583                 bitsPerSample:(#[ 1 ]);
   584                 samplesPerPixel:(1);
   585                 bits:(ByteArray fromPackedString:'?>C?8O_ <>C18OC <^C38O_ ?>C?8@@a');
   586                 colorMapFromArray:#[ 0 0 0 255 255 255 ];
   587                 mask:((ImageMask new)
   588                             width:11;
   589                             height:11;
   590                             bits:(ByteArray fromPackedString:'@@@@@@ @C@@NA@<@C @L@@ @@@@@@@@a');
   591                             yourself);
   592                 yourself
   593         ]
   594 !
   595 
   596 arrowUp
   597     <resource: #image>
   598     "This resource specification was automatically generated
   599      by the ImageEditor of ST/X."
   600     "Do not manually edit this!! If it is corrupted,
   601      the ImageEditor may not be able to read the specification."
   602     "
   603      self arrowUp inspect
   604      ImageEditor openOnClass:self andSelector:#arrowUp
   605      Icon flushCachedIcons"
   606     
   607     ^ Icon constantNamed:'UIPainter class arrowUp'
   608         ifAbsentPut:[
   609             (Depth1Image new)
   610                 width:11;
   611                 height:11;
   612                 photometric:(#palette);
   613                 bitsPerSample:(#[ 1 ]);
   614                 samplesPerPixel:(1);
   615                 bits:(ByteArray fromPackedString:'?>C?8O? >>C18NC 0FC?8O? ?>C?8@@a');
   616                 colorMapFromArray:#[ 0 0 0 255 255 255 ];
   617                 mask:((ImageMask new)
   618                             width:11;
   619                             height:11;
   620                             bits:(ByteArray fromPackedString:'@@@@@@@@A@@NG1<@O8@@@@@@@@@@AP@a');
   621                             yourself);
   622                 yourself
   623         ]
   624 !
   625 
   626 browseActionImage
   627     <resource: #image>
   628     "This resource specification was automatically generated
   629      by the ImageEditor of ST/X."
   630     "Do not manually edit this!! If it is corrupted,
   631      the ImageEditor may not be able to read the specification."
   632     "
   633      self browseActionImage inspect
   634      ImageEditor openOnClass:self andSelector:#browseActionImage
   635      Icon flushCachedIcons"
   636     
   637     ^ Icon constantNamed:'UIPainter class browseActionImage'
   638         ifAbsentPut:[
   639             (Depth8Image new)
   640                 width:11;
   641                 height:12;
   642                 photometric:(#palette);
   643                 bitsPerSample:(#[ 8 ]);
   644                 samplesPerPixel:(1);
   645                 bits:(ByteArray 
   646                             fromPackedString:'
   647 R@@@RT%RST1LTD9H@D%IT%MRSD1PS$!!RT$5RUEILT%INT%UVT%YWU%IVUUIHT%!!YV%-ZVU!!RWD!!MT%Y[@E-VT%5\RD1RU%,@V5YRWU1HT%!!YV%-ZVU!!RWEIU
   648 U%IVU5YRU%URZ%IR@EITT ART&,@@@@@T%MR@@@@@@@@@@@@T @@@@@@');
   649                 colorMapFromArray:#[ 255 248 248 63 144 224 64 152 232 79 160 232 64 152 224 64 144 224 63 136 224 48 128 216 48 120 216 47 112 216 47 112 208 32 104 208 32 96 208 31 88 200 16 88 200 16 80 200 15 72 192 15 64 192 0 64 192 0 56 184 0 56 176 0 48 160 143 200 248 128 200 248 127 192 248 112 184 248 111 176 248 96 168 248 95 160 248 80 152 248 79 144 248 64 128 248 63 120 248 48 112 248 32 104 248 31 96 248 16 88 248 15 80 248 0 72 248 0 64 240 0 48 168 112 176 248 111 168 248 96 160 248 95 152 248 80 144 248 79 136 248 63 128 248 48 120 248 47 112 248 15 72 248 0 48 176 95 168 232 191 224 248 191 216 248 176 208 248 175 208 248 175 200 248 160 200 248 160 192 248 159 192 248 159 184 248 144 184 248 144 176 248 143 168 248 128 168 248 128 160 248 127 160 248 127 152 240 31 72 176 111 168 232 127 160 216 207 216 240 240 240 248 240 232 240 63 88 176 239 232 240 240 240 240 48 88 176 96 168 224 224 224 232 96 160 224 240 144 24 255 248 48 255 248 96 255 248 24 240 208 24 255 248 152 255 248 88 255 248 136 255 248 176 255 248 200 48 80 176 223 216 224 96 152 224 96 152 216 95 152 216 48 120 208 80 144 208 80 136 208 79 128 200 79 120 200 79 120 192 64 112 192 64 104 184 63 104 184 63 96 184 15 56 160 ];
   650                 mask:((ImageMask new)
   651                             width:11;
   652                             height:12;
   653                             bits:(ByteArray fromPackedString:'A@@N@F;@?>A?0G>@O8A?0O? [,@N@@P@');
   654                             yourself);
   655                 yourself
   656         ]
   657 !
   658 
   659 builderIcon
   660     "This resource specification was automatically generated
   661      by the ImageEditor of ST/X."
   662 
   663     "Do not manually edit this!! If it is corrupted,
   664      the ImageEditor may not be able to read the specification."
   665 
   666     "
   667      self builderIcon inspect
   668      ImageEditor openOnClass:self andSelector:#builderIcon
   669      Icon flushCachedIcons
   670     "
   671 
   672     <resource: #image>
   673 
   674     ^Icon
   675         constantNamed:'UIPainter builderIcon'
   676         ifAbsentPut:[(Depth1Image width:48 height:48 photometric:#whiteIs0) bits:(ByteArray fromPackedString:'
   677 @@@@@@@@O??????<H@@@@@@DH_@@@@@DH_@OC?>DH_@IC??$H_@IC??4H_@IC??$H_@IC?>DH_@F@J DH_@F@M DH_@F@J DH_@F@M DH_@F@J DH_@F@M D
   678 H_@F@J DH_@F@M DH_@F@J DH_@F@M DH_@F@J DH_@_ M DH_@ PJ DH_@)PM DH_@)PJ DH_@)PM DH? )PJ DI?0)PM DK?8)PJ DK18)PM DK 8)PJ D
   679 K@X)PM DK@X PG@DK@X_ @@DH@@@@@@DH@@@@@@DO??????<@@@@@@@@NDIHNG''@IDIHIDD H$IHH$DPIDIHH$DPNDIHH$D IDIHH''G@H$IHH$E@H$IHH$D 
   680 IBQHIDDPNA!!ONG$P@@@@@@@@'); yourself]
   681 !
   682 
   683 defaultIcon
   684     <resource: #programImage>
   685 
   686     ^ ToolbarIconLibrary startUIPainterIcon
   687 
   688     "Created: / 10-02-2007 / 14:45:56 / cg"
   689     "Modified: / 17-09-2007 / 11:36:33 / cg"
   690 !
   691 
   692 delta
   693     "This resource specification was automatically generated
   694      by the ImageEditor of ST/X."
   695 
   696     "Do not manually edit this!! If it is corrupted,
   697      the ImageEditor may not be able to read the specification."
   698 
   699     "
   700      self delta inspect
   701      ImageEditor openOnClass:self andSelector:#delta
   702      Icon flushCachedIcons
   703     "
   704 
   705     <resource: #image>
   706 
   707     ^Icon
   708         constantNamed:'UIPainter delta'
   709         ifAbsentPut:[(Depth1Image new) width:11; height:11; bits:(ByteArray fromPackedString:'?>C?8O? >>C@XLA 0VB;(H@ ?"C?8@@a') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((ImageMask new) width:11; height:11; bits:(ByteArray fromPackedString:'
   710 @@@@@@@@A@@J@AD@HHA@PG?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   711 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
   712 !
   713 
   714 editTableIcon
   715     <resource: #programImage>
   716 
   717     ^ SystemBrowser tableColumnsIcon
   718 !
   719 
   720 helpIcon
   721     <resource: #programImage>
   722 
   723     ^ ToolbarIconLibrary help22x22Icon
   724 
   725     "Modified: / 14-07-2017 / 10:20:24 / cg"
   726 !
   727 
   728 hideToolBarIcon
   729     <resource: #programImage>
   730 
   731     ^ ToolbarIconLibrary hideToolBarIcon
   732 !
   733 
   734 iconAlignB
   735     <resource: #image>
   736     "This resource specification was automatically generated
   737      by the ImageEditor of ST/X."
   738     "Do not manually edit this!! If it is corrupted,
   739      the ImageEditor may not be able to read the specification."
   740     "
   741      self iconAlignB inspect
   742      ImageEditor openOnClass:self andSelector:#iconAlignB
   743      Icon flushCachedIcons"
   744     
   745     ^ Icon constantNamed:'UIPainter class iconAlignB'
   746         ifAbsentPut:[
   747             (Depth2Image new)
   748                 width:22;
   749                 height:22;
   750                 photometric:(#palette);
   751                 bitsPerSample:(#( 2 ));
   752                 samplesPerPixel:(1);
   753                 bits:(ByteArray 
   754                             fromPackedString:'
   755 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E@@@@@@@G@@@@@@@G@E@@@@@G@G@@@@@G@G@@@@@G@G@@@E@G@G@@@G@G@G@K@G@G@G@@@G@G@G@A@G@G@G@@
   756 @G@G@G@K@@@@@@@@B*****(@B*****(@@@@@@@@@@@@@@@@@@@@@@@@@');
   757                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   758                 mask:((ImageMask new)
   759                             width:22;
   760                             height:22;
   761                             bits:(ByteArray 
   762                                         fromPackedString:'@@@@@@@@@@@@@G C@G @@G'' @G'' @G'' @G'' G'''' G'''' G'''' G''''!!G'''' G'''' G'''' G'''' O??0O??0@@@@@@@C@@@@');
   763                             yourself);
   764                 yourself
   765         ]
   766 !
   767 
   768 iconAlignL
   769     <resource: #image>
   770     "This resource specification was automatically generated
   771      by the ImageEditor of ST/X."
   772     "Do not manually edit this!! If it is corrupted,
   773      the ImageEditor may not be able to read the specification."
   774     "
   775      self iconAlignL inspect
   776      ImageEditor openOnClass:self andSelector:#iconAlignL
   777      Icon flushCachedIcons"
   778     
   779     ^ Icon constantNamed:'UIPainter class iconAlignL'
   780         ifAbsentPut:[
   781             (Depth2Image new)
   782                 width:22;
   783                 height:22;
   784                 photometric:(#palette);
   785                 bitsPerSample:(#( 2 ));
   786                 samplesPerPixel:(1);
   787                 bits:(ByteArray 
   788                             fromPackedString:'
   789 @@@@@@@@@@@@@@@@@(@@@@@@@(@@@@@@@(UUUP@I@(_??0@@@(@@@@@@@(@@@@@@@(@@@@@@@(@@@@@@@(UUUU@@@(_???@@@(@@@@@E@(@@@@@@@(@@@@@@
   790 @(@@@@@@@(UU@@@@@(_?@@@@@(@@@@@@@(@@@@@@@@@@@@@E@@@@@@@@');
   791                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   792                 mask:((ImageMask new)
   793                             width:22;
   794                             height:22;
   795                             bits:(ByteArray 
   796                                         fromPackedString:'@@@@@@@@F@@@G?>@G?>@G?>@G?>@F@@@F@@@G?? G?? G?? G?? F@@@F@@@G? @G? @G? @G? @F@@@@@@@@@@@');
   797                             yourself);
   798                 yourself
   799         ]
   800 !
   801 
   802 iconAlignLR
   803     <resource: #image>
   804     "This resource specification was automatically generated
   805      by the ImageEditor of ST/X."
   806     "Do not manually edit this!! If it is corrupted,
   807      the ImageEditor may not be able to read the specification."
   808     "
   809      self iconAlignLR inspect
   810      ImageEditor openOnClass:self andSelector:#iconAlignLR
   811      Icon flushCachedIcons"
   812     
   813     ^ Icon constantNamed:'UIPainter class iconAlignLR'
   814         ifAbsentPut:[
   815             (Depth2Image new)
   816                 width:22;
   817                 height:22;
   818                 photometric:(#palette);
   819                 bitsPerSample:(#( 2 ));
   820                 samplesPerPixel:(1);
   821                 bits:(ByteArray 
   822                             fromPackedString:'
   823 @@@@@@@@@@@@@@@@@(@@@B @@(@@@B @@(UUUR I@(_??2 @@(@@@B @@(@@@B @@(@@@B @@(@@@B @@(UUUR @@(_??2 @@(@@@B E@(@@@B @@(@@@B @
   824 @(@@@B @@(UUUR @@(_??B @@(@@@B @@(@@@B @@@@@@@@E@@@@@@@@');
   825                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   826                 mask:((ImageMask new)
   827                             width:22;
   828                             height:22;
   829                             bits:(ByteArray 
   830                                         fromPackedString:'@@@@@@@@F@A G?? G?? G?? G?? F@A F@A G?? G?? G?? G?? F@A F@A G?? G?? G?; G?? F@A @@@@@@@@');
   831                             yourself);
   832                 yourself
   833         ]
   834 !
   835 
   836 iconAlignR
   837     <resource: #image>
   838     "This resource specification was automatically generated
   839      by the ImageEditor of ST/X."
   840     "Do not manually edit this!! If it is corrupted,
   841      the ImageEditor may not be able to read the specification."
   842     "
   843      self iconAlignR inspect
   844      ImageEditor openOnClass:self andSelector:#iconAlignR
   845      Icon flushCachedIcons"
   846     
   847     ^ Icon constantNamed:'UIPainter class iconAlignR'
   848         ifAbsentPut:[
   849             (Depth2Image new)
   850                 width:22;
   851                 height:22;
   852                 photometric:(#palette);
   853                 bitsPerSample:(#( 2 ));
   854                 samplesPerPixel:(1);
   855                 bits:(ByteArray 
   856                             fromPackedString:'
   857 @@@@@@@@@@@@@@@@@@@@@B @@@@@@B @@@UUUR I@@_??2 @@@@@@B @@@@@@B @@@@@@B @@@@@@B @@EUUUR @@G???2 @@@@@@B E@@@@@B @@@@@@B @
   858 @@@@@B @@@@EUR @@@@G?2 @@@@@@B @@@@@@B @@@@@@@@E@@@@@@@@');
   859                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   860                 mask:((ImageMask new)
   861                             width:22;
   862                             height:22;
   863                             bits:(ByteArray 
   864                                         fromPackedString:'@@@@@@@@@@A A?? A?? A?? A?? @@A @@A G?? G?? G?? G?? @@A @@A @G? @G? @G? @G? @@A @@@@@@@@');
   865                             yourself);
   866                 yourself
   867         ]
   868 !
   869 
   870 iconAlignT
   871     <resource: #image>
   872     "This resource specification was automatically generated
   873      by the ImageEditor of ST/X."
   874     "Do not manually edit this!! If it is corrupted,
   875      the ImageEditor may not be able to read the specification."
   876     "
   877      self iconAlignT inspect
   878      ImageEditor openOnClass:self andSelector:#iconAlignT
   879      Icon flushCachedIcons"
   880     
   881     ^ Icon constantNamed:'UIPainter class iconAlignT'
   882         ifAbsentPut:[
   883             (Depth2Image new)
   884                 width:22;
   885                 height:22;
   886                 photometric:(#palette);
   887                 bitsPerSample:(#( 2 ));
   888                 samplesPerPixel:(1);
   889                 bits:(ByteArray 
   890                             fromPackedString:'
   891 @@@@@@@@@@@@@@@@@@@@@@@@B*****(@B*****(@@@@@@@@@@E@E@E@K@G@G@G@@@G@G@G@A@G@G@G@@@G@G@G@K@G@G@G@@@@@G@G@@@@@G@G@@@@@G@G@@
   892 @@@G@G@@@@@G@@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
   893                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   894                 mask:((ImageMask new)
   895                             width:22;
   896                             height:22;
   897                             bits:(ByteArray 
   898                                         fromPackedString:'@@@@@@@C@@@@O??0O??0G'''' G'''' G'''' G'''' G''''!!G'''' G'''' G'''' @G'' @G'' @G'' @G'' @G @@G C@@@@@@@@@@@@');
   899                             yourself);
   900                 yourself
   901         ]
   902 !
   903 
   904 iconAlignTB
   905     <resource: #image>
   906     "This resource specification was automatically generated
   907      by the ImageEditor of ST/X."
   908     "Do not manually edit this!! If it is corrupted,
   909      the ImageEditor may not be able to read the specification."
   910     "
   911      self iconAlignTB inspect
   912      ImageEditor openOnClass:self andSelector:#iconAlignTB
   913      Icon flushCachedIcons"
   914     
   915     ^ Icon constantNamed:'UIPainter class iconAlignTB'
   916         ifAbsentPut:[
   917             (Depth2Image new)
   918                 width:22;
   919                 height:22;
   920                 photometric:(#palette);
   921                 bitsPerSample:(#( 2 ));
   922                 samplesPerPixel:(1);
   923                 bits:(ByteArray 
   924                             fromPackedString:'
   925 @@@@@@@A@@@@@@@@@@@@@@@@B*****(@B*****(@@@@@@@@@@E@E@E@G@G@G@G@@@G@G@G@@@G@G@G@@@G@G@G@H@G@G@G@@@G@G@G@A@G@G@G@@@G@G@G@@
   926 @G@G@D@@@@@@@@@@B*****(@B*****(@@@@@@@@@@@@@@@@H@@@@@@@@');
   927                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   928                 mask:((ImageMask new)
   929                             width:22;
   930                             height:22;
   931                             bits:(ByteArray 
   932                                         fromPackedString:'@@@@@@@C@@@@O??0O??0G'''' G''''!!G'''' G'''' G'''' G'''' G'''' G'''' G''''!!G''''!!G''& G'''' O??0O??2@@@@@@@@@@@@');
   933                             yourself);
   934                 yourself
   935         ]
   936 !
   937 
   938 iconCenterH
   939     <resource: #image>
   940     "This resource specification was automatically generated
   941      by the ImageEditor of ST/X."
   942     "Do not manually edit this!! If it is corrupted,
   943      the ImageEditor may not be able to read the specification."
   944     "
   945      self iconCenterH inspect
   946      ImageEditor openOnClass:self andSelector:#iconCenterH
   947      Icon flushCachedIcons"
   948     
   949     ^ Icon constantNamed:'UIPainter class iconCenterH'
   950         ifAbsentPut:[
   951             (Depth2Image new)
   952                 width:22;
   953                 height:22;
   954                 photometric:(#palette);
   955                 bitsPerSample:(#( 2 ));
   956                 samplesPerPixel:(1);
   957                 bits:(ByteArray 
   958                             fromPackedString:'
   959 @@@@@@@@@@@@@@@@@(@J@B @@(@J@B @@(UZUR @@(?:?R @@(@J@B @@(@J@B @@(@J@B @@@@J@@@@@EUZUU@@@O?:?=@@@@@J@@@@@(@J@B @@(@J@B @
   960 @(@J@B @@(EZUB@@@(O:=B @@(@J@B @@(@J@B @@@@@@@@@@@@@@@@@');
   961                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   962                 mask:((ImageMask new)
   963                             width:22;
   964                             height:22;
   965                             bits:(ByteArray 
   966                                         fromPackedString:'@@@@@@@@@C@@A?>@A?>@A?>@A?>@@C@@@C@@G?? G?? G?? G??#@C@@@C@C@?<@@?<A@?<@@?<@@C@@@@@A@@@@');
   967                             yourself);
   968                 yourself
   969         ]
   970 !
   971 
   972 iconCenterHInFrame
   973     <resource: #image>
   974     "This resource specification was automatically generated
   975      by the ImageEditor of ST/X."
   976     "Do not manually edit this!! If it is corrupted,
   977      the ImageEditor may not be able to read the specification."
   978     "
   979      self iconCenterHInFrame inspect
   980      ImageEditor openOnClass:self andSelector:#iconCenterHInFrame
   981      Icon flushCachedIcons"
   982     
   983     ^ Icon constantNamed:'UIPainter class iconCenterHInFrame'
   984         ifAbsentPut:[
   985             (Depth2Image new)
   986                 width:22;
   987                 height:22;
   988                 photometric:(#palette);
   989                 bitsPerSample:(#( 2 ));
   990                 samplesPerPixel:(1);
   991                 bits:(ByteArray 
   992                             fromPackedString:'
   993 @@@@@@@@J******@H@@@@@B@HL@@@CB@H8UUUR2@HH???RB@H8@@@B2@HH@@@BB@H8@@@B2@H@@@@@B@HEUUUUB@HO???=B@H@@@@@B@H8@@@@2@HH@@@@B@
   994 H8@@@@2@HHEUUBB@H8O?=B2@HL@@@CB@H@@@@@B@J******@@@@@@@@@');
   995                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
   996                 mask:((ImageMask new)
   997                             width:22;
   998                             height:22;
   999                             bits:(ByteArray 
  1000                                         fromPackedString:'@@@@_??8P@@HW??(U?>(U?>(U?>(T@@(T@@(W??(W??(W??(W??+T@@(T@@+T?<(T?<)T?<(W??(P@@H_??9@@@@');
  1001                             yourself);
  1002                 yourself
  1003         ]
  1004 !
  1005 
  1006 iconCenterV
  1007     <resource: #image>
  1008     "This resource specification was automatically generated
  1009      by the ImageEditor of ST/X."
  1010     "Do not manually edit this!! If it is corrupted,
  1011      the ImageEditor may not be able to read the specification."
  1012     "
  1013      self iconCenterV inspect
  1014      ImageEditor openOnClass:self andSelector:#iconCenterV
  1015      Icon flushCachedIcons"
  1016     
  1017     ^ Icon constantNamed:'UIPainter class iconCenterV'
  1018         ifAbsentPut:[
  1019             (Depth2Image new)
  1020                 width:22;
  1021                 height:22;
  1022                 photometric:(#palette);
  1023                 bitsPerSample:(#( 2 ));
  1024                 samplesPerPixel:(1);
  1025                 bits:(ByteArray 
  1026                             fromPackedString:'
  1027 @@@@@@@@@@@@@@@@@@@@@@@@B**@J*(@B**MJ*(@@@@M@@@@@@@M@M@@@M@M@M@@@M@M@M@@@M@M@M@@B*****(@B*****(@@M@M@M@@@M@M@M@@@E@M@M@@
  1028 @@@M@E@@@@@M@@@@B**EJ*(@B(*@J*(@@@@@@@@@@@@@@@@@@@@@@@@@');
  1029                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1030                 mask:((ImageMask new)
  1031                             width:22;
  1032                             height:22;
  1033                             bits:(ByteArray 
  1034                                         fromPackedString:'@@@@@@@@@@@@@G @@G @@G'' G''''!!G'''' G'''' G'''' O??0O??0G'''' G'''' G'''' G'''' @G''#@G @@G C@@@@@@@@@@@@');
  1035                             yourself);
  1036                 yourself
  1037         ]
  1038 !
  1039 
  1040 iconCenterVInFrame
  1041     <resource: #image>
  1042     "This resource specification was automatically generated
  1043      by the ImageEditor of ST/X."
  1044     "Do not manually edit this!! If it is corrupted,
  1045      the ImageEditor may not be able to read the specification."
  1046     "
  1047      self iconCenterVInFrame inspect
  1048      ImageEditor openOnClass:self andSelector:#iconCenterVInFrame
  1049      Icon flushCachedIcons"
  1050     
  1051     ^ Icon constantNamed:'UIPainter class iconCenterVInFrame'
  1052         ifAbsentPut:[
  1053             (Depth2Image new)
  1054                 width:22;
  1055                 height:22;
  1056                 photometric:(#palette);
  1057                 bitsPerSample:(#( 2 ));
  1058                 samplesPerPixel:(1);
  1059                 bits:(ByteArray 
  1060                             fromPackedString:'
  1061 @@@@@@@@J******@H@@@@@B@HL3@L3B@H:*GJ*2@H@@G@@B@HG@G@@B@HG@G@GB@HG@G@GB@HG@G@GB@HG@G@GB@HG@G@GB@HG@G@GB@HG@G@GB@HG@G@EB@
  1062 HE@G@@B@H@@G@@B@H:*E@J2@HL3@L3B@H@@@@@B@J******@@@@@@@@@');
  1063                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1064                 mask:((ImageMask new)
  1065                             width:22;
  1066                             height:22;
  1067                             bits:(ByteArray 
  1068                                         fromPackedString:'@@@B_??9P@@HW??(TG (W'' (W''''*W''''(W''''*W'''')W''''(W'''')W''''+W''''*W''''*W''''(W'' )TG (W??(P@@H_??8@@@@');
  1069                             yourself);
  1070                 yourself
  1071         ]
  1072 !
  1073 
  1074 iconDistributeH
  1075     <resource: #image>
  1076     "This resource specification was automatically generated
  1077      by the ImageEditor of ST/X."
  1078     "Do not manually edit this!! If it is corrupted,
  1079      the ImageEditor may not be able to read the specification."
  1080     "
  1081      self iconDistributeH inspect
  1082      ImageEditor openOnClass:self andSelector:#iconDistributeH
  1083      Icon flushCachedIcons"
  1084     
  1085     ^ Icon constantNamed:'UIPainter class iconDistributeH'
  1086         ifAbsentPut:[
  1087             (Depth2Image new)
  1088                 width:22;
  1089                 height:22;
  1090                 photometric:(#palette);
  1091                 bitsPerSample:(#( 2 ));
  1092                 samplesPerPixel:(1);
  1093                 bits:(ByteArray 
  1094                             fromPackedString:'
  1095 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E@@E@@E@G@@G@@G@G@@G@@G@GHBGHBG@GHBGHBG@GJ*GJ*G@GHBGHBG@GHBGHBG@GB*GJ G@GB*GJ G@
  1096 G@@G@@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
  1097                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1098                 mask:((ImageMask new)
  1099                             width:22;
  1100                             height:22;
  1101                             bits:(ByteArray 
  1102                                         fromPackedString:'@@@@@@@@@@@@@@@@<G <<G <<G ?<G =>O1?>O1????<>O1<>O1><G <<G ><G <<G ?@@@A@@@@@@@@@@@@@@@A');
  1103                             yourself);
  1104                 yourself
  1105         ]
  1106 !
  1107 
  1108 iconDistributeV
  1109     <resource: #image>
  1110     "This resource specification was automatically generated
  1111      by the ImageEditor of ST/X."
  1112     "Do not manually edit this!! If it is corrupted,
  1113      the ImageEditor may not be able to read the specification."
  1114     "
  1115      self iconDistributeV inspect
  1116      ImageEditor openOnClass:self andSelector:#iconDistributeV
  1117      Icon flushCachedIcons"
  1118     
  1119     ^ Icon constantNamed:'UIPainter class iconDistributeV'
  1120         ifAbsentPut:[
  1121             (Depth2Image new)
  1122                 width:22;
  1123                 height:22;
  1124                 photometric:(#palette);
  1125                 bitsPerSample:(#( 2 ));
  1126                 samplesPerPixel:(1);
  1127                 bits:(ByteArray 
  1128                             fromPackedString:'
  1129 @@@@@@@@@@UUUT@@@@???4@@@@@@@@@@@@@*(@@@@@JB@@@@@@JB@@@@@@JB@@@@@@J*(@@@@@@@@@@@@@UUUT@@@@???4@@@@@@@@@@@@J*(@@@@@JB@@@@
  1130 @@JB@@@@@@@B@@@@@@@*(@@@@@@@@@@@@@UUUT@@@@???4@@@@@@@@@@');
  1131                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1132                 mask:((ImageMask new)
  1133                             width:22;
  1134                             height:22;
  1135                             bits:(ByteArray 
  1136                                         fromPackedString:'A??@A??@A??CA??@@G0@@A@@@A@@@A@@@G0CA??@A??@A??@A??@@G0C@A@@@A@@@A@@@G0AA??AA??@A??@A??B');
  1137                             yourself);
  1138                 yourself
  1139         ]
  1140 !
  1141 
  1142 iconResizeB
  1143     <resource: #image>
  1144     "This resource specification was automatically generated
  1145      by the ImageEditor of ST/X."
  1146     "Do not manually edit this!! If it is corrupted,
  1147      the ImageEditor may not be able to read the specification."
  1148     "
  1149      self iconResizeB inspect
  1150      ImageEditor openOnClass:self andSelector:#iconResizeB
  1151      Icon flushCachedIcons"
  1152     
  1153     ^ Icon constantNamed:'UIPainter class iconResizeB'
  1154         ifAbsentPut:[
  1155             (Depth2Image new)
  1156                 width:22;
  1157                 height:22;
  1158                 photometric:(#palette);
  1159                 bitsPerSample:(#( 2 ));
  1160                 samplesPerPixel:(1);
  1161                 bits:(ByteArray 
  1162                             fromPackedString:'
  1163 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@M@@@@@@@M@@@@@@@M@M@@@@@M@M@@@@@M@M@@@@@M@M@@@M@M@M@@@M@M@M@@@M@M@M@@@M@M@M@@@@@@@M@@
  1164 @@@@@E@@@@@@@@@@B*****(@B*****(@@@@@@@@@@@@@@@@@@@@@@@@@');
  1165                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1166                 mask:((ImageMask new)
  1167                             width:22;
  1168                             height:22;
  1169                             bits:(ByteArray 
  1170                                         fromPackedString:'@@@@@@@@@@@@@G A@G @@G'' @G'' @G''#@G'' G''''"G'''' G''''!!G'''' G'''' O?7 G'''' CCG O??0O??0@@@A@@@@@@@@');
  1171                             yourself);
  1172                 yourself
  1173         ]
  1174 !
  1175 
  1176 iconResizeL
  1177     <resource: #image>
  1178     "This resource specification was automatically generated
  1179      by the ImageEditor of ST/X."
  1180     "Do not manually edit this!! If it is corrupted,
  1181      the ImageEditor may not be able to read the specification."
  1182     "
  1183      self iconResizeL inspect
  1184      ImageEditor openOnClass:self andSelector:#iconResizeL
  1185      Icon flushCachedIcons"
  1186     
  1187     ^ Icon constantNamed:'UIPainter class iconResizeL'
  1188         ifAbsentPut:[
  1189             (Depth2Image new)
  1190                 width:22;
  1191                 height:22;
  1192                 photometric:(#palette);
  1193                 bitsPerSample:(#( 2 ));
  1194                 samplesPerPixel:(1);
  1195                 bits:(ByteArray 
  1196                             fromPackedString:'
  1197 @@@@@@@@@@@@@@@@@(@@@@@@@(@@@@@@@(UUUP@I@(_??0@@@(@@@@@@@(@@@@@@@(@@@@@@@(@@@@@@@(AUUU@@@(C???@@@(@@@@@E@(@@@@@@@(@@@@@@
  1198 @(@@@@@@@(AU@@@@@(C?@@@@@(@@@@@@@(@@@@@@@@@@@@@E@@@@@@@@');
  1199                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1200                 mask:((ImageMask new)
  1201                             width:22;
  1202                             height:22;
  1203                             bits:(ByteArray 
  1204                                         fromPackedString:'@@@@@@@@F@@@G?>@G?>@G?>@G?>@F@@@FP@@F?? G?? G?? F?? FP@@FP@@F? @G? @G? @F? @FP@@@@@@@@@@');
  1205                             yourself);
  1206                 yourself
  1207         ]
  1208 !
  1209 
  1210 iconResizeLR
  1211     <resource: #image>
  1212     "This resource specification was automatically generated
  1213      by the ImageEditor of ST/X."
  1214     "Do not manually edit this!! If it is corrupted,
  1215      the ImageEditor may not be able to read the specification."
  1216     "
  1217      self iconResizeLR inspect
  1218      ImageEditor openOnClass:self andSelector:#iconResizeLR
  1219      Icon flushCachedIcons"
  1220     
  1221     ^ Icon constantNamed:'UIPainter class iconResizeLR'
  1222         ifAbsentPut:[
  1223             (Depth2Image new)
  1224                 width:22;
  1225                 height:22;
  1226                 photometric:(#palette);
  1227                 bitsPerSample:(#( 2 ));
  1228                 samplesPerPixel:(1);
  1229                 bits:(ByteArray 
  1230                             fromPackedString:'
  1231 @@@@@@@@@@@@@@@@@(@@@B @@(@@@B @@(UUUR I@(???2 @@(@@@B @@(@@@B @@(@@@B @@(@@@B @@(AUTB @@(C?<B @@(@@@B E@(@@@B @@(@@@B @
  1232 @(@@@B @@(AUTB @@(C?<B @@(@@@B @@(@@@B @@@@@@@@E@@@@@@@@');
  1233                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1234                 mask:((ImageMask new)
  1235                             width:22;
  1236                             height:22;
  1237                             bits:(ByteArray 
  1238                                         fromPackedString:'@@@@@@@@F@A G?? G?? G?? G?? F@A FPI F?= G?? G?? F?= FPI FPI F?= G?? G?? F?= FPI @@@@@@@@');
  1239                             yourself);
  1240                 yourself
  1241         ]
  1242 !
  1243 
  1244 iconResizeR
  1245     <resource: #image>
  1246     "This resource specification was automatically generated
  1247      by the ImageEditor of ST/X."
  1248     "Do not manually edit this!! If it is corrupted,
  1249      the ImageEditor may not be able to read the specification."
  1250     "
  1251      self iconResizeR inspect
  1252      ImageEditor openOnClass:self andSelector:#iconResizeR
  1253      Icon flushCachedIcons"
  1254     
  1255     ^ Icon constantNamed:'UIPainter class iconResizeR'
  1256         ifAbsentPut:[
  1257             (Depth2Image new)
  1258                 width:22;
  1259                 height:22;
  1260                 photometric:(#palette);
  1261                 bitsPerSample:(#( 2 ));
  1262                 samplesPerPixel:(1);
  1263                 bits:(ByteArray 
  1264                             fromPackedString:'
  1265 @@@@@@@@@@@@@@@@@@@@@B @@@@@@B @@@UUUR I@@???R @@@@@@B @@@@@@B @@@@@@B @@@@@@B @@EUUTB @@O??<B @@@@@@B E@@@@@B @@@@@@B @
  1266 @@@@@B @@@@ETB @@@@O<B @@@@@@B @@@@@@B @@@@@@@@E@@@@@@@@');
  1267                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1268                 mask:((ImageMask new)
  1269                             width:22;
  1270                             height:22;
  1271                             bits:(ByteArray 
  1272                                         fromPackedString:'@@@@@@@@@@A A?? A?? A?? A?? @@A @@I G?= G?? G?? G?= @@I @@I @G= @G? @G? @G= @@I @@@@@@@@');
  1273                             yourself);
  1274                 yourself
  1275         ]
  1276 !
  1277 
  1278 iconResizeT
  1279     <resource: #image>
  1280     "This resource specification was automatically generated
  1281      by the ImageEditor of ST/X."
  1282     "Do not manually edit this!! If it is corrupted,
  1283      the ImageEditor may not be able to read the specification."
  1284     "
  1285      self iconResizeT inspect
  1286      ImageEditor openOnClass:self andSelector:#iconResizeT
  1287      Icon flushCachedIcons"
  1288     
  1289     ^ Icon constantNamed:'UIPainter class iconResizeT'
  1290         ifAbsentPut:[
  1291             (Depth2Image new)
  1292                 width:22;
  1293                 height:22;
  1294                 photometric:(#palette);
  1295                 bitsPerSample:(#( 2 ));
  1296                 samplesPerPixel:(1);
  1297                 bits:(ByteArray 
  1298                             fromPackedString:'
  1299 @@@@@@@@@@@@@@@@@@@@@@@@B*****(@B*****(@@@@@@@@@@@@@@E@@@@@@@M@@@M@M@M@@@M@M@M@@@M@M@M@@@M@M@M@@@@@M@M@@@@@M@M@@@@@M@M@@
  1300 @@@M@M@@@@@M@@@@@@@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
  1301                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1302                 mask:((ImageMask new)
  1303                             width:22;
  1304                             height:22;
  1305                             bits:(ByteArray 
  1306                                         fromPackedString:'@@@@@@@@@@@AO??0O??0CCG G'''' O?7 G'''' G'''' G''''!!G'''' G''''"@G'' @G''#@G'' @G'' @G @@G A@@@@@@@@@@@@');
  1307                             yourself);
  1308                 yourself
  1309         ]
  1310 !
  1311 
  1312 iconResizeTB
  1313     <resource: #image>
  1314     "This resource specification was automatically generated
  1315      by the ImageEditor of ST/X."
  1316     "Do not manually edit this!! If it is corrupted,
  1317      the ImageEditor may not be able to read the specification."
  1318     "
  1319      self iconResizeTB inspect
  1320      ImageEditor openOnClass:self andSelector:#iconResizeTB
  1321      Icon flushCachedIcons"
  1322     
  1323     ^ Icon constantNamed:'UIPainter class iconResizeTB'
  1324         ifAbsentPut:[
  1325             (Depth2Image new)
  1326                 width:22;
  1327                 height:22;
  1328                 photometric:(#palette);
  1329                 bitsPerSample:(#( 2 ));
  1330                 samplesPerPixel:(1);
  1331                 bits:(ByteArray 
  1332                             fromPackedString:'
  1333 @@@@@@@@@@@@@@@@@@@@@@@@B*****(@B*****(@@@@@@@@@@G@@@@@@@G@@@@@@@G@G@G@@@G@G@G@@@G@G@G@@@G@G@G@@@G@G@G@@@G@G@G@@@G@@@@@@
  1334 @G@@@@@@@@@@@@@@B*****(@B*****(@@@@@@@@@@@@@@@@@@@@@@@@@');
  1335                 colorMapFromArray:#[ 0 0 0 255 255 255 0 0 127 170 170 170 ];
  1336                 mask:((ImageMask new)
  1337                             width:22;
  1338                             height:22;
  1339                             bits:(ByteArray 
  1340                                         fromPackedString:'@@@B@@@@@@@BO??0O??2G#C@G'''' G/?0G''''#G'''' G'''' G'''' G'''' G''''"G/?0G'''' G#C@O??1O??0@@@A@@@B@@@@');
  1341                             yourself);
  1342                 yourself
  1343         ]
  1344 ! !
  1345 
  1346 !UIPainter class methodsFor:'interface specs'!
  1347 
  1348 dialogSpecForDefiningClassAndSelector
  1349     "This resource specification was automatically generated
  1350      by the UIPainter of ST/X."
  1351 
  1352     "Do not manually edit this!! If it is corrupted,
  1353      the UIPainter may not be able to read the specification."
  1354 
  1355     "
  1356      UIPainter new openOnClass:UIPainter andSelector:#dialogSpecForDefiningClassAndSelector
  1357      UIPainter new openInterface:#dialogSpecForDefiningClassAndSelector
  1358     "
  1359 
  1360     <resource: #canvas>
  1361 
  1362     ^
  1363      
  1364        #(#FullSpec
  1365           #window: 
  1366            #(#WindowSpec
  1367               #name: 'GUI Painter'
  1368               #layout: #(#LayoutFrame 291 0 130 0 637 0 289 0)
  1369               #label: 'GUI Painter'
  1370               #min: #(#Point 350 160)
  1371               #bounds: #(#Rectangle 291 130 638 290)
  1372               #usePreferredExtent: false
  1373           )
  1374           #component: 
  1375            #(#SpecCollection
  1376               #collection: 
  1377                #(
  1378                  #(#FramedBoxSpec
  1379                     #name: 'FramedBox'
  1380                     #layout: #(#LayoutFrame 0 0.0 3 0.0 0 1.0 -35 1.0)
  1381                     #component: 
  1382                      #(#SpecCollection
  1383                         #collection: 
  1384                          #(
  1385                            #(#LabelSpec
  1386                               #name: 'selectorLabel'
  1387                               #layout: #(#AlignmentOrigin 67 0.11 29 0 1 0.5)
  1388                               #label: 'Selector:'
  1389                               #translateLabel: true
  1390                               #adjust: #right
  1391                               #resizeForLabel: true
  1392                           )
  1393                            #(#InputFieldSpec
  1394                               #name: 'methodNameField'
  1395                               #layout: #(#LayoutFrame 70 0.11 18 0 4 1.0 40 0)
  1396                               #tabable: true
  1397                               #model: #methodNameChannel
  1398                               #group: #inputGroup
  1399                           )
  1400                            #(#LabelSpec
  1401                               #name: 'classLabel'
  1402                               #layout: #(#AlignmentOrigin 67 0.11 54 0 1 0.5)
  1403                               #label: 'Class:'
  1404                               #translateLabel: true
  1405                               #adjust: #right
  1406                               #resizeForLabel: true
  1407                           )
  1408                            #(#InputFieldSpec
  1409                               #name: 'classNameField'
  1410                               #layout: #(#LayoutFrame 70 0.11 43 0 4 1.0 65 0)
  1411                               #tabable: true
  1412                               #model: #classNameChannel
  1413                               #group: #inputGroup
  1414                           )
  1415                            #(#LabelSpec
  1416                               #name: 'superClassLabel'
  1417                               #layout: #(#AlignmentOrigin 67 0.11 79 0 1 0.5)
  1418                               #label: 'Superclass:'
  1419                               #translateLabel: true
  1420                               #adjust: #right
  1421                               #resizeForLabel: true
  1422                           )
  1423                            #(#ComboBoxSpec
  1424                               #name: 'superclassNameComboBox'
  1425                               #layout: #(#LayoutFrame 70 0.11 68 0 4 1.0 90 0)
  1426                               #tabable: true
  1427                               #model: #superclassNameChannel
  1428                               #comboList: #superclassNameDefaults
  1429                           )
  1430                         )
  1431                     )
  1432                     #label: 'Define Class And Selector'
  1433                     #labelPosition: #topLeft
  1434                     #translateLabel: true
  1435                 )
  1436                  #(#UISubSpecification
  1437                     #name: 'subSpec'
  1438                     #layout: #(#LayoutFrame 0 0.0 -29 1 0 1.0 -5 1)
  1439                     #majorKey: #ToolApplicationModel
  1440                     #minorKey: #windowSpecForCommitWithoutChannels
  1441                 )
  1442               )
  1443           )
  1444       )
  1445 
  1446     "Modified: / 13.8.1998 / 19:59:44 / cg"
  1447 !
  1448 
  1449 dialogSpecForDefiningGridParameters
  1450     "This resource specification was automatically generated
  1451      by the UIPainter of ST/X."
  1452 
  1453     "Do not manually edit this!! If it is corrupted,
  1454      the UIPainter may not be able to read the specification."
  1455 
  1456     "
  1457      UIPainter new openOnClass:UIPainter andSelector:#dialogSpecForDefiningGridParameters
  1458      UIPainter new openInterface:#dialogSpecForDefiningGridParameters
  1459     "
  1460 
  1461     <resource: #canvas>
  1462 
  1463     ^ 
  1464      #(FullSpec
  1465         name: dialogSpecForDefiningGridParameters
  1466         window: 
  1467        (WindowSpec
  1468           label: 'GUI Painter'
  1469           name: 'GUI Painter'
  1470           min: (Point 300 200)
  1471           max: (Point 300 200)
  1472           bounds: (Rectangle 16 46 298 244)
  1473         )
  1474         component: 
  1475        (SpecCollection
  1476           collection: (
  1477            (FramedBoxSpec
  1478               label: 'Grid Parameter'
  1479               name: 'FramedBox'
  1480               layout: (LayoutFrame 0 0.0 3 0.0 0 1.0 -35 1.0)
  1481               labelPosition: topLeft
  1482               translateLabel: true
  1483               component: 
  1484              (SpecCollection
  1485                 collection: (
  1486                  (CheckBoxSpec
  1487                     label: 'Show Grid'
  1488                     name: 'ShowGridCheckBox'
  1489                     layout: (Point 13 14)
  1490                     model: showGrid
  1491                     translateLabel: true
  1492             activeHelpKey: showGrid
  1493                   )
  1494                  (CheckBoxSpec
  1495                     label: 'Align To Grid'
  1496                     name: 'AlignCheckBox'
  1497                     layout: (Point 13 42)
  1498                     model: alignToGrid
  1499                     translateLabel: true
  1500             activeHelpKey: alignToGrid
  1501                   )
  1502                  (LabelSpec
  1503                     label: 'Horizontal Pixels:'
  1504                     name: 'HorizontalPixelsLabel'
  1505                     layout: (AlignmentOrigin 138 0 89 0 1 0.5)
  1506                     translateLabel: true
  1507                     resizeForLabel: true
  1508                     adjust: right
  1509                   )
  1510                  (InputFieldSpec
  1511                     name: 'HorizontalPixelsField'
  1512                     layout: (LayoutFrame 144 0 77 0 197 0 99 0)
  1513                     model: hspace
  1514                     group: inputGroup
  1515                     type: numberOrNil
  1516                     acceptOnPointerLeave: false
  1517                   )
  1518                  (LabelSpec
  1519                     label: 'Vertical Pixels:'
  1520                     name: 'VerticalPixelsLabel'
  1521                     layout: (AlignmentOrigin 139 0 114 0 1 0.5)
  1522                     translateLabel: true
  1523                     resizeForLabel: true
  1524                     adjust: right
  1525                   )
  1526                  (InputFieldSpec
  1527                     name: 'VerticalPixelsField'
  1528                     layout: (LayoutFrame 144 0 102 0 197 0 124 0)
  1529                     model: vspace
  1530                     group: inputGroup
  1531                     type: numberOrNil
  1532                     acceptOnPointerLeave: false
  1533                   )
  1534                  )
  1535                
  1536               )
  1537             )
  1538            (UISubSpecification
  1539               name: 'subSpec'
  1540               layout: (LayoutFrame 0 0.0 -29 1 0 1.0 -5 1)
  1541               majorKey: ToolApplicationModel
  1542               minorKey: windowSpecForCommitWithoutChannels
  1543             )
  1544            )
  1545          
  1546         )
  1547       )
  1548 !
  1549 
  1550 dialogSpecForDefiningPortAndPageName
  1551     "This resource specification was automatically generated
  1552      by the UIPainter of ST/X."
  1553 
  1554     "Do not manually edit this!! If it is corrupted,
  1555      the UIPainter may not be able to read the specification."
  1556 
  1557     "
  1558      UIPainter new openOnClass:UIPainter andSelector:#dialogSpecForDefiningPortAndPageName
  1559      UIPainter new openInterface:#dialogSpecForDefiningPortAndPageName
  1560     "
  1561 
  1562     <resource: #canvas>
  1563 
  1564     ^ 
  1565      #(FullSpec
  1566         name: dialogSpecForDefiningPortAndPageName
  1567         window: 
  1568        (WindowSpec
  1569           label: 'GUI Painter'
  1570           name: 'GUI Painter'
  1571           min: (Point 350 140)
  1572           max: (Point 500 140)
  1573           bounds: (Rectangle 0 0 346 138)
  1574         )
  1575         component: 
  1576        (SpecCollection
  1577           collection: (
  1578            (FramedBoxSpec
  1579               label: 'Define Service and Pagename'
  1580               name: 'FramedBox'
  1581               layout: (LayoutFrame 0 0.0 3 0.0 0 1.0 -34 1.0)
  1582               labelPosition: topLeft
  1583               translateLabel: true
  1584               component: 
  1585              (SpecCollection
  1586                 collection: (
  1587                  (LabelSpec
  1588                     label: 'Service (or Port):'
  1589                     name: 'portLabel'
  1590                     layout: (AlignmentOrigin 67 0.11 29 0 1 0.5)
  1591                     translateLabel: true
  1592                     resizeForLabel: true
  1593                     adjust: right
  1594                   )
  1595                  (ComboBoxSpec
  1596                     name: 'ComboBox1'
  1597                     layout: (LayoutFrame 70 0.11 18 0 4 1.0 40 0)
  1598                     model: serviceOrPortNameChannel
  1599                     acceptOnPointerLeave: false
  1600                     comboList: runningServerPorts
  1601                   )
  1602                  (LabelSpec
  1603                     label: 'Pagename:'
  1604                     name: 'pageNameLabel'
  1605                     layout: (AlignmentOrigin 67 0.11 54 0 1 0.5)
  1606                     translateLabel: true
  1607                     resizeForLabel: true
  1608                     adjust: right
  1609                   )
  1610                  (InputFieldSpec
  1611                     name: 'pageNameNameField'
  1612                     layout: (LayoutFrame 70 0.11 43 0 4 1.0 65 0)
  1613                     tabable: true
  1614                     model: pageNameNameChannel
  1615                     group: inputGroup
  1616                     acceptOnPointerLeave: false
  1617                   )
  1618                  )
  1619                
  1620               )
  1621             )
  1622            (UISubSpecification
  1623               name: 'subSpec'
  1624               layout: (LayoutFrame 0 0.0 -29 1 0 1.0 -5 1)
  1625               majorKey: ToolApplicationModel
  1626               minorKey: windowSpecForCommitWithoutChannels
  1627             )
  1628            )
  1629          
  1630         )
  1631       )
  1632 !
  1633 
  1634 windowSpec
  1635     "This resource specification was automatically generated
  1636      by the UIPainter of ST/X."
  1637 
  1638     "Do not manually edit this!! If it is corrupted,
  1639      the UIPainter may not be able to read the specification."
  1640 
  1641     "
  1642      UIPainter new openOnClass:UIPainter andSelector:#windowSpec
  1643      UIPainter new openInterface:#windowSpec
  1644      UIPainter open
  1645     "
  1646 
  1647     <resource: #canvas>
  1648 
  1649     ^ 
  1650      #(FullSpec
  1651         name: windowSpec
  1652         window: 
  1653        (WindowSpec
  1654           label: 'GUI Painter'
  1655           name: 'GUI Painter'
  1656           min: (Point 560 460)
  1657           bounds: (Rectangle 0 0 834 575)
  1658           menu: menu
  1659           icon: defaultIcon
  1660         )
  1661         component: 
  1662        (SpecCollection
  1663           collection: (
  1664            (ViewSpec
  1665               name: 'mainPanel'
  1666               layout: (LayoutFrame 0 0 0 0 0 1 -24 1)
  1667               component: 
  1668              (SpecCollection
  1669                 collection: (
  1670                  (ViewSpec
  1671                     name: 'ToolBar'
  1672                     layout: (LayoutFrame 0 0 0 0 0 1 32 0)
  1673                     visibilityChannel: toolBarVisibleHolder
  1674                     component: 
  1675                    (SpecCollection
  1676                       collection: (
  1677                        (ActionButtonSpec
  1678                           label: 'hideToolBarIcon'
  1679                           name: 'HideToolBarButton'
  1680                           layout: (LayoutFrame 0 0 0 0 13 0 0 1)
  1681                           activeHelpKey: hideToolBar
  1682                           hasCharacterOrientedLabel: false
  1683                           translateLabel: true
  1684                           model: hideToolbar
  1685                           postBuildCallback: hideToolBarButtonCreated:
  1686                         )
  1687                        (MenuPanelSpec
  1688                           name: 'menuToolbarView'
  1689                           layout: (LayoutFrame 13 0.0 0 0.0 0 1.0 0 1.0)
  1690                           visibilityChannel: toolBarVisibleHolder
  1691                           menu: menuToolbar
  1692                           textDefault: true
  1693                         )
  1694                        )
  1695                      
  1696                     )
  1697                   )
  1698                  (ViewSpec
  1699                     name: 'EditToolBar'
  1700                     layout: (LayoutFrame 0 0 30 0 0 1 62 0)
  1701                     visibilityChannel: editToolBarVisibleHolder
  1702                     component: 
  1703                    (SpecCollection
  1704                       collection: (
  1705                        (ActionButtonSpec
  1706                           label: 'hideToolBarIcon'
  1707                           name: 'HideEditToolBarButton'
  1708                           layout: (LayoutFrame 0 0 0 0 13 0 0 1)
  1709                           activeHelpKey: hideToolBar
  1710                           hasCharacterOrientedLabel: false
  1711                           translateLabel: true
  1712                           model: hideEditToolbar
  1713                           postBuildCallback: hideToolBarButtonCreated:
  1714                         )
  1715                        (MenuPanelSpec
  1716                           name: 'EditToolBar1'
  1717                           layout: (LayoutFrame 13 0.0 0 0.0 0 1.0 0 1.0)
  1718                           visibilityChannel: editToolBarVisibleHolder
  1719                           menu: editToolbar
  1720                           textDefault: true
  1721                         )
  1722                        )
  1723                      
  1724                     )
  1725                   )
  1726                  (VariableHorizontalPanelSpec
  1727                     name: 'Painter'
  1728                     layout: (LayoutFrame 0 0.0 60 0.0 0 1.0 0 1.0)
  1729                     level: 1
  1730                     component: 
  1731                    (SpecCollection
  1732                       collection: (
  1733                        (ArbitraryComponentSpec
  1734                           name: 'treeView'
  1735                           tabable: true
  1736                           menu: menuEdit
  1737                           hasHorizontalScrollBar: true
  1738                           hasVerticalScrollBar: true
  1739                           miniScrollerHorizontal: true
  1740                           miniScrollerVertical: true
  1741                           hasBorder: false
  1742                           component: treeView
  1743                         )
  1744                        (ViewSpec
  1745                           name: 'specHolderView'
  1746                           level: 0
  1747                           component: 
  1748                          (SpecCollection
  1749                             collection: (
  1750                              (MenuPanelSpec
  1751                                 name: 'menuToolbar2View'
  1752                                 layout: (LayoutFrame 2 0.0 2 0 -2 1.0 32 0)
  1753                                 level: 0
  1754                                 tabable: true
  1755                                 menu: menuToolbar2
  1756                               )
  1757                              (NoteBookViewSpec
  1758                                 name: 'noteBook'
  1759                                 layout: (LayoutFrame 2 0.0 32 0.0 -2 1.0 -28 1.0)
  1760                                 level: 0
  1761                                 enableChannel: enableChannel
  1762                                 tabable: true
  1763                                 model: tabModel
  1764                                 menu: tabList
  1765                                 translateLabel: true
  1766                                 canvas: noteBookView
  1767                               )
  1768                              (HorizontalPanelViewSpec
  1769                                 name: 'HorizontalPanel1'
  1770                                 layout: (LayoutFrame 2 0 -26 1 -2 1 -2 1)
  1771                                 horizontalLayout: fit
  1772                                 verticalLayout: fit
  1773                                 horizontalSpace: 3
  1774                                 verticalSpace: 3
  1775                                 reverseOrderIfOKAtLeft: true
  1776                                 component: 
  1777                                (SpecCollection
  1778                                   collection: (
  1779                                    (ActionButtonSpec
  1780                                       label: 'Cancel'
  1781                                       name: 'cancelButton'
  1782                                       activeHelpKey: commitCancel
  1783                                       translateLabel: true
  1784                                       tabable: true
  1785                                       model: cancel
  1786                                       enableChannel: modifiedChannel
  1787                                       extent: (Point 274 24)
  1788                                     )
  1789                                    (ActionButtonSpec
  1790                                       label: 'OK'
  1791                                       name: 'acceptButton'
  1792                                       activeHelpKey: commitOK
  1793                                       translateLabel: true
  1794                                       tabable: true
  1795                                       model: accept
  1796                                       enableChannel: modifiedChannel
  1797                                       extent: (Point 274 24)
  1798                                     )
  1799                                    )
  1800                                  
  1801                                 )
  1802                               )
  1803                              )
  1804                            
  1805                           )
  1806                         )
  1807                        )
  1808                      
  1809                     )
  1810                     handles: (Any 0.3 1.0)
  1811                   )
  1812                  )
  1813                
  1814               )
  1815             )
  1816            (UISubSpecification
  1817               name: 'infoBarSubSpec'
  1818               layout: (LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0)
  1819               level: 1
  1820               majorKey: ToolApplicationModel
  1821               minorKey: windowSpecForInfoBar
  1822             )
  1823            )
  1824          
  1825         )
  1826       )
  1827 ! !
  1828 
  1829 !UIPainter class methodsFor:'menu specs'!
  1830 
  1831 cutCopyPasteMenuSlice
  1832     "This resource specification was automatically generated
  1833      by the MenuEditor of ST/X."
  1834 
  1835     "Do not manually edit this!! If it is corrupted,
  1836      the MenuEditor may not be able to read the specification."
  1837 
  1838     "
  1839      MenuEditor new openOnClass:UIPainter andSelector:#menuToolbar
  1840      (Menu new fromLiteralArrayEncoding:(UIPainter menuToolbar)) startUp
  1841     "
  1842 
  1843     <resource: #menu>
  1844 
  1845     ^ 
  1846      #(Menu
  1847         (
  1848          (MenuItem
  1849             activeHelpKey: editCut
  1850             enabled: canCutHolder
  1851             label: 'Cut'
  1852             itemValue: deleteSelection
  1853             translateLabel: true
  1854             isButton: true
  1855             labelImage: (ResourceRetriever ToolbarIconLibrary cutWidgetIcon)
  1856           )
  1857          (MenuItem
  1858             activeHelpKey: editCopy
  1859             enabled: canCopyHolder
  1860             label: 'Copy'
  1861             itemValue: copySelection
  1862             translateLabel: true
  1863             isButton: true
  1864             labelImage: (ResourceRetriever ToolbarIconLibrary copyWidgetIcon)
  1865           )
  1866          (MenuItem
  1867             activeHelpKey: editPaste
  1868             enabled: canPasteKeepingLayoutHolder
  1869             label: 'Paste with Layout'
  1870             itemValue: pasteWithLayout
  1871             translateLabel: true
  1872             isButton: true
  1873             labelImage: (ResourceRetriever ToolbarIconLibrary pasteWidgetIcon)
  1874           )
  1875          (MenuItem
  1876             activeHelpKey: editDelete
  1877             enabled: canCutHolder
  1878             label: 'Delete'
  1879             itemValue: deleteTotalSelection
  1880             translateLabel: true
  1881             isButton: true
  1882             isVisible: false
  1883             labelImage: (ResourceRetriever ToolbarIconLibrary deleteWidgetIcon)
  1884           )
  1885          (MenuItem
  1886             label: '-'
  1887           )
  1888          (MenuItem
  1889             activeHelpKey: editUndo
  1890             enabled: hasUndoHistoryHolder
  1891             label: 'Undo'
  1892             itemValue: undoLast
  1893             translateLabel: true
  1894             isButton: true
  1895             labelImage: (ResourceRetriever ToolbarIconLibrary undoIcon)
  1896           )
  1897          )
  1898         nil
  1899         nil
  1900       )
  1901 !
  1902 
  1903 editToolbar
  1904     "This resource specification was automatically generated
  1905      by the MenuEditor of ST/X."
  1906 
  1907     "Do not manually edit this!! If it is corrupted,
  1908      the MenuEditor may not be able to read the specification."
  1909 
  1910     "
  1911      MenuEditor new openOnClass:UIPainter andSelector:#editToolbar
  1912      (Menu new fromLiteralArrayEncoding:(UIPainter editToolbar)) startUp
  1913     "
  1914 
  1915     <resource: #menu>
  1916 
  1917     ^ 
  1918      #(Menu
  1919         (
  1920          (MenuItem
  1921             label: 'moveItems'
  1922             translateLabel: true
  1923             submenuChannel: moveInListMenuSlice
  1924             isMenuSlice: true
  1925           )
  1926          (MenuItem
  1927             label: '-'
  1928           )
  1929          (MenuItem
  1930             label: 'gridItems'
  1931             translateLabel: true
  1932             submenuChannel: gridMenuSlice
  1933             isMenuSlice: true
  1934           )
  1935          )
  1936         nil
  1937         nil
  1938       )
  1939 !
  1940 
  1941 gridMenuSlice
  1942     "This resource specification was automatically generated
  1943      by the MenuEditor of ST/X."
  1944 
  1945     "Do not manually edit this!! If it is corrupted,
  1946      the MenuEditor may not be able to read the specification."
  1947 
  1948     "
  1949      MenuEditor new openOnClass:Workflow::WorksheetEditor andSelector:#gridMenuSlice
  1950      (Menu new fromLiteralArrayEncoding:(Workflow::WorksheetEditor gridMenuSlice)) startUp
  1951     "
  1952 
  1953     <resource: #menu>
  1954 
  1955     ^ 
  1956      #(Menu
  1957         (
  1958          (MenuItem
  1959             label: 'ShowGrid'
  1960             translateLabel: true
  1961             isButton: true
  1962             indication: gridShownHolder
  1963             labelImage: (ResourceRetriever ToolbarIconLibrary gridIcon)
  1964             activeHelpKey: showGrid
  1965           )
  1966          (MenuItem
  1967             label: 'AlignToGrid'
  1968             translateLabel: true
  1969             isButton: true
  1970             indication: alignToGridHolder
  1971             labelImage: (ResourceRetriever ToolbarIconLibrary gridAlignIcon)
  1972             activeHelpKey: alignToGrid
  1973           )
  1974          )
  1975         nil
  1976         nil
  1977       )
  1978 
  1979     "Modified (comment): / 15-03-2017 / 11:30:06 / cg"
  1980 !
  1981 
  1982 menu
  1983     "This resource specification was automatically generated
  1984      by the MenuEditor of ST/X."
  1985 
  1986     "Do not manually edit this!! If it is corrupted,
  1987      the MenuEditor may not be able to read the specification."
  1988 
  1989 
  1990     "
  1991      MenuEditor new openOnClass:UIPainter andSelector:#menu
  1992      (Menu new fromLiteralArrayEncoding:(UIPainter menu)) startUp
  1993     "
  1994 
  1995     <resource: #menu>
  1996 
  1997     ^ 
  1998      #(Menu
  1999         (
  2000          (MenuItem
  2001             label: '&File'
  2002             translateLabel: true
  2003             submenuChannel: menuFile
  2004             keepLinkedMenu: true
  2005           )
  2006          (MenuItem
  2007             label: 'Edit'
  2008             translateLabel: true
  2009             submenuChannel: menuEdit
  2010           )
  2011          (MenuItem
  2012             label: 'View'
  2013             translateLabel: true
  2014             submenu: 
  2015            (Menu
  2016               (
  2017                (MenuItem
  2018                   activeHelpKey: settingsCanvas
  2019                   label: 'Canvas'
  2020                   translateLabel: true
  2021                   indication: painterShown
  2022                 )
  2023                (MenuItem
  2024                   activeHelpKey: settingsGallery
  2025                   label: 'Gallery'
  2026                   translateLabel: true
  2027                   indication: galleryShown
  2028                 )
  2029                (MenuItem
  2030                   label: '-'
  2031                 )
  2032                (MenuItem
  2033                   label: 'Toolbar'
  2034                   translateLabel: true
  2035                   hideMenuOnActivated: false
  2036                   indication: toolBarVisibleHolder
  2037                 )
  2038                (MenuItem
  2039                   label: 'Editor Toolbar'
  2040                   translateLabel: true
  2041                   hideMenuOnActivated: false
  2042                   indication: editToolBarVisibleHolder
  2043                 )
  2044                (MenuItem
  2045                   label: '-'
  2046                 )
  2047                (MenuItem
  2048                   label: 'Load Sketch as Background...'
  2049                   itemValue: useSketch
  2050                   translateLabel: true
  2051                 )
  2052                (MenuItem
  2053                   label: 'Load Image as Background...'
  2054                   itemValue: useBackgroundImage
  2055                   translateLabel: true
  2056                 )
  2057                )
  2058               nil
  2059               nil
  2060             )
  2061           )
  2062          (MenuItem
  2063             label: 'Align'
  2064             translateLabel: true
  2065             submenuChannel: menuAlign
  2066           )
  2067          (MenuItem
  2068             label: 'Generate'
  2069             translateLabel: true
  2070             isVisible: isNotEditingSpecOnly
  2071             submenu: 
  2072            (Menu
  2073               (
  2074                (MenuItem
  2075                   activeHelpKey: generateAspectMethods
  2076                   enabled: hasSpecClass
  2077                   label: 'Aspect Methods'
  2078                   itemValue: doGenerateAspectMethods
  2079                   translateLabel: true
  2080                 )
  2081                (MenuItem
  2082                   activeHelpKey: generateAspectMethodFor
  2083                   enabled: hasSpecClass
  2084                   label: 'Aspect Method For...'
  2085                   itemValue: doGenerateAspectMethodFor
  2086                   translateLabel: true
  2087                 )
  2088                (MenuItem
  2089                   enabled: hasSpecClass
  2090                   label: 'Menu Stub Methods'
  2091                   itemValue: doGenerateMenuMethods
  2092                   translateLabel: true
  2093                 )
  2094                (MenuItem
  2095                   label: '-'
  2096                 )
  2097                (MenuItem
  2098                   activeHelpKey: generateHookMethods
  2099                   enabled: hasSpecClass
  2100                   label: 'Hook Methods'
  2101                   itemValue: doGenerateHookMethods
  2102                   translateLabel: true
  2103                 )
  2104                )
  2105               nil
  2106               nil
  2107             )
  2108           )
  2109          (MenuItem
  2110             label: 'Test'
  2111             translateLabel: true
  2112             submenu: 
  2113            (Menu
  2114               (
  2115                (MenuItem
  2116                   activeHelpKey: testStartApplication
  2117                   label: 'Start Application'
  2118                   itemValue: doStartApplication
  2119                   translateLabel: true
  2120                   isVisible: isNotEditingSpecOnly
  2121                 )
  2122                (MenuItem
  2123                   label: '-'
  2124                   isVisible: isNotEditingSpecOnly
  2125                 )
  2126                (MenuItem
  2127                   activeHelpKey: testGeometryTestMode
  2128                   label: 'Geometry Test/Set Mode'
  2129                   translateLabel: true
  2130                   indication: testMode:
  2131                 )
  2132                )
  2133               nil
  2134               nil
  2135             )
  2136           )
  2137          (MenuItem
  2138             label: 'Settings'
  2139             translateLabel: true
  2140             submenu: 
  2141            (Menu
  2142               (
  2143                (MenuItem
  2144                   activeHelpKey: settingsAspectsAsInstances
  2145                   label: 'Aspects as InstanceVariables'
  2146                   translateLabel: true
  2147                   isVisible: isNotEditingSpecOnly
  2148                   indication: generateAspectsAsInstanceVariables:
  2149                 )
  2150                (MenuItem
  2151                   activeHelpKey: settingsRedefineAspectMethods
  2152                   label: 'Redefine Aspect Methods'
  2153                   translateLabel: true
  2154                   isVisible: isNotEditingSpecOnly
  2155                   indication: redefineAspectMethods:
  2156                 )
  2157                (MenuItem
  2158                   activeHelpKey: settingsGenerateCommentedCode
  2159                   label: 'Generate Commented Code'
  2160                   translateLabel: true
  2161                   isVisible: isNotEditingSpecOnly
  2162                   indication: generateCommentedCode:
  2163                 )
  2164                (MenuItem
  2165                   label: 'AutoAccept on Selection-Change '
  2166                   translateLabel: true
  2167                   indication: autoAcceptOnSelectionChange
  2168                 )
  2169                (MenuItem
  2170                   label: '-'
  2171                 )
  2172                (MenuItem
  2173                   activeHelpKey: settingsUndoManager
  2174                   enabled: hasUndoHistory
  2175                   label: 'Undo Manager...'
  2176                   itemValue: openUndoMenu
  2177                   translateLabel: true
  2178                 )
  2179                (MenuItem
  2180                   activeHelpKey: settingsGridManager
  2181                   label: 'Grid Manager...'
  2182                   itemValue: doDefineGrid
  2183                   translateLabel: true
  2184                 )
  2185                )
  2186               nil
  2187               nil
  2188             )
  2189           )
  2190          (MenuItem
  2191             label: 'History'
  2192             translateLabel: true
  2193             isVisible: isStandAlone
  2194             submenuChannel: menuHistory
  2195           )
  2196          (MenuItem
  2197             label: 'MENU_Help'
  2198             translateLabel: true
  2199             startGroup: conditionalRight
  2200             submenu: 
  2201            (Menu
  2202               (
  2203                (MenuItem
  2204                   activeHelpKey: helpTutorial
  2205                   label: 'Tutorial'
  2206                   itemValue: openHTMLDocument:
  2207                   translateLabel: true
  2208                   argument: 'tools/uipainter/TOP.html'
  2209                 )
  2210                (MenuItem
  2211                   label: '-'
  2212                 )
  2213                (MenuItem
  2214                   activeHelpKey: helpFunctions
  2215                   label: 'Functions'
  2216                   itemValue: openHTMLDocument:
  2217                   translateLabel: true
  2218                   argument: 'tools/uipainter/Functions.html'
  2219                 )
  2220                (MenuItem
  2221                   activeHelpKey: helpExamples
  2222                   label: 'Examples'
  2223                   itemValue: openHTMLDocument:
  2224                   translateLabel: true
  2225                   argument: 'tools/uipainter/Examples.html'
  2226                 )
  2227                (MenuItem
  2228                   label: '-'
  2229                 )
  2230                (MenuItem
  2231                   activeHelpKey: helpHelpTool
  2232                   label: 'Help Tool'
  2233                   itemValue: openHTMLDocument:
  2234                   translateLabel: true
  2235                   argument: 'tools/uipainter/HelpTool.html'
  2236                 )
  2237                (MenuItem
  2238                   activeHelpKey: helpLayoutTool
  2239                   label: 'Layout Tool'
  2240                   itemValue: openHTMLDocument:
  2241                   translateLabel: true
  2242                   argument: 'tools/uipainter/LayoutTool.html'
  2243                 )
  2244                (MenuItem
  2245                   label: '-'
  2246                 )
  2247                (MenuItem
  2248                   activeHelpKey: helpSelectedWidget
  2249                   label: 'Selected Widget'
  2250                   itemValue: doOpenWidgetDocumentation
  2251                   translateLabel: true
  2252                 )
  2253                (MenuItem
  2254                   label: '-'
  2255                 )
  2256                (MenuItem
  2257                   activeHelpKey: helpShowHelp
  2258                   label: 'Show Help Texts'
  2259                   translateLabel: true
  2260                   indication: showingHelp:
  2261                 )
  2262                (MenuItem
  2263                   label: '-'
  2264                 )
  2265                (MenuItem
  2266                   activeHelpKey: aboutThisAppliaction
  2267                   label: 'About this Application...'
  2268                   itemValue: openAboutThisApplication
  2269                   translateLabel: true
  2270                 )
  2271                )
  2272               nil
  2273               nil
  2274             )
  2275           )
  2276          )
  2277         nil
  2278         nil
  2279       )
  2280 !
  2281 
  2282 menuAlign
  2283     "This resource specification was automatically generated
  2284      by the MenuEditor of ST/X."
  2285 
  2286     "Do not manually edit this!! If it is corrupted,
  2287      the MenuEditor may not be able to read the specification."
  2288 
  2289     "
  2290      MenuEditor new openOnClass:UIPainter andSelector:#menuAlign
  2291      (Menu new fromLiteralArrayEncoding:(UIPainter menuAlign)) startUp
  2292     "
  2293 
  2294     <resource: #menu>
  2295 
  2296     ^ 
  2297      #(Menu
  2298         (
  2299          (MenuItem
  2300             activeHelpKey: alignSelectionLeft
  2301             enabled: canMoveOrAlignSelection
  2302             label: 'Left'
  2303             itemValue: alignSelectionLeft
  2304             translateLabel: true
  2305             labelImage: (ResourceRetriever UIPainter iconAlignL 'Left')
  2306           )
  2307          (MenuItem
  2308             activeHelpKey: alignSelectionRight
  2309             enabled: canMoveOrAlignSelection
  2310             label: 'Right'
  2311             itemValue: alignSelectionRight
  2312             translateLabel: true
  2313             labelImage: (ResourceRetriever UIPainter iconAlignR 'Right')
  2314           )
  2315          (MenuItem
  2316             activeHelpKey: alignSelectionTop
  2317             enabled: canMoveOrAlignSelection
  2318             label: 'Top'
  2319             itemValue: alignSelectionTop
  2320             translateLabel: true
  2321             labelImage: (ResourceRetriever UIPainter iconAlignT 'Top')
  2322           )
  2323          (MenuItem
  2324             activeHelpKey: alignSelectionBottom
  2325             enabled: canMoveOrAlignSelection
  2326             label: 'Bottom'
  2327             itemValue: alignSelectionBottom
  2328             translateLabel: true
  2329             labelImage: (ResourceRetriever UIPainter iconAlignB 'Bottom')
  2330           )
  2331          (MenuItem
  2332             label: '-'
  2333           )
  2334          (MenuItem
  2335             activeHelpKey: alignResizeSelectionLeft
  2336             enabled: canMoveOrAlignSelection
  2337             label: 'Resize Left'
  2338             itemValue: alignResizeSelectionLeft
  2339             translateLabel: true
  2340             labelImage: (ResourceRetriever UIPainter iconResizeL 'Resize Left')
  2341           )
  2342          (MenuItem
  2343             activeHelpKey: alignResizeSelectionRight
  2344             enabled: canMoveOrAlignSelection
  2345             label: 'Resize Right'
  2346             itemValue: alignResizeSelectionRight
  2347             translateLabel: true
  2348             labelImage: (ResourceRetriever UIPainter iconResizeR 'Resize Right')
  2349           )
  2350          (MenuItem
  2351             activeHelpKey: alignResizeSelectionTop
  2352             enabled: canMoveOrAlignSelection
  2353             label: 'Resize Top'
  2354             itemValue: alignResizeSelectionTop
  2355             translateLabel: true
  2356             labelImage: (ResourceRetriever UIPainter iconResizeT 'Resize Top')
  2357           )
  2358          (MenuItem
  2359             activeHelpKey: alignResizeSelectionBottom
  2360             enabled: canMoveOrAlignSelection
  2361             label: 'Resize Bottom'
  2362             itemValue: alignResizeSelectionBottom
  2363             translateLabel: true
  2364             labelImage: (ResourceRetriever UIPainter iconResizeB 'Resize Bottom')
  2365           )
  2366          (MenuItem
  2367             activeHelpKey: alignSelectionLeftAndRight
  2368             enabled: canResizeSelection
  2369             label: 'Left && Right'
  2370             itemValue: alignSelectionLeftAndRight
  2371             translateLabel: true
  2372             labelImage: (ResourceRetriever UIPainter iconResizeLR 'Left && Right')
  2373           )
  2374          (MenuItem
  2375             activeHelpKey: alignSelectionTopAndBottom
  2376             enabled: canResizeSelection
  2377             label: 'Top && Bottom'
  2378             itemValue: alignSelectionTopAndBottom
  2379             translateLabel: true
  2380             labelImage: (ResourceRetriever UIPainter iconResizeTB 'Top && Bottom')
  2381           )
  2382          (MenuItem
  2383             label: '-'
  2384           )
  2385          (MenuItem
  2386             activeHelpKey: alignSelectionCenterHor
  2387             enabled: canMoveOrAlignSelection
  2388             label: 'Center Horizontal'
  2389             itemValue: alignSelectionCenterHor
  2390             translateLabel: true
  2391             labelImage: (ResourceRetriever UIPainter iconCenterH 'Center Horizontal')
  2392           )
  2393          (MenuItem
  2394             activeHelpKey: centerSelectionHor
  2395             enabled: canMoveOrAlignSelection
  2396             label: 'Center Horizontal in Frame'
  2397             itemValue: centerSelectionHor
  2398             translateLabel: true
  2399             labelImage: (ResourceRetriever UIPainter iconCenterHInFrame 'Center Horizontal in Frame')
  2400           )
  2401          (MenuItem
  2402             activeHelpKey: alignSelectionCenterVer
  2403             enabled: canMoveOrAlignSelection
  2404             label: 'Center Vertical'
  2405             itemValue: alignSelectionCenterVer
  2406             translateLabel: true
  2407             labelImage: (ResourceRetriever UIPainter iconCenterV 'Center Vertical')
  2408           )
  2409          (MenuItem
  2410             activeHelpKey: centerSelectionVer
  2411             enabled: canMoveOrAlignSelection
  2412             label: 'Center Vertical in Frame'
  2413             itemValue: centerSelectionVer
  2414             translateLabel: true
  2415             labelImage: (ResourceRetriever UIPainter iconCenterVInFrame 'Center Vertical in Frame')
  2416           )
  2417          (MenuItem
  2418             label: '-'
  2419           )
  2420          (MenuItem
  2421             activeHelpKey: spreadSelectionHor
  2422             enabled: canMoveOrAlignSelection
  2423             label: 'Distribute Horizontal'
  2424             itemValue: spreadSelectionHor
  2425             translateLabel: true
  2426             labelImage: (ResourceRetriever UIPainter iconDistributeH 'Distribute Horizontal')
  2427           )
  2428          (MenuItem
  2429             activeHelpKey: spreadSelectionVer
  2430             enabled: canMoveOrAlignSelection
  2431             label: 'Distribute Vertical'
  2432             itemValue: spreadSelectionVer
  2433             translateLabel: true
  2434             labelImage: (ResourceRetriever UIPainter iconDistributeV 'Distribute Vertical')
  2435           )
  2436          )
  2437         nil
  2438         nil
  2439       )
  2440 !
  2441 
  2442 menuEdit
  2443     "This resource specification was automatically generated
  2444      by the MenuEditor of ST/X."
  2445 
  2446     "Do not manually edit this!! If it is corrupted,
  2447      the MenuEditor may not be able to read the specification."
  2448 
  2449 
  2450     "
  2451      MenuEditor new openOnClass:UIPainter andSelector:#menuEdit
  2452      (Menu new fromLiteralArrayEncoding:(UIPainter menuEdit)) startUp
  2453     "
  2454 
  2455     <resource: #menu>
  2456 
  2457     ^ 
  2458      #(Menu
  2459         (
  2460          (MenuItem
  2461             activeHelpKey: editUndo
  2462             enabled: hasUndoHistory
  2463             label: 'Undo'
  2464             itemValue: undoLast
  2465             nameKey: undo
  2466           )
  2467          (MenuItem
  2468             label: '-'
  2469           )
  2470          (MenuItem
  2471             activeHelpKey: editCut
  2472             enabled: canCutHolder
  2473             label: 'Cut'
  2474             itemValue: deleteSelection
  2475           )
  2476          (MenuItem
  2477             activeHelpKey: editCopy
  2478             enabled: canCopyHolder
  2479             label: 'Copy'
  2480             itemValue: copySelection
  2481           )
  2482          (MenuItem
  2483             activeHelpKey: editPaste
  2484             enabled: canPasteHolder
  2485             label: 'Paste'
  2486             itemValue: pasteBuffer
  2487           )
  2488          (MenuItem
  2489             activeHelpKey: pasteWithLayout
  2490             enabled: canPasteKeepingLayoutHolder
  2491             label: 'Paste with Layout'
  2492             itemValue: pasteWithLayout
  2493           )
  2494          (MenuItem
  2495             activeHelpKey: editPaste
  2496             enabled: canPasteKeepingLayoutHolder
  2497             label: 'Paste Keeping Absolute Position'
  2498             itemValue: pasteKeepingPosition
  2499           )
  2500          (MenuItem
  2501             activeHelpKey: editDelete
  2502             enabled: canCutHolder
  2503             label: 'Delete'
  2504             itemValue: deleteTotalSelection
  2505           )
  2506          (MenuItem
  2507             activeHelpKey: replaceBy
  2508             enabled: canReplaceSelection
  2509             label: 'Replace By...'
  2510             itemValue: doAskAndReplaceWidgetBy
  2511           )
  2512          (MenuItem
  2513             activeHelpKey: wrapInto
  2514             enabled: canWrapSelection
  2515             label: 'Wrap Into...'
  2516             itemValue: doAskAndWrapWidgetInto
  2517           )
  2518          (MenuItem
  2519             label: '-'
  2520           )
  2521          (MenuItem
  2522             enabled: canMoveSelection
  2523             label: 'Move'
  2524             submenuChannel: menuMove
  2525           )
  2526          (MenuItem
  2527             enabled: canMoveOrAlignSelection
  2528             label: 'Align'
  2529             submenuChannel: menuAlign
  2530           )
  2531          (MenuItem
  2532             enabled: hasSelection
  2533             label: 'Dimension'
  2534             submenu: 
  2535            (Menu
  2536               (
  2537                (MenuItem
  2538                   activeHelpKey: editDimensionCopyLayout
  2539                   enabled: hasSingleSelection
  2540                   label: 'Copy Layout'
  2541                   itemValue: copyLayout
  2542                 )
  2543                (MenuItem
  2544                   activeHelpKey: editDimensionPasteLayout
  2545                   enabled: canMoveOrAlignSelection
  2546                   label: 'Paste Layout'
  2547                   itemValue: pasteLayout
  2548                 )
  2549                (MenuItem
  2550                   activeHelpKey: editDimensionExchangeLayouts
  2551                   enabled: canExchangeSelectionLayouts
  2552                   label: 'Exchange Layouts'
  2553                   itemValue: exchangeLayouts
  2554                 )
  2555                (MenuItem
  2556                   label: '-'
  2557                 )
  2558                (MenuItem
  2559                   activeHelpKey: editDimensionCopyExtent
  2560                   enabled: hasSingleSelection
  2561                   label: 'Copy Extent'
  2562                   itemValue: copyExtent
  2563                 )
  2564                (MenuItem
  2565                   activeHelpKey: editDimensionPasteExtent
  2566                   enabled: canMoveOrAlignSelection
  2567                   label: 'Paste Extent'
  2568                   itemValue: pasteExtent
  2569                 )
  2570                (MenuItem
  2571                   activeHelpKey: editDimensionPasteWidth
  2572                   enabled: canMoveOrAlignSelection
  2573                   label: 'Paste Width'
  2574                   itemValue: pasteWidth
  2575                 )
  2576                (MenuItem
  2577                   activeHelpKey: editDimensionPasteHeight
  2578                   enabled: canMoveOrAlignSelection
  2579                   label: 'Paste Height'
  2580                   itemValue: pasteHeight
  2581                 )
  2582                (MenuItem
  2583                   label: '-'
  2584                 )
  2585                (MenuItem
  2586                   activeHelpKey: editDimensionDefaultExtent
  2587                   enabled: canMoveOrAlignSelection
  2588                   label: 'Set Default Extent'
  2589                   itemValue: setToDefaultExtent
  2590                 )
  2591                (MenuItem
  2592                   activeHelpKey: editDimensionDefaultWidth
  2593                   enabled: canMoveOrAlignSelection
  2594                   label: 'Set Default Width'
  2595                   itemValue: setToDefaultWidth
  2596                 )
  2597                (MenuItem
  2598                   activeHelpKey: editDimensionDefaultHeight
  2599                   enabled: canMoveOrAlignSelection
  2600                   label: 'Set Default Height'
  2601                   itemValue: setToDefaultHeight
  2602                 )
  2603                )
  2604               nil
  2605               nil
  2606             )
  2607           )
  2608          (MenuItem
  2609             label: '-'
  2610           )
  2611          (MenuItem
  2612             activeHelpKey: editOpenSpecDocumentation
  2613             label: 'Open Widget Documentation'
  2614             itemValue: doOpenWidgetDocumentation
  2615             enabled: hasOneSelectionOtherThanCanvas
  2616           )
  2617          (MenuItem
  2618             activeHelpKey: referToConfigDatabase
  2619             label: 'Refer to Config Database'
  2620             itemValue: configSelection
  2621             isVisible: false
  2622           )
  2623          (MenuItem
  2624             label: '-'
  2625             isVisible: false
  2626           )
  2627          (MenuItem
  2628             activeHelpKey: drawEdit
  2629             label: 'Draw Edit'
  2630             itemValue: shapeEdit
  2631             isVisible: false
  2632           )
  2633          (MenuItem
  2634             label: '-'
  2635           )
  2636          (MenuItem
  2637             activeHelpKey: sortItems
  2638             label: 'Sort Selected Items by Position'
  2639             itemValue: doSortItems
  2640             enabled: hasMultipleSelectionOtherThanCanvas
  2641           )
  2642          (MenuItem
  2643             activeHelpKey: groupWithLayout
  2644             enabled: canGroup
  2645             label: 'Group with Layout'
  2646             itemValue: groupWithLayout
  2647           )
  2648          (MenuItem
  2649             activeHelpKey: ungroup
  2650             enabled: canUngroup
  2651             label: 'Ungroup'
  2652             itemValue: ungroup
  2653           )
  2654          (MenuItem
  2655             activeHelpKey: ungroupWithLayout
  2656             enabled: canUngroup
  2657             label: 'Ungroup with Layout'
  2658             itemValue: ungroupWithLayout
  2659           )
  2660          (MenuItem
  2661             label: '-'
  2662           )
  2663          (MenuItem
  2664             activeHelpKey: editBrowseViewClass
  2665             enabled: hasOneSelectionOtherThanCanvas
  2666             label: 'Browse Widget Class'
  2667             itemValue: doBrowseViewClass
  2668           )
  2669          (MenuItem
  2670             activeHelpKey: editInspectView
  2671             enabled: hasOneSelectionOtherThanCanvas
  2672             label: 'Inspect Widget'
  2673             itemValue: doInspectView
  2674           )
  2675          (MenuItem
  2676             activeHelpKey: editBrowseViewClass
  2677             label: 'Browse Specification Class'
  2678             itemValue: doBrowseSpecificationClass
  2679             enabled: hasOneSelectionOtherThanCanvas
  2680           )
  2681          (MenuItem
  2682             activeHelpKey: editInspectSpec
  2683             label: 'Inspect Spec'
  2684             itemValue: doInspectSpec
  2685             enabled: hasOneSelectionOtherThanCanvas
  2686           )
  2687          (MenuItem
  2688             label: '-'
  2689           )
  2690          (MenuItem
  2691             activeHelpKey: editSaveSpecForSelection
  2692             enabled: hasOneSelectionOtherThanCanvas
  2693             label: 'Save Spec of Selection...'
  2694             itemValue: doSaveElementSpecAs
  2695           )
  2696          )
  2697         nil
  2698         nil
  2699       )
  2700 !
  2701 
  2702 menuFile
  2703     "This resource specification was automatically generated
  2704      by the MenuEditor of ST/X."
  2705 
  2706     "Do not manually edit this!! If it is corrupted,
  2707      the MenuEditor may not be able to read the specification."
  2708 
  2709     "
  2710      MenuEditor new openOnClass:UIPainter andSelector:#menuFile
  2711      (Menu new fromLiteralArrayEncoding:(UIPainter menuFile)) startUp
  2712     "
  2713 
  2714     <resource: #menu>
  2715 
  2716     ^ 
  2717      #(Menu
  2718               (
  2719                (MenuItem
  2720                   activeHelpKey: fileNew
  2721                   label: 'New'
  2722                   itemValue: doNew
  2723                   translateLabel: true
  2724                   isVisible: isStandAlone
  2725                 )
  2726                (MenuItem
  2727                   label: '-'
  2728                   isVisible: isStandAlone
  2729                 )
  2730                (MenuItem
  2731                   activeHelpKey: fileLoad
  2732                   label: 'Load...'
  2733                   itemValue: doLoad
  2734                   translateLabel: true
  2735                   isVisible: isStandAlone
  2736                 )
  2737                (MenuItem
  2738                   activeHelpKey: fileLoadSubspec
  2739                   label: 'Load Subspec...'
  2740                   itemValue: doLoadSubspec
  2741                   translateLabel: true
  2742                   isVisible: isStandAlone
  2743                 )
  2744                (MenuItem
  2745                   label: '-'
  2746                   isVisible: isStandAlone
  2747                 )
  2748                (MenuItem
  2749                   activeHelpKey: fileSave
  2750                   label: 'Save'
  2751                   itemValue: doSave
  2752                   translateLabel: true
  2753                 )
  2754                (MenuItem
  2755                   activeHelpKey: fileSaveAs
  2756                   label: 'Save As...'
  2757                   itemValue: doSaveAs
  2758                   translateLabel: true
  2759                 )
  2760                (MenuItem
  2761                   label: '-'
  2762                 )
  2763                (MenuItem
  2764                   activeHelpKey: fileSaveAs
  2765                   label: 'Define Class and Selector...'
  2766                   itemValue: doDefineClassAndSelector
  2767                   translateLabel: true
  2768                   isVisible: isStandAlone
  2769                 )
  2770                (MenuItem
  2771                   activeHelpKey: filePickAnInterface
  2772                   label: 'Pick a Window Spec...'
  2773                   itemValue: doPickAView
  2774                   translateLabel: true
  2775                 )
  2776                (MenuItem
  2777                   label: '-'
  2778                 )
  2779                (MenuItem
  2780                   label: 'Launch'
  2781                   itemValue: doStartApplication
  2782                   translateLabel: true
  2783                 )
  2784                (MenuItem
  2785                   enabled: canInstallAsWebPageHolder
  2786                   label: 'Install as WebPage'
  2787                   itemValue: doInstallAsWebPage
  2788                   translateLabel: true
  2789                 )
  2790                (MenuItem
  2791                   label: '-'
  2792                 )
  2793                (MenuItem
  2794                   activeHelpKey: fileShowWindowSpec
  2795                   label: 'Show Window Spec'
  2796                   itemValue: doWindowSpec
  2797                   translateLabel: true
  2798                   isVisible: isStandAlone
  2799                 )
  2800                (MenuItem
  2801                   activeHelpKey: fileBrowseClass
  2802                   enabled: hasSpecClass
  2803                   label: 'Browse Applications Class'
  2804                   itemValue: doBrowseClass
  2805                   translateLabel: true
  2806                   isVisible: isStandAlone
  2807                 )
  2808                (MenuItem
  2809                   activeHelpKey: fileBrowseAspectMethods
  2810                   enabled: hasSpecClass
  2811                   label: 'Browse Applications Aspect Methods'
  2812                   itemValue: doBrowseAspectMethods
  2813                   translateLabel: true
  2814                 )
  2815                (MenuItem
  2816                   label: '-'
  2817                   isVisible: isStandAlone
  2818                 )
  2819                (MenuItem
  2820                   activeHelpKey: fileExit
  2821                   label: 'Exit'
  2822                   itemValue: closeRequest
  2823                   translateLabel: true
  2824                   isVisible: isStandAlone
  2825                 )
  2826                )
  2827               nil
  2828               nil
  2829             )
  2830 !
  2831 
  2832 menuMove
  2833     "This resource specification was automatically generated
  2834      by the MenuEditor of ST/X."
  2835 
  2836     "Do not manually edit this!! If it is corrupted,
  2837      the MenuEditor may not be able to read the specification."
  2838 
  2839     "
  2840      MenuEditor new openOnClass:UIPainter andSelector:#menuMove
  2841      (Menu new fromLiteralArrayEncoding:(UIPainter menuMove)) startUp
  2842     "
  2843 
  2844     <resource: #menu>
  2845 
  2846     ^
  2847      
  2848        #(#Menu
  2849           
  2850            #(
  2851              #(#MenuItem
  2852                 #label: 'Up'
  2853                 #translateLabel: true
  2854                 #value: #doStepUp
  2855                 #activeHelpKey: #moveWidgetUp
  2856                 #enabled: #canChangeOrderInContainer
  2857                 #labelImage: #(#ResourceRetriever #Icon #upIcon 'Up')
  2858             )
  2859              #(#MenuItem
  2860                 #label: 'Down'
  2861                 #translateLabel: true
  2862                 #value: #doStepDown
  2863                 #activeHelpKey: #moveWidgetDown
  2864                 #enabled: #canChangeOrderInContainer
  2865                 #labelImage: #(#ResourceRetriever #Icon #downIcon 'Down')
  2866             )
  2867              #(#MenuItem
  2868                 #label: 'Into'
  2869                 #translateLabel: true
  2870                 #value: #doStepIn
  2871                 #activeHelpKey: #moveWidgetInto
  2872                 #enabled: #canMoveSelectionIntoContainer
  2873                 #labelImage: #(#ResourceRetriever #Icon #downRightIcon 'Into')
  2874             )
  2875              #(#MenuItem
  2876                 #label: 'Out'
  2877                 #translateLabel: true
  2878                 #value: #doStepOut
  2879                 #activeHelpKey: #moveWidgetOut
  2880                 #enabled: #canMoveSelectionOutOfContainer
  2881                 #labelImage: #(#ResourceRetriever #Icon #leftDownIcon 'Out')
  2882             )
  2883           ) nil
  2884           nil
  2885       )
  2886 !
  2887 
  2888 menuReplaceWidget
  2889     "This resource specification was automatically generated
  2890      by the MenuEditor of ST/X."
  2891 
  2892     "Do not manually edit this!! If it is corrupted,
  2893      the MenuEditor may not be able to read the specification."
  2894 
  2895     "
  2896      MenuEditor new openOnClass:UIPainter andSelector:#menuReplaceWidget
  2897      (Menu new fromLiteralArrayEncoding:(UIPainter menuReplaceWidget)) startUp
  2898     "
  2899 
  2900     <resource: #menu>
  2901 
  2902     ^ 
  2903      #(Menu
  2904         (
  2905          (MenuItem
  2906             activeHelpKey: replaceBy
  2907             enabled: canChangeOrderInContainer
  2908             label: 'Replace By...'
  2909             itemValue: doAskAndReplaceWidgetBy
  2910             translateLabel: true
  2911           )
  2912          )
  2913         nil
  2914         nil
  2915       )
  2916 !
  2917 
  2918 menuToolbar
  2919     "This resource specification was automatically generated
  2920      by the MenuEditor of ST/X."
  2921 
  2922     "Do not manually edit this!! If it is corrupted,
  2923      the MenuEditor may not be able to read the specification."
  2924 
  2925     "
  2926      MenuEditor new openOnClass:UIPainter andSelector:#menuToolbar
  2927      (Menu new fromLiteralArrayEncoding:(UIPainter menuToolbar)) startUp
  2928     "
  2929 
  2930     <resource: #menu>
  2931 
  2932     ^ 
  2933      #(Menu
  2934         (
  2935          (MenuItem
  2936             activeHelpKey: testStartApplication
  2937             label: 'Start'
  2938             itemValue: doStartApplication
  2939             translateLabel: true
  2940             isButton: true
  2941             labelImage: (ResourceRetriever ToolbarIconLibrary start22x22Icon)
  2942           )
  2943          (MenuItem
  2944             enabled: canInstallAsWebPageHolder
  2945             label: 'Install as WebPage'
  2946             itemValue: doInstallAsWebPage
  2947             translateLabel: true
  2948             isButton: true
  2949             isVisible: installAsWebPageVisible
  2950             labelImage: (ResourceRetriever XPToolbarIconLibrary installAsWebPage24x24Icon)
  2951           )
  2952          (MenuItem
  2953             label: '-'
  2954           )
  2955          (MenuItem
  2956             activeHelpKey: fileNew
  2957             label: 'New'
  2958             itemValue: doNew
  2959             translateLabel: true
  2960             isButton: true
  2961             isVisible: isStandAlone
  2962             labelImage: (ResourceRetriever ToolbarIconLibrary newWindowSpecIcon)
  2963           )
  2964          (MenuItem
  2965             label: '-'
  2966             isVisible: isStandAlone
  2967           )
  2968          (MenuItem
  2969             activeHelpKey: fileLoad
  2970             label: 'Load'
  2971             itemValue: doLoad
  2972             translateLabel: true
  2973             isButton: true
  2974             isVisible: isStandAlone
  2975             labelImage: (ResourceRetriever ToolbarIconLibrary loadFromMethodIcon)
  2976           )
  2977          (MenuItem
  2978             activeHelpKey: fileSave
  2979             label: 'Save'
  2980             itemValue: doSave
  2981             translateLabel: true
  2982             isButton: true
  2983             labelImage: (ResourceRetriever ToolbarIconLibrary saveAsMethodIcon)
  2984           )
  2985          (MenuItem
  2986             label: '-'
  2987           )
  2988          (MenuItem
  2989             label: 'CutCopyPaste'
  2990             translateLabel: true
  2991             submenuChannel: cutCopyPasteMenuSlice
  2992             isMenuSlice: true
  2993           )
  2994          (MenuItem
  2995             label: '-'
  2996             startGroup: right
  2997           )
  2998          (MenuItem
  2999             activeHelpKey: settingsCanvas
  3000             label: 'Canvas'
  3001             translateLabel: true
  3002             indication: painterShown
  3003           )
  3004          (MenuItem
  3005             activeHelpKey: settingsGallery
  3006             label: 'Gallery'
  3007             translateLabel: true
  3008             indication: galleryShown
  3009           )
  3010          )
  3011         nil
  3012         nil
  3013       )
  3014 !
  3015 
  3016 menuToolbar2
  3017     "This resource specification was automatically generated
  3018      by the MenuEditor of ST/X."
  3019 
  3020     "Do not manually edit this!! If it is corrupted,
  3021      the MenuEditor may not be able to read the specification."
  3022 
  3023 
  3024     "
  3025      MenuEditor new openOnClass:UIPainter andSelector:#menuToolbar2
  3026      (Menu new fromLiteralArrayEncoding:(UIPainter menuToolbar2)) startUp
  3027     "
  3028 
  3029     <resource: #menu>
  3030 
  3031     ^ 
  3032      #(Menu
  3033         (
  3034          (MenuItem
  3035             activeHelpKey: alignSelectionLeft
  3036             enabled: canMoveOrAlignSelection
  3037             label: 'Align Left'
  3038             itemValue: alignSelectionLeft
  3039             isButton: true
  3040             labelImage: (ResourceRetriever nil iconAlignL)
  3041           )
  3042          (MenuItem
  3043             activeHelpKey: alignSelectionRight
  3044             enabled: canMoveOrAlignSelection
  3045             label: 'Align Right'
  3046             itemValue: alignSelectionRight
  3047             isButton: true
  3048             labelImage: (ResourceRetriever nil iconAlignR)
  3049           )
  3050          (MenuItem
  3051             activeHelpKey: alignSelectionTop
  3052             enabled: canMoveOrAlignSelection
  3053             label: 'Align Top'
  3054             itemValue: alignSelectionTop
  3055             isButton: true
  3056             labelImage: (ResourceRetriever nil iconAlignT)
  3057           )
  3058          (MenuItem
  3059             activeHelpKey: alignSelectionBottom
  3060             enabled: canMoveOrAlignSelection
  3061             label: 'Align Bottom'
  3062             itemValue: alignSelectionBottom
  3063             isButton: true
  3064             labelImage: (ResourceRetriever nil iconAlignB)
  3065           )
  3066          (MenuItem
  3067             activeHelpKey: alignSelectionLeftAndRight
  3068             enabled: canResizeSelection
  3069             label: 'Align Left & Right'
  3070             itemValue: alignSelectionLeftAndRight
  3071             isButton: true
  3072             labelImage: (ResourceRetriever nil iconResizeLR)
  3073           )
  3074          (MenuItem
  3075             activeHelpKey: alignSelectionTopAndBottom
  3076             enabled: canResizeSelection
  3077             label: 'Align Top & Bottom'
  3078             itemValue: alignSelectionTopAndBottom
  3079             isButton: true
  3080             labelImage: (ResourceRetriever nil iconResizeTB)
  3081           )
  3082          (MenuItem
  3083             label: ''
  3084           )
  3085          (MenuItem
  3086             activeHelpKey: changePositionLeft
  3087             enabled: canMoveOrAlignSelection
  3088             label: 'Move Left'
  3089             itemValue: moveSelectionLeft
  3090             isButton: true
  3091             hideMenuOnActivated: false
  3092             triggerOnDown: true
  3093             labelImage: (ResourceRetriever nil arrowLeft)
  3094           )
  3095          (MenuItem
  3096             activeHelpKey: changePositionRight
  3097             enabled: canMoveOrAlignSelection
  3098             label: 'Move Right'
  3099             itemValue: moveSelectionRight
  3100             isButton: true
  3101             hideMenuOnActivated: false
  3102             triggerOnDown: true
  3103             labelImage: (ResourceRetriever nil arrowRight)
  3104           )
  3105          (MenuItem
  3106             activeHelpKey: changePositionUp
  3107             enabled: canMoveOrAlignSelection
  3108             label: 'Move Up'
  3109             itemValue: moveSelectionUp
  3110             isButton: true
  3111             hideMenuOnActivated: false
  3112             triggerOnDown: true
  3113             labelImage: (ResourceRetriever nil arrowUp)
  3114           )
  3115          (MenuItem
  3116             activeHelpKey: changePositionDown
  3117             enabled: canMoveOrAlignSelection
  3118             label: 'Move Down'
  3119             itemValue: moveSelectionDown
  3120             isButton: true
  3121             hideMenuOnActivated: false
  3122             triggerOnDown: true
  3123             labelImage: (ResourceRetriever nil arrowDown)
  3124           )
  3125          (MenuItem
  3126             activeHelpKey: changeMoveDelta
  3127             label: 'Move by'
  3128             nameKey: MoveByMenu
  3129             isButton: true
  3130             submenu: 
  3131            (Menu
  3132               (
  3133                (MenuItem
  3134                   label: '1'
  3135                   itemValue: setMoveByStep:
  3136                   argument: 1
  3137                 )
  3138                (MenuItem
  3139                   label: '5'
  3140                   itemValue: setMoveByStep:
  3141                   argument: 5
  3142                 )
  3143                (MenuItem
  3144                   label: '10'
  3145                   itemValue: setMoveByStep:
  3146                   argument: 10
  3147                 )
  3148                (MenuItem
  3149                   label: '24'
  3150                   itemValue: setMoveByStep:
  3151                   argument: 24
  3152                 )
  3153                (MenuItem
  3154                   label: '30'
  3155                   itemValue: setMoveByStep:
  3156                   argument: 30
  3157                 )
  3158                (MenuItem
  3159                   label: '100'
  3160                   itemValue: setMoveByStep:
  3161                   argument: 100
  3162                 )
  3163                (MenuItem
  3164                   label: '-'
  3165                 )
  3166                (MenuItem
  3167                   label: 'Enter Value...'
  3168                   itemValue: askForMoveByStep
  3169                 )
  3170                )
  3171               nil
  3172               nil
  3173             )
  3174             labelImage: (ResourceRetriever UIPainter delta)
  3175           )
  3176          (MenuItem
  3177             activeHelpKey: editOpenSpecDocumentation
  3178             label: 'Widget Documentation'
  3179             itemValue: doOpenWidgetDocumentation
  3180             isButton: true
  3181             startGroup: right
  3182             labelImage: (ResourceRetriever Icon helpIcon)
  3183           )
  3184          )
  3185         nil
  3186         nil
  3187       )
  3188 !
  3189 
  3190 moveInListMenuSlice
  3191     "This resource specification was automatically generated
  3192      by the MenuEditor of ST/X."
  3193 
  3194     "Do not manually edit this!! If it is corrupted,
  3195      the MenuEditor may not be able to read the specification."
  3196 
  3197     "
  3198      MenuEditor new openOnClass:UIPainter andSelector:#editToolbar
  3199      (Menu new fromLiteralArrayEncoding:(UIPainter editToolbar)) startUp
  3200     "
  3201 
  3202     <resource: #menu>
  3203 
  3204     ^ 
  3205      #(Menu
  3206         (
  3207          (MenuItem
  3208             activeHelpKey: moveWidgetUp
  3209             enabled: canChangeOrderInContainer
  3210             label: 'Move Up'
  3211             itemValue: doStepUp
  3212             translateLabel: true
  3213             isButton: true
  3214             labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetUpIcon)
  3215           )
  3216          (MenuItem
  3217             activeHelpKey: moveWidgetDown
  3218             enabled: canChangeOrderInContainer
  3219             label: 'Move Down'
  3220             itemValue: doStepDown
  3221             translateLabel: true
  3222             isButton: true
  3223             labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownIcon)
  3224           )
  3225          (MenuItem
  3226             activeHelpKey: moveWidgetInto
  3227             enabled: canMoveSelectionIntoContainer
  3228             label: 'Move Into'
  3229             itemValue: doStepIn
  3230             translateLabel: true
  3231             isButton: true
  3232             labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownRightIcon)
  3233           )
  3234          (MenuItem
  3235             activeHelpKey: moveWidgetOut
  3236             enabled: canMoveSelectionOutOfContainer
  3237             label: 'Move Out'
  3238             itemValue: doStepOut
  3239             translateLabel: true
  3240             isButton: true
  3241             labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetLeftDownIcon)
  3242           )
  3243          )
  3244         nil
  3245         nil
  3246       )
  3247 ! !
  3248 
  3249 !UIPainter class methodsFor:'private class access'!
  3250 
  3251 applicationClassQuery
  3252     ^ ApplicationClassQuery
  3253 ! !
  3254 
  3255 !UIPainter methodsFor:'aspects'!
  3256 
  3257 alignToGridHolder
  3258     |holder|
  3259 
  3260     (holder := builder bindingAt:#alignToGridHolder) isNil ifTrue:[
  3261         holder := (self class settings at: #GridAlign ifAbsent: [painter gridAlign]) asValue.
  3262         builder aspectAt:#alignToGridHolder put: holder.
  3263         holder addDependent:self.
  3264     ].
  3265     ^ holder
  3266 !
  3267 
  3268 aspectFor:aKey
  3269     "returns the aspect for aKey or nil"
  3270 
  3271     ^ aspects at:aKey ifAbsent:[ super aspectFor:aKey ]
  3272 !
  3273 
  3274 canChangeOrderInContainer
  3275     "returns a boolean value holder which is true if the widget order can be changed 
  3276      within their container"
  3277 
  3278     ^ builder booleanValueAspectFor:#canChangeOrderInContainer
  3279 !
  3280 
  3281 canExchangeSelectionLayouts
  3282     "returns a boolean value holder which is true in case that the selection 
  3283      consists of exactly 2 components
  3284      and all widgets in the selection can change its layout through to a move or
  3285      align operation"
  3286 
  3287     ^ builder booleanValueAspectFor:#canExchangeSelectionLayouts
  3288 !
  3289 
  3290 canInstallAsWebPage
  3291     ^ specClass notNil
  3292        and:[ specClass isSubclassOf:WebApplicationModel ]
  3293 
  3294     "Created: / 14-01-2008 / 17:34:56 / cg"
  3295 !
  3296 
  3297 canInstallAsWebPageHolder
  3298     ^ builder 
  3299             valueAspectFor:#canInstallAsWebPageHolder
  3300             initialValue:(self canInstallAsWebPage).
  3301 
  3302     "Created: / 14-01-2008 / 17:36:04 / cg"
  3303 !
  3304 
  3305 canMoveOrAlignSelection
  3306     "returns a boolean value holder which is true in case that any selection exists
  3307      and all widgets in the selection can change their layout through to a move or
  3308      align operation"
  3309 
  3310     ^ builder booleanValueAspectFor:#canMoveOrAlignSelection
  3311 !
  3312 
  3313 canMoveSelection
  3314     "true if move-in/move-out/move-up and down are enabled"
  3315 
  3316     treeView hasOneSelectionOtherThanCanvas ifFalse:[^ false].
  3317     ^ self canChangeOrderInContainer value 
  3318      or: [ self canMoveSelectionOutOfContainer value 
  3319      or: [ self canMoveSelectionIntoContainer value ]]
  3320 !
  3321 
  3322 canMoveSelectionIntoContainer
  3323     "returns true in case that at least one widget is selected and can change its container
  3324      widget to an element below"
  3325 
  3326     ^ builder booleanValueAspectFor:#canMoveSelectionIntoContainer
  3327 !
  3328 
  3329 canMoveSelectionOutOfContainer
  3330     "returns a boolean value holder which is true in case that at least one widget is selected
  3331      which is contained within another component"
  3332 
  3333     ^ builder booleanValueAspectFor:#canMoveSelectionOutOfContainer
  3334 !
  3335 
  3336 canPasteHolder
  3337 
  3338     |holder|
  3339     (holder := builder bindingAt:#canPasteHolder) isNil ifTrue:[
  3340         holder := [ self canPaste ].
  3341     ].
  3342     ^ holder
  3343 !
  3344 
  3345 canPasteKeepingLayoutHolder
  3346     ^ self canPasteHolder
  3347 !
  3348 
  3349 canReplaceSelection
  3350     treeView hasOneSelectionOtherThanCanvas ifFalse:[^ false].
  3351     ^ true
  3352 !
  3353 
  3354 canResizeSelection
  3355     "returns a boolean value holder which is true in case that any selection exists
  3356      and all widgets in the selection can be resized"
  3357 
  3358     ^ builder booleanValueAspectFor:#canResizeSelection
  3359 !
  3360 
  3361 canWrapSelection
  3362     treeView hasOneSelectionOtherThanCanvas ifFalse:[^ false].
  3363     ^ true
  3364 !
  3365 
  3366 editToolBarVisibleHolder
  3367     |holder|
  3368 
  3369     (holder := builder bindingAt:#editToolBarVisibleHolder) isNil ifTrue:[
  3370         holder := self class defaultEditToolbarVisible asValue.
  3371         builder aspectAt:#editToolBarVisibleHolder put: holder.
  3372         holder addDependent:self.
  3373     ].
  3374     ^ holder
  3375 !
  3376 
  3377 enableChannel
  3378     "true if modifications are allowed otherwise in test mode"
  3379 
  3380     ^ builder valueAspectFor:#enableChannel initialValue:true
  3381 !
  3382 
  3383 enableChannel2
  3384     "true if modifications are allowed otherwise running test"
  3385 
  3386     ^ self painter enableChannel
  3387 !
  3388 
  3389 galleryShown
  3390     "returns a boolean value holder which is set to true if the gallery is shown"
  3391 
  3392     |holder|
  3393 
  3394     (holder := builder bindingAt:#galleryShown) isNil ifTrue:[
  3395         builder aspectAt:#galleryShown put:(holder :=  true asValue).
  3396         holder addDependent:self
  3397     ].
  3398     ^ holder
  3399 
  3400 !
  3401 
  3402 gridShownHolder
  3403     |holder|
  3404 
  3405     (holder := builder bindingAt:#gridShownHolder) isNil ifTrue:[
  3406         holder := (self class settings at: #GridShown ifAbsent: [painter gridShown]) asValue.
  3407         builder aspectAt:#gridShownHolder put: holder.
  3408         holder addDependent:self.
  3409     ].
  3410     ^ holder
  3411 !
  3412 
  3413 hasMultipleSelectionOtherThanCanvas
  3414     "returns a value holder which is true in case that multiple widget other than the root are selected"
  3415 
  3416     ^ builder booleanValueAspectFor:#hasMultipleSelectionOtherThanCanvas
  3417 !
  3418 
  3419 hasOneSelectionOtherThanCanvas
  3420     "returns a value holder which is true in case that one widget is selected
  3421      other than the root"
  3422 
  3423     ^ builder booleanValueAspectFor:#hasOneSelectionOtherThanCanvas
  3424 !
  3425 
  3426 hasSelectionOtherThanCanvas
  3427     "returns a value holder which is true in case that any widget other than the root is selected"
  3428 
  3429     ^ builder booleanValueAspectFor:#hasSelectionOtherThanCanvas
  3430 !
  3431 
  3432 hasUndoHistory
  3433     ^ self painter hasUndoHistory
  3434 !
  3435 
  3436 hasUndoHistoryHolder
  3437     ^ self painter hasUndoHistoryHolder
  3438 !
  3439 
  3440 installAsWebPageVisible
  3441     ^ true
  3442 
  3443     "Created: / 14-01-2008 / 17:46:05 / cg"
  3444 !
  3445 
  3446 noteBookView
  3447     "returns the notebook view; initialize the tools embedded in the notebook"
  3448 
  3449     |noteBook|
  3450 
  3451     (noteBook := builder bindingAt:#noteBookView) isNil ifTrue:[
  3452         noteBook := View new.
  3453         builder aspectAt:#noteBookView put:noteBook.
  3454 
  3455         layoutTool := self createToolApplication:UILayoutTool        spec:#windowSpec in:noteBook.
  3456         helpTool   := self createToolApplication:UIHelpTool          spec:#innerSpec  in:noteBook.
  3457         specTool   := self createToolApplication:UISpecificationTool spec:#windowSpec in:noteBook.
  3458 
  3459         helpTool loadFromClass:specClass.
  3460     ].
  3461     ^ noteBook
  3462 
  3463     "Modified: / 31-08-2006 / 10:11:15 / cg"
  3464 !
  3465 
  3466 painterShown
  3467     "returns a boolean value holder which is set to true if the painter is shown"
  3468 
  3469     |holder|
  3470 
  3471     (holder := builder bindingAt:#painterShown) isNil ifTrue:[
  3472         builder aspectAt:#painterShown put:(holder :=  true asValue).
  3473         holder addDependent:self
  3474     ].
  3475     ^ holder
  3476 
  3477 !
  3478 
  3479 tabList
  3480     "returns a value holder which keeps a list of the section labels in the notebook"
  3481 
  3482     |tabs holder|
  3483 
  3484     (holder := builder bindingAt:#tabList) isNil ifTrue:[
  3485         tabs := #(Basics Details Layout).
  3486         builder aspectAt:#tabList put:(holder :=  (resources array:tabs) asValue).
  3487     ].
  3488     ^ holder
  3489 !
  3490 
  3491 tabModel
  3492     "returns a value holder which keeps the label of the current section in the notebook"
  3493 
  3494     |holder|
  3495 
  3496     (holder := builder bindingAt:#tabModel) isNil ifTrue:[
  3497         holder := AspectAdaptor new subject:self; forAspect:#tabSelection.
  3498         builder aspectAt:#tabModel put:holder.
  3499     ].
  3500     ^ holder
  3501 !
  3502 
  3503 toolBarVisibleHolder
  3504     |holder|
  3505 
  3506     (holder := builder bindingAt:#toolBarVisibleHolder) isNil ifTrue:[
  3507         holder := self class defaultToolbarVisible asValue.
  3508         builder aspectAt:#toolBarVisibleHolder put: holder.
  3509         holder addDependent:self.
  3510     ].
  3511     ^ holder
  3512 !
  3513 
  3514 treeView
  3515     "returns the tree view which holds all widget"
  3516 
  3517     ^ treeView
  3518 !
  3519 
  3520 valueOfCanPasteWithKeepingLayout
  3521     <resource: #obsolete>
  3522     self obsoleteMethodWarning:'stupid name - use #canPasteKeepingLayoutHolder'.
  3523     ^ self canPasteKeepingLayoutHolder
  3524 ! !
  3525 
  3526 !UIPainter methodsFor:'building editors'!
  3527 
  3528 XXopenDataSetColumnEditor
  3529     "opens a Table Column Editor on current widget"
  3530 
  3531     |cls editor specTool columnHolder tableSelector columns isEditingSpecOnly|
  3532 
  3533     isEditingSpecOnly := self isEditingSpecOnly.
  3534 
  3535     isEditingSpecOnly ifFalse:[
  3536         (cls := self resolveName:specClassName) isNil ifTrue:[
  3537             self askForSaving ifTrue:[cls := self resolveName:specClassName].
  3538         ].
  3539         cls isNil ifTrue:[^ self].
  3540     ].
  3541 
  3542     self acceptOrIgnoreSectionModification.
  3543 
  3544     editor   := DataSetBuilder new.
  3545     editor masterApplication:self.
  3546     specTool := self specTool.
  3547 
  3548     isEditingSpecOnly ifFalse:[
  3549         editor specClass: cls.
  3550         editor rowClassName:(specTool specification rowClassName).
  3551     ].
  3552     columnHolder  := specTool aspectFor:#columnHolder.
  3553     tableSelector := columnHolder value.
  3554 
  3555     tableSelector := tableSelector notEmptyOrNil 
  3556                         ifTrue:[tableSelector asSymbol]
  3557                         ifFalse:[nil].
  3558 
  3559     (isEditingSpecOnly not
  3560     and:[tableSelector notNil 
  3561     and:[cls class includesSelector:tableSelector]]) ifTrue:[
  3562         editor openModalOnClass:cls andSelector:tableSelector
  3563     ] ifFalse:[
  3564         editor editingSpecOnly:true.
  3565 
  3566         columns := specTool specification columns.
  3567         columns size ~~ 0 ifTrue:[
  3568             editor openModalOnResourceSpec:columns
  3569         ] ifFalse:[
  3570             editor openModal
  3571         ].
  3572     ].
  3573 
  3574     isEditingSpecOnly ifFalse:[
  3575         editor hasSaved ifTrue:[
  3576             specTool specification 
  3577                 columns:nil;
  3578                 rowClassName:(editor rowClassName).
  3579 
  3580             tableSelector = editor specSelector ifFalse:[
  3581                 columnHolder value:(editor specSelector).
  3582                 self accept.
  3583             ].
  3584             ^ self
  3585         ].
  3586     ].
  3587 
  3588     tableSelector isNil ifTrue:[
  3589         editor hasSaved ifTrue:[
  3590             editor modified ifFalse:[
  3591                 specTool specification 
  3592                     columns:(editor acceptedColumns);
  3593                     rowClassName:(editor rowClassName).
  3594                 self modifiedChannel value:true.
  3595             ].
  3596         ].
  3597     ].
  3598 
  3599     "Modified: / 12-01-2008 / 10:31:47 / cg"
  3600 !
  3601 
  3602 openDataSetColumnEditor
  3603     "opens a Table Column Editor on current widget"
  3604 
  3605     |cls editor specTool columnHolder tableSelector columns isEditingSpecOnly|
  3606 
  3607     self isModified ifTrue:[
  3608         "/ force editFields to accept
  3609         self acceptChannel value:true; value:false.
  3610     ].
  3611 
  3612     specTool := self specTool.
  3613     columnHolder := specTool aspectFor:#columnHolder.
  3614     tableSelector := columnHolder value.
  3615 
  3616     tableSelector notEmptyOrNil ifTrue:[
  3617         tableSelector := tableSelector asSymbol.
  3618     ] ifFalse:[
  3619         tableSelector := nil.
  3620     ].
  3621 
  3622     isEditingSpecOnly := true.
  3623 
  3624     (tableSelector notNil and:[self isEditingSpecOnly not]) ifTrue:[
  3625         (cls := self resolveName:specClassName) notNil ifTrue:[
  3626             isEditingSpecOnly := false.
  3627         ].
  3628     ].
  3629     editor := DataSetBuilder new.
  3630     editor masterApplication:self.
  3631 
  3632     isEditingSpecOnly ifFalse:[
  3633         editor specClass:cls.
  3634         editor rowClassName:(specTool specification rowClassName).
  3635     ].
  3636 
  3637     isEditingSpecOnly ifFalse:[
  3638         editor openModalOnClass:cls andSelector:tableSelector.
  3639 
  3640         editor hasSaved ifTrue:[
  3641             specTool specification 
  3642                 columns:nil;
  3643                 rowClassName:(editor rowClassName).
  3644 
  3645             tableSelector = editor specSelector ifFalse:[
  3646                 columnHolder value:(editor specSelector).
  3647                 self accept.
  3648             ].
  3649         ].
  3650         ^ self
  3651     ].
  3652 
  3653     editor editingSpecOnly:true.
  3654 
  3655     columns := specTool specification columns.
  3656 
  3657     columns size ~~ 0 ifTrue:[
  3658         editor openModalOnResourceSpec:columns
  3659     ] ifFalse:[
  3660         editor openModal
  3661     ].
  3662 
  3663     editor hasSaved ifTrue:[
  3664         columnHolder value:nil.
  3665 
  3666         specTool specification 
  3667             columns:(editor acceptedColumns);
  3668             rowClassName:(editor rowClassName).
  3669 
  3670         columnHolder value:nil.
  3671         self modifiedChannel value:true.
  3672     ].
  3673 !
  3674 
  3675 openEditMenu
  3676     "opens a Menu Editor on current widget for the standard menu
  3677      (accessed via #menu or #menuSelector)"
  3678 
  3679     ^ self
  3680         openEditMenuFor:#menu
  3681         and:#menuSelector
  3682 !
  3683 
  3684 openEditMenuFor:menuSelector and:menuSelectorSelector
  3685     "opens a Menu Editor on the current widget.
  3686      The arguments menuSelector (typically: #menu) 
  3687      and menuSelectorSelector (typically: #menuSelector) can be passed in
  3688      for widgets with a secondary menu (with different selectors)"
  3689 
  3690     |cls selectorOrMenu editor selectedSpec windowSpec holder|
  3691 
  3692     self isEditingSpecOnly ifFalse:[
  3693         "/ normal mode
  3694         (cls := self resolveName:specClassName) isNil ifTrue:[
  3695             self askForSaving ifTrue:[cls := self resolveName:specClassName].
  3696         ].
  3697         cls isNil ifTrue:[^ self].
  3698     ].
  3699 
  3700     self acceptOrIgnoreSectionModification.
  3701     windowSpec := self specTool specification.
  3702 
  3703     self isEditingSpecOnly ifTrue:[
  3704         selectorOrMenu := windowSpec perform:menuSelector
  3705     ] ifFalse:[
  3706         (selectorOrMenu := (windowSpec perform:menuSelectorSelector)) notNil ifTrue:[
  3707             selectorOrMenu := selectorOrMenu asSymbol
  3708         ] ifFalse:[
  3709             "/ cg: q&d hack ...
  3710             selectorOrMenu := nil.
  3711 
  3712             (selectedSpec := treeView propertySelected) notNil ifTrue:[
  3713                 Error handle:[:ex |
  3714                     selectorOrMenu := nil.
  3715                 ] do:[
  3716                     selectorOrMenu := selectedSpec view asMenu.
  3717                 ]
  3718             ].
  3719         ].
  3720     ].
  3721 
  3722     editor := MenuEditor new.
  3723     editor masterApplication:self.
  3724     self isEditingSpecOnly ifFalse:[
  3725         editor specClass: cls.
  3726         editor useHelpTool:(self helpTool).
  3727     ].
  3728 
  3729     (self isEditingSpecOnly or:[selectorOrMenu class == Menu]) ifTrue: [
  3730         editor openModalOnMenu:(selectorOrMenu).
  3731         editor hasSaved ifTrue:[
  3732             windowSpec perform:menuSelector asMutator with:(editor savedSpec).
  3733             self accept.
  3734         ].
  3735     ] ifFalse: [
  3736         editor openModalOnClass:cls andSelector:selectorOrMenu.
  3737         editor hasSaved ifTrue:[
  3738             holder := self specTool aspectFor:menuSelector.
  3739             holder value:(editor specSelector).
  3740             self accept.
  3741         ].
  3742     ].
  3743 
  3744     "Modified: / 12-01-2008 / 10:31:41 / cg"
  3745 !
  3746 
  3747 openHierarchicalListEditor
  3748     "opens a Hierarchical List Editor on current widget"
  3749 
  3750     |selector editor spec|
  3751 
  3752     (self resolveName:specClassName) isNil ifTrue:[
  3753         self askForSaving ifFalse: [^self]
  3754     ].
  3755 
  3756     spec := self specTool specification.
  3757     (selector := spec hierarchicalList) notNil ifTrue:[
  3758         selector := selector asSymbol
  3759     ].
  3760 
  3761     editor := HierarchicalListEditor new.
  3762     editor masterApplication:self.
  3763     editor openModalOnClass:specClassName andSelector:selector.
  3764 
  3765     editor specSelector ~= selector ifTrue:[
  3766         editor hasSaved ifTrue:[
  3767             spec hierarchicalList:editor specSelector.
  3768             self modifiedChannel value:true.
  3769             self accept
  3770         ]
  3771     ]
  3772 
  3773     "Modified: / 16.7.1998 / 18:15:46 / cg"
  3774 !
  3775 
  3776 openSubSpecBrowser
  3777     "opens a browser on the current subspecification"
  3778 
  3779     self withSpecClassAndSelectorDo:[:cls :sel |
  3780         cls theMetaclass browse:sel.
  3781     ].
  3782 !
  3783 
  3784 openSubSpecGUIPainter
  3785     "opens a GUI Painter on the current subspecification"
  3786 
  3787     self withSpecClassAndSelectorDo:[:cls :sel |
  3788         self class 
  3789             openOnClass:cls theMetaclass soleInstance 
  3790             andSelector:sel.
  3791     ].        
  3792 
  3793     "Modified: / 5.11.2001 / 16:51:46 / cg"
  3794 !
  3795 
  3796 openTabListEditor
  3797     "opens a Tab List Editor on current widget"
  3798 
  3799     |selector editor spec cls holder|
  3800 
  3801     (cls := self resolveName:specClassName) isNil ifTrue:[
  3802         self askForSaving ifTrue:[cls := self resolveName:specClassName].
  3803     ].
  3804     cls isNil ifTrue:[^ self].
  3805 
  3806     self acceptOrIgnoreSectionModification.
  3807     spec := self specTool specification.
  3808 
  3809     (selector := spec listSelector) isArray 
  3810         ifTrue: [^self warn: 'Cannot open the Tab List Editor on an array!!'].
  3811 
  3812     editor := TabListEditor new.
  3813     editor masterApplication:self.
  3814     editor openModalOnClass:cls andSelector:selector.
  3815 
  3816     editor hasSaved ifTrue:[
  3817         holder := self specTool aspectFor:#listSelector.
  3818 
  3819         holder value ~= editor specSelector ifTrue:[
  3820             holder value:editor specSelector.
  3821             self accept.
  3822         ]
  3823     ].
  3824 
  3825     "Modified: / 12-01-2008 / 10:31:34 / cg"
  3826 !
  3827 
  3828 withSpecClassAndSelectorDo:aTwoArgBlock
  3829     "helper for open GUI Painter/open Browser on the current subspecification"
  3830 
  3831     |spec cls meta sel|
  3832 
  3833     (self resolveName:specClassName) isNil ifTrue:[
  3834         self askForSaving ifFalse: [^self]
  3835     ]. 
  3836 
  3837     spec := self specTool specification.
  3838     cls := spec majorKey.
  3839     cls isNil ifTrue:[
  3840         cls := specClassName.
  3841     ].
  3842     (cls := self resolveName:cls inClass:(Smalltalk at: specClassName asSymbol)) isNil ifTrue:[
  3843         spec majorKey isNil ifTrue:[
  3844             ^ self warn:'Cannot find class (no majorKey specified).'.
  3845         ].
  3846         ^ self warn:('Cannot find class ', spec majorKey allBold, '.').
  3847     ].
  3848     sel := spec minorKey.
  3849     meta := cls class whichClassIncludesSelector:sel.
  3850     meta isNil ifTrue:[
  3851         ^ self warn:'Cannot find selector #', (sel ? '') allBold, ' in class ', cls name allBold, '!!'
  3852     ].
  3853 
  3854     aTwoArgBlock value:meta value:spec minorKey.
  3855 ! !
  3856 
  3857 !UIPainter methodsFor:'change & update'!
  3858 
  3859 layoutChanged
  3860     "called by the painter/canvas whenever the layout of the current selected
  3861      widget has changed"
  3862 
  3863     self isModified ifFalse:[
  3864         self layoutTool update.
  3865         self clearModifiedFlag
  3866     ]
  3867 !
  3868 
  3869 propertyChanged
  3870     "called by the painter/canvas whenever the property of the current selected
  3871      widget has changed"
  3872 
  3873     |property spec|
  3874 
  3875     (property := treeView propertySelected) notNil ifTrue:[
  3876         spec := property spec copy.
  3877         self specTool specification:spec.
  3878         self setViewInLayoutTool:(property view) spec:spec.
  3879         self clearModifiedFlag
  3880     ] ifFalse:[
  3881         self layoutTool layoutView notNil ifTrue:[
  3882             self clearModifiedFlag.
  3883             self treeSelectionChanged
  3884         ]
  3885     ]
  3886 !
  3887 
  3888 toolBarVisibilityChanged
  3889     |toolBarVisible editToolBarVisible toolBar editToolBar noteBook topOffset|
  3890 
  3891     topOffset := 0.
  3892 
  3893     toolBar := self componentAt:#ToolBar.
  3894     toolBar notNil ifTrue:[
  3895         toolBarVisible := self toolBarVisibleHolder value.
  3896         DefaultToolBarVisible := toolBarVisible.
  3897         toolBarVisible ifTrue:[
  3898             topOffset := topOffset + toolBar height.
  3899         ]
  3900     ].
  3901 
  3902     editToolBar := self componentAt:#EditToolBar.
  3903     editToolBar notNil ifTrue:[
  3904         editToolBar layout 
  3905             topOffset:topOffset bottomOffset:(topOffset + editToolBar height).
  3906         "/ force it to recompute its dimension
  3907         editToolBar container notNil ifTrue:[
  3908             editToolBar containerChangedSize.
  3909         ].
  3910         editToolBarVisible := self editToolBarVisibleHolder value.
  3911         DefaultEditToolBarVisible := editToolBarVisible.
  3912         editToolBarVisible ifTrue:[
  3913             topOffset := topOffset + editToolBar height.
  3914         ]
  3915     ].
  3916 
  3917     noteBook := self componentAt:#Painter.
  3918     noteBook notNil ifTrue:[
  3919         noteBook layout topOffset:topOffset.
  3920         "/ force it to recompute its dimension
  3921         noteBook container notNil ifTrue:[
  3922             noteBook containerChangedSize.
  3923         ].
  3924     ].
  3925 
  3926     "Created: / 18-02-2007 / 14:46:22 / cg"
  3927 !
  3928 
  3929 update:something with:aParameter from:changedObject
  3930     "catches change notifications"
  3931 
  3932     |window lbl|
  3933 
  3934     ((changedObject == self toolBarVisibleHolder)
  3935     or:[ changedObject == self editToolBarVisibleHolder ]) ifTrue:[
  3936         self toolBarVisibilityChanged.
  3937         ^ self
  3938     ].
  3939     changedObject == self gridShownHolder ifTrue:[
  3940         self class settings at: #GridShown  put: changedObject value.
  3941         painter gridShown:changedObject value.
  3942         ^ self
  3943     ].
  3944     changedObject == self alignToGridHolder ifTrue:[
  3945         self class settings at: #GridAlign  put: changedObject value.
  3946         painter gridAlign:changedObject value.
  3947         ^ self
  3948     ].
  3949 
  3950     changedObject == treeView model ifTrue:[
  3951         (something == #selection
  3952         or:[something == #selectionIndex]) ifTrue:[self treeSelectionChanged].
  3953         ^ self
  3954     ].
  3955 
  3956     changedObject == self galleryShown ifTrue:[
  3957         "/ galleryShown toggle changed
  3958         window := selectionPanel window.
  3959         (changedObject value) ifTrue:[
  3960             self raiseUIView:window
  3961         ] ifFalse:[
  3962             self hideUIView:window
  3963         ].
  3964         ^ self
  3965     ].
  3966 
  3967     changedObject == self painterShown ifTrue:[
  3968         "/ canvasShown toggle changed
  3969         window := self painter topView.
  3970         (changedObject value) ifTrue:[
  3971             self raiseUIView:window
  3972         ] ifFalse:[
  3973             self hideUIView:window
  3974         ].
  3975         ^ self
  3976     ].
  3977 
  3978     changedObject == self autoAcceptOnSelectionChange ifTrue:[
  3979         lbl := changedObject value ifTrue:['Apply'] ifFalse:['OK'].
  3980         (builder componentAt:'acceptButton') label:(resources string:lbl).
  3981         ^ self
  3982     ].
  3983 
  3984     "Modified: / 16.7.1998 / 19:09:57 / cg"
  3985 !
  3986 
  3987 updateChannels
  3988     "updates the channels"
  3989 
  3990     |canCutOrCopy|
  3991 
  3992     treeView isNil ifTrue:[^ self].
  3993 
  3994     self canMoveOrAlignSelection        value:(treeView canMoveOrAlignSelection).
  3995     self canResizeSelection             value:(treeView canResizeSelection).
  3996     self canExchangeSelectionLayouts    value:(treeView canExchangeSelectionLayouts).
  3997     self canChangeOrderInContainer      value:(treeView canChangeOrderInContainer).
  3998     self canMoveSelectionIntoContainer  value:(treeView canMoveSelectionIntoContainer).
  3999     self canMoveSelectionOutOfContainer value:(treeView canMoveSelectionOutOfContainer).
  4000     self hasOneSelectionOtherThanCanvas value:(treeView hasOneSelectionOtherThanCanvas).
  4001     self hasSelectionOtherThanCanvas    value:(treeView hasSelectionOtherThanCanvas).
  4002     self hasMultipleSelectionOtherThanCanvas value:(treeView hasMultipleSelectionOtherThanCanvas).
  4003     
  4004     "/ the top-node cannot be cut, copied or pasted.
  4005     canCutOrCopy := treeView selection notEmptyOrNil and:[treeView selection first ~~ 1].
  4006 
  4007     self canCutHolder value: canCutOrCopy.
  4008     self canCopyHolder value: canCutOrCopy.
  4009 
  4010 "/    self modifiedChannel value: false.
  4011 
  4012     "Modified: / 16.7.1998 / 19:13:30 / cg"
  4013 ! !
  4014 
  4015 !UIPainter methodsFor:'defaults'!
  4016 
  4017 defaultNameOfCanvas
  4018     ^ self class defaultNameOfCanvas
  4019 !
  4020 
  4021 defaultWindowSpecClass
  4022     ^ WindowSpec
  4023 ! !
  4024 
  4025 !UIPainter methodsFor:'event handling'!
  4026 
  4027 doesNotUnderstand:aMessage
  4028     "forward misunderstood messages to the painter"
  4029 
  4030     |painter|
  4031 
  4032     painter := self painter.
  4033 
  4034     (painter respondsTo:(aMessage selector)) ifTrue:[
  4035         ^ aMessage sendTo:painter
  4036     ].
  4037     super doesNotUnderstand:aMessage
  4038 
  4039 !
  4040 
  4041 processEvent:anEvent
  4042     "filter keyboard events.
  4043      Return true, if I have eaten the event"
  4044 
  4045     <resource: #keyboard (#CtrlCursorUp #CtrlCursorDown #CtrlCursorLeft #CtrlCursorRight)>
  4046 
  4047     |key|
  4048 
  4049     anEvent isKeyPressEvent ifTrue:[ 
  4050         anEvent targetView == treeView ifFalse:[^ false].
  4051         treeView hasFocus ifFalse:[^ false].
  4052 
  4053         key := anEvent key.
  4054 
  4055 "/        (anEvent rawKey == #Cmdr) ifTrue:[
  4056 "/            self openNameEditorOnTreeSelection.
  4057 "/            ^ true.
  4058 "/        ].
  4059         (anEvent rawKey == #CtrlCursorUp) ifTrue:[ 
  4060             self doStepUp.
  4061             ^ true.
  4062         ].
  4063         (anEvent rawKey == #CtrlCursorDown) ifTrue:[ 
  4064             self doStepDown.
  4065             ^ true.
  4066         ].
  4067         (anEvent rawKey == #CtrlCursorLeft) ifTrue:[ 
  4068             self doStepOut.
  4069             ^ true.
  4070         ].
  4071         (anEvent rawKey == #CtrlCursorRight) ifTrue:[ 
  4072             self doStepIn.
  4073             ^ true.
  4074         ].
  4075     ].
  4076 
  4077     ^ false.
  4078 ! !
  4079 
  4080 !UIPainter methodsFor:'help'!
  4081 
  4082 defaultInfoLabel
  4083     "returns the default info label"
  4084 
  4085     specClassName isNil ifTrue: [^'No class defined.'].
  4086     specSelector isNil ifTrue: [^'No selector defined.'].
  4087     ^ specClassName printString, ' >> ', specSelector
  4088 
  4089     "Modified: / 31-08-2006 / 10:12:03 / cg"
  4090 ! !
  4091 
  4092 !UIPainter methodsFor:'help specs'!
  4093 
  4094 basicHelpTextFromSpecification:specification forKey:aKey
  4095     "redefinable, to allow for subclasses to overwrite the helpTexts of the ui-spec"
  4096 
  4097     ^ specification helpSpec at:aKey ifAbsent:nil
  4098 !
  4099 
  4100 helpSpec
  4101     |spec painter|
  4102 
  4103     painter := self painter.
  4104 
  4105     spec := self class helpSpec.
  4106     spec at:#editUndo put:(resources string:'Undo (%1)' 
  4107                         with:(resources string:painter undoHistory labelOfLastUndo)).
  4108 
  4109     spec at:#changePositionDown put:(resources string:
  4110                 (spec at:#changePositionDown) with:painter nPixelsForMoveSelection).
  4111 
  4112     spec at:#changePositionLeft put:(resources string:
  4113                 (spec at:#changePositionLeft) with:painter nPixelsForMoveSelection). 
  4114 
  4115     spec at:#changePositionRight put:(resources string:
  4116                 (spec at:#changePositionRight) with:painter nPixelsForMoveSelection). 
  4117 
  4118     spec at:#changePositionUp put:(resources string:
  4119                 (spec at:#changePositionUp) with:painter nPixelsForMoveSelection). 
  4120 
  4121     ^ spec
  4122 ! !
  4123 
  4124 !UIPainter methodsFor:'initialization'!
  4125 
  4126 hideToolBarButtonCreated:aButton
  4127     aButton passiveLevel:(MenuPanel defaultLevel). 
  4128 "/    aButton passiveLevel:1.
  4129     aButton activeLevel:-1.
  4130     aButton backgroundColor:(MenuPanel defaultBackgroundColor).
  4131 !
  4132 
  4133 initialize
  4134     |name scroller viewScroller|
  4135 
  4136     super initialize.
  4137 
  4138     modified := false.
  4139 
  4140     aspects := IdentityDictionary new.
  4141     aspects at:#classNameChannel put:'NewApplication' asValue.
  4142     aspects at:#superclassNameChannel put:'ApplicationModel' asValue.
  4143     aspects at:#methodNameChannel put:'windowSpec' asValue.
  4144 
  4145     treeView := TreeView new.
  4146     treeView painter:self.
  4147     treeView windowSpecClass:(self defaultWindowSpecClass).
  4148     treeView selectConditionBlock:[:newSelection | self selectionChangeAllowed:newSelection ].
  4149 
  4150     painterView := StandardSystemView new.
  4151     name := name ? self defaultNameOfCanvas.
  4152     painterView beToolWindow.
  4153     painterView name:name.
  4154     painterView label:name.
  4155     painterView extent:(treeView windowSpecClass defaultExtentInUIPainter).
  4156 
  4157     UseViewScroller == true ifTrue:[
  4158         scroller := HVScrollableView for:ViewScroller in:painterView.
  4159         scroller
  4160             horizontalScrollable:true miniScroller:true;
  4161             verticalScrollable:true; verticalMini:true;
  4162             autoHideScrollBars:false;
  4163             layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
  4164         viewScroller := scroller scrolledView.
  4165         painter := UIPainterView new.
  4166         painter extent:300@300.
  4167         viewScroller scrolledView:painter.
  4168     ] ifFalse:[
  4169         painter := UIPainterView in:painterView.
  4170         painter layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
  4171     ].
  4172 
  4173     treeView := treeView canvas:painter specName:name.
  4174     painter treeView:treeView.
  4175     treeView model addDependent:self.
  4176     painter enableChannel:(self enableChannel).
  4177 
  4178     selectionPanel := self selectionPanelClass new.
  4179     selectionPanel allButOpenInterface:#windowSpec.
  4180 ! !
  4181 
  4182 !UIPainter methodsFor:'menus-dynamic'!
  4183 
  4184 menuEdit
  4185     ^ [
  4186         |m i|
  4187 
  4188         m := self class menuEdit.
  4189         m := m decodeAsLiteralArray.
  4190         i := m detectItem:[:item | item nameKey == #undo] ifNone:nil.
  4191         i notNil ifTrue:[
  4192             i label:(resources string:(i label , ' (%1)') 
  4193                         with:(resources string:self painter undoHistory labelOfLastUndo)).
  4194         ].
  4195         "/ m receiver:self.   -- now done in findGuiResources ...
  4196         m findGuiResourcesIn:self.
  4197         m
  4198       ].
  4199 !
  4200 
  4201 menuReplaceWidget
  4202     ^ [
  4203         |m i specAndView spec usefulReplacementSpecClasses|
  4204 
  4205         m := self class menuReplaceWidget.
  4206         m := m decodeAsLiteralArray.
  4207 
  4208         specAndView := self selectedSpecAndView.
  4209         spec := specAndView first.
  4210         spec notNil ifTrue:[
  4211             usefulReplacementSpecClasses := spec usefulReplacementSpecClasses.
  4212             usefulReplacementSpecClasses notEmptyOrNil ifTrue:[
  4213                 m addSeparator.
  4214                 usefulReplacementSpecClasses do:[:eachClass |      
  4215                     |item|
  4216 
  4217                     item := MenuItem  
  4218                                 label:(resources string:'Replace by %1' with:eachClass userFriendlyName)
  4219                                 itemValue:#replaceWidgetByClass: argument:eachClass.
  4220                     item translateLabel:false.
  4221                     m addItem:item.
  4222                 ].
  4223             ].
  4224         ].
  4225 
  4226         m findGuiResourcesIn:self.
  4227         m
  4228       ].
  4229 
  4230     "Modified: / 09-09-2012 / 13:25:09 / cg"
  4231 ! !
  4232 
  4233 !UIPainter methodsFor:'private'!
  4234 
  4235 acceptOrIgnoreSectionModification
  4236     self isModified ifTrue:[
  4237         (self confirm:'Accept changes made to spec ?') ifTrue:[
  4238             self accept
  4239         ]
  4240     ].
  4241 
  4242     "Created: / 12-01-2008 / 10:31:20 / cg"
  4243 !
  4244 
  4245 askForModification
  4246     "asks for window spec modification"
  4247 
  4248     |painter|
  4249 
  4250     painter := self painter.
  4251 
  4252     self askForSectionModification.    
  4253 
  4254     (modified or: [painter isModified or: [self helpTool modified]])
  4255     ifTrue:[
  4256         ((YesNoBox title:(resources string:'Window spec was modified. Exit anyway?'))        
  4257             noText:(resources string:'Cancel');
  4258             yesText:(resources string:'Discard Changes and Exit');
  4259             showAtPointer;
  4260             accepted) ifFalse: [^false].
  4261         self clearModified.
  4262         painter resetModification
  4263     ].
  4264     ^ true
  4265 
  4266     "Modified: / 20.5.1998 / 02:03:16 / cg"
  4267 !
  4268 
  4269 askForSaving
  4270     "asks for defining an application class"
  4271 
  4272     self askForSectionModification.    
  4273 
  4274     ((YesNoBox title:'No application class defined yet!!')        
  4275         noText:'Cancel';
  4276         yesText:'Define';
  4277         showAtPointer;
  4278         accepted) ifFalse: [^false].
  4279 
  4280     self doSave.
  4281 
  4282     ^true
  4283 !
  4284 
  4285 askForSectionModification
  4286     "asks for section modification in the notebook"
  4287 
  4288     self isModified ifTrue:[
  4289         (self confirm:'Accept modifications in section ' , tabSelection printString allBold, '?') ifTrue:[
  4290             self accept
  4291         ] ifFalse: [
  4292             self cancel
  4293         ]
  4294     ]
  4295 !
  4296 
  4297 checkClassAndSelector
  4298     "checks for class & superclass"
  4299 
  4300     |superclass cls|
  4301 
  4302     specClassName isNil ifTrue:[^ false].
  4303 
  4304     cls := self resolveName:specClassName.
  4305 
  4306     cls isNil ifTrue:[
  4307         superclass := self resolveName:specSuperclassName.
  4308 
  4309         superclass isNil ifTrue:[
  4310             self warn:'No class named ' , specSuperclassName , ' exists!!'.
  4311             ^ false.
  4312         ].
  4313 
  4314         (self confirm:'Create class ' , specClassName allBold, '?') ifTrue:[
  4315             cls := superclass 
  4316                         subclass:(specClassName asSymbol)
  4317                         instanceVariableNames:''
  4318                         classVariableNames:''
  4319                         poolDictionaries:''
  4320                         category:'Applications'.
  4321 
  4322             cls name ~= specClassName ifTrue:[
  4323                 self information:'Created new class is ' , cls name.
  4324                 specClassName := cls name
  4325             ].
  4326             ^ true.
  4327         ].
  4328         ^ false.
  4329     ].
  4330     cls isBehavior ifFalse:[
  4331         self warn:'A global named ' , specClassName , ' exists, but it is no class.'.
  4332         ^ false.
  4333     ].
  4334 
  4335     specSuperclassName isBehavior ifFalse:[
  4336         specSuperclassName notEmptyOrNil ifTrue:[
  4337             superclass := self resolveName:specSuperclassName
  4338         ] ifFalse:[
  4339             specSuperclassName := nil.
  4340         ]
  4341     ] ifTrue:[
  4342         superclass := specSuperclassName
  4343     ].
  4344 
  4345     specSuperclassName notNil ifTrue:[
  4346         superclass isNil ifTrue:[
  4347             self warn:'No class named ' , specSuperclassName , ' exists!!'.
  4348             ^ false.
  4349         ].
  4350 
  4351         (cls isSubclassOf:superclass) ifFalse:[
  4352             self information:('A global named ' , specClassName , ' exists,\' ,
  4353                               'but is not a subclass of ' , superclass name , '.\\' ,
  4354                               'Check and try again if that is not what you want.') withCRs.
  4355         ]
  4356     ].
  4357 
  4358     superclass isNil ifTrue:[
  4359         cls notNil ifTrue:[
  4360             specSuperclassName := cls superclass name
  4361         ]
  4362     ].
  4363 
  4364     ^ true
  4365 
  4366     "Modified: 12.8.1997 / 23:39:10 / cg"
  4367 !
  4368 
  4369 createToolApplication:anApplicationClass spec:aSpec in:aView
  4370     |appl applBuilder applWindow|
  4371 
  4372     appl := anApplicationClass new.
  4373     appl createBuilder.
  4374     applBuilder := appl builder.
  4375 
  4376     applWindow  := ApplicationSubView origin:0.0@0.0 corner:1.0@1.0 in:aView.
  4377     applWindow level:0.
  4378     applWindow hiddenOnRealize:true.
  4379 
  4380     appl masterApplication:self.
  4381     applBuilder window:applWindow.
  4382     applWindow client:appl spec:aSpec builder:applBuilder.
  4383     appl modifiedHolder:(self modifiedChannel).
  4384     applBuilder window:applWindow.
  4385 
  4386     ^ appl
  4387 !
  4388 
  4389 hideUIView:aView
  4390     "hides the view which is an application or top view"
  4391 
  4392     aView beIndependent.
  4393     aView unmap.
  4394 !
  4395 
  4396 raiseTabView
  4397     |tool|
  4398 
  4399              self isLayoutToolSelected ifTrue:[tool := layoutTool ]
  4400     ifFalse:[self isHelpToolSelected   ifTrue:[tool := helpTool   ]
  4401     ifFalse:[
  4402         tool := specTool.
  4403         tool notNil ifTrue:[
  4404             ApplicationClassQuery answer:specClass do:[
  4405                     "/ the spectool needs to know, in which nameSpace the application class is located, to find out
  4406                     "/ how to resolve short majorKeys...
  4407                     UISpecification uiMajorKeyBindingNameSpaceQuery 
  4408                         answer:(specClass notNil ifTrue:[specClass nameSpace] ifFalse:Smalltalk)
  4409                         do:[
  4410                             specTool selection:tabSelection 
  4411                         ].
  4412                 ].
  4413         ].
  4414     ]].
  4415 
  4416     (Array with:helpTool with:layoutTool with:specTool) do:[:aTool|
  4417         aTool ~~ tool ifTrue:[
  4418             aTool window beInvisible.
  4419         ].
  4420     ].
  4421     tool notNil ifTrue:[
  4422         tool window beVisible.
  4423     ].
  4424 !
  4425 
  4426 raiseUIView:aView
  4427     "raise the view which is an application or top view"
  4428 
  4429     aView remap.
  4430     aView bePartner.
  4431 !
  4432 
  4433 setClass:cls selector:selector
  4434     "sets the specClass and the specSelector under which the window spec should be saved"
  4435 
  4436     |clsName superClassName|
  4437 
  4438     clsName := cls name.
  4439     superClassName := cls superclass name.
  4440 
  4441     (self aspectFor:#classNameChannel) value:clsName.
  4442     (self aspectFor:#methodNameChannel) value:(selector ? '').
  4443     (self aspectFor:#superclassNameChannel) value:superClassName.
  4444 
  4445     self painter 
  4446             className:clsName 
  4447             superclassName:superClassName
  4448             selector:(selector ? '').
  4449 
  4450     self specClass:clsName.
  4451     specSelector := (selector ? '').
  4452     specSuperclassName := superClassName.
  4453 
  4454     (specClassName notNil and:[ selector notNil ]) ifTrue:[
  4455         self addHistoryEntryForClass:specClass selector:specSelector.
  4456         self updateInfoLabel
  4457     ].
  4458 
  4459     "Modified: / 05-02-1998 / 09:44:58 / stefan"
  4460     "Modified: / 31-08-2006 / 10:14:49 / cg"
  4461 !
  4462 
  4463 setViewInLayoutTool:aView spec:aSpec
  4464     "sets view for layout tool"
  4465 
  4466     |type|
  4467 
  4468     self painter topView == aView ifTrue:[
  4469         type := #Extent
  4470     ] ifFalse:[
  4471         self canvas == aView ifTrue:[
  4472             type := #Extent
  4473         ]
  4474     ].
  4475     self layoutTool layoutView:aView type:type spec:aSpec
  4476 !
  4477 
  4478 specClass
  4479     specClass isNil ifTrue:[
  4480         specClassName notNil ifTrue:[
  4481             specClass := Smalltalk classNamed:specClassName.
  4482             self canInstallAsWebPageHolder value:self canInstallAsWebPage.
  4483         ]
  4484     ].
  4485     ^ specClass
  4486 
  4487     "Created: / 31-08-2006 / 10:08:43 / cg"
  4488     "Modified: / 14-01-2008 / 17:39:32 / cg"
  4489 !
  4490 
  4491 specClass:aClassOrClassName
  4492     "sets the specClass and updates the Help Tool"
  4493 
  4494     aClassOrClassName isBehavior 
  4495         ifTrue: [ specClass := aClassOrClassName.
  4496                   specClassName := aClassOrClassName name ]
  4497         ifFalse:[ specClass := Smalltalk classNamed:aClassOrClassName.
  4498                   specClassName := aClassOrClassName ].
  4499 
  4500     self canInstallAsWebPageHolder value:self canInstallAsWebPage.
  4501     self helpTool loadFromClass:specClass.    
  4502     self clearModifiedFlag.
  4503 
  4504     "Modified: / 14-01-2008 / 17:39:08 / cg"
  4505 ! !
  4506 
  4507 !UIPainter methodsFor:'private-tools'!
  4508 
  4509 canvas
  4510     "returns the canvas view"
  4511 
  4512     UseViewScroller == true ifTrue:[
  4513         ^ painter.
  4514     ].
  4515 
  4516     ^ painter topView.
  4517 "/    ^ treeView canvas
  4518 
  4519     "Modified: / 05-09-2006 / 18:36:32 / cg"
  4520 !
  4521 
  4522 helpTool
  4523     "returns the help tool"
  4524 
  4525     helpTool isNil ifTrue:[self noteBookView].
  4526   ^ helpTool
  4527 !
  4528 
  4529 layoutTool
  4530     "returns the layout tool"
  4531 
  4532     layoutTool isNil ifTrue:[self noteBookView].
  4533   ^ layoutTool
  4534 !
  4535 
  4536 painter
  4537     "returns the canvas view"
  4538 
  4539     ^ painter.
  4540 "/    ^ treeView canvas
  4541 
  4542     "Modified: / 05-09-2006 / 18:36:32 / cg"
  4543 !
  4544 
  4545 specTool
  4546     "returns the spec tool"
  4547 
  4548     specTool isNil ifTrue:[self noteBookView].
  4549   ^ specTool
  4550 ! !
  4551 
  4552 !UIPainter methodsFor:'queries'!
  4553 
  4554 canPaste
  4555     |clipboard sel|
  4556 
  4557     clipboard := painterView getClipboardObject.
  4558 
  4559     (clipboard isCollection 
  4560     and:[ clipboard notEmptyOrNil ]) 
  4561             ifTrue:[sel := clipboard first]
  4562             ifFalse:[sel := clipboard].
  4563 
  4564     ^ (sel isKindOf:UISpecification) 
  4565 "/                    and:[treeSelection size  = 1 
  4566 "/                    and:[treeSelection first == 1 
  4567 "/                         or: [self canPasteInto: treeView selectedNode contents view]]]
  4568 !
  4569 
  4570 hasSpecClass
  4571     "answers whether an application class is defined"
  4572 
  4573     ^ (self resolveName:specClassName) notNil
  4574 !
  4575 
  4576 hasSpecClassAndSelector
  4577     "answers whether an application class and a selector under which
  4578      the window spec is stored is defined"
  4579 
  4580     specSelector size > 1 ifTrue:[
  4581         ^ self hasSpecClass
  4582     ].
  4583     ^ false
  4584 !
  4585 
  4586 isEditingSpecOnly
  4587     ^ self isNotEditingSpecOnly not
  4588 !
  4589 
  4590 isHelpToolSelected
  4591     "answers whether the current selected section in the noteBook is the Help Tool"
  4592 
  4593     ^ tabSelection = UIHelpTool label
  4594 !
  4595 
  4596 isLayoutToolSelected
  4597     "answers whether the current selected section in the noteBook is the Layout Tool"
  4598 
  4599     ^ tabSelection = UILayoutTool label
  4600 !
  4601 
  4602 isModified
  4603     "answers whether the current window spec or a layout is modified"
  4604 
  4605     ^ self modifiedChannel value
  4606 !
  4607 
  4608 isNotEditingSpecOnly
  4609     ^ true
  4610 !
  4611 
  4612 isPainterEnabled
  4613     "answers whether I am running in test mode"
  4614 
  4615     ^ self painter enabled
  4616 !
  4617 
  4618 isUIPainter
  4619     ^ true
  4620 !
  4621 
  4622 listOfAspects
  4623     ^ self painter listOfAspects
  4624 
  4625     "Created: / 12-01-2008 / 19:24:51 / cg"
  4626 !
  4627 
  4628 listOfCallbacks
  4629     ^ self painter listOfCallbacks
  4630 
  4631     "Created: / 12-01-2008 / 19:25:09 / cg"
  4632 ! !
  4633 
  4634 !UIPainter methodsFor:'selection'!
  4635 
  4636 askForUnsavedModifications
  4637     |whatToDo|
  4638 
  4639     self isModified ifFalse:[^ true].
  4640 
  4641     whatToDo := DialogBox 
  4642                     confirmWithCancel:'Accept modifications in section ' , tabSelection printString allBold, ' ?'
  4643                     labels:#('Cancel' 'Ignore' 'Accept')
  4644                     default:3.
  4645     whatToDo isNil ifTrue:[^ false].
  4646     whatToDo == true ifTrue:[
  4647         self accept
  4648     ] ifFalse:[
  4649         self cancel
  4650     ].
  4651 
  4652     ^ true
  4653 !
  4654 
  4655 copySelection
  4656     self painter copySelection.
  4657     self updateChannels.
  4658 !
  4659 
  4660 selectedSpec
  4661     |specAndView|
  4662 
  4663     specAndView := self selectedSpecAndView.
  4664     ^ specAndView first
  4665 !
  4666 
  4667 selectedSpecAndView
  4668     |spec view property|
  4669 
  4670     treeView isCanvasSelected ifTrue:[
  4671         spec := treeView canvasSpec.
  4672         view := self canvas. "/ self painter topView.
  4673     ] ifFalse:[
  4674         (property := treeView propertySelected) notNil ifTrue:[
  4675             treeView canResizeSelectedWidget ifTrue:[
  4676                 view := property view.
  4677             ].
  4678             spec := property spec copy.
  4679         ]
  4680     ].
  4681     ^ Array with:spec with:view
  4682 !
  4683 
  4684 tabSelection
  4685     "returns the label of the current section in the notebook"
  4686 
  4687     ^ tabSelection
  4688 !
  4689 
  4690 tabSelection:something
  4691     "called whenever the section of the notebook has changed"
  4692 
  4693     (something isNil or:[tabSelection = something]) ifTrue:[
  4694         ^ self
  4695     ].
  4696 
  4697     self isModified ifTrue:[
  4698         self autoAcceptOnSelectionChange value ifTrue:[
  4699             self accept
  4700         ] ifFalse:[
  4701             self askForUnsavedModifications ifFalse:[^ self].
  4702         ].
  4703     ].
  4704     tabSelection := something.
  4705     self raiseTabView.
  4706     self cancel.
  4707 !
  4708 
  4709 treeSelectionChanged
  4710     "called whenever the selection of the treeview has changed"
  4711 
  4712     |specAndView view spec|
  4713 
  4714     self askForUnsavedModifications ifFalse:[^ self].
  4715 "/    self isModified ifTrue:[
  4716 "/        (self confirm:'Accept modifications in section ' , tabSelection printString asBoldText, '?') ifTrue:[
  4717 "/            self accept
  4718 "/        ]
  4719 "/    ].
  4720 
  4721     specAndView := self selectedSpecAndView.
  4722     spec := specAndView first.
  4723     view := specAndView last.
  4724 
  4725     self setViewInLayoutTool:view spec:spec.
  4726     self specTool specification:spec.
  4727 
  4728     self updateSlicesForSpec:spec andView:view.
  4729     self clearModifiedFlag.
  4730     self updateChannels.
  4731 !
  4732 
  4733 updateSlicesForSpec:spec andView:view
  4734     "fetch slices-info from the spec; add help and geometry slices manually"
  4735 
  4736     |slices "size" list tabComponent|
  4737 
  4738     tabComponent := self componentAt:#noteBook.
  4739 
  4740     spec notNil ifTrue:[
  4741         self helpTool helpKey:(spec activeHelpKey).
  4742         slices := spec class slices.
  4743 
  4744         list := slices collect:[:eachSlice | eachSlice first asString].
  4745         self treeView isCanvasSelected ifFalse:[
  4746             list := list copyWith:(UIHelpTool label)
  4747         ].
  4748         view notNil ifTrue:[
  4749             "/ for now, keep it as an empty slice;
  4750             "/ better when toggling as we do not loos the 'geometry' selection.
  4751             "/ slices notebook should remember the last 'explicit' selected tab.
  4752             true "spec hasLayout" ifTrue:[
  4753                 list := list copyWith:UILayoutTool label.
  4754             ]
  4755         ].
  4756 
  4757 "/        size   := slices size.
  4758 "/        view notNil ifTrue:[
  4759 "/            self treeView isCanvasSelected ifFalse:[
  4760 "/                list := Array new:(size + 2).
  4761 "/                list at:(size + 2) put:(UILayoutTool label).
  4762 "/            ] ifTrue:[
  4763 "/                list := Array new:(size + 1).
  4764 "/                list at:(size + 1) put:(UILayoutTool label).
  4765 "/            ].
  4766 "/        ] ifFalse:[
  4767 "/            list := Array new:(size + 1).
  4768 "/        ].
  4769 "/
  4770 "/        1 to:size do:[:i| list at:i put:((slices at:i) first asString)].
  4771 "/        self treeView isCanvasSelected ifFalse: [
  4772 "/            list at:(size + 1) put:(UIHelpTool label)
  4773 "/        ].
  4774 
  4775         self tabList value:list.
  4776         self showHelp:spec class name for:self.
  4777         tabComponent enabled:true.
  4778 
  4779         (tabSelection := tabComponent selection) isNil ifTrue:[
  4780             tabComponent setSelection:(tabSelection := list first)
  4781         ].
  4782         self raiseTabView
  4783     ] ifFalse:[
  4784         self helpTool helpKey:nil.
  4785         tabComponent enabled:false.
  4786         self defaultInfoLabel.
  4787     ].
  4788 ! !
  4789 
  4790 !UIPainter methodsFor:'settings'!
  4791 
  4792 generateAspectsAsInstanceVariables
  4793     "if on, aspects are held as instance variables;
  4794      if off (the default), they are kept in the bindings dictionary."
  4795 
  4796     ^ UIPainterView generateAspectsAsInstanceVariables
  4797 
  4798     "Created: / 29-07-1998 / 11:17:59 / cg"
  4799     "Modified: / 12-01-2008 / 10:37:43 / cg"
  4800 !
  4801 
  4802 generateAspectsAsInstanceVariables:aBoolean
  4803     "if on, aspects are held as instance variables;
  4804      if off (the default), they are kept in the bindings dictionary."
  4805 
  4806     ^ UIPainterView generateAspectsAsInstanceVariables:aBoolean
  4807 
  4808     "Created: / 29.7.1998 / 11:18:20 / cg"
  4809 !
  4810 
  4811 generateCommentedCode
  4812     "comments in generated aspect methods; yes or no."
  4813 
  4814     ^ UIPainterView generateCommentedCode
  4815 
  4816     "Created: / 12-01-2008 / 10:34:14 / cg"
  4817 !
  4818 
  4819 generateCommentedCode:aBoolean
  4820     "comments in generated aspect methods; yes or no."
  4821 
  4822     UIPainterView generateCommentedCode:aBoolean
  4823 
  4824     "Created: / 12-01-2008 / 10:23:10 / cg"
  4825 !
  4826 
  4827 redefineAspectMethods
  4828     "redefine methods yes or no.
  4829      If a method is defined in super class should the message be reinstalled ?"
  4830 
  4831     ^ UIPainterView redefineAspectMethods
  4832 
  4833     "Modified: / 12-01-2008 / 10:34:07 / cg"
  4834 !
  4835 
  4836 redefineAspectMethods:aBoolean
  4837     "redefine methods yes or no.
  4838      If a method is defined in super class should the message be reinstalled ?"
  4839 
  4840     UIPainterView redefineAspectMethods:aBoolean
  4841 
  4842     "Modified: / 12-01-2008 / 10:23:20 / cg"
  4843 ! !
  4844 
  4845 !UIPainter methodsFor:'startup & release'!
  4846 
  4847 closeRequest
  4848     "asks for permission before closing"
  4849 
  4850     self askForModification ifFalse:[^self].
  4851 
  4852     super closeRequest.
  4853 
  4854     painterView notNil ifTrue:[
  4855         painterView masterApplication:nil.
  4856         painterView closeRequest.
  4857     ].
  4858     treeView notNil ifTrue:[
  4859         treeView model removeDependent:self.
  4860     ].
  4861     selectionPanel notNil ifTrue:[
  4862         selectionPanel masterApplication:nil.
  4863         selectionPanel closeRequest
  4864     ].
  4865     "/ selectionPanel := nil.
  4866     "/ treeView       := nil.
  4867 !
  4868 
  4869 closeRequestFor:aTopView
  4870     "handles a close request for a specific view"
  4871 
  4872     |topView|
  4873 
  4874     (topView := self window) == aTopView ifTrue:[
  4875         super closeRequestFor:aTopView
  4876     ] ifFalse:[
  4877         aTopView = selectionPanel window ifTrue:[
  4878             self galleryShown value:false
  4879         ] ifFalse:[
  4880             aTopView == (self painter topView) ifTrue:[
  4881                 self painterShown value:false
  4882             ] ifFalse:[
  4883                 aTopView closeRequest
  4884             ]
  4885         ].
  4886         topView raise.
  4887     ].
  4888 !
  4889 
  4890 commonPostBuild
  4891     "sets the root of the tree view as first selection;
  4892      sets the grid parameters, if defined"
  4893 
  4894     |cls sel|
  4895 
  4896     cls := self specClass.
  4897     sel := specSelector.
  4898     cls notNil ifTrue:[
  4899         self setClass:cls selector:sel.
  4900 
  4901         (cls respondsTo:sel) ifTrue:[  
  4902             self painter setupFromSpec:(cls perform:sel).
  4903         ]
  4904     ].
  4905 
  4906     self autoAcceptOnSelectionChange addDependent:self.
  4907     self autoAcceptOnSelectionChange value ifTrue:[
  4908         (builder componentAt:'acceptButton') label:(resources string:'Apply')
  4909     ].
  4910 
  4911     "/ using masters infoHolder ?
  4912     self useAlienInfoLabel ifTrue:[
  4913         (builder componentAt:#mainPanel) layout bottomOffset:0.
  4914         (builder componentAt:#infoBarSubSpec) beInvisible
  4915     ].
  4916 
  4917     self updateInfoLabel.
  4918 
  4919     "Modified: / 31-08-2006 / 10:12:53 / cg"
  4920     "Modified: / 20-02-2018 / 13:04:34 / stefan"
  4921 !
  4922 
  4923 loadFromClass:aClass andSelector:selector
  4924     "loads a window spec by evaluating aMessageString
  4925      (which is something like 'fooClass windowSpec')"
  4926 
  4927     self assert:(aClass isNil or:[aClass isClass]).
  4928 
  4929     self askForModification ifFalse:[^ self].
  4930 
  4931     self setClass:aClass selector:selector.    
  4932 
  4933     (aClass respondsTo:selector) ifTrue:[   
  4934         self loadFromSpec:(aClass perform:selector).
  4935     ]
  4936 !
  4937 
  4938 loadFromMessage:classAndSelector
  4939     "loads a window spec by evaluating aMessageString
  4940      (which is something like 'fooClass windowSpec')"
  4941 
  4942     self askForModification ifFalse:[^ self].
  4943 
  4944     classAndSelector notNil ifTrue:[
  4945         self 
  4946             loadFromClass:classAndSelector methodClass 
  4947             andSelector:classAndSelector methodSelector
  4948     ]
  4949 !
  4950 
  4951 loadFromSpec:aSpec
  4952     "loads a window spec proper"
  4953 
  4954     self askForModification ifFalse:[^ self].
  4955 
  4956     self painter setupFromSpec:aSpec.
  4957 !
  4958 
  4959 openInterface:aSymbol 
  4960     "in addition to opening my interface, also open up a gallery and a painter"
  4961     
  4962     |topView|
  4963 
  4964     self setupSpecClassAndSelector.
  4965 
  4966 "/    treeView := TreeView new.
  4967 "/    treeView windowSpecClass:(self defaultWindowSpecClass).
  4968 "/    treeView 
  4969 "/        selectConditionBlock:[:newSelection | self selectionChangeAllowed:newSelection ].
  4970 
  4971 "/    painterView := StandardSystemView new.
  4972 "/    name := name ? UIPainter defaultNameOfCanvas.
  4973 "/    painterView beToolWindow.
  4974 "/    painterView name:name.
  4975 "/    painterView label:name.
  4976 "/    painterView extent:(treeView windowSpecClass defaultExtentInUIPainter).
  4977 "/    painter := UIPainterView in:painterView.
  4978 "/    painter layout:(0.0 @ 0.0 corner:1.0 @ 1.0) asLayout.
  4979 "/    treeView := treeView canvas:painter specName:name.
  4980 "/    painter treeView:treeView.
  4981 "/    treeView model addDependent:self.
  4982 "/    painter enableChannel:(self enableChannel).
  4983 
  4984     super openInterface:aSymbol.
  4985 
  4986     topView := self window.
  4987     topView label:'GUI Painter'.
  4988 
  4989 "/    self setupCanvasAndSelectionPanel.
  4990 "/
  4991 "/    selectionPanel window waitUntilVisible.
  4992 "/    painterView window waitUntilVisible.
  4993 "/    self window waitUntilVisible.
  4994 "/    [ Delay waitForSeconds:0.5. self window topView raise ] fork.
  4995 
  4996     "Modified: / 31-08-2006 / 10:13:16 / cg"
  4997 !
  4998 
  4999 openOnClass:aClass
  5000     "opens the GUI Painter on aClass and #windowSpec"
  5001 
  5002     self openOnClass:aClass andSelector:#windowSpec
  5003 !
  5004 
  5005 openOnClass:aClass andSelector:aSelector
  5006     "opens the GUI Painter on aClass and aSelector"
  5007 
  5008     aClass isNil ifTrue:[
  5009         (self confirm:'No class given to the GUI Painter (class was probably renamed?)\\Open anyway (to create a new window spec) ?' withCRs)
  5010         ifFalse:[^ nil].
  5011     ].
  5012 
  5013     specSelector := aSelector.
  5014     specClass := aClass.
  5015     specClassName := aClass name.
  5016 
  5017     self openInterface.
  5018 
  5019 "/    specSelector := aSelector.
  5020 "/    specClass := aClass.
  5021 
  5022     "Modified: / 31-08-2006 / 10:13:31 / cg"
  5023 !
  5024 
  5025 postBuildWith: aBuilder
  5026     super postBuildWith:aBuilder.
  5027 
  5028     (self toolBarVisibleHolder value 
  5029     or:[ self editToolBarVisibleHolder value ]) ifTrue:[ self toolBarVisibilityChanged ].
  5030 
  5031     "Created: / 18-02-2007 / 15:03:08 / cg"
  5032 
  5033     self setupPainter.
  5034 
  5035     "Modified: / 22.8.1998 / 17:41:34 / cg"
  5036 !
  5037 
  5038 postOpenWith: aBuilder
  5039     "spread the painter and gallery views on the screen"
  5040 
  5041     |myWindow canvasWindow canvasOrg galleryWindow 
  5042      galleryOrg windowGroup monitorBounds myViewRectangle|
  5043 
  5044     super postOpenWith:aBuilder.
  5045 
  5046     windowGroup := self topApplication windowGroup.
  5047     windowGroup addPreEventHook:self.
  5048 
  5049     treeView selection: #(1).
  5050     aBuilder keyboardProcessor menuBar:nil.
  5051 
  5052     myWindow := self window.
  5053     canvasWindow := self painter topView.
  5054     [selectionPanel isNil] whileTrue:[
  5055         Delay waitForSeconds:0.1.
  5056     ].
  5057 
  5058     galleryWindow := selectionPanel window.
  5059 
  5060     "/ try to lay out things non-overlapping
  5061     "/ but only, if the window manager placed all windows
  5062     "/ on top of each other
  5063     "/ make sure, that all the windows are on the same physical monitor
  5064     monitorBounds := device monitorBoundsAt:self window origin.
  5065     myViewRectangle := myWindow screenBounds.
  5066     (myViewRectangle intersects:galleryWindow screenBounds) ifTrue:[
  5067         galleryOrg := (monitorBounds right - galleryWindow width - 20) 
  5068                       @ 
  5069                       ((myWindow bottom + 20) min:(monitorBounds bottom - galleryWindow height - 20)).
  5070         galleryWindow 
  5071             origin:galleryOrg;
  5072             raise.
  5073     ].
  5074     ((myViewRectangle intersects:canvasWindow screenBounds)
  5075      or:[galleryWindow screenBounds intersects:canvasWindow screenBounds])ifTrue:[          
  5076         canvasOrg := monitorBounds origin + (10@20).
  5077         canvasWindow 
  5078             origin:canvasOrg;
  5079             raise.
  5080     ].
  5081 
  5082     self setupCanvasAndSelectionPanel.
  5083 
  5084 "/    selectionPanel window waitUntilVisible.
  5085 "/    painterView window waitUntilVisible.
  5086 "/    self window waitUntilVisible.
  5087     [   
  5088         Delay waitForSeconds:0.1. 
  5089         myWindow topView raise.
  5090         Delay waitForSeconds:0.25. 
  5091         myWindow topView raise 
  5092     ] fork.
  5093     "Modified: / 13.7.1999 / 21:26:52 / cg"
  5094 !
  5095 
  5096 release
  5097     super release.
  5098 
  5099     painterView notNil ifTrue:[
  5100         painterView destroy.
  5101     ].
  5102     selectionPanel notNil ifTrue:[
  5103         selectionPanel masterApplication:nil.
  5104         selectionPanel window destroy
  5105     ].
  5106     selectionPanel := nil.
  5107     treeView       := nil.
  5108     painterView    := nil.
  5109 !
  5110 
  5111 selectionPanelClass
  5112     ^ SelectionPanelClass
  5113 !
  5114 
  5115 setupCanvasAndSelectionPanel
  5116     |topView galleryWindow icon|
  5117 
  5118     painterView isOpen ifTrue:[
  5119         ^ self.
  5120     ].
  5121 
  5122     icon := self class builderIcon.
  5123 
  5124     topView := self window.
  5125 
  5126     painterView openInGroup:(topView windowGroup).
  5127     painterView application:self.
  5128 
  5129     galleryWindow := selectionPanel window.
  5130     galleryWindow beToolWindow.
  5131     galleryWindow openInGroup:(topView windowGroup).
  5132 
  5133     selectionPanel masterApplication:self.
  5134 
  5135     topView iconLabel:'GUI Painter'.
  5136     topView icon:icon.
  5137     painterView iconLabel:'GUI Canvas'.
  5138     painterView icon:icon.
  5139     galleryWindow iconLabel:'GUI Gallery'.
  5140     galleryWindow icon:icon.
  5141     
  5142     topView isModal ifFalse:[
  5143         topView bePartner.
  5144         painterView bePartner.
  5145         galleryWindow bePartner.
  5146     ]
  5147 !
  5148 
  5149 setupPainter
  5150     "sets the painter's grid parameters, if defined"
  5151 
  5152     |painter settings gridPara hspace vspace|
  5153 
  5154     painter  := self painter.
  5155     settings := self class settings.
  5156     gridPara := painter gridParameters copy.
  5157     hspace   := settings at: #HGridSpace ifAbsent:10.
  5158     vspace   := settings at: #VGridSpace ifAbsent:10.
  5159     gridPara at:1 put:hspace; at:2 put:vspace; at:5 put:hspace; at:6 put:vspace.
  5160     painter gridParameters:gridPara.
  5161     painter gridShown: (settings at: #GridShown ifAbsent:false).
  5162     painter gridAlign: (settings at: #GridAlign ifAbsent:false).
  5163     painter shown ifTrue:[painter clearView].
  5164 
  5165     "Modified: / 22.8.1998 / 17:41:34 / cg"
  5166 !
  5167 
  5168 setupSpecClassAndSelector
  5169     |cls name|
  5170 
  5171     self specClass notNil ifTrue:[
  5172         specClassName isBehavior ifTrue:[
  5173             name := specClassName nameWithoutPrefix.
  5174         ] ifFalse:[
  5175             name := specClassName printString string
  5176         ]
  5177     ].
  5178     (aspects at:#classNameChannel) value:(specClassName ? 'NewApplication').
  5179 
  5180     specSuperclassName isNil ifTrue:[
  5181         specClassName notNil ifTrue:[
  5182             (cls := self resolveName:specClassName) notNil ifTrue:[
  5183                 specSuperclassName := cls superclass name.
  5184             ]
  5185         ]
  5186     ].
  5187     aspects at:#superclassNameChannel
  5188         put:((specSuperclassName notNil 
  5189                 ifTrue:[ specSuperclassName ]
  5190                 ifFalse:[ 'ApplicationModel' ]) asValue).
  5191     aspects at:#superclassNameDefaults
  5192         put:#( 'ApplicationModel' 'SimpleDialog' 'WebApplicationModel') asValue.
  5193     aspects at:#methodNameChannel
  5194         put:((specSelector notNil 
  5195                 ifTrue:[ specSelector asValue ]
  5196                 ifFalse:[ #windowSpec ]) asValue).
  5197 
  5198     "Modified: / 16-01-2008 / 10:44:55 / cg"
  5199 ! !
  5200 
  5201 !UIPainter methodsFor:'user actions'!
  5202 
  5203 accept
  5204     "accepts all modifications done to the attributes of the current section"
  5205 
  5206     |painter layout spec layoutTool layoutView t|
  5207 
  5208     self acceptChannel value:true; value:false.  "/ force editFields to accept
  5209     self clearModifiedFlag.
  5210 
  5211     painter := self painter.
  5212     spec := self specTool specification.
  5213 
  5214     self isLayoutToolSelected ifTrue:[
  5215         layoutTool := self layoutTool.
  5216 
  5217         (layout := layoutTool layout) notNil ifTrue:[
  5218             "/ cg->ca: the following code should be moded to the layoutTool
  5219             "/ (i.e. layoutTool saveInSpec:spec).
  5220 
  5221             layoutTool layoutType == #Extent ifTrue:[
  5222                 layoutView := layoutTool layoutView.
  5223 
  5224                 layoutView == self canvas ifTrue:[
  5225                     layoutView extent:layout.
  5226                     UseViewScroller == true ifTrue:[
  5227                         layoutView container container sizeChanged:nil.
  5228                     ].
  5229                 ] ifFalse:[
  5230                     spec useDefaultExtent:(layoutTool aspectValueFor:#useDefaultExtent).
  5231                     spec useDefaultExtent ifTrue:[
  5232                         "/ temporarily unfreeze the widgets size
  5233                         "/ (but remember, the old setting, which is actually
  5234                         "/ controlled by the resizeForLabel attribute)
  5235                         t := layoutView sizeFixed.
  5236                         layoutView sizeFixed:false.
  5237                         layout := layoutView preferredExtent.    
  5238                         layoutView sizeFixed:t.
  5239                     ].
  5240                     spec usePreferredWidth:(layoutTool aspectValueFor:#usePreferredWidth).
  5241                     spec usePreferredHeight:(layoutTool aspectValueFor:#usePreferredHeight).
  5242                     spec useDynamicPreferredWidth:(layoutTool aspectValueFor:#useDynamicPreferredWidth).
  5243                     spec useDynamicPreferredHeight:(layoutTool aspectValueFor:#useDynamicPreferredHeight).
  5244                     painter setExtent:layout.
  5245                     painter updateFromSpec:spec.
  5246                 ]
  5247             ] ifFalse:[
  5248                 spec useDefaultExtent:false.
  5249                 spec usePreferredWidth:(layoutTool aspectValueFor:#usePreferredWidth).
  5250                 spec usePreferredHeight:(layoutTool aspectValueFor:#usePreferredHeight).
  5251                 spec useDynamicPreferredWidth:(layoutTool aspectValueFor:#useDynamicPreferredWidth).
  5252                 spec useDynamicPreferredHeight:(layoutTool aspectValueFor:#useDynamicPreferredHeight).
  5253                 layoutTool layoutType == #LayoutFrame ifTrue:[
  5254                     spec keepSpaceForOSXResizeHandleH:(layoutTool aspectValueFor:#keepSpaceForOSXResizeHandleH).
  5255                     spec keepSpaceForOSXResizeHandleV:(layoutTool aspectValueFor:#keepSpaceForOSXResizeHandleV).
  5256                 ].
  5257                 painter setLayout:layout.
  5258                 spec layout:layout.
  5259                 painter updateFromSpec:spec.
  5260             ].
  5261         ]
  5262     ] ifFalse:[
  5263         self isHelpToolSelected ifTrue:[
  5264             self helpTool accept.      
  5265             spec activeHelpKey:self helpTool helpKey.
  5266         ].      
  5267         painter updateFromSpec:spec
  5268     ].
  5269 
  5270     self clearModified
  5271 !
  5272 
  5273 addWidget: aSpecClassSymbol
  5274     "adds a widget from aSpecClass to the current widget"
  5275 
  5276     self addWidgetOfSpec: (Array with: (Smalltalk at: aSpecClassSymbol) new)
  5277 !
  5278 
  5279 addWidgetOfSpec: aSpec
  5280     "adds a widget from aSpec to the current widget"
  5281 
  5282     |newSel|
  5283 
  5284     (newSel := painter pasteSpecifications:aSpec keepLayout:false at:0@0) notNil
  5285     ifTrue:[
  5286         painter select: newSel
  5287     ] ifFalse:[   
  5288         ((treeView selection size = 0) or: [treeView selectedNode isNil])
  5289         ifTrue:[                          
  5290             treeView selection: #(1).
  5291         ] ifFalse:[  
  5292             treeView selectNode: (treeView detectNode: [:n| n = treeView selectedNode parent])
  5293         ].
  5294         self addWidgetOfSpec: aSpec
  5295     ]
  5296 
  5297     "Modified: / 05-09-2006 / 18:37:12 / cg"
  5298 !
  5299 
  5300 askForMoveByStep
  5301     "open a dialog to ask for a number"
  5302 
  5303     |s nPixels|
  5304 
  5305     s := Dialog request:'Number of Pixels to Move: '
  5306                 initialAnswer:painter nPixelsForMoveSelection asString.
  5307     s isEmptyOrNil ifTrue:[^ self].
  5308     nPixels := Integer readFrom:s onError:nil.
  5309     nPixels isNil ifTrue:[^ self].
  5310 
  5311     self painter nPixelsForMoveSelection:nPixels
  5312 !
  5313 
  5314 cancel
  5315     "cancels all modifications done to the attributes of the current section; 
  5316      reread the old attributes"
  5317 
  5318     |spec key view|
  5319 
  5320     self isModified ifTrue:[
  5321         (spec := self painter specForSelection) notNil ifTrue:[
  5322             key := spec activeHelpKey.
  5323         ].
  5324         self helpTool helpKey:key.
  5325 
  5326         treeView isCanvasSelected ifTrue: [
  5327             spec := treeView canvasSpec.
  5328         ].
  5329 
  5330         self specTool specification:spec.
  5331         view := self layoutTool layoutView.
  5332 
  5333         self setViewInLayoutTool:view spec:spec.
  5334         spec class == DataSetSpec ifTrue:[
  5335             view notNil ifTrue:[
  5336                 view columnDescriptors:(spec columns)
  5337             ]
  5338         ].        
  5339         self clearModifiedFlag.
  5340         self clearModified.
  5341     ]
  5342 !
  5343 
  5344 hideEditToolbar
  5345     self editToolBarVisibleHolder value:false
  5346 !
  5347 
  5348 hideToolbar
  5349     self toolBarVisibleHolder value:false
  5350 !
  5351 
  5352 replaceWidgetByClass:aSpecOrWidgetClass
  5353     "replace the selected widget by a new instance of aSpecOrWidgetClass,
  5354      which gets the old widget's layout"
  5355 
  5356     |newSpecClass oldSpec newSpec|
  5357 
  5358     treeView isCanvasSelected ifTrue:[
  5359         ^ self
  5360     ].
  5361     (newSpecClass := self specClassFromUsersSpecOrWidgetClass:aSpecOrWidgetClass) isNil ifTrue:[
  5362         ^ newSpecClass
  5363     ].
  5364 
  5365     oldSpec := self selectedSpec.
  5366     newSpec := newSpecClass cloneFrom:oldSpec.
  5367 
  5368     self painter replaceSelectionBy:newSpec.
  5369 
  5370     "Modified: / 05-09-2012 / 19:24:40 / cg"
  5371 !
  5372 
  5373 setMoveByStep:nPixels
  5374     "change the number of pixels by which the step-buttons move the selected widget(s)"
  5375 
  5376     self painter nPixelsForMoveSelection:nPixels
  5377 !
  5378 
  5379 specClassFromUsersSpecOrWidgetClass:aSpecOrWidgetClass
  5380     |newSpecClass|
  5381 
  5382     (aSpecOrWidgetClass isSubclassOf:UISpecification) ifTrue:[
  5383         newSpecClass := aSpecOrWidgetClass.
  5384     ] ifFalse:[
  5385         (aSpecOrWidgetClass isSubclassOf:View) ifTrue:[
  5386             newSpecClass := aSpecOrWidgetClass basicNew specClass.
  5387         ] ifFalse:[
  5388             newSpecClass := nil
  5389         ].
  5390     ].
  5391     newSpecClass isNil ifTrue:[
  5392         Dialog warn:'Invalid Spec- or View-Class: ' , aSpecOrWidgetClass name.
  5393         ^ nil.
  5394     ].
  5395     ^ newSpecClass
  5396 !
  5397 
  5398 useBackgroundImage
  5399     "select bitmap to underly"
  5400 
  5401     |fn|
  5402 
  5403     fn := Dialog requestFileName:'Bitmap Image File ?' pattern:'*.gif;*.tiff;*.jpg;*.png' fromDirectory:'f:'.
  5404     fn isNil ifTrue:[
  5405         ^ self
  5406     ].
  5407     painter useSketchFile:fn
  5408 
  5409     "Created: / 16-01-2008 / 17:49:20 / cg"
  5410 !
  5411 
  5412 useSketch
  5413     "select sketchfile to underly.
  5414      Sketchfiles are generated by notepads, which can offline-store drawn sketches"
  5415 
  5416     |fn|
  5417 
  5418     fn := Dialog requestFileName:'Sketch (Notepad Drawing) ?' pattern:'*.TOP' fromDirectory:'f:'.
  5419     fn isNil ifTrue:[
  5420         ^ self
  5421     ].
  5422     painter useSketchFile:fn
  5423 
  5424     "Created: / 16-01-2008 / 17:49:20 / cg"
  5425 !
  5426 
  5427 wrapWidgetIntoClass:aSpecOrWidgetClass
  5428     "put the selected widget into a new instance of aSpecOrWidgetClass,
  5429      which gets the wrapped widget's layout"
  5430 
  5431     |newSpecClass oldSpec newSpec|
  5432 
  5433     treeView isCanvasSelected ifTrue:[
  5434         ^ self
  5435     ].
  5436     (newSpecClass := self specClassFromUsersSpecOrWidgetClass:aSpecOrWidgetClass) isNil ifTrue:[
  5437         ^ newSpecClass
  5438     ].
  5439 
  5440     oldSpec := self selectedSpec.
  5441     newSpec := newSpecClass new.
  5442     newSpec layout:oldSpec layout.
  5443     newSpec component:oldSpec.
  5444     
  5445     self painter replaceSelectionBy:newSpec.
  5446 
  5447     "Modified: / 05-09-2012 / 19:24:40 / cg"
  5448 ! !
  5449 
  5450 !UIPainter methodsFor:'user actions-menu'!
  5451 
  5452 doAskAndReplaceWidgetBy
  5453     "ask for a widget class,
  5454      and replace the selected widget by a new instance of that one,
  5455      which gets the old widget's layout"
  5456 
  5457     |widgetClass list common selectedSpec|
  5458 
  5459     selectedSpec := self selectedSpec.
  5460     selectedSpec isNil ifTrue:[^ self].
  5461 
  5462     list :=  UISpecification allSubclasses
  5463                 select:[:cls | 
  5464                     [ cls viewClass notNil]
  5465                         on: NotFoundError
  5466                         do:[ false ]
  5467                 ].
  5468     list sort:[:a :b | a name < b name].
  5469 
  5470     common := selectedSpec class commonReplacementClasses.
  5471     common notEmpty ifTrue:[
  5472         list addAllFirst:(common , (Array with:'-')).
  5473     ].
  5474     widgetClass := Dialog 
  5475                         requestClass:'Replace by (Spec or View Class):'
  5476                         list:list
  5477                         okLabel:'OK' 
  5478                         initialAnswer:nil.
  5479     widgetClass isNil ifTrue:[
  5480         ^ self
  5481     ].
  5482     self replaceWidgetByClass:widgetClass
  5483 
  5484     "Modified: / 05-09-2012 / 19:31:22 / cg"
  5485 !
  5486 
  5487 doAskAndWrapWidgetInto
  5488     "ask for a container class,
  5489      and put the selected widget into a new instance of that one,
  5490      which gets the wrapped widget's layout"
  5491 
  5492     |widgetClass list selectedSpec|
  5493 
  5494     selectedSpec := self selectedSpec.
  5495     selectedSpec isNil ifTrue:[^ self].
  5496 
  5497     list :=  UISpecification allSubclasses
  5498                 select:[:cls | 
  5499                     [ cls viewClass notNil
  5500                       and:[ cls supportsSubComponents ]]
  5501                         on: NotFoundError
  5502                         do:[ false ]
  5503                 ].
  5504     list sort:[:a :b | a name < b name].
  5505 
  5506     widgetClass := Dialog 
  5507                         requestClass:'Wrap into (Spec or View Class):'
  5508                         list:list
  5509                         okLabel:'OK' 
  5510                         initialAnswer:nil.
  5511     widgetClass isNil ifTrue:[
  5512         ^ self
  5513     ].
  5514     self wrapWidgetIntoClass:widgetClass
  5515 !
  5516 
  5517 doBrowseActionMethod:aspectSelector
  5518     "browse or create the action method as entered in the field 
  5519      (button beside input field in ui-slice pressed)"
  5520 
  5521     self acceptOrIgnoreSectionModification.
  5522 
  5523     self doBrowseActionMethod:aspectSelector nameAs:aspectSelector
  5524 
  5525     "Modified: / 12-01-2008 / 10:32:12 / cg"
  5526 !
  5527 
  5528 doBrowseActionMethod:aspectSelector nameAs:aspectNameShown
  5529     "browse or create the action method as entered in the field.
  5530      sent by embedded ui-slice's browse class button."
  5531 
  5532     |cls spec aspect code|
  5533 
  5534     cls := self specClass.
  5535     cls isNil ifTrue:[
  5536         Dialog information:'No application class defined.'.
  5537         ^ self
  5538     ].
  5539 
  5540     spec := painter specForSelection.
  5541     spec isNil ifTrue:[^ self].
  5542     aspect := spec perform:aspectSelector.
  5543     aspect isNil ifTrue:[
  5544         Dialog information:(resources 
  5545                                 string:'Please enter an action method name for "%1" first.'
  5546                                 with:(resources string:aspectNameShown) allBold).
  5547         ^ self
  5548     ].
  5549         
  5550     (cls includesSelector:aspect asSymbol) ifFalse:[
  5551         (Dialog confirm:(resources 
  5552                             stringWithCRs:'%1 does not implement %2.\\Create ?'
  5553                             with:(cls name allBold)
  5554                             with:aspect allBold)) 
  5555         ifFalse:[
  5556             (Dialog confirm:(resources 
  5557                                 stringWithCRs:'Browse implementors of %1 ?'
  5558                                 with:aspect allBold)) 
  5559             ifTrue:[
  5560                 SystemBrowser default browseImplementorsOf:aspect
  5561             ].
  5562             ^ self
  5563         ].
  5564         code := painter
  5565             generateActionMethodFor:aspect 
  5566             spec:nil 
  5567             inClass:cls.
  5568         Class packageQuerySignal answer:painter targetClass package do:[
  5569             code readStream fileIn.
  5570         ].
  5571     ].
  5572     SystemBrowser default openInClass:cls selector:aspect
  5573 
  5574     "Modified: / 28-01-2014 / 21:55:56 / cg"
  5575 !
  5576 
  5577 doBrowseAspectClass: aspect
  5578     "sent by embedded ui-slice's 'browse'-class button (for example, subcanvasSpec)."
  5579 
  5580     | spec className class |
  5581 
  5582     spec := painter specForSelection.
  5583     spec isNil ifTrue:[ self error: 'No spec!!'.].      
  5584     className := spec perform: aspect.
  5585     class := self resolveName: className inClass: specClass.
  5586     class isNil ifTrue:[ 
  5587         Dialog warn: (resources string: 'No such class (%1)' with: className). 
  5588         ^ self.
  5589     ].
  5590     Smalltalk browseInClass: (self resolveName: className inClass: specClass)
  5591 
  5592     "Created: / 24-02-2014 / 17:20:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  5593 !
  5594 
  5595 doBrowseAspectClassAndSelector:classAspectAndSelectorAspect
  5596     "sent by embedded ui-slice's browse class button (for example, subcanvasSpec)."
  5597 
  5598     | classAspect selector selectorAspect spec className class |
  5599 
  5600     classAspect := classAspectAndSelectorAspect first. "/ #(#majorKey #minorKey)
  5601     selectorAspect := classAspectAndSelectorAspect second. "/ #(#majorKey #minorKey)
  5602 
  5603     spec := painter specForSelection.
  5604     spec isNil ifTrue:[ self error: 'No spec!!'.].      
  5605     className := spec perform: classAspect.
  5606     class := self resolveName: className inClass: specClass.
  5607     class isNil ifTrue:[ 
  5608         Dialog warn: (resources string: 'No such class (%1)' with: className). 
  5609         ^ self.
  5610     ].
  5611     selector := spec perform: selectorAspect.
  5612     Smalltalk 
  5613         browseInClass: (self resolveName: className inClass: specClass) theMetaclass
  5614         selector:selector
  5615 !
  5616 
  5617 doBrowseAspectMethod:aspectSelector
  5618     "browse or create the aspect method as entered in the field 
  5619     (button beside input field pressed)"
  5620 
  5621     self isModified ifTrue:[ self accept ].
  5622     "/ self acceptOrIgnoreSectionModification.
  5623     self doBrowseAspectMethod:aspectSelector nameAs:aspectSelector
  5624 
  5625     "Modified: / 12-01-2008 / 10:32:15 / cg"
  5626     "Modified (format): / 24-02-2014 / 17:44:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  5627 !
  5628 
  5629 doBrowseAspectMethod:aspectSelector nameAs:aspectNameShown
  5630     "browse or create the aspect method as entered in the field"
  5631 
  5632     |cls spec aspect implementingClass answer|
  5633 
  5634     cls := self specClass.
  5635     cls isNil ifTrue:[
  5636         Dialog information:'No Application Class defined.'.
  5637         ^ self
  5638     ].
  5639 
  5640     spec := painter specForSelection.
  5641     spec isNil ifTrue:[self halt. ^ self].
  5642 
  5643     aspect := spec perform:aspectSelector.
  5644     aspect isString ifFalse:[
  5645         "ignore non-strings (list may be an Array)"
  5646         aspect isNil ifTrue:[
  5647             Dialog information:(resources 
  5648                                     string:'Please enter a Method name for "%1" first.'
  5649                                     with:(resources string:aspectNameShown) allBold).
  5650         ].
  5651         ^ self
  5652     ].
  5653 
  5654     implementingClass := (cls whichClassIncludesSelector:aspect asSymbol).
  5655     implementingClass isNil ifTrue:[
  5656         implementingClass := (cls class whichClassIncludesSelector:aspect asSymbol).
  5657     ].
  5658     implementingClass isNil ifTrue:[
  5659         answer := OptionBox
  5660                           request:(resources 
  5661                                     stringWithCRs:'%1 does not implement %2.\\Create ?'
  5662                                     with:(cls name allBold)
  5663                                     with:aspect allBold)
  5664                           label:'Create/Browse Aspect Method'
  5665                           image:(WarningBox iconBitmap)
  5666                           buttonLabels:#('Cancel' 'Browse Implementors' 'Create & Browse' 'Create' )
  5667                           values:#(abort browseImplementors createAndBrowse create )
  5668                           default:#create
  5669                           onCancel:#abort.
  5670 
  5671         answer == #browseImplementors ifTrue:[
  5672             SystemBrowser default browseImplementorsOf:aspect.
  5673             ^ self
  5674         ].
  5675         answer == #abort ifTrue:[
  5676             ^ self
  5677         ].
  5678 
  5679         self doGenerateAspectMethodsForAll:(Array with:aspect).
  5680         implementingClass := self painter targetClass.
  5681 
  5682         answer == #create ifTrue:[^ self].
  5683     ] ifFalse:[
  5684         (Dialog confirm:(resources string:'Browse the implementation of "%1" ?' with:aspect)) ifFalse:[
  5685             ^ self.
  5686         ].
  5687     ].
  5688 
  5689     SystemBrowser default
  5690         openInClass:implementingClass selector:aspect
  5691 
  5692     "Modified: / 01-09-2017 / 14:23:30 / cg"
  5693 !
  5694 
  5695 doBrowseAspectMethods
  5696     "opens a browser on all the aspect methods"
  5697 
  5698     |methods|
  5699 
  5700     self painter isModified ifTrue:[
  5701         self warn:'The current window spec has not yet been saved!!\\The System Browser may show the code of the old aspect methods.' withCRs.
  5702     ].
  5703 
  5704     (methods := self painter aspectMethods) isEmpty ifTrue:[
  5705         self warn:'No aspect methods found !!'.
  5706         ^ self.
  5707     ].
  5708     SystemBrowser default
  5709         browseMethods:methods 
  5710         title:'Aspect methods'.
  5711 
  5712     "Modified: / 01-09-2017 / 14:23:34 / cg"
  5713 !
  5714 
  5715 doBrowseClass
  5716     "opens a System Browser on the specClass"
  5717 
  5718     self painter isModified ifTrue:[
  5719         self warn:'The current window spec has not yet been saved!!\\The System Browser will show the code of the old window spec.' withCRs.
  5720     ].
  5721 
  5722     Smalltalk browseInClass:(self resolveName:specClassName)
  5723 !
  5724 
  5725 doBrowseSpecificationClass
  5726     "opens an browser on the spec class of the selected widget"
  5727 
  5728     |spec|
  5729 
  5730     (spec := self painter specForSelection) isNil ifTrue:[
  5731         treeView isCanvasSelected ifTrue:[
  5732             spec := treeView canvasSpec.
  5733         ]
  5734     ].
  5735     spec notNil ifTrue:[
  5736         spec class browse
  5737     ]
  5738 !
  5739 
  5740 doBrowseViewClass
  5741     "opens a browser on the selected widgets class"
  5742 
  5743     |selection widget|
  5744 
  5745     ((selection := self painter selection) isCollection and: [selection size >= 1]) ifTrue:[
  5746         widget := selection first
  5747     ] ifFalse:[
  5748         widget := selection
  5749     ].
  5750 
  5751     widget scrolledView class browse
  5752 
  5753     "Modified: / 22-01-2011 / 12:02:31 / cg"
  5754 !
  5755 
  5756 doDefineClassAndSelector
  5757     "launches a dialog for defining class, superclass, and selector of the application"
  5758 
  5759     |again readFromModelKeyed|
  5760 
  5761     readFromModelKeyed := [:aKey| |ret|
  5762         ret := (self aspectValueFor:aKey).
  5763         ret isEmptyOrNil ifTrue:[
  5764             ret := nil
  5765         ] ifFalse:[
  5766             ret isString ifTrue:[
  5767                 ret := ret string withoutSeparators.
  5768                 ret := ret isEmpty ifTrue:[nil] ifFalse:[ret asSymbol].
  5769             ].
  5770         ].
  5771         ret
  5772     ].
  5773 
  5774     [
  5775         again := false.
  5776 
  5777         aspects at:#classNameChannel      put:(specClassName  ? 'NewApplication')   asValue.
  5778         aspects at:#methodNameChannel     put:(specSelector   ? 'windowSpec')       asValue.
  5779         aspects at:#superclassNameChannel put:(specSuperclassName ? 'ApplicationModel') asValue.
  5780 
  5781         (self openDialogInterface:#dialogSpecForDefiningClassAndSelector) ifTrue:[
  5782             specClassName  := readFromModelKeyed value:#classNameChannel.
  5783             specSelector   := readFromModelKeyed value:#methodNameChannel.
  5784             specSuperclassName := readFromModelKeyed value:#superclassNameChannel.
  5785 
  5786             (again := self checkClassAndSelector not) ifFalse:[
  5787                 self painter 
  5788                     className:specClassName
  5789                     superclassName:specSuperclassName
  5790                     selector:specSelector.
  5791             ].
  5792 
  5793             again ifFalse:[
  5794                 ((Smalltalk at:specClassName asSymbol) notNil
  5795                 and:[ (Smalltalk at:specClassName asSymbol) class includesSelector:specSelector ])
  5796                 ifTrue:[
  5797                     (self confirm:('%1 already implements %2. Overwrite ?' bindWith:specClassName with:specSelector))
  5798                     ifFalse:[
  5799                         again := true.
  5800                     ].
  5801                 ].
  5802             ].
  5803         ] ifFalse: [
  5804             ^nil
  5805         ]
  5806 
  5807     ] doWhile:[again].
  5808 
  5809     specClassName := specClassName isBehavior 
  5810                         ifTrue:[specClassName name]
  5811                         ifFalse:[specClassName].
  5812 
  5813     self clearModifiedFlag.
  5814     self helpTool buildAndMergeFromClass:specClassName.
  5815     self updateInfoLabel
  5816 
  5817     "Modified: / 16.7.1998 / 18:26:33 / cg"
  5818 !
  5819 
  5820 doDefineGrid
  5821     "opens a dialog for the grid parameters"
  5822 
  5823     |hspace vspace bindings painter gridPara settings|
  5824 
  5825     painter  := self painter.
  5826     bindings := IdentityDictionary new.
  5827     gridPara := painter gridParameters copy.
  5828     settings := self class settings.
  5829 
  5830     bindings at:#showGrid    put:((settings at: #GridShown ifAbsent: [painter gridShown]) asValue).
  5831     bindings at:#alignToGrid put:((settings at: #GridAlign ifAbsent: [painter gridAlign]) asValue).
  5832     bindings at:#hspace      put:((gridPara at:1) asValue).
  5833     bindings at:#vspace      put:((gridPara at:2) asValue).
  5834 
  5835     (self openDialogInterface:#dialogSpecForDefiningGridParameters withBindings:bindings) ifFalse:[
  5836         ^ self
  5837     ].
  5838 
  5839     hspace := (bindings at:#hspace) value ? 5.
  5840     vspace := (bindings at:#vspace) value ? 5.
  5841 
  5842     gridPara at:1 put:hspace.
  5843     gridPara at:2 put:vspace.
  5844     gridPara at:5 put:hspace.
  5845     gridPara at:6 put:vspace.
  5846 
  5847     painter gridShown:false. 
  5848     painter gridAlign:false. 
  5849     painter gridParameters:gridPara.
  5850     painter gridAlign:(bindings at:#alignToGrid) value.
  5851     painter gridShown:(bindings at:#showGrid) value.
  5852 
  5853     settings at: #GridShown  put: (bindings at:#showGrid) value.
  5854     settings at: #GridAlign  put: (bindings at:#alignToGrid) value.
  5855     settings at: #HGridSpace put: hspace.
  5856     settings at: #VGridSpace put: vspace.
  5857     painter clearView.
  5858 
  5859     "Modified: / 4.2.1999 / 15:36:34 / cg"
  5860 !
  5861 
  5862 doEditList:listSelector
  5863     "browse or create the aspect method as entered in the field (button beside input fieled pressed)"
  5864 
  5865     |spec list editor|
  5866 
  5867     self acceptOrIgnoreSectionModification.
  5868 
  5869     UIListEditor isNil ifTrue:[^ self].
  5870 
  5871     spec := painter specForSelection.
  5872     spec isNil ifTrue:[^ self].
  5873 
  5874     "Kludge: subject - fetch the AspectAdaptor behind the TypeConverter"
  5875     list := (specTool aspectFor:listSelector) subject value.
  5876     list isNil ifTrue:[
  5877         list := #()
  5878     ].
  5879 
  5880     editor := UIListEditor new.
  5881     editor
  5882         informationLabel:'Edit List';
  5883         list:list;
  5884         useSymbols:(list notEmpty and:[list conform:[:e| e isSymbol]]);    "set use symbols, if all elements are symbols"
  5885         open.
  5886 
  5887 
  5888     editor accepted ifTrue:[
  5889         "Kludge: subject - fetch the AspectAdaptor behind the TypeConverter"
  5890         (specTool aspectFor:listSelector) subject value:editor list.
  5891     ].
  5892 !
  5893 
  5894 doGenerateAspectMethodFor
  5895     |cls aspectList displayedList selectorsToGenerateCode 
  5896      doBrowse methods|
  5897 
  5898     self askForSectionModification.
  5899 
  5900     cls := self painter targetClass.
  5901 
  5902     aspectList := OrderedCollection new.
  5903 
  5904     self painter aspectSelectorsAndTypesDo:[:selector :type |
  5905             |newEntry|
  5906 
  5907             ( #(#modelAspect channelAspect actionSelector valueSelector) includes:type) ifTrue:[
  5908                 ((cls canUnderstand:selector) or:[cls class canUnderstand:selector]) ifFalse:[
  5909                     newEntry := Array with:selector with:type.    
  5910                     (aspectList includes:newEntry) ifFalse:[    
  5911                         aspectList add:newEntry.
  5912                     ]
  5913                 ]
  5914             ]
  5915         ].
  5916     
  5917     aspectList isEmpty ifTrue:[
  5918         self information:'All aspect methods exist.'.
  5919         ^ self.
  5920     ].
  5921 
  5922     aspectList sort:[:a :b | a first < b first].
  5923     displayedList := aspectList collect:[:entry | (((entry first) paddedTo:25) contractTo:25) , ' -> ' , entry second ].
  5924     aspectList := aspectList collect:[:each | each first].
  5925 
  5926     doBrowse := false.    
  5927     selectorsToGenerateCode := Dialog
  5928         choose:'Select aspect(s) for which code shall be generated:' 
  5929         fromList:displayedList 
  5930         values:aspectList 
  5931         initialSelection:nil
  5932         buttons:nil 
  5933         values:nil 
  5934         lines:15 
  5935         cancel:nil 
  5936         multiple:true
  5937         postBuildBlock:[:dialog | 
  5938                             |b|
  5939 
  5940                             b := Button label:'Generate & Browse'.
  5941                             b action:[doBrowse := true. dialog okPressed].
  5942                             b := dialog addButton:b before:dialog okButton.
  5943                        ].
  5944 
  5945     selectorsToGenerateCode isEmptyOrNil ifTrue:[^ self].
  5946 
  5947     self doGenerateAspectMethodsForAll:selectorsToGenerateCode.
  5948 
  5949     "/ refetch - cls is now obsolete
  5950     cls := self painter targetClass.
  5951 
  5952     doBrowse ifTrue:[
  5953         methods := selectorsToGenerateCode 
  5954                         collect:[:sel | cls compiledMethodAt:sel]
  5955                         thenSelect:[:m | m notNil].
  5956 
  5957         SystemBrowser default
  5958             browseMethods:methods 
  5959             title:'Some Aspect methods'.
  5960     ].
  5961 
  5962     "Modified: / 01-09-2017 / 14:23:37 / cg"
  5963 !
  5964 
  5965 doGenerateAspectMethods
  5966     "generates aspect and action methods for the application class"
  5967 
  5968     self askForSectionModification.
  5969     self withWaitCursorDo:[
  5970         |code|
  5971 
  5972         code := self painter generateAspectMethodCode.
  5973         Class packageQuerySignal answer:painter targetClass package do:[
  5974             code readStream fileIn.
  5975         ]
  5976     ]
  5977 
  5978     "Modified: / 28-01-2014 / 21:56:03 / cg"
  5979 !
  5980 
  5981 doGenerateAspectMethodsForAll:selectorsToGenerateCode
  5982     |code|
  5983 
  5984     code := self painter generateAspectMethodCodeFiltering:selectorsToGenerateCode.
  5985     Class packageQuerySignal answer:painter targetClass package do:[
  5986         code readStream fileIn.
  5987     ]
  5988 
  5989     "Modified: / 28-01-2014 / 21:56:06 / cg"
  5990 !
  5991 
  5992 doGenerateAspectSelectorsMethod
  5993     "generates aspectSelectors method for the exported aspects"
  5994 
  5995     |aspectSelectorsAsString|
  5996 
  5997     self askForSectionModification.
  5998     aspectSelectorsAsString := self painter generateAspectSelectorsMethod.
  5999     aspectSelectorsAsString notEmptyOrNil ifTrue:[
  6000         Class packageQuerySignal answer:painter targetClass package do:[
  6001             (ReadStream on:aspectSelectorsAsString) fileIn.
  6002         ].
  6003     ].
  6004 
  6005     "Modified: / 28-01-2014 / 21:56:09 / cg"
  6006 !
  6007 
  6008 doGenerateHookMethods
  6009     "generates hook methods for the application class"
  6010 
  6011     self askForSectionModification.
  6012 
  6013     Class packageQuerySignal answer:painter targetClass package do:[
  6014         (ReadStream on:painter generateHookMethods) fileIn.
  6015     ]
  6016 
  6017     "Modified: / 28-01-2014 / 21:56:13 / cg"
  6018 !
  6019 
  6020 doGenerateMenuMethods
  6021     "generates menu stub methods for the application class"
  6022 
  6023     self askForSectionModification.
  6024 
  6025     Class packageQuerySignal answer:painter targetClass package do:[
  6026         (ReadStream on:painter generateMenuMethods) fileIn.
  6027     ]
  6028 
  6029     "Created: / 23-08-1998 / 16:10:04 / cg"
  6030 !
  6031 
  6032 doInspectSpec
  6033     "opens an inspector on the spec of the selected widget"
  6034 
  6035     |spec|
  6036 
  6037     (spec := self painter specForSelection) isNil ifTrue:[
  6038         treeView isCanvasSelected ifTrue:[
  6039             spec := treeView canvasSpec.
  6040         ]
  6041     ].
  6042     spec notNil ifTrue:[
  6043         spec inspect.
  6044     ]
  6045 !
  6046 
  6047 doInspectView
  6048     "opens an inspector on the view of the selected widget"
  6049 
  6050     |selection|
  6051 
  6052     ((selection := self painter selection) isCollection and: [selection size >= 1]) ifTrue:[
  6053         selection first inspect
  6054     ] ifFalse: [
  6055         selection inspect
  6056     ]
  6057 
  6058 !
  6059 
  6060 doInstallAsWebPage
  6061     "lets user select a service, page-name and installs the page"
  6062 
  6063     |runningServerPorts again serviceOrPort pageName port serviceLinkName service server app|
  6064 
  6065     runningServerPorts := (HTTPServer runningServers collect:[:s | s port printString]) asOrderedCollection sort.
  6066     serviceOrPort := lastPort ? LastPort ? '8080'.
  6067     pageName := lastPage ? LastPage ? 'myPage'.
  6068 
  6069     [
  6070         again := false.
  6071 
  6072         aspects at:#serviceOrPortNameChannel put:serviceOrPort printString  asValue.
  6073         aspects at:#pageNameNameChannel      put:pageName printString asValue.
  6074         aspects at:#runningServerPorts       put:runningServerPorts.
  6075 
  6076         (self openDialogInterface:#dialogSpecForDefiningPortAndPageName) ifFalse:[^ nil].
  6077 
  6078         port := Integer readFrom:(aspects at:#serviceOrPortNameChannel) value onError:nil.
  6079         port isNil ifTrue:[
  6080             serviceLinkName := (aspects at:#serviceOrPortNameChannel) value.
  6081             service := HTTPPortalService allSubInstances select:[:s | s linkName = serviceLinkName].
  6082             service notEmptyOrNil ifTrue:[
  6083                 again := false.
  6084                 service := service first.    
  6085             ] ifFalse:[
  6086                 Dialog warn:'No such service'
  6087             ].
  6088         ] ifFalse:[
  6089             server := HTTPServer serverOnPort:port.
  6090             service := server 
  6091                         serviceForLink:'/portal'
  6092                         ifAbsent:[
  6093                             service := HTTPPortalService new.
  6094                             service linkName:'/portal'.
  6095                             service class unRegisterServiceOn:server.
  6096                             service registerServiceOn:server.
  6097                         ].
  6098         ].
  6099 
  6100         pageName := (aspects at:#pageNameNameChannel) value.
  6101     ] doWhile:[again].
  6102 
  6103     lastPage := LastPage := pageName.
  6104     lastPort := LastPort := port.
  6105 
  6106     app := self specClass new.
  6107     app webLink:pageName.
  6108     app service:service.
  6109     app defineInterface:(self specSelector).
  6110     app addToService.
  6111 
  6112 "/    self clearModifiedFlag.
  6113 "/    self helpTool buildAndMergeFromClass:specClassName.
  6114     self updateInfoLabel
  6115 
  6116     "Modified: / 15-01-2008 / 14:18:53 / cg"
  6117 !
  6118 
  6119 doLoad
  6120     "opens a ResourceSelectionBrowser for loading a window spec from a class"
  6121 
  6122     self askForModification ifFalse: [^nil].
  6123 
  6124     self loadFromMessage: 
  6125         (ResourceSelectionBrowser
  6126             request: 'Load Window Spec from Class'
  6127             onSuperclass: nil
  6128             andClass: self specClass
  6129             andSelector: specSelector ? #windowSpec
  6130             withResourceTypes: #(canvas))
  6131 
  6132     "Modified: / 31-08-2006 / 10:14:01 / cg"
  6133 !
  6134 
  6135 doLoadSubspec
  6136     "opens a ResourceSelectionBrowser for loading a sub spec from a class"
  6137 
  6138     |classAndSelector class selector|
  6139 
  6140     self askForSectionModification.
  6141 
  6142     classAndSelector := ResourceSelectionBrowser
  6143             request: 'Load Subspec from Class'
  6144             onSuperclass: nil
  6145             andClass: self specClass
  6146             andSelector: specSelector
  6147             withResourceTypes: #(canvas).
  6148 
  6149     classAndSelector isNil ifTrue:[^ self].
  6150     class := classAndSelector methodClass.
  6151     selector := classAndSelector methodSelector.
  6152     (class == specClassName and: [selector == specSelector]) ifTrue: [
  6153         self warn: 'Current interface as subspec not allowed!!'.
  6154         ^ self.
  6155     ].
  6156     (class respondsTo:selector) ifTrue:[
  6157         self addWidgetOfSpec:(Array with: (UISubSpecification new majorKey: class name; minorKey: selector))
  6158     ]
  6159 
  6160     "Modified: / 31-08-2006 / 10:13:56 / cg"
  6161 !
  6162 
  6163 doNew
  6164     "removes all widgets, specClass, and specSelector"
  6165 
  6166     self askForModification ifFalse: [^nil].
  6167     specClass := specClassName := specSelector := nil.
  6168     self painter removeAll.
  6169 "/ self halt.
  6170     treeView canvas topView 
  6171         name:  self defaultNameOfCanvas;
  6172         label: self defaultNameOfCanvas.
  6173     self helpTool doNew.
  6174     self treeSelectionChanged.
  6175     treeView selectedNode changed.
  6176     self tabModel value: self tabList value first.
  6177     self updateInfoLabel.
  6178 
  6179     "Modified: / 31-08-2006 / 10:14:10 / cg"
  6180 !
  6181 
  6182 doOpenAspectClassChooserFor: aspect
  6183     "open a class chooser; when ok, set the aspect to its name
  6184      sent by embedded ui-slice's '...'-class button (for example, subcanvasSpec)."
  6185 
  6186     | spec className class choice|
  6187 
  6188     spec := painter specForSelection.
  6189     spec isNil ifTrue:[ self error: 'No spec!!'.].      
  6190     className := spec perform: aspect.
  6191     class := self resolveName: className inClass: specClass.
  6192     choice := Dialog requestClassName:'Choose class' initialAnswer:(class isNil ifTrue:nil ifFalse:[class name]).
  6193     choice isEmptyOrNil ifTrue:[^ self ].
  6194 
  6195     spec perform: (aspect asMutator) with:choice.
  6196     (specTool aspectFor:aspect) value:choice.
  6197 !
  6198 
  6199 doOpenWidgetDocumentation
  6200     "opens documentation for the selected widget"
  6201 
  6202     |spec document|
  6203 
  6204     (spec := self specForSelection) isNil ifTrue:[
  6205 "/        treeView isCanvasSelected ifTrue:[
  6206 "/            spec := nil
  6207 "/        ]
  6208     ].
  6209     spec notNil ifTrue:[
  6210         document := 'tools/uipainter/', spec documentFileName,'.html'
  6211     ] ifFalse: [
  6212         document := 'tools/uipainter/WindowSpec.html'
  6213     ].
  6214     HTMLDocumentView openFullOnDocumentationFile: document 
  6215 !
  6216 
  6217 doPickAView
  6218     "changes the cursor for picking a view and builds a window spec from it"
  6219 
  6220     |view|
  6221 
  6222     self askForModification ifFalse: [^nil].
  6223 
  6224     (view := Screen current viewFromUser) notNil ifTrue:[
  6225         view == Screen current rootView ifFalse:[
  6226             self painter setupFromSpec:(UISpecification fromView:view topView).
  6227         ]
  6228     ].
  6229 
  6230     self updateInfoLabel
  6231 
  6232 !
  6233 
  6234 doSave
  6235     "saves the window spec"
  6236     
  6237     |code painter specClass extentUsed|
  6238 
  6239     self askForSectionModification.
  6240     self hasSpecClassAndSelector ifFalse:[
  6241         self doDefineClassAndSelector isNil ifTrue:[
  6242             ^ nil
  6243         ]
  6244     ].
  6245 
  6246     specClass := self resolveName:specClassName.
  6247     (specClass notNil and:[ specClass isClass ]) ifFalse:[
  6248         self warn:('Oops - cannot save. Class not found: ' , specClassName).
  6249         ^ nil
  6250     ].
  6251     ApplicationModel forgetDefaultExtentFor:specClass.
  6252 
  6253     painter := self painter.
  6254     painter 
  6255         class:specClass
  6256         superclassName:specSuperclassName
  6257         selector:specSelector.
  6258 
  6259 "/    Transcript showCR:'generating windowSpec code...'.
  6260 
  6261     extentUsed := self canvas extent.
  6262     (extentUsed > (1024 @ 768)) ifTrue:[
  6263         Dialog 
  6264             warn:(resources
  6265                 stringWithCRs:'The application''s default window-size is taken from the current size and will be %1.\\This may be too large for some displays - if required, resize and save again.'
  6266                 with:extentUsed printString allBold)
  6267     ].
  6268     (self canvas maxExtent notNil
  6269     and:[ extentUsed > self canvas maxExtent ]) ifTrue:[
  6270         Dialog 
  6271             warn:(resources
  6272                 stringWithCRs:'The window-size is larger than its max-extent.\\This may lead to trouble (lost extent) later. I suggest removal of the max or resizing.'
  6273                 with:extentUsed printString allBold)
  6274     ].
  6275 
  6276     code := painter generateWindowSpecMethodSource.
  6277     Class packageQuerySignal answer:specClass package do:[
  6278         (ReadStream on:code) fileIn.
  6279     ].
  6280     self doGenerateAspectSelectorsMethod.
  6281     self helpTool doSave.
  6282     self updateInfoLabel.
  6283     self clearModified.
  6284     painter resetModification.
  6285     (specClass respondsTo:specSelector) ifTrue:[
  6286         self addHistoryEntryForClass:specClass selector:specSelector.
  6287     ].
  6288 
  6289     "Modified: / 28-01-2014 / 21:52:32 / cg"
  6290 !
  6291 
  6292 doSaveAs
  6293     "opens a ResourceSelectionBrowser for saving the window spec on a class"
  6294 
  6295     |classAndSelector|
  6296 
  6297     self askForSectionModification.
  6298 "/    self hasSpecClassAndSelector ifTrue:[
  6299 "/        self askForModification ifFalse:[^ false].
  6300 "/    ].
  6301 
  6302     classAndSelector := ResourceSelectionBrowser
  6303             request: 'Save Window Spec in Class'
  6304             onSuperclass: #Object
  6305             andClass: (specClassName ? #ApplicationModel) asSymbol
  6306             andSelector: specSelector ? #windowSpec
  6307             withResourceTypes: #(canvas).
  6308 
  6309     classAndSelector isNil ifTrue:[^ false].
  6310 
  6311     self clearModified.
  6312     self painter resetModification.
  6313 
  6314     specClass := classAndSelector methodClass.
  6315     specClassName := classAndSelector methodClass name.
  6316     specSelector := classAndSelector methodSelector.
  6317     specSuperclassName := specClass superclass name.
  6318     self doSave.
  6319     ^ true
  6320 !
  6321 
  6322 doSaveElementSpecAs
  6323     "opens a ResourceSelectionBrowser for saving a spec for the selected
  6324      elements on a class.
  6325      Useful to save parts for refactoring a spec into
  6326      subSpecifications, for example when putting parts into a tab"
  6327 
  6328     |spec fullSpec classAndSelector subSpecClass subSpecClassName subSpecSelector code|
  6329 
  6330     self askForSectionModification.
  6331 
  6332     (spec := self painter specForSelection) isNil ifTrue:[
  6333         self warn:('Select a single item first').
  6334         ^ false
  6335     ].
  6336 
  6337     classAndSelector := ResourceSelectionBrowser
  6338             request: 'Save Subspec in Class'
  6339             onSuperclass: #Object
  6340             andClass: specClassName
  6341             andSelector: #subSpec
  6342             withResourceTypes: #(canvas).
  6343 
  6344     classAndSelector isNil ifTrue:[^ false].
  6345 
  6346     self clearModified.
  6347     self painter resetModification.
  6348 
  6349     subSpecClass := classAndSelector methodClass.
  6350     subSpecClassName := classAndSelector methodClass name.
  6351     subSpecSelector := classAndSelector methodSelector.
  6352 
  6353     subSpecClass := self resolveName:subSpecClassName.
  6354     (subSpecClass notNil and:[ subSpecClass isClass ]) ifFalse:[
  6355         self warn:('Oops - cannot save - class not found: ' , subSpecClassName).
  6356         ^ false
  6357     ].
  6358 
  6359     spec := painter fullSpecFor:(painter singleSelection).
  6360 
  6361     fullSpec := treeView generateFullSpecForComponents:(Array with:spec) named:subSpecSelector asUppercaseFirst.
  6362     code := painter generateWindowSpecMethodSourceFor:fullSpec class:subSpecClassName selector:subSpecSelector.
  6363     Class packageQuerySignal answer:subSpecClass package do:[
  6364         (ReadStream on:code) fileIn.
  6365     ].
  6366     ^ true
  6367 
  6368     "Modified: / 28-01-2014 / 21:53:35 / cg"
  6369 !
  6370 
  6371 doSelectAspectMethod:aspectSelector
  6372     "open a dialog to select an existing aspect method and enter in the field"
  6373 
  6374     self doSelectAspectMethod:aspectSelector nameAs:aspectSelector
  6375 !
  6376 
  6377 doSelectAspectMethod:aspectSelector nameAs:aspectNameShown
  6378 "/    |cls spec aspect code|
  6379 "/
  6380 "/    cls := self specClass.
  6381 "/    cls isNil ifTrue:[
  6382 "/        Dialog information:'No Application Class defined.'.
  6383 "/        ^ self
  6384 "/    ].
  6385 "/
  6386 "/    spec := painter specForSelection.
  6387 "/    spec isNil ifTrue:[^ self].
  6388 "/    aspect := spec perform:aspectSelector.
  6389 "/    aspect isNil ifTrue:[
  6390 "/        Dialog information:(resources 
  6391 "/                                string:'Please enter a Method name for "%1" first.'
  6392 "/                                with:(resources string:aspectNameShown) allBold).
  6393 "/        ^ self
  6394 "/    ].
  6395 "/        
  6396 "/    (cls implements:aspect asSymbol) ifFalse:[
  6397 "/        (Dialog confirm:(resources 
  6398 "/                            stringWithCRs:'%1 does not implement %2.\\Create ?'
  6399 "/                            with:(cls name allBold)
  6400 "/                            with:aspect allBold)) 
  6401 "/        ifFalse:[
  6402 "/            (Dialog confirm:(resources 
  6403 "/                                stringWithCRs:'Browse implementors of %1 ?'
  6404 "/                                with:aspect allBold)) 
  6405 "/            ifTrue:[
  6406 "/                UserPreferences current systemBrowserClass browseImplementorsOf:aspect
  6407 "/            ].
  6408 "/            ^ self
  6409 "/        ].
  6410 "/        code := painter
  6411 "/            generateAspectMethodFor:aspect 
  6412 "/            spec:nil 
  6413 "/            inClass:cls.
  6414 "/        code readStream fileIn.
  6415 "/    ].
  6416 "/    UserPreferences current systemBrowserClass openInClass:cls selector:aspect
  6417 !
  6418 
  6419 doSortItems
  6420     "sort the selected items by position"
  6421 
  6422     treeView doSortItems
  6423 !
  6424 
  6425 doStartApplication
  6426     "starts the application on the editing window spec"
  6427 
  6428     |cls application|
  6429 
  6430     self hasSpecClassAndSelector ifFalse:[
  6431         self doSave isNil ifTrue: [^nil].
  6432     ] ifTrue: [
  6433         self askForSectionModification.    
  6434         (modified or: [self painter isModified or: [self helpTool modified]])
  6435         ifTrue:
  6436         [
  6437             ((YesNoBox title:'Window Spec was modified!!')        
  6438                 noText:'Cancel';
  6439                 yesText:'Save it and start';
  6440                 showAtPointer;
  6441                 accepted) ifFalse: [^nil].
  6442             self doSave isNil ifTrue: [^nil]
  6443         ]
  6444     ].
  6445 
  6446     cls := self resolveName:specClassName.
  6447     cls isNil ifTrue:[
  6448         self warn:'Oops cannot start application - no class:' , specClassName.
  6449         ^ nil
  6450     ].
  6451     application := cls new.
  6452     (application respondsTo:#openInterface:) ifFalse:[
  6453         (self confirm:('The application does not respond to the ''openInterface:'' message.\(maybe the spec is supposed to be used as subApplication/subCanvas)\\Shall I try to open this as a standAlone dialog ?') withCRs)
  6454         ifTrue:[
  6455             SimpleDialog new openSpec:(cls perform:specSelector) withBindings:nil.
  6456         ].
  6457         ^ self.
  6458     ].        
  6459     application openInterface:specSelector
  6460 !
  6461 
  6462 doStepDown
  6463     "moves the selected widget(s) one step down in the hierarchy"
  6464 
  6465     treeView doStepOver:1
  6466 !
  6467 
  6468 doStepIn
  6469     "moves the selected widget into the next widget as child"
  6470 
  6471     treeView doStepIn
  6472 !
  6473 
  6474 doStepOut
  6475     "moves the selected widget out of the parent widget"
  6476 
  6477     treeView doStepOut
  6478 !
  6479 
  6480 doStepUp
  6481     "moves the selected widget(s) one step up in the hierarchy"
  6482 
  6483     treeView doStepOver:-1
  6484 !
  6485 
  6486 doWindowSpec
  6487     "opens a code view with the contents of the window spec"
  6488 
  6489     self askForSectionModification.
  6490 
  6491     CodeView 
  6492         openWith: self painter generateWindowSpecMethodSource 
  6493         title: 'Window Spec'
  6494 
  6495 ! !
  6496 
  6497 !UIPainter::ApplicationClassQuery class methodsFor:'documentation'!
  6498 
  6499 documentation
  6500     "This Query answers the application class, that is currently being edited"
  6501 ! !
  6502 
  6503 !UIPainter::TreeView class methodsFor:'documentation'!
  6504 
  6505 documentation
  6506 "
  6507     selection in tree view; only used by the UIPainter
  6508 
  6509     [see also:]
  6510         SelectionInTreeView
  6511         SelectionInTree
  6512         TreeItem
  6513         UIPainter
  6514 
  6515     [author:]
  6516         Claus Atzkern
  6517 "
  6518 
  6519 
  6520 ! !
  6521 
  6522 !UIPainter::TreeView methodsFor:'accessing'!
  6523 
  6524 canvas
  6525     "returns the canvas (UIPainterView)"
  6526 
  6527     ^ model root contents view
  6528 
  6529 
  6530 !
  6531 
  6532 canvas:aCanvas
  6533     "install canvas (UIPainterView)"
  6534 
  6535     self canvas:aCanvas specName:nil
  6536 !
  6537 
  6538 canvas:aCanvas specName:nameOfSpec
  6539     "install canvas (UIPainterView)"
  6540 
  6541     |props|
  6542 
  6543     props := UIPainterView::ViewProperty new.
  6544     props view:aCanvas.
  6545 
  6546     model root:(TreeItem 
  6547                     name:(nameOfSpec ? painter defaultNameOfCanvas) allBold 
  6548                     contents:props).
  6549 
  6550     model root expand.
  6551     self enableChannel:(aCanvas enableChannel).
  6552 !
  6553 
  6554 canvasSpec
  6555     "returns spec assigned to canvas"
  6556 
  6557     |spec list cls canvas|
  6558 
  6559     spec := self windowSpecClass new.
  6560     canvas := self canvas.
  6561 
  6562     spec fromView:(canvas topView) callBack:nil.
  6563 
  6564     windowSpec notNil ifTrue:[
  6565         spec copyValuesFromSpec:windowSpec.
  6566     ].
  6567 
  6568     spec exportedAspects isNil ifTrue:[
  6569         (     (cls  := canvas className) notNil
  6570          and:[(cls  := canvas resolveName:cls) notNil]
  6571         ) ifTrue:[
  6572             list := cls perform:#aspectSelectors ifNotUnderstood:nil.
  6573         ].
  6574         spec setExportedAspectsFrom:list.
  6575         windowSpec notNil ifTrue:[
  6576             windowSpec exportedAspects:(spec exportedAspects).
  6577         ]
  6578     ].
  6579 
  6580     self propertiesDo:[:aProp| 
  6581         |propsSpec|
  6582 
  6583         spec exportedAspectsAddKey:(aProp model) type:nil.
  6584         propsSpec := aProp spec.
  6585         propsSpec aspectSelectors 
  6586                 select:[:a | a isString or:[a isSymbol]] 
  6587                 thenDo:[:aKey|spec exportedAspectsAddKey:aKey type:nil].
  6588         propsSpec actionSelectors 
  6589                 select:[:a | a isString or:[a isSymbol]] 
  6590                 thenDo:[:aKey|spec exportedAspectsAddKey:aKey type:#action].
  6591     ].
  6592   ^ spec
  6593 !
  6594 
  6595 canvasSpec:aSpec
  6596     "update canvas from spec"
  6597 
  6598     |spec|
  6599 
  6600     self setAttributesFromWindowSpec:aSpec.
  6601     spec := aSpec copy.
  6602     spec  menu:nil.
  6603     spec flags:nil.
  6604 
  6605     spec setAttributesIn:(self canvas "topView") with:(UIBuilder new isEditing:true).
  6606 !
  6607 
  6608 exportedAspects
  6609     "returns spec assigned to canvas"
  6610 
  6611     windowSpec isNil ifTrue:[^ #()].
  6612     ^ windowSpec exportedAspects ? #()
  6613 
  6614 !
  6615 
  6616 itemOfView:aView
  6617     "returns item assigned to view or nil"
  6618 
  6619     aView notNil ifTrue:[
  6620         self allItemsDo:[:anItem|
  6621             (anItem contents view == aView) ifTrue:[^ anItem]
  6622         ]
  6623     ].
  6624     ^ nil
  6625 
  6626 
  6627 !
  6628 
  6629 lastDrawnMaster
  6630     "returns the lastDrawnMaster"
  6631 
  6632     ^ lastDrawnMaster
  6633 
  6634 
  6635 !
  6636 
  6637 painter
  6638     ^ painter
  6639 !
  6640 
  6641 painter:something
  6642     painter := something.
  6643 !
  6644 
  6645 windowSpecClass
  6646     "returns the default  windowSpecClass (WindowSpec)"
  6647 
  6648     ^ windowSpecClass ? WindowSpec
  6649 !
  6650 
  6651 windowSpecClass:aClass
  6652     "set the default windowSpecClass"
  6653 
  6654     windowSpecClass := aClass
  6655 ! !
  6656 
  6657 !UIPainter::TreeView methodsFor:'accessing-property'!
  6658 
  6659 propertiesDo:aOneArgBlock
  6660     "evaluates the argument a block on each property"
  6661 
  6662     self allItemsDo:[:anItem| aOneArgBlock value:(anItem contents)]
  6663 
  6664 
  6665 !
  6666 
  6667 propertyDetect:aOneArgBlock
  6668     "evaluates the block on each property"
  6669 
  6670     self allItemsDo:[:anItem|
  6671         (aOneArgBlock value:(anItem contents)) ifTrue:[^ anItem contents]
  6672     ].
  6673     ^ nil
  6674 
  6675 !
  6676 
  6677 propertySelected
  6678     "returns current selected property or nil in case of multi selection
  6679      or empty selection "