ChangesBrowser.st
changeset 18059 819f12f70f46
parent 18054 3bb54349d57e
child 18061 f82108ac94a1
equal deleted inserted replaced
18058:019abbda4196 18059:819f12f70f46
    47 	privateIn:ChangesBrowser
    47 	privateIn:ChangesBrowser
    48 !
    48 !
    49 
    49 
    50 Object subclass:#ChangeInfo
    50 Object subclass:#ChangeInfo
    51 	instanceVariableNames:'position chunk className selector headerLine timestamp
    51 	instanceVariableNames:'position chunk className selector headerLine timestamp
    52 		isFollowupChange'
    52 		isFollowupChange categoryIfCategoryChange'
    53 	classVariableNames:''
    53 	classVariableNames:''
    54 	poolDictionaries:''
    54 	poolDictionaries:''
    55 	privateIn:ChangesBrowser
    55 	privateIn:ChangesBrowser
    56 !
    56 !
    57 
    57 
    79 
    79 
    80     written jan 90 by claus
    80     written jan 90 by claus
    81 
    81 
    82     This is a very old leftover class (it was one of the very first apps in ST/X
    82     This is a very old leftover class (it was one of the very first apps in ST/X
    83     and the Merovingian has not yet detected this one ;-)
    83     and the Merovingian has not yet detected this one ;-)
    84     It will be completely replaced by the ChangeSetBrowser class in the near future.
    84 
       
    85     At the time this was originally written, I had a 2Mb machine, and every memory byte was a very valuable.
       
    86     Therefore, the original did not keep any infos in memory, but instead kept a list of change-chunk file offsets,
       
    87     and parsed the chunks over and over (eg. when searching for classname/selector etc.)
       
    88     Later, when bigger memories became available, more and more infos where cached in additional arrays (classname,
       
    89     selector, etc.) and those where finally condensed into a single changeInfo object.
       
    90     However, now that really enough memory is avail, this is really no longer useful, and we should keep
       
    91     changeSet entries instead (which hold the same info plus more).
       
    92     The ChangeSetBrowser does exactly this, but does not support all of the fancy compress/delete etc.
       
    93     operations of the ChangesBrowser, to which we got used so much.
       
    94     Thus, this one kept on living its zombie life and gets occasional features added (sigh)...
       
    95     (Well, like many workhorses, they become ugly when aged, but still do their duty)
       
    96 
       
    97     It MUST eventually be completely replaced by the ChangeSetBrowser class in the near future.
    85 
    98 
    86 
    99 
    87     [Class variables:]
   100     [Class variables:]
    88         CompressSnapshotInfo            if true (the default), snapshot entries
   101         CompressSnapshotInfo            if true (the default), snapshot entries
    89                                         are also compressed in the compress function.
   102                                         are also compressed in the compress function.
   494             isVisible: notEditingClassSource
   507             isVisible: notEditingClassSource
   495           )
   508           )
   496          (MenuItem
   509          (MenuItem
   497             label: 'Compare and Compress'
   510             label: 'Compare and Compress'
   498             itemValue: doCompareAndCompress
   511             itemValue: doCompareAndCompress
       
   512             isVisible: notEditingClassSource
       
   513           )
       
   514          (MenuItem
       
   515             label: '-'
       
   516             isVisible: notEditingClassSource
       
   517           )
       
   518          (MenuItem
       
   519             label: 'Cleanup'
       
   520             itemValue: doCleanup
   499             isVisible: notEditingClassSource
   521             isVisible: notEditingClassSource
   500           )
   522           )
   501          (MenuItem
   523          (MenuItem
   502             label: '-'
   524             label: '-'
   503             isVisible: notEditingClassSource
   525             isVisible: notEditingClassSource
  1714 !
  1736 !
  1715 
  1737 
  1716 postRealize
  1738 postRealize
  1717     self setupTabSpec.
  1739     self setupTabSpec.
  1718     self readChangesFileInBackground:true.
  1740     self readChangesFileInBackground:true.
  1719     self setChangeList.
  1741     self updateChangeList.
  1720     changeListView action:[:lineNrOrCollection | self changeSelection:lineNrOrCollection].
  1742     changeListView action:[:lineNrOrCollection | self changeSelection:lineNrOrCollection].
  1721     Processor addTimedBlock:checkBlock afterSeconds:5.
  1743     Processor addTimedBlock:checkBlock afterSeconds:5.
  1722 
  1744 
  1723     "Created: 24.7.1997 / 18:06:12 / cg"
  1745     "Created: 24.7.1997 / 18:06:12 / cg"
  1724 !
  1746 !
  1951          ask the user if all operations should be aborted..."
  1973          ask the user if all operations should be aborted..."
  1952         multipleApply := (lastNr - changeNr) > 1.
  1974         multipleApply := (lastNr - changeNr) > 1.
  1953 
  1975 
  1954         changeNr to:lastNr do:[:changeNr |
  1976         changeNr to:lastNr do:[:changeNr |
  1955             | cls sel |
  1977             | cls sel |
       
  1978 
  1956             changeListView setSelection:changeNr.
  1979             changeListView setSelection:changeNr.
  1957 
  1980 
  1958             ((cls := self classOfChange:changeNr ifAbsent:[:className| nil]) notNil
  1981             ((cls := self classOfChange:changeNr ifAbsent:[:className| nil]) notNil
  1959             and:[(sel := self selectorOfMethodChange:changeNr) notNil])
  1982             and:[(sel := self selectorOfMethodChange:changeNr) notNil])
  1960             ifTrue:[
  1983             ifTrue:[
  2074         checkinInfo := SourceCodeManagerUtilities default
  2097         checkinInfo := SourceCodeManagerUtilities default
  2075                         getCheckinInfoFor:logTitle
  2098                         getCheckinInfoFor:logTitle
  2076                         initialAnswer:nil.
  2099                         initialAnswer:nil.
  2077         checkinInfo isNil ifTrue:[^ self ].
  2100         checkinInfo isNil ifTrue:[^ self ].
  2078 
  2101 
  2079         changeListView setSelection:nil.
  2102         self unselect.
  2080         classes do:[:eachClass |
  2103         classes do:[:eachClass |
  2081             (SourceCodeManagerUtilities default checkinClass:eachClass withInfo:checkinInfo)
  2104             (SourceCodeManagerUtilities default checkinClass:eachClass withInfo:checkinInfo)
  2082                 ifTrue:[
  2105                 ifTrue:[
  2083                     self silentDeleteChangesForClassAndPrivateClasses:eachClass name
  2106                     self silentDeleteChangesForClassAndPrivateClasses:eachClass name
  2084                            from:1 to:(self numberOfChanges).
  2107                            from:1 to:(self numberOfChanges).
  2085                 ]
  2108                 ]
  2086         ].
  2109         ].
  2087         self setChangeList.
  2110         self updateChangeList.
  2088     ]
  2111     ]
  2089 
  2112 
  2090     "Modified: / 6.9.1995 / 17:11:16 / claus"
  2113     "Modified: / 6.9.1995 / 17:11:16 / claus"
  2091     "Modified: / 17.11.2001 / 14:21:13 / cg"
  2114     "Modified: / 17.11.2001 / 14:21:13 / cg"
       
  2115 !
       
  2116 
       
  2117 doCleanup
       
  2118     "cleanup the changefile/changeset.
       
  2119      actions done:
       
  2120      - from the end, find changes which are equal to the current version
       
  2121        and not in the current changeset (i.e. represent the current version as built).
       
  2122        Then delete it incl. previous versions of it."
       
  2123 
       
  2124     |numChanges nextChangeNr changeNr changeSelector changeClass numDeleted|
       
  2125 
       
  2126     numChanges := self numberOfChanges.
       
  2127     self unselect.
       
  2128 
       
  2129     self withWaitCursorDo:[
       
  2130         "/ find the last method change which is equal
       
  2131         changeNr := numChanges.
       
  2132         [changeNr > 0] whileTrue:[
       
  2133             nextChangeNr := changeNr - 1.
       
  2134 
       
  2135             (changeClass := self classOfChange:changeNr ifAbsent:nil) notNil ifTrue:[
       
  2136 
       
  2137                 (changeInfoList at:changeNr) isMethodCategoryChange ifTrue:[
       
  2138                     (self compareChange:changeNr showResult:false) == true ifTrue:[ 
       
  2139                         (changeSelector := self selectorOfMethodCategoryChange:changeNr) notNil ifTrue:[
       
  2140                             (ChangeSet current includesChangeForClass:changeClass selector:changeSelector) ifFalse:[
       
  2141                                 infoHolder value:('Deleting category changes for %1 >> %2' bindWith:changeClass name with:changeSelector).
       
  2142                                 self windowGroup repairDamage.
       
  2143                                 numDeleted := self
       
  2144                                    silentDeleteMethodCategoryChangesFor:changeClass name selector:changeSelector
       
  2145                                    from:1 to:changeNr.
       
  2146                                 "/ self selectChange:changeNr.
       
  2147                                 "/ self doDeleteClassSelectorOlder.
       
  2148                                 nextChangeNr := (changeNr - numDeleted + 1) min:self numberOfChanges.
       
  2149                             ].
       
  2150                         ].
       
  2151                     ].
       
  2152                 ] ifFalse:[
       
  2153                     (changeSelector := self selectorOfMethodChange:changeNr) notNil ifTrue:[
       
  2154                         (self compareChange:changeNr showResult:false) == true ifTrue:[ 
       
  2155                             "/ found a method change, which is the same as the current version
       
  2156                             "/ if in the current changeSet, then do not delete (needs checkin first)
       
  2157                             (ChangeSet current includesChangeForClass:changeClass selector:changeSelector) ifFalse:[
       
  2158                                 infoHolder value:('Deleting changes for %1 >> %2' bindWith:changeClass name with:changeSelector).
       
  2159                                 self windowGroup repairDamage.
       
  2160                                 numDeleted := self
       
  2161                                    silentDeleteChangesFor:changeClass name selector:changeSelector
       
  2162                                    from:1 to:changeNr.
       
  2163                                 "/ self selectChange:changeNr.
       
  2164                                 "/ self doDeleteClassSelectorOlder.
       
  2165                                 nextChangeNr := (changeNr - numDeleted + 1) min:self numberOfChanges.
       
  2166                             ].
       
  2167                         ].
       
  2168                     ].
       
  2169                 ].
       
  2170             ].
       
  2171             changeNr := nextChangeNr.
       
  2172         ].
       
  2173     ].
       
  2174     self updateChangeList.
  2092 !
  2175 !
  2093 
  2176 
  2094 doCompare
  2177 doCompare
  2095     "compare change with current system version"
  2178     "compare change with current system version"
  2096 
  2179 
  2122     ].
  2205     ].
  2123 
  2206 
  2124     toDelete reverseDo:[:changeNr |
  2207     toDelete reverseDo:[:changeNr |
  2125         self silentDeleteChange:changeNr.
  2208         self silentDeleteChange:changeNr.
  2126     ].
  2209     ].
  2127     self setChangeList.
  2210     self updateChangeList.
  2128     "
  2211     "
  2129      scroll back a bit, if we are left way behind the list
  2212      scroll back a bit, if we are left way behind the list
  2130     "
  2213     "
  2131     changeListView firstLineShown > self numberOfChanges ifTrue:[
  2214     changeListView firstLineShown > self numberOfChanges ifTrue:[
  2132         changeListView makeLineVisible:self numberOfChanges
  2215         changeListView makeLineVisible:self numberOfChanges
  2260         lastChangeNr := lastChangeNr max:changeNr.
  2343         lastChangeNr := lastChangeNr max:changeNr.
  2261     ].
  2344     ].
  2262     namespacesToDelete isEmpty ifTrue:[^ self].
  2345     namespacesToDelete isEmpty ifTrue:[^ self].
  2263 
  2346 
  2264     overAllNumDeletedBefore := 0.
  2347     overAllNumDeletedBefore := 0.
  2265     changeListView setSelection:nil.
  2348     self unselect.
  2266 
  2349 
  2267     self withExecuteCursorDo:[
  2350     self withExecuteCursorDo:[
  2268         namespacesToDelete do:[:namespaceToDelete |
  2351         namespacesToDelete do:[:namespaceToDelete |
  2269             |numDeletedBefore|
  2352             |numDeletedBefore|
  2270 
  2353 
  2279             lastChangeNr := lastChangeNr - numDeletedBefore.
  2362             lastChangeNr := lastChangeNr - numDeletedBefore.
  2280             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2363             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2281         ].
  2364         ].
  2282     ].
  2365     ].
  2283 
  2366 
  2284     self setChangeList.
  2367     self updateChangeList.
  2285     self autoSelectOrEnd:lastChangeNr.
  2368     self autoSelectOrEnd:lastChangeNr.
  2286 !
  2369 !
  2287 
  2370 
  2288 doDeleteAndSelectPrevious
  2371 doDeleteAndSelectPrevious
  2289     "delete currently selected change(s)"
  2372     "delete currently selected change(s)"
  2315         ].
  2398         ].
  2316         lastChangeNr := lastChangeNr max:changeNr.
  2399         lastChangeNr := lastChangeNr max:changeNr.
  2317     ].
  2400     ].
  2318 
  2401 
  2319     overAllNumDeletedBefore := 0.
  2402     overAllNumDeletedBefore := 0.
  2320     changeListView setSelection:nil.
  2403     self unselect.
  2321 
  2404 
  2322     self withExecuteCursorDo:[
  2405     self withExecuteCursorDo:[
  2323         classNamesToDelete do:[:classNameToDelete |
  2406         classNamesToDelete do:[:classNameToDelete |
  2324             |numDeletedBefore|
  2407             |numDeletedBefore|
  2325 
  2408 
  2333             lastChangeNr := lastChangeNr - numDeletedBefore.
  2416             lastChangeNr := lastChangeNr - numDeletedBefore.
  2334             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2417             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2335         ].
  2418         ].
  2336     ].
  2419     ].
  2337 
  2420 
  2338     self setChangeList.
  2421     self updateChangeList.
  2339     self autoSelectOrEnd:lastChangeNr.
  2422     self autoSelectOrEnd:lastChangeNr.
  2340 
  2423 
  2341     "Created: / 13.12.1995 / 16:07:14 / cg"
  2424     "Created: / 13.12.1995 / 16:07:14 / cg"
  2342     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2425     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2343 !
  2426 !
  2359         ].
  2442         ].
  2360         lastChangeNr := lastChangeNr max:changeNr.
  2443         lastChangeNr := lastChangeNr max:changeNr.
  2361     ].
  2444     ].
  2362 
  2445 
  2363     overAllNumDeletedBefore := 0.
  2446     overAllNumDeletedBefore := 0.
  2364     changeListView setSelection:nil.
  2447     self unselect.
  2365 
  2448 
  2366     self withExecuteCursorDo:[
  2449     self withExecuteCursorDo:[
  2367         classNamesToDelete do:[:classNameToDelete |
  2450         classNamesToDelete do:[:classNameToDelete |
  2368             | changeNr numDeletedBefore|
  2451             | changeNr numDeletedBefore|
  2369 
  2452 
  2379                 lastChangeNr := lastChangeNr - numDeletedBefore.
  2462                 lastChangeNr := lastChangeNr - numDeletedBefore.
  2380                 overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2463                 overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2381             ]
  2464             ]
  2382         ]
  2465         ]
  2383     ].
  2466     ].
  2384     self setChangeList.
  2467     self updateChangeList.
  2385     self autoSelectOrEnd:lastChangeNr.
  2468     self autoSelectOrEnd:lastChangeNr.
  2386 
  2469 
  2387     "Created: / 13.12.1995 / 16:07:14 / cg"
  2470     "Created: / 13.12.1995 / 16:07:14 / cg"
  2388     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2471     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2389 !
  2472 !
  2392     "delete changes with same class as currently selected change from the beginning
  2475     "delete changes with same class as currently selected change from the beginning
  2393      up to the selected change.
  2476      up to the selected change.
  2394      Useful to get rid of obsolete changes before a fileout or checkin entry."
  2477      Useful to get rid of obsolete changes before a fileout or checkin entry."
  2395 
  2478 
  2396     self withSingleSelectedChangeDo:[:changeNr |
  2479     self withSingleSelectedChangeDo:[:changeNr |
  2397 	|classNameToDelete prevSelection numDeleted|
  2480         |classNameToDelete prevSelection numDeleted|
  2398 
  2481 
  2399 	classNameToDelete := self classNameOfChange:changeNr.
  2482         classNameToDelete := self classNameOfChange:changeNr.
  2400 	classNameToDelete notNil ifTrue:[
  2483         classNameToDelete notNil ifTrue:[
  2401 	    prevSelection := changeNr.
  2484             prevSelection := changeNr.
  2402 	    changeListView setSelection:nil.
  2485             self unselect.
  2403 	    numDeleted := self
  2486             numDeleted := self
  2404 				silentDeleteChangesFor:classNameToDelete
  2487                                 silentDeleteChangesFor:classNameToDelete
  2405 				from:1
  2488                                 from:1
  2406 				to:changeNr.
  2489                                 to:changeNr.
  2407 	    self setChangeList.
  2490             self updateChangeList.
  2408 	    self autoSelectOrEnd:(changeNr + 1 - numDeleted)
  2491             self autoSelectOrEnd:(changeNr + 1 - numDeleted)
  2409 	]
  2492         ]
  2410     ].
  2493     ].
  2411 
  2494 
  2412     "Created: 13.12.1995 / 15:41:58 / cg"
  2495     "Created: 13.12.1995 / 15:41:58 / cg"
  2413     "Modified: 25.5.1996 / 12:26:34 / cg"
  2496     "Modified: 25.5.1996 / 12:26:34 / cg"
  2414 !
  2497 !
  2415 
  2498 
  2416 doDeleteClassRest
  2499 doDeleteClassRest
  2417     "delete rest of changes with same class as currently selected change"
  2500     "delete rest of changes with same class as currently selected change"
  2418 
  2501 
  2419     self withSingleSelectedChangeDo:[:changeNr |
  2502     self withSingleSelectedChangeDo:[:changeNr |
  2420 	| classNameToDelete |
  2503         | classNameToDelete |
  2421 
  2504 
  2422 	classNameToDelete := self classNameOfChange:changeNr.
  2505         classNameToDelete := self classNameOfChange:changeNr.
  2423 	classNameToDelete notNil ifTrue:[
  2506         classNameToDelete notNil ifTrue:[
  2424 	    changeListView setSelection:nil.
  2507             self unselect.
  2425 	    self silentDeleteChangesFor:classNameToDelete
  2508             self silentDeleteChangesFor:classNameToDelete
  2426 				   from:changeNr
  2509                                    from:changeNr
  2427 				     to:(self numberOfChanges).
  2510                                      to:(self numberOfChanges).
  2428 	    self setChangeList.
  2511             self updateChangeList.
  2429 	    self autoSelectOrEnd:changeNr
  2512             self autoSelectOrEnd:changeNr
  2430 	]
  2513         ]
  2431     ]
  2514     ]
  2432 
  2515 
  2433     "Modified: / 18.5.1998 / 14:25:07 / cg"
  2516     "Modified: / 18.5.1998 / 14:25:07 / cg"
  2434 !
  2517 !
  2435 
  2518 
  2452         ].
  2535         ].
  2453         lastChangeNr := lastChangeNr max:changeNr.
  2536         lastChangeNr := lastChangeNr max:changeNr.
  2454     ].
  2537     ].
  2455 
  2538 
  2456     overAllNumDeletedBefore := 0.
  2539     overAllNumDeletedBefore := 0.
  2457     changeListView setSelection:nil.
  2540     self unselect.
  2458 
  2541 
  2459     self withExecuteCursorDo:[
  2542     self withExecuteCursorDo:[
  2460         classNameSelectorPairsToDelete do:[:pair |
  2543         classNameSelectorPairsToDelete do:[:pair |
  2461             |numDeletedBefore className selector|
  2544             |numDeletedBefore className selector|
  2462 
  2545 
  2472             lastChangeNr := lastChangeNr - numDeletedBefore.
  2555             lastChangeNr := lastChangeNr - numDeletedBefore.
  2473             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2556             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2474         ].
  2557         ].
  2475     ].
  2558     ].
  2476 
  2559 
  2477     self setChangeList.
  2560     self updateChangeList.
  2478     self autoSelectOrEnd:lastChangeNr
  2561     self autoSelectOrEnd:lastChangeNr
  2479 
  2562 
  2480     "Created: / 13.12.1995 / 16:07:14 / cg"
  2563     "Created: / 13.12.1995 / 16:07:14 / cg"
  2481     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2564     "Modified: / 28.1.1998 / 20:42:14 / cg"
  2482 !
  2565 !
  2483 
  2566 
  2484 doDeleteClassSelectorOlder
  2567 doDeleteClassSelectorOlder
  2485     "delete older changes with same class and selector as currently selected change(s)"
  2568     "delete this and older changes with same class and selector as currently selected change(s)"
  2486 
  2569 
  2487     |classNameSelectorPairsToDelete upToPerClassAndSelector lastChangeNr overAllNumDeletedBefore|
  2570     |classNameSelectorPairsToDelete upToPerClassAndSelector lastChangeNr overAllNumDeletedBefore|
  2488 
  2571 
  2489     lastChangeNr := -1.
  2572     lastChangeNr := -1.
  2490     classNameSelectorPairsToDelete := Set new.
  2573     classNameSelectorPairsToDelete := Set new.
  2504         ].
  2587         ].
  2505         lastChangeNr := lastChangeNr max:changeNr.
  2588         lastChangeNr := lastChangeNr max:changeNr.
  2506     ].
  2589     ].
  2507         
  2590         
  2508     overAllNumDeletedBefore := 0.
  2591     overAllNumDeletedBefore := 0.
  2509     changeListView setSelection:nil.
  2592     self unselect.
  2510 
  2593 
  2511     self withExecuteCursorDo:[
  2594     self withExecuteCursorDo:[
  2512         classNameSelectorPairsToDelete do:[:pair |
  2595         classNameSelectorPairsToDelete do:[:pair |
  2513             |numDeletedBefore className selector lastToDelete|
  2596             |numDeletedBefore className selector lastToDelete|
  2514 
  2597 
  2523             lastChangeNr := lastChangeNr - numDeletedBefore.
  2606             lastChangeNr := lastChangeNr - numDeletedBefore.
  2524             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2607             overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
  2525         ].
  2608         ].
  2526     ].
  2609     ].
  2527 
  2610 
  2528     self setChangeList.
  2611     self updateChangeList.
  2529     self autoSelectOrEnd:lastChangeNr
  2612     self autoSelectOrEnd:lastChangeNr
  2530 
  2613 
  2531     "Modified: / 25-07-2017 / 10:57:31 / cg"
  2614     "Modified: / 25-07-2017 / 10:57:31 / cg"
  2532 !
  2615 !
  2533 
  2616 
  2710     "reread the changes-file"
  2793     "reread the changes-file"
  2711 
  2794 
  2712     self readChangesFileInBackground:true.
  2795     self readChangesFileInBackground:true.
  2713     self newLabel:''.
  2796     self newLabel:''.
  2714     realized ifTrue:[
  2797     realized ifTrue:[
  2715 	self setChangeList.
  2798         self updateChangeList.
  2716     ]
  2799     ]
  2717 !
  2800 !
  2718 
  2801 
  2719 doWriteBack
  2802 doWriteBack
  2720     "write back the list onto the changes file"
  2803     "write back the list onto the changes file"
  2722     anyChanges ifTrue:[
  2805     anyChanges ifTrue:[
  2723         (self writeBackChanges) ifTrue:[
  2806         (self writeBackChanges) ifTrue:[
  2724             realized ifTrue:[
  2807             realized ifTrue:[
  2725                 self readChangesFile.
  2808                 self readChangesFile.
  2726                 realized ifTrue:[
  2809                 realized ifTrue:[
  2727                     self setChangeList
  2810                     self updateChangeList
  2728                 ]
  2811                 ]
  2729             ]
  2812             ]
  2730         ]
  2813         ]
  2731     ]
  2814     ]
  2732 
  2815 
  2919 findNextForWhich:aBlock startingAt:changeNrToStartSearch
  3002 findNextForWhich:aBlock startingAt:changeNrToStartSearch
  2920     "helper: select the next change for which aBlock evaluates to true"
  3003     "helper: select the next change for which aBlock evaluates to true"
  2921 
  3004 
  2922     ^ self     
  3005     ^ self     
  2923         findNextOrPrevious:#next 
  3006         findNextOrPrevious:#next 
  2924         forWhich:aBlock startingAt:changeNrToStartSearch
  3007         forWhich:aBlock 
       
  3008         startingAt:changeNrToStartSearch
  2925 
  3009 
  2926     "Created: / 20-11-2006 / 16:34:06 / cg"
  3010     "Created: / 20-11-2006 / 16:34:06 / cg"
  2927 !
  3011 !
  2928 
  3012 
  2929 findNextOrPrevious:direction forWhich:aBlock startingAt:changeNrToStartSearch
  3013 findNextOrPrevious:direction forWhich:aBlock startingAt:changeNrToStartSearch
  2941             nr := changeNrToStartSearch.
  3025             nr := changeNrToStartSearch.
  2942             [ (direction == #previous and:[nr >= 1])
  3026             [ (direction == #previous and:[nr >= 1])
  2943               or:[ direction == #next and:[ nr <= lastNr]] 
  3027               or:[ direction == #next and:[ nr <= lastNr]] 
  2944             ] whileTrue:[
  3028             ] whileTrue:[
  2945                 (aBlock value:nr) ifTrue:[
  3029                 (aBlock value:nr) ifTrue:[
  2946                     changeListView setSelection:nr.
  3030                     self selectChange:nr.
  2947                     self changeSelection:nr.
       
  2948                     ^ nr
  3031                     ^ nr
  2949                 ].
  3032                 ].
  2950                 nr := nr + increment.
  3033                 nr := nr + increment.
  2951             ].
  3034             ].
  2952         ]
  3035         ]
  3118 findPreviousForWhich:aBlock startingAt:changeNrToStartSearch
  3201 findPreviousForWhich:aBlock startingAt:changeNrToStartSearch
  3119     "helper: select the previous change for which aBlock evaluates to true"
  3202     "helper: select the previous change for which aBlock evaluates to true"
  3120 
  3203 
  3121     ^ self     
  3204     ^ self     
  3122         findNextOrPrevious:#previous 
  3205         findNextOrPrevious:#previous 
  3123         forWhich:aBlock startingAt:changeNrToStartSearch
  3206         forWhich:aBlock 
       
  3207         startingAt:changeNrToStartSearch
  3124 
  3208 
  3125     "Created: / 06-10-2006 / 11:01:09 / cg"
  3209     "Created: / 06-10-2006 / 11:01:09 / cg"
  3126 !
  3210 !
  3127 
  3211 
  3128 findPreviousSnapshot
  3212 findPreviousSnapshot
  3330 
  3414 
  3331 autoSelect:changeNr
  3415 autoSelect:changeNr
  3332     "select a change"
  3416     "select a change"
  3333 
  3417 
  3334     self class autoSelectNext ifTrue:[
  3418     self class autoSelectNext ifTrue:[
  3335 	(changeNr <= self numberOfChanges) ifTrue:[
  3419         (changeNr <= self numberOfChanges) ifTrue:[
  3336 	    changeListView setSelection:changeNr.
  3420             self selectChange:changeNr.
  3337 	    self changeSelection:changeNr.
  3421             ^ self
  3338 	    ^ self
  3422         ]
  3339 	]
       
  3340     ].
  3423     ].
  3341     self clearCodeView.
  3424     self clearCodeView.
  3342     changeListView setSelection:nil.
  3425     self unselect.
  3343 
  3426 
  3344     "Modified: / 18.5.1998 / 14:26:43 / cg"
  3427     "Modified: / 18.5.1998 / 14:26:43 / cg"
  3345 !
  3428 !
  3346 
  3429 
  3347 autoSelectLast
  3430 autoSelectLast
  3355 
  3438 
  3356     |last|
  3439     |last|
  3357 
  3440 
  3358     last := self numberOfChanges.
  3441     last := self numberOfChanges.
  3359     changeNr < last ifTrue:[
  3442     changeNr < last ifTrue:[
  3360 	self autoSelect:changeNr
  3443         self autoSelect:changeNr
  3361     ] ifFalse:[
  3444     ] ifFalse:[
  3362 	last == 0 ifTrue:[
  3445         last == 0 ifTrue:[
  3363 	    last := nil
  3446             last := nil
  3364 	].
  3447         ].
  3365 	changeListView setSelection:last .
  3448         self selectChange:last.
  3366 	self changeSelection:last.
       
  3367     ]
  3449     ]
  3368 
  3450 
  3369     "Modified: / 13.11.2001 / 13:00:45 / cg"
  3451     "Modified: / 13.11.2001 / 13:00:45 / cg"
  3370 !
  3452 !
  3371 
  3453 
  3650     "Created: / 08-09-1995 / 19:32:04 / claus"
  3732     "Created: / 08-09-1995 / 19:32:04 / claus"
  3651     "Modified: / 12-11-2006 / 16:23:53 / cg"
  3733     "Modified: / 12-11-2006 / 16:23:53 / cg"
  3652 !
  3734 !
  3653 
  3735 
  3654 parseExpression:chunk
  3736 parseExpression:chunk
       
  3737     "parse an expression; return a parseTree"
       
  3738 
  3655     ^ self parseExpression:chunk inNameSpace:(self nameSpaceForApply).
  3739     ^ self parseExpression:chunk inNameSpace:(self nameSpaceForApply).
  3656 !
  3740 !
  3657 
  3741 
  3658 parseExpression:text inNameSpace:nameSpace
  3742 parseExpression:text inNameSpace:nameSpace
  3659     |parser p|
  3743     "parse an expression; return a parseTree"
       
  3744 
       
  3745     |parser parseTree|
  3660 
  3746 
  3661     "/ old:
  3747     "/ old:
  3662     "/ does not care for VW qualified names
  3748     "/ does not care for VW qualified names
  3663     "/ ^ Parser parseExpression:text inNameSpace:nameSpace.
  3749     "/ ^ Parser parseExpression:text inNameSpace:nameSpace.
  3664 
  3750 
  3666         self halt:'should no longer happen'
  3752         self halt:'should no longer happen'
  3667     ].
  3753     ].
  3668 
  3754 
  3669     "/ new:
  3755     "/ new:
  3670     parser := Parser for:(ReadStream on:text).
  3756     parser := Parser for:(ReadStream on:text).
  3671     parser parserFlags allowQualifiedNames:true.
  3757     parser parserFlags 
  3672     parser parserFlags allowDollarInIdentifier:true.
  3758         allowQualifiedNames:true;
  3673     parser parserFlags allowParagraphInIdentifier:true.
  3759         allowDollarInIdentifier:true;
       
  3760         allowParagraphInIdentifier:true.
       
  3761 
  3674     Error handle:[:ex |
  3762     Error handle:[:ex |
  3675         ^ nil
  3763         ^ nil
  3676     ] do:[
  3764     ] do:[
  3677         p := parser 
  3765         parseTree := parser 
  3678             parseExpressionWithSelf:nil 
  3766             parseExpressionWithSelf:nil 
  3679             notifying:nil 
  3767             notifying:nil 
  3680             ignoreErrors:true 
  3768             ignoreErrors:true 
  3681             ignoreWarnings:true 
  3769             ignoreWarnings:true 
  3682             inNameSpace:nameSpace.
  3770             inNameSpace:nameSpace.
  3683     ].
  3771     ].
  3684     ^ p
  3772     ^ parseTree
  3685 
  3773 
  3686     "Modified: / 21-11-2016 / 23:25:48 / cg"
  3774     "Modified: / 21-11-2016 / 23:25:48 / cg"
  3687 !
  3775 !
  3688 
  3776 
  3689 queryCloseText
  3777 queryCloseText
  3690     "made this a method for easy redefinition in subclasses"
  3778     "made this a method for easy redefinition in subclasses"
  3691 
  3779 
  3692     ^ 'Quit without updating changeFile ?'
  3780     ^ 'Quit without updating changeFile ?'
       
  3781 !
       
  3782 
       
  3783 selectChange:changeNr
       
  3784     changeListView setSelection:changeNr.
       
  3785     self changeSelection:changeNr.
  3693 !
  3786 !
  3694 
  3787 
  3695 selectedClassNames
  3788 selectedClassNames
  3696     |classes|
  3789     |classes|
  3697 
  3790 
  3708 
  3801 
  3709     "Created: / 19.11.2001 / 21:54:59 / cg"
  3802     "Created: / 19.11.2001 / 21:54:59 / cg"
  3710 !
  3803 !
  3711 
  3804 
  3712 setChangeList
  3805 setChangeList
       
  3806     <resource: #obsolete>
       
  3807     "update the selection-list;
       
  3808      called after the changeList has been modified"
       
  3809 
       
  3810     self updateChangeList
       
  3811 !
       
  3812 
       
  3813 setSingleSelection:changeNr
       
  3814     changeListView multipleSelectOk ifFalse:[
       
  3815 	changeListView setSelection:changeNr.
       
  3816     ] ifTrue:[
       
  3817 	changeListView setSelection:(Array with:changeNr).
       
  3818     ].
       
  3819 !
       
  3820 
       
  3821 showNumberOfChanges
       
  3822     infoHolder value:(resources string:'%1 changes.' with:changeInfoList size).
       
  3823 !
       
  3824 
       
  3825 sourceOfChange:changeNr
       
  3826     |aStream sawExcla chunk|
       
  3827 
       
  3828     aStream := self streamForChange:changeNr.
       
  3829     aStream isNil ifTrue:[
       
  3830 	^ nil
       
  3831     ].
       
  3832     sawExcla := aStream peekFor:(aStream class chunkSeparator).
       
  3833     chunk := aStream nextChunk.
       
  3834     sawExcla ifTrue:[
       
  3835 	chunk := aStream nextChunk
       
  3836     ].
       
  3837     aStream close.
       
  3838     ^ chunk
       
  3839 !
       
  3840 
       
  3841 timeStampPrintStringOf:ts
       
  3842     ^ ts printString
       
  3843 
       
  3844     "
       
  3845      self basicNew timeStampPrintStringOf:(Timestamp now)
       
  3846     "
       
  3847 
       
  3848     "Modified (format): / 05-12-2017 / 15:08:48 / cg"
       
  3849 !
       
  3850 
       
  3851 unselect
       
  3852     "common unselect"
       
  3853 
       
  3854     changeListView setSelection:nil.
       
  3855 
       
  3856     "Modified: 25.5.1996 / 13:02:49 / cg"
       
  3857 !
       
  3858 
       
  3859 updateChangeList
  3713     "update the selection-list;
  3860     "update the selection-list;
  3714      called after the changeList has been modified"
  3861      called after the changeList has been modified"
  3715 
  3862 
  3716     |headerList|
  3863     |headerList|
  3717 
  3864 
  3721     self showNumberOfChanges.
  3868     self showNumberOfChanges.
  3722     
  3869     
  3723     "/ changeListView deselect.
  3870     "/ changeListView deselect.
  3724 
  3871 
  3725     "Modified: / 01-05-2016 / 19:27:35 / cg"
  3872     "Modified: / 01-05-2016 / 19:27:35 / cg"
  3726 !
       
  3727 
       
  3728 setSingleSelection:changeNr
       
  3729     changeListView multipleSelectOk ifFalse:[
       
  3730 	changeListView setSelection:changeNr.
       
  3731     ] ifTrue:[
       
  3732 	changeListView setSelection:(Array with:changeNr).
       
  3733     ].
       
  3734 !
       
  3735 
       
  3736 showNumberOfChanges
       
  3737     infoHolder value:(resources string:'%1 changes.' with:changeInfoList size).
       
  3738 !
       
  3739 
       
  3740 sourceOfChange:changeNr
       
  3741     |aStream sawExcla chunk|
       
  3742 
       
  3743     aStream := self streamForChange:changeNr.
       
  3744     aStream isNil ifTrue:[
       
  3745 	^ nil
       
  3746     ].
       
  3747     sawExcla := aStream peekFor:(aStream class chunkSeparator).
       
  3748     chunk := aStream nextChunk.
       
  3749     sawExcla ifTrue:[
       
  3750 	chunk := aStream nextChunk
       
  3751     ].
       
  3752     aStream close.
       
  3753     ^ chunk
       
  3754 !
       
  3755 
       
  3756 timeStampPrintStringOf:ts
       
  3757     ^ ts printString
       
  3758 
       
  3759     "
       
  3760      self basicNew timeStampPrintStringOf:(Timestamp now)
       
  3761     "
       
  3762 
       
  3763     "Modified (format): / 05-12-2017 / 15:08:48 / cg"
       
  3764 !
       
  3765 
       
  3766 unselect
       
  3767     "common unselect"
       
  3768 
       
  3769     changeListView setSelection:nil.
       
  3770 
       
  3771     "Modified: 25.5.1996 / 13:02:49 / cg"
       
  3772 !
  3873 !
  3773 
  3874 
  3774 withSelectedChangesDo:aBlock
  3875 withSelectedChangesDo:aBlock
  3775     "just a helper, check for a selected change and evaluate aBlock
  3876     "just a helper, check for a selected change and evaluate aBlock
  3776      with busy cursor"
  3877      with busy cursor"
  4307 
  4408 
  4308     "Created: / 05-11-2001 / 18:09:46 / cg"
  4409     "Created: / 05-11-2001 / 18:09:46 / cg"
  4309     "Modified: / 01-05-2016 / 19:24:53 / cg"
  4410     "Modified: / 01-05-2016 / 19:24:53 / cg"
  4310 !
  4411 !
  4311 
  4412 
       
  4413 selectorOfMethodCategoryChange:changeNr
       
  4414     "return a methodCategory-change's selector, 
       
  4415      or nil if it's not a methodCategoryChange"
       
  4416 
       
  4417     (changeInfoList at:changeNr) isMethodCategoryChange ifFalse:[^ nil].
       
  4418     ^ (changeInfoList at:changeNr) selector.
       
  4419 
       
  4420     "Modified: / 01-05-2016 / 19:26:21 / cg"
       
  4421 !
       
  4422 
  4312 selectorOfMethodChange:changeNr
  4423 selectorOfMethodChange:changeNr
  4313     "return a method-changes selector, 
  4424     "return a method-change's selector, 
  4314      or nil if it's not a methodChange"
  4425      or nil if it's not a methodChange"
  4315 
  4426 
  4316     |sel |
  4427     |sel |
  4317 
  4428 
  4318     changeInfoList size >= changeNr ifTrue:[
  4429     changeInfoList size >= changeNr ifTrue:[
       
  4430         (changeInfoList at:changeNr) isMethodCategoryChange ifTrue:[^ nil].
  4319         sel := (changeInfoList at:changeNr) selector.
  4431         sel := (changeInfoList at:changeNr) selector.
  4320         sel notNil ifTrue:[ ^ sel ].
  4432         sel notNil ifTrue:[ ^ sel ].
  4321     ].
  4433     ].
  4322 
  4434 
  4323     sel := self extractSelectorOfMethodChange:changeNr.
  4435     sel := self extractSelectorOfMethodChange:changeNr.
  4324     sel notNil ifTrue:[
  4436     sel notNil ifTrue:[
       
  4437         self assert:(changeInfoList at:changeNr) isMethodCategoryChange not.
  4325         (changeInfoList at:changeNr) selector:sel.
  4438         (changeInfoList at:changeNr) selector:sel.
  4326     ].
  4439     ].
  4327     ^ sel
  4440     ^ sel
  4328 
  4441 
  4329     "Modified: / 01-05-2016 / 19:26:21 / cg"
  4442     "Modified: / 01-05-2016 / 19:26:21 / cg"
  4912     ].
  5025     ].
  4913     ^ nil -> 'Unhandled receiver'
  5026     ^ nil -> 'Unhandled receiver'
  4914 !
  5027 !
  4915 
  5028 
  4916 compareChange:changeNr
  5029 compareChange:changeNr
  4917     "compare a change with the current (in-image) version; show the result of the compare (as dialog)"
  5030     "compare a change with the current (in-image) version; 
       
  5031      show the result of the compare (as dialog)"
  4918 
  5032 
  4919     ^ self compareChange:changeNr showResult:true
  5033     ^ self compareChange:changeNr showResult:true
  4920 !
  5034 !
  4921 
  5035 
  4922 compareChange:changeNr showResult:doShowResult
  5036 compareChange:changeNr showResult:doShowResult
  4923     "compare a change with current version.
  5037     "compare a change with current version.
  4924      Return the result of the compare (same -> true, different -> false, uncomparable -> nil).
  5038      Return the result of the compare 
       
  5039         same -> true, 
       
  5040         different -> false, 
       
  5041         uncomparable -> nil.
  4925      If doShowResult is true, the outcome is shown in a dialog/diffViewer."
  5042      If doShowResult is true, the outcome is shown in a dialog/diffViewer."
  4926 
  5043 
  4927     |aStream chunk sawExcla parseTree thisClass cat oldSource newSource outcome showDiff d selector isLoaded beep superClass thisClassSym varsHere varsInChange addedVars removedVars
  5044     |aStream chunk sawExcla parseTree thisClass cat oldSource newSource outcome showDiff d selector isLoaded beep superClass thisClassSym varsHere varsInChange addedVars removedVars
  4928      isSame ownerClass superClassHere superClassInChange sameAndOutcome|
  5045      isSame ownerClass superClassHere superClassInChange sameAndOutcome|
  4929 
  5046 
  5548         ].
  5665         ].
  5549 
  5666 
  5550         "finally delete what has been found"
  5667         "finally delete what has been found"
  5551 
  5668 
  5552         (deleteSet size > 0) ifTrue:[
  5669         (deleteSet size > 0) ifTrue:[
  5553             changeListView setSelection:nil.
  5670             self unselect.
  5554             index := deleteSet size.
  5671             index := deleteSet size.
  5555             [index > 0] whileTrue:[
  5672             [index > 0] whileTrue:[
  5556                 self silentDeleteChange:(deleteSet at:index).
  5673                 self silentDeleteChange:(deleteSet at:index).
  5557                 index := index - 1
  5674                 index := index - 1
  5558             ].
  5675             ].
  5559             self setChangeList.
  5676             self updateChangeList.
  5560             "
  5677             "
  5561              scroll back a bit, if we are left way behind the list
  5678              scroll back a bit, if we are left way behind the list
  5562             "
  5679             "
  5563             changeListView firstLineShown > self numberOfChanges ifTrue:[
  5680             changeListView firstLineShown > self numberOfChanges ifTrue:[
  5564                 changeListView makeLineVisible:self numberOfChanges
  5681                 changeListView makeLineVisible:self numberOfChanges
  5579 !
  5696 !
  5580 
  5697 
  5581 deleteChangesFrom:start to:stop
  5698 deleteChangesFrom:start to:stop
  5582     "delete a range of changes"
  5699     "delete a range of changes"
  5583 
  5700 
  5584     changeListView setSelection:nil.
  5701     self unselect.
  5585     stop to:start by:-1 do:[:changeNr |
  5702     stop to:start by:-1 do:[:changeNr |
  5586 	self silentDeleteInternalChange:changeNr.
  5703         self silentDeleteInternalChange:changeNr.
  5587     ].
  5704     ].
  5588     changeListView removeFromIndex:start toIndex:stop.
  5705     changeListView removeFromIndex:start toIndex:stop.
  5589 
  5706 
  5590 "/    changeListView contentsChanged.
  5707 "/    changeListView contentsChanged.
  5591 "/    changeListView redrawFromLine:start.
  5708 "/    changeListView redrawFromLine:start.
  5716 "/    changeIsFollowupMethodChange size >= changeNr ifTrue:[changeIsFollowupMethodChange removeIndex:changeNr].
  5833 "/    changeIsFollowupMethodChange size >= changeNr ifTrue:[changeIsFollowupMethodChange removeIndex:changeNr].
  5717 
  5834 
  5718     "Created: / 07-03-1997 / 16:28:32 / cg"
  5835     "Created: / 07-03-1997 / 16:28:32 / cg"
  5719     "Modified: / 26-02-1998 / 18:20:48 / stefan"
  5836     "Modified: / 26-02-1998 / 18:20:48 / stefan"
  5720     "Modified: / 01-05-2016 / 19:20:59 / cg"
  5837     "Modified: / 01-05-2016 / 19:20:59 / cg"
       
  5838 !
       
  5839 
       
  5840 silentDeleteMethodCategoryChangesFor:aClassName selector:selector from:start to:stop
       
  5841     "delete method category changes for given class/selector in a range.
       
  5842      Return the number of deleted changes."
       
  5843 
       
  5844     |thisClassName index numDeleted|
       
  5845 
       
  5846     numDeleted := 0.
       
  5847     index := stop.
       
  5848     [index >= start] whileTrue:[
       
  5849         thisClassName := self realClassNameOfChange:index.
       
  5850         thisClassName = aClassName ifTrue:[
       
  5851             (self selectorOfMethodCategoryChange:index) == selector ifTrue:[
       
  5852                 self silentDeleteChange:index.
       
  5853                 numDeleted := numDeleted + 1.
       
  5854             ]
       
  5855         ].
       
  5856         index := index - 1
       
  5857     ].
       
  5858     ^ numDeleted
       
  5859 !
       
  5860 
       
  5861 silentDeleteMethodChangesFor:aClassName selector:selector from:start to:stop
       
  5862     "delete method changes for given class/selector in a range.
       
  5863      Return the number of deleted changes."
       
  5864 
       
  5865     |thisClassName index numDeleted|
       
  5866 
       
  5867     numDeleted := 0.
       
  5868     index := stop.
       
  5869     [index >= start] whileTrue:[
       
  5870         thisClassName := self realClassNameOfChange:index.
       
  5871         thisClassName = aClassName ifTrue:[
       
  5872             (self selectorOfMethodChange:index) == selector ifTrue:[
       
  5873                 self silentDeleteChange:index.
       
  5874                 numDeleted := numDeleted + 1.
       
  5875             ]
       
  5876         ].
       
  5877         index := index - 1
       
  5878     ].
       
  5879     ^ numDeleted
  5721 !
  5880 !
  5722 
  5881 
  5723 updateDiffView
  5882 updateDiffView
  5724     self withSelectedChangesDo:[:changeNr |
  5883     self withSelectedChangesDo:[:changeNr |
  5725 	self updateDiffViewFor:changeNr.
  5884 	self updateDiffViewFor:changeNr.
  6152             nil
  6311             nil
  6153         ]
  6312         ]
  6154 !
  6313 !
  6155 
  6314 
  6156 classOfChange:changeNr ifAbsent:exceptionBlock
  6315 classOfChange:changeNr ifAbsent:exceptionBlock
  6157     "answer the class that is subject to the chamge at changeNr.
  6316     "answer the class that is subject to the change at changeNr.
  6158      The classes owning class may be autoloaded, if autoloadAsRequired is true."
  6317      The classes owning class may be autoloaded, if autoloadAsRequired is true."
  6159 
  6318 
  6160     |className cls isMeta nameSpaceForApply path ownerName owner|
  6319     |className cls isMeta nameSpaceForApply path ownerName owner|
  6161 
  6320 
  6162     className := self realClassNameOfChange:changeNr.
  6321     className := self realClassNameOfChange:changeNr.
  6163     className isNil ifTrue:[
  6322     className isNil ifTrue:[
  6164         ^ exceptionBlock value:nil
  6323         ^ exceptionBlock valueWithOptionalArgument:nil
  6165     ].
  6324     ].
  6166 
  6325 
  6167     isMeta := false.
  6326     isMeta := false.
  6168     (className endsWith:' class') ifTrue:[
  6327     (className endsWith:' class') ifTrue:[
  6169         className := className copyButLast:6.
  6328         className := className copyButLast:6.
  6199             cls := Smalltalk loadedClassNamed:className
  6358             cls := Smalltalk loadedClassNamed:className
  6200         ].
  6359         ].
  6201     ].
  6360     ].
  6202 
  6361 
  6203     cls isNil ifTrue:[
  6362     cls isNil ifTrue:[
  6204         ^ exceptionBlock value:className
  6363         ^ exceptionBlock valueWithOptionalArgument:className
  6205     ].
  6364     ].
  6206     isMeta ifTrue:[
  6365     isMeta ifTrue:[
  6207         cls := cls class
  6366         cls := cls class
  6208     ].
  6367     ].
  6209     ^ cls
  6368     ^ cls
  6612     changeHeaderLines add:(self headerLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo)
  6771     changeHeaderLines add:(self headerLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo)
  6613 
  6772 
  6614     "Modified: / 01-05-2016 / 19:07:49 / cg"
  6773     "Modified: / 01-05-2016 / 19:07:49 / cg"
  6615 !
  6774 !
  6616 
  6775 
       
  6776 colorizeAsCommentChange:changeType
       
  6777     |c|
       
  6778 
       
  6779     NoColoring ~~ true ifTrue:[
       
  6780         c := changeType allItalic.
       
  6781         "/ changeString := changeString allItalic.
       
  6782         c emphasisAllAdd:(#color -> UserPreferences current commentColor).
       
  6783         ^ c
       
  6784     ].
       
  6785     ^ changeType
       
  6786 !
       
  6787 
  6617 headerLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo
  6788 headerLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo
  6618     |entry|
  6789     |entry|
  6619 
  6790 
  6620     entry := MultiColListEntry new.
  6791     entry := MultiColListEntry new.
  6621     entry tabulatorSpecification:tabSpec.
  6792     entry tabulatorSpecification:tabSpec.
  6643 
  6814 
  6644     changeInfo add:(info := 
  6815     changeInfo add:(info := 
  6645                         ChangesBrowser::ChangeInfo new 
  6816                         ChangesBrowser::ChangeInfo new 
  6646                             position:chunkPosition chunk:chunkText className:nil selector:nil headerLine:nil
  6817                             position:chunkPosition chunk:chunkText className:nil selector:nil headerLine:nil
  6647                             timestamp:timeStampInfo isFollowupChange:false).
  6818                             timestamp:timeStampInfo isFollowupChange:false).
  6648 "/    changeChunks add:chunkText.
       
  6649 "/    changeClassNames add:nil.
       
  6650 "/    changePositions add:chunkPosition.
       
  6651 "/    changeTimeStamps add:timeStampInfo.
       
  6652 "/    changeIsFollowupMethodChange add:false.
       
  6653 
  6819 
  6654     headerLine := nil.
  6820     headerLine := nil.
  6655     changeDelta := ' '.
  6821     changeDelta := ' '.
  6656 
  6822 
  6657     sawExcla ifFalse:[
  6823     sawExcla ifFalse:[
  6658         self processNonMethodChunk
  6824         self processNonMethodChunk
  6659     ] ifTrue:[
  6825     ] ifTrue:[
  6660         self processMethodChunkIfNone:
  6826         self processMethodChunkIfNone:
  6661             [
  6827             [
  6662                 changeInfo removeLast.
  6828                 changeInfo removeLast.
  6663 "/                changeChunks removeLast.
       
  6664 "/                changeClassNames removeLast.
       
  6665 "/                changePositions removeLast.
       
  6666 "/                changeTimeStamps removeLast.
       
  6667 "/                changeIsFollowupMethodChange removeLast.
       
  6668             ]
  6829             ]
  6669     ].
  6830     ].
  6670 
  6831 
  6671     changeString notNil ifTrue:[
  6832     changeString notNil ifTrue:[
  6672         "/ self addHeaderLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo.
  6833         "/ self addHeaderLineForChangeType:changeType changeString:changeString changeDelta:changeDelta timeStampInfo:timeStampInfo.
  6719             clsName := nameAndClass key. changeClass := nameAndClass value.
  6880             clsName := nameAndClass key. changeClass := nameAndClass value.
  6720 
  6881 
  6721             sel == #categoriesForClass ifTrue:[
  6882             sel == #categoriesForClass ifTrue:[
  6722                 methodChunks := false.
  6883                 methodChunks := false.
  6723                 classCategoryChunks := true.
  6884                 classCategoryChunks := true.
  6724                 changeType := '(class category change)'.
  6885                 changeType := self colorizeAsCommentChange:'(class category change)'.
  6725             ] ifFalse:[
  6886             ] ifFalse:[
  6726                 sel == #categoriesFor: ifTrue:[
  6887                 sel == #categoriesFor: ifTrue:[
  6727                     methodChunks := false.
  6888                     methodChunks := false.
  6728                     methodCategoryChunks := true.
  6889                     methodCategoryChunks := true.
  6729                     changeType := '(category change)'.
  6890                     changeType := self colorizeAsCommentChange:'(category change)'.
  6730                     methodSelector := (p args at:1) evaluate.
  6891                     methodSelector := (p args at:1) evaluate.
  6731                 ] ifFalse:[
  6892                 ] ifFalse:[
  6732                     (sel numArgs == 0) ifTrue:[
  6893                     (sel numArgs == 0) ifTrue:[
  6733                         category := '* As yet uncategorized *'.
  6894                         category := '* As yet uncategorized *'.
  6734                         category := sel.
  6895                         category := sel.
  6826                     changeString := (chunkText contractTo:maxLen).
  6987                     changeString := (chunkText contractTo:maxLen).
  6827                     changeType := '(change)'.
  6988                     changeType := '(change)'.
  6828                     headerLine := chunkText , ' (change)'.
  6989                     headerLine := chunkText , ' (change)'.
  6829                 ] ifFalse:[
  6990                 ] ifFalse:[
  6830                     changeString :=  self contractClass:clsName selector:methodSelector to:maxLen.
  6991                     changeString :=  self contractClass:clsName selector:methodSelector to:maxLen.
  6831                     changeType := '{ ' , category , ' }'.
  6992                     changeType := ('{ ' , category , ' }').
  6832                     headerLine := clsName , ' ' , methodSelector , ' ' , '(change category: ''' , category , ''')'.
  6993                     headerLine := clsName , ' ' , methodSelector , ' ' , '(change category: ''' , category , ''')'.
  6833                 ].
  6994                 ].
  6834 
  6995 
  6835                 autoCompare value ifTrue:[
  6996                 autoCompare value ifTrue:[
  6836                     changeDelta := ChangeDeltaInformation 
  6997                     changeDelta := ChangeDeltaInformation 
  6856 
  7017 
  6857     "Modified: / 21-11-2016 / 23:32:29 / cg"
  7018     "Modified: / 21-11-2016 / 23:32:29 / cg"
  6858 !
  7019 !
  6859 
  7020 
  6860 processNonMethodChunk
  7021 processNonMethodChunk
  6861     |s changeClass sel  cls p rec clsName ownerTree ownerName
  7022     |s changeClass sel cls parseTree rec clsName ownerTree ownerName
  6862      m nameAndClass args instVarsArg classVarsArg categoryArg|
  7023      m nameAndClass args instVarsArg classVarsArg categoryArg
       
  7024      lastInfo newCategory|
  6863 
  7025 
  6864     (chunkText startsWith:'''---- snap') ifTrue:[
  7026     (chunkText startsWith:'''---- snap') ifTrue:[
  6865         self processSnapshotChunk.
  7027         self processSnapshotChunk.
  6866         ^ self
  7028         ^ self
  6867     ].
  7029     ].
  6878     ] ifFalse:[
  7040     ] ifFalse:[
  6879         changeType := '(doIt)'.
  7041         changeType := '(doIt)'.
  6880     ].
  7042     ].
  6881     changeString := (chunkText contractTo:maxLen) withoutSeparators.
  7043     changeString := (chunkText contractTo:maxLen) withoutSeparators.
  6882 
  7044 
  6883     p := browser parseExpression:fullChunkText inNameSpace:Smalltalk.
  7045     parseTree := browser parseExpression:fullChunkText inNameSpace:Smalltalk.
  6884     (p notNil and:[p ~~ #Error]) ifTrue:[
  7046     (parseTree notNil and:[parseTree ~~ #Error]) ifTrue:[
  6885         p isMessage ifTrue:[
  7047         parseTree isMessage ifTrue:[
  6886             sel := p selector.
  7048             sel := parseTree selector.
  6887             rec := p receiver.
  7049             rec := parseTree receiver.
  6888             args := p args.        
  7050             args := parseTree args.        
  6889         ]
  7051         ]
  6890     ] ifFalse:[
  7052     ] ifFalse:[
  6891         sel := nil.
  7053         sel := nil.
  6892         (Scanner new scanTokens:fullChunkText) size == 0 ifTrue:[
  7054         (Scanner new scanTokens:fullChunkText) size == 0 ifTrue:[
  6893             "/ a comment only
  7055             "/ a comment only
  6894             changeType := '(comment)'.
  7056             changeType := self colorizeAsCommentChange:'(comment)'.
  6895             NoColoring ~~ true ifTrue:[
       
  6896                 changeType := changeType allItalic.
       
  6897                 "/ changeString := changeString allItalic.
       
  6898                 changeType emphasisAllAdd:(#color -> UserPreferences current commentColor).
       
  6899             ]
       
  6900         ] ifFalse:[
  7057         ] ifFalse:[
  6901             changeType := '(???)'.
  7058             changeType := '(???)'.
  6902         ]
  7059         ]
  6903     ].
  7060     ].
  6904 
  7061 
  6905     (sel == #comment:) ifTrue:[
  7062     (sel == #comment:) ifTrue:[
  6906         changeType := '(comment)'.
  7063         changeType := self colorizeAsCommentChange:'(comment)'.
  6907         clsName := rec name.
  7064         clsName := rec name.
  6908         changeClass := (self nameSpaceForApply) classNamed:clsName.
  7065         changeClass := (self nameSpaceForApply) classNamed:clsName.
  6909         (changeInfo last) className:clsName.
  7066         (changeInfo last) className:clsName.
  6910         "/ changeClassNames at:changeClassNames size put:clsName.
  7067 
  6911         NoColoring ~~ true ifTrue:[
       
  6912             changeType := changeType allItalic.
       
  6913             changeType emphasisAllAdd:(#color -> UserPreferences current commentColor).
       
  6914             "/ changeString := clsName allItalic.
       
  6915         ].
       
  6916         autoCompare value ifTrue:[
  7068         autoCompare value ifTrue:[
  6917             (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  7069             (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  6918                 changeDelta := '?'
  7070                 changeDelta := '?'
  6919             ] ifFalse:[
  7071             ] ifFalse:[
  6920                 (changeClass comment = (args at:1) evaluate) ifTrue:[
  7072                 (changeClass comment = (args at:1) evaluate) ifTrue:[
  6926         ^ self.
  7078         ^ self.
  6927     ].
  7079     ].
  6928 
  7080 
  6929     (sel == #removeSelector:) ifTrue:[
  7081     (sel == #removeSelector:) ifTrue:[
  6930         nameAndClass := self extractClassAndClassNameFromParseTree:rec.
  7082         nameAndClass := self extractClassAndClassNameFromParseTree:rec.
  6931         clsName := nameAndClass key. changeClass := nameAndClass value.
  7083         clsName := nameAndClass key. 
       
  7084         changeClass := nameAndClass value.
  6932 
  7085 
  6933         sel := (args at:1) evaluate.
  7086         sel := (args at:1) evaluate.
  6934         (changeInfo last) className:clsName.
  7087         (changeInfo last) className:clsName.
  6935         "/ changeClassNames at:changeClassNames size put:clsName.
       
  6936 
  7088 
  6937         autoCompare value ifTrue:[
  7089         autoCompare value ifTrue:[
  6938             (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  7090             (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  6939                 changeDelta := '?'
  7091                 changeDelta := '?'
  6940             ] ifFalse:[
  7092             ] ifFalse:[
  6949         changeString := self contractClass:clsName selector:sel to:maxLen.
  7101         changeString := self contractClass:clsName selector:sel to:maxLen.
  6950         "/ sel := nil.
  7102         "/ sel := nil.
  6951         ^ self.
  7103         ^ self.
  6952     ].
  7104     ].
  6953 
  7105 
  6954     (p notNil
  7106     (parseTree notNil
  6955     and:[p ~~ #Error
  7107     and:[parseTree ~~ #Error
  6956     and:[p isMessage
  7108     and:[parseTree isMessage
  6957     and:[rec isMessage
  7109     and:[rec isMessage
  6958     and:[rec selector == #compiledMethodAt:]]]]) ifTrue:[
  7110     and:[rec selector == #compiledMethodAt:]]]]) ifTrue:[
  6959         nameAndClass := self extractClassAndClassNameFromParseTree:rec receiver.
  7111         nameAndClass := self extractClassAndClassNameFromParseTree:rec receiver.
  6960         clsName := nameAndClass key. changeClass := nameAndClass value.
  7112         clsName := nameAndClass key. 
       
  7113         changeClass := nameAndClass value.
  6961 
  7114 
  6962         (sel == #category:) ifTrue:[
  7115         (sel == #category:) ifTrue:[
  6963             sel := (rec args at:1) evaluate.
  7116             sel := (rec args at:1) evaluate.
  6964             changeType := '(category change)'.
  7117             changeType := self colorizeAsCommentChange:'(category change)'.
  6965             changeString := self contractClass:clsName selector:sel to:maxLen.
  7118             changeString := self contractClass:clsName selector:sel to:maxLen.
  6966             (changeInfo last) className:clsName.
  7119             newCategory := (args at:1) evaluate.
  6967             "/ changeClassNames at:changeClassNames size put:clsName.
  7120 
       
  7121             "/ make it a category change
       
  7122             lastInfo := changeInfo last.
       
  7123             lastInfo className:clsName.
       
  7124             lastInfo selector:sel.
       
  7125             lastInfo categoryIfCategoryChange:newCategory.
       
  7126 
  6968             autoCompare value ifTrue:[
  7127             autoCompare value ifTrue:[
  6969                 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  7128                 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  6970                     changeDelta := '?'
  7129                     changeDelta := '?'
  6971                 ] ifFalse:[
  7130                 ] ifFalse:[
  6972                     m := changeClass compiledMethodAt:sel asSymbol.
  7131                     m := changeClass compiledMethodAt:sel asSymbol.
  6973                     m notNil ifTrue:[
  7132                     m isNil ifTrue:[
  6974                         m category = (p args at:1) evaluate ifTrue:[
  7133                         "/ mhm - the method does not (no longer=) exist
       
  7134                         changeDelta := '?'
       
  7135                     ] ifFalse:[
       
  7136                         m category = newCategory ifTrue:[
  6975                             changeDelta := '='.
  7137                             changeDelta := '='.
  6976                         ]
  7138                         ]
  6977                     ]
  7139                     ]
  6978                 ]
  7140                 ]
  6979             ].
  7141             ].
  6980             ^ self.
  7142             ^ self.
  6981         ].
  7143         ].
       
  7144 
  6982         (sel == #privacy:) ifTrue:[
  7145         (sel == #privacy:) ifTrue:[
  6983             sel := (rec args at:1) evaluate.
  7146             sel := (rec args at:1) evaluate.
  6984             changeType := '(privacy change)'.
  7147             changeType := '(privacy change)'.
  6985             changeString := self contractClass:clsName selector:sel to:maxLen.
  7148             changeString := self contractClass:clsName selector:sel to:maxLen.
  6986             (changeInfo last) className:clsName.
  7149             (changeInfo last) className:clsName.
  6987             "/ changeClassNames at:changeClassNames size put:clsName.
  7150 
  6988             autoCompare value ifTrue:[
  7151             autoCompare value ifTrue:[
  6989                 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  7152                 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
  6990                     changeDelta := '?'
  7153                     changeDelta := '?'
  6991                 ] ifFalse:[
  7154                 ] ifFalse:[
  6992                     changeDelta := ' '
  7155                     changeDelta := ' '
  6999 
  7162 
  7000     (Class definitionSelectors includes:sel) ifTrue:[
  7163     (Class definitionSelectors includes:sel) ifTrue:[
  7001         changeType := '(class definition)'.
  7164         changeType := '(class definition)'.
  7002         clsName := (args at:1) evaluate.
  7165         clsName := (args at:1) evaluate.
  7003         (changeInfo last) className:clsName.
  7166         (changeInfo last) className:clsName.
  7004         "/ changeClassNames at:changeClassNames size put:clsName.
       
  7005 
  7167 
  7006         "/ is it a private-class ?
  7168         "/ is it a private-class ?
  7007         ('*privateIn:' match:sel) ifTrue:[
  7169         ('*privateIn:' match:sel) ifTrue:[
  7008             ownerTree := args last.
  7170             ownerTree := args last.
  7009             ownerName := ownerTree name asString.
  7171             ownerName := ownerTree name asString.
  7026                     "/ could be an ST/V, VAge or Dolphin definition
  7188                     "/ could be an ST/V, VAge or Dolphin definition
  7027                     cls definitionSelector = (sel , 'category:')
  7189                     cls definitionSelector = (sel , 'category:')
  7028                 ])
  7190                 ])
  7029                 ifTrue:[
  7191                 ifTrue:[
  7030                     ((cls superclass isNil
  7192                     ((cls superclass isNil
  7031                         and:[p receiver isLiteral
  7193                         and:[rec isLiteral
  7032                         and:[p receiver evaluate isNil]])
  7194                         and:[rec evaluate isNil]])
  7033                     or:[
  7195                     or:[
  7034                         cls superclass notNil
  7196                         cls superclass notNil
  7035                         and:[p receiver isLiteral not
  7197                         and:[rec isLiteral not
  7036                         and:[cls superclass name = p receiver name]]
  7198                         and:[cls superclass name = rec name]]
  7037                     ]) ifTrue:[
  7199                     ]) ifTrue:[
  7038                         (sel == #'variableByteSubclass:classVariableNames:poolDictionaries:category:')
  7200                         (sel == #'variableByteSubclass:classVariableNames:poolDictionaries:category:')
  7039                         ifTrue:[
  7201                         ifTrue:[
  7040                             "/ VSE definition message
  7202                             "/ VSE definition message
  7041                             instVarsArg := ''.
  7203                             instVarsArg := ''.
  7054                                     changeDelta := '='.
  7216                                     changeDelta := '='.
  7055                                 ] ifFalse:[
  7217                                 ] ifFalse:[
  7056                                     cls category = categoryArg ifTrue:[
  7218                                     cls category = categoryArg ifTrue:[
  7057                                         changeDelta := '='.
  7219                                         changeDelta := '='.
  7058                                     ] ifFalse:[
  7220                                     ] ifFalse:[
  7059                                         changeType := '(class category change)'.
  7221                                         changeType := self colorizeAsCommentChange:'(class category change)'.
  7060                                     ]
  7222                                     ]
  7061                                 ]
  7223                                 ]
  7062                             ]
  7224                             ]
  7063                         ]
  7225                         ]
  7064                     ]
  7226                     ]
  7084     and:[rec selector == #class]]) ifTrue:[
  7246     and:[rec selector == #class]]) ifTrue:[
  7085         clsName := rec receiver name.
  7247         clsName := rec receiver name.
  7086         changeClass := (self nameSpaceForApply) classNamed:clsName.
  7248         changeClass := (self nameSpaceForApply) classNamed:clsName.
  7087         changeType := '(class definition)'.
  7249         changeType := '(class definition)'.
  7088         (changeInfo last) className:clsName.
  7250         (changeInfo last) className:clsName.
  7089         "/ changeClassNames at:changeClassNames size put:clsName.
       
  7090 
  7251 
  7091         autoCompare value ifTrue:[
  7252         autoCompare value ifTrue:[
  7092             changeClass isNil ifTrue:[
  7253             changeClass isNil ifTrue:[
  7093                 changeDelta := '?'.
  7254                 changeDelta := '?'.
  7094             ] ifFalse:[
  7255             ] ifFalse:[
  7095                 s := (p args at:1) evaluate.
  7256                 s := (args at:1) evaluate.
  7096                 s = changeClass class instanceVariableString ifTrue:[
  7257                 s = changeClass class instanceVariableString ifTrue:[
  7097                     changeDelta := '='.
  7258                     changeDelta := '='.
  7098                 ]
  7259                 ]
  7099             ]
  7260             ]
  7100         ].
  7261         ].
  7162 
  7323 
  7163     "Modified: / 27-08-1995 / 23:06:55 / claus"
  7324     "Modified: / 27-08-1995 / 23:06:55 / claus"
  7164     "Modified: / 01-05-2016 / 18:33:36 / cg"
  7325     "Modified: / 01-05-2016 / 18:33:36 / cg"
  7165 ! !
  7326 ! !
  7166 
  7327 
       
  7328 !ChangesBrowser::ChangeInfo class methodsFor:'documentation'!
       
  7329 
       
  7330 documentation
       
  7331 "
       
  7332     documentation to be added.
       
  7333 
       
  7334     [author:]
       
  7335         cg
       
  7336 
       
  7337     [instance variables:]
       
  7338 
       
  7339     [class variables:]
       
  7340 
       
  7341     [see also:]
       
  7342 
       
  7343 "
       
  7344 ! !
       
  7345 
  7167 !ChangesBrowser::ChangeInfo methodsFor:'accessing'!
  7346 !ChangesBrowser::ChangeInfo methodsFor:'accessing'!
       
  7347 
       
  7348 categoryIfCategoryChange
       
  7349     ^ categoryIfCategoryChange
       
  7350 !
       
  7351 
       
  7352 categoryIfCategoryChange:something
       
  7353     categoryIfCategoryChange := something.
       
  7354 !
  7168 
  7355 
  7169 chunk
  7356 chunk
  7170     ^ chunk
  7357     ^ chunk
  7171 !
  7358 !
  7172 
  7359 
  7186     headerLine := something.
  7373     headerLine := something.
  7187 !
  7374 !
  7188 
  7375 
  7189 isFollowupChange
  7376 isFollowupChange
  7190     ^ isFollowupChange
  7377     ^ isFollowupChange
       
  7378 !
       
  7379 
       
  7380 isMethodCategoryChange
       
  7381     ^ categoryIfCategoryChange notNil
  7191 !
  7382 !
  7192 
  7383 
  7193 position
  7384 position
  7194     ^ position
  7385     ^ position
  7195 !
  7386 !