AbstractSettingsApplication.st
changeset 4286 ca4a4c435bf3
parent 4240 f196089fe934
child 4292 68504047f229
--- a/AbstractSettingsApplication.st	Tue Nov 19 12:48:13 2002 +0100
+++ b/AbstractSettingsApplication.st	Tue Nov 19 15:11:02 2002 +0100
@@ -7,6 +7,156 @@
 	category:'Interface-Smalltalk'
 !
 
+AbstractSettingsApplication subclass:#CommunicationSettingsAppl
+	instanceVariableNames:'modifiedChannel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#CompilerSettingsAppl
+	instanceVariableNames:'modifiedChannel stcCompilationSelection catchMethodRedefs
+		allowQualifiedNames warnDollar warnOldStyle stcCompilation
+		fullDebugSupport warnCommonMistakes warnUnderscore keepSource
+		constantFolding fullHistoryUpdate warnCompatibility
+		constantFoldingOptions historyLines warnings warnSTX allowDollar
+		allowReservedWordsAsSelectors immutableArrays
+		allowOldStyleAssignment compileLazy allowUnderscore
+		allowDolphinExtensions warnUnusedVars keepSourceSelection
+		allowSqueakExtensions loadBinaries justInTimeCompilation
+		canLoadBinaries constantFoldingSelection stcCompilationList
+		catchClassRedefs stcCompilerSettings enableUnderscore
+		enableDollar'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#DisplaySettingsAppl
+	instanceVariableNames:'modifiedChannel isColorMonitor useFixGrayPaletteLabel
+		useFixPalette sizeY clipEncodingListSelection sizeX monitorList
+		ditherList clipEncodingList ditherListSelection deepIcons
+		monitorSelection useFixPaletteLabel visualIsPseudoColor
+		ditherSymsNotNil useFixGrayPalette sizeInfos screen ditherStyles
+		ditherSyms screenDepthVisualLabelHolder'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#EditSettingsAppl
+	instanceVariableNames:'modifiedChannel st80EditingMode tabsIs4 st80DoubleClickSelectMode
+		searchDialogIsModal startTextDragWithControl'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#FontSettingsAppl
+	instanceVariableNames:'modifiedChannel filter allOfThem labelDef buttonDef listDef
+		menuDef textDef allFontLabelHolder buttonsFontLabelHolder
+		textFontLabelHolder labelsFontLabelHolder listsFontLabelHolder
+		menusFontLabelHolder allLabel buttonsLabel textLabel labelLabel
+		listsLabel menuLabel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#KbdMappingSettingsAppl
+	instanceVariableNames:'modifiedChannel selectedRawKey macroTextHolder
+		selectedFunctionKey labelTextHolder functionKeyList rawKeyList
+		mappings'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#LanguageSettingsAppl
+	instanceVariableNames:'modifiedChannel languageHolder languageList listOfLanguages
+		translatedLanguages noticeLabelHolder currentLanguageChannel
+		currentLanguageLabel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#MemorySettingsAppl
+	instanceVariableNames:'modifiedChannel newSpaceSize maxOldSpace fastMoreLimit
+		warningLabelHolder codeTrigger codeLimit oldIncr compressLimit
+		igcFreeLimit igcLimit igcFreeAmount stackLimit
+		supportsJustInTimeCompilation'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#MiscSettingsAppl
+	instanceVariableNames:'modifiedChannel returnFocus focusFollowsMouse beepEnabled
+		takeFocus preemptive activateOnClick shadows dynamicPrios
+		opaqueVariablePanelResize formatHostNameinWindowLabels
+		opaqueTableColumnResize hostNameInLabelHolder showAccelerators
+		currentUserPrefs newWindowLabelFormat'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#PlainSettingsAppl
+	instanceVariableNames:'modifiedChannel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#PrinterSettingsAppl
+	instanceVariableNames:'modifiedChannel selectedUnit supportsColor topMargin rightMargin
+		bottomMargin landscape pageFormatList pageFormat unitList
+		leftMargin possiblePrinters printerType printerTypeSelection
+		printCommandSelection printCommandList commandList printCommand
+		enableFormat enablelandscape enableMargins enableColorBox'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#SourceAndDebuggerSettingsAppl
+	instanceVariableNames:'modifiedChannel syntaxColoring showVerboseStack sourceCacheDir
+		useManager updChanges condenseSourceCache
+		syntaxColorConfiguration showErrorNotifier setupSourceCodeManager
+		fullSelectorCheck logDoits checkClassesWhenCheckingIn
+		changeFileName formattingConfiguration flushSourceCache
+		localSourceFirst autoFormat cvsIsSetup repositoryHolder manager
+		repository currentUserPrefs'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#StyleSettingsAppl
+	instanceVariableNames:'modifiedChannel showStandardStylesOnly styleList selectedStyle
+		styleDirectoryContents infoLabelHolder noticeLabelHolder'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#SystemMessageSettingsAppl
+	instanceVariableNames:'modifiedChannel classInfos vmInfo vmErrors displayErrors'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
+AbstractSettingsApplication subclass:#ToolsSettingsAppl
+	instanceVariableNames:'useNewVersionDiffBrowser transcriptBufferSize useNewInspector
+		showClockInLauncher useNewChangesBrowser useNewFileBrowser
+		useNewSystemBrowser currentUserPrefs modifiedChannel'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
 
 !AbstractSettingsApplication methodsFor:'actions'!
 
@@ -34,8 +184,7681 @@
     ^ masterApplication notNil and:[ masterApplication class == AbstractLauncherApplication::SettingsDialog].
 ! !
 
