diff -r e88edf4a8cbe -r df7d7c6611b6 ProjectBrowser.st --- a/ProjectBrowser.st Fri Apr 16 21:28:32 1999 +0200 +++ b/ProjectBrowser.st Sat Apr 17 01:55:48 1999 +0200 @@ -6,7 +6,7 @@ ! TreeItemWithImage subclass:#ProjectTreeItem - instanceVariableNames:'action spec' + instanceVariableNames:'action spec info' classVariableNames:'' poolDictionaries:'' privateIn:ProjectBrowser @@ -133,6 +133,18 @@ ! +prerequisiteClassesIcon + + + ^ self classesIcon +! + +prerequisiteProjectsIcon + + + ^ self projectsIcon +! + prerequisitesIcon "This resource specification was automatically generated by the ImageEditor of ST/X." @@ -152,7 +164,25 @@ ifAbsentPut:[(Depth4Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@A8@D(@RPA80@C@^@=HRT/)^D$@C7#@RLAI@G(@@@@b') ; yourself); yourself] "Modified: / 23.3.1999 / 14:28:11 / cg" -! ! +! + +projectsIcon + "This resource specification was automatically generated + by the ImageEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the ImageEditor may not be able to read the specification." + + " + self projectsIcon inspect + ImageEditor openOnClass:self andSelector:#projectsIcon + " + + + + ^Icon + constantNamed:#'ProjectBrowser projectsIcon' + ifAbsentPut:[(Depth4Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@"H"H"@@@@@"H"H"@ @@@"H"H"@"@@@@@@@@@"H@@BH"H"HBH @@H"H"H H"@@@"H"H"@"H@@BH"H"HBH @@H"H"H H @@@"H"H"@ @@@BH"H"H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 0 0 132 255 128 128]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@G? ?>G?8??''?>_?9??''?>_?9??G?8_?A?8@@@@@@b') ; yourself); yourself]! ! !ProjectBrowser class methodsFor:'interface specs'! @@ -531,7 +561,7 @@ ) ! -rightCanvasSpecForPrerequisites +rightCanvasSpecForPrerequisiteClasses "This resource specification was automatically generated by the UIPainter of ST/X." @@ -539,24 +569,170 @@ the UIPainter may not be able to read the specification." " - UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForPrerequisites - ProjectBrowser new openInterface:#rightCanvasSpecForPrerequisites + UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForPrerequisiteClasses + ProjectBrowser new openInterface:#rightCanvasSpecForPrerequisiteClasses " ^ #(#FullSpec - #name: #rightCanvasSpecForPrerequisites + #name: #rightCanvasSpecForPrerequisiteClasses #window: #(#WindowSpec #label: 'NewApplication' #name: 'NewApplication' - #layout: #(#LayoutFrame 208 0 222 0 507 0 521 0) + #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0) #level: 0 #min: #(#Point 10 10) #max: #(#Point 1280 1024) - #bounds: #(#Rectangle 208 222 508 522) + #bounds: #(#Rectangle 216 173 516 473) + #usePreferredExtent: false + #returnIsOKInDialog: true + #escapeIsCancelInDialog: true + ) + #component: + #(#SpecCollection + #collection: #( + #(#LabelSpec + #label: 'Known Classes' + #name: 'Label1' + #layout: #(#LayoutFrame 0 0 0 0 0 0.5 30 0) + #translateLabel: true + ) + #(#SequenceViewSpec + #name: 'List1' + #layout: #(#LayoutFrame 0 0 30 0 0 0.5 -62 1) + #tabable: true + #model: #selectedClassInPrerequisites + #hasHorizontalScrollBar: true + #hasVerticalScrollBar: true + #miniScrollerHorizontal: true + #miniScrollerVertical: true + #doubleClickSelector: #addClassToPrerequisites + #valueChangeSelector: #showInfoForRequiredClass: + #useIndex: false + #sequenceList: #listOfAllClassesInPrerequisites + ) + #(#LabelSpec + #label: 'Required Classes' + #name: 'Label2' + #layout: #(#LayoutFrame 0 0.5 0 0 0 1 30 0) + #translateLabel: true + ) + #(#SequenceViewSpec + #name: 'List2' + #layout: #(#LayoutFrame 0 0.5 30 0 0 1 -62 1) + #tabable: true + #model: #selectedRequiredClassInPrerequisites + #hasHorizontalScrollBar: true + #hasVerticalScrollBar: true + #miniScrollerHorizontal: true + #miniScrollerVertical: true + #doubleClickSelector: #removeClassFromPrerequisites + #valueChangeSelector: #showInfoForRequiredClass: + #useIndex: false + #sequenceList: #listOfRequiredClassesInPrerequisites + ) + #(#HorizontalPanelViewSpec + #name: 'HorizontalPanel2' + #layout: #(#LayoutFrame 0 0 -62 1 0 1 -32 1) + #horizontalLayout: #fitSpace + #verticalLayout: #center + #horizontalSpace: 3 + #verticalSpace: 3 + #component: + #(#SpecCollection + #collection: #( + #(#ActionButtonSpec + #label: 'Add' + #name: 'addButton' + #translateLabel: true + #resizeForLabel: false + #tabable: true + #model: #addClassToPrerequisites + #enableChannel: #canAddSelectedClassToPrerequisites + #actionValue: '' + #useDefaultExtent: true + ) + #(#ActionButtonSpec + #label: 'Remove' + #name: 'removeButton' + #translateLabel: true + #resizeForLabel: false + #tabable: true + #model: #removeClassFromPrerequisites + #enableChannel: #canRemoveSelectedClassFromPrerequisites + #actionValue: '' + #useDefaultExtent: true + ) + ) + + ) + ) + #(#HorizontalPanelViewSpec + #name: 'HorizontalPanel1' + #layout: #(#LayoutFrame 0 0.0 -30 1 0 1.0 0 1.0) + #initiallyInvisible: true + #horizontalLayout: #fitSpace + #verticalLayout: #center + #horizontalSpace: 3 + #verticalSpace: 3 + #component: + #(#SpecCollection + #collection: #( + #(#ActionButtonSpec + #label: 'Cancel' + #name: 'Button1' + #translateLabel: true + #tabable: true + #model: #cancel + #useDefaultExtent: true + ) + #(#ActionButtonSpec + #label: 'OK' + #name: 'Button2' + #translateLabel: true + #tabable: true + #model: #accept + #useDefaultExtent: true + ) + ) + + ) + ) + ) + + ) + ) +! + +rightCanvasSpecForPrerequisiteProjects + "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:#rightCanvasSpecForPrerequisiteProjects + ProjectBrowser new openInterface:#rightCanvasSpecForPrerequisiteProjects + " + + + + ^ + #(#FullSpec + #name: #rightCanvasSpecForPrerequisiteProjects + #window: + #(#WindowSpec + #label: 'NewApplication' + #name: 'NewApplication' + #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0) + #level: 0 + #min: #(#Point 10 10) + #max: #(#Point 1280 1024) + #bounds: #(#Rectangle 216 173 516 473) #usePreferredExtent: false #returnIsOKInDialog: true #escapeIsCancelInDialog: true @@ -579,6 +755,7 @@ #hasVerticalScrollBar: true #miniScrollerHorizontal: true #miniScrollerVertical: true + #doubleClickSelector: #addProjectToPrerequisites #useIndex: false #sequenceList: #listOfAllProjectsInPrerequisites ) @@ -597,6 +774,7 @@ #hasVerticalScrollBar: true #miniScrollerHorizontal: true #miniScrollerVertical: true + #doubleClickSelector: #removeProjectFromPrerequisites #useIndex: false #sequenceList: #listOfRequiredProjectsInPrerequisites ) @@ -616,7 +794,7 @@ #translateLabel: true #resizeForLabel: false #tabable: true - #model: #addToPrerequisites + #model: #addProjectToPrerequisites #enableChannel: #canAddSelectedProjectToPrerequisites #actionValue: '' #useDefaultExtent: true @@ -627,7 +805,7 @@ #translateLabel: true #resizeForLabel: false #tabable: true - #model: #removeFromPrerequisites + #model: #removeProjectFromPrerequisites #enableChannel: #canRemoveSelectedProjectFromPrerequisites #actionValue: '' #useDefaultExtent: true @@ -639,6 +817,7 @@ #(#HorizontalPanelViewSpec #name: 'HorizontalPanel1' #layout: #(#LayoutFrame 0 0.0 -30 1 0 1.0 0 1.0) + #initiallyInvisible: true #horizontalLayout: #fitSpace #verticalLayout: #center #horizontalSpace: 3 @@ -1277,6 +1456,35 @@ ) ! +prerequisiteClassesItemMenu + "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:#prerequisiteClassesItemMenu + (Menu new fromLiteralArrayEncoding:(ProjectBrowser prerequisiteClassesItemMenu)) startUp + " + + + + ^ + #(#Menu + #( + #(#MenuItem + #label: 'Update' + #translateLabel: true + #value: #updateListOfRequiredPrerequisiteClasses + #enabled: #hasClassesSelectedHolder + ) + ) + nil + nil + ) +! + projectItemMenu "This resource specification was automatically generated by the MenuEditor of ST/X." @@ -1303,6 +1511,12 @@ #enabled: #hasProjectSelectedHolder ) #(#MenuItem + #label: 'Inspect' + #translateLabel: true + #value: #inspectCurrentProject + #enabled: #hasProjectSelectedHolder + ) + #(#MenuItem #label: '-' ) #(#MenuItem @@ -1489,12 +1703,26 @@ ! +canAddSelectedClassToPrerequisites + |holder| + + (holder := builder bindingAt:#canAddSelectedClassToPrerequisites) isNil ifTrue:[ + holder := BlockValue + with:[:m | self canAddClassToPrerequisites:m] + argument:(self selectedClassInPrerequisites). + builder aspectAt:#canAddSelectedClassToPrerequisites put:holder. + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + canAddSelectedProjectToPrerequisites |holder| (holder := builder bindingAt:#canAddSelectedProjectToPrerequisites) isNil ifTrue:[ holder := BlockValue - with:[:m | self canAddToPrerequisites:m] + with:[:m | self canAddProjectToPrerequisites:m] argument:(self selectedProjectInPrerequisites). builder aspectAt:#canAddSelectedProjectToPrerequisites put:holder. ]. @@ -1503,6 +1731,18 @@ "Created: / 23.3.1999 / 14:18:05 / cg" ! +canRemoveSelectedClassFromPrerequisites + |holder| + + (holder := builder bindingAt:#canRemoveSelectedClassFromPrerequisites) isNil ifTrue:[ + holder := BlockValue with:[:m | m notNil] argument:(self selectedRequiredClassInPrerequisites). + builder aspectAt:#canRemoveSelectedClassFromPrerequisites put:holder. + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + canRemoveSelectedProjectFromPrerequisites |holder| @@ -1665,13 +1905,50 @@ "Created: / 23.3.1999 / 14:18:05 / cg" ! +listOfAllClassesInPrerequisites + |holder classes| + + (holder := builder bindingAt:#listOfAllClassesInPrerequisites) isNil ifTrue:[ + builder aspectAt:#listOfAllClassesInPrerequisites put:(holder := SortedCollection new asValue). + + "/ all unloaded classes and classes which where + "/ loaded are candidates. + + classes := Smalltalk allClasses + select:[:cls | + cls isMeta not + and:[ + cls isLoaded not + or:[cls wasAutoloaded]] + ]. + + "/ mark currently loaded classes as bold; + "/ LATER: those which are superclasses of any of my classes bold-red. + + classes := classes collect:[:cls | |nm| + nm := cls name. + cls isLoaded ifTrue:[ + nm := nm asText allBold. + ]. + nm + ]. + holder value addAll:classes. + self currentProject wasLoadedFromFile ifFalse:[ + self updateListOfRequiredPrerequisiteClasses. + ] + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + listOfAllProjectsInPrerequisites "automatically generated by UIPainter ..." |holder projects currentProject| (holder := builder bindingAt:#listOfAllProjectsInPrerequisites) isNil ifTrue:[ - builder aspectAt:#listOfAllProjectsInPrerequisites put:(holder := List new). + builder aspectAt:#listOfAllProjectsInPrerequisites put:(holder := SortedCollection new asValue). currentProject := self currentProject. @@ -1682,8 +1959,23 @@ projects add:p name. ] ]. - projects := projects asOrderedCollection sort. - holder addAll:projects. + holder value addAll:projects. + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + +listOfRequiredClassesInPrerequisites + "automatically generated by UIPainter ..." + + |holder| + + (holder := builder bindingAt:#listOfRequiredClassesInPrerequisites) isNil ifTrue:[ + builder aspectAt:#listOfRequiredClassesInPrerequisites put:(holder := SortedCollection new asValue). + self currentProject wasLoadedFromFile ifFalse:[ + self updateListOfRequiredPrerequisiteClasses. + ] ]. ^ holder. @@ -1696,7 +1988,7 @@ |holder| (holder := builder bindingAt:#listOfRequiredProjectsInPrerequisites) isNil ifTrue:[ - builder aspectAt:#listOfRequiredProjectsInPrerequisites put:(holder := List new). + builder aspectAt:#listOfRequiredProjectsInPrerequisites put:(holder := SortedCollection new asValue). ]. ^ holder. @@ -1817,6 +2109,19 @@ ^ holder. ! +selectedClassInPrerequisites + "automatically generated by UIPainter ..." + + |holder| + + (holder := builder bindingAt:#selectedClassInPrerequisites) isNil ifTrue:[ + builder aspectAt:#selectedClassInPrerequisites put:(holder := ValueHolder new). + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + selectedProjectInPrerequisites "automatically generated by UIPainter ..." @@ -1830,6 +2135,19 @@ "Created: / 23.3.1999 / 14:18:05 / cg" ! +selectedRequiredClassInPrerequisites + "automatically generated by UIPainter ..." + + |holder| + + (holder := builder bindingAt:#selectedRequiredClassInPrerequisites) isNil ifTrue:[ + builder aspectAt:#selectedRequiredClassInPrerequisites put:(holder := ValueHolder new). + ]. + ^ holder. + + "Created: / 23.3.1999 / 14:18:05 / cg" +! + selectedRequiredProjectInPrerequisites "automatically generated by UIPainter ..." @@ -1910,6 +2228,9 @@ self hasClassNodeSelected ifTrue:[ ^ self class classItemMenu ]. + self hasPrerequisiteClassesNodeSelected ifTrue:[ + ^ self class prerequisiteClassesItemMenu + ]. ^ nil ! @@ -1923,7 +2244,11 @@ !ProjectBrowser methodsFor:'private'! -canAddToPrerequisites:aProjectName +canAddClassToPrerequisites:aClassName + ^ aClassName notNil +! + +canAddProjectToPrerequisites:aProjectName ^ aProjectName notNil and:[aProjectName ~= self currentProject name] ! @@ -1983,6 +2308,19 @@ ! +currentProjectsClassNames + |p| + + p := self currentProject. + ^ (p classes ? #()) + collect:[:classOrSymbol | + classOrSymbol isSymbol + ifTrue:[classOrSymbol] + ifFalse:[Smalltalk at:classOrSymbol asSymbol ifAbsent:[classOrSymbol]] + ] + +! + hasClassNodeSelected |selectedNode| @@ -2009,6 +2347,16 @@ ! +hasPrerequisiteClassesNodeSelected + |selectedNode| + + selectedNode := self selectedTreeNode. + selectedNode isNil ifTrue:[^ false]. + + ^ selectedNode contents == #prerequisiteClasses + +! + hasProjectNodeSelected |selectedNode| @@ -2036,7 +2384,8 @@ propertiesNode docNode classesNode patchesNode subprojectsNode filesNode commentNode prerequisitesNode analysisNode designNode codeNode userDocNode userOverViewNode userGuideNode userRefManNode - deploymentNode classIcon| + deploymentNode classIcon + prerequisiteProjectsNode prerequisiteClassesNode| projectName := aProject name. pNode := ProjectNode name:projectName. @@ -2061,6 +2410,7 @@ commentNode icon:(self class commentIcon). commentNode action:[:item | self showCommentOf:item]. + commentNode info:'Some comment describing the project'. commentNode contents:#comment. docNode notNil ifTrue:[ @@ -2078,14 +2428,26 @@ docNode add:(userDocNode := ProjectTreeItem name:'Other'). ]. - prerequisitesNode contents:#prerequisites. prerequisitesNode icon:(self class prerequisitesIcon). - prerequisitesNode spec:[self class rightCanvasSpecForPrerequisites]. + prerequisitesNode add:(prerequisiteProjectsNode := ProjectTreeItem name:'Projects'). + prerequisitesNode add:(prerequisiteClassesNode := ProjectTreeItem name:'Classes'). + prerequisitesNode info:'Other projects and classes required by the project'. + + prerequisiteProjectsNode contents:#prerequisiteProjects. + prerequisiteProjectsNode icon:(self class prerequisiteProjectsIcon). + prerequisiteProjectsNode spec:[self class rightCanvasSpecForPrerequisiteProjects]. + prerequisiteProjectsNode info:'Other projects required by the project'. + + prerequisiteClassesNode contents:#prerequisiteClasses. + prerequisiteClassesNode icon:(self class prerequisiteClassesIcon). + prerequisiteClassesNode spec:[self class rightCanvasSpecForPrerequisiteClasses]. + prerequisiteClassesNode info:'Other (autoloaded-) classes required by the project'. classIcon := self class classIcon. classesNode contents:#classes. classesNode icon:(self class classesIcon). + classesNode info:'Classes contained in the project'. ((aProject classes ? #()) copy sort:[:a :b | |nmA nmB| @@ -2103,17 +2465,22 @@ classesNode add:cNode. ]. + propertiesNode contents:#properties. propertiesNode spec:[self class rightCanvasSpecForProperties]. + propertiesNode info:'Project propreties'. filesNode contents:#files. filesNode icon:(self class filesIcon). + filesNode info:'Other files (bitmaps, data) contained in the project'. patchesNode contents:#patches. patchesNode icon:(self class methodsIcon). + patchesNode info:'Patches (system-changes) contained in the project'. deploymentNode icon:(self class deploymentIcon). deploymentNode spec:[self class rightCanvasSpecForDeployment]. + deploymentNode info:'Deployment & packaging specification.'. ^ pNode @@ -2162,6 +2529,8 @@ self installDirectory value:(p propertyAt:#installDirectory) ? '/opt'. + self listOfRequiredClassesInPrerequisites value:(p prerequisiteClasses copy sort). + modifiedChannel value:false. p addDependent:self. ]. @@ -2201,6 +2570,8 @@ p propertyAt:#deliverLoadAllFile put:self deliverLoadAllFile value. p propertyAt:#installDirectory put:self installDirectory value. + p prerequisiteClasses:(self listOfRequiredClassesInPrerequisites value + collect:[:entry | entry string asSymbol]). p addDependent:self. ]. @@ -2274,14 +2645,6 @@ !ProjectBrowser methodsFor:'user actions'! -accept - "save values from aspects into the project" - - self saveAspectsIntoProject. - modifiedChannel value:false. - -! - addClassesFromFilesInDirectory self addClassesFromFilesInDirectoryWithFilter:nil ! @@ -2316,7 +2679,7 @@ cls isNil ifTrue:[ cls := f withoutSuffix baseName asSymbol. project defaultNameSpace notNil ifTrue:[ - cls := project defaultNameSpace name , '::' , cls + cls := (project defaultNameSpace name , '::' , cls) asSymbol ] ]. (aFilterBlockOrNil isNil @@ -2336,15 +2699,6 @@ ] ! -addToPrerequisites - |sel| - - sel := self selectedProjectInPrerequisites value. - self listOfRequiredProjectsInPrerequisites add:sel. - self listOfAllProjectsInPrerequisites remove:sel. - self selectedProjectInPrerequisites value:nil. -! - browseClasses |ns p classes nBad| @@ -2391,10 +2745,17 @@ ! -cancel - "reload aspects from the project" - - self readAspectsFromProject +inspectCurrentProject + "make the selected Project the current project" + + |project selectedNode| + + self hasProjectNodeSelected ifTrue:[ + selectedNode := self selectedTreeNode. + project := selectedNode contents. + + project inspect. + ] ! itemDoubleClicked:index @@ -2424,6 +2785,8 @@ action notNil ifTrue:[ action value:item. ]. + + self valueOfInfoLabel value: item info ! loadClassesFromDirectory @@ -2472,6 +2835,11 @@ self projectTreeHolder root:projectTree. "/ self projectTreeHolder selectNode:newNode. "/ self projectTreeHolder expand:newNode. + + self readAspectsFromProject. + newProject wasLoadedFromFile ifFalse:[ + self updateListOfRequiredPrerequisiteClasses. + ] ! newSubProject @@ -2515,15 +2883,6 @@ ] ! -removeFromPrerequisites - |sel| - - sel := self selectedRequiredProjectInPrerequisites value. - self listOfAllProjectsInPrerequisites add:sel. - self listOfRequiredProjectsInPrerequisites remove:sel. - self selectedRequiredProjectInPrerequisites value:nil. -! - removeProject |projectToRemove selectedNode subNode newNode parentNode parentProject newProject| @@ -2562,6 +2921,10 @@ saveProject |d p| + self modifiedChannel value ifTrue:[ + (self confirm:'Changes not confirmed; save anyway ?') ifFalse:[^ self] + ]. + p := self currentProject. p directory isNil ifTrue:[ d := (Dialog request:'Project Directory:'). @@ -2695,6 +3058,195 @@ l removeAll. l addAll:classInfo. + +! + +updateListOfRequiredPrerequisiteClasses + "all autoloaded superclasses of my classes are definitely required" + + |p anyChange allInPre requiredInPre nMissing| + + p := self currentProject. + p isNil ifTrue:[^ self]. + anyChange := false. + nMissing := 0. + allInPre := self listOfAllClassesInPrerequisites value. + requiredInPre := self listOfRequiredClassesInPrerequisites value. + + self currentProjectsClassNames do:[:aClassName | + |cls| + + cls := Smalltalk at:aClassName asSymbol. + (cls notNil and:[cls isLoaded]) ifTrue:[ + cls allSuperclasses do:[:superClass | + |sName idx| + + (superClass notNil + and:[superClass isLoaded + and:[superClass wasAutoloaded]]) ifTrue:[ + |sName entry| + + sName := superClass name. + idx := allInPre findFirst:[:item | item string = sName]. + idx ~~ 0 ifTrue:[ + allInPre removeIndex:idx. + requiredInPre add:sName asText allBold. + anyChange := true. + ] + ] + ] + ] ifFalse:[ + nMissing := nMissing + 1. + ] + ]. + + anyChange ifTrue:[ + self listOfRequiredClassesInPrerequisites changed. + self listOfAllClassesInPrerequisites changed. + ]. + nMissing ~~ 0 ifTrue:[ + self information:'Update not complete - ' , nMissing printString + , ' of the projects classes are not loaded'. + ]. + self accept. +! ! + +!ProjectBrowser methodsFor:'user actions - canvas'! + +accept + "save values from aspects into the project" + + self saveAspectsIntoProject. + modifiedChannel value:false. + +! + +addClassToPrerequisites + |sel cls| + + sel := self selectedClassInPrerequisites value. + self listOfRequiredClassesInPrerequisites value add:sel. + self listOfAllClassesInPrerequisites value remove:sel. + self selectedClassInPrerequisites value:nil. + + "/ also add any autoloaded superclass(es) + + cls := Smalltalk at:sel asSymbol. + (cls notNil and:[cls isLoaded]) ifTrue:[ + cls allSuperclasses do:[:superClass | + |sName| + + (superClass notNil + and:[superClass isLoaded + and:[superClass wasAutoloaded]]) ifTrue:[ + |sName idx| + sName := superClass name. + idx := self listOfAllClassesInPrerequisites value findFirst:[:s | s string = sName]. + idx ~~ 0 ifTrue:[ + self listOfAllClassesInPrerequisites value removeIndex:idx. + self listOfRequiredClassesInPrerequisites value add:sName asString allBold. + ]. + ] + ] + ]. + self listOfRequiredClassesInPrerequisites changed. + self listOfAllClassesInPrerequisites changed. + self accept +! + +addProjectToPrerequisites + |sel| + + sel := self selectedProjectInPrerequisites value. + self listOfRequiredProjectsInPrerequisites value add:sel. + self listOfAllProjectsInPrerequisites value remove:sel. + self selectedProjectInPrerequisites value:nil. + + self listOfRequiredProjectsInPrerequisites changed. + self listOfAllProjectsInPrerequisites changed. + self accept + +! + +cancel + "reload aspects from the project" + + self readAspectsFromProject +! + +removeClassFromPrerequisites + |sel cls myClasses| + + sel := self selectedRequiredClassInPrerequisites value. + cls := Smalltalk at:sel asSymbol. + + "/ check if this affects my classes + (cls notNil and:[cls isLoaded and:[cls wasAutoloaded]]) ifTrue:[ + myClasses := self currentProjectsClassNames. + cls allSubclassesDo:[:cls | + (myClasses includes:cls name) ifTrue:[ + self valueOfInfoLabel value:'Attention - this class is required by ' , cls name. + (self confirm:'Attention - this class is required by ' , cls name asText allBold, '.\(The project could later fail to load correctly)\\Really remove ?' withCRs) ifFalse:[ + ^ self + ]. + ]. + ] + ]. + + self listOfAllClassesInPrerequisites value add:sel. + self listOfRequiredClassesInPrerequisites value remove:sel. + self selectedRequiredClassInPrerequisites value:nil. + + "/ also remove any autoloaded subclass(es) + + (cls notNil and:[cls isLoaded and:[cls wasAutoloaded]]) ifTrue:[ + cls allSubclassesDo:[:cls | + |entry| + + entry := self listOfRequiredClassesInPrerequisites value remove:cls name ifAbsent:nil. + entry notNil ifTrue:[ + self listOfAllClassesInPrerequisites value add:cls name. + ] + ] + ]. + + self listOfRequiredClassesInPrerequisites changed. + self listOfAllClassesInPrerequisites changed. + self accept + +! + +removeProjectFromPrerequisites + |sel| + + sel := self selectedRequiredProjectInPrerequisites value. + self listOfAllProjectsInPrerequisites value add:sel. + self listOfRequiredProjectsInPrerequisites value remove:sel. + self selectedRequiredProjectInPrerequisites value:nil. + + self listOfRequiredProjectsInPrerequisites changed. + self listOfAllProjectsInPrerequisites changed. + self accept + +! + +showInfoForRequiredClass:entry + "show why a class is required" + + |cls myClasses| + + entry notNil ifTrue:[ + myClasses := self currentProjectsClassNames asSet. + + cls := Smalltalk at:entry string asSymbol. + cls allSubclasses do:[:subClass | + (myClasses includes:subClass name) ifTrue:[ + self valueOfInfoLabel value:('Required by ' , subClass name). + ^ self. + ] + ]. + ]. + self valueOfInfoLabel value:nil ! ! !ProjectBrowser::ProjectTreeItem methodsFor:'accessing'! @@ -2709,6 +3261,16 @@ action := something.! +info + "return the value of the instance variable 'info' (automatically generated)" + + ^ info! + +info:something + "set the value of the instance variable 'info' (automatically generated)" + + info := something.! + spec "return the value of the instance variable 'spec' (automatically generated)"