support multiple managers (per module)
authorClaus Gittinger <cg@exept.de>
Fri, 25 Aug 2006 18:01:38 +0200
changeset 6994 8e86dc209edd
parent 6993 22233dd2489d
child 6995 91df148858bb
support multiple managers (per module)
AbstractSettingsApplication.st
--- a/AbstractSettingsApplication.st	Fri Aug 25 15:41:38 2006 +0200
+++ b/AbstractSettingsApplication.st	Fri Aug 25 18:01:38 2006 +0200
@@ -215,8 +215,15 @@
 		cvsBinDirectoryHolder rootsPerModule cvsLoginInModuleEnabled
 		cvsLoginEnabled selectedManagerTypeIndexHolder
 		managerIsCVSSourceCodeManager managerIsStoreSourceCodeManager
-		storeLoginEnabled'
-	classVariableNames:''
+		storeLoginEnabled storeHostPrototypeList storeHostnameHolder
+		storeUsernameHolder storePasswordHolder
+		perStoreModuleHostnameHolder perStoreModuleUsernameHolder
+		perStoreModulePasswordHolder perStoreModuleRoot
+		perStoreModuleRootModule selectedPerStoreModuleRoot
+		storeConnectEnabled storeConnectInModuleEnabled
+		perModuleFieldsEnableHolder perStoreModuleFieldsEnableHolder'
+	classVariableNames:'RecentlyUsedCVSRoots RecentlyUsedStoreHosts LastStoreHost
+		LastStoreUser LastStorePassword'
 	poolDictionaries:''
 	privateIn:AbstractSettingsApplication
 !
@@ -364,7 +371,7 @@
         result ifTrue:[
             self saveSettings
         ] ifFalse:[
-            self readSettings
+"/            self readSettings
         ]
     ].
     ^ true
@@ -9666,7 +9673,7 @@
                     horizontalLayout: fit
                     verticalLayout: top
                     horizontalSpace: 3
