initial checkin
authorjames
Wed, 09 Apr 2003 13:26:19 +0200
changeset 1227 ab88e78f027c
parent 1226 adff4760750f
child 1228 924001ce0214
initial checkin
packages/AbstractPackageBrowser.st
packages/PackageBrowser.st
packages/PackageDetails.st
packages/PackageSelector.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/AbstractPackageBrowser.st	Wed Apr 09 13:26:19 2003 +0200
@@ -0,0 +1,89 @@
+"{ Package: 'stx:libbasic3' }"
+
+"{ NameSpace: Packages }"
+
+ApplicationModel subclass:#AbstractPackageBrowser
+	instanceVariableNames:'applicationAspects'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Package-Application'
+!
+
+
+!AbstractPackageBrowser methodsFor:'accessing'!
+
+applicationAspects
+    applicationAspects ifNil:[
+        applicationAspects := Dictionary new
+    ].
+    ^ applicationAspects
+!
+
+applicationAspects:something
+    "set the value of the instance variable 'applicationAspects' (automatically generated)"
+
+    applicationAspects := something.
+!
+
+declareDependents
+!
+
+masterApplication:aMasterApplication
+    aMasterApplication ifNil:[
+        ^ self.
+    ].
+    
+    self applicationAspects: aMasterApplication applicationAspects.
+    self declareDependents.
+    ^ super masterApplication:aMasterApplication.
+!
+
+packagesNamed:aCollectionOfPackageNamesOrSymbol 
+    |aCollectionOfPackageNames|
+    aCollectionOfPackageNames := aCollectionOfPackageNamesOrSymbol.
+    aCollectionOfPackageNames isSymbol ifTrue:[
+        aCollectionOfPackageNames := Array with:aCollectionOfPackageNamesOrSymbol.
+    ].
+
+    ^ self packageManager packagesNamed:aCollectionOfPackageNames
+!
+
+packagesSelected
+    ^ self packagesSelectedHolder value
+! !
+
+!AbstractPackageBrowser methodsFor:'accessing - shared'!
+
+applicationAspectsAt:anIdentifier ifAbsent:aBlock
+    ^ self applicationAspects at:anIdentifier ifAbsent:aBlock
+!
+
+applicationAspectsAt:aSymbol ifAbsentPut:anObject
+    ^ self applicationAspects at:aSymbol ifAbsentPut:anObject
+!
+
+applicationAspectsAt:anIdentifier put:anObject
+    ^ self applicationAspects at:anIdentifier put:anObject
+!
+
+packageManager
+    ^ self applicationAspectsAt:#packageManager ifAbsent:[nil]
+!
+
+packageManager:aPackageManager
+    ^ self applicationAspectsAt:#packageManager put:aPackageManager
+!
+
+packagesSelectedHolder
+    ^ self applicationAspectsAt:#packagesSelectedHolder ifAbsent:[ValueHolder new]
+!
+
+packagesSelectedHolder:aPackageManager
+    ^ self applicationAspectsAt:#packagesSelectedHolder put:aPackageManager
+! !
+
+!AbstractPackageBrowser class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic3/packages/AbstractPackageBrowser.st,v 1.1 2003-04-09 11:25:37 james Exp $'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/PackageBrowser.st	Wed Apr 09 13:26:19 2003 +0200
@@ -0,0 +1,520 @@
+"{ Package: 'stx:libbasic3' }"
+
+"{ NameSpace: Packages }"
+
+AbstractPackageBrowser subclass:#PackageBrowser
+	instanceVariableNames:'packageSelectorSelectionHolder packageDetailsApplicationHolder
+		packageSelectorApplicationHolder'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Package-Application'
+!
+
+!PackageBrowser class methodsFor:'documentation'!
+
+documentation
+"
+    documentation to be added.
+
+    [author:]
+         (james@miraculix)
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+!
+
+examples
+"
+  Starting the application:
+                                                                [exBegin]
+    Packages::PackageBrowser open
+
+                                                                [exEnd]
+
+  more examples to be added:
+                                                                [exBegin]
+    ... add code fragment for 
+    ... executable example here ...
+                                                                [exEnd]
+"
+!
+
+history
+    "Created: / 19.3.2003 / 11:23:18 / james"
+! !
+
+!PackageBrowser 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::PackageBrowser andSelector:#windowSpec
+     Packages::PackageBrowser new openInterface:#windowSpec
+     Packages::PackageBrowser open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageBrowser'
+          #name: 'Packages::PackageBrowser'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 777 532)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VariableHorizontalPanelSpec
+              #name: 'VariableHorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+              #showHandle: true
+              #snapMode: #both
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#SubCanvasSpec
+                    #name: 'PackageSelector'
+                    #hasHorizontalScrollBar: false
+                    #hasVerticalScrollBar: false
+                    #majorKey: #'Packages::PackageSelector'
+                    #subAspectHolders: 
+                   #(#Array
+                      
+                     #(#SubChannelInfoSpec
+                        #subAspect: #packagesSelectedHolder
+                        #aspect: #packagesSelectedHolder
+                      )
+                    )
+                    #createNewApplication: true
+                    #createNewBuilder: true
+                    #postBuildCallback: #packageSelectorCreated:
+                  )
+                 #(#SubCanvasSpec
+                    #name: 'PackageDetails'
+                    #hasHorizontalScrollBar: false
+                    #hasVerticalScrollBar: false
+                    #majorKey: #'Packages::PackageDetails'
+                    #createNewApplication: true
+                    #createNewBuilder: true
+                    #postBuildCallback: #packageDetailsCreated:
+                  )
+                 )
+               
+              )
+              #handles: #(#Any 0.260695 1.0)
+            )
+           )
+         
+        )
+      )
+!
+
+windowSpecXXX
+    "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::PackageBrowser andSelector:#windowSpec
+     Packages::PackageBrowser new openInterface:#windowSpec
+     Packages::PackageBrowser open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageBrowser'
+          #name: 'Packages::PackageBrowser'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 598 359)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#VariableHorizontalPanelSpec
+              #name: 'VariableHorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#SubCanvasSpec
+                    #name: 'PackageSelector'
+                    #hasHorizontalScrollBar: false
+                    #hasVerticalScrollBar: false
+                    #majorKey: #'Packages::PackageSelector'
+                    #subAspectHolders: 
+                   #(#Array
+                      
+                     #(#SubChannelInfoSpec
+                        #subAspect: #list
+                        #aspect: #packageSelectorListHolder
+                      ) 
+                     #(#SubChannelInfoSpec
+                        #subAspect: #selectionHolder
+                        #aspect: #packageSelectorSelectionHolder
+                      )
+                    )
+                    #createNewApplication: true
+                    #createNewBuilder: true
+                    #postBuildCallback: #packageSelectorCreated:
+                  )
+                 #(#SubCanvasSpec
+                    #name: 'PackageDetails'
+                    #hasHorizontalScrollBar: false
+                    #hasVerticalScrollBar: false
+                    #majorKey: #'Packages::PackageDetails'
+                    #subAspectHolders: 
+                   #(#Array
+                      
+                     #(#SubChannelInfoSpec
+                        #subAspect: #list
+                        #aspect: #packageDetailsListHolder
+                      ) 
+                     #(#SubChannelInfoSpec
+                        #subAspect: #selectionHolder
+                        #aspect: #packageDetailsSelectionHolder
+                      )
+                    )
+                    #createNewApplication: true
+                    #createNewBuilder: true
+                    #postBuildCallback: #packageDetailsCreated:
+                  )
+                 )
+               
+              )
+              #handles: #(#Any 0.5 1.0)
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageBrowser 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::PackageBrowser 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
+      )
+! !
+
+!PackageBrowser 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)."
+
+    ^ #(
+        #packageDetailsApplicationHolder
+        #packageSelectorApplicationHolder
+        #packageSelectorSelectionHolder
+      ).
+
+! !
+
+!PackageBrowser methodsFor:'accessing'!
+
+packageDetailsApplication
+    ^ packageDetailsApplicationHolder value
+! !
+
+!PackageBrowser methodsFor:'aspects'!
+
+packageDetailsApplicationHolder
+    "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 ;-)"
+
+    packageDetailsApplicationHolder isNil ifTrue:[
+        packageDetailsApplicationHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       packageDetailsApplicationHolder addDependent:self.
+"/       packageDetailsApplicationHolder onChangeSend:#packageDetailsApplicationHolderChanged to:self.
+    ].
+    ^ packageDetailsApplicationHolder.
+!
+
+packageSelectorApplicationHolder
+    "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 ;-)"
+
+    packageSelectorApplicationHolder isNil ifTrue:[
+        packageSelectorApplicationHolder := ValueHolder new.
+"/ if your app needs to be notified of changes, uncomment one of the lines below:
+"/       packageSelectorApplicationHolder addDependent:self.
+"/       packageSelectorApplicationHolder onChangeSend:#packageSelectorApplicationHolderChanged to:self.
+    ].
+    ^ packageSelectorApplicationHolder.
+!
+
+packagesSelectedHolder
+    packageSelectorSelectionHolder isNil ifTrue:[
+        self applicationAspectsAt:#packagesSelectedHolder put:ValueHolder new.
+    ].
+    ^ packageSelectorSelectionHolder.
+! !
+
+!PackageBrowser methodsFor:'callbacks'!
+
+packageDetailsCreated:aSubCanvas
+    "do nothing...for now"
+
+    self packageDetailsApplicationHolder value:aSubCanvas client.
+!
+
+packageSelectorCreated:aSubCanvas
+    "do nothing...for now"
+    self packageSelectorApplicationHolder value:aSubCanvas client.
+! !
+
+!PackageBrowser methodsFor:'constants'!
+
+smalltalkPackageManager
+    ^ PackageManager smalltalkPackageManager
+! !
+
+!PackageBrowser 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
+    self packageManager:self smalltalkPackageManager.
+!
+
+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
+! !
+
+!PackageBrowser 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'.
+! !
+
+!PackageBrowser class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic3/packages/PackageBrowser.st,v 1.1 2003-04-09 11:24:19 james Exp $'
+! !
--- /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 $'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/PackageSelector.st	Wed Apr 09 13:26:19 2003 +0200
@@ -0,0 +1,189 @@
+"{ Package: 'stx:libbasic3' }"
+
+"{ NameSpace: Packages }"
+
+AbstractPackageBrowser subclass:#PackageSelector
+	instanceVariableNames:'selectionChangedBlock list'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Package-Application'
+!
+
+
+!PackageSelector 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::PackageSelector andSelector:#windowSpec
+     Packages::PackageSelector new openInterface:#windowSpec
+     Packages::PackageSelector open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Packages::PackageSelectorApplication'
+          #name: 'Packages::PackageSelectorApplication'
+          #min: #(#Point 10 10)
+          #max: #(#Point 1024 768)
+          #bounds: #(#Rectangle 29 59 329 359)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#SelectionInListModelViewSpec
+              #name: 'SelectionInListModelView'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+              #model: #packagesSelectedHolder
+              #hasHorizontalScrollBar: true
+              #hasVerticalScrollBar: true
+              #listModel: #list
+              #multipleSelectOk: true
+              #useIndex: false
+              #highlightMode: #line
+              #selectOnButtomMenu: true
+            )
+           )
+         
+        )
+      )
+! !
+
+!PackageSelector 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)."
+
+    ^ #(
+        #packagesSelectedHolder
+      ).
+
+! !
+
+!PackageSelector methodsFor:'accessing'!
+
+masterApplication:aMasterApplication
+    "initialization"
+    | aPackageManager myList packageNames|
+    super masterApplication:aMasterApplication.
+
+    aPackageManager := self packageManager.
+    (myList := self list) removeAll.
+    packageNames := (aPackageManager packages collect:[:aPackage | aPackage name]).
+    myList addAll:packageNames.
+
+!
+
+selected
+    ^ self selectionHolder value
+!
+
+selectedPackage
+    ^ self packageManager packageNamed:self selection
+!
+
+selectionChangedBlock
+    "return the value of the instance variable 'selectionChangedBlock' (automatically generated)"
+
+    ^ selectionChangedBlock
+!
+
+selectionChangedBlock:something
+    "set the value of the instance variable 'selectionChangedBlock' (automatically generated)"
+
+    selectionChangedBlock := something.
+! !
+
+!PackageSelector methodsFor:'aspects'!
+
+list
+
+    list ifNil:[
+        list := List new.
+        list addDependent:self.
+    ].
+    ^ list.
+! !
+
+!PackageSelector methodsFor:'change & update'!
+
+listUpdate:something with:aParameter 
+
+    | copy |
+    copy := list asOrderedCollection.
+
+    copy sort:[:x :y |
+        x < y 
+    ].
+
+    list become:copy.
+!
+
+update:something with:aParameter from:changedObject
+
+    (changedObject == list) ifTrue:[
+        ^ self listUpdate:something with:aParameter
+    ].
+
+
+    self halt.
+! !
+
+!PackageSelector methodsFor:'initialization'!
+
+initialize
+    | aPackageManager myList packageNames firstOrNil|
+    masterApplication ifNil:[
+        ^ super initialize
+    ].
+
+    aPackageManager := masterApplication model.
+    (myList := self list) removeAll.
+    packageNames := (aPackageManager packages collect:[:aPackage | aPackage name]).
+    myList addAll:packageNames.
+
+    self model:masterApplication model.
+
+    self list isEmpty ifFalse:[
+        firstOrNil := self list first   
+    ].
+    self selectionHolder value:firstOrNil.
+    ^ super initialize
+!
+
+initializeWithMasterApplication:aMasterApplication 
+    | myList packageNames aPackageManager|
+    aPackageManager := aMasterApplication model.
+    (myList := self list) removeAll.
+    packageNames := (aPackageManager packages collect:[:aPackage | aPackage name]).
+    myList addAll:packageNames.
+!
+
+postBuildWith:aBuilder
+    ^ super postBuildWith:aBuilder
+! !
+
+!PackageSelector class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic3/packages/PackageSelector.st,v 1.1 2003-04-09 11:26:19 james Exp $'
+! !