AbstractSettingsApplication.st
branchjv
changeset 15927 b134b5ad8d68
parent 15904 48a265cbd477
parent 15921 d3527cddc842
child 15949 9c20ced90e66
--- a/AbstractSettingsApplication.st	Tue Oct 27 06:40:43 2015 +0100
+++ b/AbstractSettingsApplication.st	Thu Oct 29 06:54:24 2015 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2002 by eXept Software AG
 	      All Rights Reserved
@@ -380,6 +382,13 @@
 	privateIn:AbstractSettingsApplication
 !
 
+AbstractSettingsApplication subclass:#WorkspaceSettingsAppl
+	instanceVariableNames:'usersModuleName workspaceDirectory'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:AbstractSettingsApplication
+!
+
 !AbstractSettingsApplication class methodsFor:'documentation'!
 
 copyright
@@ -664,6 +673,16 @@
 
 !AbstractSettingsApplication methodsFor:'aspects'!
 
+aspects
+    "if redefined to return a non-nil list of preference-key aspects, 
+     you can then use the basicSaveSettings/basicReadSettings/hasUnsavedChanges
+     as inherited from here.
+     Otherwise, if you do not want the aspect-list-keys to be read/saved in the settings,
+     you MUST redefine all of the 3 above mentioned methods."
+     
+    ^ nil
+!
+
 modifiedChannel
 
     modifiedChannel isNil ifTrue:[
@@ -815,12 +834,50 @@
 !
 
 basicReadSettings
-    self subclassResponsibility
+    "utility to read aspects as listed in the aspects method.
+     If that has not been redefined, an error will be reported,
+     as you should then redefine this method in a subclass"
+
+    |aspects|
+
+    (aspects := self aspects) notNil ifTrue:[
+        self
+            readAspects: aspects
+            from:currentUserPrefs.
+        ^ self    
+    ].
+    ^ self subclassResponsibility
 !
 
 basicSaveSettings
-
-    self subclassResponsibility.
+    "utility to save aspects as listed in the aspects method.
+     If that has not been redefined, an error will be reported,
+     as you should then redefine this method in a subclass"
+     
+    |aspects|
+
+    (aspects := self aspects) notNil ifTrue:[
+        self
+            writeAspects:(self aspects)
+            to:currentUserPrefs.
+        ^ self    
+    ].
+    ^ self subclassResponsibility
+!
+
+hasUnsavedChanges
+    "utility to check for changed aspects as listed in the aspects method.
+     If that has not been redefined, an error will be reported,
+     as you should then redefine this method in a subclass"
+
+    |aspects|
+    
+    (aspects := self aspects) notNil ifTrue:[
+        ^ (self
+            hasChangedAspectIn:(self aspects)
+            asComparedTo:currentUserPrefs)
+    ].
+    ^ self subclassResponsibility
 !
 
 help
@@ -852,11 +909,6 @@
 
 !AbstractSettingsApplication methodsFor:'queries'!
 
-hasUnsavedChanges
-
-    ^ self subclassResponsibility
-!
-
 isEnabledInSettingsDialog:aSettingsDialog
     ^ true
 
@@ -867,6 +919,49 @@
     ^ settingsDialog getNameOfApplication:self.
 ! !
 
+!AbstractSettingsApplication::BuildSettingsAppl class methodsFor:'help specs'!
+
+flyByHelpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:AbstractSettingsApplication::ByteCodeCompilerSettingsAppl
+    "
+
+    <resource: #help>
+
+    ^ super flyByHelpSpec addPairsFrom: self helpPairs
+!
+
+helpPairs
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:AbstractSettingsApplication::ByteCodeCompilerSettingsAppl
+    "
+
+    <resource: #help>
+
+    ^ #(
+
+#buildDirectory
+'Temporary folder, where application packages are built for deployment.\If left unspecified, this defaults to the workspace folder or the current directory, if no workspace has been defined).'
+
+#localBuild
+'If checked, files are saved from the image to the build directory and compiled there.\If unchecked, files need to be checked into a repository and are fetched from there into a temporary for a build.'
+
+
+)
+! !
+
 !AbstractSettingsApplication::BuildSettingsAppl class methodsFor:'image specs'!
 
 defaultIcon
@@ -896,140 +991,144 @@
 
     ^
      #(FullSpec
-	name: windowSpec
-	window:
+        name: windowSpec
+        window:
        (WindowSpec
-	  label: 'Build Settings'
-	  name: 'Build Settings'
-	  min: (Point 10 10)
-	  bounds: (Rectangle 0 0 659 242)
-	)
-	component:
+          label: 'Build Settings'
+          name: 'Build Settings'
+          min: (Point 10 10)
+          bounds: (Rectangle 0 0 659 242)
+        )
+        component:
        (SpecCollection
-	  collection: (
-	   (VerticalPanelViewSpec
-	      name: 'VerticalPanel3'
-	      layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-	      horizontalLayout: fit
-	      verticalLayout: top
-	      horizontalSpace: 3
-	      verticalSpace: 4
-	      component:
-	     (SpecCollection
-		collection: (
-		 (FramedBoxSpec
-		    label: 'Build Directory'
-		    name: 'FramedBox1'
-		    labelPosition: topLeft
-		    translateLabel: true
-		    component:
-		   (SpecCollection
-		      collection: (
-		       (ViewSpec
-			  name: 'LocalBuild'
-			  layout: (LayoutFrame 0 0.0 0 0 0 1.0 25 0)
-			  component:
-			 (SpecCollection
-			    collection: (
-			     (CheckBoxSpec
-				label: 'Local Build (Do not use Repository)'
-				name: 'CheckBox4'
-				layout: (LayoutFrame 2 0 5 0 -5 1 27 0)
-				enableChannel: hasSourceCodeManager
-				model: localBuild
-				translateLabel: true
-			      )
-			     )
-
-			  )
-			)
-		       (ViewSpec
-			  name: 'Build Directory'
-			  layout: (LayoutFrame 0 0 40 0 0 1 70 0)
-			  component:
-			 (SpecCollection
-			    collection: (
-			     (LabelSpec
-				label: 'Build Directory:'
-				name: 'BuildDirDirLabel'
-				layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
-				translateLabel: true
-				adjust: right
-			      )
-			     (FilenameInputFieldSpec
-				name: 'FilenameEntryField1'
-				layout: (LayoutFrame 221 0 0 0 0 1 22 0)
-				enableChannel: localBuild
-				model: buildDirectory
-				acceptOnReturn: true
-				acceptOnTab: true
-				acceptOnLostFocus: true
-				acceptOnPointerLeave: true
-				viewClassName: FilenameWidgetWithHistory
-				postBuildCallback: postBuildDirectoryField:
-			      )
-			     )
-
-			  )
-			)
-		       (HorizontalPanelViewSpec
-			  name: 'ActionsHorizontalPanel'
-			  layout: (LayoutFrame 62 0.25 67 0 0 1 96 0)
-			  horizontalLayout: fitSpace
-			  verticalLayout: center
-			  horizontalSpace: 3
-			  verticalSpace: 3
-			  component:
-			 (SpecCollection
-			    collection: (
-			     (ActionButtonSpec
-				label: 'Cleanup Build Directory'
-				name: 'CleanupBuildDirectoryButton'
-				translateLabel: true
-				tabable: true
-				model: cleanupBuildDirectory
-				extent: (Point 401 22)
-			      )
-			     )
-
-			  )
-			)
-		       )
-
-		    )
-		    extent: (Point 659 128)
-		  )
-		 (ViewSpec
-		    name: 'Box1'
-		    component:
-		   (SpecCollection
-		      collection: (
-		       (LabelSpec
-			  label: 'Compiler for Build:'
-			  name: 'Label1'
-			  layout: (LayoutFrame 0 0 0 0 150 0 22 0)
-			  translateLabel: true
-			  adjust: right
-			)
-		       (ComboListSpec
-			  name: 'ComboList1'
-			  layout: (LayoutFrame 150 0 0 0 300 0 20 0)
-			  model: usedCompilerForBuild
-			  comboList: listOfPossibleCompilers
-			  useIndex: false
-			)
-		       )
-
-		    )
-		    extent: (Point 659 25)
-		  )
-		 )
-
-	      )
-	    )
-	   )
-
-	)
+          collection: (
+           (VerticalPanelViewSpec
+              name: 'VerticalPanel3'
+              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+              horizontalLayout: fit
+              verticalLayout: top
+              horizontalSpace: 3
+              verticalSpace: 4
+              component:
+             (SpecCollection
+                collection: (
+                 (FramedBoxSpec
+                    label: 'Build Directory'
+                    name: 'FramedBox1'
+                    labelPosition: topLeft
+                    translateLabel: true
+                    component:
+                   (SpecCollection
+                      collection: (
+                       (ViewSpec
+                          name: 'LocalBuild'
+                          layout: (LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+                          activeHelpKey: localBuild
+                          component:
+                         (SpecCollection
+                            collection: (
+                             (CheckBoxSpec
+                                label: 'Local Build (Do not use Repository)'
+                                name: 'CheckBox4'
+                                layout: (LayoutFrame 2 0 5 0 -5 1 27 0)
+                                enableChannel: hasSourceCodeManager
+                                activeHelpKey: localBuild
+                                model: localBuild
+                                translateLabel: true
+                              )
+                             )
+
+                          )
+                        )
+                       (ViewSpec
+                          name: 'Build Directory'
+                          layout: (LayoutFrame 0 0 40 0 0 1 70 0)
+                          component:
+                         (SpecCollection
+                            collection: (
+                             (LabelSpec
+                                label: 'Build Directory:'
+                                name: 'BuildDirDirLabel'
+                                layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
+                                translateLabel: true
+                                adjust: right
+                    activeHelpKey: buildDirectory
+                              )
+                             (FilenameInputFieldSpec
+                                name: 'FilenameEntryField1'
+                                layout: (LayoutFrame 221 0 0 0 0 1 22 0)
+                                enableChannel: localBuild
+                                model: buildDirectory
+                                acceptOnReturn: true
+                                acceptOnTab: true
+                                acceptOnLostFocus: true
+                                acceptOnPointerLeave: true
+                                viewClassName: FilenameWidgetWithHistory
+                                postBuildCallback: postBuildDirectoryField:
+                    activeHelpKey: buildDirectory
+                              )
+                             )
+
+                          )
+                        )
+                       (HorizontalPanelViewSpec
+                          name: 'ActionsHorizontalPanel'
+                          layout: (LayoutFrame 62 0.25 67 0 0 1 96 0)
+                          horizontalLayout: fitSpace
+                          verticalLayout: center
+                          horizontalSpace: 3
+                          verticalSpace: 3
+                          component:
+                         (SpecCollection
+                            collection: (
+                             (ActionButtonSpec
+                                label: 'Cleanup Build Directory'
+                                name: 'CleanupBuildDirectoryButton'
+                                translateLabel: true
+                                tabable: true
+                                model: cleanupBuildDirectory
+                                extent: (Point 401 22)
+                              )
+                             )
+
+                          )
+                        )
+                       )
+
+                    )
+                    extent: (Point 659 128)
+                  )
+                 (ViewSpec
+                    name: 'Box1'
+                    component:
+                   (SpecCollection
+                      collection: (
+                       (LabelSpec
+                          label: 'Compiler for Build:'
+                          name: 'Label1'
+                          layout: (LayoutFrame 0 0 0 0 150 0 22 0)
+                          translateLabel: true
+                          adjust: right
+                        )
+                       (ComboListSpec
+                          name: 'ComboList1'
+                          layout: (LayoutFrame 150 0 0 0 300 0 20 0)
+                          model: usedCompilerForBuild
+                          comboList: listOfPossibleCompilers
+                          useIndex: false
+                        )
+                       )
+
+                    )
+                    extent: (Point 659 25)
+                  )
+                 )
+
+              )
+            )
+           )
+
+        )
       )
 
     "Modified: / 22-01-2012 / 10:59:44 / cg"