+!AbstractSettingsApplication::CommunicationSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::PlainSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::PlainSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::PlainSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Settings'
+          #name: 'Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::CommunicationSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self warn:'no help available here'.
+"/    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/keyboardSetting.html'].
+!
+
+loadRequest
+
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::CommunicationSettingsAppl methodsFor:'aspects'!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+! !
+
+!AbstractSettingsApplication::CommunicationSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+"/    changedObject == self allOfThem ifTrue:[
+"/        ^ self.
+"/    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::CommunicationSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::CommunicationSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ true
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl class methodsFor:'defaults'!
+
+constantFoldingOptions
+
+    ^ #( nil #level1 #level2 #full )
+!
+
+constantFoldingStrings
+
+    ^ #('disabled' 'level1 (always safe)' 'level2 (usually safe)' 'full')
+!
+
+keepSourceOptions
+
+    ^ #( keep reference absReference sourceReference discard )
+!
+
+keepSourceStrings
+
+    ^ #('Keep as String' 'Reference to Filename' 'Reference to Full Path' 'Append and Ref in `st.src''' 'Discard' )
+!
+
+stcCompilationDemoStrings
+
+    ^ #('never')
+!
+
+stcCompilationFullVersionStrings
+
+    ^ #('always' 'primitive code only' 'never')
+!
+
+stcCompilationOptions
+
+    ^ #( always default never)
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::CompilerSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::CompilerSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::CompilerSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Compiler Settings'
+          #name: 'Compiler Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 602)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
+              #label: 'Catch Method Redefinitions'
+              #name: 'CatchMethodRedefinitions'
+              #layout: #(#LayoutFrame 5 0 5 0 250 0 30 0)
+              #model: #catchMethodRedefs
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Catch Class Redefinitions'
+              #name: 'CatchClassRedefinitions'
+              #layout: #(#LayoutFrame 257 0 5 0 7 1 30 0)
+              #model: #catchClassRedefs
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Keep History Line in Methods'
+              #name: 'KeepHistoryLineinMethods'
+              #layout: #(#LayoutFrame 5 0 30 0 250 0 55 0)
+              #model: #historyLines
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Keep Full Class History'
+              #name: 'KeepFullClassHistory'
+              #layout: #(#LayoutFrame 257 0 30 0 7 1 55 0)
+              #enableChannel: #hasHistoryManager
+              #model: #fullHistoryUpdate
+              #translateLabel: true
+            )
+           #(#LabelSpec
+              #label: 'FileIn Source Mode:'
+              #name: 'FileInSourceModeLabel'
+              #layout: #(#LayoutFrame 239 0 60 0 425 0 82 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'PopUp List'
+              #name: 'KeepSourceSelection'
+              #layout: #(#LayoutFrame 425 0 60 0 -5 1 82 0)
+              #tabable: true
+              #model: #keepSourceSelection
+              #menu: #keepSource
+              #useIndex: true
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 90 0 0 1 93 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Lazy Compilation when Autoloading'
+              #name: 'LazyCompilationWhenAutoloading'
+              #layout: #(#LayoutFrame 5 0 100 0 250 0 125 0)
+              #model: #compileLazy
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'If Present, Load Binary Objects when Autoloading'
+              #name: 'LoadBinaryObjectsWhenAutoloading'
+              #layout: #(#LayoutFrame 5 0 125 0 331 0 150 0)
+              #enableChannel: #canLoadBinaries
+              #model: #loadBinaries
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Just in Time Compilation to Machine Code'
+              #name: 'JustInTimeCompilation'
+              #layout: #(#LayoutFrame 5 0 150 0 289 0 175 0)
+              #model: #justInTimeCompilation
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 180 0 0 1.0 183 0)
+            )
+           #(#ActionButtonSpec
+              #label: 'Stc Compilation Parameters...'
+              #name: 'StcCompilationParametersButton'
+              #layout: #(#LayoutFrame 5 0 195 0 217 0 217 0)
+              #translateLabel: true
+              #model: #stcCompilerSettings
+            )
+           #(#LabelSpec
+              #label: 'Stc Compilation to Machine Code'
+              #name: 'StcCompilationToMachineCodeLabel'
+              #layout: #(#LayoutFrame 220 0 195 0 425 0 217 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'PopUp List'
+              #name: 'StcCompilation'
+              #layout: #(#LayoutFrame 425 0 195 0 -5 1 217 0)
+              #tabable: true
+              #model: #stcCompilationSelection
+              #enableChannel: #canLoadBinaries
+              #menu: #stcCompilationList
+              #useIndex: true
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 225 0 0 1.0 228 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Underscore in Identifiers'
+              #name: 'AllowUnderscoreInIdentifiers'
+              #layout: #(#LayoutFrame 5 0 240 0 249 0 262 0)
+              #model: #allowUnderscore
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Dollar in Identifiers'
+              #name: 'AllowDollarInIdentifiers'
+              #layout: #(#LayoutFrame 5 0 265 0 249 0 287 0)
+              #model: #allowDollar
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow VW3 QualifiedNames'
+              #name: 'AllowVW3QualifiedNames'
+              #layout: #(#LayoutFrame 5 0 290 0 249 0 312 0)
+              #model: #allowQualifiedNames
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Squeak Extensions'
+              #name: 'AllowSqueakExtensions'
+              #layout: #(#LayoutFrame 5 0 315 0 249 0 337 0)
+              #model: #allowSqueakExtensions
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Dolphin Extensions'
+              #name: 'AllowDolphinExtensions'
+              #layout: #(#LayoutFrame 5 0 340 0 249 0 362 0)
+              #model: #allowDolphinExtensions
+              #translateLabel: true
+            )
+           #(#PopUpListSpec
+              #label: 'PopUp List'
+              #name: 'ConstantFolding'
+              #layout: #(#LayoutFrame 425 0 238 0 -5 1 260 0)
+              #tabable: true
+              #model: #constantFoldingSelection
+              #menu: #constantFolding
+              #useIndex: true
+            )
+           #(#LabelSpec
+              #label: 'Constant Folding:'
+              #name: 'ConstantFoldingLabel'
+              #layout: #(#LayoutFrame 250 0 240 0 425 0 262 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow OldStyle Assignment (_)'
+              #name: 'AllowOldStyleAssignment'
+              #layout: #(#LayoutFrame 257 0 265 0 501 0 287 0)
+              #model: #allowOldStyleAssignment
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Reserved Words as Selector (self)'
+              #name: 'AllowReservedWordsAsSelector'
+              #layout: #(#LayoutFrame 257 0 290 0 -5 1 312 0)
+              #model: #allowReservedWordsAsSelectors
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Full Debug Info'
+              #name: 'FullDebugInfo'
+              #layout: #(#LayoutFrame 257 0 315 0 501 0 337 0)
+              #model: #fullDebugSupport
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Literal Arrays are Immutable'
+              #name: 'LiteralArraysAreImmutable'
+              #layout: #(#LayoutFrame 257 0 340 0 501 0 362 0)
+              #model: #immutableArrays
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator4'
+              #layout: #(#LayoutFrame 0 0.0 365 0 0 1.0 368 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Warnings'
+              #name: 'Warnings'
+              #layout: #(#LayoutFrame 5 0 375 0 249 0 397 0)
+              #model: #warnings
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'ST/X Extensions'
+              #name: 'STXExtensions'
+              #layout: #(#LayoutFrame 25 0 400 0 245 0 422 0)
+              #enableChannel: #warnings
+              #model: #warnSTX
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Underscores in Identifiers'
+              #name: 'UnderscoresInIdentifiers'
+              #layout: #(#LayoutFrame 25 0 425 0 245 0 447 0)
+              #enableChannel: #enableUnderscore
+              #model: #warnUnderscore
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Dollars in Identifiers'
+              #name: 'DollarsInIdentifiers'
+              #layout: #(#LayoutFrame 25 0 450 0 245 0 472 0)
+              #enableChannel: #enableDollar
+              #model: #warnDollar
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Unused Method Variables'
+              #name: 'UnusedMethodVariables'
+              #layout: #(#LayoutFrame 25 0 475 0 245 0 497 0)
+              #enableChannel: #warnings
+              #model: #warnUnusedVars
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'OldStyle Assignment'
+              #name: 'OldStyleAssignment'
+              #layout: #(#LayoutFrame 257 0 400 0 475 0 422 0)
+              #enableChannel: #warnings
+              #model: #warnOldStyle
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Common Mistakes'
+              #name: 'CommonMistakes'
+              #layout: #(#LayoutFrame 257 0 425 0 475 0 447 0)
+              #enableChannel: #warnings
+              #model: #warnCommonMistakes
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Possible Incompatibilities'
+              #name: 'PossibleIncompatibilities'
+              #layout: #(#LayoutFrame 257 0 450 0 474 0 472 0)
+              #enableChannel: #warnings
+              #model: #warnCompatibility
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator5'
+              #layout: #(#LayoutFrame 0 0.0 500 0 0 1.0 503 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/compilerSettings.html'].
+!
+
+loadRequest
+
+    self allowDollar value:(Compiler allowDollarInIdentifier ? false).
+    self allowDolphinExtensions value:(Compiler allowDolphinExtensions ? false).
+    self allowOldStyleAssignment value:(Compiler allowOldStyleAssignment ? false).
+    self allowQualifiedNames value:(Compiler allowQualifiedNames ? false).
+    self allowReservedWordsAsSelectors value:(Compiler allowReservedWordsAsSelectors ? false).
+    self allowSqueakExtensions value:(Compiler allowSqueakExtensions ? false).
+    self allowUnderscore value:(Compiler allowUnderscoreInIdentifier ? false).
+    self catchClassRedefs value:(Class catchClassRedefinitions ? false).
+    self catchMethodRedefs value:(Class catchMethodRedefinitions ? false).
+    self compileLazy value:(Autoload compileLazy ? false).
+    self constantFoldingSelection value:(self class constantFoldingOptions indexOf:Compiler foldConstants ifAbsent:3).
+    self supportsJustInTimeCompilation ifTrue:[
+        self fullDebugSupport value:(ObjectMemory fullSingleStepSupport ? false).
+    ] ifFalse:[ 
+        self fullDebugSupport value:(Compiler lineNumberInfo == #full).
+    ].
+    self hasHistoryManager ifTrue:[
+        self fullHistoryUpdate value:(HistoryManager fullHistoryUpdate ? false).
+    ] ifFalse:[
+        self fullHistoryUpdate value:false.
+    ].
+    self historyLines value:self hasHistoryManager.
+    self immutableArrays value:(Compiler arraysAreImmutable ? false).
+    self supportsJustInTimeCompilation ifTrue:[
+        self justInTimeCompilation value:(ObjectMemory justInTimeCompilation ? false).
+    ] ifFalse:[ 
+        self justInTimeCompilation value:false.
+    ].
+    self keepSourceSelection value:(self class keepSourceOptions indexOf:ClassCategoryReader sourceMode ifAbsent:1).
+    self canLoadBinaries ifTrue:[ 
+        self loadBinaries value:Smalltalk loadBinaries.
+    ] ifFalse:[
+        self loadBinaries value:false
+    ].
+    self thisIsADemoVersion ifTrue:[
+        self stcCompilationSelection value:(self class stcCompilationOptions indexOf:(Compiler stcCompilation) ifAbsent:2).
+    ] ifFalse:[
+        self stcCompilationSelection value:2.
+    ].
+    self warnCommonMistakes value:(Compiler warnCommonMistakes ? false).
+    self warnCompatibility value:(Compiler warnPossibleIncompatibilities ? false).
+    self warnDollar value:(Compiler warnDollarInIdentifier ? false).
+    self warnOldStyle value:(Compiler warnOldStyleAssignment ? false).
+    self warnSTX value:(Compiler warnSTXSpecials ? false).
+    self warnUnderscore value:(Compiler warnUnderscoreInIdentifier ? false).
+    self warnUnusedVars value:(Compiler warnUnusedVars ? false).
+    self warnings value:(Compiler warnings ? false).
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Compiler Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    HistoryManager notNil ifTrue:[
+        HistoryManager fullHistoryUpdate:self fullHistoryUpdate value.
+        self historyLines value ifTrue:[
+            HistoryManager activate
+        ] ifFalse:[
+            HistoryManager deactivate
+        ].
+    ].
+    Class catchMethodRedefinitions:self catchMethodRedefs value.
+    Class catchClassRedefinitions:self catchClassRedefs value.
+    ClassCategoryReader sourceMode:(self class keepSourceOptions at:self keepSourceSelection value).
+    Compiler warnings:self warnings value.
+    Compiler warnSTXSpecials:self warnSTX value.
+    Compiler warnOldStyleAssignment:self warnOldStyle value.
+    Compiler warnUnderscoreInIdentifier:self warnUnderscore value.
+    Compiler warnDollarInIdentifier:self warnDollar value.
+    Compiler warnCommonMistakes:self warnCommonMistakes value.
+    Compiler warnPossibleIncompatibilities:self warnCompatibility value.
+    Compiler warnUnusedVars:self warnUnusedVars value.
+    Compiler allowUnderscoreInIdentifier:self allowUnderscore value.
+    Compiler allowDollarInIdentifier:self allowDollar value.
+    Compiler allowSqueakExtensions:self allowSqueakExtensions value.
+    Compiler allowDolphinExtensions:self allowDolphinExtensions value.
+    Compiler allowQualifiedNames:self allowQualifiedNames value.
+    Compiler allowOldStyleAssignment:self allowOldStyleAssignment value.
+    Compiler allowReservedWordsAsSelectors:self allowReservedWordsAsSelectors value.
+
+    Compiler arraysAreImmutable:self immutableArrays value.
+    self fullDebugSupport value ifTrue:[
+        Compiler lineNumberInfo:#full.
+    ] ifFalse:[
+        Compiler lineNumberInfo:true
+    ].
+
+    Compiler stcCompilation:(self class stcCompilationOptions at:self stcCompilationSelection value).
+    Compiler foldConstants:(self class constantFoldingOptions at:self constantFoldingSelection value).
+
+    self supportsJustInTimeCompilation ifTrue:[
+        | justInTime |
+        justInTime := self justInTimeCompilation value.
+        justInTime ifTrue:[
+            Method allInstancesDo:[:m | m checked:false].
+        ].
+        ObjectMemory justInTimeCompilation:justInTime.
+        ObjectMemory fullSingleStepSupport:self fullDebugSupport value.
+    ].
+    Autoload compileLazy:self compileLazy value.
+    Smalltalk loadBinaries:self loadBinaries value.
+    self modifiedChannel value:false.
+!
+
+stcCompilerSettings
+
+    AbstractLauncherApplication::LauncherDialogs stcCompilerSettings
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl methodsFor:'aspects'!
+
+allowDollar
+
+    allowDollar isNil ifTrue:[
+        allowDollar := (Compiler allowDollarInIdentifier ? false) asValue.
+        allowDollar onChangeSend:#evaluateModified to:self.
+        allowDollar addDependent:self.
+    ].
+    ^ allowDollar.
+!
+
+allowDolphinExtensions
+
+    allowDolphinExtensions isNil ifTrue:[
+        allowDolphinExtensions := (Compiler allowDolphinExtensions ? false) asValue.
+        allowDolphinExtensions onChangeSend:#evaluateModified to:self.
+    ].
+    ^ allowDolphinExtensions.
+!
+
+allowOldStyleAssignment
+
+    allowOldStyleAssignment isNil ifTrue:[
+        allowOldStyleAssignment := (Compiler allowOldStyleAssignment ? false) asValue.
+        allowOldStyleAssignment onChangeSend:#evaluateModified to:self.
+    ].
+    ^ allowOldStyleAssignment.
+!
+
+allowQualifiedNames
+
+    allowQualifiedNames isNil ifTrue:[
+        allowQualifiedNames := (Compiler allowQualifiedNames ? false) asValue.
+        allowQualifiedNames onChangeSend:#evaluateModified to:self.
+    ].
+    ^ allowQualifiedNames.
+!
+
+allowReservedWordsAsSelectors
+
+    allowReservedWordsAsSelectors isNil ifTrue:[
+        allowReservedWordsAsSelectors := (Compiler allowReservedWordsAsSelectors ? false) asValue.
+        allowReservedWordsAsSelectors onChangeSend:#evaluateModified to:self.
+    ].
+    ^ allowReservedWordsAsSelectors.
+!
+
+allowSqueakExtensions
+
+    allowSqueakExtensions isNil ifTrue:[
+        allowSqueakExtensions := (Compiler allowSqueakExtensions ? false) asValue.
+        allowSqueakExtensions onChangeSend:#evaluateModified to:self.
+    ].
+    ^ allowSqueakExtensions.
+!
+
+allowUnderscore
+
+    allowUnderscore isNil ifTrue:[
+        allowUnderscore := (Compiler allowUnderscoreInIdentifier ? false) asValue.
+        allowUnderscore onChangeSend:#evaluateModified to:self.
+        allowUnderscore addDependent:self.
+    ].
+    ^ allowUnderscore.
+!
+
+canLoadBinaries
+
+    canLoadBinaries isNil ifTrue:[
+        canLoadBinaries := ObjectFileLoader notNil and:[ObjectFileLoader canLoadObjectFiles].
+    ].
+    ^ canLoadBinaries.
+!
+
+catchClassRedefs
+
+    catchClassRedefs isNil ifTrue:[
+        catchClassRedefs := (Class catchClassRedefinitions ? false) asValue.
+        catchClassRedefs onChangeSend:#evaluateModified to:self.
+    ].
+    ^ catchClassRedefs.
+!
+
+catchMethodRedefs
+
+    catchMethodRedefs isNil ifTrue:[
+        catchMethodRedefs := (Class catchMethodRedefinitions ? false) asValue.
+        catchMethodRedefs onChangeSend:#evaluateModified to:self.
+    ].
+    ^ catchMethodRedefs.
+!
+
+compileLazy
+
+    compileLazy isNil ifTrue:[
+        compileLazy := (Autoload compileLazy ? false) asValue.
+        compileLazy onChangeSend:#evaluateModified to:self.
+    ].
+    ^ compileLazy.
+!
+
+constantFolding
+
+    constantFolding isNil ifTrue:[
+        constantFolding := (resources array:(self class constantFoldingStrings)) asList.
+    ].
+    ^ constantFolding.
+!
+
+constantFoldingOptions
+
+    constantFoldingOptions isNil ifTrue:[
+        constantFoldingOptions := self class constantFoldingOptions.
+    ].
+    ^ constantFoldingOptions.
+!
+
+constantFoldingSelection
+
+    constantFoldingSelection isNil ifTrue:[
+        | index |
+        index := self class constantFoldingOptions indexOf:Compiler foldConstants ifAbsent:3.
+        constantFoldingSelection := index asValue.
+        constantFoldingSelection onChangeSend:#evaluateModified to:self.
+    ].
+    ^ constantFoldingSelection.
+!
+
+enableDollar
+
+    enableDollar isNil ifTrue:[
+        enableDollar := true asValue.
+        enableDollar addDependent:self.
+    ].
+    ^ enableDollar.
+!
+
+enableUnderscore
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    enableUnderscore isNil ifTrue:[
+        enableUnderscore := true asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       enableUnderscore addDependent:self.
+"/       enableUnderscore onChangeSend:#enableUnderscoreChanged to:self.
+    ].
+    ^ enableUnderscore.
+!
+
+fullDebugSupport
+
+    fullDebugSupport isNil ifTrue:[
+        self supportsJustInTimeCompilation ifTrue:[
+            fullDebugSupport := (ObjectMemory fullSingleStepSupport ? false) asValue.
+        ] ifFalse:[ 
+            fullDebugSupport := (Compiler lineNumberInfo == #full) asValue.
+        ].
+        fullDebugSupport onChangeSend:#evaluateModified to:self.
+    ].
+    ^ fullDebugSupport.
+!
+
+fullHistoryUpdate
+
+    fullHistoryUpdate isNil ifTrue:[
+        self hasHistoryManager ifTrue:[
+            fullHistoryUpdate := (HistoryManager fullHistoryUpdate ? false) asValue.
+        ] ifFalse:[
+            fullHistoryUpdate := false asValue.
+        ].
+        fullHistoryUpdate onChangeSend:#evaluateModified to:self.
+    ].
+    ^ fullHistoryUpdate.
+!
+
+historyLines
+
+    historyLines isNil ifTrue:[
+        historyLines := self hasHistoryManager asValue.
+        historyLines onChangeSend:#evaluateModified to:self.
+    ].
+    ^ historyLines.
+!
+
+immutableArrays
+
+    immutableArrays isNil ifTrue:[
+        immutableArrays := (Compiler arraysAreImmutable ? false) asValue.
+        immutableArrays onChangeSend:#evaluateModified to:self.
+    ].
+    ^ immutableArrays.
+!
+
+justInTimeCompilation
+
+    justInTimeCompilation isNil ifTrue:[
+        self supportsJustInTimeCompilation ifTrue:[
+            justInTimeCompilation := (ObjectMemory justInTimeCompilation ? false) asValue.
+        ] ifFalse:[ 
+            justInTimeCompilation := false asValue.
+        ].
+        justInTimeCompilation onChangeSend:#evaluateModified to:self.
+    ].
+    ^ justInTimeCompilation.
+!
+
+keepSource
+
+    keepSource isNil ifTrue:[
+        keepSource := (resources array:(self class keepSourceStrings)) asList.
+    ].
+    ^ keepSource.
+!
+
+keepSourceSelection
+
+    keepSourceSelection isNil ifTrue:[
+        keepSourceSelection := (self class keepSourceOptions indexOf:ClassCategoryReader sourceMode ifAbsent:1) asValue.
+        keepSourceSelection onChangeSend:#evaluateModified to:self.
+    ].
+    ^ keepSourceSelection.
+!
+
+loadBinaries
+
+    loadBinaries isNil ifTrue:[
+        self canLoadBinaries ifTrue:[ 
+            loadBinaries:=  Smalltalk loadBinaries asValue
+        ] ifFalse:[
+            loadBinaries:=  false asValue
+        ].
+        loadBinaries onChangeSend:#evaluateModified to:self.
+    ].
+    ^ loadBinaries.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+stcCompilationList
+
+    stcCompilationList isNil ifTrue:[
+        self thisIsADemoVersion ifTrue:[
+            stcCompilationList := (resources array:(self class stcCompilationDemoStrings)) asList.
+        ] ifFalse:[
+            stcCompilationList := (resources array:(self class stcCompilationFullVersionStrings)) asList.
+        ]
+    ].
+    ^ stcCompilationList.
+!
+
+stcCompilationSelection
+
+    stcCompilationSelection isNil ifTrue:[
+        self thisIsADemoVersion ifTrue:[
+            stcCompilationSelection := (self class stcCompilationOptions indexOf:(Compiler stcCompilation) ifAbsent:2) asValue.
+        ] ifFalse:[
+            stcCompilationSelection := 2 asValue.
+        ].
+        stcCompilationSelection onChangeSend:#evaluateModified to:self.
+    ].
+    ^ stcCompilationSelection.
+!
+
+warnCommonMistakes
+
+    warnCommonMistakes isNil ifTrue:[
+        warnCommonMistakes := (Compiler warnCommonMistakes ? false) asValue.
+        warnCommonMistakes onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnCommonMistakes.
+!
+
+warnCompatibility
+
+    warnCompatibility isNil ifTrue:[
+        warnCompatibility := (Compiler warnPossibleIncompatibilities ? false) asValue.
+        warnCompatibility onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnCompatibility.
+!
+
+warnDollar
+
+    warnDollar isNil ifTrue:[
+        warnDollar := (Compiler warnDollarInIdentifier ? false) asValue.
+        warnDollar onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnDollar.
+!
+
+warnOldStyle
+
+    warnOldStyle isNil ifTrue:[
+        warnOldStyle := (Compiler warnOldStyleAssignment ? false) asValue.
+        warnOldStyle onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnOldStyle.
+!
+
+warnSTX
+
+    warnSTX isNil ifTrue:[
+        warnSTX := (Compiler warnSTXSpecials ? false) asValue.
+        warnSTX onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnSTX.
+!
+
+warnUnderscore
+
+    warnUnderscore isNil ifTrue:[
+        warnUnderscore := (Compiler warnUnderscoreInIdentifier ? false) asValue.
+        warnUnderscore onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnUnderscore.
+!
+
+warnUnusedVars
+
+    warnUnusedVars isNil ifTrue:[
+        warnUnusedVars := (Compiler warnUnusedVars ? false) asValue.
+        warnUnusedVars onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnUnusedVars.
+!
+
+warnings
+
+    warnings isNil ifTrue:[
+        warnings := (Compiler warnings ? false) asValue.
+        warnings addDependent:self.
+        warnings changed.
+        warnings onChangeSend:#evaluateModified to:self.
+    ].
+    ^ warnings.
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self warnings ifTrue:[
+        self warnings value ifTrue:[
+            self enableUnderscore value:self allowUnderscore value.
+            self enableDollar value:self allowDollar value.
+        ] ifFalse:[
+            self enableUnderscore value:false.
+            self enableDollar value:false.
+        ].
+        ^ self
+    ].
+    (changedObject == self allowDollar or:[changedObject == self allowUnderscore]) ifTrue:[
+        self warnings changed.
+        ^ self
+    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    super initialize
+! !
+
+!AbstractSettingsApplication::CompilerSettingsAppl methodsFor:'queries'!
+
+hasHistoryManager
+
+    ^ HistoryManager notNil and:[HistoryManager isLoaded and:[HistoryManager isActive]]
+!
+
+hasUnsavedChanges
+
+    ^ 
+        (
+        ((HistoryManager fullHistoryUpdate ? false) ~= self fullHistoryUpdate value) or:[
+        ((Class catchMethodRedefinitions ? false) ~= self catchMethodRedefs value) or:[
+        ((Class catchClassRedefinitions ? false) ~= self catchClassRedefs value) or:[
+        ((ClassCategoryReader sourceMode) ~= (self class keepSourceOptions at:self keepSourceSelection value)) or:[
+        ((Compiler warnings ? false) ~= self warnings value) or:[
+        ((Compiler warnSTXSpecials ? false) ~= self warnSTX value) or:[
+        ((Compiler warnOldStyleAssignment ? false) ~= self warnOldStyle value) or:[
+        ((Compiler warnUnderscoreInIdentifier ? false) ~= self warnUnderscore value) or:[
+        ((Compiler warnDollarInIdentifier ? false) ~= self warnDollar value) or:[
+        ((Compiler warnCommonMistakes ? false) ~= self warnCommonMistakes value) or:[
+        ((Compiler warnPossibleIncompatibilities ? false) ~= self warnCompatibility value) or:[
+        ((Compiler warnUnusedVars ? false) ~= self warnUnusedVars value)  or:[
+        ((Compiler allowUnderscoreInIdentifier ? false) ~= self allowUnderscore value) or:[
+        ((Compiler allowDollarInIdentifier ? false) ~= self allowDollar value) or:[
+        ((Compiler allowSqueakExtensions ? false) ~= self allowSqueakExtensions value) or:[
+        ((Compiler allowDolphinExtensions ? false) ~= self allowDolphinExtensions value) or:[
+        ((Compiler allowQualifiedNames ? false) ~= self allowQualifiedNames value) or:[
+        ((Compiler allowOldStyleAssignment ? false) ~= self allowOldStyleAssignment value) or:[
+        ((Compiler allowReservedWordsAsSelectors ? false) ~= self allowReservedWordsAsSelectors value) or:[
+        ((Compiler arraysAreImmutable ? false) ~= self immutableArrays value) or:[
+        ((self supportsJustInTimeCompilation value ifTrue:[ObjectMemory fullSingleStepSupport ? false] ifFalse:[Compiler lineNumberInfo == #full]) ~= self fullDebugSupport value) or:[
+        ((Compiler stcCompilation) ~= (self class stcCompilationOptions at:self stcCompilationSelection value)) or:[
+        ((Compiler foldConstants) ~= (self class constantFoldingOptions at:self constantFoldingSelection value)) or:[
+        ((ObjectMemory justInTimeCompilation ? false) ~= self justInTimeCompilation value) or:[
+        ((Autoload compileLazy ? false) ~= self compileLazy value) or:[
+        ((Smalltalk loadBinaries ? false) ~= self loadBinaries value) or:[
+        ((self hasHistoryManager) ~= self historyLines value) ]]]]]]]]]]]]]]]]]]]]]]]]]])
+!
+
+supportsJustInTimeCompilation
+
+    ^ ObjectMemory supportsJustInTimeCompilation
+!
+
+thisIsADemoVersion
+
+    ^ Smalltalk releaseIdentification = 'ST/X_free_demo_vsn'
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl class methodsFor:'defaults'!
+
+clipEncodingStrings
+
+    ^ #('untranslated' 'iso8859' 'jis' 'jis7' 'shift-JIS' 'EUC' 'big5')
+!
+
+clipEncodingSyms
+
+    ^ #(nil #iso8859 #jis #jis7 #sjis #euc #big5)
+!
+
+staticGrayOrGrayScaleDitherStrings
+
+    ^ #('threshold' 'ordered dither' 'error diffusion')
+!
+
+staticGrayOrGrayScaleDitherSyms
+
+    ^ #(threshold ordered floydSteinberg)
+!
+
+trueColorDitherStrings
+
+    ^ #('nearest color' 'error diffusion')
+!
+
+trueColorDitherSyms
+
+    ^ #(ordered floydSteinberg)
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::DisplaySettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::DisplaySettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::DisplaySettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Display Screen Settings'
+          #name: 'Display Screen Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Actual Visible Screen Area:'
+              #name: 'ActualVisibleScreenAreaLabel'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 22 0)
+              #translateLabel: true
+              #adjust: #left
+            )
+           #(#LabelSpec
+              #label: 'Common Sizes:'
+              #name: 'CommonSizesLabel'
+              #layout: #(#LayoutFrame 0 0 39 0 205 0 61 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'monitor size'
+              #name: 'MonitorSelectionPopUpList'
+              #layout: #(#LayoutFrame 205 0 39 0 -5 1 61 0)
+              #tabable: true
+              #model: #monitorSelection
+              #menu: #monitorList
+              #useIndex: true
+            )
+           #(#LabelSpec
+              #label: 'Screen Size:'
+              #name: 'ScreenSizeLabel'
+              #layout: #(#LayoutFrame 0 0 72 0 205 0 94 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'SizeXEntryField'
+              #layout: #(#LayoutFrame 205 0 72 0 300 0 94 0)
+              #model: #sizeX
+              #type: #number
+              #immediateAccept: true
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: ' x '
+              #name: 'xLabel'
+              #layout: #(#LayoutFrame 314 0 72 0 360 0 94 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'SizeYEntryField'
+              #layout: #(#LayoutFrame 379 0 72 0 474 0 94 0)
+              #model: #sizeY
+              #type: #number
+              #immediateAccept: true
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: '(mm)'
+              #name: 'mmLabel'
+              #layout: #(#LayoutFrame 491 0 72 0 537 0 94 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1.0 109 0)
+            )
+           #(#LabelSpec
+              #name: 'ScreenDepthVisualLabel'
+              #layout: #(#LayoutFrame 0 0.0 113 0.0 0 1.0 135 0)
+              #translateLabel: true
+              #labelChannel: #screenDepthVisualLabelHolder
+              #adjust: #left
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 139 0 0 1.0 143 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Color Monitor'
+              #name: 'ColorMonitorCheckBox'
+              #layout: #(#LayoutFrame 5 0 150 0 250 0 172 0)
+              #model: #isColorMonitor
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Use Fix Color Palette'
+              #name: 'FixColorPaletteCheckBox'
+              #layout: #(#LayoutFrame 5 0 175 0 301 0 197 0)
+              #enableChannel: #visualIsPseudoColor
+              #model: #useFixPalette
+              #translateLabel: true
+              #labelChannel: #useFixPaletteLabel
+            )
+           #(#CheckBoxSpec
+              #label: 'Use Fix Gray Color Palette'
+              #name: 'UseFixGrayPaletteCheckBox'
+              #layout: #(#LayoutFrame 5 0 201 0 301 0 223 0)
+              #enableChannel: #visualIsPseudoColor
+              #model: #useFixGrayPalette
+              #translateLabel: true
+              #labelChannel: #useFixGrayPaletteLabel
+            )
+           #(#LabelSpec
+              #label: 'Image Display:'
+              #name: 'ImageDisplayLabel'
+              #layout: #(#LayoutFrame 0 0 230 0 205 0 252 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'image display'
+              #name: 'DitherListPopUpList'
+              #layout: #(#LayoutFrame 205 0 230 0 -5 1 252 0)
+              #tabable: true
+              #model: #ditherListSelection
+              #enableChannel: #ditherSymsNotNil
+              #menu: #ditherList
+              #useIndex: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Allow Colored/Grayscale Icons'
+              #name: 'AllowColoredGrayscaleIconsCheckBox'
+              #layout: #(#LayoutFrame 5 0 262 0 301 0 284 0)
+              #model: #deepIcons
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 288 0 0 1.0 292 0)
+            )
+           #(#LabelSpec
+              #label: 'ClipBoard Encoding:'
+              #name: 'ClipBoardEncodingLabel'
+              #layout: #(#LayoutFrame 0 0 303 0 205 0 325 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'image display'
+              #name: 'ClipEncodingListPopUpList'
+              #layout: #(#LayoutFrame 205 0 303 0 -5 1 325 0)
+              #tabable: true
+              #model: #clipEncodingListSelection
+              #menu: #clipEncodingList
+              #useIndex: true
+            )
+           #(#DividerSpec
+              #name: 'Separator4'
+              #layout: #(#LayoutFrame 0 0.0 333 0 0 1.0 337 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/screenSettings.html'].
+!
+
+loadRequest
+
+    self useFixPalette value:screen fixColors notNil.
+    self useFixGrayPalette value:screen fixGrayColors notNil.
+    self isColorMonitor value:screen hasColors.
+    self sizeX value:screen widthInMillimeter.
+    self sizeY value:screen heightInMillimeter.
+
+    self deepIcons value:screen supportsDeepIcons.
+    ditherSyms notNil ifTrue:[
+        self ditherListSelection value:(ditherSyms indexOf:(Image ditherAlgorithm) ifAbsent:#threshold).
+    ].
+    self clipEncodingListSelection value:(self class clipEncodingSyms indexOf:screen clipBoardEncoding ifAbsent:1).
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        Image flushDeviceImages.
+
+        screen visualType == #PseudoColor ifTrue:[
+            self useFixPalette value ifTrue:[
+                Color colorAllocationFailSignal handle:[:ex |
+                    self warn:'Could not allocate colors.'.
+                ] do:[
+                    Color getColorsRed:4 green:8 blue:4 on:screen
+                ]
+            ] ifFalse:[
+                screen releaseFixColors
+            ].
+
+            self useFixGrayPalette value ifTrue:[
+                Color colorAllocationFailSignal handle:[:ex |
+                    self warn:'Could not allocate colors.'.
+                ] do:[
+                    Color getGrayColors:32 on:screen
+                ]
+            ] ifFalse:[
+                screen releaseFixGrayColors
+            ]
+        ].
+        screen hasColors:self isColorMonitor value.
+        screen widthInMillimeter:self sizeX value.
+        screen heightInMillimeter:self sizeY value.
+
+        screen supportsDeepIcons:self deepIcons value.
+        ditherSyms notNil ifTrue:[
+            Image ditherAlgorithm:(ditherSyms at:self ditherListSelection value).
+        ].
+
+        WindowGroup activeGroup withWaitCursorDo:[
+            View defaultStyle:(View defaultStyle).
+        ].
+
+        screen clipBoardEncoding:(self class clipEncodingSyms at:self clipEncodingListSelection value).
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl methodsFor:'aspects'!
+
+clipEncodingList
+
+    clipEncodingList isNil ifTrue:[
+        clipEncodingList := (resources array:self class clipEncodingStrings) asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       clipEncodingList addDependent:self.
+"/       clipEncodingList onChangeSend:#clipEncodingListChanged to:self.
+    ].
+    ^ clipEncodingList.
+!
+
+clipEncodingListSelection
+
+    clipEncodingListSelection isNil ifTrue:[
+        clipEncodingListSelection := (self class clipEncodingSyms indexOf:screen clipBoardEncoding ifAbsent:1) asValue.
+        clipEncodingListSelection onChangeSend:#evaluateModified to:self.
+    ].
+    ^ clipEncodingListSelection.
+!
+
+deepIcons
+
+    deepIcons isNil ifTrue:[
+        deepIcons := screen supportsDeepIcons asValue.
+        deepIcons onChangeSend:#evaluateModified to:self.
+    ].
+    ^ deepIcons.
+!
+
+ditherList
+
+    ditherList isNil ifTrue:[
+        ditherList := ValueHolder new.
+    ].
+    ^ ditherList.
+!
+
+ditherListSelection
+
+    ditherListSelection isNil ifTrue:[
+        ditherSyms notNil ifTrue:[
+            ditherListSelection := (ditherSyms indexOf:(Image ditherAlgorithm) ifAbsent:#threshold) asValue.
+        ] ifFalse:[
+            ditherListSelection := ValueHolder new.
+        ].
+        ditherListSelection onChangeSend:#evaluateModified to:self.
+    ].
+    ^ ditherListSelection.
+!
+
+ditherSymsNotNil
+
+    ditherSymsNotNil isNil ifTrue:[
+        ditherSymsNotNil := ditherSyms notNil asValue.
+    ].
+    ^ ditherSymsNotNil.
+!
+
+isColorMonitor
+
+    isColorMonitor isNil ifTrue:[
+        isColorMonitor := screen hasColors asValue.
+        isColorMonitor onChangeSend:#evaluateModified to:self.
+    ].
+    ^ isColorMonitor.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+monitorList
+
+    monitorList isNil ifTrue:[
+        monitorList := (resources array:(sizeInfos collect:[:entry | entry at:1])) asList.
+    ].
+    ^ monitorList.
+!
+
+monitorSelection
+
+    monitorSelection isNil ifTrue:[
+        monitorSelection := ValueHolder new.
+        monitorSelection addDependent:self.
+        monitorSelection onChangeSend:#evaluateModified to:self.
+        monitorSelection changed.
+    ].
+    ^ monitorSelection.
+!
+
+screenDepthVisualLabelHolder
+
+    screenDepthVisualLabelHolder isNil ifTrue:[
+        screenDepthVisualLabelHolder := (resources string:'Screen: Depth: %1 Visual: %2  (%3)'
+                                 with:screen depth printString
+                                 with:screen visualType
+                                 with:screen serverVendor) asValue.
+    ].
+    ^ screenDepthVisualLabelHolder.
+!
+
+sizeX
+
+    sizeX isNil ifTrue:[
+        sizeX := screen widthInMillimeter asValue.
+        sizeX addDependent:self.
+        sizeX changed.
+        sizeX onChangeSend:#evaluateModified to:self.
+    ].
+    ^ sizeX.
+!
+
+sizeY
+
+    sizeY isNil ifTrue:[
+        sizeY := screen heightInMillimeter asValue.
+        sizeY addDependent:self.
+        sizeY changed.
+        sizeY onChangeSend:#evaluateModified to:self.
+    ].
+    ^ sizeY.
+!
+
+useFixGrayPalette
+
+    useFixGrayPalette isNil ifTrue:[
+        useFixGrayPalette := screen fixGrayColors notNil asValue.
+        useFixGrayPalette onChangeSend:#evaluateModified to:self.
+    ].
+    ^ useFixGrayPalette.
+!
+
+useFixGrayPaletteLabel
+
+    useFixGrayPaletteLabel isNil ifTrue:[
+        useFixGrayPaletteLabel := (resources string:'Use Fix Gray Color Palette %1' with:'(32)') asValue.
+    ].
+    ^ useFixGrayPaletteLabel.
+!
+
+useFixPalette
+
+    useFixPalette isNil ifTrue:[
+        useFixPalette := screen fixColors notNil asValue.
+        useFixPalette onChangeSend:#evaluateModified to:self.
+    ].
+    ^ useFixPalette.
+!
+
+useFixPaletteLabel
+
+    useFixPaletteLabel isNil ifTrue:[
+        useFixPaletteLabel := (resources string:'Use Fix Color Palette %1' with:'(4x8x4)') asValue.
+    ].
+    ^ useFixPaletteLabel.
+!
+
+visualIsPseudoColor
+
+    visualIsPseudoColor isNil ifTrue:[
+        visualIsPseudoColor := (screen visualType == #PseudoColor) asValue.
+        visualIsPseudoColor onChangeSend:#evaluateModified to:self.
+    ].
+    ^ visualIsPseudoColor.
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl methodsFor:'change & update'!
+
+monitorSelectionChanged
+
+    | sel sizeInfoEntry sizes|
+
+    sel := self monitorSelection value.
+    (sel notNil and:[sel ~~ 0]) ifTrue:[
+        sizeInfoEntry := sizeInfos at:sel.
+        sizes := sizeInfoEntry at:2.
+        self sizeX value:(sizes at:1).
+        self sizeY value:(sizes at:2).
+    ].
+!
+
+sizeXorYChanged
+    | sizes idx|
+
+    sizes := sizeInfos collect:[:entry | entry at:2].
+    idx := sizes findFirst:[:entry |
+                                ((entry at:1) = sizeX value)
+                                and:[((entry at:2) = sizeY value)]
+                           ].
+    idx ~~ 0 ifTrue:[
+        self monitorSelection value:idx
+    ].
+!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self monitorSelection ifTrue:[
+        self monitorSelectionChanged.
+        ^ self.
+    ].
+    (changedObject == self sizeX or:[self sizeY]) ifTrue:[
+        self sizeXorYChanged.
+        ^ self.
+    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    | listOfSizes visual|
+    resources := self class owningClass classResources.
+    screen := Screen current.
+    listOfSizes := resources at:'LIST_OF_OFFERED_SCREEN_SIZES' default:#default.
+    listOfSizes == #default ifTrue:[
+        "/ nothing in resource file; offer at least some.
+        sizeInfos := #(
+                           ( '11.3'' (235mm x 175mm) LCD'   (235 175)    )
+                           ( '17''   (325mm x 245mm)'       (325 245)    )
+                           ( '19''   (340mm x 270mm)'       (340 270)    )
+                           ( '20''   (350mm x 280mm)'       (350 280)    )
+                           ( '21''   (365mm x 285mm)'       (365 285)    )
+                       ).
+    ] ifFalse:[
+        sizeInfos := resources array:listOfSizes.
+    ].
+    visual := screen visualType.
+    (visual == #StaticGray or:[visual == #GrayScale]) ifTrue:[
+        ditherStyles := self class staticGrayOrGrayScaleDitherStrings.
+        ditherSyms := self class staticGrayOrGrayScaleDitherSyms.
+    ] ifFalse:[
+        visual ~~ #TrueColor ifTrue:[
+            ditherStyles := self class trueColorDitherStrings.
+            ditherSyms := self class trueColorDitherSyms.
+        ]
+    ].
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::DisplaySettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ (
+        self useFixPalette value ~= screen fixColors notNil or:[
+        self useFixGrayPalette value ~= screen fixGrayColors notNil or:[
+        self isColorMonitor value ~= screen hasColors or:[
+        self sizeX value ~= screen widthInMillimeter or:[
+        self sizeY value ~= screen heightInMillimeter or:[
+
+        self deepIcons value ~= screen supportsDeepIcons or:[
+        (ditherSyms notNil and:[
+            self ditherListSelection value ~= (ditherSyms indexOf:(Image ditherAlgorithm) ifAbsent:#threshold).
+        ]) or:[
+        self clipEncodingListSelection value ~= (self class clipEncodingSyms indexOf:screen clipBoardEncoding ifAbsent:1)
+        ]]]]]]]
+    )
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::EditSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::EditSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::EditSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Settings'
+          #name: 'Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VerticalPanelViewSpec
+              #name: 'VerticalPanel2'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -40 1.0)
+              #horizontalLayout: #fit
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#VerticalPanelViewSpec
+                    #name: 'VerticalPanel1'
+                    #horizontalLayout: #fit
+                    #verticalLayout: #top
+                    #horizontalSpace: 3
+                    #verticalSpace: 3
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#CheckBoxSpec
+                          #label: 'CTRL-Key to Start TextDrag'
+                          #name: 'CTRLKeyStTextDragCheckBox'
+                          #model: #startTextDragWithControl
+                          #translateLabel: true
+                          #extent: #(#Point 600 23)
+                        )
+                       #(#CheckBoxSpec
+                          #label: 'SearchBox is Modal'
+                          #name: 'SearchBoxModalCheckBox'
+                          #model: #searchDialogIsModal
+                          #translateLabel: true
+                          #extent: #(#Point 600 23)
+                        )
+                       #(#CheckBoxSpec
+                          #label: 'Tab Stops in Multiples of 4'
+                          #name: 'TabStopsMultiples4CheckBox'
+                          #model: #tabsIs4
+                          #translateLabel: true
+                          #extent: #(#Point 600 23)
+                        )
+                       #(#CheckBoxSpec
+                          #label: 'Double Click Select Behavior as in ST80'
+                          #name: 'DoubleClickSelectBehaviorST80CheckBox'
+                          #model: #st80DoubleClickSelectMode
+                          #translateLabel: true
+                          #extent: #(#Point 600 23)
+                        )
+                       #(#CheckBoxSpec
+                          #label: 'Cursor has ST80 Line-end Behavior'
+                          #name: 'CursorST80LineEndBehaviorCheckBox'
+                          #model: #st80EditingMode
+                          #translateLabel: true
+                          #extent: #(#Point 600 23)
+                        )
+                       )
+                     
+                    )
+                    #extent: #(#Point 600 200)
+                  )
+                 )
+               
+              )
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/editSettings.html'].
+!
+
+loadRequest
+
+    self st80EditingMode value: UserPreferences current st80EditMode.
+    self st80DoubleClickSelectMode value: TextView st80SelectMode.
+    self tabsIs4 value: (ListView userDefaultTabPositions = ListView tab4Positions).
+    self searchDialogIsModal value: UserPreferences current searchDialogIsModal.
+    self startTextDragWithControl value: UserPreferences current startTextDragWithControl.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        UserPreferences current st80EditMode:(self st80EditingMode value).
+        TextView st80SelectMode:(self st80DoubleClickSelectMode value).
+        tabsIs4 value ~~ (ListView userDefaultTabPositions = ListView tab4Positions) ifTrue:[
+            ListView userDefaultTabPositions:(self tabsIs4 value ifTrue:[ListView tab4Positions] ifFalse:[ListView tab8Positions]).
+            ListView allSubInstancesDo:[:eachKindOfListView |
+                self tabsIs4 value ifTrue:[eachKindOfListView setTab4] ifFalse:[eachKindOfListView setTab8]
+            ].
+        ].
+        UserPreferences current searchDialogIsModal:self searchDialogIsModal value.
+        UserPreferences current startTextDragWithControl:self startTextDragWithControl value.
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl methodsFor:'aspects'!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+searchDialogIsModal
+
+    searchDialogIsModal isNil ifTrue:[
+        searchDialogIsModal := true asValue.
+        searchDialogIsModal onChangeSend:#evaluateModified to:self.
+    ].
+    ^ searchDialogIsModal.
+!
+
+st80DoubleClickSelectMode
+
+    st80DoubleClickSelectMode isNil ifTrue:[
+        st80DoubleClickSelectMode := true asValue.
+        st80DoubleClickSelectMode onChangeSend:#evaluateModified to:self.
+    ].
+    ^ st80DoubleClickSelectMode.
+!
+
+st80EditingMode
+
+    st80EditingMode isNil ifTrue:[
+        st80EditingMode := true asValue.
+        st80EditingMode onChangeSend:#evaluateModified to:self.
+    ].
+    ^ st80EditingMode.
+!
+
+startTextDragWithControl
+
+    startTextDragWithControl isNil ifTrue:[
+        startTextDragWithControl := true asValue.
+        startTextDragWithControl onChangeSend:#evaluateModified to:self.
+    ].
+    ^ startTextDragWithControl.
+!
+
+tabsIs4
+
+    tabsIs4 isNil ifTrue:[
+        tabsIs4 := true asValue.
+        tabsIs4 onChangeSend:#evaluateModified to:self.
+    ].
+    ^ tabsIs4.
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+"/    changedObject == self allOfThem ifTrue:[
+"/        ^ self.
+"/    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    self loadRequest.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::EditSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ (
+        UserPreferences current st80EditMode ~= (self st80EditingMode value) or:[
+        TextView st80SelectMode ~= (self st80DoubleClickSelectMode value) or:[
+        (tabsIs4 value ~~ (ListView userDefaultTabPositions = ListView tab4Positions) and:[
+            ListView userDefaultTabPositions ~= (self tabsIs4 value ifTrue:[ListView tab4Positions] ifFalse:[ListView tab8Positions]) or:[
+        ]]) or:[
+        UserPreferences current searchDialogIsModal ~= self searchDialogIsModal value or:[
+        UserPreferences current startTextDragWithControl ~= self startTextDragWithControl value ]]]]
+    )
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl class methodsFor:'defaults'!
+
+widgetList
+
+    ^  #(
+        'All' 
+        'Labels' 
+        'Buttons' 
+        'Lists' 
+        'Menus' 
+        'Edited Text'
+       )
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl class methodsFor:'instance creation'!
+
+fontForEncoding:encodingMatch
+
+    | inst |
+
+    inst := self new.
+    inst encodingMatch:encodingMatch.
+    self initialize.
+    self open.
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::FontSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Font Settings'
+          #name: 'Font Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 490 353)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#ViewSpec
+              #name: 'AllBox'
+              #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 50 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'All'
+                    #name: 'All'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Label'
+                    #name: 'AllFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #allFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildAllFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'ChangeAll'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeAllFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 50 0 0 1.0 54 0)
+            )
+           #(#ViewSpec
+              #name: 'LabelsBox'
+              #layout: #(#LayoutFrame 0 0.0 55 0 0 1.0 105 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Labels'
+                    #name: 'Labels'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Labels'
+                    #name: 'LabelsFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #labelsFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildLabelsFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'ChangeLabels'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeLabelsFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1.0 109 0)
+            )
+           #(#ViewSpec
+              #name: 'ButtonsBox'
+              #layout: #(#LayoutFrame 0 0.0 110 0 0 1.0 160 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Buttons'
+                    #name: 'Buttons'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Buttons Font'
+                    #name: 'ButtonsFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #buttonsFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildButtonsFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'Change Buttons'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeButtonsFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 160 0 0 1.0 164 0)
+            )
+           #(#ViewSpec
+              #name: 'ListsBox'
+              #layout: #(#LayoutFrame 0 0.0 165 0 0 1.0 215 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Lists'
+                    #name: 'Lists'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Lists Font'
+                    #name: 'ListsFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #listsFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildListsFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'ChangeLists'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeListsFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator4'
+              #layout: #(#LayoutFrame 0 0.0 215 0 0 1.0 219 0)
+            )
+           #(#ViewSpec
+              #name: 'MenusBox'
+              #layout: #(#LayoutFrame 0 0.0 220 0 0 1.0 270 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Menus'
+                    #name: 'Menus'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Menus Font'
+                    #name: 'MenusFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #menusFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildMenuesFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'ChangeMenus'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeMenusFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator5'
+              #layout: #(#LayoutFrame 0 0.0 270 0 0 1.0 274 0)
+            )
+           #(#ViewSpec
+              #name: 'TextBox'
+              #layout: #(#LayoutFrame 0 0.0 280 0 0 1.0 340 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Text'
+                    #name: 'Text'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 100 0 20 0)
+                    #style: #(#FontDescription #helvetica #bold #roman 12)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Text Font'
+                    #name: 'TextFont'
+                    #layout: #(#LayoutFrame 105 0 22 0 -5 1 44 0)
+                    #translateLabel: true
+                    #labelChannel: #textFontLabelHolder
+                    #adjust: #left
+                    #postBuildCallback: #postBuildTextFontLabel:
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Change ...'
+                    #name: 'ChangeText'
+                    #layout: #(#LayoutFrame 0 0.0 22 0 105 0 44 0)
+                    #translateLabel: true
+                    #model: #changeTextFont
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator6'
+              #layout: #(#LayoutFrame 0 0.0 340 0 0 1.0 344 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 0
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 100 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 100 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Defaults'
+                    #name: 'Button1'
+                    #translateLabel: true
+                    #model: #loadRequest
+                    #extent: #(#Point 100 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 100 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+!
+
+windowSpec2
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::FontSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Font Settings'
+          #name: 'Font Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 533)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#SequenceViewSpec
+              #name: 'WidgetList'
+              #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 105 0)
+              #model: #selectedWidget
+              #style: #(#FontDescription #helvetica #bold #roman 12)
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #useIndex: false
+              #sequenceList: #widgetList
+            )
+           #(#ViewSpec
+              #name: 'Box1'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1.0 -34 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#NonScrollableArbitraryComponentSpec
+                    #name: 'FontPanel'
+                    #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                    #component: #FontPanel
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+!
+
+windowSpecFirst
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::FontSettingsAppl andSelector:#windowSpecFirst
+     AbstractLauncherApplication::FontSettingsAppl new openInterface:#windowSpecFirst
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpecFirst
+        #window: 
+       #(#WindowSpec
+          #label: 'Font Settings'
+          #name: 'Font Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 456)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+!
+
+windowSpecx
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::FontSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::FontSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Font Settings'
+          #name: 'Font Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 533)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#SequenceViewSpec
+              #name: 'WidgetList'
+              #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 105 0)
+              #model: #selectedWidget
+              #style: #(#FontDescription #helvetica #bold #roman 12)
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #useIndex: false
+              #sequenceList: #widgetList
+            )
+           #(#ViewSpec
+              #name: 'Box1'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1.0 -34 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#TextEditorSpec
+                    #name: 'ExampleText'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 145 0)
+                    #model: #exampleText
+                    #hasHorizontalScrollBar: true
+                    #hasVerticalScrollBar: true
+                  )
+                 #(#VariableHorizontalPanelSpec
+                    #name: 'VariableHorizontalPanel1'
+                    #layout: #(#LayoutFrame 0 0.0 145 0 0 1.0 -20 1)
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#ViewSpec
+                          #name: 'FamilyBox'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#SequenceViewSpec
+                                #name: 'FamilyList'
+                                #layout: #(#LayoutFrame 0 0.0 20 0.0 0 1.0 0 1.0)
+                                #model: #selectedFamily
+                                #hasHorizontalScrollBar: true
+                                #hasVerticalScrollBar: true
+                                #useIndex: false
+                                #sequenceList: #familyList
+                              )
+                             #(#LabelSpec
+                                #label: 'Family'
+                                #name: 'FamilyLabel'
+                                #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 20 0)
+                                #translateLabel: true
+                              )
+                             )
+                           
+                          )
+                        )
+                       #(#ViewSpec
+                          #name: 'TypeFaceBox'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#SequenceViewSpec
+                                #name: 'TypeFaceList'
+                                #layout: #(#LayoutFrame 0 0.0 20 0.0 0 1.0 0 1.0)
+                                #model: #selectedTypeFace
+                                #hasHorizontalScrollBar: true
+                                #hasVerticalScrollBar: true
+                                #useIndex: false
+                                #sequenceList: #typeFaceList
+                              )
+                             #(#LabelSpec
+                                #label: 'TypeFace'
+                                #name: 'TypeFaceLabel'
+                                #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 20 0)
+                                #translateLabel: true
+                              )
+                             )
+                           
+                          )
+                        )
+                       #(#ViewSpec
+                          #name: 'SizeListBox'
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#LabelSpec
+                                #label: 'Size'
+                                #name: 'SizeLabel'
+                                #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 20 0)
+                                #translateLabel: true
+                              )
+                             #(#SequenceViewSpec
+                                #name: 'SizeList'
+                                #layout: #(#LayoutFrame 0 0.0 20 0.0 0 1.0 0 1.0)
+                                #model: #selectedSize
+                                #hasHorizontalScrollBar: true
+                                #hasVerticalScrollBar: true
+                                #useIndex: false
+                                #sequenceList: #sizeList
+                              )
+                             )
+                           
+                          )
+                        )
+                       )
+                     
+                    )
+                    #handles: #(#Any 0.333333 0.666667 1.0)
+                  )
+                 #(#LabelSpec
+                    #label: 'CurrentFontLabel'
+                    #name: 'CurrentFontLabel'
+                    #layout: #(#LayoutFrame 0 0.0 -20 1 0 1.0 0 1)
+                    #level: -1
+                    #translateLabel: true
+                    #labelChannel: #currentFontLabelHolder
+                    #adjust: #left
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'accessing'!
+
+encodingMatch:aEncodingMatch
+
+    aEncodingMatch notNil ifTrue:[
+        filter := [:f | f encoding notNil 
+                        and:[aEncodingMatch match:f encoding]].
+    ].
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'actions'!
+
+changeAllFont
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self allOfThem value) 
+                      title:(resources string:'Font for %1' with:'All')
+                     filter:filter.
+    f notNil ifTrue:[
+        self allOfThem value:f.
+        self labelDef value:f.
+        self buttonDef value:f.
+        self listDef value:f.
+        self menuDef value:f.
+        self textDef value:f.
+    ]
+!
+
+changeButtonsFont
+
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self allOfThem value) 
+                      title:(resources string:'Font for %1' with:'All')
+                     filter:filter.
+    f notNil ifTrue:[
+        self allOfThem value:f.
+    ]
+!
+
+changeLabelsFont
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self labelDef value) 
+                      title:(resources string:'Font for %1' with:'Labels')
+                     filter:filter.
+    f notNil ifTrue:[
+        self labelDef value:f.
+    ]
+!
+
+changeListsFont
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self listDef value) 
+                      title:(resources string:'Font for %1' with:'Lists')
+                     filter:filter.
+    f notNil ifTrue:[
+        self listDef value:f.
+    ]
+!
+
+changeMenusFont
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self menuDef value) 
+                      title:(resources string:'Font for %1' with:'Menus')
+                     filter:filter.
+    f notNil ifTrue:[
+        self menuDef value:f.
+    ]
+!
+
+changeTextFont
+    |f|
+
+    f := FontPanel 
+        fontFromUserInitial:(self textDef value) 
+                      title:(resources string:'Font for %1' with:'Edited Text')
+                     filter:filter.
+    f notNil ifTrue:[
+        self textDef value:f.
+    ]
+!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self warn:'no help available here'.
+"/    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/keyboardSetting.html'].
+!
+
+loadRequest
+
+    View readStyleSheetAndUpdateAllStyleCaches.
+    self labelDef value:Label defaultFont.
+    self buttonDef value:Button defaultFont.
+    self listDef value:SelectionInListView defaultFont.
+    self menuDef value:MenuView defaultFont.
+    self textDef value:TextView defaultFont.
+    self allOfThem value:nil.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    | master requestor|
+
+    master := self masterApplication.
+    master notNil ifTrue:[
+        requestor := master requestor.
+    ].
+    self hasUnsavedChanges ifTrue:[
+        | launcher |
+        Label defaultFont:self labelDef value.
+        Button defaultFont:self buttonDef value.
+        Toggle defaultFont:self buttonDef value.
+        TextView withAllSubclasses do:[:cls | cls defaultFont:self textDef value].
+        SelectionInListView withAllSubclasses do:[:cls | cls defaultFont:self listDef value].
+        MenuView defaultFont:self menuDef value.
+        PullDownMenu defaultFont:self menuDef value.
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'aspects'!
+
+allFontLabelHolder
+
+    allFontLabelHolder isNil ifTrue:[
+        allFontLabelHolder := '' asValue.
+    ].
+    ^ allFontLabelHolder.
+!
+
+allOfThem
+    "return/create the 'allOfThem' value holder (automatically generated)"
+
+    allOfThem isNil ifTrue:[
+        allOfThem := ValueHolder new.
+        allOfThem addDependent:self.
+    ].
+    ^ allOfThem
+!
+
+buttonDef
+    "return/create the 'buttonDef' value holder (automatically generated)"
+
+    buttonDef isNil ifTrue:[
+        buttonDef := ValueHolder new.
+        buttonDef addDependent:self.
+    ].
+    ^ buttonDef
+!
+
+buttonsFontLabelHolder
+
+    buttonsFontLabelHolder isNil ifTrue:[
+        buttonsFontLabelHolder := Button defaultFont asValue.
+    ].
+    ^ buttonsFontLabelHolder.
+!
+
+labelDef
+    "return/create the 'labelDef' value holder (automatically generated)"
+
+    labelDef isNil ifTrue:[
+        labelDef := ValueHolder new.
+        labelDef addDependent:self.
+    ].
+    ^ labelDef
+!
+
+labelsFontLabelHolder
+
+    labelsFontLabelHolder isNil ifTrue:[
+        labelsFontLabelHolder := Label defaultFont asValue.
+    ].
+    ^ labelsFontLabelHolder.
+!
+
+listDef
+    "return/create the 'listDef' value holder (automatically generated)"
+
+    listDef isNil ifTrue:[
+        listDef := ValueHolder new.
+        listDef addDependent:self.
+    ].
+    ^ listDef
+!
+
+listsFontLabelHolder
+
+    listsFontLabelHolder isNil ifTrue:[
+        listsFontLabelHolder := SelectionInListView defaultFont asValue.
+    ].
+    ^ listsFontLabelHolder.
+!
+
+menuDef
+    "return/create the 'menuDef' value holder (automatically generated)"
+
+    menuDef isNil ifTrue:[
+        menuDef := ValueHolder new.
+        menuDef addDependent:self.
+    ].
+    ^ menuDef
+!
+
+menusFontLabelHolder
+
+    menusFontLabelHolder isNil ifTrue:[
+        menusFontLabelHolder := MenuView defaultFont asValue.
+    ].
+    ^ menusFontLabelHolder.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+textDef
+    "return/create the 'textDef' value holder (automatically generated)"
+
+    textDef isNil ifTrue:[
+        textDef := ValueHolder new.
+        textDef addDependent:self.
+    ].
+    ^ textDef
+!
+
+textFontLabelHolder
+
+    textFontLabelHolder isNil ifTrue:[
+        textFontLabelHolder := TextView defaultFont asValue.
+    ].
+    ^ textFontLabelHolder.
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self allOfThem ifTrue:[
+        | f label|
+        f := self allOfThem value.
+        allLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self allFontLabelHolder value:f.
+        self evaluateModified.
+        ^ self.
+    ].
+    changedObject == self labelDef ifTrue:[
+        | f label|
+        f := self labelDef value.
+        labelLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self labelsFontLabelHolder value:f.
+        self evaluateModified.
+        ^ self.
+    ].
+    changedObject == self buttonDef ifTrue:[
+        | f label|
+        f := self buttonDef value.
+        buttonsLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self buttonsFontLabelHolder value:f.
+        self evaluateModified.
+        ^ self.
+    ].
+    changedObject == self listDef ifTrue:[
+        | f label|
+        f := self listDef value.
+        listsLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self listsFontLabelHolder value:f.
+        self evaluateModified.
+        ^ self.
+    ].
+    changedObject == self menuDef ifTrue:[
+        | f label|
+        f := self menuDef value.
+        menuLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self menusFontLabelHolder value:f.
+        self evaluateModified.
+        ^ self.
+    ].
+    changedObject == self textDef ifTrue:[
+        | f label|
+        f := self textDef value.
+        textLabel font:f.
+        label := f isNil ifTrue:[
+            ''
+        ] ifFalse:[
+            f userFriendlyName
+        ].
+        self evaluateModified.
+        self textFontLabelHolder value:f.
+        ^ self.
+    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    super initialize
+!
+
+postBuildAllFontLabel:aWidget
+
+    allLabel := aWidget.
+!
+
+postBuildButtonsFontLabel:aWidget
+
+    buttonsLabel := aWidget.
+!
+
+postBuildLabelsFontLabel:aWidget
+
+    labelLabel := aWidget.
+!
+
+postBuildListsFontLabel:aWidget
+
+    listsLabel := aWidget.
+!
+
+postBuildMenuesFontLabel:aWidget
+
+    menuLabel := aWidget.
+!
+
+postBuildTextFontLabel:aWidget
+
+    textLabel := aWidget.
+!
+
+postOpen
+
+    self allOfThem value:nil.
+    self labelDef value:Label defaultFont.
+    self buttonDef value:Button defaultFont.
+    self listDef value:SelectionInListView defaultFont.
+    self menuDef value:MenuView defaultFont.
+    self textDef value:TextView defaultFont.
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::FontSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ (self labelDef value ~= Label defaultFont) or:[
+       self buttonDef value ~= Button defaultFont or:[
+       self listDef value ~= SelectionInListView defaultFont or:[
+       self menuDef value ~= MenuView defaultFont or:[
+       self textDef value ~= TextView defaultFont ]]]]
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::KbdMappingSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::KbdMappingSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::KbdMappingSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Keyboard Mappings'
+          #name: 'Keyboard Mappings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 620)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VariableVerticalPanelSpec
+              #name: 'VariableVerticalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 60 0 0 1.0 -34 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#VariableHorizontalPanelSpec
+                    #name: 'VariableHorizontalPanel1'
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#SequenceViewSpec
+                          #name: 'RawKeyList'
+                          #model: #selectedRawKey
+                          #hasHorizontalScrollBar: true
+                          #hasVerticalScrollBar: true
+                          #useIndex: false
+                          #sequenceList: #rawKeyList
+                        )
+                       #(#SequenceViewSpec
+                          #name: 'FunctionKeyList'
+                          #model: #selectedFunctionKey
+                          #hasHorizontalScrollBar: true
+                          #hasVerticalScrollBar: true
+                          #useIndex: false
+                          #sequenceList: #functionKeyList
+                        )
+                       )
+                     
+                    )
+                    #handles: #(#Any 0.5 1.0)
+                  )
+                 #(#ViewSpec
+                    #name: 'Box1'
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#TextEditorSpec
+                          #name: 'MacroText'
+                          #layout: #(#LayoutFrame 0 0.0 20 0 0 1.0 0 1.0)
+                          #model: #macroTextHolder
+                          #hasHorizontalScrollBar: true
+                          #hasVerticalScrollBar: true
+                          #isReadOnly: true
+                        )
+                       #(#LabelSpec
+                          #label: 'Macro text (if any):'
+                          #name: 'MacroTextLabel'
+                          #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 20 0)
+                          #translateLabel: true
+                          #adjust: #left
+                        )
+                       )
+                     
+                    )
+                  )
+                 )
+               
+              )
+              #handles: #(#Any 0.5 1.0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'Close'
+                    #name: 'Cancel'
+                    #visibilityChannel: #isNotPartOfSettinsDialog
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#LabelSpec
+              #label: 'NoticeText'
+              #name: 'Text'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 60 0)
+              #translateLabel: true
+              #labelChannel: #labelTextHolder
+              #resizeForLabel: true
+              #adjust: #left
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/keyboardSetting.html'].
+!
+
+loadRequest
+
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Tool Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl methodsFor:'aspects'!
+
+functionKeyList
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    functionKeyList isNil ifTrue:[
+        functionKeyList := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       functionKeyList addDependent:self.
+"/       functionKeyList onChangeSend:#functionKeyListChanged to:self.
+    ].
+    ^ functionKeyList.
+!
+
+labelTextHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    labelTextHolder isNil ifTrue:[
+        labelTextHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       labelTextHolder addDependent:self.
+"/       labelTextHolder onChangeSend:#labelTextHolderChanged to:self.
+    ].
+    ^ labelTextHolder.
+!
+
+macroTextHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    macroTextHolder isNil ifTrue:[
+        macroTextHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       macroTextHolder addDependent:self.
+"/       macroTextHolder onChangeSend:#macroTextHolderChanged to:self.
+    ].
+    ^ macroTextHolder.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+rawKeyList
+
+    rawKeyList isNil ifTrue:[
+        rawKeyList := List new.
+    ].
+    ^ rawKeyList.
+!
+
+selectedFunctionKey
+
+    selectedFunctionKey isNil ifTrue:[
+        selectedFunctionKey := ValueHolder new.
+        selectedFunctionKey addDependent:self.
+    ].
+    ^ selectedFunctionKey.
+!
+
+selectedRawKey
+
+    selectedRawKey isNil ifTrue:[
+        selectedRawKey := ValueHolder new.
+        selectedRawKey addDependent:self.
+    ].
+    ^ selectedRawKey.
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl methodsFor:'change & update'!
+
+changeFunctionKeySelection
+
+    |raw|
+    raw := self selectedRawKey value.
+    self selectedFunctionKey value:(mappings at:raw asSymbol) asString.
+!
+
+changeMacroText
+
+    |f macro indent|
+
+    f := self selectedFunctionKey value.
+    (f startsWith:'Cmd') ifTrue:[
+        f := f copyFrom:4
+    ].
+    macro := UserPreferences current functionKeySequences 
+                at:(f asSymbol) ifAbsent:nil.
+    macro notNil ifTrue:[
+        macro := macro asStringCollection.
+        indent := macro
+                     inject:99999 into:[:min :element |
+                         |stripped|
+
+                         stripped := element withoutLeadingSeparators.
+                         stripped size == 0 ifTrue:[
+                             min
+                         ] ifFalse:[
+                             min min:(element size - stripped size)
+                         ]
+                     ].
+        indent ~~ 0 ifTrue:[
+            macro := macro collect:[:line | 
+                         line size > indent ifTrue:[
+                            line copyFrom:indent+1
+                         ] ifFalse:[
+                            line
+                         ].
+                    ]
+        ].                        
+    ].
+    macroTextHolder value:macro.
+!
+
+changeRawKeySelection
+    |f raw|
+
+    f := self selectedFunctionKey value.
+    raw := mappings keyAtValue:f asString.
+    raw isNil ifTrue:[
+        raw := mappings keyAtValue:f first.
+        raw isNil ifTrue:[
+            raw := mappings keyAtValue:f asSymbol.
+        ]
+    ].
+    self selectedRawKey value:raw.
+!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self selectedFunctionKey ifTrue:[
+        self changeRawKeySelection.
+        self changeMacroText.
+        ^ self
+    ].
+    changedObject == self selectedRawKey ifTrue:[
+        self changeFunctionKeySelection.
+        ^ self
+    ].
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    
+    mappings := Screen current keyboardMap.
+
+    rawKeyList := (mappings keys asArray collect:[:key | key asString]) sort.
+    functionKeyList := (mappings values asSet asArray collect:[:key | key asString]) sort.
+
+    self labelTextHolder value:(resources at:'KEY_MSG2' default:'keyboard mapping:') withCRs.
+    super initialize
+! !
+
+!AbstractSettingsApplication::KbdMappingSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ false
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::LanguageSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::LanguageSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::LanguageSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Language Settings'
+          #name: 'Language Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 713)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#InputFieldSpec
+              #name: 'EntryField1'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1.0 125 0)
+              #model: #languageHolder
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#SequenceViewSpec
+              #name: 'List1'
+              #layout: #(#LayoutFrame 0 0.0 125 0 0 1.0 -34 1)
+              #model: #languageHolder
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #doubleClickSelector: #doubleClick:
+              #useIndex: false
+              #sequenceList: #languageList
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1.0)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#LabelSpec
+              #label: 'Notice:'
+              #name: 'Notice'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1.0 105 0)
+              #translateLabel: true
+              #labelChannel: #noticeLabelHolder
+              #adjust: #left
+            )
+           #(#LabelSpec
+              #label: 'Label'
+              #name: 'CurrentLang'
+              #layout: #(#LayoutFrame -150 1 0 0 0 1 20 0)
+              #style: #(#FontDescription #helvetica #bold #roman 12)
+              #translateLabel: true
+              #labelChannel: #currentLanguageChannel
+              #adjust: #left
+            )
+           #(#LabelSpec
+              #label: 'Current Language:'
+              #name: 'Label1'
+              #layout: #(#LayoutFrame 190 0 0 0 -150 1 20 0)
+              #translateLabel: true
+              #labelChannel: #currentLanguageLabel
+              #adjust: #right
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl methodsFor:'accessing'!
+
+languageList
+    "return the value of the instance variable 'languageList' (automatically generated)"
+
+    ^ languageList
+!
+
+requestor
+    "return the value of the instance variable 'requestor' (automatically generated)"
+
+    | masterApplication |
+    masterApplication := self masterApplication.
+    masterApplication notNil ifTrue:[
+        ^ masterApplication requestor.
+    ].
+    ^ nil
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+doubleClick:aEntry
+
+    self saveSettings.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/languageSetting.html'].
+!
+
+loadRequest
+
+    self languageHolder value:self currentLanguage.
+    self currentLanguageChannel value:self currentLanguage.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Language Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    |fontPref idx language oldLanguage territory enc 
+     answer matchingFonts l screen newLanguage switch|
+
+    newLanguage := self languageHolder value.
+    self withWaitCursorDo:[
+        idx := translatedLanguages indexOf:newLanguage.
+        idx ~~ 0 ifTrue:[
+            language := listOfLanguages at:idx
+        ] ifFalse:[
+            language := newLanguage
+        ].
+        (language includes:$-) ifTrue:[
+            l := language asCollectionOfSubstringsSeparatedBy:$-.
+            language := l at:1.
+            territory := l at:2.
+        ].
+        territory isNil ifTrue:[
+            territory := language copyTo:2
+        ].
+
+        "/ check if the new language needs a differently encoded font;
+        "/ ask user to switch font and allow cancellation.
+        "/ Otherwise, you are left with unreadable menu & button items ...
+
+        oldLanguage := Smalltalk language.
+        Smalltalk language:language asSymbol.
+        ResourcePack flushCachedResourcePacks.
+        "/ refetch resources ...
+        resources := AbstractLauncherApplication classResources.
+        fontPref := resources at:'PREFERRED_FONT_ENCODING' default:'iso8859*'.
+        fontPref := fontPref asLowercase.    
+        Smalltalk language:oldLanguage.
+
+        switch := true.
+        enc := MenuView defaultFont encoding.
+        (fontPref match:enc asLowercase) ifFalse:[
+            "/ look if there is one at all.
+            screen := Screen current.
+            matchingFonts := screen listOfAvailableFonts select:[:f | fontPref match:f encoding asLowercase].
+            matchingFonts size == 0 ifTrue:[
+                "/ flush and try again - just in case, the font path has changed.
+                screen flushListOfAvailableFonts.
+                matchingFonts := screen listOfAvailableFonts select:[:f | fontPref match:f encoding asLowercase].
+            ].
+            matchingFonts size == 0 ifTrue:[
+                (Dialog 
+                    confirm:(resources 
+                                string:'Your display does not offer any %1-encoded font.\\Change the language anyway ?\ (texts will probably be unreadable then)'
+                                  with:fontPref) withCRs)
+                ifFalse:[
+                    switch := false
+                ]
+            ] ifFalse:[
+                answer := Dialog 
+                            confirmWithCancel:(resources 
+                                                    string:'menu font is not %1-encoded.\\Change it ?'
+                                                    with:fontPref) withCRs
+                                       labels:(resources
+                                                    array:#('cancel' 'no' 'yes'))
+                                       default:3.
+                answer isNil ifTrue:[
+                    switch := false
+                ] ifFalse:[
+                    answer ifTrue:[
+                        switch := ( self requestor fontBoxForEncoding:fontPref)
+                    ]
+                ].
+            ].
+        ].
+
+        switch ifTrue:[
+            Transcript showCR:'change language to ' , newLanguage , ' ...'.
+            Smalltalk language:language asSymbol.
+            Smalltalk languageTerritory:territory asSymbol.
+            "/ ResourcePack flushCachedResourcePacks - already done by language-change
+        ].
+    ].
+    switch ifTrue:[
+        self requestor notNil ifTrue:[
+            self requestor reopenLauncher.
+        ].
+        DebugView newDebugger.
+    ].
+    self currentLanguageChannel value:self currentLanguage.
+    self modifiedChannel value:false.
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl methodsFor:'aspects'!
+
+currentLanguageChannel
+
+    currentLanguageChannel isNil ifTrue:[
+        currentLanguageChannel := self currentLanguage asValue.
+    ].
+    ^ currentLanguageChannel.
+!
+
+currentLanguageLabel
+
+    currentLanguageLabel isNil ifTrue:[
+        currentLanguageLabel := (resources string:'Current Language:') asValue.
+    ].
+    ^ currentLanguageLabel.
+!
+
+languageHolder
+
+    languageHolder isNil ifTrue:[
+        languageHolder := self currentLanguage asValue.
+        languageHolder onChangeSend:#evaluateModified to:self.
+    ].
+    ^ languageHolder.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+noticeLabelHolder
+
+    noticeLabelHolder isNil ifTrue:[
+        noticeLabelHolder := ((resources at:'LANG_MSG' default:'Select a Language') withCRs) asValue.
+    ].
+    ^ noticeLabelHolder.
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    |flags|
+
+    resources := self class owningClass classResources.
+    listOfLanguages := resources at:'LIST_OF_OFFERED_LANGUAGES' default:#('default').
+    listOfLanguages := listOfLanguages asOrderedCollection.
+    translatedLanguages := listOfLanguages collect:[:lang | |item|
+                                        item := resources at:lang.
+                                        item isString ifTrue:[
+                                            item
+                                        ] ifFalse:[
+                                            item at:1
+                                        ]
+                                ].
+    flags := listOfLanguages collect:[:lang | |item|
+                                        item := resources at:lang.
+                                        item isArray ifTrue:[
+                                            item at:2
+                                        ] ifFalse:[
+                                            nil
+                                        ]
+                                ].
+    flags := flags collect:[:nm | |img d| nm notNil ifTrue:[
+                                            img := Image fromFile:nm.
+                                            img isNil ifTrue:[
+                                                d := Smalltalk getPackageDirectoryForPackage:'stx:goodies'.
+                                                img := Image fromFile:(d construct:nm).
+                                            ].
+                                        ] ifFalse:[
+                                            nil
+                                        ]
+                           ].
+    listOfLanguages := listOfLanguages collect:[:nm | nm copyFrom:'LANG_' size + 1].
+    languageList := translatedLanguages with:flags collect:[:lang :flag | LabelAndIcon icon:flag string:lang.].
+    super initialize
+! !
+
+!AbstractSettingsApplication::LanguageSettingsAppl methodsFor:'queries'!
+
+currentLanguage
+
+    | lang |
+
+    lang := Language ~= LanguageTerritory ifTrue:[
+        Language , '-' , LanguageTerritory
+    ] ifFalse:[
+        Language
+    ].
+    ^ languageList at:(listOfLanguages indexOf:lang)
+!
+
+hasUnsavedChanges
+
+    ^ (self languageHolder value) ~= (self currentLanguage)  
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::MemorySettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::MemorySettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::MemorySettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Memory Manager Settings'
+          #name: 'Memory Manager Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Label'
+              #name: 'Label1'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 50 0)
+              #translateLabel: true
+              #labelChannel: #warningLabelHolder
+              #adjust: #left
+            )
+           #(#ViewSpec
+              #name: 'NewSpaceBox'
+              #layout: #(#LayoutFrame 0 0.0 50 0 0 1.0 100 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField1'
+                    #layout: #(#LayoutFrame 205 0 3 0 295 0 25 0)
+                    #model: #newSpaceSize
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Size of NewSpace:'
+                    #name: 'SizeOfNewSpaceLabel'
+                    #layout: #(#LayoutFrame 0 0 3 0 205 0 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Size of newSpace where objects are created'
+                    #name: 'Label3'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 295 0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Maximum Memory Limit:'
+                    #name: 'Label8'
+                    #layout: #(#LayoutFrame 305 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField5'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #maxOldSpace
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Never allocate more than this amount of memory'
+                    #name: 'Label9'
+                    #layout: #(#LayoutFrame 305 0 25 0 0 1 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator5'
+                    #layout: #(#LayoutFrame 300 0 0 0.0 303 0 0 1.0)
+                    #orientation: #vertical
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator1'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'QuickAllocationLimitBox'
+              #layout: #(#LayoutFrame 0 0.0 100 0 0 1.0 150 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField14'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #fastMoreLimit
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Quick Allocation Limit:'
+                    #name: 'Label26'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Quickly allocate more memory (suppress GC) up to this limit'
+                    #name: 'Label27'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator15'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'GCTriggerBox'
+              #layout: #(#LayoutFrame 0 0.0 150 0 0 1.0 200 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField8'
+                    #layout: #(#LayoutFrame 205 0 3 0 295 0 25 0)
+                    #model: #igcLimit
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Incremental GC Allocation Trigger:'
+                    #name: 'Label14'
+                    #layout: #(#LayoutFrame 0 0 3 0 205 0 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Start IGC whenever this amount has been allocated'
+                    #name: 'Label15'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 295 0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#LabelSpec
+                    #label: 'Incremental GC Freespace Trigger:'
+                    #name: 'Label16'
+                    #layout: #(#LayoutFrame 305 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField9'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #igcFreeLimit
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Start IGC whenever freespace drops below this'
+                    #name: 'Label17'
+                    #layout: #(#LayoutFrame 305 0 25 0 0 1 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator8'
+                    #layout: #(#LayoutFrame 300 0 0 0.0 303 0 0 1.0)
+                    #orientation: #vertical
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator9'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'GCAmountBox'
+              #layout: #(#LayoutFrame 0 0.0 200 0 0 1.0 250 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField17'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #igcFreeAmount
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Incremental GC Amount:'
+                    #name: 'Label32'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Try to keep this amount for peak requests'
+                    #name: 'Label33'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator18'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'OldspaceIncrementBox'
+              #layout: #(#LayoutFrame 0 0.0 250 0 0 1.0 300 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField18'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1.0 25 0)
+                    #model: #oldIncr
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Oldspace Increment:'
+                    #name: 'Label34'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Increase oldSpace in chunks of this size'
+                    #name: 'Label35'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator19'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'OldSpaceCompressLimitBox'
+              #layout: #(#LayoutFrame 0 0.0 300 0 0 1.0 350 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField19'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #compressLimit
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Oldspace Compress Limit:'
+                    #name: 'Label36'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Use 2-pass compressing GC if > 0 and more memory is in use'
+                    #name: 'Label37'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator20'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'StackLimitBox'
+              #layout: #(#LayoutFrame 0 0.0 350 0.0 0 1.0 400 1.0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField20'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #enableChannel: #supportsJustInTimeCompilation
+                    #model: #stackLimit
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Stack Limit:'
+                    #name: 'Label38'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Trigger recursionInterrupt if more stack is used by a process'
+                    #name: 'Label39'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator21'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'CodeLimitBox'
+              #layout: #(#LayoutFrame 0 0.0 400 0 0 1.0 450 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField21'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #enableChannel: #supportsJustInTimeCompilation
+                    #model: #codeLimit
+                    #type: #numberOrNil
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Dynamic code Limit:'
+                    #name: 'Label40'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Flush dynamic compiled code to stay within this limit'
+                    #name: 'Label41'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator22'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'CodeTriggerBox'
+              #layout: #(#LayoutFrame 0 0.0 450 0 0 1.0 500 0)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField22'
+                    #layout: #(#LayoutFrame -95 1 3 0 -5 1 25 0)
+                    #model: #codeTrigger
+                    #type: #number
+                    #acceptOnReturn: true
+                    #acceptOnTab: true
+                    #acceptOnLostFocus: true
+                    #acceptOnPointerLeave: false
+                  )
+                 #(#LabelSpec
+                    #label: 'Dynamic code Limit:'
+                    #name: 'Label42'
+                    #layout: #(#LayoutFrame 0 0 3 0 -95 1 25 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#LabelSpec
+                    #label: 'Start incremental GC whenever this amount of code has been allocated'
+                    #name: 'Label43'
+                    #layout: #(#LayoutFrame 0 0.0 25 0 0 1.0 47 0)
+                    #translateLabel: true
+                    #adjust: #left
+                  )
+                 #(#DividerSpec
+                    #name: 'Separator23'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 3 0)
+                  )
+                 )
+               
+              )
+            )
+           #(#DividerSpec
+              #name: 'Separator24'
+              #layout: #(#LayoutFrame 0 0.0 500 0 0 1.0 503 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/memorySettings.html'].
+!
+
+loadRequest
+
+    self igcLimit value:ObjectMemory incrementalGCLimit.
+    self igcFreeLimit value:ObjectMemory freeSpaceGCLimit.
+    self igcFreeAmount value:ObjectMemory freeSpaceGCAmount.
+    self newSpaceSize value:ObjectMemory newSpaceSize.
+    self oldIncr value:ObjectMemory oldSpaceIncrement.
+    self compressLimit value:ObjectMemory oldSpaceCompressLimit.
+    self codeLimit value:ObjectMemory dynamicCodeLimit.
+    self codeTrigger value:ObjectMemory dynamicCodeGCTrigger.
+    self stackLimit value:Process defaultMaximumStackSize.
+    self fastMoreLimit value:(ObjectMemory fastMoreOldSpaceLimit:-1).
+    self maxOldSpace value:ObjectMemory maxOldSpace.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Memory Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        ObjectMemory freeSpaceGCAmount:self igcFreeAmount value.
+        ObjectMemory freeSpaceGCLimit:self igcFreeLimit value.
+        ObjectMemory incrementalGCLimit:self igcLimit value.
+        ObjectMemory newSpaceSize:self newSpaceSize value.
+        ObjectMemory oldSpaceIncrement:self oldIncr value.
+        Process defaultMaximumStackSize:self stackLimit value.
+        ObjectMemory fastMoreOldSpaceLimit:self fastMoreLimit value.
+        ObjectMemory maxOldSpace:self maxOldSpace value.
+        ObjectMemory oldSpaceCompressLimit:self compressLimit value.
+        ObjectMemory dynamicCodeLimit:self codeLimit value.
+        ObjectMemory dynamicCodeGCTrigger:self codeTrigger value.
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl methodsFor:'aspects'!
+
+codeLimit
+
+    codeLimit isNil ifTrue:[
+        codeLimit := ObjectMemory dynamicCodeLimit asValue.
+        codeLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ codeLimit.
+!
+
+codeTrigger
+
+    codeTrigger isNil ifTrue:[
+        codeTrigger := ObjectMemory dynamicCodeGCTrigger asValue.
+        codeTrigger onChangeSend:#evaluateModified to:self
+    ].
+    ^ codeTrigger.
+!
+
+compressLimit
+
+    compressLimit isNil ifTrue:[
+        compressLimit := ObjectMemory oldSpaceCompressLimit asValue.
+        compressLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ compressLimit.
+!
+
+fastMoreLimit
+
+    fastMoreLimit isNil ifTrue:[
+        fastMoreLimit := (ObjectMemory fastMoreOldSpaceLimit:-1) asValue.
+        fastMoreLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ fastMoreLimit.
+!
+
+igcFreeAmount
+
+    igcFreeAmount isNil ifTrue:[
+        igcFreeAmount := ObjectMemory freeSpaceGCAmount asValue.
+        igcFreeAmount onChangeSend:#evaluateModified to:self
+    ].
+    ^ igcFreeAmount.
+!
+
+igcFreeLimit
+
+    igcFreeLimit isNil ifTrue:[
+        igcFreeLimit := ObjectMemory freeSpaceGCLimit asValue.
+        igcFreeLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ igcFreeLimit.
+!
+
+igcLimit
+
+    igcLimit isNil ifTrue:[
+        igcLimit := ObjectMemory incrementalGCLimit asValue.
+        igcLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ igcLimit.
+!
+
+maxOldSpace
+
+    maxOldSpace isNil ifTrue:[
+        maxOldSpace := ObjectMemory maxOldSpace asValue.
+        maxOldSpace onChangeSend:#evaluateModified to:self
+    ].
+    ^ maxOldSpace.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+newSpaceSize
+
+    newSpaceSize isNil ifTrue:[
+        newSpaceSize := ObjectMemory newSpaceSize asValue.
+        newSpaceSize onChangeSend:#evaluateModified to:self
+    ].
+    ^ newSpaceSize.
+!
+
+oldIncr
+
+    oldIncr isNil ifTrue:[
+        oldIncr := ObjectMemory oldSpaceIncrement asValue.
+        oldIncr onChangeSend:#evaluateModified to:self
+    ].
+    ^ oldIncr.
+!
+
+stackLimit
+
+    stackLimit isNil ifTrue:[
+        stackLimit := Process defaultMaximumStackSize asValue.
+        stackLimit onChangeSend:#evaluateModified to:self
+    ].
+    ^ stackLimit.
+!
+
+supportsJustInTimeCompilation
+
+    ^ ObjectMemory supportsJustInTimeCompilation.
+!
+
+warningLabelHolder
+
+    warningLabelHolder isNil ifTrue:[
+        warningLabelHolder := ValueHolder new.
+    ].
+    ^ warningLabelHolder.
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+"/    changedObject == self allOfThem ifTrue:[
+"/        ^ self.
+"/    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    self warningLabelHolder value:'Warning - invalid settings may result in failures or poor performance
+' , 'You have been warned' allBold , '.'.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::MemorySettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^   (
+        ObjectMemory freeSpaceGCAmount ~= self igcFreeAmount value or:[
+        ObjectMemory freeSpaceGCLimit ~= self igcFreeLimit value or:[
+        ObjectMemory incrementalGCLimit ~= self igcLimit value or:[
+        ObjectMemory newSpaceSize ~= self newSpaceSize value or:[
+        ObjectMemory oldSpaceIncrement ~= self oldIncr value or:[
+        Process defaultMaximumStackSize ~= self stackLimit value or:[
+        (ObjectMemory fastMoreOldSpaceLimit:-1) ~= self fastMoreLimit value or:[
+        ObjectMemory maxOldSpace ~= self maxOldSpace value or:[
+        ObjectMemory oldSpaceCompressLimit ~= self compressLimit value or:[
+        ObjectMemory dynamicCodeLimit ~= self codeLimit value or:[
+        ObjectMemory dynamicCodeGCTrigger ~= self codeTrigger value ]]]]]]]]]]
+        )
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::MiscSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::MiscSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::MiscSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Other settings'
+          #name: 'Other settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
+              #label: 'Shadows under PopUp Views'
+              #name: 'CheckBox1'
+              #layout: #(#LayoutFrame 5 0 5 0 -5 1 27 0)
+              #model: #shadows
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Beeper enabled'
+              #name: 'CheckBox2'
+              #layout: #(#LayoutFrame 5 0 30 0 -5 1 52 0)
+              #model: #beepEnabled
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Boxes Return Focus to Previously Active View'
+              #name: 'CheckBox3'
+              #layout: #(#LayoutFrame 5 0 55 0 -5 1 77 0)
+              #model: #returnFocus
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Views Catch Focus when Mapped'
+              #name: 'CheckBox4'
+              #layout: #(#LayoutFrame 5 0 80 0 -5 1 102 0)
+              #model: #takeFocus
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Hostname in Window Labels'
+              #name: 'CheckBox5'
+              #layout: #(#LayoutFrame 5 0 105 0 300 0 127 0)
+              #model: #hostNameInLabelHolder
+              #translateLabel: true
+            )
+           #(#ActionButtonSpec
+              #label: 'Format...'
+              #name: 'Button1'
+              #layout: #(#LayoutFrame 300 0 105 0 -5 1 127 0)
+              #translateLabel: true
+              #model: #formatHostNameinWindowLabels
+            )
+           #(#CheckBoxSpec
+              #label: 'Show Accelerator Keys in Menus'
+              #name: 'CheckBox6'
+              #layout: #(#LayoutFrame 5 0 130 0 -5 1 152 0)
+              #model: #showAccelerators
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Raise & Activate Windows on Click'
+              #name: 'CheckBox7'
+              #layout: #(#LayoutFrame 5 0 155 0 -5 1 177 0)
+              #model: #activateOnClick
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Focus Follows Mouse'
+              #name: 'CheckBox8'
+              #layout: #(#LayoutFrame 5 0 180 0 -5 1 202 0)
+              #model: #focusFollowsMouse
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Opaque Variable Panel Resizing'
+              #name: 'CheckBox9'
+              #layout: #(#LayoutFrame 5 0 205 0 -5 1 227 0)
+              #model: #opaqueVariablePanelResize
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Opaque Table Column Resizing'
+              #name: 'CheckBox10'
+              #layout: #(#LayoutFrame 5 0 230 0 -5 1 252 0)
+              #model: #opaqueTableColumnResize
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 259 0 0 1.0 263 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Preemptive Scheduling'
+              #name: 'CheckBox11'
+              #layout: #(#LayoutFrame 5 0 270 0 -5 1 292 0)
+              #model: #preemptive
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Dynamic Priorities'
+              #name: 'CheckBox12'
+              #layout: #(#LayoutFrame 20 0 295 0 -5 1 317 0)
+              #enableChannel: #preemptive
+              #model: #dynamicPrios
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 321 0 0 1.0 325 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+formatHostNameinWindowLabels
+   |newFormat|
+
+   newFormat := Dialog request:
+                    'Define the Format of Window Labels:\\  %1 - Label\  %2 - Hostname\  %3 - Username\  %4 - ProcessId\'  
+                       withCRs initialAnswer:newWindowLabelFormat.
+
+   newFormat size > 0 ifTrue:[
+       newWindowLabelFormat := newFormat.
+       self evaluateModified.
+   ].
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/miscSettings.html'].
+!
+
+loadRequest
+
+    self shadows value:PopUpView shadows.
+    self beepEnabled value:currentUserPrefs beepEnabled.
+
+    self hostNameInLabelHolder value:PopUpView shadows.
+    self returnFocus value:StandardSystemView returnFocusWhenClosingModalBoxes.
+    self takeFocus value:StandardSystemView takeFocusWhenMapped .
+    self focusFollowsMouse value:(currentUserPrefs focusFollowsMouse ? true) .
+    self activateOnClick value:(Display activateOnClick:nil).
+    self opaqueVariablePanelResize value:currentUserPrefs opaqueVariablePanelResizing.
+    self opaqueTableColumnResize value:currentUserPrefs opaqueTableColumnResizing.
+
+    self showAccelerators value:MenuView showAcceleratorKeys.
+    self preemptive value:Processor isTimeSlicing.
+    self dynamicPrios value:Processor supportDynamicPriorities.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Misc Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        PopUpView shadows:shadows value.
+        (self hostNameInLabelHolder value ~= StandardSystemView includeHostNameInLabel 
+        or:[newWindowLabelFormat ~= StandardSystemView windowLabelFormat]) ifTrue:[ 
+            StandardSystemView includeHostNameInLabel:self hostNameInLabelHolder value.
+            newWindowLabelFormat notNil ifTrue:[
+                StandardSystemView windowLabelFormat:newWindowLabelFormat
+            ].
+
+            Screen allScreens do:[:aDisplay |
+                aDisplay allViewsDo:[:aView |
+                    |l|
+
+                    aView isTopView ifTrue:[
+                        l := aView label.
+                        l notNil ifTrue:[
+                            aView label:(l , ' '); label:l.  "/ force a change
+                        ]
+                    ]
+                ]
+            ]
+        ].
+
+        currentUserPrefs opaqueVariablePanelResizing:self opaqueVariablePanelResize value.
+        currentUserPrefs opaqueTableColumnResizing:self opaqueTableColumnResize value.
+
+        currentUserPrefs beepEnabled:self beepEnabled value.
+
+        StandardSystemView returnFocusWhenClosingModalBoxes:self returnFocus value.
+        StandardSystemView takeFocusWhenMapped:self takeFocus value.
+        currentUserPrefs focusFollowsMouse:self focusFollowsMouse value.
+        Screen current activateOnClick:self activateOnClick value.
+
+        MenuView showAcceleratorKeys:self showAccelerators value.
+        Processor isTimeSlicing ~~ self preemptive value ifTrue:[
+            self preemptive value ifTrue:[
+                Processor startTimeSlicing
+            ] ifFalse:[
+                Processor stopTimeSlicing
+            ]
+        ].
+        Processor supportDynamicPriorities ~~ self dynamicPrios value ifTrue:[
+            Processor supportDynamicPriorities:self dynamicPrios value
+        ].
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl methodsFor:'aspects'!
+
+activateOnClick
+
+    activateOnClick isNil ifTrue:[
+        activateOnClick := true asValue.
+        activateOnClick onChangeSend:#evaluateModified to:self
+    ].
+    ^ activateOnClick.
+!
+
+beepEnabled
+
+    beepEnabled isNil ifTrue:[
+        beepEnabled := true asValue.
+        beepEnabled onChangeSend:#evaluateModified to:self
+    ].
+    ^ beepEnabled.
+!
+
+dynamicPrios
+
+    dynamicPrios isNil ifTrue:[
+        dynamicPrios := true asValue.
+        dynamicPrios onChangeSend:#evaluateModified to:self
+    ].
+    ^ dynamicPrios.
+!
+
+focusFollowsMouse
+
+    focusFollowsMouse isNil ifTrue:[
+        focusFollowsMouse := true asValue.
+        focusFollowsMouse onChangeSend:#evaluateModified to:self
+    ].
+    ^ focusFollowsMouse.
+!
+
+hostNameInLabelHolder
+
+    hostNameInLabelHolder isNil ifTrue:[
+        hostNameInLabelHolder := true asValue.
+        hostNameInLabelHolder onChangeSend:#evaluateModified to:self
+    ].
+    ^ hostNameInLabelHolder.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+opaqueTableColumnResize
+
+    opaqueTableColumnResize isNil ifTrue:[
+        opaqueTableColumnResize := true asValue.
+        opaqueTableColumnResize onChangeSend:#evaluateModified to:self
+    ].
+    ^ opaqueTableColumnResize.
+!
+
+opaqueVariablePanelResize
+
+    opaqueVariablePanelResize isNil ifTrue:[
+        opaqueVariablePanelResize := true asValue.
+        opaqueVariablePanelResize onChangeSend:#evaluateModified to:self
+    ].
+    ^ opaqueVariablePanelResize.
+!
+
+preemptive
+
+    preemptive isNil ifTrue:[
+        preemptive := true asValue.
+        preemptive onChangeSend:#evaluateModified to:self
+    ].
+    ^ preemptive.
+!
+
+returnFocus
+
+    returnFocus isNil ifTrue:[
+        returnFocus := true asValue.
+        returnFocus onChangeSend:#evaluateModified to:self
+    ].
+    ^ returnFocus.
+!
+
+shadows
+
+    shadows isNil ifTrue:[
+        shadows := true asValue.
+        shadows onChangeSend:#evaluateModified to:self
+    ].
+    ^ shadows.
+!
+
+showAccelerators
+
+    showAccelerators isNil ifTrue:[
+        showAccelerators := true asValue.
+        showAccelerators onChangeSend:#evaluateModified to:self
+    ].
+    ^ showAccelerators.
+!
+
+takeFocus
+
+    takeFocus isNil ifTrue:[
+        takeFocus := true asValue.
+        takeFocus onChangeSend:#evaluateModified to:self
+    ].
+    ^ takeFocus.
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+"/    changedObject == self allOfThem ifTrue:[
+"/        ^ self.
+"/    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    currentUserPrefs := UserPreferences current.
+    newWindowLabelFormat := StandardSystemView windowLabelFormat.
+    self loadRequest.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::MiscSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ (
+    newWindowLabelFormat ~= StandardSystemView windowLabelFormat or:[
+    self shadows value ~= PopUpView shadows or:[
+    self beepEnabled value ~= currentUserPrefs beepEnabled or:[
+    self hostNameInLabelHolder value ~= PopUpView shadows or:[
+    self returnFocus value ~= StandardSystemView returnFocusWhenClosingModalBoxes or:[
+    self takeFocus value ~= StandardSystemView takeFocusWhenMapped or:[
+    self focusFollowsMouse value ~= (currentUserPrefs focusFollowsMouse ? true) or:[
+    self activateOnClick value ~= (Display activateOnClick:nil) or:[
+    self opaqueVariablePanelResize value ~= currentUserPrefs opaqueVariablePanelResizing or:[
+    self opaqueTableColumnResize value ~= currentUserPrefs opaqueTableColumnResizing or:[
+    self showAccelerators value ~= MenuView showAcceleratorKeys or:[
+    self preemptive value ~= Processor isTimeSlicing or:[
+    self dynamicPrios value ~= Processor supportDynamicPriorities]]]]]]]]]]]]
+    )
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::PlainSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::PlainSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::PlainSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Settings'
+          #name: 'Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 616 592)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self warn:'no help available here'.
+"/    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/keyboardSetting.html'].
+!
+
+loadRequest
+
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl methodsFor:'aspects'!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+"/    changedObject == self allOfThem ifTrue:[
+"/        ^ self.
+"/    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::PlainSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ true
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::PrinterSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::PrinterSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::PrinterSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Printer Settings'
+          #name: 'Printer Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 12 22 612 572)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Printer Type:'
+              #name: 'PrinterTypeLabel'
+              #layout: #(#LayoutFrame 0 0 5 0 150 0 27 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#ComboListSpec
+              #name: 'PrinterTypeComboList'
+              #layout: #(#LayoutFrame 150 0 5 0 -5 1 27 0)
+              #model: #printerTypeSelection
+              #comboList: #printerType
+              #useIndex: true
+            )
+           #(#LabelSpec
+              #label: 'Printer Command:'
+              #name: 'PrinterCommandLabel'
+              #layout: #(#LayoutFrame 0 0 40 0 150 0 62 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#ComboBoxSpec
+              #name: 'CommandComboBox'
+              #layout: #(#LayoutFrame 150 0 40 0 -5 1 62 0)
+              #model: #printCommand
+              #acceptOnPointerLeave: false
+              #comboList: #printCommandList
+              #useIndex: false
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 72 0 0 1.0 76 0)
+            )
+           #(#LabelSpec
+              #label: 'Page Format:'
+              #name: 'PageFormatLabel'
+              #layout: #(#LayoutFrame 5 0 85 0 150 0 107 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#PopUpListSpec
+              #label: 'PopUp List'
+              #name: 'PageFormatPopUpList'
+              #layout: #(#LayoutFrame 150 0 85 0 288 0 107 0)
+              #tabable: true
+              #model: #pageFormat
+              #enableChannel: #enableFormat
+              #menu: #pageFormatList
+              #useIndex: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Landscape'
+              #name: 'LandscapeCheckBox'
+              #layout: #(#LayoutFrame 330 0 85 0 -5 1 107 0)
+              #enableChannel: #enablelandscape
+              #model: #landscape
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 114 0 0 1.0 118 0)
+            )
+           #(#LabelSpec
+              #label: 'Top Margin:'
+              #name: 'TopMarginLabel'
+              #layout: #(#LayoutFrame 5 0 130 0 150 0 152 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'TopMarginEntryField'
+              #layout: #(#LayoutFrame 150 0 130 0 250 0 152 0)
+              #enableChannel: #enableMargins
+              #model: #topMargin
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #converter: #PrintConverter
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Left Margin:'
+              #name: 'LeftMarginLabel'
+              #layout: #(#LayoutFrame 5 0 160 0 150 0 182 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'LeftMarginEntryField'
+              #layout: #(#LayoutFrame 150 0 160 0 250 0 182 0)
+              #enableChannel: #enableMargins
+              #model: #leftMargin
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #converter: #PrintConverter
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Right Margin:'
+              #name: 'RightMarginLabel'
+              #layout: #(#LayoutFrame 5 0 190 0 150 0 212 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'RightMarginEntryField'
+              #layout: #(#LayoutFrame 150 0 190 0 250 0 212 0)
+              #enableChannel: #enableMargins
+              #model: #rightMargin
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #converter: #PrintConverter
+              #acceptOnPointerLeave: false
+            )
+           #(#LabelSpec
+              #label: 'Bottom Margin:'
+              #name: 'BottomMarginLabel'
+              #layout: #(#LayoutFrame 5 0 220 0 150 0 242 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'BottomMarginEntryField'
+              #layout: #(#LayoutFrame 150 0 220 0 250 0 242 0)
+              #enableChannel: #enableMargins
+              #model: #bottomMargin
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #converter: #PrintConverter
+              #acceptOnPointerLeave: false
+            )
+           #(#PopUpListSpec
+              #label: 'PopUp List'
+              #name: 'PopUpList2'
+              #layout: #(#LayoutFrame 457 0 129 0 -5 1 151 0)
+              #tabable: true
+              #model: #selectedUnit
+              #menu: #unitList
+              #useIndex: true
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 256 0 0 1.0 260 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Color Printer'
+              #name: 'ColorPrinterCheckBox'
+              #layout: #(#LayoutFrame 5 0 269 0 -5 1 291 0)
+              #enableChannel: #enableColorBox
+              #model: #supportsColor
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator4'
+              #layout: #(#LayoutFrame 0 0.0 296 0 0 1.0 300 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/printerSettings.html'].
+!
+
+loadRequest
+
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Printer Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        Printer := possiblePrinters at:(self printerTypeSelection value).
+        Printer printCommand:self printCommand value.
+
+        Printer supportsPageSizes ifTrue:[
+            Printer pageFormat:(self pageFormatList at:self pageFormat value).
+            Printer landscape:(self landscape value).
+        ].
+        Printer supportsMargins ifTrue:[
+            | unit |
+            self selectedUnit value == 2 ifTrue:[
+                unit := #mm
+            ] ifFalse:[
+                unit := #inch
+            ].
+            Printer topMargin:(UnitConverter convert:self topMargin value from:unit to:#inch).
+            Printer leftMargin:(UnitConverter convert:leftMargin value from:unit to:#inch).
+            Printer rightMargin:(UnitConverter convert:rightMargin value from:unit to:#inch).
+            Printer bottomMargin:(UnitConverter convert:bottomMargin value from:unit to:#inch).
+        ].
+        Printer supportsPostscript ifTrue:[
+            Printer supportsColor:self supportsColor value.
+        ].
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl methodsFor:'aspects'!
+
+bottomMargin
+
+    bottomMargin isNil ifTrue:[
+        bottomMargin := Printer bottomMargin asValue.
+        bottomMargin onChangeSend:#evaluateModified to:self
+    ].
+    ^ bottomMargin.
+!
+
+enableColorBox
+
+    enableColorBox isNil ifTrue:[
+        enableColorBox := true asValue.
+    ].
+    ^ enableColorBox.
+!
+
+enableFormat
+
+    enableFormat isNil ifTrue:[
+        enableFormat := true asValue.
+    ].
+    ^ enableFormat.
+!
+
+enableMargins
+
+    enableMargins isNil ifTrue:[
+        enableMargins := true asValue.
+    ].
+    ^ enableMargins.
+!
+
+enablelandscape
+
+    enablelandscape isNil ifTrue:[
+        enablelandscape := true asValue.
+    ].
+    ^ enablelandscape.
+!
+
+landscape
+
+    landscape isNil ifTrue:[
+        landscape := Printer landscape asValue.
+        landscape onChangeSend:#evaluateModified to:self
+    ].
+    ^ landscape.
+!
+
+leftMargin
+
+    leftMargin isNil ifTrue:[
+        leftMargin := Printer leftMargin asValue.
+        leftMargin onChangeSend:#evaluateModified to:self
+    ].
+    ^ leftMargin.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+pageFormat
+
+    pageFormat isNil ifTrue:[
+        self pageFormatList notEmpty ifTrue:[
+            | index |
+            (index := self pageFormatList indexOf:#a4) ~~ 0 ifTrue:[
+                pageFormat := index asValue.
+            ] ifFalse:[
+                pageFormat := 1 asValue.
+            ]
+        ].
+        pageFormat onChangeSend:#evaluateModified to:self
+    ].
+    ^ pageFormat.
+!
+
+pageFormatList
+
+    pageFormatList isNil ifTrue:[
+        pageFormatList := Printer defaultPageFormats asList.
+    ].
+    ^ pageFormatList.
+!
+
+printCommand
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    printCommand isNil ifTrue:[
+        printCommand := Printer printCommand asValue.
+        printCommand onChangeSend:#evaluateModified to:self
+    ].
+    ^ printCommand.
+!
+
+printCommandList
+
+    printCommandList isNil ifTrue:[
+        printCommandList := commandList asList.
+    ].
+    ^ printCommandList.
+!
+
+printerType
+
+    printerType isNil ifTrue:[
+        printerType := (possiblePrinters collect:[:cls | cls printerTypeName]) asList.
+        printerType onChangeSend:#evaluateModified to:self
+    ].
+    ^ printerType.
+!
+
+printerTypeSelection
+
+    printerTypeSelection isNil ifTrue:[
+        printerTypeSelection := (possiblePrinters identityIndexOf:Printer) asValue.
+"/       printerTypeSelection onChangeSend:#printerTypeSelectionChanged to:self.
+        printerTypeSelection addDependent:self.
+        printerTypeSelection changed.
+        printerTypeSelection onChangeSend:#evaluateModified to:self
+    ].
+    ^ printerTypeSelection.
+!
+
+rightMargin
+
+    rightMargin isNil ifTrue:[
+        rightMargin := Printer rightMargin asValue.
+        rightMargin onChangeSend:#evaluateModified to:self
+    ].
+    ^ rightMargin.
+!
+
+selectedUnit
+
+    selectedUnit isNil ifTrue:[
+        selectedUnit := 1 asValue.
+        selectedUnit addDependent:self.
+        selectedUnit changed.
+        selectedUnit onChangeSend:#evaluateModified to:self
+    ].
+    ^ selectedUnit.
+!
+
+supportsColor
+
+    supportsColor isNil ifTrue:[
+        supportsColor := Printer supportsColor asValue.
+        supportsColor onChangeSend:#evaluateModified to:self
+    ].
+    ^ supportsColor.
+!
+
+topMargin
+
+    topMargin isNil ifTrue:[
+        topMargin := Printer topMargin asValue.
+        topMargin onChangeSend:#evaluateModified to:self
+    ].
+    ^ topMargin.
+!
+
+unitList
+
+    unitList isNil ifTrue:[
+        unitList := #('inch' 'mm') asList.
+    ].
+    ^ unitList.
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl methodsFor:'change & update'!
+
+printerTypeSelectionChanged
+
+    | p hasPageSize hasMargins|
+    printerType selectionIndex ~~ 0 ifTrue:[
+        p := possiblePrinters at:(printerType selectionIndex).
+        hasPageSize := p supportsPageSizes. 
+        hasMargins := p supportsMargins. 
+    ] ifFalse:[
+        hasPageSize := false.
+        hasMargins := false.
+    ].
+!
+
+printerTypeSelectionOrUnitListChanged
+
+    | p hasPageSize hasMargins unit|
+
+    self printerTypeSelection value ~~ 0 ifTrue:[
+        p := possiblePrinters at:(self printerTypeSelection value).
+        hasPageSize := p supportsPageSizes. 
+        hasMargins := p supportsMargins. 
+    ] ifFalse:[
+        hasPageSize := false.
+        hasMargins := false.
+    ].
+    self enablelandscape value:hasPageSize.
+    self enableFormat value:hasPageSize.
+    hasPageSize ifTrue:[
+
+        self pageFormat value:(p pageFormat).
+        self landscape value:(p landscape).
+    ] ifFalse:[ 
+       self landscape value:false.
+    ].
+    hasMargins ifTrue:[
+       self selectedUnit value == 2 ifTrue:[
+           unit := #mm
+       ] ifFalse:[
+           unit := #inch
+       ].
+
+       topMargin value:(UnitConverter convert:p topMargin from:#inch to:unit).
+       leftMargin value:(UnitConverter convert:p leftMargin from:#inch to:unit).
+       rightMargin value:(UnitConverter convert:p rightMargin from:#inch to:unit).
+       bottomMargin value:(UnitConverter convert:p bottomMargin from:#inch to:unit).
+
+    ] ifFalse:[ 
+    ].
+    self enableMargins value:hasMargins.
+
+    p notNil ifTrue:[ 
+        | newCommandList |
+        newCommandList := p defaultCommands.
+        newCommandList notNil ifTrue:[
+            self printCommandList contents:(newCommandList asList).
+            self printCommandList changed.
+        ].
+
+        self printCommand value:(p printCommand).
+    ].
+    self enableColorBox value:p supportsPostscript.
+    p supportsPostscript ifFalse:[
+        self supportsColor value:false
+    ] ifTrue:[
+        self supportsColor value:(Printer supportsColor).
+    ]
+!
+
+unitListChanged
+!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    (changedObject == self selectedUnit or:[changedObject == self printerTypeSelection]) ifTrue:[
+        self printerTypeSelectionOrUnitListChanged.
+        ^ self.
+    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    possiblePrinters := PrinterStream withAllSubclasses asArray.
+    commandList := resources at:'PRINT_COMMANDS' ifAbsent:nil.
+    commandList isNil ifTrue:[
+        commandList := PrinterStream defaultCommands.
+        commandList isNil ifTrue:[
+            commandList := #('lpr' 
+                             'lp' 
+                            ).
+        ].
+        (commandList includes:self printCommand value) not ifTrue:[
+            commandList add:self printCommand value.
+        ].
+    ].
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::PrinterSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+
+    | printer unit|
+    self selectedUnit value == 2 ifTrue:[
+        unit := #mm
+    ] ifFalse:[
+        unit := #inch
+    ].
+    printer := possiblePrinters at:(self printerTypeSelection value).
+    ^ (
+        printer ~= Printer or:[
+        Printer printCommand ~= self printCommand value or:[
+        (Printer supportsPageSizes and:[
+            Printer pageFormat ~= (self pageFormatList at:self pageFormat value) or:[
+            Printer landscape ~= (self landscape value) or:[
+        ]]]) or:[
+        (Printer supportsMargins and:[
+            Printer topMargin ~= (UnitConverter convert:self topMargin value from:unit to:#inch) or:[
+            Printer leftMargin ~= (UnitConverter convert:leftMargin value from:unit to:#inch) or:[
+            Printer rightMargin ~= (UnitConverter convert:rightMargin value from:unit to:#inch) or:[
+            Printer bottomMargin ~= (UnitConverter convert:bottomMargin value from:unit to:#inch) or:[
+        ]]]]]) or:[
+        Printer supportsPostscript and:[
+            Printer supportsColor ~= self supportsColor value
+        ]]]]]
+    )
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::SourceAndDebuggerSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::SourceAndDebuggerSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::SourceAndDebuggerSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Source & Debugger Settings'
+          #name: 'Source & Debugger Settings'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 12 14 612 572)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
+              #label: 'Log compiles in Changefile'
+              #name: 'LogCompilesInChangefileCheckBox'
+              #layout: #(#LayoutFrame 5 0 5 0 214 0 28 0)
+              #model: #updChanges
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Log doIts in Changefile'
+              #name: 'LogDoItsInChangefileCheckBox'
+              #layout: #(#LayoutFrame 5 0 30 0 214 0 53 0)
+              #model: #logDoits
+              #translateLabel: true
+            )
+           #(#LabelSpec
+              #label: 'Changefile Name:'
+              #name: 'ChangefileNameLabel'
+              #layout: #(#LayoutFrame 96 0 60 0 300 0 82 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'ChangeFileNameEntryField'
+              #layout: #(#LayoutFrame 300 0 60 0 -5 1 82 0)
+              #model: #changeFileName
+              #immediateAccept: true
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 95 0 0 1.0 99 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Sourcecode Management'
+              #name: 'SourcecodeManagementCheckBox'
+              #layout: #(#LayoutFrame 5 0 110 0 220 0 132 0)
+              #enableChannel: #cvsIsSetup
+              #model: #useManager
+              #translateLabel: true
+            )
+           #(#ActionButtonSpec
+              #label: 'Setup...'
+              #name: 'SetupButton1'
+              #layout: #(#LayoutFrame -250 1 110 0 -5 1 130 0)
+              #translateLabel: true
+              #model: #setupSourceCodeManager
+              #enableChannel: #useManager
+            )
+           #(#LabelSpec
+              #label: 'Source Cache Dir:'
+              #name: 'SourceCacheDirLabel'
+              #layout: #(#LayoutFrame 96 0 145 0 300 0 167 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'SourceCacheDirEntryField'
+              #layout: #(#LayoutFrame 300 0 145 0 -5 1 167 0)
+              #enableChannel: #useManager
+              #model: #sourceCacheDir
+              #immediateAccept: true
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#ActionButtonSpec
+              #label: 'Flush Cache now'
+              #name: 'FlushCacheNowButton'
+              #layout: #(#LayoutFrame -250 1 179 0 -5 1 199 0)
+              #translateLabel: true
+              #model: #flushSourceCache
+              #enableChannel: #useManager
+            )
+           #(#ActionButtonSpec
+              #label: 'Condense Cache now'
+              #name: 'CondenseCacheNowButton'
+              #layout: #(#LayoutFrame -250 1 204 0 -5 1 224 0)
+              #translateLabel: true
+              #model: #condenseSourceCache
+              #enableChannel: #useManager
+            )
+           #(#CheckBoxSpec
+              #label: 'If Present, Use Local Source (Suppress Checkout)'
+              #name: 'CheckBox4'
+              #layout: #(#LayoutFrame 50 0 232 0 -5 1 254 0)
+              #model: #localSourceFirst
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Check for halt/error-Sends when Checking in'
+              #name: 'CheckBox5'
+              #layout: #(#LayoutFrame 50 0 257 0 -5 1 279 0)
+              #model: #checkClassesWhenCheckingIn
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 282 0 0 1.0 286 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Syntax Coloring'
+              #name: 'SyntaxColoringCheckBox'
+              #layout: #(#LayoutFrame 5 0 292 0 300 0 316 0)
+              #model: #syntaxColoring
+              #translateLabel: true
+            )
+           #(#ActionButtonSpec
+              #label: 'Configure...'
+              #name: 'SyntaxColorButton'
+              #layout: #(#LayoutFrame -250 1 292 0 -5 1 312 0)
+              #translateLabel: true
+              #model: #syntaxColorConfiguration
+              #enableChannel: #syntaxColoring
+            )
+           #(#CheckBoxSpec
+              #label: 'Immediate Selector Check'
+              #name: 'ImmediateSelectorCheckBox'
+              #layout: #(#LayoutFrame 5 0 317 0 300 0 339 0)
+              #enableChannel: #syntaxColoring
+              #model: #fullSelectorCheck
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Auto Format'
+              #name: 'AutoFormatCheckBox'
+              #layout: #(#LayoutFrame 5 0 342 0 300 0 364 0)
+              #model: #autoFormat
+              #translateLabel: true
+            )
+           #(#ActionButtonSpec
+              #label: 'Configure...'
+              #name: 'FormattingConfigurationButton'
+              #layout: #(#LayoutFrame -250 1 342 0 -5 1 362 0)
+              #translateLabel: true
+              #model: #formattingConfiguration
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 369 0 0 1.0 373 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Show Error Notifier before Opening Debugger'
+              #name: 'ShowErrorNotifierCheckBox'
+              #layout: #(#LayoutFrame 5 0 378 0 -5 1 400 0)
+              #model: #showErrorNotifier
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Verbose Backtrace by Default in Debugger'
+              #name: 'ShowVerboseStackCheckBox'
+              #layout: #(#LayoutFrame 5 0 403 0 -5 1 428 0)
+              #model: #showVerboseStack
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator4'
+              #layout: #(#LayoutFrame 0 0.0 431 0 0 1.0 435 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'accessing'!
+
+manager
+
+    ^ Smalltalk at:#SourceCodeManager
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'actions'!
+
+condenseSourceCache
+
+    self withWaitCursorDo:[ AbstractSourceCodeManager condenseSourceCache ]
+!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+flushSourceCache
+
+    self withWaitCursorDo:[ AbstractSourceCodeManager flushSourceCache ]
+!
+
+formattingConfiguration
+
+    AbstractLauncherApplication::LauncherDialogs formattingConfigurationDialog
+!
+
+help
+
+"/    self warn:'no help available here'.
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/sourceSettings.html'].
+!
+
+loadRequest
+
+    self logDoits value:Smalltalk logDoits.
+    self updChanges value:Class updatingChanges.
+    self changeFileName value:ObjectMemory nameForChanges.
+    self hasManager ifTrue:[
+        self useManager value:(manager := Smalltalk at:#SourceCodeManager) notNil.
+        self localSourceFirst value:Class tryLocalSourceFirst.
+        self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
+        manager notNil ifTrue:[
+            manager forgetDisabledModules.
+            repository := manager repositoryName.
+            repository notNil ifTrue:[
+                repositoryHolder := repository asValue.
+            ] ifFalse:[
+                repositoryHolder := '' asValue.
+            ].
+        ].
+        self cvsIsSetup value:true.
+    ] ifFalse:[
+        self useManager value: false.
+        self localSourceFirst value:false.
+        self cvsIsSetup value:false.
+    ].
+    self showErrorNotifier value:(Exception emergencyHandler == AbstractLauncherApplication notifyingEmergencyHandler).
+    self showVerboseStack value:(DebugView defaultVerboseBacktrace ? false).
+    self syntaxColoring value:currentUserPrefs syntaxColoring.
+    self fullSelectorCheck value:currentUserPrefs fullSelectorCheck.
+    self autoFormat value:currentUserPrefs autoFormatting.
+
+    self checkClassesWhenCheckingIn value:(currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true).
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Font Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    self hasUnsavedChanges ifTrue:[
+        Smalltalk logDoits:self logDoits value.
+        Class updateChanges:self updChanges value.
+        ObjectMemory nameForChanges:self changeFileName value.
+
+        (self hasManager and:[self useManager value]) ifTrue:[
+            manager isNil ifTrue:[
+                Smalltalk at:#SourceCodeManager put:(AbstractSourceCodeManager defaultManager).
+                manager := Smalltalk at:#SourceCodeManager.
+            ].
+            Class tryLocalSourceFirst:self localSourceFirst value.
+
+            manager notNil ifTrue:[
+                | nm fn|
+                nm := self sourceCacheDir value.
+                nm size > 0 ifTrue:[
+                    (fn := nm asFilename) exists ifFalse:[
+                        (self confirm:('CVS cache directory ''' , nm , ''' does not exists\create ?' withCRs)) ifTrue:[
+                            fn makeDirectory; 
+                               makeReadableForAll;
+                               makeWritableForAll;
+                               makeExecutableForAll.
+                        ]
+                    ].
+                    (fn exists 
+                    and:[fn isDirectory
+                    and:[fn isReadable
+                    and:[fn isWritable]]]) ifTrue:[
+                        AbstractSourceCodeManager cacheDirectoryName:(self sourceCacheDir value).
+                    ] ifFalse:[
+                        self warn:'Invalid sourceCache directory.'
+                    ]
+                ]
+            ].
+
+            repositoryHolder notNil ifTrue:[
+                repositoryHolder value size > 0 ifTrue:[
+                    manager notNil ifTrue:[
+                        manager initializeForRepository:repositoryHolder value.
+                    ]
+                ].
+            ].
+        ] ifFalse:[
+            Smalltalk at:#SourceCodeManager put:nil
+        ].
+
+        self showErrorNotifier value ifFalse:[
+            Exception emergencyHandler:nil
+        ] ifTrue:[
+            Exception emergencyHandler:(AbstractLauncherApplication notifyingEmergencyHandler)
+        ].
+        DebugView defaultVerboseBacktrace:self showVerboseStack value.
+        currentUserPrefs syntaxColoring:self syntaxColoring value.
+        currentUserPrefs at:#fullSelectorCheck put:self fullSelectorCheck value.
+        currentUserPrefs autoFormatting:self autoFormat value.
+
+        UserPreferences current at:#checkClassesWhenCheckingIn put:self checkClassesWhenCheckingIn value.
+        self modifiedChannel value:false.
+    ].
+!
+
+setupSourceCodeManager
+
+   AbstractLauncherApplication::LauncherDialogs cvsConfigurationDialog.
+   manager := (Smalltalk at:#SourceCodeManager).
+   cvsIsSetup value:manager notNil.
+   manager notNil ifTrue:[
+        repositoryHolder value: manager repositoryName.
+        sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
+   ].
+!
+
+syntaxColorConfiguration
+    "automatically generated by UIPainter ..."
+
+    "*** the code below performs no action"
+    "*** (except for some feedback on the Transcript)"
+    "*** Please change as required and accept in the browser."
+
+    "action to be added ..."
+
+    Transcript showCR:self class name, ': action for syntaxColorConfiguration ...'.
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'aspects'!
+
+autoFormat
+
+    autoFormat isNil ifTrue:[
+        autoFormat := currentUserPrefs autoFormatting asValue.
+        autoFormat onChangeSend:#evaluateModified to:self
+    ].
+    ^ autoFormat.
+!
+
+changeFileName
+
+    changeFileName isNil ifTrue:[
+        changeFileName := ObjectMemory nameForChanges asValue.
+        changeFileName onChangeSend:#evaluateModified to:self
+    ].
+    ^ changeFileName.
+!
+
+checkClassesWhenCheckingIn
+
+    checkClassesWhenCheckingIn isNil ifTrue:[
+        checkClassesWhenCheckingIn := (currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true) asValue.
+        checkClassesWhenCheckingIn onChangeSend:#evaluateModified to:self
+    ].
+    ^ checkClassesWhenCheckingIn.
+!
+
+cvsIsSetup
+
+    cvsIsSetup isNil ifTrue:[
+        cvsIsSetup := true asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       cvsIsSetup addDependent:self.
+"/       cvsIsSetup onChangeSend:#cvsIsSetupChanged to:self.
+    ].
+    ^ cvsIsSetup.
+!
+
+fullSelectorCheck
+
+    fullSelectorCheck isNil ifTrue:[
+        fullSelectorCheck := currentUserPrefs fullSelectorCheck asValue.
+        fullSelectorCheck onChangeSend:#evaluateModified to:self
+    ].
+    ^ fullSelectorCheck.
+!
+
+localSourceFirst
+
+    localSourceFirst isNil ifTrue:[
+        localSourceFirst := ValueHolder new.
+        localSourceFirst onChangeSend:#evaluateModified to:self
+    ].
+    ^ localSourceFirst.
+!
+
+logDoits
+
+    logDoits isNil ifTrue:[
+        logDoits := Smalltalk logDoits asValue.
+        logDoits onChangeSend:#evaluateModified to:self
+    ].
+    ^ logDoits.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+showErrorNotifier
+
+    showErrorNotifier isNil ifTrue:[
+        showErrorNotifier := (Exception emergencyHandler == AbstractLauncherApplication notifyingEmergencyHandler) asValue.
+        showErrorNotifier onChangeSend:#evaluateModified to:self
+    ].
+    ^ showErrorNotifier.
+!
+
+showVerboseStack
+
+    showVerboseStack isNil ifTrue:[
+        showVerboseStack := (DebugView defaultVerboseBacktrace ? false) asValue.
+        showVerboseStack onChangeSend:#evaluateModified to:self
+    ].
+    ^ showVerboseStack.
+!
+
+sourceCacheDir
+
+    sourceCacheDir isNil ifTrue:[
+        sourceCacheDir := nil asValue.
+        sourceCacheDir addDependent:self.
+        sourceCacheDir onChangeSend:#evaluateModified to:self
+    ].
+    ^ sourceCacheDir.
+!
+
+syntaxColoring
+
+    syntaxColoring isNil ifTrue:[
+        syntaxColoring := currentUserPrefs syntaxColoring asValue.
+        syntaxColoring onChangeSend:#evaluateModified to:self
+    ].
+    ^ syntaxColoring.
+!
+
+updChanges
+
+    updChanges isNil ifTrue:[
+        updChanges := Class updatingChanges asValue.
+        updChanges onChangeSend:#evaluateModified to:self
+    ].
+    ^ updChanges.
+!
+
+useManager
+
+    useManager isNil ifTrue:[
+        useManager := ValueHolder new.
+        useManager onChangeSend:#evaluateModified to:self
+    ].
+    ^ useManager.
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'change & update'!
+
+sourceDirChanged
+
+    manager notNil ifTrue:[
+        | nm fn|
+        nm := self sourceCacheDir value.
+        nm size > 0 ifTrue:[
+            (fn := nm asFilename) exists ifFalse:[
+                (self confirm:('CVS cache directory ''' , nm , ''' does not exists\create ?' withCRs)) ifTrue:[
+                    fn makeDirectory; 
+                       makeReadableForAll;
+                       makeWritableForAll;
+                       makeExecutableForAll.
+                ]
+            ].
+            (fn exists 
+            and:[fn isDirectory
+            and:[fn isReadable
+            and:[fn isWritable]]]) ifTrue:[
+                AbstractSourceCodeManager cacheDirectoryName:(self sourceCacheDir value).
+            ] ifFalse:[
+                self warn:'Invalid sourceCache directory.'.
+                self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
+            ]
+        ]
+    ].
+!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self sourceCacheDir ifTrue:[
+        ^ self sourceDirChanged.
+    ].
+
+    super update:something with:aParameter from:changedObject
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    currentUserPrefs := UserPreferences current.
+    (AbstractSourceCodeManager notNil 
+    and:[AbstractSourceCodeManager isLoaded not]) ifTrue:[
+        AbstractSourceCodeManager autoload.    
+    ].
+    repositoryHolder := '' asValue.
+    self loadRequest.
+    super initialize
+!
+
+postOpen
+!
+
+postOpenAsSubcanvasWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenAsSubcanvasWith:aBuilder
+!
+
+postOpenWith:aBuilder
+
+    self postOpen.
+    ^ super postOpenWith:aBuilder
+! !
+
+!AbstractSettingsApplication::SourceAndDebuggerSettingsAppl methodsFor:'queries'!
+
+hasManager
+    ^ AbstractSourceCodeManager notNil
+                  and:[AbstractSourceCodeManager isLoaded]
+!
+
+hasUnsavedChanges
+
+    ^ (
+        Smalltalk logDoits ~= self logDoits value or:[
+        Class updatingChanges ~= self updChanges value or:[
+        ObjectMemory nameForChanges ~= self changeFileName value or:[
+        self useManager value ~= (Smalltalk at:#SourceCodeManager) notNil or:[
+        ((self hasManager and:[self useManager value]) and:[
+            Class tryLocalSourceFirst ~= self localSourceFirst value or:[
+            AbstractSourceCodeManager cacheDirectoryName ~= self sourceCacheDir value]]
+        ) or:[
+        self showErrorNotifier value ~= (Exception emergencyHandler == AbstractLauncherApplication notifyingEmergencyHandler) or:[
+        DebugView defaultVerboseBacktrace ? false ~= self showVerboseStack value or:[
+        currentUserPrefs syntaxColoring ? false ~= self syntaxColoring value or:[
+        (currentUserPrefs at:#fullSelectorCheck ifAbsent:false) ~= self fullSelectorCheck value or:[
+        currentUserPrefs autoFormatting ? false ~= self autoFormat value or:[
+        (UserPreferences current at:#checkClassesWhenCheckingIn ifAbsent:true) ~= self checkClassesWhenCheckingIn value 
+        ]]]]]]]]]]
+    )
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl class methodsFor:'defaults'!
+
+standardStyles
+
+    ^  #(
+        'decWindows'
+        'iris' 
+        'motif' 
+        'mswindows95' 
+        'next' 
+        'normal'
+        'os2' 
+        'st80' 
+       )
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::StyleSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::StyleSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::StyleSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Style Selection'
+          #name: 'Style Selection'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 12 22 487 553)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Label'
+              #name: 'Label1'
+              #layout: #(#LayoutFrame 0 0.0 -71 1 0 1.0 -34 1)
+              #style: #(#FontDescription #helvetica #bold #roman 12)
+              #translateLabel: true
+              #labelChannel: #infoLabelHolder
+              #resizeForLabel: true
+              #adjust: #left
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#LabelSpec
+              #label: 'NoticeText'
+              #name: 'Text'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 160 0)
+              #translateLabel: true
+              #labelChannel: #noticeLabelHolder
+              #resizeForLabel: true
+              #adjust: #left
+            )
+           #(#CheckBoxSpec
+              #label: 'standard styles only'
+              #name: 'CheckBox1'
+              #layout: #(#LayoutFrame 0 0.0 160 0 0 1.0 182 0)
+              #model: #showStandardStylesOnly
+              #translateLabel: true
+            )
+           #(#SequenceViewSpec
+              #name: 'StyleList'
+              #layout: #(#LayoutFrame 0 0.0 182 0 0 1.0 -74 1)
+              #model: #selectedStyle
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #useIndex: false
+              #sequenceList: #styleList
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self warn:'no help available here'.
+"/    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/keyboardSetting.html'].
+!
+
+loadRequest
+
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Style Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    | newStyle master requestor|
+
+    newStyle := self selectedStyle value.
+    master := self masterApplication.
+    master notNil ifTrue:[
+        requestor := master requestor.
+    ].
+    self hasUnsavedChanges ifTrue:[
+        | launcher |
+        requestor notNil ifTrue:[
+            launcher := requestor.
+        ] ifFalse:[
+            | transcript |    
+            transcript := Transcript current.
+            transcript notNil ifTrue:[
+                | app|
+                app := transcript topView application.
+                (app respondsTo:#reopenLauncher) ifTrue:[
+                    launcher := app.
+                ].
+            ].
+        ].
+        self withWaitCursorDo:[
+            Transcript showCR:'change style to ' , newStyle , ' ...'.
+            View defaultStyle:newStyle asSymbol.
+        ].
+        launcher notNil ifTrue:[
+            launcher reopenLauncher.
+        ].
+        DebugView newDebugger.
+        self modifiedChannel value:false.
+    ].
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl methodsFor:'aspects'!
+
+infoLabelHolder
+
+    infoLabelHolder isNil ifTrue:[
+        infoLabelHolder := '' asValue.
+    ].
+    ^ infoLabelHolder.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+noticeLabelHolder
+
+    noticeLabelHolder isNil ifTrue:[
+        noticeLabelHolder := '' asValue.
+    ].
+    ^ noticeLabelHolder.
+!
+
+selectedStyle
+
+    selectedStyle isNil ifTrue:[
+        selectedStyle := ValueHolder new.
+        selectedStyle addDependent:self.
+    ].
+    ^ selectedStyle.
+!
+
+showStandardStylesOnly
+
+    showStandardStylesOnly isNil ifTrue:[
+        showStandardStylesOnly := true asValue.
+        showStandardStylesOnly addDependent:self.
+    ].
+    ^ showStandardStylesOnly.
+!
+
+styleList
+
+    styleList isNil ifTrue:[
+        styleList := List new.
+        styleList addDependent:self.
+    ].
+    ^ styleList.
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl methodsFor:'change & update'!
+
+changeInfoLabel
+
+    |nm sheet comment|
+
+    comment := ''.
+    nm := self selectedStyle value.
+    nm notNil ifTrue:[
+        sheet := ViewStyle fromFile:(nm , '.style').
+        comment := (sheet at:#comment ifAbsent:'') withoutSeparators.
+    ].
+    comment := comment withCRs asStringCollection.
+    comment size == 1 ifTrue:[
+        comment := comment first
+    ].
+    self infoLabelHolder value:comment
+!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == self showStandardStylesOnly ifTrue:[
+        self updateList.
+        ^ self.
+    ].
+    changedObject == self selectedStyle ifTrue:[
+        self changeInfoLabel.
+        self evaluateModified.
+        ^ self.
+    ].
+
+    super update:something with:aParameter from:changedObject
+!
+
+updateList
+
+    |listOfStyles lastSelection|
+
+    lastSelection := self selectedStyle value.
+    listOfStyles := styleDirectoryContents select:[:aFileName | aFileName asFilename hasSuffix:'style'].
+    listOfStyles := listOfStyles collect:[:aFileName | aFileName asFilename withoutSuffix name].
+    Filename isCaseSensitive ifFalse:[
+        listOfStyles := listOfStyles collect:[:aStyleName | aStyleName asLowercase].
+    ].
+    listOfStyles remove:'generic' ifAbsent:nil; remove:'mswindows3' ifAbsent:nil.
+    self showStandardStylesOnly value ifTrue:[
+        listOfStyles := listOfStyles select:[:aStyleName | self class standardStyles includes:aStyleName].
+    ].
+
+    listOfStyles sort.
+    self styleList contents:listOfStyles.
+    self selectedStyle value:lastSelection.
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    |someRsrcFile resourceDir|
+
+    resources := self class owningClass classResources.
+    someRsrcFile := Smalltalk getSystemFileName:('resources' asFilename constructString:'normal.style').
+    someRsrcFile isNil ifTrue:[
+        someRsrcFile := Smalltalk getResourceFileName:'normal.style' forPackage:'stx:libview'.
+        someRsrcFile isNil ifTrue:[
+            someRsrcFile := Smalltalk getResourceFileName:'styles/normal.style' forPackage:'stx:libview'.
+        ].
+    ].
+    someRsrcFile notNil ifTrue:[
+        resourceDir := someRsrcFile asFilename directoryName
+    ] ifFalse:[
+        resourceDir := Smalltalk getSystemFileName:'resources'.
+    ].
+
+    resourceDir isNil ifTrue:[
+        self warn:'no styles found (missing ''resources'' directory)'.
+        ^ self
+    ].
+    styleDirectoryContents := resourceDir asFilename directoryContents.
+    self updateList.
+    (self class standardStyles includes:View defaultStyle) ifFalse:[
+        self showStandardStylesOnly value:false
+    ].
+    self selectedStyle value:(View defaultStyle).
+    self noticeLabelHolder value:(resources at:'STYLE_MSG' default:'Select a Style') withCRs.    
+    super initialize
+! !
+
+!AbstractSettingsApplication::StyleSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^  (self selectedStyle value ~= View defaultStyle)
+! !
+
+!AbstractSettingsApplication::SystemMessageSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::SystemMessageSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::SystemMessageSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::SystemMessageSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Messages'
+          #name: 'Messages'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 24 22 499 293)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
+              #label: 'VM Info Messages'
+              #name: 'VMInfoMessages'
+              #layout: #(#LayoutFrame 5 0 5 0 -5 1 30 0)
+              #model: #vmInfo
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'VM Error Messages'
+              #name: 'VMErrorMessages'
+              #layout: #(#LayoutFrame 5 0 40 0 -5 1 65 0)
+              #model: #vmErrors
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 70 0 0 1 73 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Display Error Messages (Xlib, Xtlib, WinAPI ...)'
+              #name: 'DisplayErrorMessages'
+              #layout: #(#LayoutFrame 5 0 80 0 -5 1 105 0)
+              #model: #displayErrors
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Other Info Messages'
+              #name: 'OtherInfoMessages'
+              #layout: #(#LayoutFrame 4 0 115 0 -5 1 135 0)
+              #model: #classInfos
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 2 0.0 144 0 2 1 147 0)
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/messageSettings.html'].
+!
+
+loadRequest
+
+    self vmInfo value:ObjectMemory infoPrinting.
+    self vmErrors value:ObjectMemory debugPrinting.
+    self classInfos value:Object infoPrinting.
+    self displayErrors value:DeviceWorkstation errorPrinting.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed System Massage Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    ObjectMemory infoPrinting:self vmInfo value.
+    ObjectMemory debugPrinting:self vmErrors value.
+    Object infoPrinting:self classInfos value.
+    DeviceWorkstation errorPrinting:self displayErrors value.
+    self modifiedChannel value:false.
+! !
+
+!AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'aspects'!
+
+classInfos
+
+    classInfos isNil ifTrue:[
+        classInfos := Object infoPrinting asValue.
+        classInfos onChangeSend:#evaluateModified to:self
+    ].
+    ^ classInfos.
+!
+
+displayErrors
+
+    displayErrors isNil ifTrue:[
+        displayErrors := DeviceWorkstation errorPrinting asValue.
+        displayErrors onChangeSend:#evaluateModified to:self
+    ].
+    ^ displayErrors.
+!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+vmErrors
+
+    vmErrors isNil ifTrue:[
+        vmErrors := ObjectMemory debugPrinting asValue.
+        vmErrors onChangeSend:#evaluateModified to:self
+    ].
+    ^ vmErrors.
+!
+
+vmInfo
+
+    vmInfo isNil ifTrue:[
+        vmInfo := ObjectMemory infoPrinting asValue.
+        vmInfo onChangeSend:#evaluateModified to:self
+    ].
+    ^ vmInfo.
+! !
+
+!AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    super initialize
+! !
+
+!AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^(self vmInfo value ~= ObjectMemory infoPrinting  or:[
+      self vmErrors value ~= ObjectMemory debugPrinting or:[
+      self classInfos value ~= Object infoPrinting or:[
+      self displayErrors value ~= DeviceWorkstation errorPrinting ]]])
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:AbstractLauncherApplication::ToolsSettingsAppl andSelector:#windowSpec
+     AbstractLauncherApplication::ToolsSettingsAppl new openInterface:#windowSpec
+     AbstractLauncherApplication::ToolsSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'AbstractLauncherApplication::LauncherDialogs::ToolsSettingsAppl'
+          #name: 'AbstractLauncherApplication::LauncherDialogs::ToolsSettingsAppl'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 16 42 491 313)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#CheckBoxSpec
+              #label: 'Use the New Changes Browser'
+              #name: 'ChangesBrowser'
+              #layout: #(#LayoutFrame 5 0 5 0 250 0 30 0)
+              #model: #useNewChangesBrowser
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator1'
+              #layout: #(#LayoutFrame 0 0.0 35 0 0 1 38 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Use the New System Browser'
+              #name: 'NewSystemBrowser'
+              #layout: #(#LayoutFrame 250 0 5 0 0 1 30 0)
+              #model: #useNewSystemBrowser
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator2'
+              #layout: #(#LayoutFrame 0 0.0 70 0 0 1 73 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Use the New VersionDiff Browser'
+              #name: 'VersionDiffBrowser'
+              #layout: #(#LayoutFrame 5 0 40 0 250 0 65 0)
+              #model: #useNewVersionDiffBrowser
+              #translateLabel: true
+            )
+           #(#DividerSpec
+              #name: 'Separator3'
+              #layout: #(#LayoutFrame 0 0.0 105 0 0 1 108 0)
+            )
+           #(#CheckBoxSpec
+              #label: 'Use the New File Browser'
+              #name: 'NewFileBrowser'
+              #layout: #(#LayoutFrame 250 0 40 0 0 1 65 0)
+              #model: #useNewFileBrowser
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Use Hierarchical Inspector'
+              #name: 'HierarchicalInspector'
+              #layout: #(#LayoutFrame 5 0 75 0 250 0 100 0)
+              #model: #useNewInspector
+              #translateLabel: true
+            )
+           #(#CheckBoxSpec
+              #label: 'Show Clock in Launcher'
+              #name: 'Clock'
+              #layout: #(#LayoutFrame 250 0 75 0 0 1 100 0)
+              #model: #showClockInLauncher
+              #translateLabel: true
+            )
+           #(#LabelSpec
+              #label: '''Transcripts Buffer Size:'''
+              #name: 'Label1'
+              #layout: #(#LayoutFrame 9 0 133 0 154 0 155 0)
+              #translateLabel: true
+              #adjust: #left
+            )
+           #(#InputFieldSpec
+              #name: 'Transcripts Buffer Size'
+              #layout: #(#LayoutFrame 159 0 133 0 214 0 155 0)
+              #model: #transcriptBufferSize
+              #type: #number
+              #immediateAccept: true
+              #acceptOnReturn: true
+              #acceptOnTab: true
+              #acceptOnLostFocus: true
+              #acceptOnPointerLeave: false
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -34 1 0 1.0 0 1)
+              #horizontalLayout: #center
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'OK'
+                    #translateLabel: true
+                    #model: #saveSettings
+                    #enableChannel: #modifiedChannel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Cancel'
+                    #translateLabel: true
+                    #model: #doCancel
+                    #extent: #(#Point 125 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'Help'
+                    #name: 'Help'
+                    #translateLabel: true
+                    #model: #help
+                    #extent: #(#Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'actions'!
+
+doCancel
+
+    self isPartOfSettinsDialog ifTrue:[
+        self loadRequest.
+    ].
+    self closeRequest.
+!
+
+evaluateModified
+
+    self modifiedChannel value:(self hasUnsavedChanges).
+!
+
+help
+
+    self withWaitCursorDo:[HTMLDocumentView openFullOnHelpFile:'Launcher/toolSettings.html'].
+!
+
+loadRequest
+
+    self showClockInLauncher value:currentUserPrefs showClockInLauncher.
+    self transcriptBufferSize value:Transcript current lineLimit.
+    self useNewChangesBrowser value:currentUserPrefs useNewChangesBrowser.
+    self useNewFileBrowser value:currentUserPrefs useNewFileBrowser.
+    self useNewInspector value:currentUserPrefs useNewInspector.
+    self useNewSystemBrowser value:currentUserPrefs useNewSystemBrowser.
+    self useNewVersionDiffBrowser value:currentUserPrefs useNewVersionDiffBrowser.
+    self modifiedChannel value:false.
+!
+
+saveRequest
+    | result |
+
+    (self hasUnsavedChanges) ifTrue:[
+        result := self confirmWithCancel:(resources string:'Save changed Tool Settings ?'). 
+        result isNil ifTrue:[ ^ false].
+        result ifTrue:[
+            self saveSettings.
+        ] ifFalse:[
+            self loadRequest.
+        ]
+    ].
+    ^ true
+!
+
+saveSettings
+
+    | showClock launcher |
+
+    currentUserPrefs useNewInspector:self useNewInspector value.
+    currentUserPrefs useNewChangesBrowser:self useNewChangesBrowser value.
+    currentUserPrefs useNewSystemBrowser:self useNewSystemBrowser value.
+    currentUserPrefs useNewVersionDiffBrowser:self useNewVersionDiffBrowser value.
+    currentUserPrefs useNewFileBrowser:self useNewFileBrowser value.
+    (Smalltalk at:#FileBrowserV2) isBehavior ifTrue:[
+        self useNewFileBrowser value ifTrue:[
+            FileBrowserV2 installInLauncher.
+        ] ifFalse:[
+            FileBrowserV2 isLoaded ifTrue:[
+                FileBrowserV2 removeFromLauncher.
+            ]
+        ].
+    ].
+    showClock := self showClockInLauncher value.
+    currentUserPrefs showClockInLauncher ~= showClock ifTrue:[
+        currentUserPrefs showClockInLauncher:showClock.
+        launcher := Transcript application.
+        (launcher isKindOf:ToolApplicationModel) ifTrue:[
+            showClock ifTrue:[
+                launcher startClock
+            ] ifFalse:[
+                launcher stopClock
+            ]
+        ]
+    ].
+    Inspector := currentUserPrefs inspectorClassSetting.
+    Transcript current lineLimit:self transcriptBufferSize value.
+    self modifiedChannel value:false.
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'aspects'!
+
+modifiedChannel
+
+    modifiedChannel isNil ifTrue:[
+        modifiedChannel := false asValue.
+    ].
+    ^ modifiedChannel
+!
+
+showClockInLauncher
+
+    showClockInLauncher isNil ifTrue:[
+        showClockInLauncher := currentUserPrefs showClockInLauncher asValue.
+        showClockInLauncher onChangeSend:#evaluateModified to:self
+    ].
+    ^ showClockInLauncher.
+!
+
+transcriptBufferSize
+
+    transcriptBufferSize isNil ifTrue:[
+        transcriptBufferSize := Transcript current lineLimit asValue.
+        transcriptBufferSize onChangeSend:#evaluateModified to:self
+    ].
+    ^ transcriptBufferSize.
+!
+
+useNewChangesBrowser
+
+    useNewChangesBrowser isNil ifTrue:[
+        useNewChangesBrowser := currentUserPrefs useNewChangesBrowser asValue.
+        useNewChangesBrowser onChangeSend:#evaluateModified to:self
+    ].
+    ^ useNewChangesBrowser.
+!
+
+useNewFileBrowser
+
+    useNewFileBrowser isNil ifTrue:[
+        useNewFileBrowser := currentUserPrefs useNewFileBrowser asValue.
+        useNewFileBrowser onChangeSend:#evaluateModified to:self
+    ].
+    ^ useNewFileBrowser.
+!
+
+useNewInspector
+
+    useNewInspector isNil ifTrue:[
+        useNewInspector := currentUserPrefs useNewInspector asValue.
+        useNewInspector onChangeSend:#evaluateModified to:self
+    ].
+    ^ useNewInspector.
+!
+
+useNewSystemBrowser
+
+    useNewSystemBrowser isNil ifTrue:[
+        useNewSystemBrowser := currentUserPrefs useNewSystemBrowser asValue.
+        useNewSystemBrowser onChangeSend:#evaluateModified to:self
+    ].
+    ^ useNewSystemBrowser.
+!
+
+useNewVersionDiffBrowser
+
+    useNewVersionDiffBrowser isNil ifTrue:[
+        useNewVersionDiffBrowser := currentUserPrefs useNewVersionDiffBrowser asValue.
+        useNewVersionDiffBrowser onChangeSend:#evaluateModified to:self
+    ].
+    ^ useNewVersionDiffBrowser.
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'initialization & release'!
+
+closeRequest
+
+    self saveRequest ifFalse:[
+        ^ self
+    ].
+
+    ^ super closeRequest.
+!
+
+initialize
+
+    resources := self class owningClass classResources.
+    currentUserPrefs := UserPreferences current.
+    super initialize
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'queries'!
+
+hasUnsavedChanges
+
+    ^ ((self useNewInspector value       ~= currentUserPrefs useNewInspector)       or:[
+       (self useNewChangesBrowser value  ~= currentUserPrefs useNewChangesBrowser)  or:[
+       (self useNewSystemBrowser value   ~= currentUserPrefs useNewSystemBrowser)   or:[
+       (self showClockInLauncher value   ~= currentUserPrefs showClockInLauncher)   or:[
+       (self useNewVersionDiffBrowser value ~= currentUserPrefs useNewVersionDiffBrowser) or:[
+       (self useNewFileBrowser value     ~= currentUserPrefs useNewFileBrowser) or:[
+       (self transcriptBufferSize value  ~= Transcript current lineLimit)]]]]]])
+! !
+
 !AbstractSettingsApplication class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/AbstractSettingsApplication.st,v 1.3 2002-11-11 17:54:42 penk Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/AbstractSettingsApplication.st,v 1.4 2002-11-19 14:11:02 penk Exp $'
 ! !