-                    verticalSpace: 10
+                    verticalSpace: 4
                     component: 
                    (SpecCollection
                       collection: (
@@ -9702,9 +9709,262 @@
                          (SpecCollection
                             collection: (
                              (FramedBoxSpec
+                                label: 'Store-DB Repository Setup'
+                                name: 'StoreSetupBox'
+                                layout: (LayoutFrame 0 0 0 0 0 1 -12 1)
+                                visibilityChannel: managerIsStoreSourceCodeManager
+                                labelPosition: topLeft
+                                translateLabel: true
+                                component: 
+                               (SpecCollection
+                                  collection: (
+                                   (ViewSpec
+                                      name: 'HostBox'
+                                      layout: (LayoutFrame 0 0 0 0 0 1 25 0)
+                                      component: 
+                                     (SpecCollection
+                                        collection: (
+                                         (LabelSpec
+                                            label: 'DB or DB@Host:'
+                                            name: 'StoreHostLabel'
+                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
+                                            level: 0
+                                            translateLabel: true
+                                            adjust: right
+                                          )
+                                         (ComboBoxSpec
+                                            name: 'StoreHostComboBox'
+                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
+                                            enableChannel: useManager
+                                            tabable: true
+                                            model: storeHostnameHolder
+                                            immediateAccept: true
+                                            acceptOnLeave: true
+                                            acceptOnReturn: true
+                                            acceptOnTab: true
+                                            acceptOnLostFocus: true
+                                            acceptChannel: acceptChannel
+                                            acceptOnPointerLeave: true
+                                            comboList: storeHostPrototypeList
+                                          )
+                                         )
+                                       
+                                      )
+                                    )
+                                   (ViewSpec
+                                      name: 'UserBox'
+                                      layout: (LayoutFrame 0 0.0 27 0 0 1 52 0)
+                                      component: 
+                                     (SpecCollection
+                                        collection: (
+                                         (LabelSpec
+                                            label: 'Username:'
+                                            name: 'StoreUserLabel'
+                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
+                                            level: 0
+                                            translateLabel: true
+                                            adjust: right
+                                          )
+                                         (InputFieldSpec
+                                            name: 'StoreUserEntryField'
+                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
+                                            enableChannel: useManager
+                                            tabable: true
+                                            model: storeUsernameHolder
+                                            acceptChannel: acceptChannel
+                                            acceptOnPointerLeave: true
+                                          )
+                                         )
+                                       
+                                      )
+                                    )
+                                   (ViewSpec
+                                      name: 'PasswordBox'
+                                      layout: (LayoutFrame 0 0.0 54 0 0 1 79 0)
+                                      component: 
+                                     (SpecCollection
+                                        collection: (
+                                         (LabelSpec
+                                            label: 'Password:'
+                                            name: 'Label7'
+                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
+                                            level: 0
+                                            translateLabel: true
+                                            adjust: right
+                                          )
+                                         (InputFieldSpec
+                                            name: 'PasswordEntryField'
+                                            layout: (LayoutFrame 44 0.25 0 0 -130 1 22 0)
+                                            enableChannel: useManager
+                                            tabable: true
+                                            model: storePasswordHolder
+                                            type: password
+                                            acceptChannel: acceptChannel
+                                            acceptOnPointerLeave: true
+                                          )
+                                         )
+                                       
+                                      )
+                                    )
+                                   (HorizontalPanelViewSpec
+                                      name: 'HorizontalPanel4'
+                                      layout: (LayoutFrame -130 1 51 0 -1 1 82 0)
+                                      horizontalLayout: fitSpace
+                                      verticalLayout: center
+                                      horizontalSpace: 3
+                                      verticalSpace: 3
+                                      component: 
+                                     (SpecCollection
+                                        collection: (
+                                         (ActionButtonSpec
+                                            label: 'Try to Connect'
+                                            name: 'Button1'
+                                            translateLabel: true
+                                            tabable: true
+                                            model: storeConnect
+                                            enableChannel: storeConnectEnabled
+                                            extent: (Point 123 22)
+                                          )
+                                         )
+                                       
+                                      )
+                                    )
+                                   (LabelSpec
+                                      label: 'DB per Module:'
+                                      name: 'Label4'
+                                      layout: (LayoutFrame 0 0.0 82 0 40 0.25 104 0)
+                                      translateLabel: true
+                                      adjust: right
+                                    )
+                                   (SequenceViewSpec
+                                      name: 'List2'
+                                      layout: (LayoutFrame 44 0.25 82 0 -5 1 180 0)
+                                      enableChannel: useManager
+                                      tabable: true
+                                      model: selectedPerStoreModuleRoot
+                                      hasHorizontalScrollBar: true
+                                      hasVerticalScrollBar: true
+                                      miniScrollerHorizontal: true
+                                      useIndex: false
+                                      sequenceList: listOfModules
+                                    )
+                                   (LabelSpec
+                                      label: 'Module:'
+                                      name: 'perModuleModuleLabel'
+                                      layout: (LayoutFrame 0 0.0 186 0 40 0.25 203 0)
+                                      translateLabel: true
+                                      adjust: right
+                                    )
+                                   (InputFieldSpec
+                                      name: 'perModuleModuleEntryField'
+                                      layout: (LayoutFrame 44 0.25 182 0 -5 1 204 0)
+                                      enableChannel: useManager
+                                      tabable: true
+                                      model: perStoreModuleRoot
+                                      acceptChannel: acceptChannel
+                                      acceptOnPointerLeave: true
+                                    )
+                                   (LabelSpec
+                                      label: 'DB:'
+                                      name: 'perModuleDBLabel'
+                                      layout: (LayoutFrame 0 0.0 211 0 40 0.25 228 0)
+                                      translateLabel: true
+                                      adjust: right
+                                    )
+                                   (ComboBoxSpec
+                                      name: 'perModuleModuleHostComboBox2'
+                                      layout: (LayoutFrame 44 0.25 207 0 -5 1 229 0)
+                                      enableChannel: useManager
+                                      tabable: true
+                                      model: perStoreModuleHostnameHolder
+                                      immediateAccept: true
+                                      acceptOnLeave: true
+                                      acceptOnReturn: true
+                                      acceptOnTab: true
+                                      acceptOnLostFocus: true
+                                      acceptChannel: acceptChannel
+                                      acceptOnPointerLeave: true
+                                      comboList: storeHostPrototypeList
+                                    )
+                                   (LabelSpec
+                                      label: 'User / Password:'
+                                      name: 'perModuleUserPasswordLabel'
+                                      layout: (LayoutFrame 0 0.0 236 0 40 0.25 253 0)
+                                      translateLabel: true
+                                      adjust: right
+                                    )
+                                   (InputFieldSpec
+                                      name: 'perModuleUserEntryField'
+                                      layout: (LayoutFrame 44 0.25 232 0 -2 0.65 254 0)
+                                      enableChannel: useManager
+                                      tabable: true
+                                      model: perStoreModuleUsernameHolder
+                                      acceptChannel: acceptChannel
+                                      acceptOnPointerLeave: true
+                                    )
+                                   (InputFieldSpec
+                                      name: 'perModulePasswordEntryField'
+                                      layout: (LayoutFrame 2 0.65 232 0 -5 1 254 0)
+                                      enableChannel: useManager
+                                      tabable: true
+                                      model: perStoreModulePasswordHolder
+                                      type: password
+                                      acceptChannel: acceptChannel
+                                      acceptOnPointerLeave: true
+                                    )
+                                   (HorizontalPanelViewSpec
+                                      name: 'HorizontalPanel5'
+                                      layout: (LayoutFrame 44 0.25 258 0 -1 1 289 0)
+                                      horizontalLayout: fitSpace
+                                      verticalLayout: center
+                                      horizontalSpace: 3
+                                      verticalSpace: 3
+                                      component: 
+                                     (SpecCollection
+                                        collection: (
+                                         (ActionButtonSpec
+                                            label: 'Add/Apply'
+                                            name: 'Button2'
+                                            translateLabel: true
+                                            tabable: true
+                                            model: addPerStoreModuleDB
+                                            enableChannel: useManager
+                                            extent: (Point 103 22)
+                                          )
+                                         (ActionButtonSpec
+                                            label: 'Remove'
+                                            name: 'Button3'
+                                            translateLabel: true
+                                            tabable: true
+                                            model: removePerStoreModuleDB
+                                            enableChannel: removeEnabled
+                                            extent: (Point 103 22)
+                                          )
+                                         (ViewSpec
+                                            name: 'Box17'
+                                            extent: (Point 103 10)
+                                          )
+                                         (ActionButtonSpec
+                                            label: 'Try to Connect'
+                                            name: 'Button4'
+                                            translateLabel: true
+                                            tabable: true
+                                            model: connectPerStoreModuleDB
+                                            enableChannel: storeConnectInModuleEnabled
+                                            extent: (Point 103 22)
+                                          )
+                                         )
+                                       
+                                      )
+                                    )
+                                   )
+                                 
+                                )
+                              )
+                             (FramedBoxSpec
                                 label: 'CVS Sourcecode Manager Setup'
                                 name: 'CVSSetupBox'
-                                layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+                                layout: (LayoutFrame 0 0 0 0 0 1 -12 1)
                                 visibilityChannel: managerIsCVSSourceCodeManager
                                 labelPosition: topLeft
                                 translateLabel: true
@@ -9720,14 +9980,14 @@
                                          (LabelSpec
                                             label: 'CVS BinDirectory:'
                                             name: 'Label1'
-                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
+                                            layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
                                             level: 0
                                             translateLabel: true
                                             adjust: right
                                           )
                                          (InputFieldSpec
                                             name: 'BinDirectoryField'
-                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
+                                            layout: (LayoutFrame 64 0.25 0 0 -5 1 22 0)
                                             enableChannel: useManager
                                             tabable: true
                                             model: cvsBinDirectoryHolder
@@ -9747,14 +10007,14 @@
                                          (LabelSpec
                                             label: 'CVSRoot default:'
                                             name: 'defaultCvsRootLabel'
-                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
+                                            layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
                                             level: 0
                                             translateLabel: true
                                             adjust: right
                                           )
                                          (ComboBoxSpec
                                             name: 'cvsRootComboBox'
-                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
+                                            layout: (LayoutFrame 64 0.25 0 0 -5 1 22 0)
                                             enableChannel: useManager
                                             tabable: true
                                             model: cvsRootHolder
@@ -9809,13 +10069,13 @@
                                    (LabelSpec
                                       label: 'CVSRoot per Module:'
                                       name: 'knownModulesLabel'
-                                      layout: (LayoutFrame 0 0.0 82 0 40 0.25 104 0)
+                                      layout: (LayoutFrame 0 0.0 82 0 60 0.25 104 0)
                                       translateLabel: true
                                       adjust: right
                                     )
                                    (SequenceViewSpec
                                       name: 'List1'
-                                      layout: (LayoutFrame 44 0.25 82 0 -5 1 201 0)
+                                      layout: (LayoutFrame 64 0.25 82 0 -5 1 201 0)
                                       enableChannel: useManager
                                       tabable: true
                                       model: selectedPerModuleRoot
@@ -9828,13 +10088,13 @@
                                    (LabelSpec
                                       label: 'Module:'
                                       name: 'moduleLabel'
-                                      layout: (LayoutFrame 0 0.0 211 0 40 0.25 228 0)
+                                      layout: (LayoutFrame 0 0.0 211 0 60 0.25 228 0)
                                       translateLabel: true
                                       adjust: right
                                     )
                                    (InputFieldSpec
                                       name: 'perModuleRootModuleEntryField'
-                                      layout: (LayoutFrame 44 0.25 207 0 -5 1 229 0)
+                                      layout: (LayoutFrame 64 0.25 207 0 -5 1 229 0)
                                       enableChannel: useManager
                                       tabable: true
                                       model: perModuleRootModule
@@ -9844,13 +10104,13 @@
                                    (LabelSpec
                                       label: 'CVSRoot:'
                                       name: 'cvsRootLabel'
-                                      layout: (LayoutFrame 0 0.0 236 0 40 0.25 253 0)
+                                      layout: (LayoutFrame 0 0.0 236 0 60 0.25 253 0)
                                       translateLabel: true
                                       adjust: right
                                     )
                                    (ComboBoxSpec
                                       name: 'perModuleRootComboBox'
-                                      layout: (LayoutFrame 44 0.25 232 0 -5 1.0 254 0)
+                                      layout: (LayoutFrame 64 0.25 232 0 -5 1.0 254 0)
                                       enableChannel: useManager
                                       tabable: true
                                       model: perModuleRoot
@@ -9865,7 +10125,7 @@
                                     )
                                    (HorizontalPanelViewSpec
                                       name: 'HorizontalPanel2'
-                                      layout: (LayoutFrame 44 0.25 258 0 -1 1 289 0)
+                                      layout: (LayoutFrame 64 0.25 258 0 -1 1 289 0)
                                       horizontalLayout: fitSpace
                                       verticalLayout: center
                                       horizontalSpace: 3
@@ -9880,7 +10140,7 @@
                                             tabable: true
                                             model: addPerModuleRoot
                                             enableChannel: useManager
-                                            extent: (Point 103 22)
+                                            extent: (Point 98 22)
                                           )
                                          (ActionButtonSpec
                                             label: 'Remove'
@@ -9889,11 +10149,11 @@
                                             tabable: true
                                             model: removePerModuleRoot
                                             enableChannel: removeEnabled
-                                            extent: (Point 103 22)
+                                            extent: (Point 98 22)
                                           )
                                          (ViewSpec
                                             name: 'Box11'
-                                            extent: (Point 103 10)
+                                            extent: (Point 98 10)
                                           )
                                          (ActionButtonSpec
                                             label: 'CVS-Login'
@@ -9902,228 +10162,7 @@
                                             tabable: true
                                             model: loginPerModuleRoot
                                             enableChannel: cvsLoginInModuleEnabled
-                                            extent: (Point 103 22)
-                                          )
-                                         )
-                                       
-                                      )
-                                    )
-                                   )
-                                 
-                                )
-                              )
-                             (FramedBoxSpec
-                                label: 'Store Repository Setup'
-                                name: 'StoreSetupBox'
-                                layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-                                visibilityChannel: managerIsStoreSourceCodeManager
-                                labelPosition: topLeft
-                                translateLabel: true
-                                component: 
-                               (SpecCollection
-                                  collection: (
-                                   (ViewSpec
-                                      name: 'HostBox'
-                                      layout: (LayoutFrame 0 0 0 0 0 1 25 0)
-                                      component: 
-                                     (SpecCollection
-                                        collection: (
-                                         (LabelSpec
-                                            label: 'Store DB Host:'
-                                            name: 'StoreHostLabel'
-                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
-                                            level: 0
-                                            translateLabel: true
-                                            adjust: right
-                                          )
-                                         (InputFieldSpec
-                                            name: 'StoreHostEntryField'
-                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
-                                            enableChannel: useManager
-                                            tabable: true
-                                            model: storeHostnameHolder
-                                            acceptChannel: acceptChannel
-                                            acceptOnPointerLeave: true
-                                          )
-                                         )
-                                       
-                                      )
-                                    )
-                                   (ViewSpec
-                                      name: 'UserBox'
-                                      layout: (LayoutFrame 0 0.0 27 0 0 1 52 0)
-                                      component: 
-                                     (SpecCollection
-                                        collection: (
-                                         (LabelSpec
-                                            label: 'Store DB Username:'
-                                            name: 'StoreUserLabel'
-                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
-                                            level: 0
-                                            translateLabel: true
-                                            adjust: right
-                                          )
-                                         (InputFieldSpec
-                                            name: 'StoreUserEntryField'
-                                            layout: (LayoutFrame 44 0.25 0 0 -5 1 22 0)
-                                            enableChannel: useManager
-                                            tabable: true
-                                            model: storeUsernameHolder
-                                            acceptChannel: acceptChannel
-                                            acceptOnPointerLeave: true
-                                          )
-                                         )
-                                       
-                                      )
-                                    )
-                                   (ViewSpec
-                                      name: 'PasswordBox'
-                                      layout: (LayoutFrame 0 0.0 54 0 0 1 79 0)
-                                      component: 
-                                     (SpecCollection
-                                        collection: (
-                                         (LabelSpec
-                                            label: 'Store DB Password:'
-                                            name: 'Label7'
-                                            layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
-                                            level: 0
-                                            translateLabel: true
-                                            adjust: right
-                                          )
-                                         (InputFieldSpec
-                                            name: 'PasswordEntryField'
-                                            layout: (LayoutFrame 44 0.25 0 0 -130 1 22 0)
-                                            enableChannel: useManager
-                                            tabable: true
-                                            model: storePasswordHolder
-                                            type: password
-                                            acceptChannel: acceptChannel
-                                            acceptOnPointerLeave: true
-                                          )
-                                         )
-                                       
-                                      )
-                                    )
-                                   (HorizontalPanelViewSpec
-                                      name: 'HorizontalPanel4'
-                                      layout: (LayoutFrame -130 1 51 0 -1 1 82 0)
-                                      horizontalLayout: fitSpace
-                                      verticalLayout: center
-                                      horizontalSpace: 3
-                                      verticalSpace: 3
-                                      component: 
-                                     (SpecCollection
-                                        collection: (
-                                         (ActionButtonSpec
-                                            label: 'CVS-Login'
-                                            name: 'Button1'
-                                            translateLabel: true
-                                            tabable: true
-                                            model: loginCVSRoot
-                                            enableChannel: storeLoginEnabled
-                                            extent: (Point 123 22)
-                                          )
-                                         )
-                                       
-                                      )
-                                    )
-                                   (LabelSpec
-                                      label: 'DB per Module:'
-                                      name: 'Label4'
-                                      layout: (LayoutFrame 0 0.0 82 0 40 0.25 104 0)
-                                      translateLabel: true
-                                      adjust: right
-                                    )
-                                   (SequenceViewSpec
-                                      name: 'List2'
-                                      layout: (LayoutFrame 44 0.25 82 0 -5 1 201 0)
-                                      enableChannel: useManager
-                                      tabable: true
-                                      model: selectedPerModuleDBInfo
-                                      hasHorizontalScrollBar: true
-                                      hasVerticalScrollBar: true
-                                      miniScrollerHorizontal: true
-                                      useIndex: false
-                                      sequenceList: listOfModules
-                                    )
-                                   (LabelSpec
-                                      label: 'Module:'
-                                      name: 'Label5'
-                                      layout: (LayoutFrame 0 0.0 211 0 40 0.25 228 0)
-                                      translateLabel: true
-                                      adjust: right
-                                    )
-                                   (InputFieldSpec
-                                      name: 'EntryField2'
-                                      layout: (LayoutFrame 44 0.25 207 0 -5 1 229 0)
-                                      enableChannel: useManager
-                                      tabable: true
-                                      model: perModuleRootModule
-                                      acceptChannel: acceptChannel
-                                      acceptOnPointerLeave: true
-                                    )
-                                   (LabelSpec
-                                      label: 'DB:'
-                                      name: 'Label6'
-                                      layout: (LayoutFrame 0 0.0 236 0 40 0.25 253 0)
-                                      translateLabel: true
-                                      adjust: right
-                                    )
-                                   (ComboBoxSpec
-                                      name: 'ComboBox2'
-                                      layout: (LayoutFrame 44 0.25 232 0 -5 1.0 254 0)
-                                      enableChannel: useManager
-                                      tabable: true
-                                      model: perModuleRoot
-                                      immediateAccept: true
-                                      acceptOnLeave: true
-                                      acceptOnReturn: true
-                                      acceptOnTab: true
-                                      acceptOnLostFocus: true
-                                      acceptChannel: acceptChannel
-                                      acceptOnPointerLeave: true
-                                      comboList: storeRootPrototypeList
-                                    )
-                                   (HorizontalPanelViewSpec
-                                      name: 'HorizontalPanel5'
-                                      layout: (LayoutFrame 44 0.25 258 0 -1 1 289 0)
-                                      horizontalLayout: fitSpace
-                                      verticalLayout: center
-                                      horizontalSpace: 3
-                                      verticalSpace: 3
-                                      component: 
-                                     (SpecCollection
-                                        collection: (
-                                         (ActionButtonSpec
-                                            label: 'Add/Apply'
-                                            name: 'Button2'
-                                            translateLabel: true
-                                            tabable: true
-                                            model: addPerModuleStoreDB
-                                            enableChannel: useManager
-                                            extent: (Point 103 22)
-                                          )
-                                         (ActionButtonSpec
-                                            label: 'Remove'
-                                            name: 'Button3'
-                                            translateLabel: true
-                                            tabable: true
-                                            model: removePerModuleStoreDB
-                                            enableChannel: removeEnabled
-                                            extent: (Point 103 22)
-                                          )
-                                         (ViewSpec
-                                            name: 'Box17'
-                                            extent: (Point 103 10)
-                                          )
-                                         (ActionButtonSpec
-                                            label: 'CVS-Login'
-                                            name: 'Button4'
-                                            translateLabel: true
-                                            tabable: true
-                                            model: loginPerStoreDB
-                                            enableChannel: cvsLoginInModuleEnabled
-                                            extent: (Point 103 22)
+                                            extent: (Point 98 22)
                                           )
                                          )
                                        
@@ -10194,7 +10233,7 @@
                              )
                            
                           )
-                          extent: (Point 659 40)
+                          extent: (Point 659 38)
                         )
                        (ViewSpec
                           name: 'Box5'
@@ -10256,63 +10295,70 @@
 
 !AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'actions'!
 
-addPerModuleRoot
-
-    |module cvsRoot|
-
-    acceptChannel value:true.    
-    module := self perModuleRootModule value.
-    cvsRoot := self perModuleRoot value.
-    (self listOfModules includes:module) ifFalse:[
-        self listOfModules add:module.
-        self listOfModules sort.
-    ].
-    cvsRoot size > 0 ifTrue:[
-        rootsPerModule at:module put:cvsRoot.
-    ].
-    self updateModifiedChannel.
-!
-
 basicReadSettings
     self initialize.
+
     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.
-            repositoryHolder := (repository ? '') asValue
+            manager isCVS ifTrue:[
+                repository := manager repositoryName.
+                repositoryHolder := (repository ? '') asValue
+            ].
+            manager isStore ifTrue:[
+                self storeHostnameHolder value: (manager hostAndDBName).
+                self storeUsernameHolder value: (manager userName).
+                self storePasswordHolder value: (manager password).
+            ].
         ].
     ] ifFalse:[
         self useManager value:false.
         self localSourceFirst value:false.
     ].
-    self checkClassesWhenCheckingIn 
-        value:(currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true).
-    self cvsRootHolder 
-        value:CVSSourceCodeManager repositoryName ? '/cvs/stx'.
+
+    self availableManagers do:[:eachManager |
+        |infoPerModule|
+
+        infoPerModule := eachManager repositoryInfoPerModule.
+        infoPerModule keysAndValuesDo:[:module :info | 
+            rootsPerModule at:module put:(Array with:eachManager with:info).
+        ].
+    ].
+
+    self checkClassesWhenCheckingIn value:(currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true).
+    self cvsRootHolder value:CVSSourceCodeManager repositoryName ? '/cvs/stx'.
     self cvsBinDirectoryHolder value:CVSSourceCodeManager cvsBinDirectory.
+
     rootsPerModule notNil ifTrue:[
         self listOfModules removeAll.
         listOfModules addAll:rootsPerModule keys asList.
     ].
-    self selectedPerModuleRootChanged.
+"/    self selectedPerModuleRootChanged.
 
     "Modified: / 16-08-2006 / 11:08:01 / cg"
 !
 
 basicSaveSettings
+    |modules|
+
+    currentUserPrefs at:#checkClassesWhenCheckingIn put:self checkClassesWhenCheckingIn value.
+    Class tryLocalSourceFirst:self localSourceFirst value.
 
     (self hasManager and:[self useManager value]) ifTrue:[
+        manager ~~ self selectedManager ifTrue:[
+            manager := nil.
+        ].
+
         manager isNil ifTrue:[
-            Smalltalk at:#SourceCodeManager put:(CVSSourceCodeManager).
-            manager := Smalltalk at:#SourceCodeManager.
+            Smalltalk at:#SourceCodeManager put:(manager := self selectedManager).
         ].
-        Class tryLocalSourceFirst:self localSourceFirst value.
-
         manager notNil ifTrue:[
             | nm fn|
+
             nm := self sourceCacheDir value.
             nm notEmptyOrNil ifTrue:[
                 (fn := nm asFilename) exists ifFalse:[
@@ -10330,29 +10376,36 @@
                 ] ifFalse:[
                     self warn:'Invalid sourceCache directory.'
                 ]
-"/            ] ifFalse:[
-"/                AbstractSourceCodeManager cacheDirectoryName:nil.
-            ].
-        ].
-
-        repositoryHolder notNil ifTrue:[
-            repositoryHolder value size > 0 ifTrue:[
-                manager notNil ifTrue:[
-                    manager initializeForRepository:repositoryHolder value.
-                ]
             ].
         ].
-        CVSSourceCodeManager cvsBinDirectory:self cvsBinDirectoryHolder value withoutSeparators.
-        CVSSourceCodeManager initializeForRepository:self cvsRootHolder value.
-        self cvsBinDirectoryHolder value:CVSSourceCodeManager cvsBinDirectory.
-        CVSSourceCodeManager repositoryNamesPerModule:rootsPerModule.
+
+        self availableManagers do:[:eachManager |
+            |infoPerModule|
+            modules := rootsPerModule select:[:entry | entry first == eachManager].
+            infoPerModule := Dictionary new.
+            modules keysAndValuesDo:[:module :entry | 
+                entry first == eachManager ifTrue:[
+                    infoPerModule at:module put:(entry second).
+                ].
+            ].
+            eachManager repositoryInfoPerModule:infoPerModule.
+        ].
+
+        manager isCVS ifTrue:[
+            self basicSaveCVSSettings.
+        ] ifFalse:[ manager isStore ifTrue:[
+            self basicSaveStoreSettings.
+        ] ifFalse:[
+            self error.
+        ]].
+
         self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
-        DebugView newDebugger.
+
+        DebugView newDebugger. "/ ???
     ] ifFalse:[
         Smalltalk at:#SourceCodeManager put:nil
     ].
 
-    currentUserPrefs at:#checkClassesWhenCheckingIn put:self checkClassesWhenCheckingIn value.
     self acceptChannel value.    
 !
 
@@ -10361,28 +10414,6 @@
     self withWaitCursorDo:[ AbstractSourceCodeManager condenseSourceCache ]
 !
 
-cvsLogin:cvsRoot
-    |cmd term|
-
-    cmd := 'cvs -d ' , cvsRoot , ' login ; exit'.
-    term := VT100TerminalView open.
-    term topView label:'CVS Login for ' , cvsRoot.
-    term topView waitUntilVisible.
-    term shellTerminateAction:[
-        "/ term topView destroy
-    ].
-
-    term showCR:(('Please enter the CVS-password then close this terminal window.') asText allBold colorizeAllWith:Color red).
-    term showCR:''.
-    term endEntry.
-    Delay waitForSeconds:1.
-    term sendLine:cmd.
-
-    "
-     self basicNew cvsLogin:':pserver:stx@exept.eu.org:/stx'
-    "
-!
-
 flushSourceCache
 
     self withWaitCursorDo:[ AbstractSourceCodeManager flushSourceCache ]
@@ -10392,14 +10423,6 @@
     ^ 'Launcher/cvsSetup.html'
 !
 
-loginCVSRoot
-    self cvsLogin:cvsRootHolder value.
-!
-
-loginPerModuleRoot
-    self cvsLogin:perModuleRoot value.
-!
-
 removePerModuleRoot
 
     |module|
@@ -10425,6 +10448,172 @@
     "Modified: / 16-08-2006 / 11:07:51 / cg"
 ! !
 
+!AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'actions - cvs'!
+
+addPerModuleRoot
+    |module cvsRoot|
+
+    acceptChannel value:true.    
+    module := self perModuleRootModule value.
+    cvsRoot := self perModuleRoot value.
+    (self listOfModules includes:module) ifFalse:[
+        self listOfModules add:module; sort.
+    ].
+    cvsRoot size > 0 ifTrue:[
+        rootsPerModule at:module put:(Array with:CVSSourceCodeManager with:cvsRoot).
+    ].
+    self updateModifiedChannel.
+!
+
+basicSaveCVSSettings
+    |cvsRoot|
+
+    repositoryHolder notNil ifTrue:[
+        repositoryHolder value size > 0 ifTrue:[
+            manager notNil ifTrue:[
+                manager initializeForRepository:repositoryHolder value.
+            ]
+        ].
+    ].
+    CVSSourceCodeManager cvsBinDirectory:(self cvsBinDirectoryHolder value withoutSeparators).
+    CVSSourceCodeManager initializeForRepository:(cvsRoot := self cvsRootHolder value).
+
+    CVSSourceCodeManager cvsBinDirectory ~= self cvsBinDirectoryHolder value withoutSeparators ifTrue:[
+        self warn:'CVS does not seem to like your Bin-Directory setting...'.
+        "/ self cvsBinDirectoryHolder value:CVSSourceCodeManager cvsBinDirectory.
+        AbortSignal raise "/ avoid clearing modfified
+    ].
+
+    RecentlyUsedCVSRoots isNil ifTrue:[
+        RecentlyUsedCVSRoots := OrderedCollection new.
+    ].
+    (RecentlyUsedCVSRoots includes:cvsRoot) ifFalse:[
+        RecentlyUsedCVSRoots addFirst:cvsRoot.
+        RecentlyUsedCVSRoots size > 20 ifTrue:[
+            RecentlyUsedCVSRoots removeLast.
+        ].
+    ].
+!
+
+cvsLogin:cvsRoot
+    |cmd term|
+
+    cmd := 'cvs -d ' , cvsRoot , ' login ; exit'.
+    term := VT100TerminalView open.
+    term topView label:'CVS Login for ' , cvsRoot.
+    term topView waitUntilVisible.
+    term shellTerminateAction:[
+        "/ term topView destroy
+    ].
+
+    term showCR:(('Please enter the CVS-password then close this terminal window.') asText allBold colorizeAllWith:Color red).
+    term showCR:''.
+    term endEntry.
+    Delay waitForSeconds:1.
+    term sendLine:cmd.
+
+    "
+     self basicNew cvsLogin:':pserver:stx@exept.eu.org:/stx'
+    "
+!
+
+loginCVSRoot
+    self cvsLogin:cvsRootHolder value.
+!
+
+loginPerModuleRoot
+    self cvsLogin:perModuleRoot value.
+! !
+
+!AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'actions - store'!
+
+addPerStoreModuleDB
+
+    |module info|
+
+    acceptChannel value:true.    
+
+    module := self perStoreModuleRoot value.
+    info := StoreSourceCodeManager newDBInfo.
+    info hostAndDBName:perStoreModuleHostnameHolder value.
+    info userName:perStoreModuleUsernameHolder value.
+    info password:perStoreModulePasswordHolder value.
+
+    (self listOfModules includes:module) ifFalse:[
+        self listOfModules add:module; sort.
+    ].
+    rootsPerModule at:module put:(Array with:StoreSourceCodeManager with:info).
+
+    self updateModifiedChannel.
+!
+
+basicSaveStoreSettings
+    |storeHost|
+
+    StoreSourceCodeManager hostAndDBName:(storeHost := self storeHostnameHolder value withoutSeparators).
+    StoreSourceCodeManager userName:(self storeUsernameHolder value withoutSeparators).
+    StoreSourceCodeManager password:(self storePasswordHolder value withoutSeparators).
+
+    StoreSourceCodeManager connectToDatabase.
+
+    RecentlyUsedStoreHosts isNil ifTrue:[
+        RecentlyUsedStoreHosts := OrderedCollection new.
+    ].
+    (RecentlyUsedStoreHosts includes:storeHost) ifFalse:[
+        RecentlyUsedStoreHosts addFirst:storeHost.
+        RecentlyUsedStoreHosts size > 20 ifTrue:[
+            RecentlyUsedStoreHosts removeLast.
+        ].
+    ].
+!
+
+connectPerStoreModuleDB
+    |testInfo|
+
+    testInfo := StoreSourceCodeManager newDBInfo.
+    testInfo hostAndDBName:(perStoreModuleHostnameHolder value).
+    testInfo userName:(perStoreModuleUsernameHolder value).
+    testInfo password:(perStoreModulePasswordHolder value).
+
+    (self tryToConnectTo:testInfo)
+!
+
+storeConnect
+    |testInfo|
+
+    testInfo := StoreSourceCodeManager newDBInfo.
+    testInfo hostAndDBName:(storeHostnameHolder value).
+    testInfo userName:(storeUsernameHolder value).
+    testInfo password:(storePasswordHolder value).
+
+    (self tryToConnectTo:testInfo) ifTrue:[
+        LastStoreHost := storeHostnameHolder value.
+        LastStoreUser := storeUsernameHolder value.
+        LastStorePassword := storePasswordHolder value.
+    ].
+!
+
+tryToConnectTo:dbInfo
+    |session|
+
+    SQL::SQLError handle:[:ex |
+        self warn:('Failed to connect to Database:\\' withCRs,ex description).
+        ^ false.
+    ] do:[
+        self withWaitCursorDo:[
+            session := StoreSourceCodeManager tryToConnectToDatabase:dbInfo.
+        ]
+    ].
+    session isNil ifTrue:[
+        self warn:'OOPS - Failed to connect'.
+        ^ false.
+    ].
+
+    self information:('Successfully connected to ',dbInfo dbName,'.').
+    session disconnect.
+    ^ true
+! !
+
 !AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'aspects'!
 
 acceptChannel
@@ -10443,11 +10632,14 @@
 
 availableManagers
     availableManagers isNil ifTrue:[
-        availableManagers := AbstractSourceCodeManager allSubclasses 
-                                reject:[:cls | (cls isAbstract) or:[cls isExperimental ]].
+        availableManagers := AbstractSourceCodeManager availableManagers.
     ].
     ^ availableManagers.
 
+    "
+     self basicNew availableManagers   
+    "
+
     "Created: / 16-08-2006 / 11:01:10 / cg"
 !
 
@@ -10572,6 +10764,15 @@
     "Created: / 16-08-2006 / 11:22:03 / cg"
 !
 
+perModuleFieldsEnableHolder
+
+    perModuleFieldsEnableHolder isNil ifTrue:[
+        perModuleFieldsEnableHolder := true asValue.
+        perModuleFieldsEnableHolder addDependent:self.
+    ].
+    ^ perModuleFieldsEnableHolder.
+!
+
 perModuleRoot
     perModuleRoot isNil ifTrue:[
         perModuleRoot := ValueHolder new.
@@ -10587,6 +10788,57 @@
     ^ perModuleRootModule.
 !
 
+perStoreModuleFieldsEnableHolder
+
+    perStoreModuleFieldsEnableHolder isNil ifTrue:[
+        perStoreModuleFieldsEnableHolder := true asValue.
+        perStoreModuleFieldsEnableHolder addDependent:self.
+    ].
+    ^ perStoreModuleFieldsEnableHolder.
+!
+
+perStoreModuleHostnameHolder
+
+    perStoreModuleHostnameHolder isNil ifTrue:[
+        perStoreModuleHostnameHolder := '' asValue.
+        perStoreModuleHostnameHolder addDependent:self.
+    ].
+    ^ perStoreModuleHostnameHolder.
+!
+
+perStoreModulePasswordHolder
+
+    perStoreModulePasswordHolder isNil ifTrue:[
+        perStoreModulePasswordHolder := '' asValue.
+        perStoreModulePasswordHolder addDependent:self.
+    ].
+    ^ perStoreModulePasswordHolder.
+!
+
+perStoreModuleRoot
+    perStoreModuleRoot isNil ifTrue:[
+        perStoreModuleRoot := ValueHolder new.
+        perStoreModuleRoot addDependent:self.
+    ].
+    ^ perStoreModuleRoot.
+!
+
+perStoreModuleRootModule
+    perStoreModuleRootModule isNil ifTrue:[
+        perStoreModuleRootModule := ValueHolder new.
+    ].
+    ^ perStoreModuleRootModule.
+!
+
+perStoreModuleUsernameHolder
+
+    perStoreModuleUsernameHolder isNil ifTrue:[
+        perStoreModuleUsernameHolder := '' asValue.
+        perStoreModuleUsernameHolder addDependent:self.
+    ].
+    ^ perStoreModuleUsernameHolder.
+!
+
 removeEnabled
 
     removeEnabled isNil ifTrue:[
@@ -10613,6 +10865,7 @@
         selectedManagerTypeIndexHolder onChangeEvaluate:[
             self managerIsCVSSourceCodeManager value:( self selectedManager isCVS ).
             self managerIsStoreSourceCodeManager value:( self selectedManager isStore ).
+            self updateModifiedChannel
         ].
     ].
     ^ selectedManagerTypeIndexHolder.
@@ -10628,6 +10881,14 @@
     ^ selectedPerModuleRoot.
 !
 
+selectedPerStoreModuleRoot
+    selectedPerStoreModuleRoot isNil ifTrue:[
+        selectedPerStoreModuleRoot := ValueHolder new.
+        selectedPerStoreModuleRoot addDependent:self.
+    ].
+    ^ selectedPerStoreModuleRoot.
+!
+
 sourceCacheDir
     sourceCacheDir isNil ifTrue:[
         sourceCacheDir := ValueHolder new.
@@ -10636,6 +10897,55 @@
     ^ sourceCacheDir.
 !
 
+storeConnectEnabled
+    storeConnectEnabled isNil ifTrue:[
+        storeConnectEnabled := false asValue.
+    ].
+    ^ storeConnectEnabled.
+!
+
+storeConnectInModuleEnabled
+    storeConnectInModuleEnabled isNil ifTrue:[
+        storeConnectInModuleEnabled := false asValue.
+    ].
+    ^ storeConnectInModuleEnabled.
+!
+
+storeHostPrototypeList
+    |prototypeList|
+
+    storeHostPrototypeList isNil ifTrue:[
+        prototypeList := OrderedSet new.
+
+        prototypeList add:('public@store.smalltalk-x.de:5432').
+        prototypeList add:('public').
+        prototypeList add:('stx').
+
+        OperatingSystem getLoginName = 'cg' ifTrue:[
+            prototypeList add:('oyster@store.smalltalk-x.de:5432').
+            prototypeList add:('oyster').
+        ].
+
+        OperatingSystem getDomainName = 'exept.de' ifTrue:[
+            prototypeList add:('stx@exept.exept.de:5432').
+        ] ifFalse:[
+            prototypeList add:('db@host').
+            prototypeList add:('db@host:port').
+        ].
+        storeHostPrototypeList := prototypeList asOrderedCollection.
+    ].
+    ^ storeHostPrototypeList.
+!
+
+storeHostnameHolder
+
+    storeHostnameHolder isNil ifTrue:[
+        storeHostnameHolder := (LastStoreHost ? '') asValue.
+        storeHostnameHolder addDependent:self.
+    ].
+    ^ storeHostnameHolder.
+!
+
 storeLoginEnabled
     storeLoginEnabled isNil ifTrue:[
         storeLoginEnabled := false asValue.
@@ -10645,6 +10955,24 @@
     "Created: / 16-08-2006 / 11:11:15 / cg"
 !
 
+storePasswordHolder
+
+    storePasswordHolder isNil ifTrue:[
+        storePasswordHolder := (LastStorePassword ? '') asValue.
+        storePasswordHolder addDependent:self.
+    ].
+    ^ storePasswordHolder.
+!
+
+storeUsernameHolder
+
+    storeUsernameHolder isNil ifTrue:[
+        storeUsernameHolder := (LastStoreUser ? '') asValue.
+        storeUsernameHolder addDependent:self.
+    ].
+    ^ storeUsernameHolder.
+!
+
 useManager
     useManager isNil ifTrue:[
         useManager := ValueHolder new.
@@ -10656,16 +10984,58 @@
 !AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'change & update'!
 
 selectedPerModuleRootChanged
-    |module cvsRoot|
+    |module entry|
 
     self acceptChannel value:true.    
     module := self selectedPerModuleRoot value.
-    module isNil ifTrue:[ ^ self].
-
-    self removeEnabled value:true.
-    cvsRoot := rootsPerModule at:module ifAbsent:''.
-    self perModuleRootModule value:module.
-    self perModuleRoot value:cvsRoot.
+    module isNil ifTrue:[ 
+        self removeEnabled value:false.
+        self perModuleRootModule value:' '.
+        self perModuleRoot value:''.
+        ^ self
+    ].
+
+    entry := rootsPerModule at:module ifAbsent:#().    
+    (entry first = CVSSourceCodeManager) ifTrue:[
+        self removeEnabled value:true.
+        self perModuleRootModule value:module.
+        self perModuleRoot value:(entry at:2).
+    ] ifFalse:[
+        self removeEnabled value:false.
+        self perModuleRootModule value:module , ' ',('<<use ',entry first managerTypeName,'>>') allBold.
+        self perModuleRoot value:''.
+    ].
+!
+
+selectedPerStoreModuleRootChanged
+    |module entry|
+
+    self acceptChannel value:true.    
+
+    module := self selectedPerStoreModuleRoot value.
+    module isNil ifTrue:[ 
+        self removeEnabled value:false.
+        self perStoreModuleRoot value:''.
+        self perStoreModuleHostnameHolder value:''.
+        self perStoreModuleUsernameHolder value:''.
+        self perStoreModulePasswordHolder value:''.
+        ^ self
+    ].
+
+    entry := rootsPerModule at:module ifAbsent:#().    
+    (entry first = StoreSourceCodeManager) ifTrue:[
+        self removeEnabled value:true.
+        self perStoreModuleRoot value:module.
+        self perStoreModuleHostnameHolder value:(entry at:2) hostAndDBName.
+        self perStoreModuleUsernameHolder value:(entry at:2) userName.
+        self perStoreModulePasswordHolder value:(entry at:2) password.
+    ] ifFalse:[
+        self removeEnabled value:false.
+        self perStoreModuleRoot value:module , ' ',('<<use ',entry first managerTypeName,'>>') allBold.
+        self perStoreModuleHostnameHolder value:''.
+        self perStoreModuleUsernameHolder value:''.
+        self perStoreModulePasswordHolder value:''.
+    ].
 !
 
 sourceDirChanged
@@ -10698,6 +11068,14 @@
 !
 
 update:something with:aParameter from:changedObject 
+    "/ common    
+    changedObject == sourceCacheDir ifTrue:[
+        self sourceDirChanged.
+        self updateModifiedChannel.
+        ^ self
+    ].
+
+    "/ cvs
     changedObject == cvsRootHolder ifTrue:[
         self updateModifiedChannel.
         self updateLoginEnableHolders.
@@ -10707,19 +11085,59 @@
         self updateLoginEnableHolders.
         ^ self
     ].
-    changedObject == sourceCacheDir ifTrue:[
-        self sourceDirChanged.
-        self updateModifiedChannel.
-        ^ self
-    ].
     changedObject == selectedPerModuleRoot ifTrue:[
         self selectedPerModuleRootChanged.
         ^ self
     ].
-    super 
-        update:something
-        with:aParameter
-        from:changedObject
+
+    "/ store
+    changedObject == storeHostnameHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == storeUsernameHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == storePasswordHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == perStoreModuleRoot ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == perStoreModuleHostnameHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == perStoreModuleUsernameHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+    changedObject == perStoreModulePasswordHolder ifTrue:[
+        self updateConnectEnableHolders.
+        ^ self
+    ].
+
+    changedObject == selectedPerStoreModuleRoot ifTrue:[
+        self selectedPerStoreModuleRootChanged.
+        ^ self
+    ].
+
+    super update:something with:aParameter from:changedObject
+!
+
+updateConnectEnableHolders
+    self storeConnectEnabled 
+        value:(storeHostnameHolder value notEmptyOrNil
+               and:[ storeUsernameHolder value notEmptyOrNil
+               and:[ storePasswordHolder value notEmptyOrNil ]]).
+
+    self storeConnectInModuleEnabled 
+        value:(perStoreModuleHostnameHolder value notEmptyOrNil
+               and:[ perStoreModuleUsernameHolder value notEmptyOrNil
+               and:[ perStoreModulePasswordHolder value notEmptyOrNil ]]).
 !
 
 updateLoginEnableHolders
@@ -10730,7 +11148,7 @@
 !AbstractSettingsApplication::SourceCodeManagementSettingsAppl methodsFor:'initialization & release'!
 
 initialize
-    (AbstractSourceCodeManager notNil) ifTrue:[AbstractSourceCodeManager autoload].
+    (AbstractSourceCodeManager notNil) ifTrue:[ AbstractSourceCodeManager autoload ].
 
     useManager := false asValue.
     useManager onChangeSend:#updateModifiedChannel to:self.
@@ -10741,8 +11159,11 @@
     repositoryHolder := '' asValue.
     rootsPerModule := Dictionary new.
 
-    SourceCodeManager == CVSSourceCodeManager ifTrue:[
-        rootsPerModule addAll:(SourceCodeManager repositoryNamesPerModule).
+    self availableManagers do:[:eachManager |
+        eachManager repositoryInfoPerModule 
+            keysAndValuesDo:[:module :info |
+                rootsPerModule at:module put:(Array with:eachManager with:info)
+            ].
     ].
 
     super initialize.
@@ -10764,36 +11185,49 @@
 !
 
 hasManager
-    ^ AbstractSourceCodeManager notNil
-                  and:[AbstractSourceCodeManager isLoaded]
+    "true if ANY source code management class is available"
+
+    ^ AbstractSourceCodeManager notNil and:[AbstractSourceCodeManager isLoaded]
 !
 
 hasUnsavedChanges
+    |cvsModules storeModules|
+
     (self useManager value ~= ((Smalltalk at:#SourceCodeManager) notNil)) ifTrue:[^ true].
-
-    ((self hasManager and:[self useManager value]) 
-    and:[
-            Class tryLocalSourceFirst ~= self localSourceFirst value or:[
-            (AbstractSourceCodeManager cacheDirectoryName ? '') ~= (self sourceCacheDir value ? '')]
-        ]) 
-        ifTrue:[^ true].
-
+    (Smalltalk at:#SourceCodeManager) ~~ self selectedManager ifTrue:[^ true].
     (self hasManager and:[self useManager value]) ifFalse:[^ false].
 
+    (Class tryLocalSourceFirst ~= self localSourceFirst value) ifTrue:[^ true].
+    ((AbstractSourceCodeManager cacheDirectoryName ? '') ~= (self sourceCacheDir value ? '')) ifTrue:[^ true].
+
     ((currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true) ~= self checkClassesWhenCheckingIn value)  
         ifTrue:[^ true].
 
-    ((CVSSourceCodeManager cvsBinDirectory ? '') ~= (self cvsBinDirectoryHolder value ? '') withoutSeparators)  
+    cvsModules := rootsPerModule select:[:entry | entry first == CVSSourceCodeManager].
+    ((Dictionary new addAll:(CVSSourceCodeManager repositoryInfoPerModule); yourself) ~= cvsModules)
         ifTrue:[^ true].
 
-    (CVSSourceCodeManager repositoryName ? '/files/CVS' ~= self cvsRootHolder value)    
+    storeModules := rootsPerModule select:[:entry | entry first == StoreSourceCodeManager].
+    ((Dictionary new addAll:(StoreSourceCodeManager repositoryInfoPerModule); yourself) ~= storeModules)
         ifTrue:[^ true].
 
-    ((Dictionary new addAll:(CVSSourceCodeManager repositoryNamesPerModule); yourself) ~= rootsPerModule)
-        ifTrue:[^ true].
-
-    ((self sourceCacheDir value ? '') ~= (AbstractSourceCodeManager cacheDirectoryName ? '')) ifTrue:[^ true].
-        
+    self selectedManager isCVS ifTrue:[
+        ((CVSSourceCodeManager cvsBinDirectory ? '') ~= (self cvsBinDirectoryHolder value ? '') withoutSeparators)  
+            ifTrue:[^ true].
+
+        (CVSSourceCodeManager repositoryName ? '/files/CVS' ~= self cvsRootHolder value)    
+            ifTrue:[^ true].
+    ].
+
+    self selectedManager isStore ifTrue:[
+        ((StoreSourceCodeManager hostAndDBName ? '') ~= (self storeHostnameHolder value ? '') withoutSeparators)  
+            ifTrue:[^ true].
+        ((StoreSourceCodeManager userName ? '') ~= (self storeUsernameHolder value ? '') withoutSeparators)  
+            ifTrue:[^ true].
+        ((StoreSourceCodeManager password ? '') ~= (self storePasswordHolder value ? '') withoutSeparators)  
+            ifTrue:[^ true].
+    ].
+            
     ^ false
 ! !
 
@@ -12564,5 +12998,5 @@
 !AbstractSettingsApplication class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/AbstractSettingsApplication.st,v 1.240 2006-08-22 09:44:23 cg Exp $'
-! !
+    ^ '$Header: /cvs/stx/stx/libtool/AbstractSettingsApplication.st,v 1.241 2006-08-25 16:01:38 cg Exp $'
+! !