@@ -1038,18 +1137,11 @@
 !AbstractSettingsApplication::BuildSettingsAppl methodsFor:'actions'!
 
 basicReadSettings
-    self
-	readAspects:
-	    #(
-		buildDirectory
-		localBuild
-		usedCompilerForBuild
-	    )
-	from:currentUserPrefs.
+    super basicReadSettings.
 
     usedCompilerForBuild value isNil ifTrue:[
-	currentUserPrefs usedCompilerForBuild:(Tools::ProjectBuilder defaultUsedCompiler).
-	usedCompilerForBuild value:(Tools::ProjectBuilder defaultUsedCompiler).
+        currentUserPrefs usedCompilerForBuild:(Tools::ProjectBuilder defaultUsedCompiler).
+        usedCompilerForBuild value:(Tools::ProjectBuilder defaultUsedCompiler).
     ].
 
     "Modified: / 26-07-2012 / 23:16:52 / cg"
@@ -1060,25 +1152,18 @@
 
     buildDir := buildDirectory value.
     buildDir notEmptyOrNil ifTrue:[
-	buildDir := buildDir asFilename.
-	buildDir isDirectory ifFalse:[
-	    (Dialog confirm:(resources
-			stringWithCRs:'Build directory %1 does not exist.\\Create?'
-			with:buildDir pathName allBold))
-	    ifTrue:[
-		buildDir makeDirectory.
-	    ]
-	].
-    ].
-
-    self
-	writeAspects:
-	    #(
-		buildDirectory
-		localBuild
-		usedCompilerForBuild
-	    )
-	to:currentUserPrefs.
+        buildDir := buildDir asFilename.
+        buildDir isDirectory ifFalse:[
+            (Dialog confirm:(resources
+                        stringWithCRs:'Build directory %1 does not exist.\\Create?'
+                        with:buildDir pathName allBold))
+            ifTrue:[
+                buildDir makeDirectory.
+            ]
+        ].
+    ].
+
+    super basicSaveSettings.
 
     "Modified: / 22-01-2012 / 10:50:09 / cg"
 !
@@ -1099,6 +1184,14 @@
 
 !AbstractSettingsApplication::BuildSettingsAppl methodsFor:'aspects'!
 
+aspects
+    ^ #(
+          buildDirectory
+          localBuild
+          usedCompilerForBuild
+      )
+!
+
 buildDirectory
     buildDirectory isNil ifTrue:[
 	buildDirectory := ValueHolder new.
@@ -1152,15 +1245,7 @@
 !AbstractSettingsApplication::BuildSettingsAppl methodsFor:'queries'!
 
 hasUnsavedChanges
-    (self
-	hasChangedAspectIn:
-	    #(
-		buildDirectory
-		localBuild
-		usedCompilerForBuild
-	    )
-	asComparedTo:currentUserPrefs) ifTrue:[^ true].
-
+    (super hasUnsavedChanges) ifTrue:[^ true].
     ^ false
 
     "Modified: / 22-01-2012 / 10:50:15 / cg"
@@ -2731,27 +2816,13 @@
      )
 ! !
 
-!AbstractSettingsApplication::CodeGeneratorSettingsAppl methodsFor:'actions'!
-
-basicReadSettings
-    self
-	readAspects:(self aspectSelectors)
-	from:currentUserPrefs.
-!
-
-basicSaveSettings
-    self
-	writeAspects:(self aspectSelectors)
-	to:currentUserPrefs.
-! !
-
 !AbstractSettingsApplication::CodeGeneratorSettingsAppl methodsFor:'aspects'!
 
-aspectSelectors
+aspects
     ^ #(
-	generateComments
-	generateCommentsForGetters
-	generateCommentsForSetters
+        generateComments
+        generateCommentsForGetters
+        generateCommentsForSetters
     )
 !
 
@@ -2785,16 +2856,6 @@
     ^ 'Launcher/codeGeneratorSettings.html'
 ! !
 
-!AbstractSettingsApplication::CodeGeneratorSettingsAppl methodsFor:'queries'!
-
-hasUnsavedChanges
-    ^ self
-	hasChangedAspectIn:(self aspectSelectors)
-	asComparedTo:currentUserPrefs
-
-    "Modified: / 25-11-2011 / 15:22:51 / cg"
-! !
-
 !AbstractSettingsApplication::CommunicationLoggingSettingsAppl class methodsFor:'image specs'!
 
 defaultIcon
@@ -2918,29 +2979,15 @@
      )
 ! !
 
-!AbstractSettingsApplication::CommunicationLoggingSettingsAppl methodsFor:'actions'!
-
-aspectsFromUserPreferences
+!AbstractSettingsApplication::CommunicationLoggingSettingsAppl methodsFor:'aspects'!
+
+aspects
     ^ #(
-	logHTTPRequests
-	logSOAPRequests
+        logHTTPRequests
+        logSOAPRequests
     )
 !
 
-basicReadSettings
-    self
-	readAspects:(self aspectsFromUserPreferences)
-	from:currentUserPrefs.
-!
-
-basicSaveSettings
-    self
-	writeAspects:(self aspectsFromUserPreferences)
-	to:currentUserPrefs.
-! !
-
-!AbstractSettingsApplication::CommunicationLoggingSettingsAppl methodsFor:'aspects'!
-
 logHTTPRequests
     logHTTPRequests isNil ifTrue:[
 	logHTTPRequests := false asValue.
@@ -2963,14 +3010,6 @@
     ^ 'Launcher/comLoggingSettings.html'
 ! !
 
-!AbstractSettingsApplication::CommunicationLoggingSettingsAppl methodsFor:'queries'!
-
-hasUnsavedChanges
-     ^ self
-	hasChangedAspectIn:(self aspectsFromUserPreferences)
-	asComparedTo:currentUserPrefs
-! !
-
 !AbstractSettingsApplication::DebuggerSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
@@ -3163,24 +3202,18 @@
 
 basicReadSettings
     self showErrorNotifier value:(NoHandlerError emergencyHandler == AbstractLauncherApplication notifyingEmergencyHandler).
-    self allowSendMailFromDebugger value:currentUserPrefs allowSendMailFromDebugger.
-    self verboseBacktraceInDebugger value:(currentUserPrefs verboseBacktraceInDebugger).
-    self hideSupportCodeInDebugger value:(currentUserPrefs hideSupportCodeInDebugger).
-    self useNewLayoutInDebugger value:(currentUserPrefs useNewLayoutInDebugger).
+    super basicReadSettings.
 
     "Modified: / 10-06-2012 / 21:23:24 / cg"
 !
 
 basicSaveSettings
     self showErrorNotifier value ifFalse:[
-	NoHandlerError emergencyHandler:nil
+        NoHandlerError emergencyHandler:nil
     ] ifTrue:[
-	NoHandlerError emergencyHandler:(AbstractLauncherApplication notifyingEmergencyHandler)
-    ].
-    currentUserPrefs allowSendMailFromDebugger:(self allowSendMailFromDebugger value).
-    currentUserPrefs verboseBacktraceInDebugger:(self verboseBacktraceInDebugger value).
-    currentUserPrefs useNewLayoutInDebugger:(self useNewLayoutInDebugger value).
-    currentUserPrefs hideSupportCodeInDebugger:(self hideSupportCodeInDebugger value).
+        NoHandlerError emergencyHandler:(AbstractLauncherApplication notifyingEmergencyHandler)
+    ].
+    super basicSaveSettings.
     Debugger newDebugger.
 
     "Modified: / 10-06-2012 / 21:23:32 / cg"
@@ -3197,6 +3230,15 @@
     ^ allowSendMailFromDebugger.
 !
 
