ProjectBrowser.st
changeset 1147 422c8afcb0f5
parent 1116 710c9297a9fc
child 1148 3e42f8601522
--- a/ProjectBrowser.st	Wed Jun 16 14:18:10 1999 +0200
+++ b/ProjectBrowser.st	Thu Jun 24 17:44:30 1999 +0200
@@ -1,6 +1,6 @@
 ToolApplicationModel subclass:#ProjectBrowser
 	instanceVariableNames:'projectTree modifiedChannel'
-	classVariableNames:''
+	classVariableNames:'AlreadCheckedExistingModulesAndPackages'
 	poolDictionaries:''
 	category:'Interface-Smalltalk'
 !
@@ -20,6 +20,86 @@
 !
 
 
+!ProjectBrowser class methodsFor:'help specs'!
+
+helpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:ProjectBrowser    
+    "
+
+    <resource: #help>
+
+    ^super helpSpec addPairsFrom:#(
+
+#accept
+'Accept modifications made here.'
+
+#appType
+'An application - ie an executable program (and support files if any).'
+
+#cancel
+'Undo modifications made here.'
+
+#defaultNamespace
+'Namespace for new classes when created in the Browser.'
+
+#deliverAsGZIP
+'Package delivery into a gzip archive (for unix)'
+
+#deliverAsTar
+'Package delivery into a tar archive (for unix)'
+
+#deliverAsZIP
+'Package delivery into a zip archive (for win32)'
+
+#deliverBinary
+'Create and deliver a compiled binary (classLibrary) - only possible for the running systems architecture.'
+
+#deliverLoadAll
+'Deliver a loadAll script file, which files-In the other files.'
+
+#deliverSource
+'Include smalltalk sourceCode in the delivery.'
+
+#includeSource
+'Include smalltalk sourceCode in the delivery.'
+
+#installDirMacOS
+'The final install directory for MacOS deliveries.'
+
+#installDirUnix
+'The final install directory for UNIX deliveries.'
+
+#installDirVMS
+'The final install directory for VMS deliveries.'
+
+#installDirWin32
+'The final install directory for Win32 deliveries.'
+
+#libType
+'A classLibrary addOn (and support files if any)'
+
+#packageID
+'Package ID used to associate classes & methods to this project.'
+
+#projectDir
+'The projects directory.'
+
+#repositoryDirectory
+'The directory path below the module in the source-repository.'
+
+#repositoryModule
+'The module (top directory) in the source-repository.'
+
+)
+! !
+
 !ProjectBrowser class methodsFor:'image specs'!
 
 classIcon
@@ -299,11 +379,11 @@
        #(#WindowSpec
           #label: 'NewApplication'
           #name: 'NewApplication'
-          #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
+          #layout: #(#LayoutFrame 40 0 71 0 392 0 413 0)
           #level: 0
           #min: #(#Point 10 10)
           #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 216 173 516 473)
+          #bounds: #(#Rectangle 40 71 393 414)
           #usePreferredExtent: false
           #returnIsOKInDialog: true
           #escapeIsCancelInDialog: true
@@ -314,7 +394,7 @@
            #(#FramedBoxSpec
               #label: 'Delivery'
               #name: 'FramedBox1'
-              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 173 0)
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 140 0)
               #labelPosition: #topLeft
               #translateLabel: true
               #component: 
@@ -323,7 +403,8 @@
                  #(#CheckBoxSpec
                     #label: 'Compiled Binary'
                     #name: 'CheckBox1'
-                    #layout: #(#LayoutFrame 0 0.0 10 0 0 1.0 32 0)
+                    #layout: #(#LayoutFrame 0 0.0 10 0 0 0.5 32 0)
+                    #activeHelpKey: #deliverBinary
                     #tabable: true
                     #model: #deliverCompiledBinary
                     #translateLabel: true
@@ -331,7 +412,8 @@
                  #(#CheckBoxSpec
                     #label: 'Zip Archive'
                     #name: 'CheckBox2'
