ToolApplicationModel subclass:#ProjectBrowser
instanceVariableNames:'projectTree'
classVariableNames:''
poolDictionaries:''
category:'Interface-Smalltalk'
!
TreeItem subclass:#ProjectTreeItem
instanceVariableNames:'action'
classVariableNames:''
poolDictionaries:''
privateIn:ProjectBrowser
!
ProjectBrowser::ProjectTreeItem subclass:#ProjectNode
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
privateIn:ProjectBrowser
!
!ProjectBrowser class methodsFor:'interface specs'!
emptyRightCanvasSpec
"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:ProjectBrowser andSelector:#emptyRightCanvasSpec
ProjectBrowser new openInterface:#emptyRightCanvasSpec
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#TextEditorSpec
#name: 'TextEditor1'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#model: #rightCanvasTextHolder
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#miniScrollerHorizontal: true
#isReadOnly: true
)
)
)
)
!
rightCanvasSpecForClassList
"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:ProjectBrowser andSelector:#rightCanvasSpecForClassList
ProjectBrowser new openInterface:#rightCanvasSpecForClassList
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#level: 0
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#DataSetSpec
#name: 'classTable'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#dataList: #classList
#has3Dsepartors: false
#columnHolder: #classTableColumns
#columnAdaptor: #classTableAdaptor
)
)
)
)
!
rightCanvasSpecForEditableText
"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:ProjectBrowser andSelector:#emptyRightCanvasSpec
ProjectBrowser new openInterface:#emptyRightCanvasSpec
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#TextEditorSpec
#name: 'TextEditor1'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#model: #rightCanvasTextHolder
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#miniScrollerHorizontal: true
#isReadOnly: false
)
)
)
)
!
rightCanvasSpecForHTMLText
"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:ProjectBrowser andSelector:#rightCanvasSpecForHTMLText
ProjectBrowser new openInterface:#rightCanvasSpecForHTMLText
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#level: 0
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#HTMLViewSpec
#name: 'HTMLBrowser1'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#model: #htmlDocumentURLHolder
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
)
)
)
)
!
rightCanvasSpecForPatchesList
"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:ProjectBrowser andSelector:#rightCanvasSpecForPatchesList
ProjectBrowser new openInterface:#rightCanvasSpecForPatchesList
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#level: 0
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#DataSetSpec
#name: 'patchesTable'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#dataList: #patchesList
#has3Dsepartors: false
#columnHolder: #patchesTableColumns
#columnAdaptor: #classTableAdaptor
)
)
)
)
!
rightCanvasSpecForReadOnlyText
"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:ProjectBrowser andSelector:#emptyRightCanvasSpec
ProjectBrowser new openInterface:#emptyRightCanvasSpec
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'NewApplication'
#layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
#label: 'NewApplication'
#min: #(#Point 10 10)
#max: #(#Point 1280 1024)
#bounds: #(#Rectangle 216 173 516 473)
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#TextEditorSpec
#name: 'TextEditor1'
#layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
#model: #rightCanvasTextHolder
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#miniScrollerHorizontal: true
#isReadOnly: true
)
)
)
)
!
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:ProjectBrowser andSelector:#windowSpec
ProjectBrowser new openInterface:#windowSpec
ProjectBrowser open
"
<resource: #canvas>
^
#(#FullSpec
#window:
#(#WindowSpec
#name: 'ProjectBrowser'
#layout: #(#LayoutFrame 216 0 173 0 779 0 495 0)
#level: 0
#label: 'ProjectBrowser'
#min: #(#Point 10 10)
#max: #(#Point 1024 768)
#bounds: #(#Rectangle 216 173 780 496)
#menu: #mainMenu
#usePreferredExtent: false
)
#component:
#(#SpecCollection
#collection:
#(
#(#MenuPanelSpec
#name: 'ToolBar1'
#layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0)
#menu: #menu
#textDefault: true
)
#(#VariableHorizontalPanelSpec
#name: 'VariableHorizontalPanel1'
#layout: #(#LayoutFrame 0 0.0 40 0.0 0 1.0 -24 1.0)
#component:
#(#SpecCollection
#collection:
#(
#(#SelectionInTreeViewSpec
#name: 'TreeList1'
#model: #selectedTreeNode
#menu: #itemMenuHolder
#performer: #itemMenuPerformer
#hasHorizontalScrollBar: true
#hasVerticalScrollBar: true
#miniScrollerHorizontal: true
#showRoot: false
#showDirectoryIndicatorForRoot: false
#showDirectoryIndicator: true
#valueChangeSelector: #itemSelected:
#hierarchicalList: #projectTreeHolder
#highlightMode: #label
)
#(#SubCanvasSpec
#name: 'SubCanvas1'
#hasHorizontalScrollBar: false
#hasVerticalScrollBar: false
#specHolder: #currentCanvasHolder
)
)
)
#handles: #(#Any 0.379433 1.0)
)
#(#UISubSpecification
#name: 'infoBarSubSpec'
#layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0)
#majorKey: #ToolApplicationModel
#minorKey: #windowSpecForInfoBar
)
)
)
)
! !
!ProjectBrowser class methodsFor:'menu specs'!
classesItemMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:ProjectBrowser andSelector:#classesItemMenu
(Menu new fromLiteralArrayEncoding:(ProjectBrowser classesItemMenu)) startUp
"
<resource: #menu>
^
#(#Menu
#(
#(#MenuItem
#label: 'Add Class...'
#translateLabel: true
#value: #addClass
#enabled: #hasClassesSelectedHolder
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Browse...'
#translateLabel: true
#value: #browseClasses
#enabled: #hasClassesSelectedHolder
)
) nil
nil
)
!
mainMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:ProjectBrowser andSelector:#mainMenu
(Menu new fromLiteralArrayEncoding:(ProjectBrowser mainMenu)) startUp
"
<resource: #menu>
^
#(#Menu
#(
#(#MenuItem
#label: 'File'
#translateLabel: true
#submenu:
#(#Menu
#(
#(#MenuItem
#label: 'New'
#translateLabel: true
#value: #newProject
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Open...'
#translateLabel: true
#value: #openProject
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Save'
#translateLabel: true
#value: #saveProject
#enabled: #hasProjectSelectedHolder
)
#(#MenuItem
#label: 'Save As...'
#translateLabel: true
#value: #saveProjectAs
#enabled: #hasProjectSelectedHolder
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Exit'
#translateLabel: true
#value: #closeRequest
)
) nil
nil
)
)
#(#MenuItem
#label: 'Project'
#translateLabel: true
#submenuChannel: #projectItemMenu
)
#(#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
)
!
menu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:ProjectBrowser andSelector:#menu
(Menu new fromLiteralArrayEncoding:(ProjectBrowser menu)) startUp
"
<resource: #menu>
^
#(#Menu
#(
#(#MenuItem
#label: 'New...'
#translateLabel: true
#isButton: true
#value: #newProject
#labelImage: #(#ResourceRetriever #Icon #newIcon)
)
#(#MenuItem
#label: 'Open...'
#translateLabel: true
#isButton: true
#value: #openProject
#labelImage: #(#ResourceRetriever #Icon #loadIcon)
)
#(#MenuItem
#label: 'SaveAs...'
#translateLabel: true
#isButton: true
#value: #saveProject
#labelImage: #(#ResourceRetriever #Icon #saveIcon)
)
) nil
nil
)
!
projectItemMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:ProjectBrowser andSelector:#projectItemMenu
(Menu new fromLiteralArrayEncoding:(ProjectBrowser projectItemMenu)) startUp
"
<resource: #menu>
^
#(#Menu
#(
#(#MenuItem
#label: 'Rename...'
#translateLabel: true
#value: #renameProject
#enabled: #hasProjectSelectedHolder
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'New SubProject'
#translateLabel: true
#value: #newSubProject
#enabled: #hasProjectSelectedHolder
)
#(#MenuItem
#label: '-'
)
#(#MenuItem
#label: 'Remove...'
#translateLabel: true
#value: #removeProject
#enabled: #hasProjectSelectedHolder
)
) nil
nil
)
!
subProjectsItemMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:ProjectBrowser andSelector:#subProjectsItemMenu
(Menu new fromLiteralArrayEncoding:(ProjectBrowser subProjectsItemMenu)) startUp
"
<resource: #menu>
^
#(#Menu
#(
#(#MenuItem
#label: 'New SubProject'
#translateLabel: true
#value: #newSubProject
#enabled: #hasSubProjectsSelectedHolder
)
) nil
nil
)
! !
!ProjectBrowser class methodsFor:'tableColumns specs'!
classTableColumns
"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:ProjectBrowser andSelector:#classTableColumns
"
<resource: #tableColumns>
^ #(
#(#DataSetColumnSpec
#label: 'Class'
#id: 'classColumn'
#labelAlignment: #left
#model: #classNameFromClassInfo:
)
#(#DataSetColumnSpec
#label: 'Included'
#id: 'inclusion'
#columnAlignment: #center
#width: 100
#editorType: #ComboList
#model: #classIncludeConditionFromClassInfo:
)
#(#DataSetColumnSpec
#label: 'Filename'
#labelAlignment: #left
#minWidth: 200
#model: #classFilenameFromClassInfo:
)
)
!
patchesTableColumns
"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:ProjectBrowser andSelector:#patchesTableColumns
"
<resource: #tableColumns>
^ #(
#(#DataSetColumnSpec
#label: 'Class'
#id: 'classColumn'
#labelAlignment: #left
#model: #classNameFromPatchesInfo:
)
#(#DataSetColumnSpec
#label: 'Selector'
#id: 'selectorColumn'
#labelAlignment: #left
#model: #selectorFromPatchesInfo:
)
)
! !
!ProjectBrowser methodsFor:'aspects'!
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 in the browser."
|holder|
(holder := builder bindingAt:#classList) isNil ifTrue:[
builder aspectAt:#classList put:(holder := List new).
].
^ holder.
!
classTableAdaptor
^ self
!
classTableColumns
^ self class classTableColumns
!
currentCanvasHolder
"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 in the browser."
|holder|
(holder := builder bindingAt:#currentCanvasHolder) isNil ifTrue:[
builder aspectAt:#currentCanvasHolder put:(holder := ValueHolder new).
].
^ holder.
!
hasProjectSelectedHolder
^ [
self hasProjectNodeSelected
]
!
hasSubProjectsSelectedHolder
^ [
self hasSubProjectsNodeSelected
]
!
htmlDocumentURLHolder
"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 in the browser."
|holder|
(holder := builder bindingAt:#htmlDocumentURLHolder) isNil ifTrue:[
builder aspectAt:#htmlDocumentURLHolder put:(holder := ValueHolder new).
].
^ holder.
!
patchesList
"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 in the browser."
|holder|
(holder := builder bindingAt:#patchesList) isNil ifTrue:[
builder aspectAt:#patchesList put:(holder := List new).
].
^ holder.
!
projectTreeHolder
"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 in the browser."
|holder|
(holder := builder bindingAt:#projectTree) isNil ifTrue:[
builder aspectAt:#projectTree put:(holder := SelectionInTree new).
holder root:self projectTree.
].
^ holder.
!
rightCanvasTextHolder
"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 in the browser."
|holder|
(holder := builder bindingAt:#rightCanvasTextHolder) isNil ifTrue:[
builder aspectAt:#rightCanvasTextHolder put:(holder := ValueHolder new).
].
^ holder.
!
selectedTreeNode
"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 in the browser."
|holder|
(holder := builder bindingAt:#selectedTreeNode) isNil ifTrue:[
builder aspectAt:#selectedTreeNode put:(holder := ValueHolder new).
].
^ holder.
! !
!ProjectBrowser methodsFor:'initialization'!
postBuildWith:aBuiler
self setupCanvasForNoSelection.
^ super postBuildWith:aBuiler
!
setupCanvasForNoSelection
self showReadOnlyText:'Please select an existing,
or create a new project.'.
! !
!ProjectBrowser methodsFor:'menus'!
itemMenu
|m|
self hasProjectNodeSelected ifTrue:[
^ self class projectItemMenu
].
self hasSubProjectsNodeSelected ifTrue:[
^ self class subProjectsItemMenu
].
self hasClassesNodeSelected ifTrue:[
^ self class classesItemMenu
].
^ nil
!
itemMenuHolder
^ [ self itemMenu]
!
itemMenuPerformer
^ self
! !
!ProjectBrowser methodsFor:'private'!
hasClassesNodeSelected
|selectedNode|
selectedNode := self selectedTreeNode value.
selectedNode isNil ifTrue:[^ false].
^ selectedNode contents == #classes
!
hasProjectNodeSelected
|selectedNode|
selectedNode := self selectedTreeNode value.
selectedNode isNil ifTrue:[^ false].
^ selectedNode isProjectNode
!
hasSubProjectsNodeSelected
|selectedNode|
selectedNode := self selectedTreeNode value.
selectedNode isNil ifTrue:[^ false].
^ selectedNode contents == #subprojects
!
nodeFor:aProject
"generate and return a treeNode for some project"
|projectName pNode
propertiesNode docNode classesNode patchesNode subprojectsNode filesNode
commentNode prerequisitesNode analysisNode designNode codeNode
userDocNode userOverViewNode userGuideNode userRefManNode|
projectName := aProject name.
pNode := ProjectNode name:projectName.
pNode contents:aProject.
pNode add:(commentNode := ProjectTreeItem name:'Comment').
pNode add:(docNode := ProjectTreeItem name:'Documentation').
pNode add:(propertiesNode := ProjectTreeItem name:'Properties').
pNode add:(prerequisitesNode := ProjectTreeItem name:'Prerequisites').
pNode add:(subprojectsNode := ProjectTreeItem name:'SubProjects').
pNode add:(classesNode := ProjectTreeItem name:'Classes').
pNode add:(patchesNode := ProjectTreeItem name:'Patches').
pNode add:(filesNode := ProjectTreeItem name:'Files').
aProject subProjects do:[:aSubProject |
subprojectsNode add:(self nodeFor:aSubProject)
].
commentNode action:[:item | self showCommentOf:item].
commentNode contents:#comment.
docNode contents:#documentation.
docNode action:[:item | self showDocumentationFor:item].
docNode add:(analysisNode := ProjectTreeItem name:'Analysis').
docNode add:(designNode := ProjectTreeItem name:'Design').
docNode add:(codeNode := ProjectTreeItem name:'Code').
docNode add:(userDocNode := ProjectTreeItem name:'User Documentation').
userDocNode add:(userOverViewNode := ProjectTreeItem name:'Overview').
userDocNode add:(userGuideNode := ProjectTreeItem name:'Guide').
userDocNode add:(userRefManNode := ProjectTreeItem name:'Reference').
docNode add:(userDocNode := ProjectTreeItem name:'Error Reports').
docNode add:(userDocNode := ProjectTreeItem name:'Other').
prerequisitesNode contents:#prerequisites.
classesNode contents:#classes.
((aProject classes ? #()) copy sort:[:a :b | a name < b name])
do:[:aClass |
|cNode|
cNode := ProjectTreeItem name:aClass name.
classesNode add:cNode.
].
propertiesNode contents:#properties.
subprojectsNode contents:#subprojects.
filesNode contents:#files.
patchesNode contents:#patches.
^ pNode
!
projectTree
|tree root|
projectTree isNil ifTrue:[
tree := SelectionInTree new.
tree root:(root := TreeItem name:'invisibleRoot').
Project knownProjects do:[:aProject |
root add:(self nodeFor:aProject).
].
projectTree := root.
].
^ projectTree
!
updateRightCanvas
|selectedNode nodeContents|
selectedNode := self selectedTreeNode value.
selectedNode isNil ifTrue:[
self setupCanvasForNoSelection.
^ self
].
selectedNode isProjectNode ifTrue:[
self showCommentOf:selectedNode.
^ self.
].
selectedNode contents == #classes ifTrue:[
self showClassListOf:selectedNode.
^ self.
].
selectedNode contents == #patches ifTrue:[
self showPatchesListOf:selectedNode.
^ self.
].
self currentCanvasHolder value:(self class emptyRightCanvasSpec).
self rightCanvasTextHolder value:''.
! !
!ProjectBrowser methodsFor:'private - table col access'!
classFilenameFromClassInfo:cInfo
^ cInfo classFileName
!
classIncludeConditionFromClassInfo:cInfo
^ cInfo conditionForInclusion
!
classNameFromClassInfo:cInfo
^ cInfo className
!
classNameFromPatchesInfo:pInfo
^ pInfo methodClass name
!
selectorFromPatchesInfo:pInfo
^ pInfo methodSelector
! !
!ProjectBrowser methodsFor:'user actions'!
itemSelected:index
|item action|
self updateRightCanvas.
item := self projectTreeHolder value at:index.
action := item action.
action notNil ifTrue:[
action value:item.
].
!
newProject
self newProject:Project new.
!
newProject:newProject
|newNode|
newNode := self nodeFor:newProject.
projectTree add:newNode.
self projectTreeHolder root:projectTree.
!
newSubProject
|selectedNode subProjectsNode newNode parentProject newProject|
selectedNode := self selectedTreeNode value.
self hasProjectNodeSelected ifTrue:[
parentProject := selectedNode contents.
subProjectsNode := selectedNode children detect:[:child | child contents == #subprojects].
] ifFalse:[
self hasSubProjectsNodeSelected ifTrue:[
subProjectsNode := selectedNode.
parentProject := selectedNode parent contents.
].
].
self halt.
parentProject notNil ifTrue:[
newProject := Project new.
newNode := self nodeFor:newProject.
parentProject addSubProject:newProject.
subProjectsNode add:newNode.
self projectTreeHolder root:projectTree.
self projectTreeHolder selectNode:newNode.
]
!
openProject
|fn newProject|
fn := Dialog
requestFileName:'filename:'
default:nil
ifFail:nil
pattern:'*.prj'
fromDirectory:(FileSelectionBox lastFileSelectionDirectory).
fn notNil ifTrue:[
newProject := Project new loadFromProjectFile:fn.
newProject notNil ifTrue:[
self newProject:newProject
]
]
!
removeProject
|projectToRemove selectedNode subNode newNode parentNode parentProject newProject|
self hasProjectNodeSelected ifTrue:[
selectedNode := self selectedTreeNode value.
projectToRemove := selectedNode contents.
"/ parentNode := selectedNode parent.
"/ parentNode contents == #subprojects ifTrue:[
"/ parentNode removeChild:selectedNode.
"/ ] ifFalse:[
"/ parentNode removeChild:selectedNode.
"/ ].
self projectTreeHolder removeSelection
"/ self projectTreeHolder root:projectTree.
"/ parentProject addSubProject:newProject.
"/ subNode := selectedNode children detect:[:child | child contents == #subprojects].
"/ subNode add:newNode.
"/ self projectTreeHolder root:projectTree.
]
!
renameProject
|nm selectedNode selectedProject|
self hasProjectNodeSelected ifTrue:[
selectedNode := self selectedTreeNode value.
selectedProject := selectedNode contents.
nm := Dialog
request:'Rename to:'
initialAnswer:selectedProject name.
nm size > 0 ifTrue:[
selectedProject name:nm.
selectedNode name:nm.
selectedNode changed.
]
]
!
showClassListOf:anItem
|projectItem project classInfo l|
projectItem := anItem parent.
project := projectItem contents.
classInfo := project classInfo asOrderedCollection.
classInfo sort:[:a :b | a className < b className].
l := self classList.
l removeAll.
l addAll:classInfo.
self currentCanvasHolder value:(self class rightCanvasSpecForClassList).
!
showCommentOf:anItem
|projectItem project|
anItem contents == #comment ifTrue:[
projectItem := anItem parent
] ifFalse:[
projectItem := anItem
].
project := projectItem contents.
self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
self rightCanvasTextHolder value:project comment.
!
showDocumentationFor:anItem
|projectItem project|
anItem contents == #documentation ifTrue:[
projectItem := anItem parent
] ifFalse:[
projectItem := anItem
].
project := projectItem contents.
self currentCanvasHolder value:(self class rightCanvasSpecForHTMLText).
self htmlDocumentURLHolder value:project documentationURL.
!
showPatchesListOf:anItem
|projectItem project patches l|
projectItem := anItem parent.
project := projectItem contents.
patches := project individualMethods.
patches := patches collect:[:m | m who].
patches := patches sort:[:w1 :w2 |
w1 methodClass name < w2 methodClass name ifTrue:[
true
] ifFalse:[
w1 methodClass name = w2 methodClass name ifFalse:[
false
] ifTrue:[
w1 methodSelector < w2 methodSelector
]
]
].
l := self patchesList.
l removeAll.
l addAll:patches.
self currentCanvasHolder value:(self class rightCanvasSpecForPatchesList).
!
showReadOnlyText:someText
self currentCanvasHolder value:(self class rightCanvasSpecForReadOnlyText).
self rightCanvasTextHolder value:someText.
!
showTreeItem:anItem
anItem contents == #comment ifTrue:[
self showCommentOf:anItem.
^ self
].
! !
!ProjectBrowser::ProjectTreeItem methodsFor:'accessing'!
action
"return the value of the instance variable 'action' (automatically generated)"
^ action!
action:something
"set the value of the instance variable 'action' (automatically generated)"
action := something.! !
!ProjectBrowser::ProjectTreeItem methodsFor:'queries'!
isProjectNode
^ false
! !
!ProjectBrowser::ProjectNode methodsFor:'queries'!
isProjectNode
^ true
! !
!ProjectBrowser class methodsFor:'documentation'!
version
^ '$Header$'
! !