ProjectBrowser.st
changeset 1026 ee8a738cd35d
parent 1025 33c3db52cdc8
child 1037 3a75844e668a
--- a/ProjectBrowser.st	Tue Feb 09 19:47:38 1999 +0100
+++ b/ProjectBrowser.st	Tue Feb 09 20:58:35 1999 +0100
@@ -1,5 +1,5 @@
 ApplicationModel subclass:#ProjectBrowser
-	instanceVariableNames:'knownProjects'
+	instanceVariableNames:'projectTree'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Smalltalk'
@@ -12,6 +12,13 @@
 	privateIn:ProjectBrowser
 !
 
+ProjectBrowser::ProjectTreeItem subclass:#ProjectNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:ProjectBrowser
+!
+
 
 !ProjectBrowser class methodsFor:'interface specs'!
 
@@ -60,6 +67,96 @@
       )
 !
 
+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
+                )
+              )
+          )
+      )
+!
+
+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."
@@ -81,11 +178,11 @@
           #window: 
            #(#WindowSpec
               #name: 'ProjectBrowser'
-              #layout: #(#LayoutFrame 16 0 31 0 579 0 353 0)
+              #layout: #(#LayoutFrame 216 0 173 0 779 0 495 0)
               #label: 'ProjectBrowser'
               #min: #(#Point 10 10)
               #max: #(#Point 1024 768)
-              #bounds: #(#Rectangle 16 31 580 354)
+              #bounds: #(#Rectangle 216 173 780 496)
               #menu: #mainMenu
               #usePreferredExtent: false
           )
@@ -109,6 +206,7 @@
                            #(#SelectionInTreeViewSpec
                               #name: 'TreeList1'
                               #model: #selectedTreeNode
+                              #menu: #itemMenuHolder
                               #hasHorizontalScrollBar: true
                               #hasVerticalScrollBar: true
                               #miniScrollerHorizontal: true
@@ -127,7 +225,7 @@
                           )
                         )
                     )
-                    #handles: #(#Any 0.274823 1.0)
+                    #handles: #(#Any 0.379433 1.0)
                 )
               )
           )
@@ -182,11 +280,13 @@
                           #label: 'Save'
                           #translateLabel: true
                           #value: #saveProject
+                          #enabled: #hasProjectSelectedHolder
                       )
                        #(#MenuItem
                           #label: 'Save As...'
                           #translateLabel: true
                           #value: #saveProjectAs
+                          #enabled: #hasProjectSelectedHolder
                       )
                        #(#MenuItem
                           #label: '-'
@@ -201,6 +301,11 @@
                 )
             )
              #(#MenuItem
+                #label: 'Project'
+                #translateLabel: true
+                #submenuChannel: #projectItemMenu
+            )
+             #(#MenuItem
                 #label: 'Help'
                 #translateLabel: true
                 #startGroup: #right
@@ -273,6 +378,54 @@
           ) 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
+      )
 ! !
 
 !ProjectBrowser methodsFor:'aspects'!
@@ -292,6 +445,12 @@
     ^ holder.
 !
 
+hasProjectSelectedHolder
+    ^ [
+        self hasProjectNodeSelected
+      ]
+!
+
 projectTreeHolder
     "automatically generated by UIPainter ..."
 
@@ -341,30 +500,57 @@
 !ProjectBrowser methodsFor:'initialization'!
 
 postBuildWith:aBuiler
-    self setupCanvasForNoSelection
+    self setupCanvasForNoSelection.
+    ^ super postBuildWith:aBuiler
 !
 
 setupCanvasForNoSelection
-    self currentCanvasHolder value:(self class emptyRightCanvasSpec).
-    self rightCanvasTextHolder value:'Please select an existing,
+    self showReadOnlyText:'Please select an existing,
 or create a new project.'.
 ! !
 
+!ProjectBrowser methodsFor:'menus'!
+
+itemMenu
+    self hasProjectNodeSelected ifTrue:[
+        ^ self class projectItemMenu
+    ].      
+
+    ^ nil
+!
+
+itemMenuHolder
+    ^ [ self itemMenu]
+! !
+
 !ProjectBrowser methodsFor:'private'!
 
+hasProjectNodeSelected
+    |selectedNode|
+
+    selectedNode := self selectedTreeNode value.
+    selectedNode isNil ifTrue:[^ false].
+
+    ^ selectedNode isProjectNode
+
+!
+
 nodeFor:aProject
+    "generate and return a treeNode for some project"
+
     |projectName pNode 
      propertiesNode docNode classesNode subprojectsNode filesNode
-     commentNode|
+     commentNode prerequisitesNode|
 
     projectName := aProject name.