-                    #layout: #(#LayoutFrame 0 0.0 38 0 0 1.0 60 0)
+                    #layout: #(#LayoutFrame 0 0.5 10 0 0 1.0 32 0)
+                    #activeHelpKey: #deliverAsZIP
                     #tabable: true
                     #model: #deliverZipArchive
                     #translateLabel: true
@@ -339,7 +421,8 @@
                  #(#CheckBoxSpec
                     #label: 'GZip Archive (self extracting)'
                     #name: 'CheckBox3'
-                    #layout: #(#LayoutFrame 0 0.0 66 0 0 1.0 88 0)
+                    #layout: #(#LayoutFrame 0 0.5 38 0 0 1.0 60 0)
+                    #activeHelpKey: #deliverAsGZIP
                     #tabable: true
                     #model: #deliverGZipArchive
                     #translateLabel: true
@@ -347,7 +430,8 @@
                  #(#CheckBoxSpec
                     #label: 'Include Sources'
                     #name: 'CheckBox4'
-                    #layout: #(#LayoutFrame 0 0.0 94 0 0 1.0 116 0)
+                    #layout: #(#LayoutFrame 0 0.0 39 0 0 0.5 61 0)
+                    #activeHelpKey: #deliverSource
                     #tabable: true
                     #model: #deliverSources
                     #translateLabel: true
@@ -355,7 +439,8 @@
                  #(#CheckBoxSpec
                     #label: 'loadAll-File'
                     #name: 'CheckBox5'
-                    #layout: #(#LayoutFrame 0 0.0 122 0 0 1.0 144 0)
+                    #layout: #(#LayoutFrame 0 0.0 67 0 0 0.5 89 0)
+                    #activeHelpKey: #deliverLoadAll
                     #tabable: true
                     #model: #deliverLoadAllFile
                     #translateLabel: true
@@ -367,19 +452,81 @@
            #(#FramedBoxSpec
               #label: 'Install Directory'
               #name: 'FramedBox2'
-              #layout: #(#LayoutFrame 0 0.0 178 0 0 1.0 243 0)
+              #layout: #(#LayoutFrame 0 0.0 140 0 0 1.0 293 0)
               #labelPosition: #topLeft
               #translateLabel: true
               #component: 
              #(#SpecCollection
                 #collection: #(
+                 #(#LabelSpec
+                    #label: 'Unix:'
+                    #name: 'Label1'
+                    #layout: #(#LayoutFrame 0 0.0 5 0 60 0.0 27 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
                  #(#InputFieldSpec
                     #name: 'EntryField1'
-                    #layout: #(#LayoutFrame 0 0.0 6 0 0 1.0 28 0)
+                    #layout: #(#LayoutFrame 64 0.0 4 0 0 1.0 26 0)
+                    #activeHelpKey: #installDirUnix
+                    #enableChannel: #canDeliverForUnix
+                    #tabable: true
+                    #model: #installDirectoryUnix
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 #(#LabelSpec
+                    #label: 'Win32:'
+                    #name: 'Label2'
+                    #layout: #(#LayoutFrame 0 0.0 36 0 60 0.0 58 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField2'
+                    #layout: #(#LayoutFrame 64 0.0 34 0 0 1.0 56 0)
+                    #activeHelpKey: #installDirWin32
+                    #enableChannel: #canDeliverForWin32
                     #tabable: true
-                    #model: #installDirectory
+                    #model: #installDirectoryWin32
+                    #acceptChannel: #acceptChannel
                     #modifiedChannel: #modifiedChannel
+                  )
+                 #(#LabelSpec
+                    #label: 'VMS:'
+                    #name: 'Label3'
+                    #layout: #(#LayoutFrame 0 0.0 65 0 60 0.0 87 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField3'
+                    #layout: #(#LayoutFrame 64 0.0 63 0 0 1.0 85 0)
+                    #activeHelpKey: #installDirVMS
+                    #initiallyDisabled: true
+                    #enableChannel: #canDeliverForVMS
+                    #tabable: true
+                    #model: #installDirectoryVMS
                     #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 #(#LabelSpec
