packages/PackageDetails.st
changeset 1227 ab88e78f027c
child 1241 3a977bf0d483
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/PackageDetails.st	Wed Apr 09 13:26:19 2003 +0200
@@ -0,0 +1,2131 @@
+"{ Package: 'stx:libbasic3' }"
+
+"{ NameSpace: Packages }"
+
+AbstractPackageDetails subclass:#PackageDetails
+	instanceVariableNames:'selectedTabHolder canvasHolder tabListHolder tabApplications'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Package-Application'
+!
+
+AbstractPackageDetails subclass:#Class
+	instanceVariableNames:'classList selectedClassHolder categoryList selectedCategoryHolder
+		privateProcesses'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails
+!
+
+AbstractPackageDetails subclass:#Comment
+	instanceVariableNames:'commentTextHolder commentTextModifiedChannel
+		commentTextAcceptChannel editTextView'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails
+!
+
+AbstractPackageDetails subclass:#LooseMethod
+	instanceVariableNames:'methodSelectedHolder currentMethodSourceHolder methodList
+		tableColumns'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails
+!
+
+Object subclass:#PackageDetailsRow
+	instanceVariableNames:'model'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails::LooseMethod
+!
+
+AbstractPackageDetails subclass:#Prerequisites
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails
+!
+
+AbstractPackageDetails subclass:#Scripts
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:PackageDetails
+!
+
+
+!PackageDetails class methodsFor:'constant values'!
+
+applicationName
+    ^ 'No name' asSymbol
+! !
+
+!PackageDetails class methodsFor:'defaults'!
+
+tabsNames
+    ^ self tabsNamesAndClasses keys asOrderedCollection sort:[:x :y |
+            x < y
+      ]
+
+"/    ^ #( 
+"/            #(#'Classes'         #Classes)
+"/            #(#'Loose Methods'   #LooseMethod)
+"/            #(#'Scripts'         #Scripts)
+"/            #(#'Prerequisites'   #Prerequisites)
+"/            #(#'Comment'         #Comment)
+"/       ).
+!
+
+tabsNamesAndClasses
+    | dic |
+    dic := Dictionary new.
+
+    self privateClasses do:[:aPrivateClass |  
+            dic at:aPrivateClass applicationName  put:aPrivateClass name
+    ].                                       
+    ^ dic
+
+"/    ^ #( 
+"/            #(#'Classes'         #Classes)
+"/            #(#'Loose Methods'   #LooseMethod)
+"/            #(#'Scripts'         #Scripts)
+"/            #(#'Prerequisites'   #Prerequisites)
+"/            #(#'Comment'         #Comment)
+"/       ).
+! !
+
+!PackageDetails 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:Packages::PackageDetails andSelector:#windowSpec
+     Packages::PackageDetails new openInterface:#windowSpec
+     Packages::PackageDetails open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageDetails'
+          #name: 'Packages::PackageDetails'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 329 359)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#NoteBookViewSpec
+              #name: 'PackageDetailsNotebook'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #model: #selectedTabHolder
+              #menu: #tabListHolder
+              #selectConditionBlock: #packageDetailsChangeToTabNumber:
+              #canvas: #canvasHolder
+              #postBuildCallback: #selectInitialTab
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageDetails class methodsFor:'plugIn spec'!
+
+aspectSelectors
+    "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."
+
+    "Return a description of exported aspects;
+     these can be connected to aspects of an embedding application
+     (if this app is embedded in a subCanvas)."
+
+    ^ #(
+        #list
+        #selectionHolder
+      ).
+
+! !
+
+!PackageDetails methodsFor:'accessing'!
+
+selectedTab:aSymbol 
+    ^ self selectedTabHolder value:aSymbol
+!
+
+tabApplications
+    "return the value of the instance variable 'tabApplications' (automatically generated)"
+    tabApplications ifNil:[
+        tabApplications := Dictionary new
+    ].
+    ^ tabApplications
+!
+
+tabApplications:something
+    "set the value of the instance variable 'tabApplications' (automatically generated)"
+
+    tabApplications := something.
+! !
+
+!PackageDetails methodsFor:'actions'!
+
+packageDetailsChangeToTabNamed:aSymbol
+    "return a boolean validating if you can change the current selected
+     tab to the tab represented by aSymbol"
+    aSymbol == self selectedTab ifTrue:[
+        ^ self. "do nothing... dont think this can happen 
+                but it means that the #validateChangeTo: methods do not need this check!!"
+    ].
+    ^ (self instanceAtTab:self selectedTab) validateCanChange:(self instanceAtTab:aSymbol)
+!
+
+packageDetailsChangeToTabNumber:anInteger
+    "return a boolean validating if you can change the current selected
+     tab to the tab represented by anInteger"
+    ^ self packageDetailsChangeToTabNamed:(self tabListHolder value at:anInteger)
+!
+
+selectInitialTab
+    self selectedTab:self tabListHolder value first.
+! !
+
+!PackageDetails methodsFor:'aspects'!
+
+canvasHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    canvasHolder isNil ifTrue:[
+        canvasHolder := ValueHolder with:(SubCanvas new) .
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       canvasHolder addDependent:self.
+"/       canvasHolder onChangeSend:#canvasHolderChanged to:self.
+    ].
+    ^ canvasHolder.
+!
+
+selectedTab
+    ^ selectedTabHolder value
+!
+
+selectedTabHolder
+
+    selectedTabHolder isNil ifTrue:[
+        selectedTabHolder := ValueHolder new.
+       selectedTabHolder addDependent:self.
+       selectedTabHolder onChangeSend:#selectedTabHolderChanged to:self.
+    ].
+    ^ selectedTabHolder.
+!
+
+tabListHolder
+    "holds the names of the tab in a tabList"
+    tabListHolder isNil ifTrue:[
+        tabListHolder := ValueHolder with:(self class tabsNames).
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       tabList addDependent:self.
+"/       tabList onChangeSend:#tabListChanged to:self.
+    ].
+    ^ tabListHolder.
+! !
+
+!PackageDetails methodsFor:'aspects - exported'!
+
+list:something
+    "automatically generated by UIPainter ..."
+
+    "This method is used when I am embedded as subApplication,"
+    "and the mainApp wants to connect its aspects to mine."
+
+"/     list notNil ifTrue:[
+"/        list removeDependent:self.
+"/     ].
+    list := something.
+"/     list notNil ifTrue:[
+"/        list addDependent:self.
+"/     ].
+    ^ self.
+!
+
+selectionHolder:something
+    "automatically generated by UIPainter ..."
+
+    "This method is used when I am embedded as subApplication,"
+    "and the mainApp wants to connect its aspects to mine."
+
+"/     selectionHolder notNil ifTrue:[
+"/        selectionHolder removeDependent:self.
+"/     ].
+    selectionHolder := something.
+"/     selectionHolder notNil ifTrue:[
+"/        selectionHolder addDependent:self.
+"/     ].
+    ^ self.
+! !
+
+!PackageDetails methodsFor:'changes'!
+
+selectedTabHolderChanged
+    | instance |
+    instance := self instanceAtTab:self selectedTab.
+
+    instance ifNil:[
+        ^ self
+    ].
+    self canvasHolder value client:(instance).
+!
+
+updateWithPackages:packages
+! !
+
+!PackageDetails methodsFor:'factory'!
+
+applicationClassAt:aSymbol 
+    ^ Smalltalk classNamed:(self class tabsNamesAndClasses at:aSymbol).
+
+
+
+
+
+
+
+!
+
+instanceAtTab:aSymbol 
+    | anInstance |
+    ^ self tabApplications at:aSymbol ifAbsentPut:[
+        anInstance := (self applicationClassAt:aSymbol) new.
+        anInstance masterApplication:self.
+        anInstance
+    ].
+! !
+
+!PackageDetails methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    ^ super closeRequest
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::Class class methodsFor:'constant values'!
+
+applicationName
+    ^ 'Classes' asSymbol
+! !
+
+!PackageDetails::Class 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:Packages::PackageDetails::Class andSelector:#windowSpec
+     Packages::PackageDetails::Class new openInterface:#windowSpec
+     Packages::PackageDetails::Class open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageDetails::Class'
+          #name: 'Packages::PackageDetails::Class'
+          #visibilityChannel: #isVisible
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 329 359)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VariableHorizontalPanelSpec
+              #name: 'VariableHorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#SelectionInListModelViewSpec
+                    #name: 'SelectionInListModelView1'
+                    #model: #selectedCategoryHolder
+                    #hasHorizontalScrollBar: true
+                    #hasVerticalScrollBar: true
+                    #listModel: #categoryList
+                    #multipleSelectOk: true
+                    #useIndex: false
+                    #highlightMode: #line
+                  )
+                 #(#SelectionInListModelViewSpec
+                    #name: 'SelectedClassView'
+                    #model: #selectedClassHolder
+                    #hasHorizontalScrollBar: true
+                    #hasVerticalScrollBar: true
+                    #listModel: #classList
+                    #multipleSelectOk: true
+                    #useIndex: false
+                    #highlightMode: #line
+                  )
+                 )
+               
+              )
+              #handles: #(#Any 0.5 1.0)
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageDetails::Class class methodsFor:'menu specs'!
+
+mainMenu
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:Packages::PackageDetails::Class andSelector:#mainMenu
+    "
+
+    <resource: #menu>
+
+    ^ #(#Menu
+           #(
+             #(#MenuItem
+                #label: 'File'
+                #translateLabel: true
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'New'
+                          #translateLabel: true
+                          #value: #menuNew
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Open...'
+                          #translateLabel: true
+                          #value: #menuOpen
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Save'
+                          #translateLabel: true
+                          #value: #menuSave
+                      )
+                       #(#MenuItem
+                          #label: 'Save As...'
+                          #translateLabel: true
+                          #value: #menuSaveAs
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Exit'
+                          #translateLabel: true
+                          #value: #closeRequest
+                      )
+                    ) nil
+                    nil
+                )
+            )
+             #(#MenuItem
+                #label: 'Help'
+                #translateLabel: true
+                #startGroup: #right
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'Documentation'
+                          #translateLabel: true
+                          #value: #openDocumentation
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'About this Application'
+                          #translateLabel: true
+                          #value: #openAboutThisApplication
+                      )
+                    ) nil
+                    nil
+                )
+            )
+          ) nil
+          nil
+      )
+! !
+
+!PackageDetails::Class class methodsFor:'plugIn spec'!
+
+aspectSelectors
+    "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."
+
+    "Return a description of exported aspects;
+     these can be connected to aspects of an embedding application
+     (if this app is embedded in a subCanvas)."
+
+    ^ #(
+        #classList
+        #selectedClassHolder
+      ).
+
+! !
+
+!PackageDetails::Class methodsFor:'accessing'!
+
+declareDependents
+    super declareDependents
+!
+
+privateProcessesAt:aSymbol 
+    ^ (privateProcesses at:aSymbol ifAbsentPut:[[nil]fork]).
+!
+
+privateProcessesAt:aSymbol put:aProcess
+    ^ (privateProcesses at:aSymbol put:aProcess).
+! !
+
+!PackageDetails::Class methodsFor:'aspects'!
+
+categoryList
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    categoryList isNil ifTrue:[
+        categoryList := List new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       categoryList addDependent:self.
+"/       categoryList onChangeSend:#categoryListChanged to:self.
+    ].
+    ^ categoryList.
+!
+
+classList
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    classList isNil ifTrue:[
+        classList := List new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       classList addDependent:self.
+"/       classList onChangeSend:#classListChanged to:self.
+    ].
+    ^ classList.
+!
+
+selectedCategoryHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    selectedCategoryHolder isNil ifTrue:[
+        selectedCategoryHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+       selectedCategoryHolder addDependent:self.
+"/       selectedCategoryHolder onChangeSend:#selectedCategoryHolderChanged to:self.
+    ].
+    ^ selectedCategoryHolder.
+!
+
+selectedClassHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    selectedClassHolder isNil ifTrue:[
+        selectedClassHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       selectedClassHolder addDependent:self.
+"/       selectedClassHolder onChangeSend:#selectedClassHolderChanged to:self.
+    ].
+    ^ selectedClassHolder.
+! !
+
+!PackageDetails::Class methodsFor:'aspects - exported'!
+
+classList:something
+    "automatically generated by UIPainter ..."
+
+    "This method is used when I am embedded as subApplication,"
+    "and the mainApp wants to connect its aspects to mine."
+
+"/     classList notNil ifTrue:[
+"/        classList removeDependent:self.
+"/     ].
+    classList := something.
+"/     classList notNil ifTrue:[
+"/        classList addDependent:self.
+"/     ].
+    ^ self.
+!
+
+selectedClassHolder:something
+    "automatically generated by UIPainter ..."
+
+    "This method is used when I am embedded as subApplication,"
+    "and the mainApp wants to connect its aspects to mine."
+
+"/     selectedClassHolder notNil ifTrue:[
+"/        selectedClassHolder removeDependent:self.
+"/     ].
+    selectedClassHolder := something.
+"/     selectedClassHolder notNil ifTrue:[
+"/        selectedClassHolder addDependent:self.
+"/     ].
+    ^ self.
+! !
+
+!PackageDetails::Class methodsFor:'change & update'!
+
+selectedCategoryChanged:aCollectionOfCategories 
+    | addingToClassListCache count howManyBeforeUpdate |
+    (self privateProcessesAt:#selectedCategoryChanged:) terminate.
+    (self privateProcessesAt:#selectedCategoryChanged: put:[
+        classList removeAll.
+        addingToClassListCache := OrderedCollection new.
+        count := 0.
+        howManyBeforeUpdate := (self packagesSelected size / 2).
+        aCollectionOfCategories do:[:aCategoryName |
+            (self packagesNamed:self packagesSelected) do:[:aPackage |
+                addingToClassListCache addAll:((aPackage classesInCategory:aCategoryName) 
+                                                collect:[:aClass | aClass name]).
+            ].
+            count := count + 1.
+            count < howManyBeforeUpdate ifTrue:[
+                classList addAll:addingToClassListCache. 
+                addingToClassListCache removeAll. 
+                count := 0.
+            ].
+        ].
+        classList addAll:addingToClassListCache. "add the ones left over"
+        ] fork)
+!
+
+update:something with:aParameter from:changedObject
+
+    changedObject == selectedCategoryHolder ifTrue:[
+        self selectedCategoryChanged:aParameter        
+    ].
+
+    super update:something with:aParameter from:changedObject
+!
+
+updateWithPackages:packages
+    | classCategoryNames |
+    [
+    classList removeAll.
+    categoryList removeAll.
+    classCategoryNames := Set new.
+
+    packages do:[:aPackage |
+        classCategoryNames addAll:aPackage classCategories   
+    ].
+
+    categoryList addAll:classCategoryNames.
+    ] fork
+"/    packages do:[:aPackage |
+"/        categoryList addAll:aPackage classCategories   
+"/    ].
+! !
+
+!PackageDetails::Class methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is about to be
+     closed (this method has a chance to suppress the close).
+     See also #closeDownViews, which is invoked when the close is really done."
+
+    "/ change the code below as required ...
+    "/ Closing can be suppressed, by simply returning.
+    "/ The 'super closeRequest' at the end will initiate the real closeDown
+
+    ("self hasUnsavedChanges" true) ifTrue:[
+        (self confirm:(resources string:'Close without saving ?')) ifFalse:[
+            ^ self
+        ]
+    ].
+
+    ^ super closeRequest
+!
+
+initialize
+    privateProcesses := Dictionary new
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::Class methodsFor:'menu actions'!
+
+menuNew
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'new' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''new'' available.'.
+!
+
+menuOpen
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'open' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''open'' available.'.
+!
+
+menuSave
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'save' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''save'' available.'.
+!
+
+menuSaveAs
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'saveAs' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''saveAs'' available.'.
+!
+
+openAboutThisApplication
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-about' is selected."
+
+    "/ could open a customized aboutBox here ...
+    super openAboutThisApplication
+!
+
+openDocumentation
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-documentation' is selected."
+
+    "/ change below as required ...
+
+    "/ to open an HTML viewer on some document (under 'doc/online/<language>/' ):
+    HTMLDocumentView openFullOnDocumentationFile:'TOP.html'.
+
+    "/ add application-specific help files under the 'doc/online/<language>/help/appName'
+    "/ directory, and open a viewer with:
+    "/ HTMLDocumentView openFullOnDocumentationFile:'help/<MyApplication>/TOP.html'.
+! !
+
+!PackageDetails::Class methodsFor:'queries'!
+
+validateCanChange:arg 
+! !
+
+!PackageDetails::Comment class methodsFor:'constant values'!
+
+applicationName
+    ^ 'Comment' asSymbol
+! !
+
+!PackageDetails::Comment 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:Packages::PackageDetails::Comment andSelector:#windowSpec
+     Packages::PackageDetails::Comment new openInterface:#windowSpec
+     Packages::PackageDetails::Comment open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageDetails::Comment'
+          #name: 'Packages::PackageDetails::Comment'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 329 359)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#TextEditorSpec
+              #name: 'TextEditor1'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #model: #commentTextHolder
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #modifiedChannel: #commentTextModifiedChannel
+              #acceptCallBack: #commentAccepted:
+              #postBuildCallback: #commentTextEditorCreated:
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageDetails::Comment methodsFor:'accessing'!
+
+declareDependents
+    super declareDependents
+! !
+
+!PackageDetails::Comment methodsFor:'aspects'!
+
+commentTextAcceptChannel
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    commentTextAcceptChannel isNil ifTrue:[
+        commentTextAcceptChannel := TriggerValue new.
+    ].
+    ^ commentTextAcceptChannel.
+!
+
+commentTextHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    commentTextHolder isNil ifTrue:[
+        commentTextHolder := '' asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       commentTextHolder addDependent:self.
+"/       commentTextHolder onChangeSend:#commentTextHolderChanged to:self.
+    ].
+    ^ commentTextHolder.
+!
+
+commentTextModifiedChannel
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    commentTextModifiedChannel isNil ifTrue:[
+        commentTextModifiedChannel := TriggerValue new.
+    ].
+    ^ commentTextModifiedChannel.
+! !
+
+!PackageDetails::Comment methodsFor:'callbacks'!
+
+commentAccepted:aStringCollection 
+    |packagesSelected|
+    (packagesSelected := self packagesSelected) size > 1 ifTrue:[
+        Smalltalk beep.
+        ^ self.
+    ].
+
+    (self packagesNamed:self packagesSelected) first packageComment:aStringCollection asString.
+!
+
+commentTextEditorCreated:aScrolledViewWithTextEditor 
+    "do with the text editor widget as you will...."
+    editTextView := aScrolledViewWithTextEditor scrolledView.
+
+! !
+
+!PackageDetails::Comment methodsFor:'change & update'!
+
+packagesSelectedHolderChanged:aCollection 
+    |packagesSelected|
+    (packagesSelected := self packagesSelected) size > 1 ifTrue:[
+        commentTextHolder value:self commentForMultiplePackageSelect.
+        commentTextModifiedChannel value:false.
+        ^ self
+    ].
+
+    commentTextHolder value:(self packagesNamed:self packagesSelected) first packageComment.
+!
+
+validateCanChange:arg 
+! !
+
+!PackageDetails::Comment methodsFor:'defaults'!
+
+commentForMultiplePackageSelect
+    ^ String new
+! !
+
+!PackageDetails::Comment methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is about to be
+     closed (this method has a chance to suppress the close).
+     See also #closeDownViews, which is invoked when the close is really done."
+
+    "/ change the code below as required ...
+    "/ Closing can be suppressed, by simply returning.
+    "/ The 'super closeRequest' at the end will initiate the real closeDown
+
+    ("self hasUnsavedChanges" true) ifTrue:[
+        (self confirm:(resources string:'Close without saving ?')) ifFalse:[
+            ^ self
+        ]
+    ].
+
+    ^ super closeRequest
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::LooseMethod class methodsFor:'constant values'!
+
+applicationName
+    ^ 'Loose Method' asSymbol
+! !
+
+!PackageDetails::LooseMethod 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:Packages::PackageDetails::LooseMethod andSelector:#windowSpec
+     Packages::PackageDetails::LooseMethod new openInterface:#windowSpec
+     Packages::PackageDetails::LooseMethod open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageDetails::LooseMethod'
+          #name: 'Packages::PackageDetails::LooseMethod'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 329 359)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VariableVerticalPanelSpec
+              #name: 'VariableVerticalPanel1'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#DataSetSpec
+                    #name: 'Table1'
+                    #model: #methodSelectedHolder
+                    #hasHorizontalScrollBar: true
+                    #hasVerticalScrollBar: true
+                    #dataList: #methodList
+                    #has3Dsepartors: false
+                    #columnHolder: #tableColumns
+                    #multipleSelectOk: true
+                    #verticalSpacing: 0
+                  )
+                 #(#TextEditorSpec
+                    #name: 'SourceEditor'
+                    #model: #currentMethodSourceHolder
+                    #hasHorizontalScrollBar: true
+                    #hasVerticalScrollBar: true
+                  )
+                 )
+               
+              )
+              #handles: #(#Any 0.5 1.0)
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageDetails::LooseMethod class methodsFor:'menu specs'!
+
+mainMenu
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:Packages::PackageDetails::LooseMethod andSelector:#mainMenu
+    "
+
+    <resource: #menu>
+
+    ^ #(#Menu
+           #(
+             #(#MenuItem
+                #label: 'File'
+                #translateLabel: true
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'New'
+                          #translateLabel: true
+                          #value: #menuNew
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Open...'
+                          #translateLabel: true
+                          #value: #menuOpen
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Save'
+                          #translateLabel: true
+                          #value: #menuSave
+                      )
+                       #(#MenuItem
+                          #label: 'Save As...'
+                          #translateLabel: true
+                          #value: #menuSaveAs
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Exit'
+                          #translateLabel: true
+                          #value: #closeRequest
+                      )
+                    ) nil
+                    nil
+                )
+            )
+             #(#MenuItem
+                #label: 'Help'
+                #translateLabel: true
+                #startGroup: #right
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'Documentation'
+                          #translateLabel: true
+                          #value: #openDocumentation
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'About this Application'
+                          #translateLabel: true
+                          #value: #openAboutThisApplication
+                      )
+                    ) nil
+                    nil
+                )
+            )
+          ) nil
+          nil
+      )
+! !
+
+!PackageDetails::LooseMethod class methodsFor:'tableColumns specs'!
+
+tableColumns
+    "This resource specification was automatically generated
+     by the DataSetBuilder of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the DataSetBuilder may not be able to read the specification."
+
+    "
+     DataSetBuilder new openOnClass:Packages::PackageDetails::LooseMethod andSelector:#tableColumns
+    "
+
+    <resource: #tableColumns>
+
+    ^#(
+      #(#DataSetColumnSpec
+         #label: ''
+         #id: 'Icon'
+         #labelButtonType: #Button
+         #model: #icon
+         #canSelect: false
+         #showRowSeparator: false
+         #showColSeparator: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Selector'
+         #id: 'Selector'
+         #labelAlignment: #left
+         #labelButtonType: #Button
+         #model: #selector
+         #canSelect: false
+         #showRowSeparator: false
+         #showColSeparator: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Class'
+         #id: 'Class'
+         #labelAlignment: #left
+         #labelButtonType: #Button
+         #model: #myClass
+         #canSelect: false
+         #showRowSeparator: false
+         #showColSeparator: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Package'
+         #id: 'Package'
+         #labelButtonType: #Button
+         #model: #myPackage
+         #canSelect: false
+         #showRowSeparator: false
+         #showColSeparator: false
+       )
+      )
+!
+
+tableColumnsOld
+    "This resource specification was automatically generated
+     by the DataSetBuilder of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the DataSetBuilder may not be able to read the specification."
+
+    "
+     DataSetBuilder new openOnClass:Packages::PackageDetails::LooseMethod andSelector:#tableColumns
+    "
+
+    <resource: #tableColumns>
+
+    ^#(
+      #(#DataSetColumnSpec
+         #label: ''
+         #id: 'Icon'
+         #labelButtonType: #Button
+         #model: #icon
+         #canSelect: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Selector'
+         #id: 'Selector'
+         #labelAlignment: #left
+         #labelButtonType: #Button
+         #model: #selector
+         #canSelect: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Class'
+         #id: 'Class'
+         #labelAlignment: #left
+         #labelButtonType: #Button
+         #model: #myClass
+         #canSelect: false
+       )
+      #(#DataSetColumnSpec
+         #label: 'Package'
+         #id: 'Package'
+         #labelButtonType: #Button
+         #model: #myPackage
+         #canSelect: false
+       )
+      )
+! !
+
+!PackageDetails::LooseMethod methodsFor:'accessing'!
+
+currentMethodSource:aString 
+    self currentMethodSourceHolder value:aString
+!
+
+declareDependents
+    super declareDependents
+! !
+
+!PackageDetails::LooseMethod methodsFor:'aspects'!
+
+currentMethodSourceHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    currentMethodSourceHolder isNil ifTrue:[
+        currentMethodSourceHolder := '' asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       currentMethodSourceHolder addDependent:self.
+"/       currentMethodSourceHolder onChangeSend:#currentMethodSourceHolderChanged to:self.
+    ].
+    ^ currentMethodSourceHolder.
+!
+
+methodList
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    methodList isNil ifTrue:[
+        methodList := List new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       methodList addDependent:self.
+"/       methodList onChangeSend:#methodListChanged to:self.
+    ].
+    ^ methodList.
+!
+
+methodSelectedHolder
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    methodSelectedHolder isNil ifTrue:[
+        methodSelectedHolder := ValueHolder new.
+        methodSelectedHolder onChangeEvaluate:[| methodSelectedHolderValue|
+            (methodSelectedHolderValue := methodSelectedHolder value) ifNotNil:[
+                self currentMethodSourceChangedToIndex:methodSelectedHolderValue
+            ].
+
+        ]
+    ].
+    ^ methodSelectedHolder.
+!
+
+tableColumns
+    "automatically generated by UIPainter ..."
+
+    "*** the code below creates a default model when invoked."
+    "*** (which may not be the one you wanted)"
+    "*** Please change as required and accept it in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    tableColumns isNil ifTrue:[
+        tableColumns := self class tableColumns asValue.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       tableColumns addDependent:self.
+"/       tableColumns onChangeSend:#tableColumnsChanged to:self.
+    ].
+    ^ tableColumns.
+! !
+
+!PackageDetails::LooseMethod methodsFor:'change & update'!
+
+currentMethodSourceChangedToIndex:aCollection
+    | currentPackageDetailsRow |
+    aCollection size > 1 ifTrue:[
+        self currentMethodSource: self moreThanOneMethodCode.
+        ^ self.
+    ].
+    currentPackageDetailsRow := (self methodList at:aCollection first).
+    self currentMethodSourceHolder value:(currentPackageDetailsRow model source).
+!
+
+updateWithPackages:packages
+    | methodNames |
+    methodList removeAll.
+    currentMethodSourceHolder value:String new.
+    methodNames := OrderedCollection new.
+
+    packages do:[:aPackage | 
+        methodNames addAll:(aPackage looseMethods collect:[:aMethod| self newPackageDetailsRowWithModel:aMethod]).   
+    ].
+
+    methodList addAll:methodNames.
+!
+
+validateCanChange:arg 
+! !
+
+!PackageDetails::LooseMethod methodsFor:'defaults'!
+
+moreThanOneMethodCode
+    ^ String new
+! !
+
+!PackageDetails::LooseMethod methodsFor:'factory'!
+
+newPackageDetailsRowWithModel:aModel 
+    ^ PackageDetailsRow new model: aModel
+! !
+
+!PackageDetails::LooseMethod methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is about to be
+     closed (this method has a chance to suppress the close).
+     See also #closeDownViews, which is invoked when the close is really done."
+
+    "/ change the code below as required ...
+    "/ Closing can be suppressed, by simply returning.
+    "/ The 'super closeRequest' at the end will initiate the real closeDown
+
+    ("self hasUnsavedChanges" true) ifTrue:[
+        (self confirm:(resources string:'Close without saving ?')) ifFalse:[
+            ^ self
+        ]
+    ].
+
+    ^ super closeRequest
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::LooseMethod methodsFor:'menu actions'!
+
+menuNew
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'new' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''new'' available.'.
+!
+
+menuOpen
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'open' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''open'' available.'.
+!
+
+menuSave
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'save' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''save'' available.'.
+!
+
+menuSaveAs
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'saveAs' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''saveAs'' available.'.
+!
+
+openAboutThisApplication
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-about' is selected."
+
+    "/ could open a customized aboutBox here ...
+    super openAboutThisApplication
+!
+
+openDocumentation
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-documentation' is selected."
+
+    "/ change below as required ...
+
+    "/ to open an HTML viewer on some document (under 'doc/online/<language>/' ):
+    HTMLDocumentView openFullOnDocumentationFile:'TOP.html'.
+
+    "/ add application-specific help files under the 'doc/online/<language>/help/appName'
+    "/ directory, and open a viewer with:
+    "/ HTMLDocumentView openFullOnDocumentationFile:'help/<MyApplication>/TOP.html'.
+! !
+
+!PackageDetails::LooseMethod::PackageDetailsRow methodsFor:'accessing'!
+
+icon
+    "automatically generated by DataSetBuilder ..."
+
+    "get value"
+
+    ^ ''
+!
+
+model
+    "return the value of the instance variable 'model' (automatically generated)"
+
+    ^ model
+!
+
+model:arg 
+    model:= arg.
+!
+
+myClass
+    "automatically generated by DataSetBuilder ..."
+
+    "get value"
+
+    ^ model mclass
+!
+
+myPackage
+    "automatically generated by DataSetBuilder ..."
+
+    "get value"
+
+    ^ model package
+!
+
+selector
+    "automatically generated by DataSetBuilder ..."
+
+    "get value"
+
+    ^ model selector
+! !
+
+!PackageDetails::Prerequisites class methodsFor:'constant values'!
+
+applicationName
+    ^ 'Prerequisites' asSymbol
+! !
+
+!PackageDetails::Prerequisites class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:Packages::PackageDetails::Prerequisites andSelector:#windowSpec
+    "
+
+    <resource: #canvas>
+
+    ^ #(#FullSpec
+          #window: 
+           #(#WindowSpec
+              #name: 'Packages::PackageDetails::Prerequisites'
+              #layout: #(#LayoutFrame 204 0 162 0 503 0 461 0)
+              #label: 'Packages::PackageDetails::Prerequisites'
+              #min: #(#Point 10 10)
+              #max: #(#Point 1024 768)
+              #bounds: #(#Rectangle 204 162 504 462)
+              #menu: #mainMenu
+              #usePreferredExtent: false
+          )
+          #component: 
+           #(#SpecCollection
+              #collection: #()
+          )
+      )
+! !
+
+!PackageDetails::Prerequisites class methodsFor:'menu specs'!
+
+mainMenu
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:Packages::PackageDetails::Prerequisites andSelector:#mainMenu
+    "
+
+    <resource: #menu>
+
+    ^ #(#Menu
+           #(
+             #(#MenuItem
+                #label: 'File'
+                #translateLabel: true
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'New'
+                          #translateLabel: true
+                          #value: #menuNew
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Open...'
+                          #translateLabel: true
+                          #value: #menuOpen
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Save'
+                          #translateLabel: true
+                          #value: #menuSave
+                      )
+                       #(#MenuItem
+                          #label: 'Save As...'
+                          #translateLabel: true
+                          #value: #menuSaveAs
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Exit'
+                          #translateLabel: true
+                          #value: #closeRequest
+                      )
+                    ) nil
+                    nil
+                )
+            )
+             #(#MenuItem
+                #label: 'Help'
+                #translateLabel: true
+                #startGroup: #right
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'Documentation'
+                          #translateLabel: true
+                          #value: #openDocumentation
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'About this Application'
+                          #translateLabel: true
+                          #value: #openAboutThisApplication
+                      )
+                    ) nil
+                    nil
+                )
+            )
+          ) nil
+          nil
+      )
+! !
+
+!PackageDetails::Prerequisites methodsFor:'accessing'!
+
+declareDependents
+    super declareDependents
+! !
+
+!PackageDetails::Prerequisites methodsFor:'change & update'!
+
+packagesSelectedHolderChanged:aCollection 
+!
+
+validateCanChange:arg 
+! !
+
+!PackageDetails::Prerequisites methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is about to be
+     closed (this method has a chance to suppress the close).
+     See also #closeDownViews, which is invoked when the close is really done."
+
+    "/ change the code below as required ...
+    "/ Closing can be suppressed, by simply returning.
+    "/ The 'super closeRequest' at the end will initiate the real closeDown
+
+    ("self hasUnsavedChanges" true) ifTrue:[
+        (self confirm:(resources string:'Close without saving ?')) ifFalse:[
+            ^ self
+        ]
+    ].
+
+    ^ super closeRequest
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::Prerequisites methodsFor:'menu actions'!
+
+menuNew
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'new' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''new'' available.'.
+!
+
+menuOpen
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'open' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''open'' available.'.
+!
+
+menuSave
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'save' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''save'' available.'.
+!
+
+menuSaveAs
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'saveAs' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''saveAs'' available.'.
+!
+
+openAboutThisApplication
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-about' is selected."
+
+    "/ could open a customized aboutBox here ...
+    super openAboutThisApplication
+!
+
+openDocumentation
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-documentation' is selected."
+
+    "/ change below as required ...
+
+    "/ to open an HTML viewer on some document (under 'doc/online/<language>/' ):
+    HTMLDocumentView openFullOnDocumentationFile:'TOP.html'.
+
+    "/ add application-specific help files under the 'doc/online/<language>/help/appName'
+    "/ directory, and open a viewer with:
+    "/ HTMLDocumentView openFullOnDocumentationFile:'help/<MyApplication>/TOP.html'.
+! !
+
+!PackageDetails::Scripts class methodsFor:'constant values'!
+
+applicationName
+    ^ 'Scripts' asSymbol
+! !
+
+!PackageDetails::Scripts class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:Packages::PackageDetails::Scripts andSelector:#windowSpec
+    "
+
+    <resource: #canvas>
+
+    ^ #(#FullSpec
+          #window: 
+           #(#WindowSpec
+              #name: 'Packages::PackageDetails::Scripts'
+              #layout: #(#LayoutFrame 204 0 162 0 503 0 461 0)
+              #label: 'Packages::PackageDetails::Scripts'
+              #min: #(#Point 10 10)
+              #max: #(#Point 1024 768)
+              #bounds: #(#Rectangle 204 162 504 462)
+              #menu: #mainMenu
+              #usePreferredExtent: false
+          )
+          #component: 
+           #(#SpecCollection
+              #collection: #()
+          )
+      )
+! !
+
+!PackageDetails::Scripts class methodsFor:'menu specs'!
+
+mainMenu
+    "This resource specification was automatically generated by the CodeGeneratorTool."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:Packages::PackageDetails::Scripts andSelector:#mainMenu
+    "
+
+    <resource: #menu>
+
+    ^ #(#Menu
+           #(
+             #(#MenuItem
+                #label: 'File'
+                #translateLabel: true
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'New'
+                          #translateLabel: true
+                          #value: #menuNew
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Open...'
+                          #translateLabel: true
+                          #value: #menuOpen
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Save'
+                          #translateLabel: true
+                          #value: #menuSave
+                      )
+                       #(#MenuItem
+                          #label: 'Save As...'
+                          #translateLabel: true
+                          #value: #menuSaveAs
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'Exit'
+                          #translateLabel: true
+                          #value: #closeRequest
+                      )
+                    ) nil
+                    nil
+                )
+            )
+             #(#MenuItem
+                #label: 'Help'
+                #translateLabel: true
+                #startGroup: #right
+                #submenu: 
+                 #(#Menu
+                     #(
+                       #(#MenuItem
+                          #label: 'Documentation'
+                          #translateLabel: true
+                          #value: #openDocumentation
+                      )
+                       #(#MenuItem
+                          #label: '-'
+                      )
+                       #(#MenuItem
+                          #label: 'About this Application'
+                          #translateLabel: true
+                          #value: #openAboutThisApplication
+                      )
+                    ) nil
+                    nil
+                )
+            )
+          ) nil
+          nil
+      )
+! !
+
+!PackageDetails::Scripts methodsFor:'accessing'!
+
+declareDependents
+    super declareDependents
+! !
+
+!PackageDetails::Scripts methodsFor:'change & update'!
+
+packagesSelectedHolderChanged:aCollection 
+    self halt.
+!
+
+validateCanChange:arg 
+! !
+
+!PackageDetails::Scripts methodsFor:'initialization & release'!
+
+closeDownViews
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is really closed.
+     See also #closeDownViews, which is invoked before and may suppress the close
+     or ask the user for confirmation."
+
+    "/ change the code below as required ...
+    "/ This should cleanup any leftover resources
+    "/ (for example, temporary files)
+    "/ super closeRequest will initiate the closeDown
+
+    "/ add your code here
+
+    "/ do not remove the one below ...
+    ^ super closeDownViews
+!
+
+closeRequest
+    "This is a hook method generated by the Browser.
+     It will be invoked when your app/dialog-window is about to be
+     closed (this method has a chance to suppress the close).
+     See also #closeDownViews, which is invoked when the close is really done."
+
+    "/ change the code below as required ...
+    "/ Closing can be suppressed, by simply returning.
+    "/ The 'super closeRequest' at the end will initiate the real closeDown
+
+    ("self hasUnsavedChanges" true) ifTrue:[
+        (self confirm:(resources string:'Close without saving ?')) ifFalse:[
+            ^ self
+        ]
+    ].
+
+    ^ super closeRequest
+!
+
+postBuildWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked during the initialization of your app/dialog,
+     after all of the visual components have been built, 
+     but BEFORE the top window is made visible.
+     Add any app-specific actions here (reading files, setting up values etc.)
+     See also #postOpenWith:, which is invoked after opening."
+
+    "/ add any code here ...
+
+    ^ super postBuildWith:aBuilder
+!
+
+postOpenWith:aBuilder
+    "This is a hook method generated by the Browser.
+     It will be invoked right after the applications window has been opened.
+     Add any app-specific actions here (starting background processes etc.).
+     See also #postBuildWith:, which is invoked before opening."
+
+    "/ add any code here ...
+
+    ^ super postOpenWith:aBuilder
+! !
+
+!PackageDetails::Scripts methodsFor:'menu actions'!
+
+menuNew
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'new' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''new'' available.'.
+!
+
+menuOpen
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'open' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''open'' available.'.
+!
+
+menuSave
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'save' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''save'' available.'.
+!
+
+menuSaveAs
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'saveAs' is selected."
+
+    "/ change below and add any actions as required here ...
+    self warn:'no action for ''saveAs'' available.'.
+!
+
+openAboutThisApplication
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-about' is selected."
+
+    "/ could open a customized aboutBox here ...
+    super openAboutThisApplication
+!
+
+openDocumentation
+    "This method was generated by the Browser.
+     It will be invoked when the menu-item 'help-documentation' is selected."
+
+    "/ change below as required ...
+
+    "/ to open an HTML viewer on some document (under 'doc/online/<language>/' ):
+    HTMLDocumentView openFullOnDocumentationFile:'TOP.html'.
+
+    "/ add application-specific help files under the 'doc/online/<language>/help/appName'
+    "/ directory, and open a viewer with:
+    "/ HTMLDocumentView openFullOnDocumentationFile:'help/<MyApplication>/TOP.html'.
+! !
+
+!PackageDetails class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic3/packages/PackageDetails.st,v 1.1 2003-04-09 11:24:54 james Exp $'
+! !