+aspects
+    ^ #(
+        allowSendMailFromDebugger
+        verboseBacktraceInDebugger
+        hideSupportCodeInDebugger
+        useNewLayoutInDebugger
+    )
+!
+
 hideSupportCodeInDebugger
 
     hideSupportCodeInDebugger isNil ifTrue:[
@@ -3245,11 +3287,7 @@
 
 hasUnsavedChanges
     self showErrorNotifier value ~= (NoHandlerError emergencyHandler == AbstractLauncherApplication notifyingEmergencyHandler) ifTrue:[^ true].
-    currentUserPrefs verboseBacktraceInDebugger ~= self verboseBacktraceInDebugger value ifTrue:[^ true].
-    currentUserPrefs hideSupportCodeInDebugger ~= self hideSupportCodeInDebugger value ifTrue:[^ true].
-    currentUserPrefs allowSendMailFromDebugger ~= self allowSendMailFromDebugger value ifTrue:[^ true].
-    currentUserPrefs useNewLayoutInDebugger ~= self useNewLayoutInDebugger value ifTrue:[^ true].
-    ^ false
+    ^ super hasUnsavedChanges
 
     "Modified: / 10-06-2012 / 21:23:54 / cg"
 ! !
@@ -4313,9 +4351,7 @@
 !AbstractSettingsApplication::EditSettingsAppl methodsFor:'actions'!
 
 basicReadSettings
-    self
-	readAspects:self commonAspects
-	from:currentUserPrefs.
+    super basicReadSettings.
 
     self st80DoubleClickSelectMode value:TextView st80SelectMode.
     self tabsIs4 value:(ListView userDefaultTabPositions = ListView tab4Positions).
@@ -4323,9 +4359,7 @@
 !
 
 basicSaveSettings
-    self
-        writeAspects:self commonAspects
-        to:currentUserPrefs.
+    super basicSaveSettings.
 
     currentUserPrefs enforcedDropModeForFiles:
         ( self enforceContentsDropForFiles value 
@@ -4371,6 +4405,28 @@
 
 !AbstractSettingsApplication::EditSettingsAppl methodsFor:'aspects'!
 
+aspects
+    ^ #(
+        #useCodeView2InTools
+         #showAcceptCancelBarInBrowser
+         #searchDialogIsModal
+         #startTextDragWithControl
+         #st80EditMode
+         #extendedWordSelectMode
+         #whitespaceWordSelectMode
+         #selectAllWhenClickingBeyondEnd
+         #autoIndentInCodeView
+         #immediateCodeCompletion
+         #codeCompletionOnControlKey
+         #codeCompletionOnTabKey
+         #codeCompletionViewKeyboardNavigationNeedsModifier
+         #selectionExtensionMode
+    )
+
+    "Modified: / 07-03-2012 / 14:33:40 / cg"
+    "Modified: / 27-03-2014 / 10:10:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 autoIndentInCodeView
     autoIndentInCodeView isNil ifTrue:[
 	autoIndentInCodeView := false asValue.
@@ -4527,14 +4583,12 @@
     self enforceContentsDropForFiles value ~= (currentUserPrefs enforcedDropModeForFiles == #text) ifTrue:[^ true].
     TextView st80SelectMode ~= (self st80DoubleClickSelectMode value) ifTrue:[^ true].
     tabsIs4 value ~~ (ListView userDefaultTabPositions = ListView tab4Positions) ifTrue:[
-	ListView userDefaultTabPositions ~= (self tabsIs4 value
-						ifTrue:[ListView tab4Positions]
-						ifFalse:[ListView tab8Positions]) ifTrue:[^ true].
-    ].
-
-    ^ self
-	hasChangedAspectIn:self commonAspects
-	asComparedTo:currentUserPrefs
+        ListView userDefaultTabPositions ~= (self tabsIs4 value
+                                                ifTrue:[ListView tab4Positions]
+                                                ifFalse:[ListView tab8Positions]) ifTrue:[^ true].
+    ].
+
+    ^ super hasUnsavedChanges
 
     "Modified: / 25-11-2011 / 15:23:02 / cg"
 ! !
@@ -5019,168 +5073,167 @@
 
     <resource: #canvas>
 
-    ^
+    ^ 
     #(FullSpec
        name: windowSpec
-       window:
+       window: 
       (WindowSpec
-	 label: 'HTTP Server Settings'
-	 name: 'HTTP Server Settings'
-	 min: (Point 10 10)
-	 bounds: (Rectangle 0 0 539 630)
-       )
-       component:
+         label: 'HTTP Server Settings'
+         name: 'HTTP Server Settings'
+         min: (Point 10 10)
+         bounds: (Rectangle 0 0 539 630)
+       )
+       component: 
       (SpecCollection
-	 collection: (
-	  (VerticalPanelViewSpec
-	     name: 'VerticalPanel1'
-	     layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
-	     horizontalLayout: fit
-	     verticalLayout: top
-	     horizontalSpace: 3
-	     verticalSpace: 3
-	     component:
-	    (SpecCollection
-	       collection: (
-		(VerticalPanelViewSpec
-		   name: 'VerticalPanel4'
-		   horizontalLayout: fit
-		   verticalLayout: topSpace
-		   horizontalSpace: 3
-		   verticalSpace: 3
-		   component:
-		  (SpecCollection
-		     collection: (
-		      (ViewSpec
-			 name: 'InfoMessageBox'
-			 component:
-			(SpecCollection
-			   collection: (
-			    (LabelSpec
-			       label: 'Label'
-			       name: 'Label2'
-			       layout: (LayoutFrame 5 0.0 0 0.0 -5 1 0 1.0)
-			       translateLabel: true
-			       labelChannel: informationLabel
-			       resizeForLabel: false
-			       adjust: left
-			     )
-			    (ActionButtonSpec
-			       label: 'Load Missing WebServer Packages'
-			       name: 'Button8'
-			       layout: (AlignmentOrigin 0 0.5 0 1 0.5 1)
-			       activeHelpKey: loadWebServerPackage
-			       visibilityChannel: hasWebServerClassesNotLoadedHolder
-			       translateLabel: true
-			       tabable: true
-			       model: loadWebServerPackages
-			     )
-			    )
-
-			 )
-			 extent: (Point 539 200)
-		       )
-		      (ViewSpec
-			 name: 'Separator'
-			 extent: (Point 539 20)
-		       )
-		      (ViewSpec
-			 name: 'ActionButtonBox'
-			 component:
-			(SpecCollection
-			   collection: (
-			    (LabelSpec
-			       label: 'Port:'
-			       name: 'Label1'
-			       layout: (LayoutFrame 3 0 21 0 40 0 43 0)
-			       activeHelpKey: serverPortNumber
-			       translateLabel: true
-			       adjust: right
-			       activeHelpKey: serverPortNumber
-			     )
-			    (InputFieldSpec
-			       name: 'EntryField1'
-			       layout: (LayoutFrame 40 0 20 0 111 0 42 0)
-			       enableChannel: hasWebServerClassesLoadedHolder
-			       model: portNumberChannel
-			       type: number
-			       immediateAccept: true
-			       acceptOnReturn: true
-			       acceptOnTab: true
-			       acceptOnLostFocus: true
-			       acceptOnPointerLeave: false
-			       activeHelpKey: serverPortNumber
-			     )
-			    (VerticalPanelViewSpec
-			       name: 'VerticalPanel5'
-			       layout: (LayoutFrame 136 0 14 0 -12 1 132 0)
-			       horizontalLayout: fit
-			       verticalLayout: spreadSpace
-			       horizontalSpace: 3
-			       verticalSpace: 3
-			       component:
-			      (SpecCollection
-				 collection: (
-				  (ActionButtonSpec
-				     label: 'Create new HTTP Server'
-				     name: 'Button4'
-				     activeHelpKey: createServer
-				     translateLabel: true
-				     tabable: true
-				     model: createServer
-				     enableChannel: hasWebServerClassesLoadedHolder
-				     useDefaultExtent: true
-				   )
-				  (ActionButtonSpec
-				     label: 'Create new FastCGI Server'
-				     name: 'Button7'
-				     activeHelpKey: createFCGIServer
-				     translateLabel: true
-				     tabable: true
-				     model: createFcgiServer
-				     enableChannel: hasWebServerClassesLoadedHolder
-				     useDefaultExtent: true
-				   )
-				  (ActionButtonSpec
-				     label: 'Create Server from Settings File...'
-				     name: 'Button6'
-				     activeHelpKey: createServerFromSettingsFile
-				     translateLabel: true
-				     tabable: true
-				     model: createServerFromFile
-				     enableChannel: hasWebServerClassesLoadedHolder
-				     useDefaultExtent: true
-				   )
-				  (ActionButtonSpec
-				     label: 'Remove all Servers'
-				     name: 'Button5'
-				     activeHelpKey: removeAllServers
-				     translateLabel: true
-				     tabable: true
-				     model: removeAllServers
-				     enableChannel: hasCreatedServerChannel
-				     useDefaultExtent: true
-				   )
-				  )
-
-			       )
-			     )
-			    )
-
-			 )
-			 extent: (Point 539 142)
-		       )
-		      )
-
-		   )
-		   extent: (Point 539 620)
-		 )
-		)
-
-	     )
-	   )
-	  )
-
+         collection: (
+          (VerticalPanelViewSpec
+             name: 'VerticalPanel1'
+             layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+             horizontalLayout: fit
+             verticalLayout: top
+             horizontalSpace: 3
+             verticalSpace: 3
+             component: 
+            (SpecCollection
+               collection: (
+                (VerticalPanelViewSpec
+                   name: 'VerticalPanel4'
+                   horizontalLayout: fit
+                   verticalLayout: topSpace
+                   horizontalSpace: 3
+                   verticalSpace: 3
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (ViewSpec
+                         name: 'InfoMessageBox'
+                         component: 
+                        (SpecCollection
+                           collection: (
+                            (LabelSpec
+                               label: 'Label'
+                               name: 'Label2'
+                               layout: (LayoutFrame 5 0.0 0 0.0 -5 1 0 1.0)
+                               translateLabel: true
+                               labelChannel: informationLabel
+                               resizeForLabel: false
+                               adjust: left
+                             )
+                            (ActionButtonSpec
+                               label: 'Load Missing WebServer Packages'
+                               name: 'Button8'
+                               layout: (AlignmentOrigin 0 0.5 0 1 0.5 1)
+                               activeHelpKey: loadWebServerPackage
+                               visibilityChannel: hasWebServerClassesNotLoadedHolder
+                               translateLabel: true
+                               tabable: true
+                               model: loadWebServerPackages
+                             )
+                            )
+                          
+                         )
+                         extent: (Point 539 200)
+                       )
+                      (ViewSpec
+                         name: 'Separator'
+                         extent: (Point 539 20)
+                       )
+                      (ViewSpec
+                         name: 'ActionButtonBox'
+                         component: 
+                        (SpecCollection
+                           collection: (
+                            (LabelSpec
+                               label: 'Port:'
+                               name: 'Label1'
+                               layout: (LayoutFrame 3 0 21 0 40 0 43 0)
+                               activeHelpKey: serverPortNumber
+                               translateLabel: true
+                               adjust: right
+                             )
+                            (InputFieldSpec
+                               name: 'EntryField1'
+                               layout: (LayoutFrame 40 0 20 0 111 0 42 0)
+                               activeHelpKey: serverPortNumber
+                               enableChannel: hasWebServerClassesLoadedHolder
+                               model: portNumberChannel
+                               type: number
+                               immediateAccept: true
+                               acceptOnReturn: true
+                               acceptOnTab: true
+                               acceptOnLostFocus: true
+                               acceptOnPointerLeave: false
+                             )
+                            (VerticalPanelViewSpec
+                               name: 'VerticalPanel5'
+                               layout: (LayoutFrame 136 0 14 0 -12 1 0 1)
+                               horizontalLayout: fit
+                               verticalLayout: topSpace
+                               horizontalSpace: 3
+                               verticalSpace: 3
+                               component: 
+                              (SpecCollection
+                                 collection: (
+                                  (ActionButtonSpec
+                                     label: 'Create new HTTP Server'
+                                     name: 'Button4'
+                                     activeHelpKey: createServer
+                                     translateLabel: true
+                                     tabable: true
+                                     model: createServer
+                                     enableChannel: hasWebServerClassesLoadedHolder
+                                     useDefaultExtent: true
+                                   )
+                                  (ActionButtonSpec
+                                     label: 'Create new FastCGI Server'
+                                     name: 'Button7'
+                                     activeHelpKey: createFCGIServer
+                                     translateLabel: true
+                                     tabable: true
+                                     model: createFcgiServer
+                                     enableChannel: hasWebServerClassesLoadedHolder
+                                     useDefaultExtent: true
+                                   )
+                                  (ActionButtonSpec
+                                     label: 'Create Server from Settings File...'
+                                     name: 'Button6'
+                                     activeHelpKey: createServerFromSettingsFile
+                                     translateLabel: true
+                                     tabable: true
+                                     model: createServerFromFile
+                                     enableChannel: hasWebServerClassesLoadedHolder
+                                     useDefaultExtent: true
+                                   )
+                                  (ActionButtonSpec
+                                     label: 'Remove all Servers'
+                                     name: 'Button5'
+                                     activeHelpKey: removeAllServers
+                                     translateLabel: true
+                                     tabable: true
+                                     model: removeAllServers
+                                     enableChannel: hasCreatedServerChannel
+                                     useDefaultExtent: true
+                                   )
+                                  )
+                                
+                               )
+                             )
+                            )
+                          
+                         )
+                         extent: (Point 539 160)
+                       )
+                      )
+                    
+                   )
+                   extent: (Point 539 620)
+                 )
+                )
+              
+             )
+           )
+          )
+        
        )
      )
 ! !
