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