StoreSourceCodeManagementSettingsAppl.st
author Claus Gittinger <cg@exept.de>
Fri, 30 Sep 2011 13:34:21 +0200
changeset 10737 d773607d85be
parent 10481 d92bb3c471e7
child 10987 b79d8f3ada76
permissions -rw-r--r--
flush

"
 COPYRIGHT (c) 2011 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:libtool' }"

AbstractSourceCodeManagementSettingsAppl subclass:#StoreSourceCodeManagementSettingsAppl
	instanceVariableNames:'sourceCacheDir useManager availableManagers condenseSourceCache
		setupSourceCodeManager checkClassesWhenCheckingIn
		formattingConfiguration flushSourceCache localSourceFirst
		repositoryHolder manager repository listOfModules
		cvsRootPrototypeList addPerModuleRoot removeEnabled
		perModuleRootModule acceptChannel removePerModuleRoot
		perModuleRoot cvsRootHolder selectedPerModuleRoot
		cvsBinDirectoryHolder cvsExecutableHolder rootsPerModule
		cvsLoginInModuleEnabled cvsLoginEnabled
		selectedManagerTypeIndexHolder managerIsCVSSourceCodeManager
		managerIsStoreSourceCodeManager storeLoginEnabled
		storeHostPrototypeList storeHostnameHolder storeUsernameHolder
		storePasswordHolder perStoreModuleHostnameHolder
		perStoreModuleUsernameHolder perStoreModulePasswordHolder
		perStoreModuleRoot perStoreModuleRootModule
		selectedPerStoreModuleRoot storeConnectEnabled
		storeConnectInModuleEnabled perModuleFieldsEnableHolder
		managerIsSmallTeamSourceCodeManager
		selectedPerSmallTeamModuleRoot
		perSmallTeamModuleFieldsEnableHolder perSmallTeamModuleRoot
		perSmallTeamModuleRootModule perSmallTeamModuleHostnameHolder
		smallTeamHostnameHolder verboseSourceCodeAccess keepMethodSource'
	classVariableNames:'RecentlyUsedCVSRoots RecentlyUsedStoreHosts
		RecentlyUsedSmallTeamHosts LastStoreHost LastStoreUser
		LastStorePassword'
	poolDictionaries:''
	category:'System-SourceCodeManagement'
!

!StoreSourceCodeManagementSettingsAppl class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2011 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    Store (visualWorks repository access) source code settings - highly experimental and unsupported.  
"
! !

!StoreSourceCodeManagementSettingsAppl class methodsFor:'image specs'!