+                    #label: 'MacOS:'
+                    #name: 'Label4'
+                    #layout: #(#LayoutFrame 0 0.0 95 0 60 0.0 117 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField4'
+                    #layout: #(#LayoutFrame 64 0.0 93 0 0 1.0 115 0)
+                    #activeHelpKey: #installDirMacOS
+                    #initiallyDisabled: true
+                    #enableChannel: #canDeliverForMacOS
+                    #tabable: true
+                    #model: #installDirectoryMac
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
                   )
                  )
                
@@ -872,11 +1019,11 @@
        #(#WindowSpec
           #label: 'NewApplication'
           #name: 'NewApplication'
-          #layout: #(#LayoutFrame 21 0 21 0 320 0 364 0)
+          #layout: #(#LayoutFrame 119 0 158 0 479 0 520 0)
           #level: 0
           #min: #(#Point 10 10)
           #max: #(#Point 1280 1024)
-          #bounds: #(#Rectangle 21 21 321 365)
+          #bounds: #(#Rectangle 119 158 480 521)
           #usePreferredExtent: false
           #returnIsOKInDialog: true
           #escapeIsCancelInDialog: true
@@ -884,6 +1031,146 @@
         #component: 
        #(#SpecCollection
           #collection: #(
+           #(#FramedBoxSpec
+              #label: 'Project Type'
+              #name: 'FramedBox1'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 61 0)
+              #labelPosition: #topLeft
+              #translateLabel: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#RadioButtonSpec
+                    #label: 'Application'
+                    #name: 'RadioButton1'
+                    #layout: #(#LayoutFrame -1 0.0 5 0 0 0.5 27 0)
+                    #activeHelpKey: #appType
+                    #translateLabel: true
+                    #model: #projectType
+                    #isTriggerOnDown: true
+                    #select: #application
+                  )
+                 #(#RadioButtonSpec
+                    #label: 'Class Library'
+                    #name: 'RadioButton2'
+                    #layout: #(#LayoutFrame 0 0.5 5 0 0 1.0 27 0)
+                    #activeHelpKey: #libType
+                    #translateLabel: true
+                    #model: #projectType
+                    #isTriggerOnDown: true
+                    #select: #library
+                  )
+                 )
+               
+              )
+            )
+           #(#FramedBoxSpec
+              #label: 'Project Directory'
+              #name: 'FramedBox2'
+              #layout: #(#LayoutFrame 0 0.0 62 0.0 0 1.0 122 0)
+              #labelPosition: #topLeft
+              #translateLabel: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField1'
+                    #layout: #(#LayoutFrame 0 0.0 1 0 0 1.0 23 0)
+                    #activeHelpKey: #projectDir
+                    #enableChannel: #currentProjectWasNotLoadedFromFile
+                    #model: #projectDirectory
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 )
+               
+              )
+            )
+           #(#FramedBoxSpec
+              #label: 'Projects Package ID'
+              #name: 'FramedBox5'
+              #layout: #(#LayoutFrame 0 0.0 127 0.0 0 1.0 187 0)
+              #labelPosition: #topLeft
+              #translateLabel: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField5'
+                    #layout: #(#LayoutFrame 0 0.0 1 0 0 1.0 23 0)
+                    #activeHelpKey: #packageID
+                    #model: #projectPackage
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 )
+               
+              )
+            )
+           #(#FramedBoxSpec
+              #label: 'Repository'
+              #name: 'FramedBox3'
+              #layout: #(#LayoutFrame 0 0.0 191 0.0 0 1.0 274 0)
+              #labelPosition: #topLeft
+              #translateLabel: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'Module:'
+                    #name: 'Label1'
+                    #layout: #(#LayoutFrame 0 0 0 0 86 0 22 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField2'
+                    #layout: #(#LayoutFrame 92 0.0 0 0 0 1.0 22 0)
+                    #activeHelpKey: #repositoryModule
+                    #model: #repositoryModule
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 #(#LabelSpec
+                    #label: 'Directory:'
+                    #name: 'Label2'
+                    #layout: #(#LayoutFrame 0 0 25 0 86 0 47 0)
+                    #translateLabel: true
+                    #adjust: #right
+                  )
+                 #(#InputFieldSpec
+                    #name: 'EntryField3'
+                    #layout: #(#LayoutFrame 92 0.0 25 0 0 1.0 47 0)
+                    #activeHelpKey: #repositoryDirectory
+                    #model: #repositoryDirectory
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 )
+               
+              )
+            )
+           #(#FramedBoxSpec
+              #label: 'Default Namespace'
+              #name: 'FramedBox4'
+              #layout: #(#LayoutFrame 0 0.0 279 0 0 1.0 337 0)
+              #activeHelpKey: #defaultNamespace
+              #labelPosition: #topLeft
+              #translateLabel: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#InputFieldSpec
+                    #name: 'EntryField4'
+                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 22 0)
+                    #model: #projectNamespace
+                    #acceptChannel: #acceptChannel
+                    #modifiedChannel: #modifiedChannel
+                  )
+                 )
+               
+              )
+            )
            #(#HorizontalPanelViewSpec
               #name: 'HorizontalPanel1'
               #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