@@ -6163,7 +6216,7 @@
            )
           (SequenceViewSpec
              name: 'List1'
-             layout: (LayoutFrame 2 0.0 300 0 -2 1.0 -30 1.0)
+             layout: (LayoutFrame 2 0.0 300 0 -2 1.0 -36 1.0)
              model: languageIndexHolder
              hasHorizontalScrollBar: true
              hasVerticalScrollBar: true
@@ -6173,7 +6226,7 @@
            )
           (HorizontalPanelViewSpec
              name: 'HorizontalPanel1'
-             layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
+             layout: (LayoutFrame 0 0 -37 1 0 1 0 1)
              horizontalLayout: center
              verticalLayout: center
              horizontalSpace: 3
@@ -6197,8 +6250,8 @@
              label: 'Use OS Language on Startup'
              name: 'CheckBox1'
              layout: (LayoutFrame 0 0.0 275 0 0 1.0 297 0)
+             activeHelpKey: useSystemLanguage
              model: useSystemLanguageHolder
-             activeHelpKey: useSystemLanguage
              translateLabel: true
            )
           )
@@ -7286,12 +7339,8 @@
 
 basicReadSettings
     self
-	readAspects:
-	    #(
-		newSpaceSize
-		maxOldSpace
-	    )
-	from:ObjectMemory.
+        readAspects:(self aspectsInObjectMemory)
+        from:ObjectMemory.
 
     self igcLimit value:ObjectMemory incrementalGCLimit.
     self igcFreeLimit value:ObjectMemory freeSpaceGCLimit.
@@ -7310,12 +7359,8 @@
 
 basicSaveSettings
     self
-	writeAspects:
-	    #(
-		newSpaceSize
-		maxOldSpace
-	    )
-	to:ObjectMemory.
+        writeAspects:(self aspectsInObjectMemory)
+        to:ObjectMemory.
 
     ObjectMemory freeSpaceGCAmount:self igcFreeAmount value.
     ObjectMemory freeSpaceGCLimit:self igcFreeLimit value.
@@ -7334,6 +7379,13 @@
 
 !AbstractSettingsApplication::MemorySettingsAppl methodsFor:'aspects'!
 
+aspectsInObjectMemory
+    ^ #(
+                newSpaceSize
+                maxOldSpace
+            )
+!
+
 codeLimit
 
     codeLimit isNil ifTrue:[
@@ -7478,12 +7530,8 @@
 
 hasUnsavedChanges
      (self
-	hasChangedAspectIn:
-	    #(
-		newSpaceSize
-		maxOldSpace
-	    )
-	asComparedTo:ObjectMemory) ifTrue:[^ true].
+        hasChangedAspectIn:(self aspectsInObjectMemory)
+        asComparedTo:ObjectMemory) ifTrue:[^ true].
 
     ObjectMemory freeSpaceGCAmount ~= self igcFreeAmount value ifTrue:[^ true].
     ObjectMemory freeSpaceGCLimit ~= self igcFreeLimit value ifTrue:[^ true].
@@ -8028,38 +8076,39 @@
 
 !AbstractSettingsApplication::MiscCommunicationSettingsAppl methodsFor:'actions'!
 
+aspects
+    ^ #(
+                smtpServerName
+                dotNetBridgeRunsInIDE
+                dotNetBridgeVerbose
+            )
+!
+
 basicReadSettings
     |pw auth|
 
-    self
-	readAspects:
-	    #(
-		smtpServerName
-		dotNetBridgeRunsInIDE
-		dotNetBridgeVerbose
-	    )
-	from:currentUserPrefs.
+    super basicReadSettings.
 
     SmallTeam notNil ifTrue:[
-	self smallTeamServerEnabled value:(SmallTeam isLoaded and:[SmallTeam serverRunning]).
-	self listOfSmallTeamHosts contents:(SmallTeam connectedHosts).
+        self smallTeamServerEnabled value:(SmallTeam isLoaded and:[SmallTeam serverRunning]).
+        self listOfSmallTeamHosts contents:(SmallTeam connectedHosts).
     ].
 
     self remoteBrowsingEnabled
-	value:(self hasRemoteBrowsingSupport
-	       and:[SmalltalkShareServer isLoaded and:[SmalltalkShareServer serverRunning]]).
+        value:(self hasRemoteBrowsingSupport
+               and:[SmalltalkShareServer isLoaded and:[SmalltalkShareServer serverRunning]]).
 
     self windowMigrationEnabled
-	value:(self hasWindowMigrationServer
-	       and:[ WindowMigrationServer isLoaded
-	       and:[ WindowMigrationServer serverRunning ]]).
+        value:(self hasWindowMigrationServer
+               and:[ WindowMigrationServer isLoaded
+               and:[ WindowMigrationServer serverRunning ]]).
 
 
     pw := nil.
     auth := false.
     (self hasWindowMigrationServer and:[WindowMigrationServer isLoaded]) ifTrue:[
-	pw := WindowMigrationServer password.
-	auth := self windowMigrationPassword value notNil
+        pw := WindowMigrationServer password.
+        auth := self windowMigrationPassword value notNil
     ].
 
     self windowMigrationPassword value:pw.
@@ -8069,14 +8118,7 @@
 !
 
 basicSaveSettings
-    self
-        writeAspects:
-            #(
-                smtpServerName
-                dotNetBridgeRunsInIDE
-                dotNetBridgeVerbose
-            )
-        to:currentUserPrefs.
+    super basicSaveSettings.
 
     BRIDGE::SmalltalkBridge notNil ifTrue:[
         BRIDGE::SmalltalkBridge verbose:(self smalltalkBridgeVerbose value).
@@ -8366,14 +8408,7 @@
 !
 
 hasUnsavedChanges
-    (self
-        hasChangedAspectIn:
-            #(
-                smtpServerName
-                dotNetBridgeRunsInIDE
-                dotNetBridgeVerbose
-            )
-        asComparedTo:currentUserPrefs) ifTrue:[^ true].
+    (super hasUnsavedChanges) ifTrue:[^ true].
 
     BRIDGE::SmalltalkBridge notNil ifTrue:[
         BRIDGE::SmalltalkBridge verbose ~= (self smalltalkBridgeVerbose value) ifTrue:[^ true].
@@ -8685,39 +8720,28 @@
 
 !AbstractSettingsApplication::MiscDisplay2SettingsAppl methodsFor:'actions'!
 
-aspectsFromUserPreferences
-    ^ #(
-	opaqueVariablePanelResizing
-	opaqueTableColumnResizing
-    )
-
-    "Modified: / 24-08-2010 / 17:26:38 / sr"
-!
-
 basicReadSettings
     |currentScreen|
 
     currentScreen := Screen current.
 
     self