defaultIcon
    "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 defaultIcon inspect
     ImageEditor openOnClass:self andSelector:#defaultIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'AbstractSettingsApplication::SourceCodeManagementSettingsAppl class defaultIcon'
        ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(8 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
@@@@@@@@@@@A@PHB@0P@@@@@@@@@@@@@@@@@@@HEA \HA $JB0HD@@@@@@@@@@@@@@HLA04NC0HD@@L@@ P@@@@@@@@@@@@ED@ NDP@@@@@@@@@D@@@@@@@@
@@@BA \FAPP@@@@@@@@@@@P@@@@@@@@@AQ@RC0@@@@@@@@@@@@@@@@@@@@@@@@TGA!!DD@@@@@@@@@@@@@@@@@@@D@PDIA08OA@@@@@@@@@@@@@@@@@@@AP S
A0XIBPXGC0P@@@@@@@@@@@@@@@@ECAPLBPXOAP@@@@@@EQX@@@@@@@@@@@TIE@XOAP@@@@@@EQ\XE @@@@@@@@@@AP$OAP@@@@@@FQ\ZE!! V@@@@@@@@@@@E
F0@@@@@@EQ\ZF!!(VFAX@@@@@@@@@@@@@@@@ZEQ\VE!!(ZF!!XWF @@@@@@@@@@@@@@@@@@@A\ZE!!(@@@@@@@@@@@@@@@@@@@@@@@@XE!!XZ@@@@@@@@@@@@@@@@
@@@@@@@@EQ(V@@@@@@@@@@@@@@@@@@@@@@@@EQ\VE @@@@@@@@@@@@@@@@@@@@@@EQ VE @@@@@@@@@@@@@@F @@@@@WEQ VE!!(@@@@@@@@@@@@@@@@@E!!\W
EQXVE @@@@@@@@@@@@@@@@@@@@@@@A(Z@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 32 64 0 0 64 0 32 32 0 0 32 0 32 96 32 96 192 128 192 224 192 160 224 160 32 128 64 64 96 64 64 96 32 32 160 64 160 224 192 64 160 96 32 128 32 224 224 224 64 128 64 160 192 160 224 224 192 32 160 96 160 160 160 64 64 64 96 96 96 128 128 128 192 192 192 32 32 32 32 64 32]; mask:((ImageMask new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@O8@@?>@A??@A?C C<@0C8@PC8@@??@@??F@_>O@O<_ G8?0C1?8A#?<@C?<@@_@H@_@L@?@GC>@C?>@A?<@@_0@') ; yourself); yourself]
! !

!StoreSourceCodeManagementSettingsAppl 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:StoreSourceCodeManagementSettingsAppl andSelector:#windowSpec
     StoreSourceCodeManagementSettingsAppl new openInterface:#windowSpec
     StoreSourceCodeManagementSettingsAppl open
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: windowSpec
        window: 
       (WindowSpec
          label: 'Source Code Manager Settings'
          name: 'Source Code Manager Settings'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 659 580)
        )
        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: 20
              component: 
             (SpecCollection
                collection: (
                 (VerticalPanelViewSpec
                    name: 'VerticalPanel3'
                    horizontalLayout: fit
                    verticalLayout: top
                    horizontalSpace: 3
                    verticalSpace: 4
                    component: 
                   (SpecCollection
                      collection: (
                       (ViewSpec
                          name: 'ManagerSetupBoxx'
                          component: 
                         (SpecCollection
                            collection: (
                             (FramedBoxSpec
                                label: 'Store-DB Source Repository Settings'
                                name: 'StoreSetupBox'
                                layout: (LayoutFrame 0 0 0 0 0 1 0 1)
                                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 0 1 22 0)
                                            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 0 1 22 0)
                                            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)
                                            tabable: true
                                            model: storePasswordHolder
                                            type: password
                                            acceptChannel: acceptChannel
                                            acceptOnPointerLeave: true
                                          )
                                         )
                                       
                                      )
                                    )
                                   (HorizontalPanelViewSpec
                                      name: 'HorizontalPanel4'
                                      layout: (LayoutFrame -130 1 51 0 0 1 82 0)
                                      horizontalLayout: fitSpace
                                      verticalLayout: center
                                      horizontalSpace: 3
                                      verticalSpace: 3
                                      component: 
                                     (SpecCollection
                                        collection: (
                                         (ActionButtonSpec
                                            label: 'Try to Connect'
                                            name: 'TryConnectButton1'
                                            translateLabel: true
                                            tabable: true
                                            model: storeConnect
                                            enableChannel: storeConnectEnabled
                                            extent: (Point 124 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 0 1 180 0)
                                      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 0 1 204 0)
                                      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 0 1 229 0)
                                      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)
                                      tabable: true
                                      model: perStoreModuleUsernameHolder
                                      acceptChannel: acceptChannel
                                      acceptOnPointerLeave: true
                                    )
                                   (InputFieldSpec
                                      name: 'perModulePasswordEntryField'
                                      layout: (LayoutFrame 5 0.65 232 0 0 1 254 0)
                                      tabable: true
                                      model: perStoreModulePasswordHolder
                                      type: password
                                      acceptChannel: acceptChannel
                                      acceptOnPointerLeave: true
                                    )
                                   (HorizontalPanelViewSpec
                                      name: 'HorizontalPanel5'
                                      layout: (LayoutFrame 44 0.25 -25 1 -10 0.65 6 1)
                                      horizontalLayout: fit
                                      verticalLayout: center
                                      horizontalSpace: 3
                                      verticalSpace: 3
                                      component: 
                                     (SpecCollection
                                        collection: (
                                         (ActionButtonSpec
                                            label: 'Add/Apply'
                                            name: 'AddButton2'
                                            translateLabel: true
                                            tabable: true
                                            model: addPerStoreModuleDB
                                            extent: (Point 96 22)
                                          )
                                         (ActionButtonSpec
                                            label: 'Remove'
                                            name: 'RemoveButton3'
                                            translateLabel: true
                                            tabable: true
                                            model: removePerStoreModuleDB
                                            enableChannel: removeEnabled
                                            extent: (Point 97 22)
                                          )
                                         )
                                       
                                      )
                                    )
                                   (HorizontalPanelViewSpec
                                      name: 'HorizontalPanel6'
                                      layout: (LayoutFrame 10 0.65 -25 1 0 1 6 1)
                                      horizontalLayout: fit
                                      verticalLayout: center
                                      horizontalSpace: 3
                                      verticalSpace: 3
                                      component: 
                                     (SpecCollection
                                        collection: (
                                         (ActionButtonSpec
                                            label: 'Try to Connect'
                                            name: 'ConnectPerStoreModuleButton'
                                            translateLabel: true
                                            tabable: true
                                            model: connectPerStoreModuleDB
                                            enableChannel: storeConnectInModuleEnabled
                                            extent: (Point 103 22)
                                          )
                                         (ActionButtonSpec
                                            label: 'Browse'
                                            name: 'BrowsePerStoreModuleButton'
                                            translateLabel: true
                                            tabable: true
                                            model: browsePerStoreModuleDB
                                            enableChannel: storeConnectInModuleEnabled
                                            extent: (Point 103 22)
                                          )
                                         )
                                       
                                      )
                                    )
                                   )
                                 
                                )
                              )
                             )
                           
                          )
                          extent: (Point 659 327)
                        )
                       (FramedBoxSpec
                          label: 'Source Cache'
                          name: 'FramedBox1'
                          labelPosition: topLeft
                          translateLabel: true
                          component: 
                         (SpecCollection
                            collection: (
                             (ViewSpec
                                name: 'SourceCacheDirBox'
                                layout: (LayoutFrame 0 0 0 0 0 1 30 0)
                                component: 
                               (SpecCollection
                                  collection: (
                                   (LabelSpec
                                      label: 'Source Cache Dir:'
                                      name: 'SourceCacheDirLabel'
                                      layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
                                      translateLabel: true
                                      adjust: right
                                    )
                                   (InputFieldSpec
                                      name: 'SourceCacheDirEntryField'
                                      layout: (LayoutFrame 64 0.25 0 0 0 1 22 0)
                                      enableChannel: useManager
                                      model: sourceCacheDir
                                      immediateAccept: false
                                      acceptOnReturn: true
                                      acceptOnTab: true
                                      acceptOnLostFocus: true
                                      acceptOnPointerLeave: true
                                    )
                                   )
                                 
                                )
                              )
                             (HorizontalPanelViewSpec
                                name: 'CacheActionsHorizontalPanel'
                                layout: (LayoutFrame 44 0.25 33 0 0 1 67 0)
                                horizontalLayout: fitSpace
                                verticalLayout: center
                                horizontalSpace: 3
                                verticalSpace: 3
                                component: 
                               (SpecCollection
                                  collection: (
                                   (ActionButtonSpec
                                      label: 'Flush Cache now'
                                      name: 'FlushCacheNowButton'
                                      translateLabel: true
                                      tabable: true
                                      model: flushSourceCache
                                      enableChannel: useManager
                                      extent: (Point 208 22)
                                    )
                                   (ActionButtonSpec
                                      label: 'Condense Cache now'
                                      name: 'CondenseCacheNowButton'
                                      translateLabel: true
                                      tabable: true
                                      model: condenseSourceCache
                                      enableChannel: useManager
                                      extent: (Point 208 22)
                                    )
                                   )
                                 
                                )
                              )
                             )
                           
                          )
                          extent: (Point 659 95)
                        )
                       )
                     
                    )
                    extent: (Point 659 768)
                  )
                 )
               
              )
            )
           )
         
        )
      )
