ProjectBrowser.st
author Patrik Svestka <patrik.svestka@gmail.com>
Wed, 14 Nov 2018 12:07:51 +0100
branchjv
changeset 3630 5e718e0a754e
parent 2995 2e0905efe842
permissions -rw-r--r--
Issue #239: Fix all Smalltak/X source files to be in unicode (UTF8 without BOM) and prefixed by "{ Encoding: utf8 }" when any unicode character is present

- All source *.st files are now Unicode UTF8 without BOM
Files are in two groups (fileOut works this way in Smalltalk/X):
- containing a unicode character have "{ Encoding: utf8 }" at the header
- ASCII only are without the header
     1 "
     2  COPYRIGHT (c) 1999 by eXept Software AG
     3 	      All Rights Reserved
     4 
     5  This software is furnished under a license and may be used
     6  only in accordance with the terms of that license and with the
     7  inclusion of the above copyright notice. This software may not
     8  be provided or otherwise made available to, or used by, any
     9  other person. No title to or ownership of the software is
    10  hereby transferred.
    11 "
    12 "{ Package: 'stx:libtool2' }"
    13 
    14 ToolApplicationModel subclass:#ProjectBrowser
    15 	instanceVariableNames:'projectTree modifiedChannel selectedTreeNodeHolder
    16 		lastMoveToProject'
    17 	classVariableNames:'AlreadCheckedExistingModulesAndPackages'
    18 	poolDictionaries:''
    19 	category:'Interface-Tools'
    20 !
    21 
    22 TreeItemWithImage subclass:#ProjectTreeItem
    23 	instanceVariableNames:'action spec info'
    24 	classVariableNames:''
    25 	poolDictionaries:''
    26 	privateIn:ProjectBrowser
    27 !
    28 
    29 ProjectBrowser::ProjectTreeItem subclass:#ProjectNode
    30 	instanceVariableNames:''
    31 	classVariableNames:''
    32 	poolDictionaries:''
    33 	privateIn:ProjectBrowser
    34 !
    35 
    36 !ProjectBrowser class methodsFor:'documentation'!
    37 
    38 copyright
    39 "
    40  COPYRIGHT (c) 1999 by eXept Software AG
    41 	      All Rights Reserved
    42 
    43  This software is furnished under a license and may be used
    44  only in accordance with the terms of that license and with the
    45  inclusion of the above copyright notice. This software may not
    46  be provided or otherwise made available to, or used by, any
    47  other person. No title to or ownership of the software is
    48  hereby transferred.
    49 "
    50 
    51 
    52 
    53 !
    54 
    55 documentation
    56 "
    57     Obsolete - before even going into production...
    58 
    59     The new project browser & builder.
    60     This one will (eventually) make packaging of classLibraries and
    61     applications easier. 
    62 
    63     EXPERIMENTAL: not finished.
    64 
    65     [start with:]
    66         ProjectBrowser open
    67 
    68     [see also:]
    69         Project
    70 
    71     [author:]
    72         Claus Gittinger, eXept Software AG
    73 "
    74 ! !
    75 
    76 !ProjectBrowser class methodsFor:'class initialization'!
    77 
    78 initialize
    79     "add myself to the launchers tool menu"
    80 
    81     |menuItem|
    82     menuItem := MenuItem new 
    83                     translateLabel: true;
    84                     value: [ProjectBrowser open];
    85                     label:'Project Builder' icon:nil;
    86                     nameKey: #projectBrowserIcon;
    87                     activeHelpKey: #projectBrowserIcon.
    88 
    89     NewLauncher 
    90         addMenuItem:menuItem 
    91         from:self
    92         in:'menu.tools' 
    93         position:#( #after #changesBrowser) 
    94         space:true.
    95 "/    NewLauncher allInstancesDo:[:l |
    96 "/        l addUserTool:'Project Builder' 
    97 "/          action:[ProjectBrowser open] 
    98 "/          in:#menu 
    99 "/          after:'Changes Browser' 
   100 "/          icon:self projectBrowserIcon 
   101 "/          space:false
   102 "/    ].
   103 
   104     "
   105      self initialize
   106     "
   107     "
   108      NewLauncher allInstancesDo:[:l |
   109         l removeUserTool:'Project Builder'
   110      ]
   111     "
   112 ! !
   113 
   114 !ProjectBrowser class methodsFor:'help specs'!
   115 
   116 helpSpec
   117     "This resource specification was automatically generated
   118      by the UIHelpTool of ST/X."
   119 
   120     "Do not manually edit this!! If it is corrupted,
   121      the UIHelpTool may not be able to read the specification."
   122 
   123     "
   124      UIHelpTool openOnClass:ProjectBrowser    
   125     "
   126 
   127     <resource: #help>
   128 
   129     ^super helpSpec addPairsFrom:#(
   130 
   131 #accept
   132 'Accept modifications made here.'
   133 
   134 #appType
   135 'An application - ie an executable program (and support files if any).'
   136 
   137 #cancel
   138 'Undo modifications made here.'
   139 
   140 #defaultNamespace
   141 'Namespace for new classes when created in the Browser.'
   142 
   143 #deliverGZipArchive
   144 'Package delivery into a gzip archive (for unix)'
   145 
   146 #deliverTarArchive
   147 'Package delivery into a tar archive (for unix)'
   148 
   149 #deliverZipArchive
   150 'Package delivery into a zip archive (for win32)'
   151 
   152 #deliverCompiledBinary
   153 'Create and deliver as compiled binary (classLibrary) - will only execute on the running systems architecture.'
   154 
   155 #deliverByteCode
   156 'Create and deliver as bytecode - portable across architectures.'
   157 
   158 #deliverLoadAll
   159 'Deliver a loadAll script file, which files-In the other files.'
   160 
   161 #deliverSources
   162 'Include smalltalk sourceCode in the delivery.'
   163 
   164 #deliverMakefiles
   165 'Include makefiles in the delivery.'
   166 
   167 #includeSource
   168 'Include smalltalk sourceCode in the delivery.'
   169 
   170 #installDirMacOS
   171 'The final install directory for MacOS deliveries.'
   172 
   173 #installDirUnix
   174 'The final install directory for UNIX deliveries.'
   175 
   176 #installDirVMS
   177 'The final install directory for VMS deliveries.'
   178 
   179 #installDirWin32
   180 'The final install directory for Win32 deliveries.'
   181 
   182 #libType
   183 'A classLibrary addOn (and support files if any)'
   184 
   185 loadProjectCode
   186 'Load projects classes from the project directory'
   187 
   188 #methodsFile
   189 'Patches & Extensions are stored in this file.'
   190 
   191 #packageID
   192 'Package ID used to associate classes & methods to this project.'
   193 
   194 #projectDir
   195 'The projects directory.'
   196 
   197 #repositoryDirectory
   198 'The directory path below the module in the source-repository.'
   199 
   200 #repositoryModule
   201 'The module (top directory) in the source-repository.'
   202 
   203 #saveProjectFile
   204 'Write a new .prj file.'
   205 
   206 )
   207 ! !
   208 
   209 !ProjectBrowser class methodsFor:'image specs'!
   210 
   211 bigProjectBrowserIcon
   212     "This resource specification was automatically generated
   213      by the ImageEditor of ST/X."
   214 
   215     "Do not manually edit this!! If it is corrupted,
   216      the ImageEditor may not be able to read the specification."
   217 
   218     "
   219      self bigProjectBrowserIcon inspect
   220      ImageEditor openOnClass:self andSelector:#bigProjectBrowserIcon
   221     "
   222 
   223     <resource: #image>
   224 
   225     ^Icon
   226 	constantNamed:#'ProjectBrowser bigProjectBrowserIcon'
   227 	ifAbsentPut:[(Depth2Image new) width: 48; height: 48; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   228 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@U@@EUP@@@@@@@@@@U@@EUP@@@@@@@@@UUP
   229 @UUU@@@@@@@@EUEPEP@U@@@@@@@@EUEPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEPUU@@@@@@@@EU%Z%UU*(@@@
   230 @@@@EU%Z%UU*"@@@@@@@EUUZUUZ*J@@@@@@@EUUUUUUU*@@@@@@@EUUUUUUU*@@@@@@@J**UU**E*@@@@@@@**%UZ*(%*@@@@@@B**%UZ*"%*@@@@@@@@@UU
   231 @@J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@
   232 @@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%(@@@@@@J**UZ**J% @@@@@@J**UZ**J%@@@@@@@J**UZ**J%@@@@@@@J**UZ**J%@@@@@@@J**UZ
   233 **J@@@@@@@@J**UZ**H@@@@@@@@J**UZ**@@@@@@@@@@@@UP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   234 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 48; height: 48; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   235 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8C<@@@@@8C<@@@@G<G?@@@@_\\G@@@@_\\G@@@@8\\G@@@@8\\G@@@@8\\G@@@@8???<@@@_???<@
   236 @@_???<@@@_???<@@@_???<@@@_???<@@@????<@@A????<@@C????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@
   237 @G????<@@G????<@@G????8@@G????0@@G???? @@G????@@@G????@@@G???<@@@G???8@@@G???0@@@G??? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   238 @@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
   239 !
   240 
   241 bigProjectBrowserIcon2
   242     "This resource specification was automatically generated
   243      by the ImageEditor of ST/X."
   244 
   245     "Do not manually edit this!! If it is corrupted,
   246      the ImageEditor may not be able to read the specification."
   247 
   248     "
   249      self bigProjectBrowserIcon2 inspect
   250      ImageEditor openOnClass:self andSelector:#bigProjectBrowserIcon2
   251     "
   252 
   253     <resource: #image>
   254 
   255     ^Icon
   256 	constantNamed:#'ProjectBrowser bigProjectBrowserIcon2'
   257 	ifAbsentPut:[(Depth2Image new) width: 48; height: 48; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   258 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@U@@EUP@@@@@@@@@@U@@EUP@@@@@@@@@UUP
   259 @UUU@@@@@@@@EUEPEP@U@@@@@@@@EUEPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEP@U@@@@@@@@U@EPEPUU@@@@@@@@EU%Z%UU*(@@@
   260 @@@@EU%Z%UU*"@@@@@@@EUUZUUZ*J@@@@@@@EUUUUUUU*@@@@@@@EUUUUUUU*@@@@@@@J**UU**E*@@@@@@@**%UZ*(%*@@@@@@B**%UZ*"%*@@@@@@@@@UU
   261 @@J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%*@@@
   262 @@@J**UZ**J%*@@@@@@J**UZ**J%*@@@@@@J**UZ**J%(@@@@@@J**UZ**J% @@@@@@J**UZ**J%@@@@@@@J**UZ**J%@@@@@@@J**UZ**J%@@@@@@@J**UZ
   263 **J@@@@@@@@J**UZ**H@@@@@@@@J**UZ**@@@@@@@@@@@@UP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   264 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 48; height: 48; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   265 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8C<@@@@@8C<@@@@G<G?@@@@_\\G@@@@_\\G@@@@8\\G@@@@8\\G@@@@8\\G@@@@8???<@@@_???<@
   266 @@_???<@@@_???<@@@_???<@@@_???<@@@????<@@A????<@@C????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@@G????<@
   267 @G????<@@G????<@@G????8@@G????0@@G???? @@G????@@@G????@@@G???<@@@G???8@@@G???0@@@G??? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   268 @@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
   269 !
   270 
   271 buildOptionsIcon
   272     "This resource specification was automatically generated
   273      by the ImageEditor of ST/X."
   274 
   275     "Do not manually edit this!! If it is corrupted,
   276      the ImageEditor may not be able to read the specification."
   277 
   278     "
   279      self buildOptionsIcon inspect
   280      ImageEditor openOnClass:self andSelector:#buildOptionsIcon
   281     "
   282 
   283     <resource: #image>
   284 
   285     ^Icon
   286 	constantNamed:#'ProjectBrowser buildOptionsIcon'
   287 	ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ATET@AUEE@APQAP@TDQT@AY%Z@@UUUX@J%*F@@E@I B)Z"X@*V(&@J%*I B)Z"X@*V($@J%*I@B)Z @@@T@@@@a') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A30O[A%LF?<O?0??G?<??3??O?<??3??O?8??C?8O?@b') ; yourself); yourself]
   288 !
   289 
   290 classIcon
   291     "This resource specification was automatically generated
   292      by the ImageEditor of ST/X."
   293 
   294     "Do not manually edit this!! If it is corrupted,
   295      the ImageEditor may not be able to read the specification."
   296 
   297     "
   298      self classIcon inspect
   299      ImageEditor openOnClass:self andSelector:#classIcon
   300     "
   301 
   302     <resource: #image>
   303 
   304     ^Icon
   305 	constantNamed:#'ProjectBrowser classIcon'
   306 	ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUEUUUUQP@@@TTV*%EE@@@AQQUUTTTZ*)@@@@@@@AUUT@@Z*)@@EUUQQQ**$TTUUUEE@@@@AQUUUUTUUUUP@a') ; colorMapFromArray:#[0 0 0 255 255 255 132 130 132]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@C?8O? ?>C?8O? ?>C?8O? ?>C?8O? ?>@@@@@@b') ; yourself); yourself]
   307 !
   308 
   309 classesIcon
   310     "This resource specification was automatically generated
   311      by the ImageEditor of ST/X."
   312 
   313     "Do not manually edit this!! If it is corrupted,
   314      the ImageEditor may not be able to read the specification."
   315 
   316     "
   317      self classesIcon inspect
   318      ImageEditor openOnClass:self andSelector:#classesIcon
   319     "
   320 
   321     <resource: #image>
   322 
   323     ^Icon
   324 	constantNamed:#'ProjectBrowser classesIcon'
   325 	ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@B"B%U(( @@@@HJ**"BBUUX @***H @@@BHB**("@)UZH J**"HB**("@@@@H (***HJ@@@BB*J** * @@@@@a') ; colorMapFromArray:#[0 0 0 132 130 132 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?>C?8O?8??#??/?>??;??/?>??;??/?>O?8?? ?>C?8b') ; yourself); yourself]
   326 !
   327 
   328 commentIcon
   329     "This resource specification was automatically generated
   330      by the ImageEditor of ST/X."
   331 
   332     "Do not manually edit this!! If it is corrupted,
   333      the ImageEditor may not be able to read the specification."
   334 
   335     "
   336      self commentIcon inspect
   337      ImageEditor openOnClass:self andSelector:#commentIcon
   338     "
   339 
   340     <resource: #image>
   341 
   342     ^Icon
   343 	constantNamed:#'ProjectBrowser commentIcon'
   344 	ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'******************U****%Z***)V*********%Z***!!T***(UJ***ER***!!T***(UJ**(UT***(B****(** @a') ; colorMapFromArray:#[0 0 0 0 0 255 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   345 @@@@@@@@@8@C @N@@@@C @N@@8@C @N@@8@G0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   346 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   347 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
   348 !
   349 
   350 deploymentIcon
   351     "This resource specification was automatically generated
   352      by the ImageEditor of ST/X."
   353 
   354     "Do not manually edit this!! If it is corrupted,
   355      the ImageEditor may not be able to read the specification."
   356 
   357     "
   358      self deploymentIcon inspect
   359      ImageEditor openOnClass:self andSelector:#deploymentIcon
   360     "
   361 
   362     <resource: #image>
   363 
   364     ^Icon
   365 	constantNamed:#'ProjectBrowser deploymentIcon'
   366 	ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ATET@AUEE@APQAP@TDQT@AY%Z@@UUUX@J%*F@@E@I B)Z"X@*V(&@J%*I B)Z"X@*V($@J%*I@B)Z @@@T@@@@a') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A30O[A%LF?<O?0??G?<??3??O?<??3??O?8??C?8O?@b') ; yourself); yourself]
   367 !
   368 
   369 filesIcon
   370     "This resource specification was automatically generated
   371      by the ImageEditor of ST/X."
   372 
   373     "Do not manually edit this!! If it is corrupted,
   374      the ImageEditor may not be able to read the specification."
   375 
   376     "
   377      self filesIcon inspect
   378      ImageEditor openOnClass:self andSelector:#filesIcon
   379     "
   380 
   381     <resource: #image>
   382 
   383     ^Icon
   384 	constantNamed:#'ProjectBrowser filesIcon'
   385 	ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@G:@P@A_(E@@U>!!W;E_ U?9W?!!_>E?8G? _>@@@b') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@C? O?@?>C?<O?8??3??/??????????O?<??0??C?<b') ; yourself); yourself]
   386 !
   387 
   388 methodIcon
   389     "This resource specification was automatically generated
   390      by the ImageEditor of ST/X."
   391 
   392     "Do not manually edit this!! If it is corrupted,
   393      the ImageEditor may not be able to read the specification."
   394 
   395     "
   396      self methodIcon inspect
   397      ImageEditor openOnClass:self andSelector:#methodIcon
   398     "
   399 
   400     <resource: #image>
   401 
   402     ^Icon
   403 	constantNamed:#'ProjectBrowser methodIcon'
   404 	ifAbsentPut:[(Depth4Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DH@@@@@@@@4QA@@@@@@@TQDPP@@@@@@MDQDH@@@@@@PQDQA@@@@@@LTQA@@@@@@@@I@L@@@@@@@@QD@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 0 0 132 132 0 0 132 0 132 255 0 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@B@@\@C8@_0A? C?@G<@O @\@@ @@@@@@@@@b') ; yourself); yourself]
   405 !
   406 
   407 methodsIcon
   408     "This resource specification was automatically generated
   409      by the ImageEditor of ST/X."
   410 
   411     "Do not manually edit this!! If it is corrupted,
   412      the ImageEditor may not be able to read the specification."
   413 
   414     "
   415      self multipleUnlockedMagentaIcon inspect
   416      ImageEditor openOnClass:self andSelector:#multipleUnlockedMagentaIcon
   417     "
   418 
   419     <resource: #image>
   420 
   421     ^Icon
   422 	constantNamed:#'ProjectBrowser methodsIcon'
   423 	ifAbsentPut:[(Depth4Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@DH@@@@@@@@4QA@@@@@@@TQDPP@@@@@@MDQDH@@@@@@PQDQA@@@@@@LTQA@@@@@@M@I@L@@@@@EDPQD@@@@@@CQDIB@@@@@@DDQDPP@@@@@CEDPP@@@@@@@BPC@@@@@@@@DQ@@@@@@@@@B@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 0 0 132 132 0 0 132 0 132 255 0 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'B@@\@C8@_0A? C?@G<@? G<@_8@?0A?@C8@G@@H@@@@b') ; yourself); yourself]
   424 
   425 
   426 !
   427 
   428 prerequisiteClassesIcon
   429     <resource: #programImage>
   430 
   431     ^ self classesIcon
   432 !
   433 
   434 prerequisitePackagesIcon
   435     <resource: #programImage>
   436 
   437     ^ self projectsIcon
   438 !
   439 
   440 prerequisitesIcon
   441     "This resource specification was automatically generated
   442      by the ImageEditor of ST/X."
   443 
   444     "Do not manually edit this!! If it is corrupted,
   445      the ImageEditor may not be able to read the specification."
   446 
   447     "
   448      self prerequisitesIcon inspect
   449      ImageEditor openOnClass:self andSelector:#prerequisitesIcon
   450     "
   451 
   452     <resource: #image>
   453 
   454     ^Icon
   455 	constantNamed:#'ProjectBrowser prerequisitesIcon'
   456 	ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@C@@L@@@@@@@@@@0A#@F@@X@@@@@L@@0@@@@@@@b') ; colorMapFromArray:#[0 0 0 127 127 127]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@A8@G(@^PA80@C@^@=8S7//^D<@C7#@^LA9@G(@@@@b') ; yourself); yourself]
   457 !
   458 
   459 projectBrowserIcon
   460     "This resource specification was automatically generated
   461      by the ImageEditor of ST/X."
   462 
   463     "Do not manually edit this!! If it is corrupted,
   464      the ImageEditor may not be able to read the specification."
   465 
   466     "
   467      self projectBrowserIcon inspect
   468      ImageEditor openOnClass:self andSelector:#projectBrowserIcon
   469     "
   470 
   471     <resource: #image>
   472 
   473     ^Icon
   474 	constantNamed:#'ProjectBrowser projectBrowserIcon'
   475 	ifAbsentPut:[(Depth2Image new) width: 32; height: 32; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   476 @@@T@ET@@@@@@UTAUT@@@@@EQPTAP@@@@APEAPE@@@@@E@TE@T@@@@@TAPTUP@@@@@U%)UZ @@@@AUVUV( @@@@EUUUUZ@@@@@*)U*!!(@@@@B*UZ(& @@@@@
   477 ET@JZ@@@@J*U*()(@@@@*)V*"& @@@B*%Z*JZ@@@@J*U*()(@@@@*)V*"& @@@B*%Z*JZ@@@@J*U*() @@@@*)V*"$@@@@B*%Z*JP@@@@J*U*( @@@@@*)V*
   478  @@@@@@@EP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 32; height: 32; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
   479 @FC0@@G1>@@C,1 @A#LX@@X3F@@F_?<@@???@@O??0@C??<@A???@@_??0@_??<@G???@A???0@_??<@G???@A???0@_??<@G??>@A???@@_?? @G??0@A??
   480 8@@_?<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; yourself); yourself]
   481 !
   482 
   483 projectsIcon
   484     "This resource specification was automatically generated
   485      by the ImageEditor of ST/X."
   486 
   487     "Do not manually edit this!! If it is corrupted,
   488      the ImageEditor may not be able to read the specification."
   489 
   490     "
   491      self projectsIcon inspect
   492      ImageEditor openOnClass:self andSelector:#projectsIcon
   493     "
   494 
   495     <resource: #image>
   496 
   497     ^Icon
   498 	constantNamed:#'ProjectBrowser projectsIcon'
   499 	ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@_8C?P_;@@\O=0?7C?\O=0?6C?PO<@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 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]
   500 ! !
   501 
   502 !ProjectBrowser class methodsFor:'interface specs'!
   503 
   504 classValidationDialogSpec
   505     "This resource specification was automatically generated
   506      by the UIPainter of ST/X."
   507 
   508     "Do not manually edit this!! If it is corrupted,
   509      the UIPainter may not be able to read the specification."
   510 
   511     "
   512      UIPainter new openOnClass:ProjectBrowser andSelector:#classValidationDialogSpec
   513      ProjectBrowser new openInterface:#classValidationDialogSpec
   514     "
   515 
   516     <resource: #canvas>
   517 
   518     ^ 
   519      #(#FullSpec
   520 	#name: #classValidationDialogSpec
   521 	#window: 
   522        #(#WindowSpec
   523 	  #label: 'ProjectBrowser'
   524 	  #name: 'ProjectBrowser'
   525 	  #min: #(#Point 10 10)
   526 	  #max: #(#Point 1024 768)
   527 	  #bounds: #(#Rectangle 24 554 457 1003)
   528 	  #menu: #mainMenu
   529 	  #icon: #bigProjectBrowserIcon
   530 	)
   531 	#component: 
   532        #(#SpecCollection
   533 	  #collection: #(
   534 	   #(#VariableVerticalPanelSpec
   535 	      #name: 'VariableVerticalPanel1'
   536 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -30 1.0)
   537 	      #handles: 
   538 	     #(#OrderedCollection
   539 		#Any 0.5
   540 		1.0
   541 	      )
   542 	      #component: 
   543 	     #(#SpecCollection
   544 		#collection: #(
   545 		 #(#ViewSpec
   546 		    #name: 'Box1'
   547 		    #component: 
   548 		   #(#SpecCollection
   549 		      #collection: #(
   550 		       #(#LabelSpec
   551 			  #label: 'Classes only in Image'
   552 			  #name: 'Label1'
   553 			  #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
   554 			  #translateLabel: true
   555 			  #adjust: #left
   556 			)
   557 		       #(#SequenceViewSpec
   558 			  #name: 'List2'
   559 			  #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
   560 			  #hasHorizontalScrollBar: true
   561 			  #hasVerticalScrollBar: true
   562 			  #useIndex: false
   563 			  #sequenceList: #classesInImageOnly
   564 			)
   565 		       )
   566                      
   567 		    )
   568 		  )
   569 		 #(#ViewSpec
   570 		    #name: 'Box2'
   571 		    #component: 
   572 		   #(#SpecCollection
   573 		      #collection: #(
   574 		       #(#LabelSpec
   575 			  #label: 'Classes only in Project'
   576 			  #name: 'Label2'
   577 			  #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
   578 			  #translateLabel: true
   579 			  #adjust: #left
   580 			)
   581 		       #(#SequenceViewSpec
   582 			  #name: 'List1'
   583 			  #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
   584 			  #hasHorizontalScrollBar: true
   585 			  #hasVerticalScrollBar: true
   586 			  #useIndex: false
   587 			  #sequenceList: #classesInProjectOnly
   588 			)
   589 		       )
   590                      
   591 		    )
   592 		  )
   593 		 )
   594                
   595 	      )
   596 	    )
   597 	   #(#HorizontalPanelViewSpec
   598 	      #name: 'HorizontalPanel1'
   599 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
   600 	      #horizontalLayout: #center
   601 	      #verticalLayout: #center
   602 	      #horizontalSpace: 3
   603 	      #verticalSpace: 3
   604 	      #component: 
   605 	     #(#SpecCollection
   606 		#collection: #(
   607 		 #(#ActionButtonSpec
   608 		    #label: 'OK'
   609 		    #name: 'Button1'
   610 		    #translateLabel: true
   611 		    #model: #closeRequest
   612 		    #extent: #(#Point 125 22)
   613 		  )
   614 		 )
   615                
   616 	      )
   617 	    )
   618 	   )
   619          
   620 	)
   621       )
   622 !
   623 
   624 emptyRightCanvasSpec
   625     "This resource specification was automatically generated
   626      by the UIPainter of ST/X."
   627 
   628     "Do not manually edit this!! If it is corrupted,
   629      the UIPainter may not be able to read the specification."
   630 
   631     "
   632      UIPainter new openOnClass:ProjectBrowser andSelector:#emptyRightCanvasSpec
   633      ProjectBrowser new openInterface:#emptyRightCanvasSpec
   634     "
   635 
   636     <resource: #canvas>
   637 
   638     ^ 
   639      #(#FullSpec
   640 	#name: #emptyRightCanvasSpec
   641 	#window: 
   642        #(#WindowSpec
   643 	  #label: 'NewApplication'
   644 	  #name: 'NewApplication'
   645 	  #min: #(#Point 10 10)
   646 	  #max: #(#Point 1280 1024)
   647 	  #bounds: #(#Rectangle 10 20 310 320)
   648 	)
   649 	#component: 
   650        #(#SpecCollection
   651 	  #collection: #(
   652 	   #(#TextEditorSpec
   653 	      #name: 'TextEditor1'
   654 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
   655 	      #initiallyInvisible: true
   656 	      #model: #rightCanvasTextHolder
   657 	      #hasHorizontalScrollBar: true
   658 	      #hasVerticalScrollBar: true
   659 	      #miniScrollerHorizontal: true
   660 	      #isReadOnly: true
   661 	    )
   662 	   )
   663          
   664 	)
   665       )
   666 !
   667 
   668 methodValidationDialogSpec
   669     "This resource specification was automatically generated
   670      by the UIPainter of ST/X."
   671 
   672     "Do not manually edit this!! If it is corrupted,
   673      the UIPainter may not be able to read the specification."
   674 
   675     "
   676      UIPainter new openOnClass:ProjectBrowser andSelector:#classValidationDialogSpec
   677      ProjectBrowser new openInterface:#classValidationDialogSpec
   678     "
   679 
   680     <resource: #canvas>
   681 
   682     ^ 
   683      #(#FullSpec
   684 	#name: #classValidationDialogSpec
   685 	#window: 
   686        #(#WindowSpec
   687 	  #label: 'ProjectBrowser'
   688 	  #name: 'ProjectBrowser'
   689 	  #min: #(#Point 10 10)
   690 	  #max: #(#Point 1024 768)
   691 	  #bounds: #(#Rectangle 24 554 457 1003)
   692 	  #menu: #mainMenu
   693 	  #icon: #bigProjectBrowserIcon
   694 	)
   695 	#component: 
   696        #(#SpecCollection
   697 	  #collection: #(
   698 	   #(#VariableVerticalPanelSpec
   699 	      #name: 'VariableVerticalPanel1'
   700 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -30 1.0)
   701 	      #handles: 
   702 	     #(#OrderedCollection
   703 		#Any 0.5
   704 		1.0
   705 	      )
   706 	      #component: 
   707 	     #(#SpecCollection
   708 		#collection: #(
   709 		 #(#ViewSpec
   710 		    #name: 'Box1'
   711 		    #component: 
   712 		   #(#SpecCollection
   713 		      #collection: #(
   714 		       #(#LabelSpec
   715 			  #label: 'Methods only in Image'
   716 			  #name: 'Label1'
   717 			  #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
   718 			  #translateLabel: true
   719 			  #adjust: #left
   720 			)
   721 		       #(#SequenceViewSpec
   722 			  #name: 'List2'
   723 			  #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
   724 			  #hasHorizontalScrollBar: true
   725 			  #hasVerticalScrollBar: true
   726 			  #useIndex: false
   727 			  #sequenceList: #methodsInImageOnly
   728 			)
   729 		       )
   730                      
   731 		    )
   732 		  )
   733 		 #(#ViewSpec
   734 		    #name: 'Box2'
   735 		    #component: 
   736 		   #(#SpecCollection
   737 		      #collection: #(
   738 		       #(#LabelSpec
   739 			  #label: 'Methods only in Project'
   740 			  #name: 'Label2'
   741 			  #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
   742 			  #translateLabel: true
   743 			  #adjust: #left
   744 			)
   745 		       #(#SequenceViewSpec
   746 			  #name: 'List1'
   747 			  #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
   748 			  #hasHorizontalScrollBar: true
   749 			  #hasVerticalScrollBar: true
   750 			  #useIndex: false
   751 			  #sequenceList: #methodsInProjectOnly
   752 			)
   753 		       )
   754                      
   755 		    )
   756 		  )
   757 		 )
   758                
   759 	      )
   760 	    )
   761 	   #(#HorizontalPanelViewSpec
   762 	      #name: 'HorizontalPanel1'
   763 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
   764 	      #horizontalLayout: #center
   765 	      #verticalLayout: #center
   766 	      #horizontalSpace: 3
   767 	      #verticalSpace: 3
   768 	      #component: 
   769 	     #(#SpecCollection
   770 		#collection: #(
   771 		 #(#ActionButtonSpec
   772 		    #label: 'OK'
   773 		    #name: 'Button1'
   774 		    #translateLabel: true
   775 		    #model: #closeRequest
   776 		    #extent: #(#Point 125 22)
   777 		  )
   778 		 )
   779                
   780 	      )
   781 	    )
   782 	   )
   783          
   784 	)
   785       )
   786 !
   787 
   788 rightCanvasSpecForBuildOptions
   789     "This resource specification was automatically generated
   790      by the UIPainter of ST/X."
   791 
   792     "Do not manually edit this!! If it is corrupted,
   793      the UIPainter may not be able to read the specification."
   794 
   795     "
   796      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForBuildOptions
   797      ProjectBrowser new openInterface:#rightCanvasSpecForBuildOptions
   798     "
   799 
   800     <resource: #canvas>
   801 
   802     ^ 
   803      #(#FullSpec
   804 	#name: #rightCanvasSpecForBuildOptions
   805 	#window: 
   806        #(#WindowSpec
   807 	  #label: 'NewApplication'
   808 	  #name: 'NewApplication'
   809 	  #min: #(#Point 10 10)
   810 	  #max: #(#Point 1280 1024)
   811 	  #bounds: #(#Rectangle 216 173 577 536)
   812 	)
   813 	#component: 
   814        #(#SpecCollection
   815 	  #collection: #(
   816 	   #(#FramedBoxSpec
   817 	      #label: 'STC Compiler Warnings'
   818 	      #name: 'FramedBox2'
   819 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 146 0)
   820 	      #labelPosition: #topLeft
   821 	      #translateLabel: true
   822 	      #component: 
   823 	     #(#SpecCollection
   824 		#collection: #(
   825 		 #(#CheckBoxSpec
   826 		    #label: 'Non Standard Language Features'
   827 		    #name: 'CheckBox1'
   828 		    #layout: #(#LayoutFrame 0 0.0 9 0 0 1.0 31 0)
   829 		    #tabable: true
   830 		    #model: #makeWarnNonStandard
   831 		    #translateLabel: true
   832 		  )
   833 		 #(#CheckBoxSpec
   834 		    #label: 'End-of-line Comments'
   835 		    #name: 'CheckBox2'
   836 		    #layout: #(#LayoutFrame 0 0.0 36 0 0 1.0 58 0)
   837 		    #tabable: true
   838 		    #model: #makeWarnEOLComments
   839 		    #translateLabel: true
   840 		  )
   841 		 #(#LabelSpec
   842 		    #label: 'other warning options:'
   843 		    #name: 'Label3'
   844 		    #layout: #(#LayoutFrame 0 0.0 69 0 0 1.0 91 0)
   845 		    #translateLabel: true
   846 		    #adjust: #left
   847 		  )
   848 		 #(#InputFieldSpec
   849 		    #name: 'EntryField1'
   850 		    #layout: #(#LayoutFrame 0 0.0 93 0 0 1.0 115 0)
   851 		    #activeHelpKey: #projectDir
   852 		    #tabable: true
   853 		    #model: #makeOtherWarningOptions
   854 		    #acceptChannel: #acceptChannel
   855 		    #modifiedChannel: #modifiedChannel
   856 		    #acceptOnPointerLeave: false
   857 		  )
   858 		 )
   859                
   860 	      )
   861 	    )
   862 	   #(#FramedBoxSpec
   863 	      #label: 'STC Compiler Includes'
   864 	      #name: 'FramedBox3'
   865 	      #layout: #(#LayoutFrame 0 0.0 146 0.0 0 1.0 203 0)
   866 	      #labelPosition: #topLeft
   867 	      #translateLabel: true
   868 	      #component: 
   869 	     #(#SpecCollection
   870 		#collection: #(
   871 		 #(#InputFieldSpec
   872 		    #name: 'EntryField2'
   873 		    #layout: #(#LayoutFrame 0 0.0 4 0 0 1.0 26 0)
   874 		    #activeHelpKey: #repositoryModule
   875 		    #tabable: true
   876 		    #model: #makeIncludes
   877 		    #acceptChannel: #acceptChannel
   878 		    #modifiedChannel: #modifiedChannel
   879 		    #acceptOnPointerLeave: false
   880 		  )
   881 		 )
   882                
   883 	      )
   884 	    )
   885 	   #(#FramedBoxSpec
   886 	      #label: 'STC Compiler Defines'
   887 	      #name: 'FramedBox5'
   888 	      #layout: #(#LayoutFrame 0 0.0 210 0.0 0 1.0 267 0)
   889 	      #labelPosition: #topLeft
   890 	      #translateLabel: true
   891 	      #component: 
   892 	     #(#SpecCollection
   893 		#collection: #(
   894 		 #(#InputFieldSpec
   895 		    #name: 'EntryField5'
   896 		    #layout: #(#LayoutFrame 0 0.0 4 0 0 1.0 26 0)
   897 		    #activeHelpKey: #repositoryModule
   898 		    #tabable: true
   899 		    #model: #makeDefines
   900 		    #acceptChannel: #acceptChannel
   901 		    #modifiedChannel: #modifiedChannel
   902 		    #acceptOnPointerLeave: false
   903 		  )
   904 		 )
   905                
   906 	      )
   907 	    )
   908 	   #(#HorizontalPanelViewSpec
   909 	      #name: 'HorizontalPanel1'
   910 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
   911 	      #horizontalLayout: #fitSpace
   912 	      #verticalLayout: #center
   913 	      #horizontalSpace: 3
   914 	      #verticalSpace: 3
   915 	      #component: 
   916 	     #(#SpecCollection
   917 		#collection: #(
   918 		 #(#ActionButtonSpec
   919 		    #label: 'Cancel'
   920 		    #name: 'Button1'
   921 		    #activeHelpKey: #cancel
   922 		    #translateLabel: true
   923 		    #model: #cancel
   924 		    #enableChannel: #modifiedChannel
   925 		    #actionValue: ''
   926 		    #useDefaultExtent: true
   927 		  )
   928 		 #(#ActionButtonSpec
   929 		    #label: 'OK'
   930 		    #name: 'Button2'
   931 		    #activeHelpKey: #accept
   932 		    #translateLabel: true
   933 		    #model: #accept
   934 		    #enableChannel: #modifiedChannel
   935 		    #useDefaultExtent: true
   936 		  )
   937 		 )
   938                
   939 	      )
   940 	    )
   941 	   )
   942          
   943 	)
   944       )
   945 !
   946 
   947 rightCanvasSpecForClassList
   948     "This resource specification was automatically generated
   949      by the UIPainter of ST/X."
   950 
   951     "Do not manually edit this!! If it is corrupted,
   952      the UIPainter may not be able to read the specification."
   953 
   954     "
   955      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForClassList
   956      ProjectBrowser new openInterface:#rightCanvasSpecForClassList
   957     "
   958 
   959     <resource: #canvas>
   960 
   961     ^ 
   962      #(#FullSpec
   963 	#name: #rightCanvasSpecForClassList
   964 	#window: 
   965        #(#WindowSpec
   966 	  #label: 'NewApplication'
   967 	  #name: 'NewApplication'
   968 	  #min: #(#Point 10 10)
   969 	  #max: #(#Point 1280 1024)
   970 	  #bounds: #(#Rectangle 10 20 310 320)
   971 	)
   972 	#component: 
   973        #(#SpecCollection
   974 	  #collection: #(
   975 	   #(#DataSetSpec
   976 	      #name: 'classTable'
   977 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
   978 	      #hasHorizontalScrollBar: true
   979 	      #hasVerticalScrollBar: true
   980 	      #miniScrollerHorizontal: true
   981 	      #dataList: #classList
   982 	      #has3Dsepartors: false
   983 	      #columnHolder: #classTableColumns
   984 	      #verticalSpacing: 0
   985 	      #columnAdaptor: #classTableAdaptor
   986 	    )
   987 	   )
   988          
   989 	)
   990       )
   991 !
   992 
   993 rightCanvasSpecForDeployment
   994     "This resource specification was automatically generated
   995      by the UIPainter of ST/X."
   996 
   997     "Do not manually edit this!! If it is corrupted,
   998      the UIPainter may not be able to read the specification."
   999 
  1000     "
  1001      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForDeployment
  1002      ProjectBrowser new openInterface:#rightCanvasSpecForDeployment
  1003     "
  1004 
  1005     <resource: #canvas>
  1006 
  1007     ^ 
  1008      #(#FullSpec
  1009 	#name: #rightCanvasSpecForDeployment
  1010 	#window: 
  1011        #(#WindowSpec
  1012 	  #label: 'NewApplication'
  1013 	  #name: 'NewApplication'
  1014 	  #min: #(#Point 10 10)
  1015 	  #max: #(#Point 1280 1024)
  1016 	  #bounds: #(#Rectangle 12 22 365 521)
  1017 	)
  1018 	#component: 
  1019        #(#SpecCollection
  1020 	  #collection: #(
  1021 	   #(#FramedBoxSpec
  1022 	      #label: 'Deliver'
  1023 	      #name: 'DeliverBox'
  1024 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 172 0)
  1025 	      #labelPosition: #topLeft
  1026 	      #translateLabel: true
  1027 	      #component: 
  1028 	     #(#SpecCollection
  1029 		#collection: #(
  1030 		 #(#CheckBoxSpec
  1031 		    #label: '''loadAll''-File'
  1032 		    #name: 'CheckBox5'
  1033 		    #layout: #(#LayoutFrame 0 0.0 67 0 0 1.0 89 0)
  1034 		    #activeHelpKey: #deliverLoadAll
  1035 		    #tabable: true
  1036 		    #model: #deliverLoadAllFile
  1037 		    #translateLabel: true
  1038 		  )
  1039 		 #(#CheckBoxSpec
  1040 		    #label: 'Compiled Binary (non-portable .dll / .so)'
  1041 		    #name: 'CheckBox6'
  1042 		    #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 54 0)
  1043 		    #activeHelpKey: #deliverCompiledBinary
  1044 		    #tabable: true
  1045 		    #model: #deliverCompiledBinary
  1046 		    #translateLabel: true
  1047 		  )
  1048 		 #(#CheckBoxSpec
  1049 		    #label: 'Bytecode Binary (portable)'
  1050 		    #name: 'CheckBox1'
  1051 		    #layout: #(#LayoutFrame 0 0.0 8 0 0 1.0 30 0)
  1052 		    #activeHelpKey: #deliverByteCode
  1053 		    #tabable: true
  1054 		    #model: #deliverByteCode
  1055 		    #translateLabel: true
  1056 		  )
  1057 		 #(#CheckBoxSpec
  1058 		    #label: 'Sources'
  1059 		    #name: 'CheckBox4'
  1060 		    #layout: #(#LayoutFrame 0 0.0 90 0 0 1.0 112 0)
  1061 		    #activeHelpKey: #deliverSources
  1062 		    #tabable: true
  1063 		    #model: #deliverSources
  1064 		    #translateLabel: true
  1065 		  )
  1066 		 #(#CheckBoxSpec
  1067 		    #label: 'Makefiles'
  1068 		    #name: 'CheckBox8'
  1069 		    #layout: #(#LayoutFrame 0 0.0 113 0 0 1.0 135 0)
  1070 		    #activeHelpKey: #deliverMakefiles
  1071 		    #tabable: true
  1072 		    #model: #deliverMakefiles
  1073 		    #translateLabel: true
  1074 		  )
  1075 		 )
  1076                
  1077 	      )
  1078 	    )
  1079 	   #(#FramedBoxSpec
  1080 	      #label: 'Format'
  1081 	      #name: 'DeliverAsBox'
  1082 	      #layout: #(#LayoutFrame 0 0.0 172 0 0 1.0 290 0)
  1083 	      #labelPosition: #topLeft
  1084 	      #translateLabel: true
  1085 	      #component: 
  1086 	     #(#SpecCollection
  1087 		#collection: #(
  1088 		 #(#CheckBoxSpec
  1089 		    #label: 'Tar Archive (.tar - for unix)'
  1090 		    #name: 'CheckBox7'
  1091 		    #layout: #(#LayoutFrame 0 0.0 34 0 0 1.0 56 0)
  1092 		    #activeHelpKey: #deliverTarArchive
  1093 		    #tabable: true
  1094 		    #model: #deliverTarArchive
  1095 		    #translateLabel: true
  1096 		  )
  1097 		 #(#CheckBoxSpec
  1098 		    #label: 'Zip Archive (.zip - for windows)'
  1099 		    #name: 'CheckBox2'
  1100 		    #layout: #(#LayoutFrame 0 0.0 10 0 0 1.0 32 0)
  1101 		    #activeHelpKey: #deliverZipArchive
  1102 		    #tabable: true
  1103 		    #model: #deliverZipArchive
  1104 		    #translateLabel: true
  1105 		  )
  1106 		 #(#CheckBoxSpec
  1107 		    #label: 'GZip Archive (self extracting for unix)'
  1108 		    #name: 'CheckBox3'
  1109 		    #layout: #(#LayoutFrame 0 0.0 58 0 0 1.0 80 0)
  1110 		    #activeHelpKey: #deliverGZipArchive
  1111 		    #tabable: true
  1112 		    #model: #deliverGZipArchive
  1113 		    #translateLabel: true
  1114 		  )
  1115 		 )
  1116                
  1117 	      )
  1118 	    )
  1119 	   #(#FramedBoxSpec
  1120 	      #label: 'Target Install Directory'
  1121 	      #name: 'DestinationBox'
  1122 	      #layout: #(#LayoutFrame 0 0.0 295 0 0 1.0 448 0)
  1123 	      #labelPosition: #topLeft
  1124 	      #translateLabel: true
  1125 	      #component: 
  1126 	     #(#SpecCollection
  1127 		#collection: #(
  1128 		 #(#LabelSpec
  1129 		    #label: 'Unix:'
  1130 		    #name: 'Label1'
  1131 		    #layout: #(#AlignmentOrigin 76 0.0 16 0 1 0.5)
  1132 		    #translateLabel: true
  1133 		    #resizeForLabel: true
  1134 		    #adjust: #right
  1135 		  )
  1136 		 #(#InputFieldSpec
  1137 		    #name: 'EntryField1'
  1138 		    #layout: #(#LayoutFrame 80 0.0 4 0 0 1.0 26 0)
  1139 		    #activeHelpKey: #installDirUnix
  1140 		    #enableChannel: #canDeliverForUnix
  1141 		    #tabable: true
  1142 		    #model: #installDirectoryUnix
  1143 		    #acceptChannel: #acceptChannel
  1144 		    #modifiedChannel: #modifiedChannel
  1145 		    #acceptOnPointerLeave: false
  1146 		  )
  1147 		 #(#LabelSpec
  1148 		    #label: 'Win32:'
  1149 		    #name: 'Label2'
  1150 		    #layout: #(#AlignmentOrigin 76 0.0 47 0 1 0.5)
  1151 		    #translateLabel: true
  1152 		    #resizeForLabel: true
  1153 		    #adjust: #right
  1154 		  )
  1155 		 #(#InputFieldSpec
  1156 		    #name: 'EntryField2'
  1157 		    #layout: #(#LayoutFrame 80 0.0 34 0 0 1.0 56 0)
  1158 		    #activeHelpKey: #installDirWin32
  1159 		    #enableChannel: #canDeliverForWin32
  1160 		    #tabable: true
  1161 		    #model: #installDirectoryWin32
  1162 		    #acceptChannel: #acceptChannel
  1163 		    #modifiedChannel: #modifiedChannel
  1164 		    #acceptOnPointerLeave: false
  1165 		  )
  1166 		 #(#LabelSpec
  1167 		    #label: 'VMS:'
  1168 		    #name: 'Label3'
  1169 		    #layout: #(#AlignmentOrigin 76 0.0 76 0 1 0.5)
  1170 		    #translateLabel: true
  1171 		    #resizeForLabel: true
  1172 		    #adjust: #right
  1173 		  )
  1174 		 #(#InputFieldSpec
  1175 		    #name: 'EntryField3'
  1176 		    #layout: #(#LayoutFrame 80 0.0 63 0 0 1.0 85 0)
  1177 		    #activeHelpKey: #installDirVMS
  1178 		    #initiallyDisabled: true
  1179 		    #enableChannel: #canDeliverForVMS
  1180 		    #tabable: true
  1181 		    #model: #installDirectoryVMS
  1182 		    #acceptChannel: #acceptChannel
  1183 		    #modifiedChannel: #modifiedChannel
  1184 		    #acceptOnPointerLeave: false
  1185 		  )
  1186 		 #(#LabelSpec
  1187 		    #label: 'MacOS:'
  1188 		    #name: 'Label4'
  1189 		    #layout: #(#AlignmentOrigin 76 0.0 106 0 1 0.5)
  1190 		    #translateLabel: true
  1191 		    #resizeForLabel: true
  1192 		    #adjust: #right
  1193 		  )
  1194 		 #(#InputFieldSpec
  1195 		    #name: 'EntryField4'
  1196 		    #layout: #(#LayoutFrame 80 0.0 93 0 0 1.0 115 0)
  1197 		    #activeHelpKey: #installDirMacOS
  1198 		    #initiallyDisabled: true
  1199 		    #enableChannel: #canDeliverForMacOS
  1200 		    #tabable: true
  1201 		    #model: #installDirectoryMac
  1202 		    #acceptChannel: #acceptChannel
  1203 		    #modifiedChannel: #modifiedChannel
  1204 		    #acceptOnPointerLeave: false
  1205 		  )
  1206 		 )
  1207                
  1208 	      )
  1209 	    )
  1210 	   #(#HorizontalPanelViewSpec
  1211 	      #name: 'HorizontalPanel1'
  1212 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
  1213 	      #horizontalLayout: #fitSpace
  1214 	      #verticalLayout: #center
  1215 	      #horizontalSpace: 3
  1216 	      #verticalSpace: 3
  1217 	      #component: 
  1218 	     #(#SpecCollection
  1219 		#collection: #(
  1220 		 #(#ActionButtonSpec
  1221 		    #label: 'Cancel'
  1222 		    #name: 'Button1'
  1223 		    #translateLabel: true
  1224 		    #tabable: true
  1225 		    #model: #cancel
  1226 		    #enableChannel: #modifiedChannel
  1227 		    #actionValue: ''
  1228 		    #useDefaultExtent: true
  1229 		  )
  1230 		 #(#ActionButtonSpec
  1231 		    #label: 'OK'
  1232 		    #name: 'Button2'
  1233 		    #translateLabel: true
  1234 		    #tabable: true
  1235 		    #model: #accept
  1236 		    #enableChannel: #modifiedChannel
  1237 		    #actionValue: ''
  1238 		    #useDefaultExtent: true
  1239 		  )
  1240 		 )
  1241                
  1242 	      )
  1243 	    )
  1244 	   )
  1245          
  1246 	)
  1247       )
  1248 !
  1249 
  1250 rightCanvasSpecForEditableText
  1251     "This resource specification was automatically generated
  1252      by the UIPainter of ST/X."
  1253 
  1254     "Do not manually edit this!! If it is corrupted,
  1255      the UIPainter may not be able to read the specification."
  1256 
  1257     "
  1258      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForEditableText
  1259      ProjectBrowser new openInterface:#rightCanvasSpecForEditableText
  1260     "
  1261 
  1262     <resource: #canvas>
  1263 
  1264     ^ 
  1265      #(#FullSpec
  1266 	#name: #rightCanvasSpecForEditableText
  1267 	#window: 
  1268        #(#WindowSpec
  1269 	  #label: 'NewApplication'
  1270 	  #name: 'NewApplication'
  1271 	  #min: #(#Point 10 10)
  1272 	  #max: #(#Point 1280 1024)
  1273 	  #bounds: #(#Rectangle 216 173 516 473)
  1274 	)
  1275 	#component: 
  1276        #(#SpecCollection
  1277 	  #collection: #(
  1278 	   #(#TextEditorSpec
  1279 	      #name: 'TextEditor1'
  1280 	      #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
  1281 	      #model: #rightCanvasTextHolder
  1282 	      #hasHorizontalScrollBar: true
  1283 	      #hasVerticalScrollBar: true
  1284 	      #miniScrollerHorizontal: true
  1285 	    )
  1286 	   #(#LabelSpec
  1287 	      #label: 'Label'
  1288 	      #name: 'Label1'
  1289 	      #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
  1290 	      #translateLabel: true
  1291 	      #labelChannel: #textCanvasLabelHolder
  1292 	      #adjust: #left
  1293 	    )
  1294 	   )
  1295          
  1296 	)
  1297       )
  1298 !
  1299 
  1300 rightCanvasSpecForFiles
  1301     "This resource specification was automatically generated
  1302      by the UIPainter of ST/X."
  1303 
  1304     "Do not manually edit this!! If it is corrupted,
  1305      the UIPainter may not be able to read the specification."
  1306 
  1307     "
  1308      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForFiles
  1309      ProjectBrowser new openInterface:#rightCanvasSpecForFiles
  1310     "
  1311 
  1312     <resource: #canvas>
  1313 
  1314     ^ 
  1315      #(#FullSpec
  1316 	#name: #rightCanvasSpecForFiles
  1317 	#window: 
  1318        #(#WindowSpec
  1319 	  #label: 'NewApplication'
  1320 	  #name: 'NewApplication'
  1321 	  #min: #(#Point 10 10)
  1322 	  #max: #(#Point 1280 1024)
  1323 	  #bounds: #(#Rectangle 216 173 577 536)
  1324 	)
  1325 	#component: 
  1326        #(#SpecCollection
  1327 	  #collection: #(
  1328 	   #(#FramedBoxSpec
  1329 	      #label: 'File for extensions & patches'
  1330 	      #name: 'FramedBox2'
  1331 	      #layout: #(#LayoutFrame 0 0.0 62 0.0 0 1.0 122 0)
  1332 	      #labelPosition: #topLeft
  1333 	      #translateLabel: true
  1334 	      #component: 
  1335 	     #(#SpecCollection
  1336 		#collection: #(
  1337 		 #(#InputFieldSpec
  1338 		    #name: 'methodsFileEntryField'
  1339 		    #layout: #(#LayoutFrame 0 0.0 1 0 0 1.0 23 0)
  1340 		    #activeHelpKey: #methodsFile
  1341 		    #model: #methodsFile
  1342 		    #acceptChannel: #acceptChannel
  1343 		    #modifiedChannel: #modifiedChannel
  1344 		    #acceptOnPointerLeave: false
  1345 		  )
  1346 		 )
  1347                
  1348 	      )
  1349 	    )
  1350 	   #(#HorizontalPanelViewSpec
  1351 	      #name: 'HorizontalPanel1'
  1352 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
  1353 	      #horizontalLayout: #fitSpace
  1354 	      #verticalLayout: #center
  1355 	      #horizontalSpace: 3
  1356 	      #verticalSpace: 3
  1357 	      #component: 
  1358 	     #(#SpecCollection
  1359 		#collection: #(
  1360 		 #(#ActionButtonSpec
  1361 		    #label: 'Cancel'
  1362 		    #name: 'Button1'
  1363 		    #activeHelpKey: #cancel
  1364 		    #translateLabel: true
  1365 		    #model: #cancel
  1366 		    #enableChannel: #modifiedChannel
  1367 		    #actionValue: ''
  1368 		    #useDefaultExtent: true
  1369 		  )
  1370 		 #(#ActionButtonSpec
  1371 		    #label: 'OK'
  1372 		    #name: 'Button2'
  1373 		    #activeHelpKey: #accept
  1374 		    #translateLabel: true
  1375 		    #model: #accept
  1376 		    #enableChannel: #modifiedChannel
  1377 		    #useDefaultExtent: true
  1378 		  )
  1379 		 )
  1380                
  1381 	      )
  1382 	    )
  1383 	   )
  1384          
  1385 	)
  1386       )
  1387 !
  1388 
  1389 rightCanvasSpecForHTMLText
  1390     "This resource specification was automatically generated
  1391      by the UIPainter of ST/X."
  1392 
  1393     "Do not manually edit this!! If it is corrupted,
  1394      the UIPainter may not be able to read the specification."
  1395 
  1396     "
  1397      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForHTMLText
  1398      ProjectBrowser new openInterface:#rightCanvasSpecForHTMLText
  1399     "
  1400 
  1401     <resource: #canvas>
  1402 
  1403     ^
  1404      
  1405        #(#FullSpec
  1406 	  #window: 
  1407 	   #(#WindowSpec
  1408 	      #name: 'NewApplication'
  1409 	      #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
  1410 	      #level: 0
  1411 	      #label: 'NewApplication'
  1412 	      #min: #(#Point 10 10)
  1413 	      #max: #(#Point 1280 1024)
  1414 	      #bounds: #(#Rectangle 216 173 516 473)
  1415 	      #usePreferredExtent: false
  1416 	  )
  1417 	  #component: 
  1418 	   #(#SpecCollection
  1419 	      #collection: 
  1420 	       #(
  1421 		 #(#HTMLViewSpec
  1422 		    #name: 'HTMLBrowser1'
  1423 		    #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
  1424 		    #model: #htmlDocumentURLHolder
  1425 		    #hasHorizontalScrollBar: true
  1426 		    #hasVerticalScrollBar: true
  1427 		)
  1428 	      )
  1429 	  )
  1430       )
  1431 !
  1432 
  1433 rightCanvasSpecForPatchesList
  1434     "This resource specification was automatically generated
  1435      by the UIPainter of ST/X."
  1436 
  1437     "Do not manually edit this!! If it is corrupted,
  1438      the UIPainter may not be able to read the specification."
  1439 
  1440     "
  1441      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForPatchesList
  1442      ProjectBrowser new openInterface:#rightCanvasSpecForPatchesList
  1443     "
  1444 
  1445     <resource: #canvas>
  1446 
  1447     ^ 
  1448      #(#FullSpec
  1449 	#name: #rightCanvasSpecForPatchesList
  1450 	#window: 
  1451        #(#WindowSpec
  1452 	  #label: 'NewApplication'
  1453 	  #name: 'NewApplication'
  1454 	  #min: #(#Point 10 10)
  1455 	  #max: #(#Point 1280 1024)
  1456 	  #bounds: #(#Rectangle 162 22 462 322)
  1457 	)
  1458 	#component: 
  1459        #(#SpecCollection
  1460 	  #collection: #(
  1461 	   #(#DataSetSpec
  1462 	      #name: 'patchesTable'
  1463 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
  1464 	      #menu: #methodMenu
  1465 	      #hasHorizontalScrollBar: true
  1466 	      #hasVerticalScrollBar: true
  1467 	      #miniScrollerHorizontal: true
  1468 	      #dataList: #patchesList
  1469 	      #has3Dsepartors: false
  1470 	      #columnHolder: #patchesTableColumns
  1471 	      #columnAdaptor: #classTableAdaptor
  1472 	    )
  1473 	   )
  1474          
  1475 	)
  1476       )
  1477 !
  1478 
  1479 rightCanvasSpecForPrerequisiteClasses
  1480     "This resource specification was automatically generated
  1481      by the UIPainter of ST/X."
  1482 
  1483     "Do not manually edit this!! If it is corrupted,
  1484      the UIPainter may not be able to read the specification."
  1485 
  1486     "
  1487      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForPrerequisiteClasses
  1488      ProjectBrowser new openInterface:#rightCanvasSpecForPrerequisiteClasses
  1489     "
  1490 
  1491     <resource: #canvas>
  1492 
  1493     ^ 
  1494      #(#FullSpec
  1495 	#name: #rightCanvasSpecForPrerequisiteClasses
  1496 	#window: 
  1497        #(#WindowSpec
  1498 	  #label: 'NewApplication'
  1499 	  #name: 'NewApplication'
  1500 	  #layout: #(#LayoutFrame 220 0 200 0 519 0 499 0)
  1501 	  #level: 0
  1502 	  #min: #(#Point 10 10)
  1503 	  #max: #(#Point 1280 1024)
  1504 	  #bounds: #(#Rectangle 220 200 520 500)
  1505 	  #usePreferredExtent: false
  1506 	  #returnIsOKInDialog: true
  1507 	  #escapeIsCancelInDialog: true
  1508 	)
  1509 	#component: 
  1510        #(#SpecCollection
  1511 	  #collection: #(
  1512 	   #(#LabelSpec
  1513 	      #label: 'Known Classes'
  1514 	      #name: 'Label1'
  1515 	      #layout: #(#LayoutFrame 0 0 0 0 0 0.5 30 0)
  1516 	      #translateLabel: true
  1517 	    )
  1518 	   #(#SequenceViewSpec
  1519 	      #name: 'List1'
  1520 	      #layout: #(#LayoutFrame 0 0 30 0 0 0.5 -62 1)
  1521 	      #tabable: true
  1522 	      #model: #selectedClassInPrerequisites
  1523 	      #hasHorizontalScrollBar: true
  1524 	      #hasVerticalScrollBar: true
  1525 	      #miniScrollerHorizontal: true
  1526 	      #miniScrollerVertical: true
  1527 	      #doubleClickSelector: #addClassToPrerequisites
  1528 	      #valueChangeSelector: #showInfoForRequiredClass:
  1529 	      #useIndex: false
  1530 	      #sequenceList: #listOfAllClassesInPrerequisites
  1531 	    )
  1532 	   #(#LabelSpec
  1533 	      #label: 'Required Classes'
  1534 	      #name: 'Label2'
  1535 	      #layout: #(#LayoutFrame 0 0.5 0 0 0 1 30 0)
  1536 	      #translateLabel: true
  1537 	    )
  1538 	   #(#SequenceViewSpec
  1539 	      #name: 'List2'
  1540 	      #layout: #(#LayoutFrame 0 0.5 30 0 0 1 -62 1)
  1541 	      #tabable: true
  1542 	      #model: #selectedRequiredClassInPrerequisites
  1543 	      #hasHorizontalScrollBar: true
  1544 	      #hasVerticalScrollBar: true
  1545 	      #miniScrollerHorizontal: true
  1546 	      #miniScrollerVertical: true
  1547 	      #doubleClickSelector: #removeClassFromPrerequisites
  1548 	      #valueChangeSelector: #showInfoForRequiredClass:
  1549 	      #useIndex: false
  1550 	      #sequenceList: #listOfRequiredClassesInPrerequisites
  1551 	    )
  1552 	   #(#HorizontalPanelViewSpec
  1553 	      #name: 'HorizontalPanel2'
  1554 	      #layout: #(#LayoutFrame 0 0 -62 1 0 1 -32 1)
  1555 	      #horizontalLayout: #fitSpace
  1556 	      #verticalLayout: #center
  1557 	      #horizontalSpace: 3
  1558 	      #verticalSpace: 3
  1559 	      #component: 
  1560 	     #(#SpecCollection
  1561 		#collection: #(
  1562 		 #(#ActionButtonSpec
  1563 		    #label: 'Add'
  1564 		    #name: 'addButton'
  1565 		    #translateLabel: true
  1566 		    #resizeForLabel: false
  1567 		    #tabable: true
  1568 		    #model: #addClassToPrerequisites
  1569 		    #enableChannel: #canAddSelectedClassToPrerequisites
  1570 		    #actionValue: ''
  1571 		    #useDefaultExtent: true
  1572 		  )
  1573 		 #(#ActionButtonSpec
  1574 		    #label: 'Remove'
  1575 		    #name: 'removeButton'
  1576 		    #translateLabel: true
  1577 		    #resizeForLabel: false
  1578 		    #tabable: true
  1579 		    #model: #removeClassFromPrerequisites
  1580 		    #enableChannel: #canRemoveSelectedClassFromPrerequisites
  1581 		    #actionValue: ''
  1582 		    #useDefaultExtent: true
  1583 		  )
  1584 		 )
  1585                
  1586 	      )
  1587 	    )
  1588 	   #(#HorizontalPanelViewSpec
  1589 	      #name: 'HorizontalPanel1'
  1590 	      #layout: #(#LayoutFrame 0 0.0 -30 1 0 1.0 0 1.0)
  1591 	      #horizontalLayout: #fitSpace
  1592 	      #verticalLayout: #center
  1593 	      #horizontalSpace: 3
  1594 	      #verticalSpace: 3
  1595 	      #component: 
  1596 	     #(#SpecCollection
  1597 		#collection: #(
  1598 		 #(#ActionButtonSpec
  1599 		    #label: 'Cancel'
  1600 		    #name: 'Button1'
  1601 		    #translateLabel: true
  1602 		    #tabable: true
  1603 		    #model: #cancel
  1604 		    #useDefaultExtent: true
  1605 		  )
  1606 		 #(#ActionButtonSpec
  1607 		    #label: 'OK'
  1608 		    #name: 'Button2'
  1609 		    #translateLabel: true
  1610 		    #tabable: true
  1611 		    #model: #accept
  1612 		    #useDefaultExtent: true
  1613 		  )
  1614 		 )
  1615                
  1616 	      )
  1617 	    )
  1618 	   )
  1619          
  1620 	)
  1621       )
  1622 !
  1623 
  1624 rightCanvasSpecForPrerequisitePackages
  1625     "This resource specification was automatically generated
  1626      by the UIPainter of ST/X."
  1627 
  1628     "Do not manually edit this!! If it is corrupted,
  1629      the UIPainter may not be able to read the specification."
  1630 
  1631     "
  1632      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForPrerequisitePackages
  1633      ProjectBrowser new openInterface:#rightCanvasSpecForPrerequisitePackages
  1634     "
  1635 
  1636     <resource: #canvas>
  1637 
  1638     ^ 
  1639      #(#FullSpec
  1640 	#name: #rightCanvasSpecForPrerequisitePackages
  1641 	#window: 
  1642        #(#WindowSpec
  1643 	  #label: 'NewApplication'
  1644 	  #name: 'NewApplication'
  1645 	  #layout: #(#LayoutFrame 220 0 200 0 519 0 499 0)
  1646 	  #level: 0
  1647 	  #min: #(#Point 10 10)
  1648 	  #max: #(#Point 1280 1024)
  1649 	  #bounds: #(#Rectangle 220 200 520 500)
  1650 	  #usePreferredExtent: false
  1651 	  #returnIsOKInDialog: true
  1652 	  #escapeIsCancelInDialog: true
  1653 	)
  1654 	#component: 
  1655        #(#SpecCollection
  1656 	  #collection: #(
  1657 	   #(#LabelSpec
  1658 	      #label: 'Known Packages'
  1659 	      #name: 'Label1'
  1660 	      #layout: #(#LayoutFrame 0 0 0 0 0 0.5 30 0)
  1661 	      #translateLabel: true
  1662 	    )
  1663 	   #(#SequenceViewSpec
  1664 	      #name: 'List1'
  1665 	      #layout: #(#LayoutFrame 0 0 30 0 0 0.5 -62 1)
  1666 	      #tabable: true
  1667 	      #model: #selectedProjectInPrerequisites
  1668 	      #hasHorizontalScrollBar: true
  1669 	      #hasVerticalScrollBar: true
  1670 	      #miniScrollerHorizontal: true
  1671 	      #miniScrollerVertical: true
  1672 	      #doubleClickSelector: #addProjectToPrerequisites
  1673 	      #useIndex: false
  1674 	      #sequenceList: #listOfAllProjectsInPrerequisites
  1675 	    )
  1676 	   #(#LabelSpec
  1677 	      #label: 'Prerequisites'
  1678 	      #name: 'Label2'
  1679 	      #layout: #(#LayoutFrame 0 0.5 0 0 0 1 30 0)
  1680 	      #translateLabel: true
  1681 	    )
  1682 	   #(#SequenceViewSpec
  1683 	      #name: 'List2'
  1684 	      #layout: #(#LayoutFrame 0 0.5 30 0 0 1 -62 1)
  1685 	      #tabable: true
  1686 	      #model: #selectedRequiredProjectInPrerequisites
  1687 	      #hasHorizontalScrollBar: true
  1688 	      #hasVerticalScrollBar: true
  1689 	      #miniScrollerHorizontal: true
  1690 	      #miniScrollerVertical: true
  1691 	      #doubleClickSelector: #removeProjectFromPrerequisites
  1692 	      #useIndex: false
  1693 	      #sequenceList: #listOfRequiredProjectsInPrerequisites
  1694 	    )
  1695 	   #(#HorizontalPanelViewSpec
  1696 	      #name: 'HorizontalPanel2'
  1697 	      #layout: #(#LayoutFrame 0 0 -62 1 0 1 -32 1)
  1698 	      #horizontalLayout: #fitSpace
  1699 	      #verticalLayout: #center
  1700 	      #horizontalSpace: 3
  1701 	      #verticalSpace: 3
  1702 	      #component: 
  1703 	     #(#SpecCollection
  1704 		#collection: #(
  1705 		 #(#ActionButtonSpec
  1706 		    #label: 'Add'
  1707 		    #name: 'addButton'
  1708 		    #translateLabel: true
  1709 		    #resizeForLabel: false
  1710 		    #tabable: true
  1711 		    #model: #addProjectToPrerequisites
  1712 		    #enableChannel: #canAddSelectedProjectToPrerequisites
  1713 		    #actionValue: ''
  1714 		    #useDefaultExtent: true
  1715 		  )
  1716 		 #(#ActionButtonSpec
  1717 		    #label: 'Remove'
  1718 		    #name: 'removeButton'
  1719 		    #translateLabel: true
  1720 		    #resizeForLabel: false
  1721 		    #tabable: true
  1722 		    #model: #removeProjectFromPrerequisites
  1723 		    #enableChannel: #canRemoveSelectedProjectFromPrerequisites
  1724 		    #actionValue: ''
  1725 		    #useDefaultExtent: true
  1726 		  )
  1727 		 )
  1728                
  1729 	      )
  1730 	    )
  1731 	   #(#HorizontalPanelViewSpec
  1732 	      #name: 'HorizontalPanel1'
  1733 	      #layout: #(#LayoutFrame 0 0.0 -30 1 0 1.0 0 1.0)
  1734 	      #horizontalLayout: #fitSpace
  1735 	      #verticalLayout: #center
  1736 	      #horizontalSpace: 3
  1737 	      #verticalSpace: 3
  1738 	      #component: 
  1739 	     #(#SpecCollection
  1740 		#collection: #(
  1741 		 #(#ActionButtonSpec
  1742 		    #label: 'Cancel'
  1743 		    #name: 'Button1'
  1744 		    #translateLabel: true
  1745 		    #tabable: true
  1746 		    #model: #cancel
  1747 		    #useDefaultExtent: true
  1748 		  )
  1749 		 #(#ActionButtonSpec
  1750 		    #label: 'OK'
  1751 		    #name: 'Button2'
  1752 		    #translateLabel: true
  1753 		    #tabable: true
  1754 		    #model: #accept
  1755 		    #useDefaultExtent: true
  1756 		  )
  1757 		 )
  1758                
  1759 	      )
  1760 	    )
  1761 	   )
  1762          
  1763 	)
  1764       )
  1765 !
  1766 
  1767 rightCanvasSpecForProperties
  1768     "This resource specification was automatically generated
  1769      by the UIPainter of ST/X."
  1770 
  1771     "Do not manually edit this!! If it is corrupted,
  1772      the UIPainter may not be able to read the specification."
  1773 
  1774     "
  1775      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForProperties
  1776      ProjectBrowser new openInterface:#rightCanvasSpecForProperties
  1777     "
  1778 
  1779     <resource: #canvas>
  1780 
  1781     ^ 
  1782      #(#FullSpec
  1783 	#name: #rightCanvasSpecForProperties
  1784 	#window: 
  1785        #(#WindowSpec
  1786 	  #label: 'NewApplication'
  1787 	  #name: 'NewApplication'
  1788 	  #min: #(#Point 10 10)
  1789 	  #max: #(#Point 1280 1024)
  1790 	  #bounds: #(#Rectangle 12 22 373 346)
  1791 	)
  1792 	#component: 
  1793        #(#SpecCollection
  1794 	  #collection: #(
  1795 	   #(#FramedBoxSpec
  1796 	      #label: 'Project Type'
  1797 	      #name: 'FramedBox1'
  1798 	      #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 61 0)
  1799 	      #labelPosition: #topLeft
  1800 	      #translateLabel: true
  1801 	      #component: 
  1802 	     #(#SpecCollection
  1803 		#collection: #(
  1804 		 #(#RadioButtonSpec
  1805 		    #label: 'Application'
  1806 		    #name: 'RadioButton1'
  1807 		    #layout: #(#LayoutFrame -1 0.0 5 0 0 0.5 27 0)
  1808 		    #activeHelpKey: #appType
  1809 		    #translateLabel: true
  1810 		    #model: #projectType
  1811 		    #isTriggerOnDown: true
  1812 		    #select: #application
  1813 		  )
  1814 		 #(#RadioButtonSpec
  1815 		    #label: 'Class Library'
  1816 		    #name: 'RadioButton2'
  1817 		    #layout: #(#LayoutFrame 0 0.5 5 0 0 1.0 27 0)
  1818 		    #activeHelpKey: #libType
  1819 		    #translateLabel: true
  1820 		    #model: #projectType
  1821 		    #isTriggerOnDown: true
  1822 		    #select: #library
  1823 		  )
  1824 		 )
  1825                
  1826 	      )
  1827 	    )
  1828 	   #(#FramedBoxSpec
  1829 	      #label: 'Project Working Directory'
  1830 	      #name: 'FramedBox2'
  1831 	      #layout: #(#LayoutFrame 0 0.0 67 0.0 0 1.0 127 0)
  1832 	      #labelPosition: #topLeft
  1833 	      #translateLabel: true
  1834 	      #component: 
  1835 	     #(#SpecCollection
  1836 		#collection: #(
  1837 		 #(#InputFieldSpec
  1838 		    #name: 'EntryField1'
  1839 		    #layout: #(#LayoutFrame 0 0.0 1 0 0 1.0 23 0)
  1840 		    #activeHelpKey: #projectDir
  1841 		    #enableChannel: #currentProjectWasNotLoadedFromFile
  1842 		    #model: #projectDirectory
  1843 		    #acceptChannel: #acceptChannel
  1844 		    #modifiedChannel: #modifiedChannel
  1845 		    #acceptOnPointerLeave: false
  1846 		  )
  1847 		 )
  1848                
  1849 	      )
  1850 	    )
  1851 	   #(#FramedBoxSpec
  1852 	      #label: 'Repository'
  1853 	      #name: 'FramedBox3'
  1854 	      #layout: #(#LayoutFrame 0 0.0 137 0.0 0 1.0 220 0)
  1855 	      #labelPosition: #topLeft
  1856 	      #translateLabel: true
  1857 	      #component: 
  1858 	     #(#SpecCollection
  1859 		#collection: #(
  1860 		 #(#LabelSpec
  1861 		    #label: 'Module:'
  1862 		    #name: 'Label1'
  1863 		    #layout: #(#AlignmentOrigin 106 0 11 0 1 0.5)
  1864 		    #translateLabel: true
  1865 		    #resizeForLabel: true
  1866 		    #adjust: #right
  1867 		  )
  1868 		 #(#InputFieldSpec
  1869 		    #name: 'EntryField2'
  1870 		    #layout: #(#LayoutFrame 110 0.0 0 0 0 1.0 22 0)
  1871 		    #activeHelpKey: #repositoryModule
  1872 		    #model: #repositoryModule
  1873 		    #acceptChannel: #acceptChannel
  1874 		    #modifiedChannel: #modifiedChannel
  1875 		    #acceptOnPointerLeave: false
  1876 		  )
  1877 		 #(#LabelSpec
  1878 		    #label: 'Directory:'
  1879 		    #name: 'Label2'
  1880 		    #layout: #(#AlignmentOrigin 106 0 36 0 1 0.5)
  1881 		    #translateLabel: true
  1882 		    #resizeForLabel: true
  1883 		    #adjust: #right
  1884 		  )
  1885 		 #(#InputFieldSpec
  1886 		    #name: 'EntryField3'
  1887 		    #layout: #(#LayoutFrame 110 0.0 25 0 0 1.0 47 0)
  1888 		    #activeHelpKey: #repositoryDirectory
  1889 		    #model: #repositoryDirectory
  1890 		    #acceptChannel: #acceptChannel
  1891 		    #modifiedChannel: #modifiedChannel
  1892 		    #acceptOnPointerLeave: false
  1893 		  )
  1894 		 )
  1895                
  1896 	      )
  1897 	    )
  1898 	   #(#FramedBoxSpec
  1899 	      #label: 'Default Namespace'
  1900 	      #name: 'FramedBox4'
  1901 	      #layout: #(#LayoutFrame 0 0.0 226 0 0 1.0 284 0)
  1902 	      #activeHelpKey: #defaultNamespace
  1903 	      #labelPosition: #topLeft
  1904 	      #translateLabel: true
  1905 	      #component: 
  1906 	     #(#SpecCollection
  1907 		#collection: #(
  1908 		 #(#InputFieldSpec
  1909 		    #name: 'EntryField4'
  1910 		    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 22 0)
  1911 		    #model: #projectNamespace
  1912 		    #acceptChannel: #acceptChannel
  1913 		    #modifiedChannel: #modifiedChannel
  1914 		    #acceptOnPointerLeave: false
  1915 		  )
  1916 		 )
  1917                
  1918 	      )
  1919 	    )
  1920 	   #(#HorizontalPanelViewSpec
  1921 	      #name: 'HorizontalPanel1'
  1922 	      #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
  1923 	      #horizontalLayout: #fitSpace
  1924 	      #verticalLayout: #center
  1925 	      #horizontalSpace: 3
  1926 	      #verticalSpace: 3
  1927 	      #component: 
  1928 	     #(#SpecCollection
  1929 		#collection: #(
  1930 		 #(#ActionButtonSpec
  1931 		    #label: 'Cancel'
  1932 		    #name: 'Button1'
  1933 		    #activeHelpKey: #cancel
  1934 		    #translateLabel: true
  1935 		    #model: #cancel
  1936 		    #enableChannel: #modifiedChannel
  1937 		    #actionValue: ''
  1938 		    #useDefaultExtent: true
  1939 		  )
  1940 		 #(#ActionButtonSpec
  1941 		    #label: 'OK'
  1942 		    #name: 'Button2'
  1943 		    #activeHelpKey: #accept
  1944 		    #translateLabel: true
  1945 		    #model: #accept
  1946 		    #enableChannel: #modifiedChannel
  1947 		    #useDefaultExtent: true
  1948 		  )
  1949 		 )
  1950                
  1951 	      )
  1952 	    )
  1953 	   )
  1954          
  1955 	)
  1956       )
  1957 !
  1958 
  1959 rightCanvasSpecForReadOnlyText
  1960     "This resource specification was automatically generated
  1961      by the UIPainter of ST/X."
  1962 
  1963     "Do not manually edit this!! If it is corrupted,
  1964      the UIPainter may not be able to read the specification."
  1965 
  1966     "
  1967      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForReadOnlyText
  1968      ProjectBrowser new openInterface:#rightCanvasSpecForReadOnlyText
  1969     "
  1970 
  1971     <resource: #canvas>
  1972 
  1973     ^ 
  1974      #(#FullSpec
  1975 	#name: #rightCanvasSpecForReadOnlyText
  1976 	#window: 
  1977        #(#WindowSpec
  1978 	  #label: 'NewApplication'
  1979 	  #name: 'NewApplication'
  1980 	  #min: #(#Point 10 10)
  1981 	  #max: #(#Point 1280 1024)
  1982 	  #bounds: #(#Rectangle 216 173 516 473)
  1983 	)
  1984 	#component: 
  1985        #(#SpecCollection
  1986 	  #collection: #(
  1987 	   #(#TextEditorSpec
  1988 	      #name: 'TextEditor1'
  1989 	      #layout: #(#LayoutFrame 0 0.0 30 0.0 0 1.0 0 1.0)
  1990 	      #model: #rightCanvasTextHolder
  1991 	      #hasHorizontalScrollBar: true
  1992 	      #hasVerticalScrollBar: true
  1993 	      #miniScrollerHorizontal: true
  1994 	      #isReadOnly: true
  1995 	    )
  1996 	   #(#LabelSpec
  1997 	      #label: 'Label'
  1998 	      #name: 'Label1'
  1999 	      #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
  2000 	      #translateLabel: true
  2001 	      #labelChannel: #textCanvasLabelHolder
  2002 	      #adjust: #left
  2003 	    )
  2004 	   )
  2005          
  2006 	)
  2007       )
  2008 !
  2009 
  2010 windowSpec
  2011     "This resource specification was automatically generated
  2012      by the UIPainter of ST/X."
  2013 
  2014     "Do not manually edit this!! If it is corrupted,
  2015      the UIPainter may not be able to read the specification."
  2016 
  2017     "
  2018      UIPainter new openOnClass:ProjectBrowser andSelector:#windowSpec
  2019      ProjectBrowser new openInterface:#windowSpec
  2020      ProjectBrowser open
  2021     "
  2022 
  2023     <resource: #canvas>
  2024 
  2025     ^ 
  2026      #(#FullSpec
  2027 	#name: #windowSpec
  2028 	#window: 
  2029        #(#WindowSpec
  2030 	  #label: 'ProjectBrowser'
  2031 	  #name: 'ProjectBrowser'
  2032 	  #min: #(#Point 10 10)
  2033 	  #max: #(#Point 1024 768)
  2034 	  #bounds: #(#Rectangle 20 94 623 645)
  2035 	  #menu: #mainMenu
  2036 	  #icon: #bigProjectBrowserIcon
  2037 	)
  2038 	#component: 
  2039        #(#SpecCollection
  2040 	  #collection: #(
  2041 	   #(#MenuPanelSpec
  2042 	      #name: 'ToolBar1'
  2043 	      #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0)
  2044 	      #menu: #menu
  2045 	      #textDefault: true
  2046 	    )
  2047 	   #(#VariableVerticalPanelSpec
  2048 	      #name: 'VariableVerticalPanel1'
  2049 	      #layout: #(#LayoutFrame 0 0.0 32 0.0 0 1.0 -24 1.0)
  2050 	      #level: 1
  2051 	      #component: 
  2052 	     #(#SpecCollection
  2053 		#collection: #(
  2054 		 #(#VariableHorizontalPanelSpec
  2055 		    #name: 'VariableHorizontalPanel1'
  2056 		    #component: 
  2057 		   #(#SpecCollection
  2058 		      #collection: #(
  2059 		       #(#SelectionInTreeViewSpec
  2060 			  #name: 'TreeList1'
  2061 			  #model: #selectedTreeNodeHolder
  2062 			  #menu: #itemMenuHolder
  2063 			  #performer: #itemMenuPerformer
  2064 			  #hasHorizontalScrollBar: true
  2065 			  #hasVerticalScrollBar: true
  2066 			  #miniScrollerHorizontal: true
  2067 			  #showRoot: false
  2068 			  #showDirectoryIndicatorForRoot: false
  2069 			  #showDirectoryIndicator: true
  2070 			  #valueChangeSelector: #itemSelected:
  2071 			  #doubleClickSelector: #itemDoubleClicked:
  2072 			  #hierarchicalList: #projectTreeHolder
  2073 			  #selectConditionSelector: #selectionChangeAllowed:
  2074 			  #highlightMode: #label
  2075 			)
  2076 		       #(#SubCanvasSpec
  2077 			  #name: 'SubCanvas1'
  2078 			  #hasHorizontalScrollBar: false
  2079 			  #hasVerticalScrollBar: false
  2080 			  #specHolder: #currentCanvasHolder
  2081 			)
  2082 		       )
  2083                      
  2084 		    )
  2085 		    #handles: #(#Any 0.389718 1.0)
  2086 		  )
  2087 		 #(#ArbitraryComponentSpec
  2088 		    #name: 'commandOutputView'
  2089 		    #hasHorizontalScrollBar: true
  2090 		    #hasVerticalScrollBar: true
  2091 		    #miniScrollerHorizontal: true
  2092 		    #hasBorder: false
  2093 		    #component: #TextCollector
  2094 		  )
  2095 		 )
  2096                
  2097 	      )
  2098 	      #handles: #(#Any 0.987879 1.0)
  2099 	    )
  2100 	   #(#UISubSpecification
  2101 	      #name: 'infoBarSubSpec'
  2102 	      #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0)
  2103 	      #level: 1
  2104 	      #majorKey: #ToolApplicationModel
  2105 	      #minorKey: #windowSpecForInfoBar
  2106 	    )
  2107 	   )
  2108          
  2109 	)
  2110       )
  2111 ! !
  2112 
  2113 !ProjectBrowser class methodsFor:'menu specs'!
  2114 
  2115 classItemMenu
  2116     "This resource specification was automatically generated
  2117      by the MenuEditor of ST/X."
  2118 
  2119     "Do not manually edit this!! If it is corrupted,
  2120      the MenuEditor may not be able to read the specification."
  2121 
  2122     "
  2123      MenuEditor new openOnClass:ProjectBrowser andSelector:#classItemMenu
  2124      (Menu new fromLiteralArrayEncoding:(ProjectBrowser classItemMenu)) startUp
  2125     "
  2126 
  2127     <resource: #menu>
  2128 
  2129     ^ 
  2130      #(#Menu
  2131 	#(
  2132 	 #(#MenuItem
  2133 	    #label: 'Remove from Project...'
  2134 	    #translateLabel: true
  2135 	    #value: #removeClassFromProject
  2136 	    #enabled: #hasClassesSelectedHolder
  2137 	  )
  2138 	 #(#MenuItem
  2139 	    #label: '-'
  2140 	  )
  2141 	 #(#MenuItem
  2142 	    #label: 'Browse...'
  2143 	    #translateLabel: true
  2144 	    #value: #browseClass
  2145 	    #enabled: #hasClassesSelectedHolder
  2146 	  )
  2147 	 )
  2148 	nil
  2149 	nil
  2150       )
  2151 !
  2152 
  2153 classesItemMenu
  2154     "This resource specification was automatically generated
  2155      by the MenuEditor of ST/X."
  2156 
  2157     "Do not manually edit this!! If it is corrupted,
  2158      the MenuEditor may not be able to read the specification."
  2159 
  2160     "
  2161      MenuEditor new openOnClass:ProjectBrowser andSelector:#classesItemMenu
  2162      (Menu new fromLiteralArrayEncoding:(ProjectBrowser classesItemMenu)) startUp
  2163     "
  2164 
  2165     <resource: #menu>
  2166 
  2167     ^
  2168      
  2169        #(#Menu
  2170           
  2171 	   #(
  2172 	     #(#MenuItem
  2173 		#label: 'Add Class...'
  2174 		#translateLabel: true
  2175 		#value: #addClass
  2176 		#enabled: #hasClassesSelectedHolder
  2177 	    )
  2178 	     #(#MenuItem
  2179 		#label: 'Add Classes found in image'
  2180 		#translateLabel: true
  2181 		#value: #addClassesFromImage
  2182 		#enabled: #hasClassesSelectedHolder
  2183 	    )
  2184 	     #(#MenuItem
  2185 		#label: 'Add Classes from files found in directory'
  2186 		#translateLabel: true
  2187 		#value: #addClassesFromFilesInDirectory
  2188 		#enabled: #hasClassesSelectedHolder
  2189 	    )
  2190 	     #(#MenuItem
  2191 		#label: 'Add Classes from files found in directory if present in image'
  2192 		#translateLabel: true
  2193 		#value: #addClassesFromFilesInDirectoryIfPresentInImage
  2194 		#enabled: #hasClassesSelectedHolder
  2195 	    )
  2196 	     #(#MenuItem
  2197 		#label: '-'
  2198 	    )
  2199 	     #(#MenuItem
  2200 		#label: 'Load Classes from Directory'
  2201 		#translateLabel: true
  2202 		#value: #loadClassesFromDirectory
  2203 		#enabled: #canLoadClassesFromDirectory
  2204 	    )
  2205 	     #(#MenuItem
  2206 		#label: 'Load Classes from Repository'
  2207 		#translateLabel: true
  2208 		#value: #loadClassesFromRepository
  2209 		#enabled: #canLoadClassesFromRepository
  2210 	    )
  2211 	     #(#MenuItem
  2212 		#label: '-'
  2213 	    )
  2214 	     #(#MenuItem
  2215 		#label: 'Validate...'
  2216 		#translateLabel: true
  2217 		#value: #validateAgainstClassesInImage
  2218 		#enabled: #hasClassesSelectedHolder
  2219 	    )
  2220 
  2221 	     #(#MenuItem
  2222 		#label: '-'
  2223 	    )
  2224 	     #(#MenuItem
  2225 		#label: 'Browse...'
  2226 		#translateLabel: true
  2227 		#value: #browseClasses
  2228 		#enabled: #hasClassesSelectedHolder
  2229 	    )
  2230 	  ) nil
  2231 	  nil
  2232       )
  2233 !
  2234 
  2235 mainMenu
  2236     "This resource specification was automatically generated
  2237      by the MenuEditor of ST/X."
  2238 
  2239     "Do not manually edit this!! If it is corrupted,
  2240      the MenuEditor may not be able to read the specification."
  2241 
  2242     "
  2243      MenuEditor new openOnClass:ProjectBrowser andSelector:#mainMenu
  2244      (Menu new fromLiteralArrayEncoding:(ProjectBrowser mainMenu)) startUp
  2245     "
  2246 
  2247     <resource: #menu>
  2248 
  2249     ^ 
  2250      #(#Menu
  2251 	#(
  2252 	 #(#MenuItem
  2253 	    #label: 'File'
  2254 	    #translateLabel: true
  2255 	    #submenu: 
  2256 	   #(#Menu
  2257 	      #(
  2258 	       #(#MenuItem
  2259 		  #label: 'New'
  2260 		  #translateLabel: true
  2261 		  #value: #newProject
  2262 		)
  2263 	       #(#MenuItem
  2264 		  #label: '-'
  2265 		)
  2266 	       #(#MenuItem
  2267 		  #label: 'Load From...'
  2268 		  #translateLabel: true
  2269 		  #value: #openProject
  2270 		  #activeHelpKey: #openProject
  2271 		)
  2272 	       #(#MenuItem
  2273 		  #label: 'Load Project Code'
  2274 		  #translateLabel: true
  2275 		  #value: #loadProjectCode
  2276 		  #enabled: #hasProjectSelectedAndProjectFilenameHolder
  2277 		  #activeHelpKey: #loadProjectCode
  2278 		)
  2279 	       #(#MenuItem
  2280 		  #label: '-'
  2281 		)
  2282 	       #(#MenuItem
  2283 		  #label: 'Save Project File'
  2284 		  #translateLabel: true
  2285 		  #value: #saveProjectFile
  2286 		  #enabled: #hasProjectSelectedAndProjectFilenameHolder
  2287 		  #activeHelpKey: #saveProjectFile
  2288 		)
  2289 	       #(#MenuItem
  2290 		  #label: 'Save Project Code'
  2291 		  #translateLabel: true
  2292 		  #value: #saveProjectCode
  2293 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2294 		)
  2295 	       #(#MenuItem
  2296 		  #label: 'Save All'
  2297 		  #translateLabel: true
  2298 		  #value: #saveAll
  2299 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2300 		)
  2301 	       #(#MenuItem
  2302 		  #label: '-'
  2303 		)
  2304 	       #(#MenuItem
  2305 		  #label: 'Exit'
  2306 		  #translateLabel: true
  2307 		  #value: #closeRequest
  2308 		)
  2309 	       )
  2310 	      nil
  2311 	      nil
  2312 	    )
  2313 	  )
  2314 	 #(#MenuItem
  2315 	    #label: 'Repository'
  2316 	    #translateLabel: true
  2317 	    #submenu: 
  2318 	   #(#Menu
  2319 	      #(
  2320 	       #(#MenuItem
  2321 		  #label: 'CheckIn All'
  2322 		  #translateLabel: true
  2323 		  #value: #checkInProject
  2324 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2325 		)
  2326 	       #(#MenuItem
  2327 		  #label: '-'
  2328 		)
  2329 	       #(#MenuItem
  2330 		  #label: 'CheckIn Classes'
  2331 		  #translateLabel: true
  2332 		  #value: #checkInAllClasses
  2333 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2334 		)
  2335 	       #(#MenuItem
  2336 		  #label: 'CheckIn Extensions'
  2337 		  #translateLabel: true
  2338 		  #value: #checkInMethods
  2339 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2340 		)
  2341 	       #(#MenuItem
  2342 		  #label: 'CheckIn Project File'
  2343 		  #translateLabel: true
  2344 		  #value: #checkInProjectFile
  2345 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2346 		)
  2347 	       #(#MenuItem
  2348 		  #label: 'CheckIn Makefiles'
  2349 		  #translateLabel: true
  2350 		  #value: #checkInMakefiles
  2351 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2352 		)
  2353 	       )
  2354 	      nil
  2355 	      nil
  2356 	    )
  2357 	  )
  2358 	 #(#MenuItem
  2359 	    #label: 'View'
  2360 	    #translateLabel: true
  2361 	    #submenu: 
  2362 	   #(#Menu
  2363 	      #(
  2364 	       #(#MenuItem
  2365 		  #label: 'Current Project'
  2366 		  #translateLabel: true
  2367 		  #choice: #showWhat
  2368 		  #choiceValue: #current
  2369 		)
  2370 	       #(#MenuItem
  2371 		  #label: 'Non BaseSystem Projects'
  2372 		  #translateLabel: true
  2373 		  #choice: #showWhat
  2374 		  #choiceValue: #userProjects
  2375 		)
  2376 	       #(#MenuItem
  2377 		  #label: 'All Projects'
  2378 		  #translateLabel: true
  2379 		  #choice: #showWhat
  2380 		  #choiceValue: #all
  2381 		)
  2382 	       #(#MenuItem
  2383 		  #label: '-'
  2384 		)
  2385 	       #(#MenuItem
  2386 		  #label: 'Update'
  2387 		  #translateLabel: true
  2388 		  #value: #updateListOfProjects
  2389 		)
  2390 	       )
  2391 	      nil
  2392 	      nil
  2393 	    )
  2394 	  )
  2395 	 #(#MenuItem
  2396 	    #label: 'Project'
  2397 	    #translateLabel: true
  2398 	    #submenuChannel: #projectItemMenu
  2399 	  )
  2400 	 #(#MenuItem
  2401 	    #label: 'Build'
  2402 	    #translateLabel: true
  2403 	    #submenu: 
  2404 	   #(#Menu
  2405 	      #(
  2406 	       #(#MenuItem
  2407 		  #label: 'All'
  2408 		  #translateLabel: true
  2409 		  #value: #buildAll
  2410 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2411 		)
  2412 	       #(#MenuItem
  2413 		  #label: '-'
  2414 		)
  2415 	       #(#MenuItem
  2416 		  #label: 'Make.proto && Makefile'
  2417 		  #translateLabel: true
  2418 		  #value: #buildMakefiles
  2419 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2420 		)
  2421 	       #(#MenuItem
  2422 		  #label: 'Makefile'
  2423 		  #translateLabel: true
  2424 		  #value: #buildMakefile
  2425 		  #isVisible: #osIsUnix
  2426 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2427 		)
  2428 	       #(#MenuItem
  2429 		  #label: 'Makefile for windows (nt.mak)'
  2430 		  #translateLabel: true
  2431 		  #value: #buildNTMakefile
  2432 		  #isVisible: #osIsWindows
  2433 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2434 		)
  2435 	       #(#MenuItem
  2436 		  #label: 'LoadAll file'
  2437 		  #translateLabel: true
  2438 		  #value: #buildLoadAllFile
  2439 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2440 		)
  2441 	       #(#MenuItem
  2442 		  #label: 'abbrev file (for autoload)'
  2443 		  #translateLabel: true
  2444 		  #value: #buildAbbrevFile
  2445 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2446 		)
  2447 	       #(#MenuItem
  2448 		  #label: 'Binary class library (non portable)'
  2449 		  #translateLabel: true
  2450 		  #value: #buildCompiledClassLibrary
  2451 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2452 		)
  2453 	       #(#MenuItem
  2454 		  #label: 'Bytecode class library (portable)'
  2455 		  #translateLabel: true
  2456 		  #value: #buildByteCodeClassLibrary
  2457 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2458 		)
  2459 	       #(#MenuItem
  2460 		  #label: 'Zip archive'
  2461 		  #translateLabel: true
  2462 		  #value: #buildZipArchive
  2463 		  #enabled: #hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  2464 		)
  2465 	       )
  2466 	      nil
  2467 	      nil
  2468 	    )
  2469 	  )
  2470 	 #(#MenuItem
  2471 	    #label: 'Help'
  2472 	    #translateLabel: true
  2473 	    #startGroup: #right
  2474 	    #submenu: 
  2475 	   #(#Menu
  2476 	      #(
  2477 	       #(#MenuItem
  2478 		  #label: 'Documentation'
  2479 		  #translateLabel: true
  2480 		  #value: #openDocumentation
  2481 		)
  2482 	       #(#MenuItem
  2483 		  #label: '-'
  2484 		)
  2485 	       #(#MenuItem
  2486 		  #label: 'About this Application'
  2487 		  #translateLabel: true
  2488 		  #value: #openAboutThisApplication
  2489 		)
  2490 	       )
  2491 	      nil
  2492 	      nil
  2493 	    )
  2494 	  )
  2495 	 )
  2496 	nil
  2497 	nil
  2498       )
  2499 
  2500     "Modified: / 19.1.2000 / 16:52:31 / cg"
  2501 !
  2502 
  2503 methodItemMenu
  2504     "This resource specification was automatically generated
  2505      by the MenuEditor of ST/X."
  2506 
  2507     "Do not manually edit this!! If it is corrupted,
  2508      the MenuEditor may not be able to read the specification."
  2509 
  2510     "
  2511      MenuEditor new openOnClass:ProjectBrowser andSelector:#menu
  2512      (Menu new fromLiteralArrayEncoding:(ProjectBrowser menu)) startUp
  2513     "
  2514 
  2515     <resource: #menu>
  2516 
  2517     ^ 
  2518      #(#Menu
  2519 	#(
  2520 	 #(#MenuItem
  2521 	    #label: 'Browse'
  2522 	    #translateLabel: true
  2523 	    #value: #browseMethod
  2524 	  )
  2525 	 #(#MenuItem
  2526 	    #label: 'Browse Full'
  2527 	    #translateLabel: true
  2528 	    #value: #browseMethodFull
  2529 	  )
  2530 	 #(#MenuItem
  2531 	    #label: '-'
  2532 	  )
  2533 	 #(#MenuItem
  2534 	    #label: 'Remove...'
  2535 	    #translateLabel: true
  2536 	    #value: #removeMethod
  2537 	  )
  2538 	 #(#MenuItem
  2539 	    #label: 'Remove from Project...'
  2540 	    #translateLabel: true
  2541 	    #value: #removeMethodFromProject
  2542 	  )
  2543 	 #(#MenuItem
  2544 	    #label: 'Move to Project...'
  2545 	    #translateLabel: true
  2546 	    #value: #moveMethodToProject
  2547 	  )
  2548 	 )
  2549 	nil
  2550 	nil
  2551       )
  2552 !
  2553 
  2554 methodsItemMenu
  2555     "This resource specification was automatically generated
  2556      by the MenuEditor of ST/X."
  2557 
  2558     "Do not manually edit this!! If it is corrupted,
  2559      the MenuEditor may not be able to read the specification."
  2560 
  2561     "
  2562      MenuEditor new openOnClass:ProjectBrowser andSelector:#menu
  2563      (Menu new fromLiteralArrayEncoding:(ProjectBrowser menu)) startUp
  2564     "
  2565 
  2566     <resource: #menu>
  2567 
  2568     ^ 
  2569      #(#Menu
  2570 	#(
  2571 	     #(#MenuItem
  2572 		#label: 'Validate...'
  2573 		#translateLabel: true
  2574 		#value: #validateAgainstMethodsInImage
  2575 		#enabled: #hasMethodsSelectedHolder
  2576 	    )
  2577 	 )
  2578 	nil
  2579 	nil
  2580       )
  2581 !
  2582 
  2583 noItemMenu
  2584     "This resource specification was automatically generated
  2585      by the MenuEditor of ST/X."
  2586 
  2587     "Do not manually edit this!! If it is corrupted,
  2588      the MenuEditor may not be able to read the specification."
  2589 
  2590     "
  2591      MenuEditor new openOnClass:ProjectBrowser andSelector:#projectItemMenu
  2592      (Menu new fromLiteralArrayEncoding:(ProjectBrowser projectItemMenu)) startUp
  2593     "
  2594 
  2595     <resource: #menu>
  2596 
  2597     ^
  2598      
  2599        #(#Menu
  2600           
  2601 	   #(
  2602 	     #(#MenuItem
  2603 		#label: 'New Project'
  2604 		#translateLabel: true
  2605 		#value: #newProject
  2606 	    )
  2607 	  ) nil
  2608 	  nil
  2609       )
  2610 !
  2611 
  2612 prerequisiteClassesItemMenu
  2613     "This resource specification was automatically generated
  2614      by the MenuEditor of ST/X."
  2615 
  2616     "Do not manually edit this!! If it is corrupted,
  2617      the MenuEditor may not be able to read the specification."
  2618 
  2619     "
  2620      MenuEditor new openOnClass:ProjectBrowser andSelector:#prerequisiteClassesItemMenu
  2621      (Menu new fromLiteralArrayEncoding:(ProjectBrowser prerequisiteClassesItemMenu)) startUp
  2622     "
  2623 
  2624     <resource: #menu>
  2625 
  2626     ^ 
  2627      #(#Menu
  2628 	#(
  2629 	 #(#MenuItem
  2630 	    #label: 'Update'
  2631 	    #translateLabel: true
  2632 	    #value: #updateListOfRequiredPrerequisiteClasses
  2633 	    #enabled: #hasClassesSelectedHolder
  2634 	  )
  2635 	 )
  2636 	nil
  2637 	nil
  2638       )
  2639 !
  2640 
  2641 prerequisitePackagesItemMenu
  2642     "This resource specification was automatically generated
  2643      by the MenuEditor of ST/X."
  2644 
  2645     "Do not manually edit this!! If it is corrupted,
  2646      the MenuEditor may not be able to read the specification."
  2647 
  2648     "
  2649      MenuEditor new openOnClass:ProjectBrowser andSelector:#prerequisiteClassesItemMenu
  2650      (Menu new fromLiteralArrayEncoding:(ProjectBrowser prerequisiteClassesItemMenu)) startUp
  2651     "
  2652 
  2653     <resource: #menu>
  2654 
  2655     ^ 
  2656      #(#Menu
  2657 	#(
  2658 	 #(#MenuItem
  2659 	    #label: 'Add package...'
  2660 	    #translateLabel: true
  2661 	    #value: #addPrerequisitePackage
  2662 	  )
  2663 	 )
  2664 	nil
  2665 	nil
  2666       )
  2667 !
  2668 
  2669 projectItemMenu
  2670     "This resource specification was automatically generated
  2671      by the MenuEditor of ST/X."
  2672 
  2673     "Do not manually edit this!! If it is corrupted,
  2674      the MenuEditor may not be able to read the specification."
  2675 
  2676     "
  2677      MenuEditor new openOnClass:ProjectBrowser andSelector:#projectItemMenu
  2678      (Menu new fromLiteralArrayEncoding:(ProjectBrowser projectItemMenu)) startUp
  2679     "
  2680 
  2681     <resource: #menu>
  2682 
  2683     ^
  2684      
  2685        #(#Menu
  2686           
  2687 	   #(
  2688 	     #(#MenuItem
  2689 		#label: 'Load Project'
  2690 		#translateLabel: true
  2691 		#value: #loadProject
  2692 		#enabled: #canLoadCurrentProjectHolder
  2693 	    )
  2694 	     #(#MenuItem
  2695 		#label: 'Unload Project'
  2696 		#translateLabel: true
  2697 		#value: #unloadProject
  2698 		#enabled: #canUnloadCurrentProjectHolder
  2699 	    )
  2700 	     #(#MenuItem
  2701 		#label: '-'
  2702 	    )
  2703 	     #(#MenuItem
  2704 		#label: 'Make Current'
  2705 		#translateLabel: true
  2706 		#value: #makeCurrentProject
  2707 		#enabled: #hasProjectSelectedHolder
  2708 	    )
  2709 	     #(#MenuItem
  2710 		#label: 'Inspect'
  2711 		#translateLabel: true
  2712 		#value: #inspectCurrentProject
  2713 		#enabled: #hasProjectSelectedHolder
  2714 	    )
  2715 	     #(#MenuItem
  2716 		#label: '-'
  2717 	    )
  2718 "/             #(#MenuItem
  2719 "/                #label: 'New SubProject'
  2720 "/                #translateLabel: true
  2721 "/                #value: #newSubProject
  2722 "/                #enabled: #hasProjectSelectedHolder
  2723 "/            )
  2724 "/             #(#MenuItem
  2725 "/                #label: '-'
  2726 "/            )
  2727 	     #(#MenuItem
  2728 		#label: 'Rename...'
  2729 		#translateLabel: true
  2730 		#value: #renameProject
  2731 		#enabled: #hasProjectSelectedHolder
  2732 	    )
  2733 	     #(#MenuItem
  2734 		#label: '-'
  2735 	    )
  2736 	     #(#MenuItem
  2737 		#label: 'Remove...'
  2738 		#translateLabel: true
  2739 		#value: #removeProject
  2740 		#enabled: #hasProjectSelectedHolder
  2741 	    )
  2742 	  ) nil
  2743 	  nil
  2744       )
  2745 !
  2746 
  2747 subProjectsItemMenu
  2748     "This resource specification was automatically generated
  2749      by the MenuEditor of ST/X."
  2750 
  2751     "Do not manually edit this!! If it is corrupted,
  2752      the MenuEditor may not be able to read the specification."
  2753 
  2754     "
  2755      MenuEditor new openOnClass:ProjectBrowser andSelector:#subProjectsItemMenu
  2756      (Menu new fromLiteralArrayEncoding:(ProjectBrowser subProjectsItemMenu)) startUp
  2757     "
  2758 
  2759     <resource: #menu>
  2760 
  2761     ^
  2762      
  2763        #(#Menu
  2764           
  2765 	   #(
  2766 	     #(#MenuItem
  2767 		#label: 'New SubProject'
  2768 		#translateLabel: true
  2769 		#value: #newSubProject
  2770 		#enabled: #hasSubProjectsSelectedHolder
  2771 	    )
  2772 	  ) nil
  2773 	  nil
  2774       )
  2775 ! !
  2776 
  2777 !ProjectBrowser class methodsFor:'startup'!
  2778 
  2779 openOnFile:aFilename
  2780     |project browser nodes theNode|
  2781 
  2782     browser := self new.
  2783     browser allButOpen.
  2784     project := browser loadFromProjectFile:aFilename.
  2785     browser expandPathToNodeFor:project.
  2786     browser openWindow
  2787 ! !
  2788 
  2789 !ProjectBrowser class methodsFor:'tableColumns specs'!
  2790 
  2791 classTableColumns
  2792     "This resource specification was automatically generated
  2793      by the DataSetBuilder of ST/X."
  2794 
  2795     "Do not manually edit this!! If it is corrupted,
  2796      the DataSetBuilder may not be able to read the specification."
  2797 
  2798     "
  2799      DataSetBuilder new openOnClass:ProjectBrowser andSelector:#classTableColumns
  2800     "
  2801 
  2802     <resource: #tableColumns>
  2803 
  2804     ^#(
  2805       #(#DataSetColumnSpec
  2806 	 #label: 'Class'
  2807 	 #id: 'classColumn'
  2808 	 #labelAlignment: #left
  2809 	 #model: #classNameFromClassInfo:
  2810        )
  2811       #(#DataSetColumnSpec
  2812 	 #label: 'Included'
  2813 	 #id: 'inclusion'
  2814 	 #width: 150
  2815 	 #editorType: #ComboList
  2816 	 #choices: #listOfPossibleConditions:
  2817 	 #model: #classIncludeConditionFromClassInfo:
  2818 	 #writeSelector: #classIncludeConditionFromClassInfo:put:
  2819        )
  2820       #(#DataSetColumnSpec
  2821 	 #label: 'Filename'
  2822 	 #labelAlignment: #left
  2823 	 #minWidth: 200
  2824 	 #model: #classFilenameFromClassInfo:
  2825        )
  2826       )
  2827     
  2828 !
  2829 
  2830 patchesTableColumns
  2831     "This resource specification was automatically generated
  2832      by the DataSetBuilder of ST/X."
  2833 
  2834     "Do not manually edit this!! If it is corrupted,
  2835      the DataSetBuilder may not be able to read the specification."
  2836 
  2837     "
  2838      DataSetBuilder new openOnClass:ProjectBrowser andSelector:#patchesTableColumns
  2839     "
  2840 
  2841     <resource: #tableColumns>
  2842 
  2843     ^#(
  2844       #(#DataSetColumnSpec
  2845 	 #label: 'Class'
  2846 	 #id: 'classColumn'
  2847 	 #labelAlignment: #left
  2848 	 #menu: #patchesMethodMenu
  2849 	 #model: #classNameFromMethodInfo:
  2850 	 #doubleClickedSelector: #methodPatchDoubleClick:
  2851 	 #canSelect: false
  2852        )
  2853       #(#DataSetColumnSpec
  2854 	 #label: 'Selector'
  2855 	 #id: 'selectorColumn'
  2856 	 #labelAlignment: #left
  2857 	 #model: #selectorFromMethodInfo:
  2858 	 #canSelect: false
  2859        )
  2860       )
  2861     
  2862 ! !
  2863 
  2864 !ProjectBrowser methodsFor:'accessing'!
  2865 
  2866 selectedTreeNode
  2867     "automatically generated by UIPainter ..."
  2868 
  2869     ^ self selectedTreeNodeHolder value
  2870 ! !
  2871 
  2872 !ProjectBrowser methodsFor:'aspects'!
  2873 
  2874 acceptChannel
  2875     |holder|
  2876 
  2877     (holder := builder bindingAt:#acceptChannel) isNil ifTrue:[
  2878 	holder := false asValue.
  2879 	builder aspectAt:#acceptChannel put:holder.
  2880     ].
  2881     ^ holder.
  2882 
  2883     "Created: / 23.3.1999 / 14:18:05 / cg"
  2884 !
  2885 
  2886 browseClass
  2887     |node classOrClassName cls|
  2888 
  2889     self hasClassNodeSelected ifFalse:[^ self].
  2890 
  2891     node := self selectedTreeNode.
  2892     classOrClassName := node contents value.
  2893     classOrClassName isBehavior ifTrue:[
  2894 	cls := classOrClassName.
  2895     ] ifFalse:[
  2896 	cls := Smalltalk at:classOrClassName.
  2897     ].
  2898     cls isNil ifTrue:[
  2899 	self information:'The class is not (yet) loaded'.
  2900 	^ self.
  2901     ].
  2902     cls isLoaded ifFalse:[
  2903 	self information:'The class is an autoloaded class.'.
  2904     ].
  2905     SystemBrowser openInClass:cls selector:nil.
  2906 
  2907 !
  2908 
  2909 canAddSelectedClassToPrerequisites
  2910     |holder|
  2911 
  2912     (holder := builder bindingAt:#canAddSelectedClassToPrerequisites) isNil ifTrue:[
  2913 	holder := BlockValue 
  2914 			with:[:m | self canAddClassToPrerequisites:m] 
  2915 			argument:(self selectedClassInPrerequisites).
  2916 	builder aspectAt:#canAddSelectedClassToPrerequisites put:holder.
  2917     ].
  2918     ^ holder.
  2919 
  2920     "Created: / 23.3.1999 / 14:18:05 / cg"
  2921 !
  2922 
  2923 canAddSelectedProjectToPrerequisites
  2924     |holder|
  2925 
  2926     (holder := builder bindingAt:#canAddSelectedProjectToPrerequisites) isNil ifTrue:[
  2927 	holder := BlockValue 
  2928 			with:[:m | self canAddProjectToPrerequisites:m] 
  2929 			argument:(self selectedProjectInPrerequisites).
  2930 	builder aspectAt:#canAddSelectedProjectToPrerequisites put:holder.
  2931     ].
  2932     ^ holder.
  2933 
  2934     "Created: / 23.3.1999 / 14:18:05 / cg"
  2935 !
  2936 
  2937 canDeliverBinaryForMacOS
  2938     ^ OperatingSystem platformName == #macOS
  2939 !
  2940 
  2941 canDeliverBinaryForUnix
  2942     ^ OperatingSystem platformName == #unix 
  2943 !
  2944 
  2945 canDeliverBinaryForVMS
  2946     ^ OperatingSystem platformName == #vms 
  2947 
  2948 !
  2949 
  2950 canDeliverBinaryForWin32
  2951     ^ OperatingSystem platformName == #win32 
  2952 !
  2953 
  2954 canDeliverForMacOS
  2955     |holder|
  2956 
  2957     (holder := builder bindingAt:#canDeliverForMacOS) isNil ifTrue:[
  2958 	holder := BlockValue 
  2959 			with:[:a1 :a2 | a1 or:[a2 not]] 
  2960 			arguments:(Array 
  2961 					with:self canDeliverBinaryForMacOS
  2962 					with:self deliverCompiledBinary).
  2963 	builder aspectAt:#canDeliverForMacOS put:holder.
  2964     ].
  2965     ^ holder.
  2966 !
  2967 
  2968 canDeliverForUnix
  2969     |holder|
  2970 
  2971     (holder := builder bindingAt:#canDeliverForUnix) isNil ifTrue:[
  2972 	holder := BlockValue 
  2973 			with:[:a1 :a2 | a1 or:[a2 not]] 
  2974 			arguments:(Array 
  2975 					with:self canDeliverBinaryForUnix
  2976 					with:self deliverCompiledBinary).
  2977 	builder aspectAt:#canDeliverForUnix put:holder.
  2978     ].
  2979     ^ holder.
  2980 !
  2981 
  2982 canDeliverForVMS
  2983     |holder|
  2984 
  2985     (holder := builder bindingAt:#canDeliverForVMS) isNil ifTrue:[
  2986 	holder := BlockValue 
  2987 			with:[:a1 :a2 | a1 or:[a2 not]] 
  2988 			arguments:(Array 
  2989 					with:self canDeliverBinaryForVMS
  2990 					with:self deliverCompiledBinary).
  2991 	builder aspectAt:#canDeliverForVMS put:holder.
  2992     ].
  2993     ^ holder.
  2994 !
  2995 
  2996 canDeliverForWin32
  2997     |holder|
  2998 
  2999     (holder := builder bindingAt:#canDeliverForWin32) isNil ifTrue:[
  3000 	holder := BlockValue 
  3001 			with:[:a1 :a2 | a1 or:[a2 not]] 
  3002 			arguments:(Array 
  3003 					with:self canDeliverBinaryForWin32
  3004 					with:self deliverCompiledBinary).
  3005 	builder aspectAt:#canDeliverForWin32 put:holder.
  3006     ].
  3007     ^ holder.
  3008 !
  3009 
  3010 canLoadCurrentProjectHolder
  3011     |holder|
  3012 
  3013     (holder := builder bindingAt:#canLoadCurrentProjectHolder) isNil ifTrue:[
  3014 	holder := false asValue.
  3015 	builder aspectAt:#canLoadCurrentProjectHolder put:holder.
  3016     ].
  3017     ^ holder.
  3018 
  3019     "Modified: / 26.4.1999 / 22:47:33 / cg"
  3020 !
  3021 
  3022 canRemoveSelectedClassFromPrerequisites
  3023     |holder|
  3024 
  3025     (holder := builder bindingAt:#canRemoveSelectedClassFromPrerequisites) isNil ifTrue:[
  3026 	holder := BlockValue with:[:m | m notNil] argument:(self selectedRequiredClassInPrerequisites).
  3027 	builder aspectAt:#canRemoveSelectedClassFromPrerequisites put:holder.
  3028     ].
  3029     ^ holder.
  3030 
  3031     "Created: / 23.3.1999 / 14:18:05 / cg"
  3032 !
  3033 
  3034 canRemoveSelectedProjectFromPrerequisites
  3035     |holder|
  3036 
  3037     (holder := builder bindingAt:#canRemoveSelectedProjectFromPrerequisites) isNil ifTrue:[
  3038 	holder := BlockValue with:[:m | m notNil] argument:(self selectedRequiredProjectInPrerequisites).
  3039 	builder aspectAt:#canRemoveSelectedProjectFromPrerequisites put:holder.
  3040     ].
  3041     ^ holder.
  3042 
  3043     "Created: / 23.3.1999 / 14:18:05 / cg"
  3044 !
  3045 
  3046 canUnloadCurrentProjectHolder
  3047     |holder|
  3048 
  3049     (holder := builder bindingAt:#canUnloadCurrentProjectHolder) isNil ifTrue:[
  3050 	holder := false asValue.
  3051 	builder aspectAt:#canUnloadCurrentProjectHolder put:holder.
  3052     ].
  3053     ^ holder.
  3054 
  3055     "Modified: / 26.4.1999 / 22:47:33 / cg"
  3056 !
  3057 
  3058 classList
  3059     "automatically generated by UIPainter ..."
  3060 
  3061     |holder|
  3062 
  3063     (holder := builder bindingAt:#classList) isNil ifTrue:[
  3064 	builder aspectAt:#classList put:(holder :=  List new).
  3065     ].
  3066     ^ holder.
  3067 !
  3068 
  3069 classTableAdaptor
  3070     ^ self
  3071 !
  3072 
  3073 classTableColumns
  3074     ^ self class classTableColumns
  3075 !
  3076 
  3077 currentCanvasHolder
  3078     "automatically generated by UIPainter ..."
  3079 
  3080     |holder|
  3081 
  3082     (holder := builder bindingAt:#currentCanvasHolder) isNil ifTrue:[
  3083 	builder aspectAt:#currentCanvasHolder put:(holder :=  ValueHolder new).
  3084     ].
  3085     ^ holder.
  3086 !
  3087 
  3088 currentProjectWasNotLoadedFromFile
  3089     "automatically generated by UIPainter ..."
  3090 
  3091     |holder|
  3092 
  3093     (holder := builder bindingAt:#currentProjectWasNotLoadedFromFile) isNil ifTrue:[
  3094 	builder aspectAt:#currentProjectWasNotLoadedFromFile put:(holder :=  ValueHolder new).
  3095     ].
  3096     ^ holder.
  3097 
  3098     "Created: / 23.3.1999 / 14:01:09 / cg"
  3099 !
  3100 
  3101 deliverByteCode
  3102     "automatically generated by UIPainter ..."
  3103 
  3104     |holder|
  3105 
  3106     (holder := builder bindingAt:#deliverByteCode) isNil ifTrue:[
  3107 	builder aspectAt:#deliverByteCode put:(holder :=  ValueHolder new).
  3108 	holder onChangeEvaluate:[modifiedChannel value:true].
  3109     ].
  3110     ^ holder.
  3111 
  3112     "Created: / 23.3.1999 / 14:18:05 / cg"
  3113 !
  3114 
  3115 deliverCompiledBinary
  3116     "automatically generated by UIPainter ..."
  3117 
  3118     |holder|
  3119 
  3120     (holder := builder bindingAt:#deliverCompiledBinary) isNil ifTrue:[
  3121 	builder aspectAt:#deliverCompiledBinary put:(holder :=  ValueHolder new).
  3122 	holder onChangeEvaluate:[modifiedChannel value:true].
  3123     ].
  3124     ^ holder.
  3125 
  3126     "Created: / 23.3.1999 / 14:18:05 / cg"
  3127 !
  3128 
  3129 deliverGZipArchive
  3130     "automatically generated by UIPainter ..."
  3131 
  3132     |holder|
  3133 
  3134     (holder := builder bindingAt:#deliverGZipArchive) isNil ifTrue:[
  3135 	builder aspectAt:#deliverGZipArchive put:(holder :=  ValueHolder new).
  3136 	holder onChangeEvaluate:[modifiedChannel value:true].
  3137     ].
  3138     ^ holder.
  3139 
  3140     "Created: / 23.3.1999 / 14:18:05 / cg"
  3141 !
  3142 
  3143 deliverLoadAllFile
  3144     "automatically generated by UIPainter ..."
  3145 
  3146     |holder|
  3147 
  3148     (holder := builder bindingAt:#deliverLoadAllFile) isNil ifTrue:[
  3149 	builder aspectAt:#deliverLoadAllFile put:(holder :=  ValueHolder new).
  3150 	holder onChangeEvaluate:[modifiedChannel value:true].
  3151     ].
  3152     ^ holder.
  3153 
  3154     "Created: / 23.3.1999 / 14:18:05 / cg"
  3155 !
  3156 
  3157 deliverMakefiles
  3158     "automatically generated by UIPainter ..."
  3159 
  3160     |holder|
  3161 
  3162     (holder := builder bindingAt:#deliverMakefiles) isNil ifTrue:[
  3163 	builder aspectAt:#deliverMakefiles put:(holder :=  ValueHolder new).
  3164 	holder onChangeEvaluate:[modifiedChannel value:true].
  3165     ].
  3166     ^ holder.
  3167 
  3168     "Created: / 23.3.1999 / 14:18:05 / cg"
  3169 !
  3170 
  3171 deliverSources
  3172     "automatically generated by UIPainter ..."
  3173 
  3174     |holder|
  3175 
  3176     (holder := builder bindingAt:#deliverSources) isNil ifTrue:[
  3177 	builder aspectAt:#deliverSources put:(holder :=  ValueHolder new).
  3178 	holder onChangeEvaluate:[modifiedChannel value:true].
  3179     ].
  3180     ^ holder.
  3181 
  3182     "Created: / 23.3.1999 / 14:18:05 / cg"
  3183 !
  3184 
  3185 deliverTarArchive
  3186     "automatically generated by UIPainter ..."
  3187 
  3188     |holder|
  3189 
  3190     (holder := builder bindingAt:#deliverTarArchive) isNil ifTrue:[
  3191 	builder aspectAt:#deliverTarArchive put:(holder :=  ValueHolder new).
  3192 	holder onChangeEvaluate:[modifiedChannel value:true].
  3193     ].
  3194     ^ holder.
  3195 
  3196     "Created: / 23.3.1999 / 14:18:05 / cg"
  3197 !
  3198 
  3199 deliverZipArchive
  3200     "automatically generated by UIPainter ..."
  3201 
  3202     |holder|
  3203 
  3204     (holder := builder bindingAt:#deliverZipArchive) isNil ifTrue:[
  3205 	builder aspectAt:#deliverZipArchive put:(holder :=  ValueHolder new).
  3206 	holder onChangeEvaluate:[modifiedChannel value:true].
  3207     ].
  3208     ^ holder.
  3209 
  3210     "Created: / 23.3.1999 / 14:18:05 / cg"
  3211 !
  3212 
  3213 hasProjectSelectedAndProjectFilenameHolder
  3214     ^ [ |dir|
  3215 
  3216 	dir := self projectDirectory value asFilename.
  3217 	(dir exists and:[dir isDirectory]) ifTrue:[
  3218 	    self hasProjectSelectedHolder value
  3219 	] ifFalse:[
  3220 	    false
  3221 	]
  3222     ].
  3223 !
  3224 
  3225 hasProjectSelectedAndProjectFilenameHolderAndProjectCodeIsLoaded
  3226 ^ true.
  3227     ^ [ |dir|
  3228 
  3229 	dir := self projectDirectory value asFilename.
  3230 	(dir exists and:[dir isDirectory]) ifTrue:[
  3231 	    (self hasProjectSelectedHolder value) ifTrue:[
  3232 		self projectCodeIsLoadedHolder value
  3233 	    ] ifFalse:[
  3234 		false.
  3235 	    ]
  3236 	] ifFalse:[
  3237 	    false
  3238 	]
  3239     ].
  3240 !
  3241 
  3242 hasProjectSelectedHolder
  3243     |holder|
  3244 
  3245     (holder := builder bindingAt:#hasProjectSelectedHolder) isNil ifTrue:[
  3246 	holder := false asValue.
  3247 	builder aspectAt:#hasProjectSelectedHolder put:holder.
  3248     ].
  3249     ^ holder.
  3250 
  3251     "Modified: / 26.4.1999 / 22:47:33 / cg"
  3252 !
  3253 
  3254 hasSubProjectsSelectedHolder
  3255     ^ [
  3256 	self hasSubProjectsNodeSelected
  3257       ]
  3258 !
  3259 
  3260 htmlDocumentURLHolder
  3261     "automatically generated by UIPainter ..."
  3262 
  3263     |holder|
  3264 
  3265     (holder := builder bindingAt:#htmlDocumentURLHolder) isNil ifTrue:[
  3266 	builder aspectAt:#htmlDocumentURLHolder put:(holder :=  ValueHolder new).
  3267     ].
  3268     ^ holder.
  3269 !
  3270 
  3271 installDirectoryMacOS
  3272     "automatically generated by UIPainter ..."
  3273 
  3274     |holder|
  3275 
  3276     (holder := builder bindingAt:#installDirectoryMacOS) isNil ifTrue:[
  3277 	builder aspectAt:#installDirectoryMacOS put:(holder := '' asValue).
  3278 	holder onChangeSend:#value to:[modifiedChannel value:true].
  3279     ].
  3280     ^ holder.
  3281 
  3282     "Created: / 23.3.1999 / 14:18:05 / cg"
  3283 !
  3284 
  3285 installDirectoryUnix
  3286     "automatically generated by UIPainter ..."
  3287 
  3288     |holder|
  3289 
  3290     (holder := builder bindingAt:#installDirectoryUnix) isNil ifTrue:[
  3291 	builder aspectAt:#installDirectoryUnix put:(holder := '/opt/smalltalk' asValue).
  3292 	holder onChangeEvaluate:[modifiedChannel value:true].
  3293     ].
  3294     ^ holder.
  3295 
  3296     "Created: / 23.3.1999 / 14:18:05 / cg"
  3297 !
  3298 
  3299 installDirectoryVMS
  3300     "automatically generated by UIPainter ..."
  3301 
  3302     |holder|
  3303 
  3304     (holder := builder bindingAt:#installDirectoryVMS) isNil ifTrue:[
  3305 	builder aspectAt:#installDirectoryVMS put:(holder := '' asValue).
  3306 	holder onChangeEvaluate:[modifiedChannel value:true].
  3307     ].
  3308     ^ holder.
  3309 
  3310     "Created: / 23.3.1999 / 14:18:05 / cg"
  3311 !
  3312 
  3313 installDirectoryWin32
  3314     "automatically generated by UIPainter ..."
  3315 
  3316     |holder|
  3317 
  3318     (holder := builder bindingAt:#installDirectoryWin32) isNil ifTrue:[
  3319 	builder aspectAt:#installDirectoryWin32 put:(holder := '\Programme\SmalltalkX' asValue).
  3320 	holder onChangeEvaluate:[modifiedChannel value:true].
  3321     ].
  3322     ^ holder.
  3323 
  3324     "Created: / 23.3.1999 / 14:18:05 / cg"
  3325 !
  3326 
  3327 listOfAllClassesInPrerequisites
  3328     |holder classes|
  3329 
  3330     (holder := builder bindingAt:#listOfAllClassesInPrerequisites) isNil ifTrue:[
  3331 	builder aspectAt:#listOfAllClassesInPrerequisites put:(holder := SortedCollection new asValue).
  3332 
  3333 	"/ all unloaded classes and classes which where
  3334 	"/ loaded are candidates.
  3335 
  3336 	classes := Smalltalk allClasses 
  3337 			select:[:cls |
  3338 				cls isMeta not
  3339 				and:[
  3340 				    cls isLoaded not
  3341 				    or:[cls wasAutoloaded]]
  3342 			       ].
  3343 
  3344 	"/ mark currently loaded classes as bold;
  3345 	"/ LATER: those which are superclasses of any of my classes bold-red.
  3346 
  3347 	classes := classes collect:[:cls | |nm|
  3348 					nm := cls name.
  3349 					cls isLoaded ifTrue:[
  3350 					    nm := nm asText allBold.
  3351 					].
  3352 					nm
  3353 				   ].
  3354 	holder value addAll:classes.
  3355 	self currentProject wasLoadedFromFile ifFalse:[
  3356 	    self updateListOfRequiredPrerequisiteClasses.
  3357 	]
  3358     ].
  3359     ^ holder.
  3360 
  3361     "Created: / 23.3.1999 / 14:18:05 / cg"
  3362 !
  3363 
  3364 listOfAllProjectsInPrerequisites
  3365     "automatically generated by UIPainter ..."
  3366 
  3367     |holder projects currentProject|
  3368 
  3369     (holder := builder bindingAt:#listOfAllProjectsInPrerequisites) isNil ifTrue:[
  3370 	builder aspectAt:#listOfAllProjectsInPrerequisites put:(holder := SortedCollection new asValue).
  3371 
  3372 	currentProject := self currentProject.
  3373 
  3374 	projects := Set new.
  3375 	Project allInstancesDo:[:p |
  3376 	    (p ~~ currentProject 
  3377 	    and:[p ~~ Project defaultProject]) ifTrue:[
  3378 		projects add:p name.
  3379 	    ]
  3380 	].
  3381 	holder value addAll:projects.
  3382     ].
  3383     ^ holder.
  3384 
  3385     "Created: / 23.3.1999 / 14:18:05 / cg"
  3386 !
  3387 
  3388 listOfPossibleConditions:aRow
  3389     ^ #( always never autoload '-' unix win32 vms macos)
  3390 
  3391 
  3392 !
  3393 
  3394 listOfRequiredClassesInPrerequisites
  3395     "automatically generated by UIPainter ..."
  3396 
  3397     |holder|
  3398 
  3399     (holder := builder bindingAt:#listOfRequiredClassesInPrerequisites) isNil ifTrue:[
  3400 	builder aspectAt:#listOfRequiredClassesInPrerequisites put:(holder := SortedCollection new asValue).
  3401 	self currentProject wasLoadedFromFile ifFalse:[
  3402 	    self updateListOfRequiredPrerequisiteClasses.
  3403 	]
  3404     ].
  3405     ^ holder.
  3406 
  3407     "Created: / 23.3.1999 / 14:18:05 / cg"
  3408 !
  3409 
  3410 listOfRequiredProjectsInPrerequisites
  3411     "automatically generated by UIPainter ..."
  3412 
  3413     |holder|
  3414 
  3415     (holder := builder bindingAt:#listOfRequiredProjectsInPrerequisites) isNil ifTrue:[
  3416 	builder aspectAt:#listOfRequiredProjectsInPrerequisites put:(holder := SortedCollection new asValue).
  3417     ].
  3418     ^ holder.
  3419 
  3420     "Created: / 23.3.1999 / 14:18:05 / cg"
  3421 !
  3422 
  3423 makeDefines
  3424     "automatically generated by UIPainter ..."
  3425 
  3426     |holder|
  3427 
  3428     (holder := builder bindingAt:#makeDefines) isNil ifTrue:[
  3429 	builder aspectAt:#makeDefines put:(holder := '' asValue).
  3430 	holder onChangeEvaluate:[modifiedChannel value:true].
  3431     ].
  3432     ^ holder.
  3433 
  3434     "Created: / 23.3.1999 / 14:18:05 / cg"
  3435 !
  3436 
  3437 makeIncludes
  3438     "automatically generated by UIPainter ..."
  3439 
  3440     |holder|
  3441 
  3442     (holder := builder bindingAt:#makeIncludes) isNil ifTrue:[
  3443 	builder aspectAt:#makeIncludes put:(holder := '' asValue).
  3444 	holder onChangeEvaluate:[modifiedChannel value:true].
  3445     ].
  3446     ^ holder.
  3447 
  3448     "Created: / 23.3.1999 / 14:18:05 / cg"
  3449 !
  3450 
  3451 makeOtherWarningOptions
  3452     "automatically generated by UIPainter ..."
  3453 
  3454     |holder|
  3455 
  3456     (holder := builder bindingAt:#makeOtherWarningOptions) isNil ifTrue:[
  3457 	builder aspectAt:#makeOtherWarningOptions put:(holder := '' asValue).
  3458 	holder onChangeEvaluate:[modifiedChannel value:true].
  3459     ].
  3460     ^ holder.
  3461 
  3462     "Created: / 23.3.1999 / 14:18:05 / cg"
  3463 !
  3464 
  3465 makeWarnEOLComments
  3466     "automatically generated by UIPainter ..."
  3467 
  3468     |holder|
  3469 
  3470     (holder := builder bindingAt:#makeWarnEOLComments) isNil ifTrue:[
  3471 	builder aspectAt:#makeWarnEOLComments put:(holder := false asValue).
  3472 	holder onChangeEvaluate:[modifiedChannel value:true].
  3473     ].
  3474     ^ holder.
  3475 
  3476     "Created: / 23.3.1999 / 14:18:05 / cg"
  3477 !
  3478 
  3479 makeWarnNonStandard
  3480     "automatically generated by UIPainter ..."
  3481 
  3482     |holder|
  3483 
  3484     (holder := builder bindingAt:#makeWarnNonStandard) isNil ifTrue:[
  3485 	builder aspectAt:#makeWarnNonStandard put:(holder := true asValue).
  3486 	holder onChangeEvaluate:[modifiedChannel value:true].
  3487     ].
  3488     ^ holder.
  3489 
  3490     "Created: / 23.3.1999 / 14:18:05 / cg"
  3491 !
  3492 
  3493 methodsFile
  3494     "automatically generated by UIPainter ..."
  3495 
  3496     |holder|
  3497 
  3498     (holder := builder bindingAt:#methodsFile) isNil ifTrue:[
  3499 	builder aspectAt:#methodsFile put:(holder := '' asValue).
  3500 	holder onChangeEvaluate:[modifiedChannel value:true].
  3501     ].
  3502     ^ holder.
  3503 
  3504     "Created: / 23.3.1999 / 14:18:05 / cg"
  3505 !
  3506 
  3507 modifiedChannel
  3508     "automatically generated by UIPainter ..."
  3509 
  3510     modifiedChannel isNil ifTrue:[
  3511 	modifiedChannel := false asValue.
  3512     ].
  3513     ^ modifiedChannel.
  3514 
  3515 !
  3516 
  3517 osIsUnix
  3518     ^ OperatingSystem isUNIXlike
  3519 
  3520     "Created: / 19.1.2000 / 16:45:16 / cg"
  3521 !
  3522 
  3523 osIsWindows
  3524     ^ OperatingSystem isMSWINDOWSlike
  3525 
  3526     "Created: / 19.1.2000 / 16:37:33 / cg"
  3527     "Modified: / 19.1.2000 / 16:43:54 / cg"
  3528 !
  3529 
  3530 patchesList
  3531     "automatically generated by UIPainter ..."
  3532 
  3533     |holder|
  3534 
  3535     (holder := builder bindingAt:#patchesList) isNil ifTrue:[
  3536 	builder aspectAt:#patchesList put:(holder :=  List new).
  3537     ].
  3538     ^ holder.
  3539 !
  3540 
  3541 projectCodeIsLoadedHolder
  3542     "automatically generated by UIPainter ..."
  3543 
  3544     |holder|
  3545 
  3546     (holder := builder bindingAt:#projectCodeIsLoadedHolder) isNil ifTrue:[
  3547 	builder aspectAt:#projectCodeIsLoadedHolder put:(holder :=  ValueHolder new).
  3548     ].
  3549     ^ holder.
  3550 
  3551     "Created: / 23.3.1999 / 14:18:05 / cg"
  3552 !
  3553 
  3554 projectDirectory
  3555     "automatically generated by UIPainter ..."
  3556 
  3557     |holder|
  3558 
  3559     (holder := builder bindingAt:#projectDirectory) isNil ifTrue:[
  3560 	builder aspectAt:#projectDirectory put:(holder := '.' asValue).
  3561 	holder onChangeEvaluate:[modifiedChannel value:true].
  3562     ].
  3563     ^ holder.
  3564 
  3565     "Created: / 23.3.1999 / 14:18:05 / cg"
  3566 !
  3567 
  3568 projectNamespace
  3569     "automatically generated by UIPainter ..."
  3570 
  3571     |holder|
  3572 
  3573     (holder := builder bindingAt:#projectNamespace) isNil ifTrue:[
  3574 	builder aspectAt:#projectNamespace put:(holder :=  ValueHolder new).
  3575 	holder onChangeEvaluate:[modifiedChannel value:true].
  3576     ].
  3577     ^ holder.
  3578 
  3579     "Created: / 23.3.1999 / 14:18:05 / cg"
  3580 !
  3581 
  3582 projectPackage
  3583     |holder dir module|
  3584 
  3585     (holder := builder bindingAt:#projectPackage) isNil ifTrue:[
  3586 	builder aspectAt:#projectPackage put:(holder := '' asValue).
  3587     ].
  3588     holder value size == 0 ifTrue:[
  3589 	(module := self repositoryModule value) notNil ifTrue:[
  3590 	    (dir := self repositoryDirectory value) notNil ifTrue:[
  3591 		holder value:(module , ':' , dir)
  3592 	    ]
  3593 	]
  3594     ].
  3595     ^ holder.
  3596 
  3597     "Created: / 23.3.1999 / 14:18:05 / cg"
  3598 !
  3599 
  3600 projectTreeHolder
  3601     "automatically generated by UIPainter ..."
  3602 
  3603     |holder|
  3604 
  3605     (holder := builder bindingAt:#projectTree) isNil ifTrue:[
  3606 	builder aspectAt:#projectTree put:(holder :=  SelectionInTree new).
  3607 	holder root:self projectTree.
  3608     ].
  3609     ^ holder.
  3610 !
  3611 
  3612 projectType
  3613     "automatically generated by UIPainter ..."
  3614 
  3615     |holder|
  3616 
  3617     (holder := builder bindingAt:#projectType) isNil ifTrue:[
  3618 	builder aspectAt:#projectType put:(holder :=  ValueHolder new).
  3619 	holder onChangeEvaluate:[modifiedChannel value:true].
  3620     ].
  3621     ^ holder.
  3622 
  3623     "Created: / 23.3.1999 / 14:18:05 / cg"
  3624 !
  3625 
  3626 repositoryDirectory
  3627     "automatically generated by UIPainter ..."
  3628 
  3629     |holder|
  3630 
  3631     (holder := builder bindingAt:#repositoryDirectory) isNil ifTrue:[
  3632 	builder aspectAt:#repositoryDirectory put:(holder :=  ValueHolder new).
  3633 	holder onChangeEvaluate:[modifiedChannel value:true].
  3634     ].
  3635     ^ holder.
  3636 
  3637     "Created: / 23.3.1999 / 14:18:05 / cg"
  3638 !
  3639 
  3640 repositoryModule
  3641     "automatically generated by UIPainter ..."
  3642 
  3643     |holder|
  3644 
  3645     (holder := builder bindingAt:#repositoryModule) isNil ifTrue:[
  3646 	builder aspectAt:#repositoryModule put:(holder :=  ValueHolder new).
  3647 	holder onChangeEvaluate:[modifiedChannel value:true].
  3648     ].
  3649     ^ holder.
  3650 
  3651     "Created: / 23.3.1999 / 14:18:05 / cg"
  3652 !
  3653 
  3654 rightCanvasTextHolder
  3655     "automatically generated by UIPainter ..."
  3656 
  3657     |holder|
  3658 
  3659     (holder := builder bindingAt:#rightCanvasTextHolder) isNil ifTrue:[
  3660 	builder aspectAt:#rightCanvasTextHolder put:(holder :=  ValueHolder new).
  3661     ].
  3662     ^ holder.
  3663 !
  3664 
  3665 selectedClassInPrerequisites
  3666     "automatically generated by UIPainter ..."
  3667 
  3668     |holder|
  3669 
  3670     (holder := builder bindingAt:#selectedClassInPrerequisites) isNil ifTrue:[
  3671 	builder aspectAt:#selectedClassInPrerequisites put:(holder := ValueHolder new).
  3672     ].
  3673     ^ holder.
  3674 
  3675     "Created: / 23.3.1999 / 14:18:05 / cg"
  3676 !
  3677 
  3678 selectedPatchInRightCanvas
  3679     "automatically generated by UIPainter ..."
  3680 
  3681     |holder|
  3682 
  3683     (holder := builder bindingAt:#selectedPatchInRightCanvas) isNil ifTrue:[
  3684 	builder aspectAt:#selectedPatchInRightCanvas put:(holder :=  ValueHolder new).
  3685     ].
  3686     ^ holder.
  3687 !
  3688 
  3689 selectedProjectInPrerequisites
  3690     "automatically generated by UIPainter ..."
  3691 
  3692     |holder|
  3693 
  3694     (holder := builder bindingAt:#selectedProjectInPrerequisites) isNil ifTrue:[
  3695 	builder aspectAt:#selectedProjectInPrerequisites put:(holder := ValueHolder new).
  3696     ].
  3697     ^ holder.
  3698 
  3699     "Created: / 23.3.1999 / 14:18:05 / cg"
  3700 !
  3701 
  3702 selectedRequiredClassInPrerequisites
  3703     "automatically generated by UIPainter ..."
  3704 
  3705     |holder|
  3706 
  3707     (holder := builder bindingAt:#selectedRequiredClassInPrerequisites) isNil ifTrue:[
  3708 	builder aspectAt:#selectedRequiredClassInPrerequisites put:(holder := ValueHolder new).
  3709     ].
  3710     ^ holder.
  3711 
  3712     "Created: / 23.3.1999 / 14:18:05 / cg"
  3713 !
  3714 
  3715 selectedRequiredProjectInPrerequisites
  3716     "automatically generated by UIPainter ..."
  3717 
  3718     |holder|
  3719 
  3720     (holder := builder bindingAt:#selectedRequiredProjectInPrerequisites) isNil ifTrue:[
  3721 	builder aspectAt:#selectedRequiredProjectInPrerequisites put:(holder := ValueHolder new).
  3722     ].
  3723     ^ holder.
  3724 
  3725     "Created: / 23.3.1999 / 14:18:05 / cg"
  3726 !
  3727 
  3728 selectedTreeNodeHolder
  3729     "automatically generated by UIPainter ..."
  3730 
  3731     selectedTreeNodeHolder isNil ifTrue:[
  3732 	selectedTreeNodeHolder :=  ValueHolder new.
  3733     ].
  3734     ^ selectedTreeNodeHolder.
  3735 !
  3736 
  3737 showWhat
  3738     |holder|
  3739 
  3740     (holder := builder bindingAt:#showWhat) isNil ifTrue:[
  3741 	holder := ValueHolder new.
  3742 	builder aspectAt:#showWhat put:holder.
  3743 	holder onChangeSend:#projectFilterChanged to:self.
  3744     ].
  3745     ^ holder.
  3746 
  3747     "Created: / 23.3.1999 / 14:18:05 / cg"
  3748 !
  3749 
  3750 textCanvasLabelHolder
  3751     "automatically generated by UIPainter ..."
  3752 
  3753     |holder|
  3754 
  3755     (holder := builder bindingAt:#textCanvasLabelHolder) isNil ifTrue:[
  3756 	builder aspectAt:#textCanvasLabelHolder put:(holder :='' asValue).
  3757     ].
  3758     ^ holder.
  3759 ! !
  3760 
  3761 !ProjectBrowser methodsFor:'change & update'!
  3762 
  3763 update:something with:aParameter from:changedObject
  3764     |cls sel oldMthd newMthd prj package|
  3765 
  3766     something == #name ifTrue:[
  3767 	"/ a project was renamed - update my tree
  3768 	self projectTree children do:[:pNode |
  3769 	    pNode contents == changedObject ifTrue:[
  3770 		pNode name:changedObject name.
  3771 		pNode changed.
  3772 	    ]
  3773 	].
  3774 	^ self.
  3775     ].
  3776 
  3777     prj := self currentProject.
  3778     prj isNil ifTrue:[^ self].
  3779 
  3780     package := prj package.
  3781 
  3782     changedObject == prj ifTrue:[
  3783 	self readAspectsFromProject.
  3784     ].
  3785 
  3786     changedObject == Smalltalk ifTrue:[
  3787 	something == #newClass ifTrue:[
  3788 	    aParameter isBehavior ifTrue:[
  3789 		aParameter wasAutoloaded ifTrue:[
  3790 		    self listOfAllClassesInPrerequisites add:something name.
  3791 		    ^ self.
  3792 		].
  3793 		aParameter package = package ifTrue:[
  3794 		    "/ a new class was added to the package;
  3795 		    "/ must look if already there, and possibly update my
  3796 		    "/ tree and classList
  3797 		    (self currentProject includesClass:aParameter) ifFalse:[
  3798 			self halt.
  3799 		    ].
  3800 		    ^ self.
  3801 		]
  3802 	    ]
  3803 	].
  3804 
  3805 	something == #methodInClass ifTrue:[
  3806 	    cls := aParameter first.
  3807 	    sel := aParameter second.
  3808 	    oldMthd := aParameter third.
  3809 	    newMthd := cls compiledMethodAt:sel.
  3810 
  3811 	    cls package ~= package ifTrue:[
  3812 		"/ method removed from project ?
  3813 		(oldMthd notNil and:[oldMthd package = package]) ifTrue:[
  3814 		    (newMthd notNil and:[newMthd package ~= package]) ifTrue:[
  3815 			"/ remove from methodList
  3816 		    ]
  3817 		].
  3818 
  3819 		"/ method added to project ?
  3820 		(oldMthd isNil or:[oldMthd package ~= package]) ifTrue:[
  3821 		    (newMthd notNil and:[newMthd package = package]) ifTrue:[
  3822 			"/ add to methodList
  3823 		    ]
  3824 		]
  3825 	    ]
  3826 	].
  3827     ].
  3828 
  3829     "Modified: / 26.4.1999 / 23:39:04 / cg"
  3830 ! !
  3831 
  3832 !ProjectBrowser methodsFor:'initialization'!
  3833 
  3834 closeDownViews
  3835     Smalltalk removeDependent:self.
  3836     super closeDownViews.
  3837 !
  3838 
  3839 postBuildWith:aBuiler
  3840     Smalltalk addDependent:self.
  3841     self modifiedChannel value:false.
  3842 
  3843     self updateRightCanvas.
  3844     ^ super postBuildWith:aBuiler
  3845 !
  3846 
  3847 setupCanvasForNoSelection
  3848     self 
  3849 	showReadOnlyText:'Please select an existing project,
  3850 load one from a (''.prj'')-file,
  3851 or create a new project.'.
  3852 ! !
  3853 
  3854 !ProjectBrowser methodsFor:'menus'!
  3855 
  3856 itemMenu
  3857     |m|
  3858 
  3859     self hasNodeSelected ifFalse:[
  3860 	^ self class noItemMenu
  3861     ].
  3862     self hasProjectNodeSelected ifTrue:[
  3863 	^ self class projectItemMenu
  3864     ].      
  3865     self hasSubProjectsNodeSelected ifTrue:[
  3866 	^ self class subProjectsItemMenu
  3867     ].      
  3868     self hasClassesNodeSelected ifTrue:[
  3869 	^ self class classesItemMenu
  3870     ].      
  3871     self hasClassNodeSelected ifTrue:[
  3872 	^ self class classItemMenu
  3873     ].      
  3874     self hasMethodNodeSelected ifTrue:[
  3875 	^ self class methodItemMenu
  3876     ].      
  3877     self hasPatchesNodeSelected ifTrue:[
  3878 	^ self class methodsItemMenu
  3879     ].      
  3880     self hasPrerequisiteClassesNodeSelected ifTrue:[
  3881 	^ self class prerequisiteClassesItemMenu
  3882     ].      
  3883     self hasPrerequisitePackagesNodeSelected ifTrue:[
  3884 	^ self class prerequisitePackagesItemMenu
  3885     ].      
  3886     ^ nil
  3887 !
  3888 
  3889 itemMenuHolder
  3890     ^ [ self itemMenu]
  3891 !
  3892 
  3893 itemMenuPerformer
  3894     ^ self
  3895 ! !
  3896 
  3897 !ProjectBrowser methodsFor:'private'!
  3898 
  3899 addProjectNodeToTree:newNode
  3900     |aProject nodeToAdd path childNode|
  3901 
  3902 "/    projectTree add:newNode.
  3903 
  3904     "/ insert into tree ...
  3905     nodeToAdd := projectTree.
  3906 
  3907     path := newNode contents package asCollectionOfSubstringsSeparatedByAny:'/\:'.
  3908     path from:1 to:path size-1 do:[:part |
  3909 	childNode := nodeToAdd children detect:[:child | child name = part] ifNone:nil.
  3910 	childNode isNil ifTrue:[
  3911 	    nodeToAdd add:(childNode := ProjectTreeItem new name:part).
  3912 	].
  3913 	nodeToAdd := childNode.
  3914     ].
  3915     newNode name:(path last).
  3916     nodeToAdd add:newNode.
  3917 
  3918 !
  3919 
  3920 canAddClassToPrerequisites:aClassName
  3921     ^ aClassName notNil
  3922 !
  3923 
  3924 canAddProjectToPrerequisites:aProjectName
  3925     ^ aProjectName notNil
  3926       and:[aProjectName ~= self currentProject name]
  3927 !
  3928 
  3929 canLoadClassesFromDirectory
  3930     |p projectDir|
  3931 
  3932     self hasClassesNodeSelected ifFalse:[^ false].
  3933 
  3934     (p := self currentProject) isNil ifTrue:[^ false].
  3935     (projectDir := p directory) size == 0 ifTrue:[^ false].
  3936     projectDir asFilename exists ifFalse:[^ false].
  3937 
  3938     ^ true
  3939 !
  3940 
  3941 canLoadClassesFromRepository
  3942     |manager p moduleDir packageDir|
  3943 
  3944     self hasClassesNodeSelected ifFalse:[^ false].
  3945 
  3946     (p := self currentProject) isNil ifTrue:[^ false].
  3947     (moduleDir := p repositoryModule) size == 0 ifTrue:[^ false].
  3948     (packageDir := p repositoryDirectory) size == 0 ifTrue:[^ false].
  3949 
  3950     "/ SourceCodeManager available ?
  3951 
  3952     (AbstractSourceCodeManager notNil 
  3953     and:[AbstractSourceCodeManager isLoaded not]) ifTrue:[
  3954 	AbstractSourceCodeManager autoload.    
  3955     ].
  3956 
  3957     AbstractSourceCodeManager isNil ifTrue:[^ false].
  3958     AbstractSourceCodeManager isLoaded ifFalse:[^ false].
  3959     (manager := Smalltalk at:#SourceCodeManager) isNil ifTrue:[^ false].
  3960 
  3961     "/ does the repository contain the module/package ?
  3962     "/ since this is a slow operation (involving the CVS manager,
  3963     "/ remember checked modules here in a classVar
  3964     AlreadCheckedExistingModulesAndPackages isNil ifTrue:[
  3965 	AlreadCheckedExistingModulesAndPackages := OrderedCollection new
  3966     ].
  3967     AlreadCheckedExistingModulesAndPackages do:[:entry |
  3968 	(entry at:1) = moduleDir ifTrue:[
  3969 	    (entry at:2) = packageDir ifTrue:[
  3970 		^ true
  3971 	    ]
  3972 	]
  3973     ].
  3974 
  3975     (manager checkForExistingModule:moduleDir package:packageDir) ifFalse:[^ false].
  3976 
  3977     AlreadCheckedExistingModulesAndPackages add:(Array with:moduleDir with:packageDir).
  3978     ^ true
  3979 !
  3980 
  3981 canLoadCurrentProject
  3982     |prj|
  3983 
  3984     self hasProjectSelected ifFalse:[^ false].
  3985     (prj := self currentProject) isNil ifTrue:[^ self].
  3986     ^ prj isLoaded not
  3987 
  3988 !
  3989 
  3990 canUnloadCurrentProject
  3991     |prj|
  3992 
  3993     self hasProjectSelected ifFalse:[^ false].
  3994     (prj := self currentProject) isNil ifTrue:[^ self].
  3995     ^ prj isLoaded
  3996 
  3997 !
  3998 
  3999 checkInClasses:aCollectionOfClasses
  4000     |logMessage|
  4001 
  4002     logMessage := SourceCodeManagerUtilities getLogMessageFor:'classes in project'.
  4003     SourceCodeManagerUtilities checkinClasses:aCollectionOfClasses withLog:logMessage.
  4004 !
  4005 
  4006 currentProject
  4007     |node|
  4008 
  4009     node := self currentProjectNode.
  4010     node isNil ifTrue:[^ nil].
  4011     ^ node contents
  4012 
  4013 !
  4014 
  4015 currentProjectNode
  4016     |node|
  4017 
  4018     node := self selectedTreeNode.
  4019     node isNil ifTrue:[^ nil].
  4020 
  4021     [node notNil and:[node isProjectNode not]] whileTrue:[
  4022 	node := node parent.
  4023     ].
  4024     node notNil ifTrue:[
  4025 	^ node
  4026     ].
  4027     ^ nil
  4028 
  4029 !
  4030 
  4031 currentProjectsClassNames
  4032     |p|
  4033 
  4034     p := self currentProject.
  4035     ^ p classes 
  4036 	collect:[:classOrSymbol |
  4037 		    classOrSymbol isBehavior ifTrue:[
  4038 			classOrSymbol name
  4039 		    ] ifFalse:[
  4040 			classOrSymbol
  4041 		    ]
  4042 		]
  4043 
  4044 !
  4045 
  4046 expandPathToNodeFor:someContents
  4047     |theNode|
  4048 
  4049     theNode := self projectTreeHolder 
  4050 		    detectFirstItem:[:item | item contents == someContents].
  4051 
  4052     [theNode notNil] whileTrue:[
  4053 	self projectTreeHolder expand:theNode.
  4054 	theNode := theNode parent.
  4055     ].
  4056 
  4057 
  4058 
  4059 !
  4060 
  4061 hasClassNodeSelected
  4062     |selectedNode|
  4063 
  4064     selectedNode := self selectedTreeNode.
  4065     selectedNode isNil ifTrue:[^ false].
  4066 
  4067     ^ selectedNode contents isAssociation
  4068       and:[selectedNode contents key == #class]
  4069 
  4070 !
  4071 
  4072 hasClassesNodeSelected
  4073     ^ self hasNodeSelected:#classes.
  4074 
  4075 !
  4076 
  4077 hasMethodNodeSelected
  4078     |selectedNode|
  4079 
  4080     selectedNode := self selectedTreeNode.
  4081     selectedNode isNil ifTrue:[^ false].
  4082 
  4083     ^ selectedNode contents isAssociation
  4084       and:[selectedNode contents key == #method]
  4085 
  4086 !
  4087 
  4088 hasNodeSelected
  4089     ^ self selectedTreeNode notNil
  4090 
  4091 !
  4092 
  4093 hasNodeSelected:type
  4094     |selectedNode|
  4095 
  4096     selectedNode := self selectedTreeNode.
  4097     selectedNode isNil ifTrue:[^ false].
  4098 
  4099     ^ selectedNode contents == type
  4100 
  4101 !
  4102 
  4103 hasPatchesNodeSelected
  4104     ^ self hasNodeSelected:#patches.
  4105 
  4106 !
  4107 
  4108 hasPrerequisiteClassesNodeSelected
  4109     ^ self hasNodeSelected:#prerequisiteClasses.
  4110 !
  4111 
  4112 hasPrerequisitePackagesNodeSelected
  4113     ^ self hasNodeSelected:#prerequisitePackages.
  4114 !
  4115 
  4116 hasPrerequisitesNodeSelected
  4117     ^ self hasNodeSelected:#prerequisites.
  4118 
  4119 !
  4120 
  4121 hasProjectNodeSelected
  4122     |selectedNode|
  4123 
  4124     selectedNode := self selectedTreeNode.
  4125     selectedNode isNil ifTrue:[^ false].
  4126 
  4127     ^ selectedNode isProjectNode
  4128 
  4129 !
  4130 
  4131 hasProjectSelected
  4132     |selectedNode node|
  4133 
  4134     selectedNode := self selectedTreeNode.
  4135     selectedNode isNil ifTrue:[^ false].
  4136 
  4137     node := selectedNode.
  4138     [node notNil] whileTrue:[
  4139 	node isProjectNode ifTrue:[^ true].
  4140 	node := node parent.
  4141     ].
  4142     ^ false.
  4143 !
  4144 
  4145 hasSubProjectsNodeSelected
  4146     ^ self hasNodeSelected:#subprojects.
  4147 
  4148 !
  4149 
  4150 makeTranscriptVisible
  4151     |transcript|
  4152 
  4153     transcript := self transcript.
  4154 
  4155     (transcript relativeCorner y - transcript relativeOrigin y) < 0.1 ifTrue:[
  4156 	(self builder componentAt:#VariableVerticalPanel1)      
  4157 	    resizeSubViewsTo:#(0.7 0.3)
  4158     ].
  4159 
  4160 
  4161 
  4162 !
  4163 
  4164 nodeFor:aProject
  4165     "generate and return a treeNode for some project"
  4166 
  4167     |projectName pNode 
  4168      propertiesNode docNode classesNode patchesNode subprojectsNode filesNode
  4169      commentNode prerequisitesNode analysisNode designNode codeNode
  4170      userDocNode userOverViewNode userGuideNode userRefManNode
  4171      deploymentNode classIcon methodIcon buildOptionsNode
  4172      prerequisitePackagesNode prerequisiteClassesNode|
  4173 
  4174     projectName := aProject name.
  4175     pNode := ProjectNode name:projectName.
  4176     pNode contents:aProject.
  4177 
  4178     pNode add:(commentNode := ProjectTreeItem name:'Comment').
  4179 "/    pNode add:(docNode := ProjectTreeItem name:'Documentation').
  4180     pNode add:(propertiesNode := ProjectTreeItem name:'Properties').
  4181     pNode add:(prerequisitesNode := ProjectTreeItem name:'Prerequisites').
  4182 "/    pNode add:(subprojectsNode := ProjectTreeItem name:'SubProjects').
  4183     pNode add:(classesNode := ProjectTreeItem name:'Classes').
  4184     pNode add:(patchesNode := ProjectTreeItem name:'Patches & Extensions').
  4185     pNode add:(filesNode := ProjectTreeItem name:'Files').
  4186     pNode add:(buildOptionsNode := ProjectTreeItem name:'Build Options').
  4187     pNode add:(deploymentNode := ProjectTreeItem name:'Deployment').
  4188 
  4189     subprojectsNode notNil ifTrue:[
  4190 	subprojectsNode contents:#subprojects.
  4191 	aProject subProjects do:[:aSubProject |
  4192 	    subprojectsNode add:(self nodeFor:aSubProject)
  4193 	].
  4194     ].
  4195 
  4196     commentNode icon:(self class commentIcon).
  4197     commentNode action:[:item | self showCommentOf:item].
  4198     commentNode info:'Some comment describing the project'.
  4199     commentNode contents:#comment.
  4200 
  4201     docNode notNil ifTrue:[
  4202 	docNode contents:#documentation.
  4203 	docNode action:[:item | self showDocumentationFor:item].
  4204 
  4205 	docNode add:(analysisNode := ProjectTreeItem name:'Analysis').
  4206 	docNode add:(designNode := ProjectTreeItem name:'Design').
  4207 	docNode add:(codeNode := ProjectTreeItem name:'Code').
  4208 	docNode add:(userDocNode := ProjectTreeItem name:'User Documentation').
  4209 	userDocNode add:(userOverViewNode := ProjectTreeItem name:'Overview').
  4210 	userDocNode add:(userGuideNode := ProjectTreeItem name:'Guide').
  4211 	userDocNode add:(userRefManNode := ProjectTreeItem name:'Reference').
  4212 	docNode add:(userDocNode := ProjectTreeItem name:'Error Reports').
  4213 	docNode add:(userDocNode := ProjectTreeItem name:'Other').
  4214     ].
  4215 
  4216     prerequisitesNode contents:#prerequisites.
  4217     prerequisitesNode icon:(self class prerequisitesIcon).
  4218     prerequisitesNode add:(prerequisitePackagesNode := ProjectTreeItem name:'Packages').
  4219     prerequisitesNode add:(prerequisiteClassesNode := ProjectTreeItem name:'Classes').
  4220     prerequisitesNode info:'Other projects and classes required by the project'.
  4221 
  4222     prerequisitePackagesNode contents:#prerequisitePackages.
  4223     prerequisitePackagesNode icon:(self class prerequisitePackagesIcon).
  4224     prerequisitePackagesNode spec:[self class rightCanvasSpecForPrerequisitePackages].
  4225     prerequisitePackagesNode info:'Other projects required by the project'.
  4226 
  4227     prerequisiteClassesNode contents:#prerequisiteClasses.
  4228     prerequisiteClassesNode icon:(self class prerequisiteClassesIcon).
  4229     prerequisiteClassesNode spec:[self class rightCanvasSpecForPrerequisiteClasses].
  4230     prerequisiteClassesNode info:'Other (autoloaded-) classes required by the project'.
  4231 
  4232     classIcon := self class classIcon.
  4233 
  4234     classesNode contents:#classes.
  4235     classesNode icon:(self class classesIcon).
  4236     classesNode info:'Classes contained in the project'.
  4237     (aProject classes copy 
  4238 	sort:[:a :b | 
  4239 		    |nmA nmB|
  4240 
  4241 		    nmA := a isBehavior ifTrue:[a name] ifFalse:[a].
  4242 		    nmB := b isBehavior ifTrue:[b name] ifFalse:[b].
  4243 		    nmA < nmB
  4244 	     ]
  4245     ) do:[:aClass |
  4246 	|cNode cName|
  4247 
  4248 	cName := aClass isBehavior ifTrue:[aClass name] ifFalse:[aClass].
  4249 	cNode := ProjectTreeItem name:cName.
  4250 	cNode contents:(#class -> aClass).
  4251 	cNode icon:classIcon.
  4252 	classesNode add:cNode.
  4253     ].
  4254 
  4255 
  4256     propertiesNode contents:#properties.
  4257     propertiesNode spec:[self class rightCanvasSpecForProperties].
  4258     propertiesNode info:'Project propreties'.
  4259 
  4260     filesNode contents:#files.
  4261     filesNode icon:(self class filesIcon).
  4262     filesNode info:'Files (extensions, bitmaps, data) contained in the project'.
  4263     filesNode spec:[self class rightCanvasSpecForFiles].
  4264 
  4265     methodIcon := self class methodIcon.
  4266 
  4267     patchesNode contents:#patches.
  4268     patchesNode icon:(self class methodsIcon).
  4269     patchesNode info:'Patches & Extensions (system-changes) contained in the project'.
  4270     (aProject methodInfo copy 
  4271 	sort:[:a :b | 
  4272 		    a displayString < b displayString.
  4273 	    ]
  4274     ) do:[:aMethodInfo |
  4275 	|cNode cName|
  4276 
  4277 	cNode := ProjectTreeItem name:(aMethodInfo className , ' ' , aMethodInfo methodName).
  4278 	cNode contents:(#method -> aMethodInfo).
  4279 	cNode icon:methodIcon.
  4280 	patchesNode add:cNode.
  4281     ].
  4282 
  4283     deploymentNode icon:(self class deploymentIcon).
  4284     deploymentNode spec:[self class rightCanvasSpecForDeployment].
  4285     deploymentNode info:'Deployment & packaging specification.'.
  4286     deploymentNode contents:#deployment.
  4287 
  4288     buildOptionsNode icon:(self class buildOptionsIcon).
  4289     buildOptionsNode spec:[self class rightCanvasSpecForBuildOptions].
  4290     buildOptionsNode info:'Compilation & include options.'.
  4291     buildOptionsNode contents:#buildOptions.
  4292 
  4293     ^ pNode
  4294 
  4295     "Modified: / 23.3.1999 / 14:27:30 / cg"
  4296 !
  4297 
  4298 projectTree
  4299     projectTree isNil ifTrue:[
  4300 	self updateProjectTree
  4301     ].
  4302 
  4303     ^ projectTree
  4304 !
  4305 
  4306 readAspectsFromProject
  4307     |p type l ns mMod mDir mPkg pkg|
  4308 
  4309     p := self currentProject.
  4310     p notNil ifTrue:[
  4311 	self selectedTreeNode contents == #comment ifTrue:[
  4312 	    self rightCanvasTextHolder value:p comment.
  4313 	].
  4314 
  4315 	self methodsFile value:(p propertyAt:#methodsFile).
  4316 	self projectCodeIsLoadedHolder value:(p isLoaded == true).
  4317 	p isLoaded == true ifFalse:[
  4318 	    self valueOfInfoLabel value:'Projects code is not loaded.'
  4319 	].
  4320 
  4321 	self currentProjectWasNotLoadedFromFile value:p wasLoadedFromFile not.
  4322 	(type := p type) == #classLibrary ifTrue:[
  4323 	   type := #library
  4324 	].
  4325 	self projectType value:type.
  4326 	self projectDirectory value:(p directory).
  4327 	ns := p defaultNameSpace ? Smalltalk.
  4328 	ns isSymbol ifFalse:[
  4329 	    ns := ns name
  4330 	].
  4331 	self projectNamespace value:ns.
  4332 
  4333 	pkg := p package ? Project current package.
  4334 	mMod := p repositoryModule ? '?'.
  4335 	mDir := p repositoryDirectory ? '?'.
  4336 	mPkg := mMod , ':' , mDir.
  4337 
  4338 	mPkg ~= pkg ifTrue:[
  4339 	    (pkg includes:$:) ifTrue:[
  4340 		mMod := pkg upTo:$:.
  4341 		mDir := pkg copyFrom:mMod size + 2.
  4342 "/                self warn:('package id: ''' , pkg , ''' different from moduleId: ''' , mPkg , 
  4343 "/                           '\\Assume module:''' , mMod , ''' directory:''' , mDir , '''') withCRs.
  4344 	    ] ifFalse:[
  4345 		((mMod ~= '?') and:[mDir ~= '?']) ifTrue:[
  4346 "/                    self warn:('package id: ''' , pkg , ''' different from moduleId: ''' , mPkg , 
  4347 "/                               '\\Assume package:''' , mMod , ':' , mDir , '''') withCRs.
  4348 		    pkg := mMod , ':' , mDir
  4349 		] ifFalse:[
  4350 "/                    self warn:('package id: ''' , pkg , ''' different from moduleId: ''' , mPkg , 
  4351 "/                               '\\Please care for the module and directory settings.') withCRs.
  4352 		]
  4353 	    ]
  4354 	].
  4355 	self projectPackage value:pkg.
  4356 	self repositoryModule value:mMod.
  4357 	self repositoryDirectory value:mDir.
  4358 
  4359 	self deliverCompiledBinary value:(p propertyAt:#deliverCompiledBinary) ? false.
  4360 	self deliverByteCode value:(p propertyAt:#deliverByteCode) ? false.
  4361 	self deliverGZipArchive value:(p propertyAt:#deliverGZipArchive) ? false.
  4362 	self deliverZipArchive value:(p propertyAt:#deliverZipArchive) ? false.
  4363 	self deliverTarArchive value:(p propertyAt:#deliverTarArchive) ? false.
  4364 	self deliverLoadAllFile value:(p propertyAt:#deliverLoadAllFile) ? false.
  4365 	self deliverSources value:(p propertyAt:#deliverSources) ? false.
  4366 	self deliverMakefiles value:(p propertyAt:#deliverMakefiles) ? false.
  4367 
  4368 	self makeDefines value:(p propertyAt:#'make.stc.LOCALDEFINES') ? ''.
  4369 	self makeIncludes value:(p propertyAt:#'make.stc.LOCALINCLUDES') ? ''.
  4370 	self makeOtherWarningOptions value:(p propertyAt:#'make.stc.WARNINGOPTIONS') ? ''.
  4371 	self makeWarnEOLComments value:(p propertyAt:#'make.stc.warnEOLComments') ? false.
  4372 	self makeWarnNonStandard value:(p propertyAt:#'make.stc.warnNonStandard') ? true.
  4373 
  4374 "/        self makeLocalLibs value:(p propertyAt:#'make.LD_OBJ_LIBS') ? ''.
  4375 "/        self makeExtraTargets value:(p propertyAt:#'make.LOCAL_EXTRA_TARGETS') ? ''.
  4376 
  4377 	self installDirectoryUnix 
  4378 		value:(p propertyAt:#installDirectoryUnix) ? 
  4379 			((p propertyAt:#installDirectory) ? '/opt/smalltalk/packages').
  4380 	self installDirectoryWin32 
  4381 		value:(p propertyAt:#installDirectoryWin32) ? 
  4382 			((p propertyAt:#installDirectory) ? '\Programme\SmalltalkX\packages').
  4383 	self installDirectoryVMS 
  4384 		value:(p propertyAt:#installDirectoryVMS) ? 
  4385 			((p propertyAt:#installDirectory) ? 'SYS$SMALLTALKX:[PACKAGES]').
  4386 "/        self installDirectoryMacOS 
  4387 "/                value:(p propertyAt:#installDirectoryMacOS) ? 
  4388 "/                        ((p propertyAt:#installDirectory) ? '\Programme\SmalltalkX').
  4389 
  4390 	l := p prerequisitePackages collect:[:entry |
  4391 		    |pName|
  4392 
  4393 		    entry isString ifTrue:[
  4394 			pName := entry
  4395 		    ] ifFalse:[
  4396 			entry isArray ifTrue:[
  4397 			    pName := entry at:1
  4398 			] ifFalse:[
  4399 			    pName := entry name
  4400 			]
  4401 		    ]
  4402 		].
  4403 	self listOfRequiredProjectsInPrerequisites value:(l sort).
  4404 	self listOfRequiredClassesInPrerequisites value:(p prerequisiteClasses copy sort).
  4405 
  4406 	modifiedChannel value:false.
  4407 	p addDependent:self.
  4408     ].
  4409 
  4410     "Created: / 23.3.1999 / 14:16:12 / cg"
  4411     "Modified: / 26.4.1999 / 23:38:14 / cg"
  4412 !
  4413 
  4414 reallyModified
  4415     |p l selectedNodeType|
  4416 
  4417     p := self currentProject.
  4418     selectedNodeType := self selectedTreeNode contents.
  4419 
  4420     selectedNodeType == #comment ifTrue:[
  4421 self halt.
  4422 	^ self rightCanvasTextHolder value ~= p comment
  4423     ].
  4424     selectedNodeType == #deployment ifTrue:[
  4425 	(self deliverByteCode value ~= (p propertyAt:#deliverByteCode)) ifTrue:[^ true].
  4426 	(self deliverCompiledBinary value ~= (p propertyAt:#deliverCompiledBinary)) ifTrue:[^ true].
  4427 	(self deliverLoadAllFile value ~= (p propertyAt:#deliverLoadAllFile)) ifTrue:[^ true]. 
  4428 	(self deliverSources value ~= (p propertyAt:#deliverSources)) ifTrue:[^ true].
  4429 	(self deliverMakefiles value ~= (p propertyAt:#deliverMakefiles)) ifTrue:[^ true].
  4430 
  4431 	(self deliverZipArchive value ~= (p propertyAt:#deliverZipArchive)) ifTrue:[^ true].
  4432 	(self deliverTarArchive value ~= (p propertyAt:#deliverTarArchive)) ifTrue:[^ true].
  4433 	(self deliverGZipArchive value ~= (p propertyAt:#deliverGZipArchive)) ifTrue:[^ true].
  4434 
  4435 	self installDirectoryUnix value ~=
  4436 		    ((p propertyAt:#installDirectoryUnix) ? 
  4437 		       ((p propertyAt:#installDirectory) ? 
  4438 			    '/opt/smalltalk/packages')) ifTrue:[^ true].
  4439 
  4440 	self installDirectoryWin32 value ~=
  4441 		    ((p propertyAt:#installDirectoryWin32) ? 
  4442 			((p propertyAt:#installDirectory) ? 
  4443 			    '\Programme\SmalltalkX\packages')) ifTrue:[^ true].
  4444 
  4445 	self installDirectoryVMS value ~=
  4446 		    ((p propertyAt:#installDirectoryVMS) ? 
  4447 			((p propertyAt:#installDirectory) ? 
  4448 			    'SYS$SMALLTALKX:[PACKAGES]')) ifTrue:[^ true].
  4449 
  4450 	^ false
  4451     ].
  4452     selectedNodeType == #files ifTrue:[
  4453 ^ true.
  4454 	(self methodsFile value ~= (p propertyAt:#methodsFile)) ifTrue:[^ true].
  4455 	^ false
  4456     ].
  4457 self halt.
  4458 
  4459     (self projectType value ~~ p type) ifTrue:[^ true].
  4460     (self projectDirectory value ~= p directory) ifTrue:[^ true].
  4461     (self projectPackage value ~= p package) ifTrue:[^ true].
  4462     (self projectNamespace value ~= (p defaultNameSpace ? Smalltalk) name) ifTrue:[^ true].
  4463 
  4464     (self repositoryModule value ~= p repositoryModule) ifTrue:[^ true].
  4465     (self repositoryDirectory value ~= p repositoryDirectory) ifTrue:[^ true].
  4466 
  4467 "/        self installDirectoryMacOS value ~=
  4468 "/                ((p propertyAt:#installDirectoryMacOS) ? 
  4469 "/                    ((p propertyAt:#installDirectory) ? 
  4470 "/                        '\Programme\SmalltalkX')) ifTrue:[^ true].
  4471 
  4472     l := p prerequisitePackages collect:[:entry |
  4473 		|pName|
  4474 
  4475 		entry isString ifTrue:[
  4476 		    pName := entry
  4477 		] ifFalse:[
  4478 		    entry isArray ifTrue:[
  4479 			pName := entry at:1
  4480 		    ] ifFalse:[
  4481 			pName := entry name
  4482 		    ]
  4483 		]
  4484 	    ].
  4485     self listOfRequiredProjectsInPrerequisites value ~= (l sort) ifTrue:[^ true].
  4486     self listOfRequiredClassesInPrerequisites value ~= (p prerequisiteClasses copy sort)  ifTrue:[^ true].
  4487     self halt.
  4488 
  4489 !
  4490 
  4491 saveAspectsIntoProject
  4492     |p s ns dir pkg|
  4493 
  4494     p := self currentProject.
  4495     p notNil ifTrue:[
  4496 	p removeDependent:self.
  4497 
  4498 	self acceptChannel value:true; value:false.
  4499 
  4500 "/        self currentProjectWasNotLoadedFromFile value:p wasLoadedFromFile not.
  4501 	p type:self projectType value.
  4502 
  4503 	dir := self projectDirectory value.
  4504 	dir := (dir ? '') asFilename.
  4505 	(dir exists and:[dir isDirectory]) ifFalse:[
  4506 	    self warn:'Invalid project directory: ' , dir pathName
  4507 	].
  4508 
  4509 	p directory:self projectDirectory value.
  4510 	pkg := self repositoryModule value , ':' , self repositoryDirectory value.
  4511 	p packageName:pkg asSymbol.
  4512 
  4513 	p repositoryModule:self repositoryModule value.
  4514 	p repositoryDirectory:self repositoryDirectory value.
  4515 
  4516 	s := self projectNamespace value.
  4517 	(s size == 0) ifTrue:[
  4518 	    ns := Smalltalk
  4519 	] ifFalse:[
  4520 	    ns := NameSpace name:s
  4521 	].
  4522 	p defaultNameSpace:ns.
  4523 
  4524 	p propertyAt:#methodsFile put:self methodsFile value.
  4525 
  4526 	p propertyAt:#deliverCompiledBinary put:self deliverCompiledBinary value.
  4527 	p propertyAt:#deliverByteCode put:self deliverByteCode value.
  4528 	p propertyAt:#deliverTarArchive put:self deliverTarArchive value.
  4529 	p propertyAt:#deliverZipArchive put:self deliverZipArchive value.
  4530 	p propertyAt:#deliverGZipArchive put:self deliverGZipArchive value.
  4531 	p propertyAt:#deliverLoadAllFile put:self deliverLoadAllFile value.
  4532 	p propertyAt:#deliverSources put:self deliverSources value.
  4533 	p propertyAt:#deliverMakefiles put:self deliverMakefiles value.
  4534 
  4535 	p propertyAt:#'make.stc.LOCALDEFINES' put:self makeDefines value.
  4536 	p propertyAt:#'make.stc.LOCALINCLUDES' put:self makeIncludes value.
  4537 	p propertyAt:#'make.stc.WARNINGOPTIONS' put:self makeOtherWarningOptions value.
  4538 	p propertyAt:#'make.stc.warnEOLComments' put:self makeWarnEOLComments value.
  4539 	p propertyAt:#'make.stc.warnNonStandard' put:self makeWarnNonStandard value.
  4540 
  4541 "/        p propertyAt:#'make.LD_OBJ_LIBS' put:self makeLocalLibs value.
  4542 "/        p propertyAt:#'make.LOCAL_EXTRA_TARGETS' put:self makeExtraTargets value.
  4543 
  4544 	p propertyAt:#installDirectoryUnix put:self installDirectoryUnix value.
  4545 	p propertyAt:#installDirectoryWin32 put:self installDirectoryWin32 value.
  4546 	p propertyAt:#installDirectoryVMS put:self installDirectoryVMS value.
  4547 	p propertyAt:#installDirectoryMacOS put:self installDirectoryMacOS value.
  4548 
  4549 	p prerequisiteClasses:(self listOfRequiredClassesInPrerequisites value
  4550 			       collect:[:entry | entry string asSymbol]).
  4551 
  4552 	p prerequisitePackages:(self listOfRequiredProjectsInPrerequisites value
  4553 			       collect:[:entry | entry string asSymbol]).
  4554 
  4555 	p addDependent:self.
  4556     ].
  4557 
  4558     "Created: / 23.3.1999 / 14:16:12 / cg"
  4559     "Modified: / 23.3.1999 / 14:18:38 / cg"
  4560 !
  4561 
  4562 selectedMethod
  4563     |node methodInfo classOrClassName cls mthd text|
  4564 
  4565     self hasMethodNodeSelected ifFalse:[^ nil].
  4566 
  4567     node := self selectedTreeNode.
  4568     methodInfo := node contents value.
  4569     mthd := methodInfo method.
  4570     mthd isNil ifTrue:[
  4571 	self valueOfInfoLabel value:'The method is not (yet) loaded.'.
  4572     ].
  4573     ^ mthd
  4574 !
  4575 
  4576 transcript
  4577     ^ self builder componentAt:#commandOutputView
  4578 !
  4579 
  4580 updateFlagValueHolders
  4581     self hasProjectSelectedHolder value:(self hasProjectSelected).
  4582     self canLoadCurrentProjectHolder value:(self canLoadCurrentProject).
  4583     self canUnloadCurrentProjectHolder value:(self canUnloadCurrentProject).
  4584 
  4585 !
  4586 
  4587 updateProjectTree
  4588     |tree moduleRoots root showWhat|
  4589 
  4590     self withCursor:Cursor execute do:[
  4591 	showWhat := self showWhat value.
  4592 
  4593 	moduleRoots := Dictionary new.
  4594 
  4595 	tree := SelectionInTree new.
  4596 	tree root:(root := ProjectTreeItem name:'invisibleRoot').
  4597 	root hide:false.
  4598 
  4599 	showWhat notNil ifTrue:[
  4600 	    showWhat == #current ifTrue:[
  4601 		root add:(self nodeFor:Project current).
  4602 	    ] ifFalse:[
  4603 		(Project knownProjects asOrderedCollection
  4604 		    sort:[:a :b | a package < b package]) 
  4605 		do:[:aProject |
  4606 		    |newNode nodeToAdd doShow childNode path|
  4607 
  4608 		    (doShow := showWhat == #all) ifFalse:[
  4609 			doShow := (aProject package startsWith:'stx:') not
  4610 		    ].
  4611 
  4612 		    doShow ifTrue:[
  4613 			newNode := self nodeFor:aProject.
  4614 
  4615 			"/ insert into tree ...
  4616 			nodeToAdd := root.
  4617 
  4618 			path := aProject package asCollectionOfSubstringsSeparatedByAny:'/\:'.
  4619 			path from:1 to:path size-1 do:[:part |
  4620 			    childNode := nodeToAdd children detect:[:child | child name = part] ifNone:nil.
  4621 			    childNode isNil ifTrue:[
  4622 				nodeToAdd add:(childNode := ProjectTreeItem new name:part).
  4623 			    ].
  4624 			    nodeToAdd := childNode.
  4625 			].
  4626 			newNode name:(path last).
  4627 			nodeToAdd add:newNode.
  4628 		    ]
  4629 		].
  4630 	    ].
  4631 	].
  4632 	projectTree := root.
  4633 
  4634 	self projectTreeHolder root:projectTree.
  4635     ].
  4636     ^ projectTree
  4637 !
  4638 
  4639 updateRightCanvas
  4640     |selectedNode nodeContents spec|
  4641 
  4642     self builder bindings removeKey:#listOfAllClassesInPrerequisites ifAbsent:nil.  "/ force recompute
  4643     self builder bindings removeKey:#listOfAllProjectsInPrerequisites ifAbsent:nil.  "/ force recompute
  4644 
  4645     self selectedProjectInPrerequisites value:nil.
  4646     self selectedRequiredProjectInPrerequisites value:nil.
  4647 
  4648     selectedNode := self selectedTreeNode.
  4649     selectedNode isNil ifTrue:[
  4650 	self setupCanvasForNoSelection.
  4651 	^ self
  4652     ].
  4653 
  4654     (spec := selectedNode spec) notNil ifTrue:[
  4655 	self currentCanvasHolder value:spec value.
  4656 	^ self
  4657     ].
  4658 
  4659     selectedNode isProjectNode ifTrue:[
  4660 	self showCommentOf:selectedNode.
  4661 	^ self.
  4662     ].
  4663 
  4664     selectedNode contents == #classes ifTrue:[
  4665 	self showClassListOf:selectedNode.
  4666 	^ self.
  4667     ].
  4668     selectedNode contents == #patches ifTrue:[
  4669 	self showPatchesListOf:selectedNode.
  4670 	^ self.
  4671     ].
  4672     self hasClassNodeSelected ifTrue:[
  4673 	self showClassDefinitionOf:selectedNode.
  4674 	^ self.
  4675     ].      
  4676     self hasMethodNodeSelected ifTrue:[
  4677 	self showMethodSourceOf:selectedNode.
  4678 	^ self.
  4679     ].      
  4680     self hasPrerequisitesNodeSelected ifTrue:[
  4681 	self showPrerequisitesInfo.
  4682 	^ self.
  4683     ].
  4684 
  4685     self currentCanvasHolder value:(self class emptyRightCanvasSpec).
  4686     self rightCanvasTextHolder value:''.
  4687 
  4688     "Modified: / 23.3.1999 / 14:16:02 / cg"
  4689 
  4690 ! !
  4691 
  4692 !ProjectBrowser methodsFor:'private - building'!
  4693 
  4694 checkForMakeProtoFor:aProject
  4695     |f|
  4696 
  4697     "/ check for project directory ...
  4698     (self checkForProjectDirectoryFor:aProject) ifFalse:[
  4699 	^ false
  4700     ].
  4701 
  4702     "/ check for Make.proto ...
  4703     f := aProject directory asFilename construct:'Make.proto'.
  4704     f exists ifFalse:[
  4705 	(self confirm:'''Make.proto'' does not exist in project directory\\Create ?' withCRs) ifFalse:[
  4706 	    ^ false
  4707 	].
  4708 	self buildMakefiles.
  4709     ].
  4710     ^ true
  4711 !
  4712 
  4713 checkForMakefileFor:aProject
  4714     |f|
  4715 
  4716     "/ check for project directory ...
  4717     (self checkForProjectDirectoryFor:aProject) ifFalse:[
  4718 	^ false
  4719     ].
  4720 
  4721     "/ check for Makefile ...
  4722     f := aProject directory asFilename construct:'Makefile'.
  4723     f exists ifFalse:[
  4724 	(self confirm:'''Makefile'' does not exist in project directory\\Create ?' withCRs) ifFalse:[
  4725 	    ^ false
  4726 	].
  4727 	(self checkForMakeProtoFor:aProject) ifFalse:[
  4728 	    ^ false
  4729 	].
  4730 	self buildMakefiles.
  4731     ].
  4732     ^ true
  4733 !
  4734 
  4735 checkForProjectDirectoryFor:aProject
  4736     |dir|
  4737 
  4738     "/ check for project directory ...
  4739     dir := aProject directory asFilename.
  4740     dir exists ifFalse:[
  4741 	(self confirm:'Project directory does not exist\\Create ?' withCRs) ifFalse:[
  4742 	    ^ false
  4743 	].
  4744 	dir recursiveMakeDirectory.
  4745     ].
  4746     ^ true
  4747 
  4748 
  4749 ! !
  4750 
  4751 !ProjectBrowser methodsFor:'private - info'!
  4752 
  4753 showPrerequisitesInfo
  4754 	self showReadOnlyText:
  4755 'When loading this package, 
  4756 these other packages/classes 
  4757 will be loaded before.
  4758 Also, the prerequisite packages'' 
  4759 directory pathes will be added
  4760 to the include path for 
  4761 stc-compilation.'.
  4762 
  4763 	^ self.
  4764 
  4765 
  4766 ! !
  4767 
  4768 !ProjectBrowser methodsFor:'private - table col access'!
  4769 
  4770 classFilenameFromClassInfo:cInfo
  4771     ^ cInfo classFileName
  4772 !
  4773 
  4774 classIncludeConditionFromClassInfo:cInfo
  4775     ^ cInfo conditionForInclusion
  4776 !
  4777 
  4778 classIncludeConditionFromClassInfo:cInfo put:aSymbol
  4779     cInfo conditionForInclusion:aSymbol.
  4780     ^ cInfo
  4781 !
  4782 
  4783 classNameFromClassInfo:cInfo
  4784     |cls nm|
  4785 
  4786     nm := cInfo className.
  4787 
  4788     cls := cInfo theClass.
  4789     (cls isNil or:[cls isLoaded not]) ifTrue:[
  4790 	^ nm asText allItalic
  4791     ].
  4792     ^ nm
  4793 
  4794     "Modified: / 26.9.1999 / 13:49:51 / cg"
  4795 !
  4796 
  4797 classNameFromMethodInfo:pInfo
  4798     ^ pInfo className
  4799 !
  4800 
  4801 classNameFromPatchesInfo:pInfo
  4802     ^ pInfo methodClass name
  4803 !
  4804 
  4805 selectorFromMethodInfo:pInfo
  4806     ^ pInfo methodName
  4807 !
  4808 
  4809 selectorFromPatchesInfo:pInfo
  4810     ^ pInfo methodSelector
  4811 ! !
  4812 
  4813 !ProjectBrowser methodsFor:'user actions'!
  4814 
  4815 addClasses
  4816     "ask for, and add a single class"
  4817 
  4818     |p className cls oldPackage|
  4819 
  4820     p := self currentProject.
  4821 
  4822     className := Dialog request:'Class to add:'.
  4823     className size == 0 ifTrue:[^ self].
  4824     cls := Smalltalk classNamed:className.
  4825     cls isNil ifTrue:[
  4826 	"/ a new one
  4827 	(self confirm:'This is a new class. Add ?') ifFalse:[
  4828 	    ^ self      
  4829 	].
  4830 	p
  4831 	    addClass:className
  4832 	    classFileName:((Smalltalk fileNameForClass:className) , '.st').
  4833     ] ifFalse:[
  4834 	(oldPackage := cls package) ~= p package ifTrue:[
  4835 	    "/ a new one
  4836 	    (self confirm:'Change the classes package from ' , oldPackage , ' to ' , p package , ' ?') ifFalse:[
  4837 		^ self      
  4838 	    ].
  4839 	    cls package:p package.
  4840 	].
  4841 	"/ find the other package ..
  4842 	oldPackage := Project projectWithId:oldPackage.
  4843 	oldPackage notNil ifTrue:[
  4844 	    oldPackage removeClass:cls
  4845 	].
  4846 
  4847 	p
  4848 	    addClass:cls name
  4849 	    classFileName:(cls classFilename 
  4850 			    ? ((Smalltalk fileNameForClass:cls) , '.st')).
  4851     ].
  4852 
  4853     self updateClassListForProject:p
  4854 
  4855 !
  4856 
  4857 itemDoubleClicked:index
  4858     |node classOrClassName cls|
  4859 
  4860     self hasClassNodeSelected ifTrue:[
  4861 	node := self selectedTreeNode.
  4862 	classOrClassName := node contents value.
  4863 	classOrClassName isBehavior ifTrue:[
  4864 	    cls := classOrClassName.
  4865 	] ifFalse:[
  4866 	    cls := Smalltalk at:classOrClassName.
  4867 	].
  4868 	cls isNil ifTrue:[
  4869 	    self information:'The class is not (yet) loaded'.
  4870 	    ^ self
  4871 	].
  4872 	SystemBrowser browseClass:cls.
  4873     ].
  4874 !
  4875 
  4876 itemSelected:index
  4877     |item action info p|
  4878 
  4879     self withWaitCursorDo:[
  4880 	self updateRightCanvas.
  4881     ].
  4882     index isNil ifTrue:[
  4883 	modifiedChannel value:false.
  4884 	^ self
  4885     ].
  4886 
  4887     self readAspectsFromProject.
  4888 
  4889     item := self projectTreeHolder value at:index.
  4890     action := item action.
  4891     action notNil ifTrue:[
  4892 	action value:item.
  4893     ].
  4894 
  4895     info := item info.
  4896     info size == 0 ifTrue:[
  4897 	((p := self currentProject) notNil
  4898 	and:[p isLoaded ~~ true]) ifTrue:[
  4899 	    info := 'Projects code is not loaded.'
  4900 	].
  4901     ].
  4902     self valueOfInfoLabel value:info.
  4903 
  4904     self updateFlagValueHolders.
  4905     modifiedChannel value:false.
  4906 
  4907     "Modified: / 26.4.1999 / 22:49:20 / cg"
  4908 !
  4909 
  4910 loadFromProjectFile:aFilenameString
  4911     |oldNode newProject|
  4912 
  4913     self withReadCursorDo:[
  4914 	newProject := Project new loadFromProjectFile:aFilenameString.
  4915 
  4916 	oldNode := self projectTreeHolder 
  4917 			detectFirstItem:[:item | item contents class == Project
  4918 						 and:[item contents package = newProject package]].
  4919 	oldNode notNil ifTrue:[
  4920 	    (self confirm:'Overload packages definitions from file ?') ifFalse:[
  4921 		^ self
  4922 	    ].
  4923 	    self projectTreeHolder remove:oldNode.
  4924 	].
  4925 
  4926 	newProject notNil ifTrue:[
  4927 	    self newProject:newProject
  4928 	].
  4929 	self expandPathToNodeFor:newProject.
  4930 
  4931     ].
  4932     ^ newProject
  4933 !
  4934 
  4935 loadProject
  4936     |project|
  4937 
  4938     project := self currentProject.
  4939 self halt.
  4940     Smalltalk loadPackage:(project name)
  4941 !
  4942 
  4943 loadProjectCode
  4944     |project filesToLoad methodsFile ns anyPatchClassMissing anyPatches
  4945      nMissingSuper prevNMissingSuper|
  4946 
  4947     project := self currentProject.
  4948     ns := project defaultNameSpace.
  4949     ns isSymbol ifTrue:[
  4950         ns := NameSpace name:ns
  4951     ].
  4952     self withReadCursorDo:[
  4953         filesToLoad := OrderedCollection new.
  4954 
  4955         "/ load all classes ...
  4956         project classInfo do:[:aClassInfo |
  4957             |className fileToLoad cls|
  4958 
  4959             className := aClassInfo className.
  4960             fileToLoad := aClassInfo classFileName.
  4961             cls := ns at:className asSymbol.
  4962             cls notNil ifTrue:[
  4963                 cls isBehavior ifFalse:[
  4964                     (self confirm:('Attention: a global named ' , className , ' exists, but is not a class.\\Load anyway ?') withCRs)
  4965                     ifFalse:[
  4966                         fileToLoad := nil
  4967                     ]
  4968                 ] ifTrue:[
  4969                     cls isLoaded ifTrue:[
  4970                         fileToLoad := nil
  4971                     ]
  4972                 ]
  4973             ].
  4974             fileToLoad notNil ifTrue:[
  4975                 filesToLoad add:fileToLoad
  4976             ].
  4977         ].
  4978 
  4979         anyPatchClassMissing := false.
  4980         anyPatches := false.
  4981         project methodInfo do:[:aMethodInfo |
  4982             |className methodName mthd cls|
  4983 
  4984             className := aMethodInfo className.
  4985             methodName := aMethodInfo methodName.
  4986             cls := Smalltalk at:className asSymbol.
  4987             (cls isNil or:[cls isBehavior not or:[cls isLoaded not]]) ifTrue:[
  4988                 self warn:('Missing class: ' , className , ' (required for patches)').
  4989                 anyPatchClassMissing := anyPatches := true.
  4990             ] ifFalse:[
  4991                 "/ already present ?
  4992                 (cls compiledMethodAt:methodName asSymbol) isNil ifTrue:[
  4993                     anyPatches := true.
  4994                 ]
  4995             ]
  4996         ].
  4997 
  4998         (methodsFile := project propertyAt:#methodsFile) notNil ifTrue:[
  4999             anyPatches ifTrue:[
  5000                 anyPatchClassMissing ifTrue:[
  5001                     self warn:('Cannot load patches & extensions, due to missing class(es)')
  5002                 ] ifFalse:[
  5003                     filesToLoad add:methodsFile
  5004                 ]
  5005             ]
  5006         ] ifFalse:[
  5007             anyPatches ifTrue:[
  5008                 self warn:('No file for methods (patches & extensions) is defined in project')
  5009             ].
  5010         ].
  5011 
  5012         filesToLoad size == 0 ifTrue:[
  5013             self information:'Projects code is already loaded.'
  5014         ] ifFalse:[
  5015             "/ load as long as superclasses are missing
  5016             "/ (since the load order could be incorrect)
  5017             prevNMissingSuper := nil.
  5018             nMissingSuper := 1.
  5019             [nMissingSuper > 0 and:[nMissingSuper ~~ prevNMissingSuper]]
  5020             whileTrue:[
  5021                 nMissingSuper := 0.
  5022                 UndefinedSuperclassError handle:[:ex |
  5023                     nMissingSuper := nMissingSuper + 1.
  5024                     ex proceed
  5025                 ] do:[
  5026                     Class packageQuerySignal answer:project package asSymbol
  5027                     do:[
  5028                         filesToLoad do:[:fileToLoad |
  5029                             Smalltalk fileIn:(project directory asFilename construct:fileToLoad) pathName
  5030                         ]
  5031                     ]
  5032                 ].
  5033                 prevNMissingSuper := nMissingSuper.
  5034             ].
  5035         ].
  5036         project isLoaded:true.
  5037         self readAspectsFromProject
  5038     ]
  5039 !
  5040 
  5041 methodPatchDoubleClick:arg
  5042 self halt.
  5043 !
  5044 
  5045 projectFilterChanged
  5046     |theNode|
  5047 
  5048     self updateProjectTree.
  5049     self updateRightCanvas.
  5050     self showWhat value == #current ifTrue:[
  5051 	theNode := self projectTreeHolder 
  5052 			detectFirstItem:[:item | item contents == Project current].
  5053 
  5054 	[theNode notNil] whileTrue:[
  5055 	    self projectTreeHolder expand:theNode.
  5056 	    theNode := theNode parent.
  5057 	].
  5058 
  5059     ].
  5060 !
  5061 
  5062 selectionChangeAllowed:newNode
  5063     |answer|
  5064 
  5065     newNode == self selectedTreeNode ifTrue:[
  5066 	^ true 
  5067     ].
  5068     (modifiedChannel value 
  5069     and:[true "self reallyModified"]) ifTrue:[
  5070 	answer := Dialog confirmWithCancel:'Accept changes ?'.
  5071 	answer isNil ifTrue:[
  5072 	    ^ false
  5073 	].
  5074 	answer == true ifTrue:[
  5075 	    self accept.
  5076 	].
  5077     ].
  5078     ^ true
  5079 
  5080 !
  5081 
  5082 showClassDefinitionOf:anItem
  5083     |node classOrClassName cls text|
  5084 
  5085     self hasClassNodeSelected ifFalse:[^ self].
  5086 
  5087     self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
  5088 
  5089     node := self selectedTreeNode.
  5090     classOrClassName := node contents value.
  5091     classOrClassName isBehavior ifTrue:[
  5092 	cls := classOrClassName.
  5093     ] ifFalse:[
  5094 	cls := Smalltalk at:classOrClassName.
  5095     ].
  5096     cls isNil ifTrue:[
  5097 	text := 'The class is not (yet) loaded'.
  5098     ] ifFalse:[
  5099 	text := cls definition
  5100     ].
  5101     self rightCanvasTextHolder value:text.
  5102 
  5103 !
  5104 
  5105 showClassListOf:anItem
  5106     |projectItem project|
  5107 
  5108     projectItem := anItem parent.
  5109     project := projectItem contents.
  5110 
  5111     self updateClassListForProject:project.
  5112 
  5113     self currentCanvasHolder value:(self class rightCanvasSpecForClassList).
  5114 !
  5115 
  5116 showCommentOf:anItem
  5117     |projectItem project|
  5118 
  5119     anItem contents == #comment ifTrue:[
  5120 	projectItem := anItem parent
  5121     ] ifFalse:[
  5122 	projectItem := anItem
  5123     ].
  5124     project := projectItem contents.
  5125 
  5126     self textCanvasLabelHolder value:'Projects comment'.
  5127     self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
  5128     self rightCanvasTextHolder value:project comment.
  5129 
  5130 !
  5131 
  5132 showDocumentationFor:anItem
  5133     |projectItem project|
  5134 
  5135     anItem contents == #documentation ifTrue:[
  5136 	projectItem := anItem parent
  5137     ] ifFalse:[
  5138 	projectItem := anItem
  5139     ].
  5140     project := projectItem contents.
  5141 
  5142     self currentCanvasHolder value:(self class rightCanvasSpecForHTMLText).
  5143     self htmlDocumentURLHolder value:project documentationURL.
  5144 !
  5145 
  5146 showMethodSourceOf:anItem
  5147     |node methodInfo classOrClassName cls mthd text|
  5148 
  5149     self hasMethodNodeSelected ifFalse:[^ self].
  5150 
  5151     self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
  5152 
  5153     node := self selectedTreeNode.
  5154     methodInfo := node contents value.
  5155     cls := Smalltalk at:methodInfo className asSymbol.
  5156     cls isNil ifTrue:[
  5157 	text := 'The class is not (yet) loaded'.
  5158     ] ifFalse:[
  5159 	mthd := cls compiledMethodAt:(methodInfo methodName asSymbol).
  5160 	mthd isNil ifTrue:[
  5161 	    text := 'The method is not (yet) loaded'.
  5162 	] ifFalse:[
  5163 	    text := mthd source
  5164 	]
  5165     ].
  5166     self rightCanvasTextHolder value:text.
  5167 
  5168 !
  5169 
  5170 showPatchesListOf:anItem
  5171     |projectItem project patches l|
  5172 
  5173     projectItem := anItem parent.
  5174     project := projectItem contents.
  5175 
  5176     self updatePatchesListForProject:project.
  5177 
  5178 "/    patches := project methods.
  5179 "/    patches := patches collect:[:m | m who].
  5180 "/    patches := patches sort:[:w1 :w2 |
  5181 "/                        |w1Nm w2Nm|
  5182 "/
  5183 "/                        w1Nm := w1 methodClass name.
  5184 "/                        w2Nm := w2 methodClass name.
  5185 "/                        w1Nm < w2Nm ifTrue:[
  5186 "/                            true
  5187 "/                        ] ifFalse:[
  5188 "/                            w1Nm = w2Nm ifFalse:[
  5189 "/                                false
  5190 "/                            ] ifTrue:[
  5191 "/                                w1 methodSelector < w2 methodSelector
  5192 "/                            ]
  5193 "/                        ]
  5194 "/                       ].
  5195 "/
  5196 "/    l := self patchesList.
  5197 "/    l removeAll.
  5198 "/    l addAll:patches.
  5199 
  5200     self currentCanvasHolder value:(self class rightCanvasSpecForPatchesList).
  5201 !
  5202 
  5203 showReadOnlyText:someText
  5204     self currentCanvasHolder value:(self class rightCanvasSpecForReadOnlyText).
  5205     self rightCanvasTextHolder value:someText.
  5206 
  5207 !
  5208 
  5209 unloadProject
  5210     |project filesToLoad methodsFile ns anyPatchClassMissing anyPatches
  5211      nMissingSuper prevNMissingSuper|
  5212 
  5213     project := self currentProject.
  5214 self halt.
  5215 !
  5216 
  5217 updateClassListForProject:aProject
  5218     |classInfo l|
  5219 
  5220     classInfo := aProject classInfo copy asOrderedCollection.
  5221     classInfo sort:[:a :b | a className < b className].
  5222 
  5223     l := self classList.
  5224     l removeAll.
  5225     l addAll:classInfo.
  5226 
  5227 
  5228 !
  5229 
  5230 updateListOfProjects
  5231     "scan all classes/methods for new projects"
  5232 
  5233     self withWaitCursorDo:[
  5234 	Project initKnownProjects.
  5235 	self updateProjectTree
  5236     ].
  5237 !
  5238 
  5239 updateListOfRequiredPrerequisiteClasses
  5240     "all autoloaded superclasses of my classes are definitely required"
  5241 
  5242     |p anyChange allInPre requiredInPre nTotal nMissing msg|
  5243 
  5244     p := self currentProject.
  5245     p isNil ifTrue:[^ self].
  5246     anyChange := false.
  5247     nTotal := 0.
  5248     nMissing := 0.
  5249     allInPre := self listOfAllClassesInPrerequisites value.
  5250     requiredInPre := self listOfRequiredClassesInPrerequisites value.
  5251 
  5252     self currentProjectsClassNames do:[:aClassName |
  5253 	|cls|
  5254 
  5255 	cls := Smalltalk at:aClassName asSymbol.
  5256 	(cls notNil and:[cls isLoaded]) ifTrue:[
  5257 	    cls allSuperclasses do:[:superClass |
  5258 		|sName idx|
  5259 
  5260 		(superClass notNil 
  5261 		and:[superClass isLoaded
  5262 		and:[superClass wasAutoloaded]]) ifTrue:[
  5263 		    |sName entry|
  5264 
  5265 		    sName := superClass name.
  5266 		    idx := allInPre findFirst:[:item | item string = sName].
  5267 		    idx ~~ 0 ifTrue:[
  5268 			allInPre removeIndex:idx.
  5269 			requiredInPre add:sName asText allBold.
  5270 			anyChange := true.
  5271 		    ]
  5272 		]
  5273 	    ]
  5274 	] ifFalse:[
  5275 	    nMissing := nMissing + 1.
  5276 	].
  5277 	nTotal := nTotal + 1.
  5278     ].
  5279 
  5280     anyChange ifTrue:[
  5281 	self listOfRequiredClassesInPrerequisites changed.
  5282 	self listOfAllClassesInPrerequisites changed.
  5283     ].
  5284     nMissing ~~ 0 ifTrue:[
  5285 	nMissing == nTotal ifTrue:[
  5286 	    msg := 'Project is not loaded (' , nMissing printString
  5287 			    , ' unloaded classes)'.
  5288 	] ifFalse:[
  5289 	    msg := 'Project is not loaded completely - ' , nMissing printString
  5290 			    , ' of the projects ' , nTotal printString , ' classes are not loaded'.
  5291 	].
  5292 "/        self notify:msg.
  5293     ].
  5294     modifiedChannel value:false.
  5295 !
  5296 
  5297 updatePatchesListForProject:aProject
  5298     |methodInfo l|
  5299 
  5300     methodInfo := aProject methodInfo copy asOrderedCollection.
  5301     methodInfo sort:[:a :b | a displayString < b displayString].
  5302 
  5303     l := self patchesList.
  5304     l removeAll.
  5305     l addAll:methodInfo.
  5306 
  5307 
  5308 ! !
  5309 
  5310 !ProjectBrowser methodsFor:'user actions - canvas'!
  5311 
  5312 accept
  5313     "save values from aspects into the project"
  5314 
  5315     self saveAspectsIntoProject.
  5316     modifiedChannel value:false.
  5317 
  5318 !
  5319 
  5320 addClassToPrerequisites
  5321     |sel cls|
  5322 
  5323     sel := self selectedClassInPrerequisites value.
  5324     self listOfRequiredClassesInPrerequisites value add:sel.
  5325     self listOfAllClassesInPrerequisites value remove:sel.
  5326     self selectedClassInPrerequisites value:nil.
  5327 
  5328     "/ also add any autoloaded superclass(es)
  5329 
  5330     cls := Smalltalk at:sel asSymbol.
  5331     (cls notNil and:[cls isLoaded]) ifTrue:[
  5332 	cls allSuperclasses do:[:superClass |
  5333 	    |sName|
  5334 
  5335 	    (superClass notNil 
  5336 	    and:[superClass isLoaded
  5337 	    and:[superClass wasAutoloaded]]) ifTrue:[
  5338 		|sName idx|
  5339 		sName := superClass name.
  5340 		idx := self listOfAllClassesInPrerequisites value findFirst:[:s | s string = sName].
  5341 		idx ~~ 0 ifTrue:[
  5342 		    self listOfAllClassesInPrerequisites value removeIndex:idx.
  5343 		    self listOfRequiredClassesInPrerequisites value add:sName asString allBold.
  5344 		].
  5345 	    ]
  5346 	]
  5347     ].
  5348     self listOfRequiredClassesInPrerequisites changed.
  5349     self listOfAllClassesInPrerequisites changed.
  5350     self accept
  5351 !
  5352 
  5353 addProjectToPrerequisites
  5354     |sel|
  5355 
  5356     sel := self selectedProjectInPrerequisites value.
  5357     self listOfRequiredProjectsInPrerequisites value add:sel.
  5358     self listOfAllProjectsInPrerequisites value remove:sel.
  5359     self selectedProjectInPrerequisites value:nil.
  5360 
  5361     self listOfRequiredProjectsInPrerequisites changed.
  5362     self listOfAllProjectsInPrerequisites changed.
  5363     self accept
  5364 
  5365 !
  5366 
  5367 browseMethod
  5368     "browse the selected method (from tree)"
  5369 
  5370     |patchWho mthdInfo cls mthd|
  5371 
  5372     mthdInfo := self selectedTreeNode value value.
  5373     cls := Smalltalk at: mthdInfo className asSymbol.
  5374     cls notNil ifTrue:[
  5375 	mthd := cls compiledMethodAt:(mthdInfo methodName asSymbol).    
  5376 	mthd notNil ifTrue:[
  5377 	    SystemBrowser browseClass:cls selector:mthdInfo methodName.
  5378 	    ^ self
  5379 	]
  5380     ].
  5381     self information:'Method not (yet) loaded.'
  5382 !
  5383 
  5384 browseMethodFromCanvas
  5385     "browse the selected table-rows method (from patches canvas)"
  5386 
  5387     |patchWho patchIndex|
  5388 
  5389     patchIndex := self selectedPatchInRightCanvas value.
  5390     patchWho := self patchesList at:patchIndex.
  5391     SystemBrowser browseClass:patchWho methodClass selector:patchWho methodSelector.
  5392 
  5393 !
  5394 
  5395 browseMethodFull
  5396     "browse the selected method (from tree)"
  5397 
  5398     |patchWho mthdInfo cls mthd|
  5399 
  5400     mthdInfo := self selectedTreeNode value value.
  5401     cls := Smalltalk at: mthdInfo className asSymbol.
  5402     cls notNil ifTrue:[
  5403 	mthd := cls compiledMethodAt:(mthdInfo methodName asSymbol).    
  5404 	mthd notNil ifTrue:[
  5405 	    SystemBrowser openInClass:cls selector:mthdInfo methodName.
  5406 	    ^ self
  5407 	]
  5408     ].
  5409     self information:'Method not (yet) loaded.'
  5410 
  5411 !
  5412 
  5413 browseMethodFullFromCanvas
  5414     "browse the selected table-rows method (from patches canvas)"
  5415 
  5416     |patchWho patchIndex|
  5417 
  5418     patchIndex := self selectedPatchInRightCanvas value.
  5419     patchWho := self patchesList at:patchIndex.
  5420     SystemBrowser openInClass:patchWho methodClass selector:patchWho methodSelector.
  5421 
  5422 !
  5423 
  5424 cancel
  5425     "reload aspects from the project"
  5426 
  5427     self readAspectsFromProject
  5428 !
  5429 
  5430 removeClassFromPrerequisites
  5431     |sel cls myClasses|
  5432 
  5433     sel := self selectedRequiredClassInPrerequisites value.
  5434     cls := Smalltalk at:sel asSymbol.
  5435 
  5436     "/ check if this affects my classes
  5437     (cls notNil and:[cls isLoaded and:[cls wasAutoloaded]]) ifTrue:[
  5438 	myClasses := self currentProjectsClassNames.
  5439 	cls allSubclassesDo:[:cls |
  5440 	    (myClasses includes:cls name) ifTrue:[
  5441 		self valueOfInfoLabel value:'Attention - this class is required by ' , cls name.
  5442 		(self confirm:'Attention - this class is required by ' , cls name asText allBold, '.\(The project could later fail to load correctly)\\Really remove ?' withCRs) ifFalse:[
  5443 		    ^ self
  5444 		].
  5445 	    ].
  5446 	]
  5447     ].
  5448 
  5449     self listOfAllClassesInPrerequisites value add:sel.
  5450     self listOfRequiredClassesInPrerequisites value remove:sel.
  5451     self selectedRequiredClassInPrerequisites value:nil.
  5452 
  5453     "/ also remove any autoloaded subclass(es)
  5454 
  5455     (cls notNil and:[cls isLoaded and:[cls wasAutoloaded]]) ifTrue:[
  5456 	cls allSubclassesDo:[:cls |
  5457 	    |entry|
  5458 
  5459 	    entry := self listOfRequiredClassesInPrerequisites value remove:cls name ifAbsent:nil.
  5460 	    entry notNil ifTrue:[
  5461 	       self listOfAllClassesInPrerequisites value add:cls name.
  5462 	    ]
  5463 	]
  5464     ].
  5465 
  5466     self listOfRequiredClassesInPrerequisites changed.
  5467     self listOfAllClassesInPrerequisites changed.
  5468     self accept
  5469 
  5470 !
  5471 
  5472 removeProjectFromPrerequisites
  5473     |sel|
  5474 
  5475     sel := self selectedRequiredProjectInPrerequisites value.
  5476     self listOfAllProjectsInPrerequisites value add:sel.
  5477     self listOfRequiredProjectsInPrerequisites value remove:sel.
  5478     self selectedRequiredProjectInPrerequisites value:nil.
  5479 
  5480     self listOfRequiredProjectsInPrerequisites changed.
  5481     self listOfAllProjectsInPrerequisites changed.
  5482     self accept
  5483 
  5484 !
  5485 
  5486 showInfoForRequiredClass:entry
  5487     "show why a class is required"
  5488 
  5489     |cls myClasses|
  5490 
  5491     entry notNil ifTrue:[
  5492 	myClasses := self currentProjectsClassNames asSet.
  5493 
  5494 	cls := Smalltalk at:entry string asSymbol.
  5495 	cls allSubclasses do:[:subClass |
  5496 	    (myClasses includes:subClass name) ifTrue:[
  5497 		self valueOfInfoLabel value:('Required by ' , subClass name).
  5498 		^ self.
  5499 	    ]
  5500 	].
  5501     ].
  5502     self valueOfInfoLabel value:nil
  5503 ! !
  5504 
  5505 !ProjectBrowser methodsFor:'user actions - menu'!
  5506 
  5507 addClass
  5508     "ask for, and add a single class"
  5509 
  5510     |p className cls|
  5511 
  5512     p := self currentProject.
  5513 
  5514     className := Dialog request:'Class to add:'.
  5515     className size == 0 ifTrue:[^ self].
  5516     cls := Smalltalk classNamed:className.
  5517     cls isNil ifTrue:[
  5518 	"/ a new one
  5519 	(self confirm:'This is a new class. Add ?') ifFalse:[
  5520 	    ^ self      
  5521 	].
  5522 	p
  5523 	    addClass:className
  5524 	    classFileName:((Smalltalk fileNameForClass:className) , '.st').
  5525     ] ifFalse:[
  5526 	cls package ~= p package ifTrue:[
  5527 	    "/ a new one
  5528 	    (self confirm:'Change the classes package from ' , cls package , ' to ' , p package , ' ?') ifFalse:[
  5529 		^ self      
  5530 	    ].
  5531 	    cls package:p package.
  5532 	].
  5533 	p
  5534 	    addClass:cls name
  5535 	    classFileName:(cls classFilename 
  5536 			    ? ((Smalltalk fileNameForClass:cls) , '.st')).
  5537     ].
  5538 
  5539     self updateClassListForProject:p
  5540 
  5541 !
  5542 
  5543 addClassesFromFilesInDirectory
  5544     "add all classes found from files in the project directory"
  5545 
  5546     self addClassesFromFilesInDirectoryWithFilter:nil
  5547 !
  5548 
  5549 addClassesFromFilesInDirectoryIfPresentInImage
  5550     "add all classes found from files in the project directory,
  5551      but only if class is currently present in the image."
  5552 
  5553     self addClassesFromFilesInDirectoryWithFilter:[:classOrName | classOrName isBehavior]
  5554 
  5555 !
  5556 
  5557 addClassesFromFilesInDirectoryWithFilter:aFilterBlockOrNil
  5558     "helper to add all classes found from files in the project directory"
  5559 
  5560     |project existingClasses prjDirectory anyChange numSTFilesFound|
  5561 
  5562     project := self currentProject.
  5563 
  5564     existingClasses := project classInfo.
  5565     anyChange := false.
  5566     numSTFilesFound := 0.
  5567 
  5568     prjDirectory := project directory asFilename.
  5569     (prjDirectory exists and:[prjDirectory isDirectory]) ifFalse:[
  5570 	self warn:'Invalid project directory: ' , prjDirectory pathName.
  5571 	^ self
  5572     ].
  5573 
  5574     prjDirectory directoryContents do:[:fn |
  5575 	|f oldInfo cls|
  5576 
  5577 	f := prjDirectory construct:fn.
  5578 	(f hasSuffix:'st') ifTrue:[
  5579 	    numSTFilesFound := numSTFilesFound + 1.
  5580 
  5581 	    oldInfo := existingClasses 
  5582 			    detect:[:clsInfo |
  5583 					clsInfo classFileName = fn
  5584 				   ] 
  5585 			    ifNone:nil.
  5586 	    oldInfo isNil ifTrue:[
  5587 		"/ extract className from fileName ...
  5588 		cls := Smalltalk filenameAbbreviations keyAtValue:(f withoutSuffix baseName ).
  5589 		cls isNil ifTrue:[
  5590 		    cls := f withoutSuffix baseName asSymbol.
  5591 		    project defaultNameSpace notNil ifTrue:[
  5592 			cls := (project defaultNameSpace name , '::' , cls) asSymbol
  5593 		    ]
  5594 		].
  5595 		(aFilterBlockOrNil isNil 
  5596 		or:[aFilterBlockOrNil value:cls]) ifTrue:[
  5597 		    project addClass:cls classFileName:fn.
  5598 		    anyChange := true.
  5599 Transcript showCR:'added ' , fn , ' as class: ' , cls printString.
  5600 		] ifFalse:[
  5601 Transcript showCR:'skipped ' , fn , ' as class: ' , cls printString.
  5602 		]
  5603 
  5604 	    ]
  5605 	]
  5606     ].
  5607 
  5608     anyChange ifTrue:[
  5609 	self updateClassListForProject:project
  5610     ] ifFalse:[
  5611 	numSTFilesFound == 0 ifTrue:[
  5612 	    self information:'No st-sourcefiles found in ' , prjDirectory pathName.
  5613 	]
  5614     ]
  5615 !
  5616 
  5617 addClassesFromImage
  5618     "add classes with this packageId found in the image"
  5619 
  5620     |project|
  5621 
  5622     project := self currentProject.
  5623     Smalltalk allClassesDo:[:aClass |
  5624 	aClass isMeta ifFalse:[
  5625 	    (aClass isNameSpace not or:[aClass == Smalltalk]) ifTrue:[
  5626 		aClass package = project package ifTrue:[
  5627 		    (project classInfoFor:aClass) isNil ifTrue:[
  5628 			project 
  5629 			    addClass:aClass name
  5630 			    classFileName:(aClass classFilename 
  5631 					    ? ((Smalltalk fileNameForClass:aClass) , '.st')).
  5632 		    ]
  5633 		 ]
  5634 	     ]
  5635 	]
  5636     ].                 
  5637 
  5638     self updateClassListForProject:project
  5639 
  5640 !
  5641 
  5642 addPrerequisitePackage
  5643     "ask for, and add a single class"
  5644 
  5645     |p packageName cls|
  5646 
  5647     p := self currentProject.
  5648 
  5649     packageName := Dialog request:'Package to add:'.
  5650     packageName size == 0 ifTrue:[^ self].
  5651 
  5652     p addPrerequisitePackage:packageName.
  5653 "/    self updatePrerequisitePackageListForProject:p.
  5654 
  5655     self listOfRequiredProjectsInPrerequisites value add:packageName.
  5656     self listOfAllProjectsInPrerequisites value remove:packageName ifAbsent:nil.
  5657     self selectedProjectInPrerequisites value:nil.
  5658 
  5659     self listOfRequiredProjectsInPrerequisites changed.
  5660     self listOfAllProjectsInPrerequisites changed.
  5661     self accept
  5662 
  5663 !
  5664 
  5665 browseClasses
  5666     "browse the projects classes"
  5667 
  5668     |ns p classes nBad uniqueClasses|
  5669 
  5670     p := self currentProject.
  5671     classes := p classes
  5672 		collect:[:clsOrName |
  5673 			    |cls realName|
  5674 
  5675 			    clsOrName isSymbol ifTrue:[
  5676 				realName := clsOrName.
  5677 				(realName includes:$:) ifTrue:[
  5678 				    (realName startsWith:'Smalltalk::') ifTrue:[
  5679 					realName := (realName copyFrom:'Smalltalk::' size + 1) asSymbol
  5680 				    ]
  5681 				].
  5682 				cls := Smalltalk at:realName
  5683 			    ] ifFalse:[
  5684 				cls := clsOrName
  5685 			    ].
  5686 			    cls
  5687 			].
  5688 
  5689     "/ remove duplicates - but want to preserve order
  5690     "/ thats why we do not use asIdentitySet asOrderedCollection
  5691     uniqueClasses := OrderedCollection new.
  5692     classes do:[:cls | (uniqueClasses includesIdentical:cls) ifFalse:[uniqueClasses add:cls]].
  5693 
  5694     nBad := classes inject:0 into:[:sum :el | el isNil ifTrue:[sum+1] ifFalse:[sum]].
  5695     nBad ~~ 0 ifTrue:[
  5696 	classes := classes select:[:cls | cls notNil].
  5697 	self warn:('Oops - %1 classes could not be found.\\You should probably load them first.' bindWith:nBad) withCRs.
  5698     ].
  5699 
  5700 
  5701     SystemBrowser
  5702 	browseClasses:classes title:('Classes in ' , p name) sort:true.
  5703 
  5704 
  5705 
  5706 !
  5707 
  5708 buildAbbrevFile
  5709     "generate an abbrev.stc file in the projects directory"
  5710 
  5711     |p |
  5712 
  5713     p := self currentProject.
  5714     p isNil ifTrue:[
  5715 	self information:'No project selected'.
  5716 	^ self
  5717     ].
  5718 
  5719     self withCursor:Cursor wait do:[
  5720 	self makeTranscriptVisible.
  5721 	TextCollector transcriptQuerySignal answer:self transcript
  5722 	do:[
  5723 	    p createAbbrevFile.
  5724 	]
  5725     ]
  5726 !
  5727 
  5728 buildAll
  5729     "build all as specified in the deployment section"
  5730 
  5731     |p|
  5732 
  5733     p := self currentProject.
  5734     p isNil ifTrue:[
  5735 	self information:'No project selected'.
  5736 	^ self
  5737     ].
  5738 
  5739     self makeTranscriptVisible.
  5740 
  5741     self withCursor:Cursor wait do:[
  5742 	"/ prepare the building ...
  5743 
  5744 	TextCollector transcriptQuerySignal answer:self transcript
  5745 	do:[
  5746 	    (p propertyAt:#deliverLoadAllFile) == true ifTrue:[
  5747 		p createLoadAllFile
  5748 	    ].
  5749 
  5750 	    (p propertyAt:#deliverSources) == true ifTrue:[
  5751 		p createSourceFiles
  5752 	    ].
  5753 
  5754 	    (p propertyAt:#deliverMakefiles) == true ifTrue:[
  5755 		self buildMakefiles
  5756 	    ].
  5757 
  5758 	    (p propertyAt:#deliverCompiledBinary) == true ifTrue:[
  5759 		self buildCompiledClassLibrary
  5760 	    ].
  5761 
  5762 	    (p propertyAt:#deliverByteCode) == true ifTrue:[
  5763 		self buildByteCodeClassLibrary
  5764 	    ].
  5765 
  5766 	    "/ now, deploy ...
  5767 
  5768 	    (p propertyAt:#deliverZipArchive) == true ifTrue:[
  5769 		p buildZipArchive
  5770 	    ].
  5771 
  5772 	    (p propertyAt:#deliverTarArchive) == true ifTrue:[
  5773 		p buildTarArchive
  5774 	    ].
  5775 
  5776 	    (p propertyAt:#deliverGZipArchive) == true ifTrue:[
  5777 		p buildGZipArchive
  5778 	    ].
  5779 	].
  5780     ].
  5781 
  5782 
  5783 !
  5784 
  5785 buildCompiledClassLibrary
  5786     "compile a binary class library in the projects directory"
  5787 
  5788     |p diagnostic error textBox|
  5789 
  5790     p := self currentProject.
  5791     p isNil ifTrue:[
  5792 	self information:'No project selected'.
  5793 	^ self
  5794     ].
  5795 
  5796     "/ check for directory ...
  5797     (self checkForProjectDirectoryFor:p) ifFalse:[
  5798 	^ self
  5799     ].
  5800 
  5801     "/ check for Make.proto ...
  5802     (self checkForMakeProtoFor:p) ifFalse:[
  5803 	^ self
  5804     ].
  5805 
  5806     "/ check for Makefile ...
  5807     (self checkForMakefileFor:p) ifFalse:[
  5808 	^ self
  5809     ].
  5810 
  5811     self makeTranscriptVisible.
  5812 
  5813     "/ now, execute the makefile found there ...
  5814     diagnostic := self transcript.
  5815 
  5816     error := false.
  5817     diagnostic nextPutLine:('Building compiled class library...' asText emphasizeAllWith:#color->Color blue).
  5818 
  5819     self withCursor:Cursor wait do:[
  5820 	OperatingSystem
  5821 	    executeCommand:'make' 
  5822 	    inputFrom:nil 
  5823 	    outputTo:diagnostic 
  5824 	    errorTo:diagnostic 
  5825 	    inDirectory:(p directory asFilename pathName) 
  5826 	    onError:[:status | error := true].
  5827     ].
  5828 
  5829 
  5830 
  5831 !
  5832 
  5833 buildLoadAllFile
  5834     "generate a loadAll file in the projects directory"
  5835 
  5836     |p |
  5837 
  5838     p := self currentProject.
  5839     p isNil ifTrue:[
  5840 	self information:'No project selected'.
  5841 	^ self
  5842     ].
  5843 
  5844     self withCursor:Cursor wait do:[
  5845 	self makeTranscriptVisible.
  5846 	TextCollector transcriptQuerySignal answer:self transcript
  5847 	do:[
  5848 	    p createLoadAllFile.
  5849 	]
  5850     ]
  5851 !
  5852 
  5853 buildMakefile
  5854     "generate a Makefile/nt.mak/vms.mak in the projects directory"
  5855 
  5856     |p |
  5857 
  5858     p := self currentProject.
  5859     p isNil ifTrue:[
  5860 	self information:'No project selected'.
  5861 	^ self
  5862     ].
  5863 
  5864     self withCursor:Cursor wait do:[
  5865 	self makeTranscriptVisible.
  5866 	TextCollector transcriptQuerySignal answer:self transcript
  5867 	do:[
  5868 	    p createMakefile
  5869 	]
  5870     ].
  5871 
  5872     "Created: / 16.12.1999 / 01:29:30 / cg"
  5873 !
  5874 
  5875 buildMakefiles
  5876     "generate a Make.proto and Makefile in the projects directory"
  5877 
  5878     |p |
  5879 
  5880     p := self currentProject.
  5881     p isNil ifTrue:[
  5882 	self information:'No project selected'.
  5883 	^ self
  5884     ].
  5885 
  5886     self withCursor:Cursor wait do:[
  5887 	self makeTranscriptVisible.
  5888 	TextCollector transcriptQuerySignal answer:self transcript
  5889 	do:[
  5890 	    p createProtoMakefile.
  5891 	    p createMakefile
  5892 	]
  5893     ].
  5894 !
  5895 
  5896 buildNTMakefile
  5897     "generate an nt.mak in the projects directory"
  5898 
  5899     |p |
  5900 
  5901     p := self currentProject.
  5902     p isNil ifTrue:[
  5903 	self information:'No project selected'.
  5904 	^ self
  5905     ].
  5906 
  5907     self withCursor:Cursor wait do:[
  5908 	self makeTranscriptVisible.
  5909 	TextCollector transcriptQuerySignal answer:self transcript
  5910 	do:[
  5911 	    p createNTMakefile
  5912 	]
  5913     ].
  5914 
  5915     "Created: / 19.1.2000 / 15:55:17 / cg"
  5916 !
  5917 
  5918 checkInAllClasses
  5919     "check in all classes"
  5920 
  5921     |p classes classesToCheckIn anyBad|
  5922 
  5923     p := self currentProject.
  5924     p isNil ifTrue:[
  5925 	self information:'No project selected'.
  5926 	^ self
  5927     ].
  5928 
  5929     classesToCheckIn := OrderedCollection new.
  5930     anyBad := false.
  5931 
  5932     "/ collect in classes ...
  5933 
  5934     classes := p classes.
  5935     classes do:[:aClassOrClassName |
  5936 	|cls clsName|
  5937 
  5938 	cls := aClassOrClassName.
  5939 	cls isString ifTrue:[
  5940 	    cls := Smalltalk at:cls asSymbol.
  5941 	    clsName := aClassOrClassName
  5942 	] ifFalse:[
  5943 	    clsName := aClassOrClassName name
  5944 	].
  5945 
  5946 	cls isBehavior ifFalse:[
  5947 	    Transcript showCR:('ProjectBrowser: cannot checkIn unloaded class: ' , clsName).
  5948 	    anyBad := true.
  5949 	] ifTrue:[
  5950 	    cls isLoaded ifFalse:[
  5951 		Transcript showCR:('ProjectBrowser: cannot checkIn unloaded class: ' , clsName).
  5952 		anyBad := true.
  5953 	    ] ifTrue:[
  5954 		cls owningClass isNil ifTrue:[ "/ skip private classes
  5955 		    Transcript showCR:('ProjectBrowser: checking in class: ' , clsName).
  5956 		    classesToCheckIn add:cls.
  5957 		]
  5958 	    ]
  5959 	]
  5960     ].
  5961     anyBad ifTrue:[^ self].
  5962 
  5963     self checkInClasses:classesToCheckIn.
  5964 
  5965 !
  5966 
  5967 checkInMakefiles
  5968     "check in the Make.proto, Makefile, nt.mak and vms.mak files"
  5969 
  5970     |p|
  5971 
  5972     p := self currentProject.
  5973     p isNil ifTrue:[
  5974 	self information:'No project selected'.
  5975 	^ self
  5976     ].
  5977 
  5978     self warn:'CheckIn of Makefiles not yet implemented.'.
  5979     ^ self.
  5980 
  5981     "/ check it in ...
  5982 
  5983 
  5984 
  5985 !
  5986 
  5987 checkInMethods
  5988     "check in all extensions (patches)"
  5989 
  5990     |p  methods anyMethodMissing|
  5991 
  5992     p := self currentProject.
  5993     p isNil ifTrue:[
  5994 	self information:'No project selected'.
  5995 	^ self
  5996     ].
  5997 
  5998     self warn:'CheckIn of extensions not yet implemented.'.
  5999     ^ self.
  6000 
  6001     "/ check methods ...
  6002 
  6003     anyMethodMissing := false.
  6004     methods := p methods.
  6005     methods size > 0 ifTrue:[
  6006 	methods do:[:aMethod |
  6007 	    aMethod isMethod ifFalse:[
  6008 		Transcript showCR:('ProjectBrowser: cannot checkIn unloaded method: ' , aMethod className , ' ' , aMethod methodName).
  6009 		anyMethodMissing := true.
  6010 	    ]
  6011 	].
  6012 	anyMethodMissing ifTrue:[
  6013 	    Transcript showCR:'ProjectBrowser: cannot save method patches & extensions due to missing method(s)'.
  6014 	] ifFalse:[
  6015 	    Transcript showCR:('ProjectBrowser: checking in patches & extensions').
  6016 	    self checkInMethods:methods
  6017 	].
  6018     ].
  6019 
  6020 !
  6021 
  6022 checkInProject
  6023     "check in all classes and extensions"
  6024 
  6025     |p|
  6026 
  6027     p := self currentProject.
  6028     p isNil ifTrue:[
  6029 	self information:'No project selected'.
  6030 	^ self
  6031     ].
  6032 
  6033     "/ check in classes ...
  6034     self checkInAllClasses.
  6035 
  6036     "/ check methods ...
  6037     self checkInMethods.
  6038 
  6039     "/ build & check in makefiles
  6040 "/    self buildMakefiles.
  6041     self checkInMakefiles.
  6042 
  6043     "/ check in the project file itself
  6044     self checkInProjectFile.
  6045 
  6046 !
  6047 
  6048 checkInProjectFile
  6049     "check in the prj-file"
  6050 
  6051     |p|
  6052 
  6053     p := self currentProject.
  6054     p isNil ifTrue:[
  6055 	self information:'No project selected'.
  6056 	^ self
  6057     ].
  6058 
  6059     self warn:'CheckIn of ProjectFile not yet implemented.'.
  6060     ^ self.
  6061 
  6062     "/ check it in ...
  6063 
  6064 
  6065 
  6066 !
  6067 
  6068 inspectCurrentProject
  6069     "inspect the current project"
  6070 
  6071     self hasProjectSelected ifTrue:[
  6072 	self currentProject inspect.
  6073     ]
  6074 !
  6075 
  6076 loadClassesFromDirectory
  6077     "load all classes as contained in the project into the system"
  6078 
  6079     self withReadCursorDo:[
  6080 	self currentProject loadClassesFromProjectDirectory.
  6081     ].
  6082 
  6083 !
  6084 
  6085 loadClassesFromRepository
  6086     "load all classes as contained in the project from the source code
  6087      repository into the system"
  6088 
  6089     self warn:'not yet implemented - please load from directory'
  6090 
  6091 !
  6092 
  6093 makeCurrentProject
  6094     "make the selected Project the current project"
  6095 
  6096     |project|
  6097 
  6098     self hasProjectSelected ifTrue:[
  6099 	project := self currentProject.
  6100 
  6101 	Project current:project.
  6102 	self showWhat value == #current ifTrue:[
  6103 	    self updateProjectTree
  6104 	]
  6105     ]
  6106 !
  6107 
  6108 moveMethodToProject
  6109     |p mthd newPackage|
  6110 
  6111     p := self currentProject.
  6112 
  6113     mthd := self selectedMethod.
  6114     mthd notNil ifTrue:[
  6115 	newPackage := Dialog request:'Move to project:' initialAnswer:lastMoveToProject.
  6116 	newPackage size > 0 ifTrue:[
  6117 	    lastMoveToProject := newPackage.
  6118 	    newPackage ~= p package ifTrue:[
  6119 		mthd package:newPackage asSymbol.
  6120 		p removeMethod:mthd.
  6121 		self updatePatchesListForProject:p.
  6122 		self projectTree remove:self selectedTreeNode.
  6123 	    ]
  6124 	]
  6125     ].
  6126 !
  6127 
  6128 newProject
  6129     self newProject:Project new.
  6130 
  6131 !
  6132 
  6133 newProject:newProject
  6134     |newNode|
  6135 
  6136     newNode := self nodeFor:newProject.
  6137     self addProjectNodeToTree:newNode.
  6138     self projectTreeHolder root:projectTree.
  6139 "/    self projectTreeHolder selectNode:newNode.
  6140 "/    self projectTreeHolder expand:newNode.
  6141 
  6142     self readAspectsFromProject.
  6143     newProject wasLoadedFromFile ifFalse:[
  6144 	 self updateListOfRequiredPrerequisiteClasses.
  6145     ]
  6146 !
  6147 
  6148 newSubProject
  6149     |projectNode subProjectsNode newNode parentProject newProject|
  6150 
  6151     projectNode := self currentProjectNode.
  6152 
  6153     projectNode notNil ifTrue:[
  6154 	parentProject := projectNode contents.
  6155 	subProjectsNode := projectNode children detect:[:child | child contents == #subprojects].
  6156 self halt.
  6157 	parentProject notNil ifTrue:[
  6158 	    newProject := Project new.
  6159 	    newNode := self nodeFor:newProject.
  6160 
  6161 	    parentProject addSubProject:newProject.
  6162 	    subProjectsNode add:newNode.
  6163 	    self projectTreeHolder root:projectTree.
  6164 	    self projectTreeHolder selectNode:newNode.
  6165 	]    
  6166     ]    
  6167 
  6168 !
  6169 
  6170 openDocumentation
  6171     self openHTMLDocument: 'tools/pbrowser/TOP.html'
  6172 
  6173 !
  6174 
  6175 openProject
  6176     |fn|
  6177 
  6178     fn := Dialog 
  6179 	requestFileName:'filename:' 
  6180 	default:nil
  6181 	ifFail:nil
  6182 	pattern:'*.prj'
  6183 	fromDirectory:(FileSelectionBox lastFileSelectionDirectory).
  6184 
  6185     fn notNil ifTrue:[
  6186 	self loadFromProjectFile:fn.
  6187     ]
  6188 !
  6189 
  6190 removeMethod
  6191     |p mthd|
  6192 
  6193     p := self currentProject.
  6194 
  6195     mthd := self selectedMethod.
  6196     mthd notNil ifTrue:[
  6197 	(self confirm:'Really remove the method (from both project and image) ?') ifTrue:[
  6198 	    p removeMethod:mthd.
  6199 	    mthd who methodClass removeSelector:mthd who methodSelector.
  6200 	    self updatePatchesListForProject:p.
  6201 	    self projectTree remove:self selectedTreeNode.
  6202 	]
  6203     ] ifFalse:[
  6204 	self information:'No such method in the image (yet)'.
  6205     ]
  6206 !
  6207 
  6208 removeMethodFromProject
  6209     |p mthd|
  6210 
  6211     p := self currentProject.
  6212 
  6213     mthd := self selectedMethod.
  6214     mthd notNil ifTrue:[
  6215 	(self confirm:'Really remove the method (from the project) ?') ifTrue:[
  6216 	    mthd package:#unknown.
  6217 	    p removeMethod:mthd.
  6218 	    self updatePatchesListForProject:p.
  6219 	    self projectTree remove:self selectedTreeNode.
  6220 	]
  6221     ].
  6222 !
  6223 
  6224 removeProject
  6225     |projectToRemove selectedNode subNode newNode parentNode parentProject newProject|
  6226 
  6227     self hasProjectNodeSelected ifTrue:[
  6228 	selectedNode := self selectedTreeNode.
  6229 	projectToRemove := selectedNode contents.
  6230 
  6231 	(self confirm:'Really remove the project ?') ifTrue:[
  6232 	    self withExecuteCursorDo:[
  6233 		self projectTreeHolder removeSelection.
  6234 		projectToRemove removeFromSystem.
  6235 	    ]
  6236 	]
  6237     ]
  6238 !
  6239 
  6240 renameProject
  6241     |nm projectNode selectedProject|
  6242 
  6243     projectNode := self currentProjectNode.
  6244     projectNode notNil ifTrue:[
  6245 	selectedProject := projectNode contents.
  6246 
  6247 	nm := Dialog 
  6248 		request:'Rename to:'
  6249 		initialAnswer:selectedProject name.
  6250 
  6251 	nm size > 0 ifTrue:[
  6252 	    selectedProject name:nm.
  6253 "/            selectedNode name:nm.
  6254 "/            selectedNode changed.
  6255 	]
  6256     ]
  6257 !
  6258 
  6259 saveProjectFile
  6260     "save the project file in the project directory"
  6261 
  6262     |d p|
  6263 
  6264     self modifiedChannel value ifTrue:[
  6265 	(self confirm:'Changes not confirmed; save anyway ?') ifFalse:[^ self]
  6266     ].
  6267 
  6268     p := self currentProject.
  6269     p isNil ifTrue:[
  6270 	self information:'Select a project first.'.
  6271 	^self
  6272     ].
  6273     p directory isNil ifTrue:[
  6274 	d := (Dialog request:'Project Directory:').
  6275 	d size == 0 ifTrue:[
  6276 	    ^ self
  6277 	].
  6278 	p directory:d
  6279     ].
  6280 
  6281     self withCursor:Cursor write do:[
  6282 	p saveAsProjectFile.
  6283     ]
  6284 
  6285     "Modified: / 26.4.1999 / 22:43:57 / cg"
  6286 !
  6287 
  6288 validateAgainstClassesInImage
  6289     "validate classes in project against classes found in the image"
  6290 
  6291     |project classesInProjectOnly classesInImageOnly bindings|
  6292 
  6293     project := self currentProject.
  6294     classesInImageOnly := IdentitySet new.
  6295     classesInProjectOnly := IdentitySet new.
  6296 
  6297     Smalltalk allClassesDo:[:aClass |
  6298 	aClass isMeta ifFalse:[
  6299 	    (aClass isNameSpace not or:[aClass == Smalltalk]) ifTrue:[
  6300 		aClass package = project package ifTrue:[
  6301 		    (project classInfoFor:aClass) isNil ifTrue:[
  6302 			classesInImageOnly add:aClass name.
  6303 		    ]
  6304 		 ]
  6305 	     ]
  6306 	]
  6307     ].
  6308     project classInfo do:[:clsInfo |
  6309 	|clsName cls|
  6310 
  6311 	clsName := clsInfo className.
  6312 	cls := Smalltalk at:clsName asSymbol.
  6313 	(cls isBehavior not) ifTrue:[
  6314 	    classesInProjectOnly add:clsName
  6315 	].
  6316     ].
  6317 
  6318     (classesInImageOnly isEmpty and:[classesInProjectOnly isEmpty]) ifTrue:[
  6319 	self information:'Set of classes in project and image are equal.'.
  6320 	^ self.
  6321     ].
  6322 
  6323     classesInImageOnly := classesInImageOnly asOrderedCollection sort.
  6324     classesInProjectOnly := classesInProjectOnly asOrderedCollection sort.
  6325 
  6326     bindings := IdentityDictionary new.
  6327     bindings at:#classesInImageOnly put:classesInImageOnly.
  6328     bindings at:#classesInProjectOnly put:classesInProjectOnly.
  6329 
  6330     SimpleDialog
  6331 	openDialogInterfaceSpec:(self class classValidationDialogSpec)
  6332 	withBindings:bindings
  6333 
  6334     "Modified: / 26.9.1999 / 16:03:50 / cg"
  6335 !
  6336 
  6337 validateAgainstMethodsInImage
  6338     "validate methods in project against methods found in the image"
  6339 
  6340     |project package methodsInProjectOnly methodsInImageOnly bindings who|
  6341 
  6342     project := self currentProject.
  6343     package := project package.
  6344 
  6345     methodsInImageOnly := IdentitySet new.
  6346     methodsInProjectOnly := IdentitySet new.
  6347 
  6348     Method allSubInstancesDo:[:aMethod |
  6349 	aMethod package = package ifTrue:[
  6350 	    who := aMethod who.
  6351 	    who notNil ifTrue:[
  6352 		(project classInfoFor:who methodClass) isNil ifTrue:[
  6353 		    "/ is it in the projects methodList ?
  6354 		    (project includesMethod:aMethod) ifFalse:[
  6355 			methodsInImageOnly add:(who methodClass name , ' ' , who methodSelector).
  6356 		    ]
  6357 		]
  6358 	    ]
  6359 	 ]
  6360     ].
  6361 
  6362     project methodInfo do:[:mthdInfo |
  6363 	|clsName sel cls m|
  6364 
  6365 	clsName := mthdInfo className.
  6366 	sel := mthdInfo methodName.
  6367 	cls := Smalltalk at:clsName asSymbol.
  6368 	(project includesClass:clsName) ifFalse:[
  6369 	    (cls isBehavior not 
  6370 	    or:[(m := cls compiledMethodAt:sel) isNil
  6371 	    or:[m package ~= package]]) ifTrue:[
  6372 		methodsInProjectOnly add:(clsName , ' ' , sel)
  6373 	    ].
  6374 	].
  6375     ].
  6376 
  6377     (methodsInImageOnly isEmpty and:[methodsInProjectOnly isEmpty]) ifTrue:[
  6378 	self information:'Set of methods in project and image are equal.'.
  6379 	^ self.
  6380     ].
  6381 
  6382     methodsInImageOnly := methodsInImageOnly asOrderedCollection sort:[:a :b | a printString < b printString].
  6383     methodsInProjectOnly := methodsInProjectOnly asOrderedCollection sort:[:a :b | a printString < b printString].
  6384 
  6385     bindings := IdentityDictionary new.
  6386     bindings at:#methodsInImageOnly put:methodsInImageOnly.
  6387     bindings at:#methodsInProjectOnly put:methodsInProjectOnly.
  6388 
  6389     SimpleDialog
  6390 	openDialogInterfaceSpec:(self class methodValidationDialogSpec)
  6391 	withBindings:bindings
  6392 
  6393     "Modified: / 26.9.1999 / 16:03:50 / cg"
  6394 ! !
  6395 
  6396 !ProjectBrowser::ProjectTreeItem methodsFor:'accessing'!
  6397 
  6398 action
  6399     "return the value of the instance variable 'action' (automatically generated)"
  6400 
  6401     ^ action
  6402 !
  6403 
  6404 action:something
  6405     "set the value of the instance variable 'action' (automatically generated)"
  6406 
  6407     action := something.
  6408 !
  6409 
  6410 info
  6411     "return the value of the instance variable 'info' (automatically generated)"
  6412 
  6413     ^ info
  6414 !
  6415 
  6416 info:something
  6417     "set the value of the instance variable 'info' (automatically generated)"
  6418 
  6419     info := something.
  6420 !
  6421 
  6422 spec
  6423     "return the value of the instance variable 'spec' (automatically generated)"
  6424 
  6425     ^ spec
  6426 !
  6427 
  6428 spec:something
  6429     "set the value of the instance variable 'spec' (automatically generated)"
  6430 
  6431     spec := something.
  6432 ! !
  6433 
  6434 !ProjectBrowser::ProjectTreeItem methodsFor:'queries'!
  6435 
  6436 isProjectNode
  6437     ^ false
  6438 ! !
  6439 
  6440 !ProjectBrowser::ProjectNode methodsFor:'queries'!
  6441 
  6442 isProjectNode
  6443     ^ true
  6444 
  6445 
  6446 ! !
  6447 
  6448 !ProjectBrowser class methodsFor:'documentation'!
  6449 
  6450 version
  6451     ^ '$Header$'
  6452 !
  6453 
  6454 version_CVS
  6455     ^ '$Header$'
  6456 ! !
  6457 
  6458 
  6459 ProjectBrowser initialize!