--- /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 $'
+! !