! !

!StoreSourceCodeManagementSettingsAppl class methodsFor:'queries'!

managerClass
    "backlink to my manager class (needed by the settings app)"

    ^ StoreSourceCodeManager

    "Created: / 19-04-2011 / 12:48:57 / cg"
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'accessing'!

manager

    ^ Smalltalk at:#SourceCodeManager
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'actions'!

addModule:module withData:data
    (self listOfModules includes:module) ifFalse:[
        self listOfModules add:module; sort.
    ].
    rootsPerModule at:module put:data.

    self updateModifiedChannel.

    "Created: / 08-11-2006 / 19:25:21 / cg"
!

basicReadSettings
    self initialize.

    self sourceCacheDir value:(StoreSourceCodeManager cacheDirectoryName).

    "/ StoreSourceCodeManager forgetDisabledModules.
    self storeHostnameHolder value: (StoreSourceCodeManager hostAndDBName).
    self storeUsernameHolder value: (StoreSourceCodeManager userName).
    self storePasswordHolder value: (StoreSourceCodeManager password).

    (Array with:StoreSourceCodeManager) "self availableManagers" do:[:eachManager |
        |infoPerModule|

        infoPerModule := eachManager repositoryInfoPerModule.
        infoPerModule keysAndValuesDo:[:module :info | 
            rootsPerModule at:module put:(Array with:eachManager with:info).
        ].
    ].

    "/ self updateSelectedManager.

    rootsPerModule notNil ifTrue:[
        self listOfModules removeAll.
        listOfModules addAll:rootsPerModule keys asList.
    ].
