ProjectBrowser.st
author Claus Gittinger <cg@exept.de>
Fri, 19 Mar 1999 22:07:28 +0100
changeset 1069 7196ca547f5d
parent 1052 2b65eda2938e
child 1079 deda6cdfe287
permissions -rw-r--r--
code cleanup

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