-	readAspects:
-	    #(
-		nativeWidgets
-		nativeDialogs
-		nativeFileDialogs
-	    )
-	from:currentScreen.
-
-    self
-	readAspects:(self aspectsFromUserPreferences)
-	from:currentUserPrefs.
+        readAspects:
+            #(
+                nativeWidgets
+                nativeDialogs
+                nativeFileDialogs
+            )
+        from:currentScreen.
+
+    super basicReadSettings.
 
     self shadows value:PopUpView shadows.
     self cartoonToolTipStyle value: (currentUserPrefs toolTipShapeStyle == #cartoon).
 
     currentScreen isWindowsPlatform ifTrue:[
-	self lowerOnRightClickInTitle value:(currentScreen rightButtonIsLowerWindow:nil).
-	self lowerOnShiftClickInTitle value:(currentScreen shiftedLeftButtonIsLowerWindow:nil).
+        self lowerOnRightClickInTitle value:(currentScreen rightButtonIsLowerWindow:nil).
+        self lowerOnShiftClickInTitle value:(currentScreen shiftedLeftButtonIsLowerWindow:nil).
     ].
 
     "Modified: / 24-08-2010 / 16:43:39 / sr"
@@ -8731,37 +8755,35 @@
     currentScreen := Screen current.
 
     self displaySupportsNativeWidgets ifTrue:[
-	currentScreen nativeWidgets ~= self nativeWidgets value ifTrue:[
-	    mustReopenTools := true.
-	    currentScreen nativeWidgets:self nativeWidgets value.
-	    currentUserPrefs nativeWidgets:self nativeWidgets value.
-	].
+        currentScreen nativeWidgets ~= self nativeWidgets value ifTrue:[
+            mustReopenTools := true.
+            currentScreen nativeWidgets:self nativeWidgets value.
+            currentUserPrefs nativeWidgets:self nativeWidgets value.
+        ].
     ].
     self displaySupportsNativeDialogs ifTrue:[
-	currentScreen nativeDialogs:self nativeDialogs value.
-	currentUserPrefs nativeDialogs:self nativeDialogs value.
+        currentScreen nativeDialogs:self nativeDialogs value.
+        currentUserPrefs nativeDialogs:self nativeDialogs value.
     ].
     self displaySupportsNativeFileDialogs ifTrue:[
-	currentScreen nativeFileDialogs:self nativeFileDialogs value.
-	currentUserPrefs nativeFileDialogs:self nativeFileDialogs value.
+        currentScreen nativeFileDialogs:self nativeFileDialogs value.
+        currentUserPrefs nativeFileDialogs:self nativeFileDialogs value.
     ].
 
     currentUserPrefs toolTipShapeStyle:((self cartoonToolTipStyle value)
-						ifTrue:[ #cartoon ]
-						ifFalse:[ nil ]).
+                                                ifTrue:[ #cartoon ]
+                                                ifFalse:[ nil ]).
     PopUpView shadows:self shadows value.
 
-    self
-	writeAspects:(self aspectsFromUserPreferences)
-	to:currentUserPrefs.
+    super basicSaveSettings.
 
     currentScreen isWindowsPlatform ifTrue:[
-	currentScreen rightButtonIsLowerWindow:(self lowerOnRightClickInTitle value).
-	currentScreen shiftedLeftButtonIsLowerWindow:(self lowerOnShiftClickInTitle value).
+        currentScreen rightButtonIsLowerWindow:(self lowerOnRightClickInTitle value).
+        currentScreen shiftedLeftButtonIsLowerWindow:(self lowerOnShiftClickInTitle value).
     ].
 
     mustReopenTools ifTrue:[
-	self reopenToolsAfterChangedViewStyleSetting.
+        self reopenToolsAfterChangedViewStyleSetting.
     ].
 
     "Modified: / 24-08-2010 / 17:27:25 / sr"
@@ -8769,6 +8791,15 @@
 
 !AbstractSettingsApplication::MiscDisplay2SettingsAppl methodsFor:'aspects'!
 
+aspects
+    ^ #(
+        opaqueVariablePanelResizing
+        opaqueTableColumnResizing
+    )
+
+    "Modified: / 24-08-2010 / 17:26:38 / sr"
+!
+
 cartoonToolTipStyle
     cartoonToolTipStyle isNil ifTrue:[
 	cartoonToolTipStyle := false asValue.
@@ -8875,24 +8906,22 @@
      currentScreen := Screen current.
 
      (self
-	hasChangedAspectIn:
-	    #(
-		nativeWidgets
-		nativeDialogs
-		nativeFileDialogs
-	    )
-	asComparedTo:currentScreen) ifTrue:[^ true].
-
-     (self
-	hasChangedAspectIn:(self aspectsFromUserPreferences)
-	asComparedTo:currentUserPrefs) ifTrue:[^ true].
+        hasChangedAspectIn:
+            #(
+                nativeWidgets
+                nativeDialogs
+                nativeFileDialogs
+            )
+        asComparedTo:currentScreen) ifTrue:[^ true].
+
+     (super hasUnsavedChanges) ifTrue:[^ true].
 
     self shadows value ~= PopUpView shadows ifTrue:[^ true].
     (currentUserPrefs toolTipShapeStyle == #cartoon) ~= cartoonToolTipStyle value ifTrue:[^ true].
 
     currentScreen isWindowsPlatform ifTrue:[
-	(currentScreen rightButtonIsLowerWindow:nil) ~= (self lowerOnRightClickInTitle value) ifTrue:[^ true].
-	(currentScreen shiftedLeftButtonIsLowerWindow:nil) ~= (self lowerOnShiftClickInTitle value) ifTrue:[^ true].
+        (currentScreen rightButtonIsLowerWindow:nil) ~= (self lowerOnRightClickInTitle value) ifTrue:[^ true].
+        (currentScreen shiftedLeftButtonIsLowerWindow:nil) ~= (self lowerOnShiftClickInTitle value) ifTrue:[^ true].
     ].
     ^ false
 
@@ -9285,27 +9314,8 @@
 
 !AbstractSettingsApplication::MiscDisplaySettingsAppl methodsFor:'actions'!
 
-aspectsFromUserPreferences
-    ^ #(
-	beepEnabled
-	focusFollowsMouse
-	mouseWheelFocusFollowsMouse
-	showRightButtonMenuOnRelease
-	selectOnRightClick
-	allowMouseWheelZoom
-	forceWindowsIntoMonitorBounds
-	button2WithAltKey
-	shouldRememberLastExtent
-	menuPanelTakesFocusOnClick
-    )
-
-    "Modified: / 31-07-2013 / 18:14:44 / cg"
-!
-
 basicReadSettings
-    self
-	readAspects:(self aspectsFromUserPreferences)
-	from:currentUserPrefs.
+    super basicReadSettings.
 
     self newWindowLabelFormat value:StandardSystemView windowLabelFormat.
     self hostNameInLabelHolder value:StandardSystemView includeHostNameInLabel.
@@ -9324,28 +9334,26 @@
 
     (self hostNameInLabelHolder value ~= StandardSystemView includeHostNameInLabel
     or:[self newWindowLabelFormat value ~= StandardSystemView windowLabelFormat]) ifTrue:[
-	StandardSystemView includeHostNameInLabel:self hostNameInLabelHolder value.
-	self newWindowLabelFormat value notNil ifTrue:[
-	    StandardSystemView windowLabelFormat:self newWindowLabelFormat value
-	].
-
-	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
-		    ]
-		]
-	    ]
-	]
-    ].
-
-    self
-	writeAspects:(self aspectsFromUserPreferences)
-	to:currentUserPrefs.
+        StandardSystemView includeHostNameInLabel:self hostNameInLabelHolder value.
+        self newWindowLabelFormat value notNil ifTrue:[
+            StandardSystemView windowLabelFormat:self newWindowLabelFormat value
+        ].
+
+        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
+                    ]
+                ]
+            ]
+        ]
+    ].
+
+    super basicSaveSettings.
 
     StandardSystemView returnFocusWhenClosingModalBoxes:self returnFocus value.
     StandardSystemView takeFocusWhenMapped:self takeFocus value.
@@ -9354,8 +9362,8 @@
     MenuView showAcceleratorKeys:self showAccelerators value.
 
     self autoRaiseOnFocusIn value ~= (currentUserPrefs autoRaiseOnFocusInDelay notNil) ifTrue:[
-	currentUserPrefs autoRaiseOnFocusInDelay:(
-	    self autoRaiseOnFocusIn value ifTrue:[ 750 ] ifFalse:[nil]).
+        currentUserPrefs autoRaiseOnFocusInDelay:(
+            self autoRaiseOnFocusIn value ifTrue:[ 750 ] ifFalse:[nil]).
     ].
 
     "Modified: / 16.12.2002 / 18:06:31 / penk"
@@ -9392,6 +9400,23 @@
     ^ allowMouseWheelZoom.
 !
 