"/    self selectedPerModuleRootChanged.

    "Modified: / 18-04-2011 / 18:40:40 / cg"
!

basicSaveSettings
    |modules nm fn|

    nm := self sourceCacheDir value.
    nm notEmptyOrNil ifTrue:[
        (fn := nm asFilename) exists ifFalse:[
            (self confirm:('Cache directory ''' , nm , ''' does not exist\create ?' withCRs)) ifTrue:[
                fn recursiveMakeDirectory; 
                   makeReadableForAll;
                   makeWritableForAll;
                   makeExecutableForAll.
            ]
        ].
        (fn isDirectory
        and:[fn isReadable
        and:[fn isWritable]]) ifTrue:[
            StoreSourceCodeManager cacheDirectoryName:nm.
        ] ifFalse:[
            self warn:'Invalid sourceCache directory.'
        ]
    ].

    (Array with:StoreSourceCodeManager) "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.
    ].

    self basicSaveStoreSettings.

    self sourceCacheDir value:(StoreSourceCodeManager cacheDirectoryName).

    DebugView newDebugger. "/ ???

    self acceptChannel value.

    "Modified: / 18-04-2011 / 18:36:42 / cg"
!

condenseSourceCache
    self withWaitCursorDo:[ AbstractSourceCodeManager condenseSourceCache ].
    Method flushSourceStreamCache.

    "Modified: / 28-11-2006 / 12:21:33 / cg"
!

flushSourceCache
    self withWaitCursorDo:[ AbstractSourceCodeManager flushSourceCache ].

    "Modified: / 30-09-2011 / 13:33:55 / cg"
!

removePerModuleRoot

    |module|

    acceptChannel value:true.    
    module := self perModuleRootModule value.
    self listOfModules remove:module ifAbsent:nil.
    rootsPerModule removeKey:module ifAbsent:nil.
    self perModuleRootModule value:nil.
    self perModuleRoot value:nil.
    self updateModifiedChannel.
!

setupSourceCodeManager

   AbstractLauncherApplication::LauncherDialogs cvsConfigurationDialog.
   manager := (Smalltalk at:#SourceCodeManager).
   manager notNil ifTrue:[
        repositoryHolder value: manager repositoryName.
        sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
   ].

    "Modified: / 16-08-2006 / 11:07:51 / cg"
! !

!StoreSourceCodeManagementSettingsAppl 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 addModule:module withData:(Array with:StoreSourceCodeManager with:info).

    "Modified: / 08-11-2006 / 19:27:35 / cg"
!

basicSaveStoreSettings
    |storeHost|

    StoreSourceCodeManager hostAndDBName:(storeHost := self storeHostnameHolder value withoutSeparators).
    StoreSourceCodeManager userName:(self storeUsernameHolder value withoutSeparators).
    StoreSourceCodeManager password:(self storePasswordHolder value withoutSeparators).

    storeHost notEmptyOrNil ifTrue:[
        StoreSourceCodeManager connectToDatabase.
    ].

    RecentlyUsedStoreHosts isNil ifTrue:[
        RecentlyUsedStoreHosts := OrderedCollection new.
    ].
    (RecentlyUsedStoreHosts includes:storeHost) ifFalse:[
        RecentlyUsedStoreHosts addFirst:storeHost.
        RecentlyUsedStoreHosts size > 20 ifTrue:[
            RecentlyUsedStoreHosts removeLast.
        ].
    ].
!

browsePerStoreModuleDB
    |testInfo|

    testInfo := StoreSourceCodeManager newDBInfo.
    testInfo hostAndDBName:(perStoreModuleHostnameHolder value).
    testInfo userName:(perStoreModuleUsernameHolder value).
    testInfo password:(perStoreModulePasswordHolder value).
    self browseStoreDB:testInfo
!

browseStoreDB:dbInfo
    Tools::StoreProjectBrowser openOn:dbInfo
!

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
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'aspects'!

acceptChannel

    acceptChannel isNil ifTrue:[
        acceptChannel := TriggerValue new.
    ].
    ^ acceptChannel.
!

checkClassesWhenCheckingIn

    checkClassesWhenCheckingIn isNil ifTrue:[
        checkClassesWhenCheckingIn := (currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true) asValue.
        checkClassesWhenCheckingIn onChangeSend:#updateModifiedChannel to:self
    ].
    ^ checkClassesWhenCheckingIn.
!

keepMethodSource

    keepMethodSource isNil ifTrue:[
        keepMethodSource := ValueHolder new.
        keepMethodSource onChangeSend:#updateModifiedChannel to:self
    ].
    ^ keepMethodSource.
!

listOfModules

    listOfModules isNil ifTrue:[
        rootsPerModule notNil ifTrue:[
            listOfModules := rootsPerModule keys asList.
        ].
        listOfModules sort.
        listOfModules onChangeSend:#updateModifiedChannel to:self
    ].
    ^ listOfModules.
!

localSourceFirst

    localSourceFirst isNil ifTrue:[
        localSourceFirst := ValueHolder new.
        localSourceFirst onChangeSend:#updateModifiedChannel to:self
    ].
    ^ localSourceFirst.
!

managerIsCVSSourceCodeManager
    managerIsCVSSourceCodeManager isNil ifTrue:[
        managerIsCVSSourceCodeManager := (SourceCodeManager notNil and:
                                         [SourceCodeManager isCVS]) asValue.
    ].
    ^ managerIsCVSSourceCodeManager.

    "Created: / 16-08-2006 / 10:56:38 / cg"
!

managerIsSmallTeamSourceCodeManager
    managerIsSmallTeamSourceCodeManager isNil ifTrue:[
        managerIsSmallTeamSourceCodeManager := (SourceCodeManager notNil and:
                                         [SourceCodeManager isSmallTeam]) asValue.
    ].
    ^ managerIsSmallTeamSourceCodeManager.

    "Created: / 09-11-2006 / 14:33:53 / cg"
!

managerIsStoreSourceCodeManager
    managerIsStoreSourceCodeManager isNil ifTrue:[
        managerIsStoreSourceCodeManager := (SourceCodeManager notNil and:
                                         [SourceCodeManager isStore]) asValue.
    ].
    ^ managerIsStoreSourceCodeManager.

    "Created: / 16-08-2006 / 10:57:13 / cg"
!

perModuleFieldsEnableHolder

    perModuleFieldsEnableHolder isNil ifTrue:[
        perModuleFieldsEnableHolder := true asValue.
        perModuleFieldsEnableHolder addDependent:self.
    ].
    ^ perModuleFieldsEnableHolder.
!

perModuleRoot
    perModuleRoot isNil ifTrue:[
        perModuleRoot := ValueHolder new.
        perModuleRoot addDependent:self.
    ].
    ^ perModuleRoot.
!

perModuleRootModule
    perModuleRootModule isNil ifTrue:[
        perModuleRootModule := ValueHolder new.
    ].
    ^ perModuleRootModule.
!

perStoreModuleFieldsEnableHolder

    perSmallTeamModuleFieldsEnableHolder isNil ifTrue:[
        perSmallTeamModuleFieldsEnableHolder := true asValue.
        perSmallTeamModuleFieldsEnableHolder addDependent:self.
    ].
    ^ perSmallTeamModuleFieldsEnableHolder.
!

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:[
        removeEnabled := false asValue.
    ].
    ^ removeEnabled.
!

selectedPerModuleRoot
    selectedPerModuleRoot isNil ifTrue:[
        selectedPerModuleRoot := ValueHolder new.
        selectedPerModuleRoot addDependent:self.
    ].
    ^ selectedPerModuleRoot.
!

selectedPerStoreModuleRoot
    selectedPerStoreModuleRoot isNil ifTrue:[
        selectedPerStoreModuleRoot := ValueHolder new.
        selectedPerStoreModuleRoot addDependent:self.
    ].
    ^ selectedPerStoreModuleRoot.
!

sourceCacheDir
    sourceCacheDir isNil ifTrue:[
        sourceCacheDir := ValueHolder new.
        sourceCacheDir onChangeSend:#updateModifiedChannel to:self
    ].
    ^ 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.
    ].
    ^ storeLoginEnabled.

    "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.
        useManager onChangeSend:#updateModifiedChannel to:self
    ].
    ^ useManager.
!

verboseSourceCodeAccess
    verboseSourceCodeAccess isNil ifTrue:[
        verboseSourceCodeAccess := false asValue.
        verboseSourceCodeAccess onChangeSend:#updateModifiedChannel to:self
    ].
    ^ verboseSourceCodeAccess.
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'change & update'!

selectedPerModuleRootChanged
    |module entry|

    self acceptChannel value:true.    
    module := self selectedPerModuleRoot value.
    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
    |nm fn previousDir|

    manager isNil ifTrue:[^ self].

    previousDir := AbstractSourceCodeManager cacheDirectoryName.

    nm := self sourceCacheDir value.
    nm isEmptyOrNil ifTrue:[^ self].

    (fn := nm asFilename) exists ifFalse:[
        (self confirm:(resources 
                            stringWithCRs:'SourceCache directory "%1" does not exist.\Create ?'
                            with:nm)
        ) ifFalse:[
            self sourceCacheDir value:previousDir.
            ^ self.
        ].
        fn 
            recursiveMakeDirectory; 
            makeReadableForAll;
            makeWritableForAll;
            makeExecutableForAll.
        ^ self.
    ].

    (fn isDirectory) ifFalse:[
        self warn:(resources 
                            stringWithCRs:'Not a directory: "%1"'
                            with:nm).
        self sourceCacheDir value:previousDir.
        ^ self.
    ].

    (fn isReadable and:[fn isWritable]) ifFalse:[
        (self confirm:(resources 
                            stringWithCRs:'SourceCache directory "%1" is not both readable and writable.\Change ?'
                            with:nm)
        ) ifFalse:[
            self sourceCacheDir value:previousDir.
            ^ self.
        ].
        fn
            makeReadableForAll;
            makeWritableForAll;
            makeExecutableForAll.
    ].
"/    (fn isReadableForAll and:[fn isWritableForAll]) ifFalse:[
"/        (self confirm:(resources 
"/                            stringWithCRs:'SourceCache directory "%1" is not both readable and writable for other users.\Change ?'
"/                            with:nm)
"/        ) ifTrue:[
"/            fn
"/                makeReadableForAll;
"/                makeWritableForAll;
"/                makeExecutableForAll.
"/        ]
"/    ].
!

update:something with:aParameter from:changedObject 
    "/ common    
    changedObject == sourceCacheDir ifTrue:[
        self sourceDirChanged.
        self updateModifiedChannel.
        ^ self
    ].

    "/ 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

    "Modified: / 18-04-2011 / 18:17:14 / cg"
!

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 ]]).
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'help'!

helpFilename
    ^ 'Launcher/storeDBSetup.html'

    "Modified: / 05-08-2011 / 09:20:28 / cg"
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'initialization & release'!

initialize
    (AbstractSourceCodeManager notNil) ifTrue:[ AbstractSourceCodeManager autoload ].

    useManager := false asValue.
    useManager onChangeSend:#updateModifiedChannel to:self.

    sourceCacheDir := nil asValue.
    sourceCacheDir addDependent:self.

    repositoryHolder := '' asValue.
    rootsPerModule := Dictionary new.

    (Array with:StoreSourceCodeManager) "self availableManagers" do:[:eachManager |
        eachManager repositoryInfoPerModule 
            keysAndValuesDo:[:module :info |
                module withoutSeparators ~= module ifTrue:[
                    self halt:'should not happen any longer'
                ].
                rootsPerModule at:module put:(Array with:eachManager with:info)
            ].
    ].

    super initialize.

    "Modified: / 18-04-2011 / 18:38:02 / cg"
! !

!StoreSourceCodeManagementSettingsAppl methodsFor:'queries'!

cvsRootFromCVSRootFileOrNil
    |cvsDir cvsRootFile cvsRoot|

    cvsDir := 'CVS' asFilename.
    cvsDir isDirectory ifTrue:[
        cvsRootFile := cvsDir construct:'Root'.
        cvsRootFile isReadable ifTrue:[
            cvsRoot := cvsRootFile contents firstIfEmpty:nil.
        ].
    ].
    ^ cvsRoot
!

hasManager
    "true if ANY source code management class is available"

    ^ AbstractSourceCodeManager notNil and:[AbstractSourceCodeManager isLoaded]
!

hasUnsavedChanges
    ((StoreSourceCodeManager cacheDirectoryName ? '') ~= (self sourceCacheDir value ? '')) ifTrue:[^ true].

    (Array with:StoreSourceCodeManager) "self availableManagers" do:[:mgr |
        |modules|

        modules := rootsPerModule select:[:entry | entry first == mgr].

        mgr repositoryInfoPerModule keysAndValuesDo:[:module :info |
            ((modules includesKey:module) and:[info = (modules at:module) second])
            ifFalse:[^ true].
        ].
        modules keysAndValuesDo:[:module :info|
            ((mgr repositoryInfoPerModule includesKey:module) and:[(mgr repositoryInfoPerModule at:module) = info second])
            ifFalse:[^ true].
        ].
    ].

    ((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

    "Modified: / 18-04-2011 / 18:32:21 / cg"
! !

!StoreSourceCodeManagementSettingsAppl class methodsFor:'documentation'!

version_CVS
    ^ '$Header: /cvs/stx/stx/libtool/StoreSourceCodeManagementSettingsAppl.st,v 1.6 2011-09-30 11:34:21 cg Exp $'
!

version_SVN
    ^ '§Id§'
! !