@@ -897,6 +1184,7 @@
                  #(#ActionButtonSpec
                     #label: 'Cancel'
                     #name: 'Button1'
+                    #activeHelpKey: #cancel
                     #translateLabel: true
                     #model: #cancel
                     #enableChannel: #modifiedChannel
@@ -906,6 +1194,7 @@
                  #(#ActionButtonSpec
                     #label: 'OK'
                     #name: 'Button2'
+                    #activeHelpKey: #accept
                     #translateLabel: true
                     #model: #accept
                     #enableChannel: #modifiedChannel
@@ -915,119 +1204,6 @@
                
               )
             )
-           #(#FramedBoxSpec
-              #label: 'Project Type'
-              #name: 'FramedBox1'
-              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 89 0)
-              #labelPosition: #topLeft
-              #translateLabel: true
-              #component: 
-             #(#SpecCollection
-                #collection: #(
-                 #(#RadioButtonSpec
-                    #label: 'Application'
-                    #name: 'RadioButton1'
-                    #layout: #(#LayoutFrame -1 0.0 10 0 135 0 32 0)
-                    #translateLabel: true
-                    #model: #projectType
-                    #isTriggerOnDown: true
-                    #select: #application
-                  )
-                 #(#RadioButtonSpec
-                    #label: 'Class Library'
-                    #name: 'RadioButton2'
-                    #layout: #(#LayoutFrame -1 0.0 38 0 135 0 60 0)
-                    #translateLabel: true
-                    #model: #projectType
-                    #isTriggerOnDown: true
-                    #select: #library
-                  )
-                 )
-               
-              )
-            )
-           #(#FramedBoxSpec
-              #label: 'Directory'
-              #name: 'FramedBox2'
-              #layout: #(#LayoutFrame 0 0.0 89 0.0 0 1.0 149 0)
-              #labelPosition: #topLeft
-              #translateLabel: true
-              #component: 
-             #(#SpecCollection
-                #collection: #(
-                 #(#InputFieldSpec
-                    #name: 'EntryField1'
-                    #layout: #(#LayoutFrame 0 0.0 4 0 0 1.0 26 0)
-                    #enableChannel: #currentProjectWasNotLoadedFromFile
-                    #model: #projectDirectory
-                    #modifiedChannel: #modifiedChannel
-                    #acceptChannel: #acceptChannel
-                  )
-                 )
-               
-              )
-            )
-           #(#FramedBoxSpec
-              #label: 'Repository'
-              #name: 'FramedBox3'
-              #layout: #(#LayoutFrame 0 0.0 152 0.0 0 1.0 235 0)
-              #labelPosition: #topLeft
-              #translateLabel: true
-              #component: 
-             #(#SpecCollection
-                #collection: #(
-                 #(#InputFieldSpec
-                    #name: 'EntryField2'
-                    #layout: #(#LayoutFrame 92 0.0 4 0 0 1.0 26 0)
-                    #model: #repositoryModule
-                    #modifiedChannel: #modifiedChannel
-                    #acceptChannel: #acceptChannel
-                  )
-                 #(#InputFieldSpec
-                    #name: 'EntryField3'
-                    #layout: #(#LayoutFrame 92 0.0 29 0 0 1.0 51 0)
-                    #model: #repositoryDirectory
-                    #modifiedChannel: #modifiedChannel
-                    #acceptChannel: #acceptChannel
-                  )
-                 #(#LabelSpec
-                    #label: 'Module:'
-                    #name: 'Label1'
-                    #layout: #(#LayoutFrame 7 0 4 0 86 0 26 0)
-                    #translateLabel: true
-                    #adjust: #right
-                  )
-                 #(#LabelSpec
-                    #label: 'Directory:'
-                    #name: 'Label2'
-                    #layout: #(#LayoutFrame 7 0 29 0 86 0 51 0)
-                    #translateLabel: true
-                    #adjust: #right
-                  )
-                 )
-               
-              )
-            )
-           #(#FramedBoxSpec
-              #label: 'Default Namespace'
-              #name: 'FramedBox4'
-              #layout: #(#LayoutFrame 0 0.0 236 0 0 1.0 294 0)
-              #labelPosition: #topLeft
-              #translateLabel: true
-              #component: 
-             #(#SpecCollection
-                #collection: #(
-                 #(#InputFieldSpec
-                    #name: 'EntryField4'
-                    #layout: #(#LayoutFrame 0 0.0 4 0 0 1.0 26 0)
-                    #model: #projectNamespace
-                    #modifiedChannel: #modifiedChannel
-                    #acceptChannel: #acceptChannel
-                  )
-                 )
-               
-              )
-            )
            )
          
         )