-    pNode := ProjectTreeItem name:projectName.
+    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:(classesNode := ProjectTreeItem name:'Classes').
+    pNode add:(prerequisitesNode := ProjectTreeItem name:'Prerequisites').
     pNode add:(subprojectsNode := ProjectTreeItem name:'SubProjects').
     pNode add:(filesNode := ProjectTreeItem name:'Files').
 
@@ -373,26 +559,36 @@
     ].
 
     commentNode action:[:item | self showCommentOf:item].
-    docNode contents:nil.
-    propertiesNode contents:nil.
-    classesNode contents:nil.
-    subprojectsNode contents:nil.
-    filesNode contents:nil.
+    commentNode contents:#comment.
+
+    docNode contents:#documentation.
+
+    propertiesNode contents:#properties.
+
+    prerequisitesNode contents:#prerequisites.
+
+    subprojectsNode contents:#subprojects.
+
+    filesNode contents:#files.
 
     ^ pNode
+
 !
 
 projectTree
     |tree root|
 
-    tree := SelectionInTree new.
-    tree root:(root := TreeItem name:'invisibleRoot').
+    projectTree isNil ifTrue:[
+        tree := SelectionInTree new.
+        tree root:(root := TreeItem name:'invisibleRoot').
 
-    Project knownProjects do:[:aProject |
-        root add:(self nodeFor:aProject).
+        Project knownProjects do:[:aProject |
+            root add:(self nodeFor:aProject).
+        ].
+        projectTree := root.
     ].
 
-    ^ root
+    ^ projectTree
 !
 
 updateRightCanvas
@@ -403,10 +599,9 @@
         self setupCanvasForNoSelection.
         ^ self
     ].
-    nodeContents := selectedNode contents.
-    (nodeContents isMemberOf:Project) ifTrue:[
-        self currentCanvasHolder value:(self class emptyRightCanvasSpec).
-        self rightCanvasTextHolder value:nodeContents comment.
+
+    selectedNode isProjectNode ifTrue:[
+        self showCommentOf:selectedNode.
         ^ self.
     ].
 
@@ -429,16 +624,70 @@
     ].
 !
 
-showCommentOf:anItem
-    |project|
+newProject
+    |newNode newProject|
+
+    newProject := Project new.
+    newNode := self nodeFor:newProject.
+    projectTree add:newNode.
+    self projectTreeHolder root:projectTree.
+
+!
+
+newSubProject
+    |selectedNode subNode newNode parentProject newProject|
+
+    self hasProjectNodeSelected ifTrue:[
+        selectedNode := self selectedTreeNode value.
+        parentProject := selectedNode contents.
+
+        newProject := Project new.
+        newNode := self nodeFor:newProject.
+
+        parentProject addSubProject:newProject.
+        subNode := selectedNode children detect:[:child | child contents == #subprojects].
+        subNode add:newNode.
+        self projectTreeHolder root:projectTree.
+    ]
+!
+
+removeSubProject
+    |projectToRemove selectedNode subNode newNode parentProject newProject|
 
-    project := anItem parent contents.
+    self hasProjectNodeSelected ifTrue:[
+        selectedNode := self selectedTreeNode value.
+        projectToRemove := selectedNode contents.
+
+        selectedNode parentNode isProjectNode.
+
+        parentProject addSubProject:newProject.
+        subNode := selectedNode children detect:[:child | child contents == #subprojects].
+        subNode add:newNode.
+        self projectTreeHolder root:projectTree.
+    ]
+!
+
+showCommentOf:anItem
+    |projectItem project|
 
-    self currentCanvasHolder value:(self class emptyRightCanvasSpec).
+    anItem contents == #comment ifTrue:[
+        projectItem := anItem parent
+    ] ifFalse:[
+        projectItem := anItem
+    ].
+    project := projectItem contents.
+
+    self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
     self rightCanvasTextHolder value:project comment.
 
 !
 
+showReadOnlyText:someText
+    self currentCanvasHolder value:(self class rightCanvasSpecForReadOnlyText).
+    self rightCanvasTextHolder value:someText.
+
+!
+
 showTreeItem:anItem
     anItem contents == #comment ifTrue:[
         self showCommentOf:anItem.
@@ -458,6 +707,20 @@
 
     action := something.! !
 
+!ProjectBrowser::ProjectTreeItem methodsFor:'queries'!
+
+isProjectNode
+    ^ false
+! !
+
+!ProjectBrowser::ProjectNode methodsFor:'queries'!
+
+isProjectNode
+    ^ true
+
+
+! !
+
 !ProjectBrowser class methodsFor:'documentation'!
 
 version