+aspects
+    ^ #(
+        beepEnabled
+        focusFollowsMouse
+        mouseWheelFocusFollowsMouse
+        showRightButtonMenuOnRelease
+        selectOnRightClick
+        allowMouseWheelZoom
+        forceWindowsIntoMonitorBounds
+        button2WithAltKey
+        shouldRememberLastExtent
+        menuPanelTakesFocusOnClick
+    )
+
+    "Modified: / 31-07-2013 / 18:14:44 / cg"
+!
+
 autoRaiseOnFocusIn
     autoRaiseOnFocusIn isNil ifTrue:[
 	autoRaiseOnFocusIn := true asValue.
@@ -9573,9 +9598,7 @@
 !AbstractSettingsApplication::MiscDisplaySettingsAppl methodsFor:'queries'!
 
 hasUnsavedChanges
-     (self
-	hasChangedAspectIn:(self aspectsFromUserPreferences)
-	asComparedTo:currentUserPrefs) ifTrue:[^ true].
+     (super hasUnsavedChanges) ifTrue:[^ true].
 
     self newWindowLabelFormat value ~= StandardSystemView windowLabelFormat ifTrue:[^ true].
     self hostNameInLabelHolder value ~= StandardSystemView includeHostNameInLabel ifTrue:[^ true].
@@ -16311,25 +16334,26 @@
 
 !AbstractSettingsApplication::SyntaxColorSettingsAppl methodsFor:'actions'!
 
+aspects
+    ^ #(
+        syntaxColoring
+        fullSelectorCheck
+    )
+!
+
 basicReadSettings
     |colorList resetListLoc|
 
     oldUserPreferences notNil ifTrue:[
-	(UserPreferences reset; current) addAll:oldUserPreferences
-    ].
-
-    self
-	readAspects:
-	    #(
-		syntaxColoring
-		fullSelectorCheck
-	    )
-	from:currentUserPrefs.
+        (UserPreferences reset; current) addAll:oldUserPreferences
+    ].
+
+    super basicReadSettings.
 
     oldUserPreferences := currentUserPrefs copy.
     colorList := UserPreferences syntaxColorNames.
     resetListLoc := currentUserPrefs listOfPredefinedSyntaxColoringSchemes
-		collect:[:entry | entry second].
+                collect:[:entry | entry second].
     self resetList value:resetListLoc.
     self resetListSelection value:resetListLoc first.
     self syntaxEmphasisList value:self class emphasisList.
@@ -16340,10 +16364,7 @@
 basicSaveSettings
 
     oldUserPreferences := currentUserPrefs copy.
-    currentUserPrefs syntaxColoring:(self syntaxColoring value).
-    currentUserPrefs at:#fullSelectorCheck put:(self fullSelectorCheck value).
-
-    "Modified (format): / 14-02-2012 / 11:19:11 / cg"
+    super basicSaveSettings.
 !
 
 recolor
@@ -16605,24 +16626,18 @@
 
     colorList := UserPreferences syntaxColorNames.
     colorList do:[:syntaxElement |
-	colorPerformer := (self syntaxColorSelectorForElement:syntaxElement).
-	emphasisPerformer := (self syntaxEmphasisSelectorForElement:syntaxElement).
-	((oldUserPreferences perform:colorPerformer) ~= (currentUserPrefs perform:colorPerformer)) ifTrue:[
-	    ^ true
-	].
-	((oldUserPreferences perform:emphasisPerformer) ~= (currentUserPrefs perform:emphasisPerformer)) ifTrue:[
-	    ^ true
-	].
-	syntaxElement
-    ].
-
-    (self
-	hasChangedAspectIn:
-	    #(
-		syntaxColoring
-		fullSelectorCheck
-	    )
-	asComparedTo:currentUserPrefs) ifTrue:[^ true].
+        colorPerformer := (self syntaxColorSelectorForElement:syntaxElement).
+        emphasisPerformer := (self syntaxEmphasisSelectorForElement:syntaxElement).
+        ((oldUserPreferences perform:colorPerformer) ~= (currentUserPrefs perform:colorPerformer)) ifTrue:[
+            ^ true
+        ].
+        ((oldUserPreferences perform:emphasisPerformer) ~= (currentUserPrefs perform:emphasisPerformer)) ifTrue:[
+            ^ true
+        ].
+        syntaxElement
+    ].
+
+    (super hasUnsavedChanges) ifTrue:[^ true].
 
     ^ false
 !
@@ -17020,46 +17035,6 @@
     "Created: / 14-10-2014 / 09:18:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-aspects
-    ^ #(
-	"/ showAcceptCancelBarInBrowser
-	useSearchBarInBrowser
-	showMethodTemplate
-	"/ useCodeView2InTools
-	showEmbeddedTestRunnerInBrowser
-	showBookmarkBar
-	webBrowserLikeLayout
-	sortAndIndentClassesByInheritance
-	showGlobalHistory
-	showLocalHistory
-	useInPlaceSearchInBrowserLists
-	sourceCodeManagementMenuLayout
-	confirmRefactorings
-	smallLintRulesetDefault
-    )
-
-    "Created: / 25-11-2011 / 15:09:28 / cg"
-    "Modified: / 14-10-2014 / 08:19:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-basicReadSettings
-    self
-	readAspects:(self aspects)
-	from:currentUserPrefs.
-
-    "Modified: / 06-10-2011 / 18:57:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 25-11-2011 / 15:09:39 / cg"
-!
-
-basicSaveSettings
-    self
-	writeAspects:(self aspects)
-	to:currentUserPrefs.
-
-    "Modified: / 06-10-2011 / 18:57:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 25-11-2011 / 15:09:49 / cg"
-!
-
 doConfigureRulesets
     Tools::LintRuleSettingsApplication open
 
@@ -17082,6 +17057,28 @@
 
 !AbstractSettingsApplication::SystemBrowserSettingsAppl methodsFor:'aspects'!
 
+aspects
+    ^ #(
+	"/ showAcceptCancelBarInBrowser
+	useSearchBarInBrowser
+	showMethodTemplate
+	"/ useCodeView2InTools
+	showEmbeddedTestRunnerInBrowser
+	showBookmarkBar
+	webBrowserLikeLayout
+	sortAndIndentClassesByInheritance
+	showGlobalHistory
+	showLocalHistory
+	useInPlaceSearchInBrowserLists
+	sourceCodeManagementMenuLayout
+	confirmRefactorings
+	smallLintRulesetDefault
+    )
+
+    "Created: / 25-11-2011 / 15:09:28 / cg"
+    "Modified: / 14-10-2014 / 08:19:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 confirmRefactorings
 
     confirmRefactorings isNil ifTrue:[
@@ -17265,17 +17262,6 @@
     ^ 'Launcher/browserSettings.html'
 ! !
 
-!AbstractSettingsApplication::SystemBrowserSettingsAppl methodsFor:'queries'!
-
-hasUnsavedChanges
-    ^ self
-	hasChangedAspectIn:(self aspects)
-	asComparedTo:currentUserPrefs
-
-    "Modified: / 06-10-2011 / 18:58:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 25-11-2011 / 15:23:47 / cg"
-! !
-
 !AbstractSettingsApplication::SystemMessageSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
@@ -17585,24 +17571,8 @@
 
 !AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'actions'!
 
-aspects
-    ^ #(
-		beepEnabled
-		beepInEditor
-		beepForInfoDialog
-		beepForWarningDialog
-		beepForErrorDialog
-		flyByHelpActive
-		toolTipAutoHideDelay
-		sendMessagesAlsoToTranscript
-		onlyShowTooltipsForActiveWindow
-	    )
-
-    "Created: / 10-11-2010 / 12:07:42 / cg"
-!
-
 basicReadSettings
-    self readAspects:(self aspects) from:currentUserPrefs.
+    super basicReadSettings.
 
     self vmInfo value:ObjectMemory infoPrinting.
     self vmErrors value:ObjectMemory debugPrinting.
@@ -17619,13 +17589,29 @@
     Object infoPrinting:self classInfos value.
     DeviceWorkstation errorPrinting:self displayErrors value.
 
-    self writeAspects:(self aspects) to:currentUserPrefs.
+    super basicSaveSettings.
 
     "Modified: / 10-11-2010 / 12:08:14 / cg"
 ! !
 
 !AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'aspects'!
 
+aspects
+    ^ #(
+		beepEnabled
+		beepInEditor
+		beepForInfoDialog
+		beepForWarningDialog
+		beepForErrorDialog
+		flyByHelpActive
+		toolTipAutoHideDelay
+		sendMessagesAlsoToTranscript
+		onlyShowTooltipsForActiveWindow
+	    )
+
+    "Created: / 10-11-2010 / 12:07:42 / cg"
+!
+
 beepEnabled
     beepEnabled isNil ifTrue:[
 	beepEnabled := true asValue.
@@ -17772,7 +17758,7 @@
 !AbstractSettingsApplication::SystemMessageSettingsAppl methodsFor:'queries'!
 
 hasUnsavedChanges
-    (self hasChangedAspectIn:(self aspects) asComparedTo:currentUserPrefs) ifTrue:[^ true].
+    (super hasUnsavedChanges) ifTrue:[^ true].
 
     self vmInfo value ~= ObjectMemory infoPrinting ifTrue:[^ true].
     self vmErrors value ~= ObjectMemory debugPrinting ifTrue:[^ true].
@@ -17884,28 +17870,14 @@
      )
 ! !
 
-!AbstractSettingsApplication::TerminalViewSettingsAppl methodsFor:'actions'!
-
-basicReadSettings
-    self
-	readAspects:self commonAspects
-	from:currentUserPrefs.
-!
-
-basicSaveSettings
-    self
-	writeAspects:self commonAspects
-	to:currentUserPrefs.
-!
-
-commonAspects
+!AbstractSettingsApplication::TerminalViewSettingsAppl methodsFor:'aspects'!
+
+aspects
     ^ #(
         #terminalOutputIsUTF8
         #terminalInputIsUTF8
     )