@@ -1296,6 +1472,11 @@
            #(#Menu
               #(
                #(#MenuItem
+                  #label: 'New'
+                  #translateLabel: true
+                  #value: #newProject
+                )
+               #(#MenuItem
                   #label: 'Load From...'
                   #translateLabel: true
                   #value: #openProject
@@ -1307,6 +1488,12 @@
                   #label: 'Save'
                   #translateLabel: true
                   #value: #saveProject
+                  #enabled: #hasProjectSelectedAndProjectFilenameHolder
+                )
+               #(#MenuItem
+                  #label: 'Save As...'
+                  #translateLabel: true
+                  #value: #saveProjectAs
                   #enabled: #hasProjectSelectedHolder
                 )
                #(#MenuItem
@@ -1733,6 +1920,79 @@
     "Created: / 23.3.1999 / 14:18:05 / cg"
 !
 
+canDeliverBinaryForMacOS
+    ^ OperatingSystem platformName == #macOS
+!
+
+canDeliverBinaryForUnix
+    ^ OperatingSystem platformName == #unix 
+!
+
+canDeliverBinaryForVMS
+    ^ OperatingSystem platformName == #vms 
+
+!
+
+canDeliverBinaryForWin32
+    ^ OperatingSystem platformName == #win32 
+!
+
+canDeliverForMacOS
+    |holder|
+
+    (holder := builder bindingAt:#canDeliverForMacOS) isNil ifTrue:[
+        holder := BlockValue 
+                        with:[:a1 :a2 | a1 or:[a2 not]] 
+                        arguments:(Array 
+                                        with:self canDeliverBinaryForMacOS
+                                        with:self deliverCompiledBinary).
+        builder aspectAt:#canDeliverForMacOS put:holder.
+    ].
+    ^ holder.
+!
+
+canDeliverForUnix
+    |holder|
+
+    (holder := builder bindingAt:#canDeliverForUnix) isNil ifTrue:[
+        holder := BlockValue 
+                        with:[:a1 :a2 | a1 or:[a2 not]] 
+                        arguments:(Array 
+                                        with:self canDeliverBinaryForUnix
+                                        with:self deliverCompiledBinary).
+        builder aspectAt:#canDeliverForUnix put:holder.
+    ].
+    ^ holder.
+!
+
+canDeliverForVMS
+    |holder|
+
+    (holder := builder bindingAt:#canDeliverForVMS) isNil ifTrue:[
+        holder := BlockValue 
+                        with:[:a1 :a2 | a1 or:[a2 not]] 
+                        arguments:(Array 
+                                        with:self canDeliverBinaryForVMS
+                                        with:self deliverCompiledBinary).
+        builder aspectAt:#canDeliverForVMS put:holder.
+    ].
+    ^ holder.
+!
+
+canDeliverForWin32
+    |holder|
+
+    (holder := builder bindingAt:#canDeliverForWin32) isNil ifTrue:[
+        holder := BlockValue 
+                        with:[:a1 :a2 | a1 or:[a2 not]] 
+                        arguments:(Array 
+                                        with:self canDeliverBinaryForWin32
+                                        with:self deliverCompiledBinary).
+        builder aspectAt:#canDeliverForWin32 put:holder.
+    ].
+    ^ holder.
+!
+
 canRemoveSelectedClassFromPrerequisites
     |holder|
 
@@ -1870,6 +2130,18 @@
     "Created: / 23.3.1999 / 14:18:05 / cg"
 !
 
+hasProjectSelectedAndProjectFilenameHolder
+    ^ [ |dir|
+
+        dir := self projectDirectory value asFilename.
+        (dir exists and:[dir isDirectory]) ifTrue:[
+            self hasProjectSelectedHolder value
+        ] ifFalse:[
+            false
+        ]
+    ].
+!
+
 hasProjectSelectedHolder
     |holder|
 
@@ -1899,13 +2171,27 @@
     ^ holder.
 !
 
-installDirectory
+installDirectoryUnix
     "automatically generated by UIPainter ..."
 
     |holder|
 
-    (holder := builder bindingAt:#installDirectory) isNil ifTrue:[
-        builder aspectAt:#installDirectory put:(holder := '/opt' asValue).
+    (holder := builder bindingAt:#installDirectoryUnix) isNil ifTrue:[
+        builder aspectAt:#installDirectoryUnix put:(holder := '/opt/smalltalk' asValue).
+        holder onChangeSend:#value to:[modifiedChannel value:true].
+    ].
+    ^ holder.
+
+    "Created: / 23.3.1999 / 14:18:05 / cg"
+!
+
+installDirectoryWin32
+    "automatically generated by UIPainter ..."
+
+    |holder|
+
+    (holder := builder bindingAt:#installDirectoryWin32) isNil ifTrue:[
+        builder aspectAt:#installDirectoryWin32 put:(holder := '\Programme\SmalltalkX' asValue).
         holder onChangeSend:#value to:[modifiedChannel value:true].
     ].
     ^ holder.
@@ -2052,6 +2338,24 @@
     "Created: / 23.3.1999 / 14:18:05 / cg"
 !
 
+projectPackage
+    |holder dir module|
+
+    (holder := builder bindingAt:#projectPackage) isNil ifTrue:[
+        builder aspectAt:#projectPackage put:(holder := '' asValue).
+    ].
+    holder value size == 0 ifTrue:[
+        (module := self repositoryModule value) notNil ifTrue:[
+            (dir := self repositoryDirectory value) notNil ifTrue:[
+                holder value:(module , ':' , dir)
+            ]
+        ]
+    ].
+    ^ holder.
+
+    "Created: / 23.3.1999 / 14:18:05 / cg"
+!
+
 projectTreeHolder
     "automatically generated by UIPainter ..."
 
@@ -2295,9 +2599,22 @@
     (manager := Smalltalk at:#SourceCodeManager) isNil ifTrue:[^ false].
 
     "/ does the repository contain the module/package ?
+    "/ since this is a slow operation (involving the CVS manager,
+    "/ remember checked modules here in a classVar
+    AlreadCheckedExistingModulesAndPackages isNil ifTrue:[
+        AlreadCheckedExistingModulesAndPackages := OrderedCollection new
+    ].
+    AlreadCheckedExistingModulesAndPackages do:[:entry |
+        (entry at:1) = moduleDir ifTrue:[
+            (entry at:2) = packageDir ifTrue:[
+                ^ true
+            ]
+        ]
+    ].
 
     (manager checkForExistingModule:moduleDir package:packageDir) ifFalse:[^ false].
 
+    AlreadCheckedExistingModulesAndPackages add:(Array with:moduleDir with:packageDir).
     ^ true
 !
 
@@ -2536,7 +2853,12 @@
         self deliverSources value:(p propertyAt:#deliverSources) ? false.
         self deliverLoadAllFile value:(p propertyAt:#deliverLoadAllFile) ? false.
 
-        self installDirectory value:(p propertyAt:#installDirectory) ? '/opt'.
+        self installDirectoryUnix 
+                value:(p propertyAt:#installDirectoryUnix) ? 
+                        ((p propertyAt:#installDirectory) ? '/opt/smalltalk').
+        self installDirectoryWin32 
+                value:(p propertyAt:#installDirectoryWin32) ? 
+                        ((p propertyAt:#installDirectory) ? '\Programme\SmalltalkX').
 
         l := p prerequisitePackages collect:[:entry |
                     |pName|
@@ -2563,7 +2885,7 @@
 !
 
 saveAspectsIntoProject
-    |p s ns|
+    |p s ns dir|
 
     p := self currentProject.
     p notNil ifTrue:[
@@ -2573,7 +2895,13 @@
 
 "/        self currentProjectWasNotLoadedFromFile value:p wasLoadedFromFile not.
         p type:self projectType value.
-"/        p directory:self projectDirectory value.
+
+        dir := self projectDirectory value asFilename.
+        (dir exists and:[dir isDirectory]) ifFalse:[
+            self warn:'Invalid project directory: ' , dir pathName
+        ].
+
+        p directory:self projectDirectory value.
 
         p repositoryModule:self repositoryModule value.
         p repositoryDirectory:self repositoryDirectory value.
@@ -2592,7 +2920,8 @@
         p propertyAt:#deliverGZipArchive put:self deliverGZipArchive value.
         p propertyAt:#deliverLoadAllFile put:self deliverLoadAllFile value.
 
-        p propertyAt:#installDirectory put:self installDirectory value.
+        p propertyAt:#installDirectoryUnix put:self installDirectoryUnix value.
+        p propertyAt:#installDirectoryWin32 put:self installDirectoryWin32 value.
         p prerequisiteClasses:(self listOfRequiredClassesInPrerequisites value
                                collect:[:entry | entry string asSymbol]).
 
@@ -2678,19 +3007,27 @@
 !
 
 addClassesFromFilesInDirectoryWithFilter:aFilterBlockOrNil
-    |project existingClasses prjDirectory anyChange|
+    |project existingClasses prjDirectory anyChange numSTFilesFound|
 
     project := self currentProject.
 
     existingClasses := project classInfo.
     anyChange := false.
+    numSTFilesFound := 0.
 
     prjDirectory := project directory asFilename.
+    (prjDirectory exists and:[prjDirectory isDirectory]) ifFalse:[
+        self warn:'Invalid project directory: ' , prjDirectory pathName.
+        ^ self
+    ].
+
     prjDirectory directoryContents do:[:fn |
         |f oldInfo cls|
 
         f := prjDirectory construct:fn.
         (f hasSuffix:'st') ifTrue:[
+            numSTFilesFound := numSTFilesFound + 1.
+
             oldInfo := existingClasses 
                             detect:[:clsInfo |
                                         clsInfo classFileName = fn
@@ -2717,8 +3054,13 @@
             ]
         ]
     ].
+
     anyChange ifTrue:[
         self updateClassListForProject:project
+    ] ifFalse:[
+        numSTFilesFound == 0 ifTrue:[
+            self information:'No st-sourcefiles found in ' , prjDirectory pathName.
+        ]
     ]
 !
 
@@ -3061,7 +3403,7 @@
 
                         w1Nm := w1 methodClass name.
                         w2Nm := w2 methodClass name.
-                        w1Nm < w2Nm methodClass name ifTrue:[
+                        w1Nm < w2Nm ifTrue:[
                             true
                         ] ifFalse:[
                             w1Nm = w2Nm ifFalse:[