-! !
-
-!AbstractSettingsApplication::TerminalViewSettingsAppl methodsFor:'aspects'!
+!
 
 terminalInputIsUTF8
     terminalInputIsUTF8 isNil ifTrue:[
@@ -17929,14 +17901,6 @@
     ^ 'Launcher/terminalSettings.html'
 ! !
 
-!AbstractSettingsApplication::TerminalViewSettingsAppl methodsFor:'queries'!
-
-hasUnsavedChanges
-    ^ self
-	hasChangedAspectIn:self commonAspects
-	asComparedTo:currentUserPrefs
-! !
-
 !AbstractSettingsApplication::ToolboxSettingsAppl class methodsFor:'image specs'!
 
 defaultIcon
@@ -18235,22 +18199,6 @@
 
 !AbstractSettingsApplication::ToolboxSettingsAppl methodsFor:'protocol'!
 
-basicReadSettings
-    "superclass AbstractSettingsApplication says that I am responsible to implement this method"
-
-    self readAspects: self aspects from: currentUserPrefs.
-
-    "Modified: / 14-02-2012 / 18:37:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-basicSaveSettings
-    "superclass AbstractSettingsApplication says that I am responsible to implement this method"
-
-    self writeAspects: self aspects to: currentUserPrefs
-
-    "Modified: / 14-02-2012 / 18:38:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 helpFilename
     "subclasses must return the relative name of a helpFile
      in the doc/online/<language>/help directory.
@@ -18259,16 +18207,6 @@
     ^ self shouldImplement
 ! !
 
-!AbstractSettingsApplication::ToolboxSettingsAppl methodsFor:'queries'!
-
-hasUnsavedChanges
-    "superclass AbstractSettingsApplication says that I am responsible to implement this method"
-
-    ^self hasChangedAspectIn: self aspects asComparedTo:currentUserPrefs
-
-    "Modified: / 14-02-2012 / 18:38:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !AbstractSettingsApplication::ToolboxSettingsAppl::ClassToolSetting class methodsFor:'interface specs'!
 
 windowSpec
@@ -18940,6 +18878,88 @@
 
 !AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'actions'!
 
+basicReadSettings
+    |transcript|
+
+    super basicReadSettings.
+
+    transcript := Transcript current.
+    transcript isTextCollector ifTrue:[
+        self transcriptBufferSize value:transcript lineLimit.
+        "/ now already in userprefs
+        "/ self autoRaiseTranscript value:transcript autoRaise.
+    ].
+
+    "Modified: / 29-08-2013 / 11:40:23 / cg"
+!
+
+basicSaveSettings
+    |showClock launcher reopenLauncher newSystemBrowserClass transcript|
+
+    reopenLauncher := false.
+
+    newSystemBrowserClass := Tools::NewSystemBrowser ? NewSystemBrowser.
+
+    super basicSaveSettings.
+
+    currentUserPrefs useNewSettingsApplication ~= self useNewSettingsApplication value ifTrue:[
+        currentUserPrefs useNewSettingsApplication:self useNewSettingsApplication value.
+    ].
+
+    currentUserPrefs useNewSystemBrowser ~= self useNewSystemBrowser value ifTrue:[
+        currentUserPrefs useNewSystemBrowser:self useNewSystemBrowser value.
+            (self useNewSystemBrowser value and:[newSystemBrowserClass isLoaded]) ifTrue:[
+                newSystemBrowserClass installInLauncher.
+            ] ifFalse:[
+                newSystemBrowserClass removeFromLauncher.
+            ].
+            reopenLauncher := true.
+    ].
+
+    (Smalltalk at:#FileBrowserV2) isBehavior ifTrue:[
+        currentUserPrefs useNewFileBrowser ~= self useNewFileBrowser value ifTrue:[
+            currentUserPrefs useNewFileBrowser:self useNewFileBrowser value.
+            (self useNewFileBrowser value and:[FileBrowserV2 isLoaded]) ifTrue:[
+                FileBrowserV2 installInLauncher.
+            ] ifFalse:[
+                FileBrowserV2 removeFromLauncher.
+            ].
+            reopenLauncher := true.
+        ]
+    ].
+
+    transcript := Transcript current.
+    (transcript notNil and:[transcript isExternalStream not]) ifTrue:[
+        transcript lineLimit:self transcriptBufferSize value.
+        "/ now already done by UserPreferences
+        "/ transcript autoRaise:self autoRaiseTranscript value.
+        launcher := transcript application.
+    ].
+
+    showClock := self showClockInLauncher value.
+    currentUserPrefs showClockInLauncher ~= showClock ifTrue:[
+        currentUserPrefs showClockInLauncher:showClock.
+        launcher notNil ifTrue:[
+            showClock ifTrue:[
+                launcher startClock
+            ] ifFalse:[
+                launcher stopClock
+            ]
+        ]
+    ].
+    Inspector := currentUserPrefs inspectorClassSetting.
+
+    reopenLauncher ifTrue:[
+        launcher notNil ifTrue:[
+            launcher reopenLauncher.
+        ]
+    ].
+
+    "Modified: / 27-07-2012 / 20:51:46 / cg"
+! !
+
+!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'aspects'!
+
 aspects
     ^ #(
 	#eclipseStyleMenus
@@ -18964,92 +18984,6 @@
     "Created: / 27-07-2012 / 20:48:18 / cg"
 !
 
-basicReadSettings
-    |transcript|
-
-    self
-        readAspects: (self aspects)
-        from:currentUserPrefs.
-
-    transcript := Transcript current.
-    transcript isTextCollector ifTrue:[
-        self transcriptBufferSize value:transcript lineLimit.
-        "/ now already in userprefs
-        "/ self autoRaiseTranscript value:transcript autoRaise.
-    ].
-
-    "Modified: / 29-08-2013 / 11:40:23 / cg"
-!
-
-basicSaveSettings
-    |showClock launcher reopenLauncher newSystemBrowserClass transcript|
-
-    reopenLauncher := false.
-
-    newSystemBrowserClass := Tools::NewSystemBrowser ? NewSystemBrowser.
-
-    self
-	writeAspects:(self aspects)
-	to:currentUserPrefs.
-
-    currentUserPrefs useNewSettingsApplication ~= self useNewSettingsApplication value ifTrue:[
-	currentUserPrefs useNewSettingsApplication:self useNewSettingsApplication value.
-    ].
-
-    currentUserPrefs useNewSystemBrowser ~= self useNewSystemBrowser value ifTrue:[
-	currentUserPrefs useNewSystemBrowser:self useNewSystemBrowser value.
-	    (self useNewSystemBrowser value and:[newSystemBrowserClass isLoaded]) ifTrue:[
-		newSystemBrowserClass installInLauncher.
-	    ] ifFalse:[
-		newSystemBrowserClass removeFromLauncher.
-	    ].
-	    reopenLauncher := true.
-    ].
-
-    (Smalltalk at:#FileBrowserV2) isBehavior ifTrue:[
-	currentUserPrefs useNewFileBrowser ~= self useNewFileBrowser value ifTrue:[
-	    currentUserPrefs useNewFileBrowser:self useNewFileBrowser value.
-	    (self useNewFileBrowser value and:[FileBrowserV2 isLoaded]) ifTrue:[
-		FileBrowserV2 installInLauncher.
-	    ] ifFalse:[
-		FileBrowserV2 removeFromLauncher.
-	    ].
-	    reopenLauncher := true.
-	]
-    ].
-
-    transcript := Transcript current.
-    (transcript notNil and:[transcript isExternalStream not]) ifTrue:[
-	transcript lineLimit:self transcriptBufferSize value.
-	"/ now already done by UserPreferences
-	"/ transcript autoRaise:self autoRaiseTranscript value.
-	launcher := transcript application.
-    ].
-
-    showClock := self showClockInLauncher value.
-    currentUserPrefs showClockInLauncher ~= showClock ifTrue:[
-	currentUserPrefs showClockInLauncher:showClock.
-	launcher notNil ifTrue:[
-	    showClock ifTrue:[
-		launcher startClock
-	    ] ifFalse:[
-		launcher stopClock
-	    ]
-	]
-    ].
-    Inspector := currentUserPrefs inspectorClassSetting.
-
-    reopenLauncher ifTrue:[
-	launcher notNil ifTrue:[
-	    launcher reopenLauncher.
-	]
-    ].
-
-    "Modified: / 27-07-2012 / 20:51:46 / cg"
-! !
-
-!AbstractSettingsApplication::ToolsSettingsAppl methodsFor:'aspects'!
-
 autoRaiseTranscript
     autoRaiseTranscript isNil ifTrue:[
 	autoRaiseTranscript := false asValue.
@@ -19237,9 +19171,7 @@
 hasUnsavedChanges
     |transcript|
 
-    (self
-        hasChangedAspectIn:(self aspects)
-        asComparedTo:currentUserPrefs) ifTrue:[^ true].
+    super hasUnsavedChanges ifTrue:[^ true].
 
     transcript := Transcript current.
     transcript isTextCollector ifTrue:[
@@ -19252,6 +19184,283 @@
     "Modified: / 29-08-2013 / 11:40:55 / cg"
 ! !
 
+!AbstractSettingsApplication::WorkspaceSettingsAppl class methodsFor:'help specs'!
+
+flyByHelpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:AbstractSettingsApplication::ProcessorSchedulerSettingsAppl
+    "
+
+    <resource: #help>
+
+    ^ super flyByHelpSpec addPairsFrom:#(
+
+#usersModuleName 
+'The name used as top-level module name (i.e. in the package-identifier of you classes and methods).\Will also be the top-level directory name inside the source repository and\inside your workspace.'
+
+#workspaceDirectory
+'The workspace directory where files are created for building and deployment'
+
+)
+! !
+
+!AbstractSettingsApplication::WorkspaceSettingsAppl class methodsFor:'image specs'!
+
+defaultIcon
+    ^ self defaultIcon2
+!
+
+defaultIcon1
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self defaultIcon1 inspect
+     ImageEditor openOnClass:self andSelector:#defaultIcon1
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'AbstractSettingsApplication::WorkspaceSettingsAppl defaultIcon1'
+        ifAbsentPut:[(Depth4Image width:24 height:24) bits:(ByteArray fromPackedString:'
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@HP@UTP@R@@@@@@@@MQEU
+UQES@@@@@@@@@%UUUUT @@@@@@@@@UT#H%TP@@@@@@@@EUH0@2UQ@@@@@@@QUULDPCUUDP@@@@@3UUHDPBUUL0@@@@@@H%TP@UT"@@@@@@@@@%UQEUT @@@@
+@@@@@UUUUUTP@@@@@@@@ESIUURMQ@@@@@@@@H0@UTP@2@@@@@@@@@@@AL@@@@@@@@@@@@@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@') colorMapFromArray:#[0 0 0 255 255 255 161 161 165 127 127 127 236 233 216 194 194 194] mask:((ImageMask width:24 height:24) bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@A @@C0@@33@A?? A?? @??@@??@C??0G??8G??8C??0@??@@??@A?? A?? @33@@C0@@A @@@@@@@@@@@@@'); yourself); yourself]
+!
+
+defaultIcon2
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self defaultIcon2 inspect
+     ImageEditor openOnClass:self andSelector:#defaultIcon2
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'AbstractSettingsApplication::WorkspaceSettingsAppl defaultIcon2'
+        ifAbsentPut:[(Depth8Image width:24 height:24) bits:(ByteArray fromPackedString:'
+@@]YVU%YA0@@@@@@@@@@@@@@@@@@@@@@@E%]WV!!]VP@@@@@@@@@@@@@@@@@@@@@@Q8X,BP$IU5]MSUUU[6=MH0@@@@@@@@@@\TZ (CT"%2^$!!C\]^JT6X @@
+@@@@@@@@\U(TEB TUJEP&DM''S5!!\#0@@@@@@@@@@JWR@RR<LP1=E$GVYD @@^0@@@@@@@@@@%Q\;I!!=_\1%)F0-?@@DB@@@@@@@@@@@@BH,?X6L[B4,@@C1 
+@@DB@@@@@@@@@@@@IH0UX@9 L0@B@P@@@PTE@P@@@PH@@@@@RG80LE9^  @CAPDAAPTEAPDAAPL@@@@@^*M&&))=GA0@@ TEAPTEAPTE@ @@@@@@''%L-TVU,
+DRD@@PTE@ LB@ TE@P@@@@@@HEHVQA!!D@@@AAPTB@0@@@0HEAPD@@@@@LSH=OS4@@PDEAPTC@C4=@@LEAPTA@P@@\IQNPG\@@0LEAPTB@G]7@@HEAPTC@0@@
+@@@@@@@@@@@B@ TE@P@@@PTE@ H@@@@@@@@@@@@@@@@@@ TEAPDAAPTE@ @@@@@@@@@@@@@@@@@@@PTEAPTEAPTE@P@@@@@@@@@@@@@@@@@AAPHBAPTEAPHC
+APD@@@@@@@@@@@@@@@@B@ @@@PTE@P@@@0H@@@@@@@@@@@@@@@@@@@@@@@TB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DB@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') colorMapFromArray:#[0 0 0 255 255 255 161 161 165 127 127 127 236 233 216 194 194 194 162 194 216 161 179 191 110 142 163 154 183 200 109 140 160 170 200 219 182 208 224 191 196 201 163 195 217 136 178 205 197 202 208 132 176 205 171 200 219 157 192 214 193 214 229 164 195 217 131 171 195 176 208 227 128 171 196 174 203 222 196 203 209 171 200 220 143 183 209 194 219 234 131 171 196 178 205 223 102 137 158 134 176 205 210 229 242 132 159 177 108 141 161 142 182 208 179 205 223 204 225 238 193 214 227 114 144 163 150 188 211 135 179 206 153 182 200 134 178 204 165 200 224 183 209 224 154 190 212 102 135 156 87 124 149 162 195 216 134 179 206 209 228 240 190 216 236 194 221 235 142 182 206 128 169 196 190 195 200 178 205 222 164 197 217 87 125 149 160 194 216 172 200 219 195 201 206 106 140 161 167 198 218 180 207 223 129 171 196 176 205 223 209 229 243 133 160 177 107 140 161 183 208 224 130 171 196 168 200 218 148 189 216 111 144 166 198 203 209 176 204 221 188 210 224 133 178 205 126 173 205 132 179 214 191 212 228 112 144 166 150 188 212 111 144 165 174 201 219 119 151 171 194 216 232 170 200 218 175 203 225 165 197 218 153 190 212 177 205 223 163 195 216 188 193 198 112 144 163 172 201 220 195 200 205 131 178 205 143 184 208 179 205 222 164 197 218 175 202 221 187 192 197 159 193 215 133 179 205 140 185 213 192 197 202 113 144 166 199 207 214 114 146 165 100 137 159 176 205 222 181 207 228 173 203 221 128 175 205 193 198 203 191 217 233 139 182 208 102 138 159 112 143 163 168 200 224 144 183 209 153 191 217 169 200 219 181 208 224 166 198 218 152 189 212 189 194 200 200 222 237 188 194 199 109 143 165 186 191 196 153 194 221 132 179 205 142 183 208 173 204 227 158 197 224 136 179 206 149 188 211 111 144 163 174 204 220 158 193 214 156 192 213 162 197 221 201 206 211 112 143 164 101 137 158 208 226 242 185 208 225 173 202 220 144 184 209 156 192 214 129 169 196 133 182 214 101 137 159 111 142 163 209 228 242 187 210 224 108 142 162 140 186 214 204 224 237 189 215 232] mask:((ImageMask width:24 height:24) bits:(ByteArray fromPackedString:'_ @@_ @@??<@??<@??<@??<@??<@??<0???8???8???0???0???<???>???>@??<@O?0@O?0@_?8@_?8@L<0@@<@@@X@@@@@'); yourself); yourself]
+! !
+
+!AbstractSettingsApplication::WorkspaceSettingsAppl 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:AbstractSettingsApplication::WorkspaceSettingsAppl andSelector:#windowSpec
+     AbstractSettingsApplication::WorkspaceSettingsAppl new openInterface:#windowSpec
+     AbstractSettingsApplication::WorkspaceSettingsAppl open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+    #(FullSpec
+       name: windowSpec
+       window: 
+      (WindowSpec
+         label: 'Workspace Settings'
+         name: 'Workspace Settings'
+         min: (Point 10 10)
+         bounds: (Rectangle 0 0 600 320)
+       )
+       component: 
+      (SpecCollection
+         collection: (
+          (VerticalPanelViewSpec
+             name: 'VerticalPanel2'
+             layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+             horizontalLayout: fit
+             verticalLayout: topSpace
+             horizontalSpace: 3
+             verticalSpace: 5
+             component: 
+            (SpecCollection
+               collection: (
+                (HorizontalPanelViewSpec
+                   name: 'HorizontalPanel1'
+                   activeHelpKey: usersModuleName
+                   horizontalLayout: leftSpaceFit
+                   verticalLayout: center
+                   horizontalSpace: 3
+                   verticalSpace: 3
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (LabelSpec
+                         label: 'Top Level Module ID:'
+                         name: 'Label1'
+                         translateLabel: true
+                         adjust: left
+                         extent: (Point 200 22)
+                       )
+                      (InputFieldSpec
+                         name: 'EntryField1'
+                         model: usersModuleName
+                         acceptOnReturn: true
+                         acceptOnTab: true
+                         acceptOnPointerLeave: true
+                         useDefaultExtent: true
+                       )
+                      )
+                    
+                   )
+                   extent: (Point 600 35)
+                 )
+                (HorizontalPanelViewSpec
+                   name: 'HorizontalPanel2'
+                   activeHelpKey: workspaceDirectory
+                   horizontalLayout: leftSpaceFit
+                   verticalLayout: center
+                   horizontalSpace: 3
+                   verticalSpace: 3
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (LabelSpec
+                         label: 'Workspace Directory:'
+                         name: 'Label2'
+                         translateLabel: true
+                         adjust: left
+                         extent: (Point 200 22)
+                       )
+                      (InputFieldSpec
+                         name: 'EntryField2'
+                         model: workspaceDirectory
+                         acceptOnReturn: true
+                         acceptOnTab: true
+                         acceptOnPointerLeave: true
+                         useDefaultExtent: true
+                       )
+                      )
+                    
+                   )
+                   extent: (Point 600 35)
+                 )
+                (HorizontalPanelViewSpec
+                   name: 'HorizontalPanel3'
+                   activeHelpKey: workspaceDirectory
+                   horizontalLayout: rightSpace
+                   verticalLayout: center
+                   horizontalSpace: 3
+                   verticalSpace: 3
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (ActionButtonSpec
+                         label: 'Create Workspace Directory'
+                         name: 'Button1'
+                         translateLabel: true
+                         model: createWorkspaceDirectory
+                         useDefaultExtent: true
+                       )
+                      (ActionButtonSpec
+                         label: 'Browse'
+                         name: 'Button2'
+                         translateLabel: true
+                         model: browseWorkspaceDirectory
+                         useDefaultExtent: true
+                       )
+                      )
+                    
+                   )
+                   extent: (Point 600 35)
+                 )
+                )
+              
+             )
+           )
+          )
+        
+       )
+     )
+! !
+
+!AbstractSettingsApplication::WorkspaceSettingsAppl methodsFor:'actions'!
+
+browseWorkspaceDirectory
+    |fn|
+
+    (fn := workspaceDirectory value) notEmptyOrNil ifTrue:[
+        (fn := fn asFilename) exists ifFalse:[
+            Dialog warn:'Directory does not exist'.
+        ] ifTrue:[    
+            UserPreferences current fileBrowserClass openOn:fn
+        ]
+    ]
+!
+
+createWorkspaceDirectory
+    |fn|
+
+    (fn := workspaceDirectory value) notEmptyOrNil ifTrue:[
+        (fn := fn asFilename) exists ifFalse:[
+            fn recursiveMakeDirectory
+        ]
+    ]
+! !
+
+!AbstractSettingsApplication::WorkspaceSettingsAppl methodsFor:'aspects'!
+
+aspects
+    ^ #(
+        #usersModuleName
+        #workspaceDirectory
+    )
+!
+
+usersModuleName
+    usersModuleName isNil ifTrue:[
+        usersModuleName := '' asValue.
+        usersModuleName onChangeSend:#updateModifiedChannel to:self.
+    ].
+    ^ usersModuleName.
+!
+
+workspaceDirectory
+    workspaceDirectory isNil ifTrue:[
+        workspaceDirectory := '~/.smalltalk/workspace' asValue.
+        workspaceDirectory onChangeSend:#updateModifiedChannel to:self.
+    ].
+    ^ workspaceDirectory.
+! !
+
+!AbstractSettingsApplication::WorkspaceSettingsAppl methodsFor:'help'!
+
+helpFilename
+    ^ 'Launcher/workspaceSettings.html'
+! !
+
 !AbstractSettingsApplication class methodsFor:'documentation'!
 
 version