*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Mon, 04 Feb 2008 13:25:06 +0100
changeset 7957 55841733ff69
parent 7956 da199a336d8f
child 7958 4d731a6e04b1
*** empty log message ***
NewChangesBrowser.st
--- a/NewChangesBrowser.st	Mon Feb 04 13:24:53 2008 +0100
+++ b/NewChangesBrowser.st	Mon Feb 04 13:25:06 2008 +0100
@@ -4,14 +4,15 @@
 	instanceVariableNames:'changes changeFileName skipSignal changeFileTimestamp
 		autoUpdateBlock filterCompletionBlock editingClassSource modified'
 	classVariableNames:'AutoUpdate CompressSnapshotInfo CategoryColumn DeltaInfoColumn
-		TypeColumn TimeStampColumn PositionsColumn PrivateAsSeparate'
+		TypeColumn TimeStampColumn PositionsColumn PrivateAsSeparate
+		ClassNameColumn ClassAndSelectorColumn SelectorColumn'
 	poolDictionaries:''
 	category:'Interface-Browsers'
 !
 
 Object subclass:#Change
 	instanceVariableNames:'delta string type timeStamp category chunk lastPosition position
-		className followUp'
+		className selector followUp'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:NewChangesBrowser
@@ -24,14 +25,13 @@
     The future Changes Browser.
 
     [start with:]
-	NewChangesBrowser open
-	NewChangesBrowser openOnFile:aFileName
+        NewChangesBrowser open
+        NewChangesBrowser openOnFile:aFileName
 
     [author:]
-	Thomas Zwick, eXept Software AG
+        Thomas Zwick, eXept Software AG
+        enhanced by Felix Madrid, eXept Software AG
 "
-
-
 ! !
 
 !NewChangesBrowser class methodsFor:'instance creation'!
@@ -72,7 +72,7 @@
 
 !NewChangesBrowser class methodsFor:'help specs'!
 
-helpSpec
+flyByHelpSpec
     "This resource specification was automatically generated
      by the UIHelpTool of ST/X."
 
@@ -85,13 +85,13 @@
 
     <resource: #help>
 
-    ^super helpSpec addPairsFrom:#(
+    ^super flyByHelpSpec addPairsFrom:#(
 
 #applyAll
 'Apply all changes.'
 
 #applyForClassToEnd
-'Apply changes to the end which affect this class.'
+'Apply changes which affect this class to the end.'
 
 #applyFromLastSnapshot
 'Apply changes from the last snapshot to the end.'
@@ -160,7 +160,7 @@
 'Opens a info dialog showing the difference between the changes code and the method current code.'
 
 #testFindLastSnapshot
-'Searches backward for the latest snapshot entry.'
+'Searches backward for the previous snapshot entry.'
 
 #testFindNextSnapshot
 'Searches forward for the next snapshot entry.'
@@ -168,11 +168,114 @@
 )
 
     "Modified: / 19.5.1998 / 17:59:39 / cg"
+!
+
+helpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:NewChangesBrowser    
+    "
+
+    <resource: #help>
+
+    ^ super helpSpec addPairsFrom:#(
+
+#applyAll
+'Apply all changes.'
+
+#applyForClassToEnd
+'Apply changes to the end which affect this class.'
+
+#applyFromLastSnapshot
+'Apply changes from the last snapshot to the end.'
+
+#applyLine
+'Apply the selected change.'
+
+#applyToEnd
+'Apply all changes from the selected one to the end.'
+
+#deleteAll
+'Deletes all changes.'
+
+#deleteCompress
+'Deletes all obsolete changes.'
+
+#deleteCompressForClass
+'Deletes obsolete changes for this class, leaving the last one.'
+
+#deleteForClassToEnd
+'Deletes changes for this class from the selection to the end.'
+
+#deleteLine
+'Deletes the selected change.'
+
+#deleteToEnd
+'Deletes changes from the selected one to the end.'
+
+#fileLoad
+'Opens a dialog for selecting and loading another changes file.'
+
+#fileReload
+'Reloads the changes file (undo your modifications).'
+
+#fileSave
+'Saves the list of changes into the current changes file.'
+
+#filterField
+'Matching patterns filtering the changes (separate patterns by blanks).'
+
+#settingsAutoUpdate
+'Toggle automatic update.'
+
+#settingsColumns
+'Configure which columns are shown in the list.'
+
+#settingsColumnsCategory
+'Toggle display of the changes category in the list.'
+
+#settingsColumnsClassName
+'Toggle display of the className in the list.'
+
+#settingsColumnsDeltaInfo
+'Toggle display of the delta-info in the list.'
+
+#settingsColumnsPosition
+'Togle display of the changes file-position in the list.'
+
+#settingsColumnsTimeStamp
+'Toggle display of the changes time stamp in the list.'
+
+#settingsColumnsType
+'Toggle display of the change-type in the list.'
+
+#settingsPrivateAsSeparate
+'Toggle if changes for private private are included when applying, deleting, or compressing for a class.'
+
+#testCompareWithCurrentVersion
+'Opens a info dialog showing the difference between the changes code and the method current code.'
+
+#testFindLastSnapshot
+'Searches backward for the previous snapshot entry.'
+
+#testFindNextSnapshot
+'Searches forward for the next snapshot entry.'
+
+)
 ! !
 
 !NewChangesBrowser class methodsFor:'image specs'!
 
 applyFromLastSnapshotIcon
+    ^ self applyFromLastSnapshotIcon2
+!
+
+applyFromLastSnapshotIcon1
     "This resource specification was automatically generated
      by the ImageEditor of ST/X."
 
@@ -180,17 +283,22 @@
      the ImageEditor may not be able to read the specification."
 
     "
+     self applyFromLastSnapshotIcon inspect
      ImageEditor openOnClass:self andSelector:#applyFromLastSnapshotIcon
+     Icon flushCachedIcons
     "
 
     <resource: #image>
 
     ^Icon
-	constantNamed:#'NewChangesBrowser applyFromLastSnapshotIcon'
-	ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@QDQ<@@@@@@@@@@AH"H@@@@@@@@@@@D"H @@@@@@@@@@@RH"@@@@@@@@@@@AH"H@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@;.;.; @@@@@@@@C.;.;.@@@@@@@@@@@@@@8@@N@@@@C?????C @@@N@@@O????<@@@8@@@@@@@@@C0@@@@8@@O????<O@@C @@@@?????0@@@@C @@@@@@@O@@@N@@@@DQDQDP<@C @@@@@_??DQ@@@@@@@@@A????D@@@@@@@@@DQDQDP@@@@C @@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@C<@@C<@@C<@@C<@@C<@@A<@@D@@?<@@?<@@?<LC?<\C?<\C?<8O?08O?10O?10??C ??[@??_@?<^@?<_@?<_@') ; yourself); yourself]
+        constantNamed:#'NewChangesBrowser class applyFromLastSnapshotIcon'
+        ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(4)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BH"H"H@@@@@@@@@H"H"H @@@@@@@@@@@@@B@@@@@@
+@@;.;.; H@@@@@@@C.;.;.@@@@@@@@@@@@@@8@@N@@@@C?????C @@@N@@@O????<@@@8@@@@@@@@@C0@@@@8@@O????<O@@C @@@@?????0@@@@C @@@@@@
+@O@@@N@@@@DQDQDP<@C @@@@@_??DQ@@@@@@@@@A????D@@@@@@@@@DQDQDP@@@@C @@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@C?0@B@P@B@P@O?P@O?P@O?0@??@@??@@??LC?<\C?<\C?<8O?08O?10O?10??C ??[@??_@?<^@?<_@?<_@') ; yourself); yourself]
 !
 
-applyIcon
+applyFromLastSnapshotIcon2
     "This resource specification was automatically generated
      by the ImageEditor of ST/X."
 
@@ -198,14 +306,80 @@
      the ImageEditor may not be able to read the specification."
 
     "
+     self applyFromLastSnapshotIcon1 inspect
+     ImageEditor openOnClass:self andSelector:#applyFromLastSnapshotIcon1
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'NewChangesBrowser class applyFromLastSnapshotIcon1'
+        ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(4)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@BH@@@@@@QDQ<@@BH @@@@@AH"H@@@H"@@@@@@D"H H H"@@@@@@@RH"@"H"@@@@@@@AH"H@H"H@@@@@@@<@@@@BH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@;.;.; @@@@@@@@C.;.;.@@@@@@@@@@@@@@8@@N@@@@C?????C @@@N@@@O????<@@@8@@@@@@@@@C0@@@@8@@O????<O@@C @@@@?????0@@@@C @@@@@@
+@O@@@N@@@@DQDQDP<@C @@@@@_??DQ@@@@@@@@@A????D@@@@@@@@@DQDQDP@@@@C @@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A@C<C@C<C@C<&@C<<@C<\@C<H@@@@?<@@?<@@?<LC?<\C?<\C?<8O?08O?10O?10??C ??[@??_@?<^@?<_@?<_@') ; yourself); yourself]
+!
+
+applyIcon
+    ^ self applyIcon2
+!
+
+applyIcon1
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self applyIcon inspect
      ImageEditor openOnClass:self andSelector:#applyIcon
+     Icon flushCachedIcons
     "
 
     <resource: #image>
 
     ^Icon
-	constantNamed:#'NewChangesBrowser applyIcon'
-	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'UUUUUUUPUUUUUUUPUUUUUUU[UUUUUUUPP@@@@@@QQUUUUUTPQUUUUUTVQ**UUUTPQUUUUUTPQUUUUUTXQ***UUTPQ**UUUTPQ*****TPQ***%UTPQ****)TPQUUUUUTPQUUUUUTUP@@@@@@PUUUUUUUPUUUUUUUPUUUUUUUPUUUUUUUP') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 255 0 0]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
+        constantNamed:#'NewChangesBrowser class applyIcon'
+        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+UUUUUUUPUUUUUU?PUUUUUU?[UUUUUW=PP@@@@C<QQUUU=_4PQUUU?_4VQ**U_?TPQUUUW?TPQUUUW=TXQ***U=TPQ**UUUTPQ*****TPQ***%UTPQ****)TP
+QUUUUUTPQUUUUUTUP@@@@@@PUUUUUUUPUUUUUUUPUUUUUUUPUUUUUUUP') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 255 0 0]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@8@@@8@@A0_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
+!
+
+applyIcon2
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self applyIcon2 inspect
+     ImageEditor openOnClass:self andSelector:#applyIcon2
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'NewChangesBrowser class applyIcon2'
+        ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[4]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+DQDQDQDQDQDQP3PQDQDQDQDQDQECMADQDQDQDQDQECMADQDQDQEDPQDTL4DP@@@@@DL4@DL4@Q@QDQDQP3MAP3PADADQDQDTL3P3PPDPD"H"HQECL3MA@Q@Q
+DQDQDQP3MADADADQDQDQDTL4DPDPD"H"H"HQEDDQ@Q@RH"H!!DQDQDQDADAH"H"H"H"H"DPDPD"H"H"H!!DQDQ@Q@RH"H"H"H"HQDADADQDQDQDQDQDPDPDQDQ
+DQDQDQDQ@Q@@@@@@@@@@@@@ADQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDb') ; colorMapFromArray:#[0 0 0 255 255 255 170 170 170 255 0 0 85 85 85]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@<@@@<@@A8@C!!8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8_??8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
 !
 
 applyToEndIcon
@@ -216,14 +390,19 @@
      the ImageEditor may not be able to read the specification."
 
     "
+     self applyToEndIcon inspect
      ImageEditor openOnClass:self andSelector:#applyToEndIcon
+     Icon flushCachedIcons
     "
 
     <resource: #image>
 
     ^Icon
-	constantNamed:#'NewChangesBrowser applyToEndIcon'
-	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@B** H@@@B** H@@@@@@ @@@@**( @@@@**(@J@@@@@H@@@@O??H@@@@O??@@@@@@@C@H@@C??3@@ @C??0@ @@@@@0@B@@UUT0B@K@UUT@@H@@@@D@H@CEUUDB@@JG?U@@@@MG?=@@@@@EUU@@B@@@@@@@@@H') ; colorMapFromArray:#[0 0 0 255 255 255 127 127 127 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@C?0@C?0@C?0@O?0@O?0@O?0@??@@??@@??LC?<\C?<\C?<8O?08O?10O?10??C ??[@??_@?<^@?<_@?<_@') ; yourself); yourself]
+        constantNamed:#'NewChangesBrowser class applyToEndIcon'
+        ifAbsentPut:[(Depth4Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[4]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@DP@@@@@@@@@@@@DQ@@@@@@@@@@@@@QD@@@"H"H"@@Q@QD@@@BH"H"H@ADQD@@@@@@@@@ @@QDP@@BH"H"HB@@@DP@@@H"H"H @@@@@@@@@@@@@B@@@@@@
+@@L3L3L0H@@@@@@@@3L3L3@@@@@@@@@@@@@@L@@B@@@@@3L3L3@0@@@B@@@CL3L3L@@@H@@@@@@@@@@0@@@@H@@ADQDQDC@@@ @@@@DQDQDP@@@@@ @@@@@@
+@A@@@B@@@@DQDQDPD@@ @@@@@SL3DQ@@@@@@@@@AL3L3D@@@@@@@@@DQDQDP@@@@@ @@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 127 127 127 170 170 170 255 0 0]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A@@@CC?0CC?0&C?0<O?0\O?0HO?0@??@@??@@??LC?<\C?<\C?<8O?08O?10O?10??C ??[@??_@?<^@?<_@?<_@') ; yourself); yourself]
 !
 
 compressIcon
@@ -314,6 +493,50 @@
     ^Icon
 	constantNamed:#'NewChangesBrowser findNextSnapshotIcon'
 	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@DA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@B@@@@@@@@@@@@@@@E@@@@@@@@@EUUUW@N@F***(@@@F***(@@@F***(@@@F***(@@@F***(@@@F***(@@@V***(@H@F***(@@@F***(@@@F***(@@@F***(@@@F***(@@@L@@@@@@') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@G @@G @@G @@_8@@O0@@G @@C@@@@@@C??@C??@C??@C??@C??@C??BC??BC??BC??BC??@C??@C??@C??@C??@') ; yourself); yourself]
+!
+
+findPreviousForClassIcon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self findPreviousForClassIcon inspect
+     ImageEditor openOnClass:self andSelector:#findPreviousForClassIcon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'NewChangesBrowser class findPreviousForClassIcon'
+        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@EUUUW@A@G???<@@@G???<@@@G???<@@@G???<@@@G???<@@@G???<@@@G???<@A@G???<@M@G???<@H@G???<@@@G???<@@@G???<@I@L@@@@@@@@@@@@@A
+@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??B@@@B@C@B@G B@O0@@_8@@G @@G @@G @') ; yourself); yourself]
+!
+
+findPreviousSnapshotIcon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self findPreviousSnapshotIcon inspect
+     ImageEditor openOnClass:self andSelector:#findPreviousSnapshotIcon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'NewChangesBrowser class findPreviousSnapshotIcon'
+        ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@EUUUW@A@F***(@@@F***(@@@F***(@@@F***(@@@F***(@@@F***(@@@F***(@A@F***(@M@F***(@H@F***(@@@F***(@@@F***(@I@L@@@@@@@@@@@@@A
+@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 170 170 170]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??@C??B@@@B@C@B@G B@O0@@_8@@G @@G @@G @') ; yourself); yourself]
 ! !
 
 !NewChangesBrowser class methodsFor:'interface specs'!
@@ -553,62 +776,81 @@
 
     <resource: #tableColumns>
 
-
-    ^ #(
-	#(#DataSetColumnSpec
-	   #rendererType: #rowSelector
-	   #backgroundSelector: #listColor
-	   #showSelectionHighLighted: false
+    ^#(
+      (DataSetColumnSpec
+         labelButtonType: Button
+         rendererType: rowSelector
+         backgroundSelector: listColor
+         showSelectionHighLighted: false
+       )
+      (DataSetColumnSpec
+         label: 'Change'
+         id: change
+         labelAlignment: left
+         labelButtonType: Button
+         model: string
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Change'
-	   #id: #change
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #string
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Class'
+         id: 'className'
+         labelAlignment: left
+         activeHelpKey: ''
+         labelButtonType: Button
+         model: className
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Category'
-	   #id: #category
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #category
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Selector'
+         id: 'selector'
+         labelAlignment: left
+         activeHelpKey: ''
+         labelButtonType: Button
+         model: selector
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Delta Info'
-	   #id: #deltaInfo
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #delta
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Category'
+         id: category
+         labelAlignment: left
+         labelButtonType: Button
+         model: category
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Time Stamp'
-	   #id: #timeStamp
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #timeStamp
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Delta Info'
+         id: deltaInfo
+         labelAlignment: left
+         labelButtonType: Button
+         model: delta
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Type'
-	   #id: #type
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #type
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Time Stamp'
+         id: timeStamp
+         labelAlignment: left
+         labelButtonType: Button
+         model: timeStamp
+         canSelect: false
        )
-	#(#DataSetColumnSpec
-	   #label: 'Position'
-	   #id: #position
-	   #translateLabel: true
-	   #labelAlignment: #left
-	   #model: #positions
-	   #canSelect: false
+      (DataSetColumnSpec
+         label: 'Type'
+         id: type
+         labelAlignment: left
+         labelButtonType: Button
+         model: type
+         canSelect: false
        )
-     )
+      (DataSetColumnSpec
+         label: 'Position'
+         id: position
+         labelAlignment: left
+         labelButtonType: Button
+         model: positions
+         canSelect: false
+       )
+      )
+    
 ! !
 
 !NewChangesBrowser class methodsFor:'menu specs'!
@@ -627,336 +869,364 @@
 
     <resource: #menu>
 
-    ^
-
-       #(#Menu
-
-	   #(
-	     #(#MenuItem
-		#label: 'About'
-		#translateLabel: true
-		#activeHelpKey: #about
-		#labelImage: #(#ResourceRetriever nil #menuIcon)
-		#submenuChannel: #menuAbout
-	    )
-	     #(#MenuItem
-		#label: 'File'
-		#translateLabel: true
-		#activeHelpKey: #file
-		#submenu:
-		 #(#Menu
-
-		     #(
-		       #(#MenuItem
-			  #label: 'Reload'
-			  #translateLabel: true
-			  #value: #doReload
-			  #activeHelpKey: #fileReload
-			  #enabled: #valueOfNotReading
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Load...'
-			  #translateLabel: true
-			  #value: #doLoad
-			  #activeHelpKey: #fileLoad
-			  #enabled: #valueOfNotSaving
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Save'
-			  #translateLabel: true
-			  #value: #doSave
-			  #activeHelpKey: #fileSave
-			  #enabled: #valueOfNotReading
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Browse Class'
-			  #translateLabel: true
-			  #value: #doBrowseClass
-			  #activeHelpKey: #fileBrowseClass
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Exit'
-			  #translateLabel: true
-			  #value: #closeRequest
-			  #activeHelpKey: #fileExit
-			  #enabled: #valueOfNotSaving
-		      )
-		    ) nil
-		    nil
-		)
-	    )
-	     #(#MenuItem
-		#label: 'Apply'
-		#translateLabel: true
-		#submenu:
-		 #(#Menu
-
-		     #(
-		       #(#MenuItem
-			  #label: 'Change'
-			  #translateLabel: true
-			  #value: #doApply
-			  #activeHelpKey: #applyLine
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'All'
-			  #translateLabel: true
-			  #value: #doApplyAll
-			  #activeHelpKey: #applyAll
-			  #enabled: #valueOfNotReading
-		      )
-		       #(#MenuItem
-			  #label: 'To End'
-			  #translateLabel: true
-			  #value: #doApplyToEnd
-			  #activeHelpKey: #applyToEnd
-			  #enabled: #valueOfHavingSelection
-		      )
-		       #(#MenuItem
-			  #label: 'All for Class'
-			  #translateLabel: true
-			  #value: #doApplyAllForClass
-			  #activeHelpKey: #applyForClassToEnd
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: 'For Class to End'
-			  #translateLabel: true
-			  #value: #doApplyForClassToEnd
-			  #activeHelpKey: #applyForClassToEnd
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'From last Snapshot'
-			  #translateLabel: true
-			  #value: #doApplyFromLastSnapshot
-			  #activeHelpKey: #applyFromLastSnapshot
-			  #enabled: #valueOfNotReading
-		      )
-		    ) nil
-		    nil
-		)
-	    )
-	     #(#MenuItem
-		#label: 'Delete'
-		#translateLabel: true
-		#activeHelpKey: #edit
-		#submenu:
-		 #(#Menu
-
-		     #(
-		       #(#MenuItem
-			  #label: 'Change'
-			  #translateLabel: true
-			  #value: #doDelete
-			  #activeHelpKey: #deleteLine
-			  #enabled: #valueOfHavingSelection
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'All'
-			  #translateLabel: true
-			  #value: #doDeleteAll
-			  #activeHelpKey: #deleteAll
-			  #enabled: #valueOfNotReading
-		      )
-		       #(#MenuItem
-			  #label: 'To End'
-			  #translateLabel: true
-			  #value: #doDeleteToEnd
-			  #activeHelpKey: #deleteToEnd
-			  #enabled: #valueOfHavingSelection
-		      )
-		       #(#MenuItem
-			  #label: 'All for Class'
-			  #translateLabel: true
-			  #value: #doDeleteAllForClass
-			  #activeHelpKey: #applyForClassToEnd
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: 'For Class to End'
-			  #translateLabel: true
-			  #value: #doDeleteForClassToEnd
-			  #activeHelpKey: #deleteForClassToEnd
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Compress'
-			  #translateLabel: true
-			  #value: #doCompress
-			  #activeHelpKey: #deleteCompress
-			  #enabled: #valueOfNotReading
-		      )
-		       #(#MenuItem
-			  #label: 'Compress for Class'
-			  #translateLabel: true
-			  #value: #doCompressForClass
-			  #activeHelpKey: #deleteCompressForClass
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		    ) nil
-		    nil
-		)
-	    )
-	     #(#MenuItem
-		#label: 'Test'
-		#translateLabel: true
-		#activeHelpKey: #test
-		#submenu:
-		 #(#Menu
-
-		     #(
-		       #(#MenuItem
-			  #label: 'Find last Snapshot'
-			  #translateLabel: true
-			  #value: #doFindSnapshot:
-			  #activeHelpKey: #testFindLastSnapshot
-			  #enabled: #valueOfHavingSelection
-			  #argument: 'last'
-		      )
-		       #(#MenuItem
-			  #label: 'Find next Snapshot'
-			  #translateLabel: true
-			  #value: #doFindSnapshot:
-			  #activeHelpKey: #testFindNextSnapshot
-			  #enabled: #valueOfHavingSelection
-			  #argument: 'next'
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Compare with Current Version'
-			  #translateLabel: true
-			  #value: #doCompare
-			  #activeHelpKey: #testCompareWithCurrentVersion
-			  #enabled: #valueOfHavingChangeSelection
-		      )
-		    ) nil
-		    nil
-		)
-	    )
-	     #(#MenuItem
-		#label: 'Settings'
-		#translateLabel: true
-		#activeHelpKey: #settings
-		#submenu:
-		 #(#Menu
-
-		     #(
-		       #(#MenuItem
-			  #label: 'Auto Update'
-			  #translateLabel: true
-			  #activeHelpKey: #settingsAutoUpdate
-			  #enabled: #valueOfNotReading
-			  #indication: #autoUpdateMode:
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Private Classes as Separate'
-			  #translateLabel: true
-			  #activeHelpKey: #settingsPrivateAsSeparate
-			  #enabled: #valueOfNotReading
-			  #indication: #privateAsSeparate:
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Columns'
-			  #translateLabel: true
-			  #activeHelpKey: #settingsColumns
-			  #submenu:
-			   #(#Menu
-
-			       #(
-				 #(#MenuItem
-				    #label: 'Category'
-				    #activeHelpKey: #settingsColumnsCategory
-				    #indication: #categoryColumn:
-				)
-				 #(#MenuItem
-				    #label: 'Delta Info'
-				    #activeHelpKey: #settingsColumnsDeltaInfo
-				    #indication: #deltaInfoColumn:
-				)
-				 #(#MenuItem
-				    #label: 'Type'
-				    #activeHelpKey: #settingsColumnsType
-				    #indication: #typeColumn:
-				)
-				 #(#MenuItem
-				    #label: 'Time Stamp'
-				    #activeHelpKey: #settingsColumnsTimeStamp
-				    #indication: #timeStampColumn:
-				)
-				 #(#MenuItem
-				    #label: 'Positions'
-				    #activeHelpKey: #settingsColumnsPosition
-				    #indication: #positionsColumn:
-				)
-			      ) nil
-			      nil
-			  )
-		      )
-		       #(#MenuItem
-			  #label: '-'
-		      )
-		       #(#MenuItem
-			  #label: 'Fonts'
-			  #translateLabel: true
-			  #enabled: #valueOfNotReading
-			  #submenuChannel: #menuFont
-		      )
-		    ) nil
-		    nil
-		)
-	    )
-	     #(#MenuItem
-		#label: 'History'
-		#translateLabel: true
-		#submenuChannel: #menuHistory
-	    )
-	     #(#MenuItem
-		#label: 'Help'
-		#translateLabel: true
-		#startGroup: #right
-		#activeHelpKey: #help
-		#submenuChannel: #menuHelp
-	    )
-	  ) nil
-	  nil
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            activeHelpKey: file
+            label: 'File'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: fileReload
+                  enabled: valueOfNotReading
+                  label: 'Reload'
+                  itemValue: doReload
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileLoad
+                  enabled: valueOfNotSaving
+                  label: 'Load...'
+                  itemValue: doLoad
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileSave
+                  enabled: valueOfNotReading
+                  label: 'Save'
+                  itemValue: doSave
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileBrowseClass
+                  enabled: valueOfHavingChangeSelection
+                  label: 'Browse Class'
+                  itemValue: doBrowseClass
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileExit
+                  enabled: valueOfNotSaving
+                  label: 'Exit'
+                  itemValue: closeRequest
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            label: 'Apply'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: applyLine
+                  enabled: valueOfHavingChangeSelection
+                  label: 'Change'
+                  itemValue: doApply
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: applyAll
+                  enabled: valueOfNotReading
+                  label: 'All'
+                  itemValue: doApplyAll
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: applyToEnd
+                  enabled: valueOfHavingSelection
+                  label: 'To End'
+                  itemValue: doApplyToEnd
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: applyForClassToEnd
+                  enabled: valueOfHavingChangeSelection
+                  label: 'All for Class'
+                  itemValue: doApplyAllForClass
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: applyForClassToEnd
+                  enabled: valueOfHavingChangeSelection
+                  label: 'For Class to End'
+                  itemValue: doApplyForClassToEnd
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: applyFromLastSnapshot
+                  enabled: valueOfNotReading
+                  label: 'From Last Snapshot'
+                  itemValue: doApplyFromLastSnapshot
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            activeHelpKey: edit
+            label: 'Delete'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: deleteLine
+                  enabled: valueOfHavingSelection
+                  label: 'Change'
+                  itemValue: doDelete
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: deleteAll
+                  enabled: valueOfNotReading
+                  label: 'All'
+                  itemValue: doDeleteAll
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: deleteToEnd
+                  enabled: valueOfHavingSelection
+                  label: 'To End'
+                  itemValue: doDeleteToEnd
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: applyForClassToEnd
+                  enabled: valueOfHavingChangeSelection
+                  label: 'All for Class'
+                  itemValue: doDeleteAllForClass
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: deleteForClassToEnd
+                  enabled: valueOfHavingChangeSelection
+                  label: 'For Class to End'
+                  itemValue: doDeleteForClassToEnd
+                  translateLabel: true
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: deleteCompress
+                  enabled: valueOfNotReading
+                  label: 'Compress'
+                  itemValue: doCompress
+                  translateLabel: true
+                )
+               (MenuItem
+                  activeHelpKey: deleteCompressForClass
+                  enabled: valueOfHavingChangeSelection
+                  label: 'Compress for Class'
+                  itemValue: doCompressForClass
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            activeHelpKey: test
+            label: 'Search'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: testFindPreviousSnapshot
+                  enabled: valueOfHavingSelection
+                  label: 'Find Previous Snapshot'
+                  itemValue: doFindSnapshot:
+                  translateLabel: true
+                  argument: 'previous'
+                )
+               (MenuItem
+                  activeHelpKey: testFindNextSnapshot
+                  enabled: valueOfHavingSelection
+                  label: 'Find Next Snapshot'
+                  itemValue: doFindSnapshot:
+                  translateLabel: true
+                  argument: 'next'
+                )
+               (MenuItem
+                  activeHelpKey: testFindLastSnapshot
+                  enabled: valueOfHavingSelection
+                  label: 'Find Last Snapshot'
+                  itemValue: doFindSnapshot:
+                  translateLabel: true
+                  argument: 'last'
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            activeHelpKey: test
+            label: 'Test'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: testCompareWithCurrentVersion
+                  enabled: valueOfHavingChangeSelection
+                  label: 'Compare with Current Version'
+                  itemValue: doCompare
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            activeHelpKey: settings
+            label: 'Settings'
+            translateLabel: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  activeHelpKey: settingsAutoUpdate
+                  enabled: valueOfNotReading
+                  label: 'Auto Update'
+                  translateLabel: true
+                  indication: autoUpdateMode:
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: settingsPrivateAsSeparate
+                  enabled: valueOfNotReading
+                  label: 'Private Classes as Separate'
+                  translateLabel: true
+                  indication: privateAsSeparate:
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: settingsColumns
+                  label: 'Columns'
+                  translateLabel: true
+                  submenu: 
+                 (Menu
+                    (
+                     (MenuItem
+                        activeHelpKey: settingsColumnsClassName
+                        label: 'Class'
+                        translateLabel: true
+                        isVisible: false
+                        hideMenuOnActivated: false
+                        indication: classNameColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsCategory
+                        label: 'Selector'
+                        translateLabel: true
+                        isVisible: false
+                        hideMenuOnActivated: false
+                        indication: selectorColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsCategory
+                        label: 'Category'
+                        translateLabel: true
+                        hideMenuOnActivated: false
+                        indication: categoryColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsDeltaInfo
+                        label: 'Delta Info'
+                        translateLabel: true
+                        hideMenuOnActivated: false
+                        indication: deltaInfoColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsType
+                        label: 'Type'
+                        translateLabel: true
+                        hideMenuOnActivated: false
+                        indication: typeColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsTimeStamp
+                        label: 'Time Stamp'
+                        translateLabel: true
+                        hideMenuOnActivated: false
+                        indication: timeStampColumn:
+                      )
+                     (MenuItem
+                        activeHelpKey: settingsColumnsPosition
+                        label: 'Positions'
+                        translateLabel: true
+                        hideMenuOnActivated: false
+                        indication: positionsColumn:
+                      )
+                     )
+                    nil
+                    nil
+                  )
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  enabled: valueOfNotReading
+                  label: 'Fonts'
+                  translateLabel: true
+                  submenuChannel: menuFont
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            activeHelpKey: help
+            label: 'MENU_Help'
+            translateLabel: true
+            startGroup: conditionalRight
+            submenuChannel: menuHelp
+          )
+         )
+        nil
+        nil
       )
-
-    "Modified: / 19.5.1998 / 18:17:27 / cg"
 !
 
 menuTable
@@ -1078,107 +1348,113 @@
 
     <resource: #menu>
 
-    ^
-
-       #(#Menu
-
-	   #(
-	     #(#MenuItem
-		#label: 'Load'
-		#isButton: true
-		#value: #doLoad
-		#activeHelpKey: #fileLoad
-		#enabled: #valueOfNotReading
-		#labelImage: #(#ResourceRetriever #Icon #loadIcon)
-	    )
-	     #(#MenuItem
-		#label: 'Save'
-		#isButton: true
-		#value: #doSave
-		#activeHelpKey: #fileSave
-		#enabled: #valueOfNotSaving
-		#labelImage: #(#ResourceRetriever #Icon #saveIcon)
-	    )
-	     #(#MenuItem
-		#label: ''
-	    )
-	     #(#MenuItem
-		#label: 'Compress'
-		#isButton: true
-		#value: #doCompress
-		#activeHelpKey: #deleteCompress
-		#enabled: #valueOfNotReading
-		#labelImage: #(#ResourceRetriever nil #compressIcon)
-	    )
-	     #(#MenuItem
-		#label: ''
-	    )
-	     #(#MenuItem
-		#label: 'Apply'
-		#isButton: true
-		#value: #doApply
-		#activeHelpKey: #applyLine
-		#enabled: #valueOfHavingChangeSelection
-		#labelImage: #(#ResourceRetriever nil #applyIcon)
-	    )
-	     #(#MenuItem
-		#label: 'Apply To End'
-		#isButton: true
-		#value: #doApplyToEnd
-		#activeHelpKey: #applyToEnd
-		#enabled: #valueOfHavingSelection
-		#labelImage: #(#ResourceRetriever nil #applyToEndIcon)
-	    )
-	     #(#MenuItem
-		#label: 'Apply From Last Snapshot'
-		#isButton: true
-		#value: #doApplyFromLastSnapshot
-		#activeHelpKey: #applyFromLastSnapshot
-		#enabled: #valueOfNotReading
-		#labelImage: #(#ResourceRetriever nil #applyFromLastSnapshotIcon)
-	    )
-	     #(#MenuItem
-		#label: ''
-	    )
-	     #(#MenuItem
-		#label: 'Delete'
-		#isButton: true
-		#value: #doDelete
-		#activeHelpKey: #deleteLine
-		#enabled: #valueOfHavingSelection
-		#labelImage: #(#ResourceRetriever nil #deleteIcon)
-	    )
-	     #(#MenuItem
-		#label: 'Delete To End'
-		#isButton: true
-		#value: #doDeleteToEnd
-		#activeHelpKey: #deleteToEnd
-		#enabled: #valueOfHavingSelection
-		#labelImage: #(#ResourceRetriever nil #deleteToEndIcon)
-	    )
-	     #(#MenuItem
-		#label: ''
-	    )
-	     #(#MenuItem
-		#label: 'Find Last Snapshot'
-		#isButton: true
-		#value: #doFindSnapshot:
-		#activeHelpKey: #testFindLastSnapshot
-		#enabled: #valueOfHavingSelection
-		#argument: 'last'
-		#labelImage: #(#ResourceRetriever nil #findLastSnapshotIcon)
-	    )
-	     #(#MenuItem
-		#label: 'Find Next Snapshot'
-		#isButton: true
-		#value: #doFindSnapshot:
-		#activeHelpKey: #testFindNextSnapshot
-		#enabled: #valueOfHavingSelection
-		#argument: 'next'
-		#labelImage: #(#ResourceRetriever nil #findNextSnapshotIcon)
-	    )
-	  ) nil
-	  nil
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            activeHelpKey: fileLoad
+            enabled: valueOfNotReading
+            label: 'Load'
+            itemValue: doLoad
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever XPToolbarIconLibrary loadFromFileIcon)
+          )
+         (MenuItem
+            activeHelpKey: fileSave
+            enabled: valueOfNotSaving
+            label: 'Save'
+            itemValue: doSave
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever XPToolbarIconLibrary saveToFileIcon)
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            activeHelpKey: applyLine
+            enabled: valueOfHavingChangeSelection
+            label: 'Apply'
+            itemValue: doApply
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil applyIcon)
+          )
+         (MenuItem
+            activeHelpKey: applyToEnd
+            enabled: valueOfHavingSelection
+            label: 'Apply To End'
+            itemValue: doApplyToEnd
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil applyToEndIcon)
+          )
+         (MenuItem
+            activeHelpKey: applyFromLastSnapshot
+            enabled: valueOfNotReading
+            label: 'Apply From Last Snapshot'
+            itemValue: doApplyFromLastSnapshot
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil applyFromLastSnapshotIcon)
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            activeHelpKey: deleteLine
+            enabled: valueOfHavingSelection
+            label: 'Delete'
+            itemValue: doDelete
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil deleteIcon)
+          )
+         (MenuItem
+            activeHelpKey: deleteToEnd
+            enabled: valueOfHavingSelection
+            label: 'Delete To End'
+            itemValue: doDeleteToEnd
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil deleteToEndIcon)
+          )
+         (MenuItem
+            activeHelpKey: deleteCompress
+            enabled: valueOfNotReading
+            label: 'Compress'
+            itemValue: doCompress
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil compressIcon)
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            activeHelpKey: testFindPreviousSnapshot
+            enabled: valueOfHavingSelection
+            label: 'Find Previous Snapshot'
+            itemValue: doFindSnapshot:
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil findPreviousSnapshotIcon)
+            argument: 'previous'
+          )
+         (MenuItem
+            activeHelpKey: testFindNextSnapshot
+            enabled: valueOfHavingSelection
+            label: 'Find Next Snapshot'
+            itemValue: doFindSnapshot:
+            translateLabel: true
+            isButton: true
+            labelImage: (ResourceRetriever nil findNextSnapshotIcon)
+            argument: 'next'
+          )
+         )
+        nil
+        nil
       )
 ! !
 
@@ -1198,6 +1474,34 @@
     "Modified: / 19.5.1998 / 20:30:13 / cg"
 !
 
+classAndSelectorColumn
+    "returns whether the column for the category attribute of the changes is shown"
+
+    ^ClassAndSelectorColumn ? (ClassAndSelectorColumn := false)
+!
+
+classAndSelectorColumn: aBoolean
+    "sets whether the column for the category attribute of the changes is shown"
+
+    self changeColumn: #classAndSelector add: (ClassAndSelectorColumn := aBoolean)
+
+    "Modified: / 19.5.1998 / 20:30:13 / cg"
+!
+
+classNameColumn
+    "returns whether the column for the category attribute of the changes is shown"
+
+    ^ClassNameColumn ? (ClassNameColumn := false)
+!
+
+classNameColumn: aBoolean
+    "sets whether the column for the className attribute of the changes is shown"
+
+    self changeColumn: #className add: (ClassNameColumn := aBoolean)
+
+    "Modified: / 19.5.1998 / 20:30:13 / cg"
+!
+
 deltaInfoColumn
     "returns whether the column for the delta info attribute of the changes is shown"
 
@@ -1227,6 +1531,20 @@
     "Modified: / 19.5.1998 / 20:30:37 / cg"
 !
 
+selectorColumn
+    "returns whether the column for the category attribute of the changes is shown"
+
+    ^SelectorColumn ? (SelectorColumn := false)
+!
+
+selectorColumn: aBoolean
+    "sets whether the column for the category attribute of the changes is shown"
+
+    self changeColumn: #selector add: (SelectorColumn := aBoolean)
+
+    "Modified: / 19.5.1998 / 20:30:13 / cg"
+!
+
 timeStampColumn
     "returns whether the column for the time stamp attribute of the changes is shown"
 
@@ -1300,14 +1618,18 @@
 
     |holder|
     (holder := builder bindingAt:#listOfChangeColumns) isNil ifTrue:[
-	builder aspectAt:#listOfChangeColumns put:(holder := List new).
-	self changeColumn: nil add: true.
-	self changeColumn: #change add: true.
-	self categoryColumn: self categoryColumn.
-	self timeStampColumn: self timeStampColumn.
-	self typeColumn: self typeColumn.
+        builder aspectAt:#listOfChangeColumns put:(holder := List new).
+        self changeColumn: nil add: true.
+        self changeColumn: #change add: true.
+
+        self classNameColumn: self classNameColumn.
+        self classAndSelectorColumn: self classAndSelectorColumn.
+        self selectorColumn: self selectorColumn.
+        self categoryColumn: self categoryColumn.
+        self timeStampColumn: self timeStampColumn.
+        self typeColumn: self typeColumn.
 "/        self deltaInfoColumn: self deltaInfoColumn.
-	self positionsColumn: self positionsColumn.
+        self positionsColumn: self positionsColumn.
     ].
     ^ holder
 
@@ -1434,18 +1756,10 @@
 
     super update:something with:aParameter from:changedObject.
 
-    changedObject == self valueOfFilter
-    ifTrue:
-    [
-	filterCompletionBlock value: changedObject value.
-	self listOfChanges size > 0 ifTrue: [self addToHistory: changedObject value -> #doFilter:]
+    changedObject == self valueOfFilter ifTrue:[
+        filterCompletionBlock value: changedObject value.
+        self listOfChanges size > 0 ifTrue: [self addToHistory: changedObject value -> #doFilter:]
     ]
-
-
-
-
-
-
 !
 
 updateChannels
@@ -1504,33 +1818,32 @@
 
     (skipSignal notNil) ifTrue:[
 
-	self changeTextEditor highlightingErrorPosition:relPos to:relEndPos do:[
-	    |box|
-
-	    "
-	     start dialog - make certain cleanup is done
-	    "
-	    action := OptionBox
-			  request:aString
-			  label:'Error'
-			  form:(WarningBox iconBitmap)
-			  buttonLabels:#('cancel' 'skip' 'continue')
-			  values:#(#abort #skip #continue)
-			  default:#continue.
-	].
-
-	action == #abort ifTrue:[
-	    Object abortSignal raise.
-	    ^ false
-	].
-	action == #skip ifTrue:[
-	    skipSignal raise.
-	    ^ false
-	].
-	^  false
+        self changeTextEditor highlightingErrorPosition:relPos to:relEndPos do:[
+            |box|
+
+            "
+             start dialog - make certain cleanup is done
+            "
+            action := OptionBox
+                          request:aString
+                          label:'Error'
+                          image:(WarningBox iconBitmap)
+                          buttonLabels:#('cancel' 'skip' 'continue')
+                          values:#(#abort #skip #continue)
+                          default:#continue.
+        ].
+
+        action == #abort ifTrue:[
+            Object abortSignal raise.
+            ^ false
+        ].
+        action == #skip ifTrue:[
+            skipSignal raise.
+            ^ false
+        ].
+        ^  false
     ].
     ^self changeTextEditor error:aString position:relPos to:relEndPos from:aCompiler
-
 !
 
 warning:aString position:relPos to:relEndPos from:aCompiler
@@ -1550,6 +1863,10 @@
 
 
 
+!
+
+openDocumentation
+   self openHTMLDocument:'tools/cbrowser/TOP.html'.
 ! !
 
 !NewChangesBrowser methodsFor:'initialization'!
@@ -1710,18 +2027,14 @@
     |newListOfChangeColumns|
 
     newListOfChangeColumns := self listOfChangeColumns asOrderedCollection.
-    addOrRemove
-    ifTrue:
-    [
-	newListOfChangeColumns add:
-	    ((self class tableColumnsForChangeAttributes
-		collect: [:i| i decodeAsLiteralArray])
-		    detect: [:column| column id = aColumnId])
-    ]
-    ifFalse:
-    [
-	newListOfChangeColumns remove:
-	    (self listOfChangeColumns detect: [:column| column id = aColumnId] ifNone: nil) ifAbsent: nil
+    addOrRemove ifTrue:[
+        newListOfChangeColumns add:
+            ((self class tableColumnsForChangeAttributes
+                collect: [:i| i decodeAsLiteralArray])
+                    detect: [:column| column id = aColumnId])
+    ] ifFalse:[
+        newListOfChangeColumns remove:
+            (self listOfChangeColumns detect: [:column| column id = aColumnId] ifNone: nil) ifAbsent: nil
     ].
     self listOfChangeColumns contents: newListOfChangeColumns.
     self autoSelectLast
@@ -2372,17 +2685,17 @@
      and a list of chunk-positions (changePositions).
      Starting with 2.10.3, the entries are multi-col entries;
      the cols are:
-	1   delta (only if comparing)
-		'+' -> new method (w.r.t. current state)
-		'-' -> removed method (w.r.t. current state)
-		'?' -> class does not exist currently
-		'=' -> change is same as current methods source
-	2   class/selector
-	3   type of change
-		doit
-		method
-		category change
-	4   timestamp
+        1   delta (only if comparing)
+                '+' -> new method (w.r.t. current state)
+                '-' -> removed method (w.r.t. current state)
+                '?' -> class does not exist currently
+                '=' -> change is same as current methods source
+        2   class/selector
+        3   type of change
+                doit
+                method
+                category change
+        4   timestamp
 
      since comparing slows down startup time, it is now disabled by
      default and can be enabled via a toggle."
@@ -2413,324 +2726,329 @@
     v notNil ifTrue:[v label: 'Read:'; redraw].
 
     self withReadCursorDo:[
-	|myProcess myPriority|
-
-	"
-	 this is a time consuming operation (especially, if reading an
-	 NFS-mounted directory; therefore lower my priority...
-	"
-	inBackground ifTrue:[
-	    myProcess := Processor activeProcess.
-	    myPriority := myProcess priority.
-	    myProcess priority:(Processor userBackgroundPriority).
-	].
-
-	[
-	    |excla timeStampInfo lastChange|
-
-	    excla := aStream class chunkSeparator.
-
-	    [aStream atEnd] whileFalse:[
-		|change changeDelta changeString changeType changeCategory
-		 line s l changeClass sawExcla category
-		 chunkText chunkPos sel oldValue|
-
-		change := Change new.
-		"
-		 get a chunk (separated by excla)
-		"
-		oldValue := self valueOfReadProgress value.
-		self valueOfReadProgress value: (((aStream position/aStream size) * 100) rounded).
+        |myProcess myPriority|
+
+        "
+         this is a time consuming operation (especially, if reading an
+         NFS-mounted directory; therefore lower my priority...
+        "
+        inBackground ifTrue:[
+            myProcess := Processor activeProcess.
+            myPriority := myProcess priority.
+            myProcess priority:(Processor userBackgroundPriority).
+        ].
+
+        [
+            |excla timeStampInfo lastChange|
+
+            excla := aStream class chunkSeparator.
+
+            [aStream atEnd] whileFalse:[
+                |change changeDelta changeString changeType changeCategory
+                 line s l changeClass sawExcla category className selector
+                 chunkText chunkPos sel oldValue|
+
+                change := Change new.
+                "
+                 get a chunk (separated by excla)
+                "
+                oldValue := self valueOfReadProgress value.
+                self valueOfReadProgress value: (((aStream position/aStream size) * 100) rounded).
 "/                oldValue ~~ self valueOfReadProgress value
 "/                    ifTrue: [self readProgressIndicator redrawEdges;redraw].
 
-		aStream skipSeparators.
-		chunkPos := aStream position.
-
-		sawExcla := aStream peekFor:excla.
-		chunkText := aStream nextChunk.
-		chunkText notNil ifTrue:[
-		    |index headerLine cls|
-
-		    (chunkText startsWith:'''---- timestamp ') ifTrue:[
-			timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
-		    ] ifFalse:[
-
-			"
-			 only first line is saved in changeChunks...
-			"
-			index := chunkText indexOf:(Character cr).
-			(index ~~ 0) ifTrue:[
-			    chunkText := chunkText copyTo:(index - 1).
-
-			    "take care for comment changes - must still be a
-			     valid expression for classNameOfChange: to work"
-
-			    (chunkText endsWith:'comment:''') ifTrue:[
-				chunkText := chunkText , '...'''
-			    ].
-			    (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
-				sel := 'primitiveDefinitions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveVariables:''') ifTrue:[
-				sel := 'primitiveVariables:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
-				sel := 'primitiveFunctions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			].
-
-			change chunk: chunkText.
-			change position: chunkPos.
-			lastChange notNil ifTrue: [lastChange lastPosition: chunkPos - 1].
-			lastChange := change.
-			change timeStamp: timeStampInfo.
-			change followUp: false.
-			headerLine := nil.
-			changeDelta := ' '.
-
-			sawExcla ifFalse:[
-			    (chunkText startsWith:'''---- snap') ifTrue:[
-				changeType := ''.
-				headerLine := chunkText.
-				changeString := (chunkText contractTo:maxLen).
-				timeStampInfo := nil.
-			    ] ifFalse:[
-
-				|p cls|
-
-				headerLine := chunkText , ' (doIt)'.
-
-				"
-				 first, assume doIt - then lets have a more detailed look...
-				"
-				((chunkText startsWith:'''---- file')
-				or:[(chunkText startsWith:'''---- check')]) ifTrue:[
-				    changeType := ''.
-				    timeStampInfo := nil.
-				] ifFalse:[
-				    changeType := 'doIt'.
-				].
-				changeString := (chunkText contractTo:maxLen).
-
-				p := Parser parseExpression:chunkText inNameSpace:Smalltalk.
-				(p notNil
-				 and:[p ~~ #Error
-				 and:[p isMessage]]) ifTrue:[
-				    sel := p selector.
-				].
-				(sel == #removeSelector:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    sel := (p args at:1) evaluate.
-
-				    DeltaInfoColumn ifTrue:[
-					(changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
-					    changeDelta := '?'
-					] ifFalse:[
-					    (changeClass implements:sel asSymbol) ifTrue:[
-						changeDelta := '-'.
-					    ]
-					]
-				    ].
-				    changeType := 'remove'.
-				    changeString := self contractClass:cls selector:sel to:maxLen.
-				].
-				(p ~~ #Error
-				and:[p isMessage
-				and:[p receiver isMessage
-				and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[
-				    p receiver receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    (sel == #category:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := '(category change)'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				    (sel == #privacy:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := 'privacy change'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				].
-				(#(#'subclass:'
-				  #'variableSubclass:'
-				  #'variableByteSubclass:'
-				  #'variableWordSubclass:'
-				  #'variableLongSubclass:'
-				  #'variableFloatSubclass:'
-				  #'variableDoubleSubclass:'
-				  #'primitiveDefinitions:'
-				  #'primitiveFunctions:'
-				  #'primitiveVariables:'
-				 ) includes:sel) ifTrue:[
-				    changeType := 'class definition'.
-				].
-			    ]
-			] ifTrue:[
-			    |done first p className cls text methodPos|
-
-			    "
-			     method definitions actually consist of
-			     two (or more) chunks; skip next chunk(s)
-			     up to an empty one.
-			     The system only writes one chunk,
-			     and we cannot handle more in this ChangesBrowser....
-			    "
-			    className := nil.
-			    p := Parser parseExpression:chunkText inNameSpace:Smalltalk.
-
-			    (p notNil and:[p ~~ #Error]) ifTrue:[
-				sel := p selector.
-				(sel == #methodsFor:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					className := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:className) class.
-					className := className , ' class'.
-				    ] ifFalse:[
-					className := p receiver name.
-					changeClass := Smalltalk classNamed:className
-				    ].
-				    category := (p args at:1) evaluate.
-				].
-			    ].
-
-			    done := false.
-			    first := true.
-			    [done] whileFalse:[
-
-				changeDelta := ' '.
-				methodPos := aStream position.
-
-				text := aStream nextChunk.
-				text isNil ifTrue:[
-				    done := true
-				] ifFalse:[
-				    done := text isEmpty
-				].
-				done ifFalse:[
-				    first ifFalse:[
-					change := Change new.
-					change chunk: chunkText.
-					change string:changeString.
-					change position: methodPos.
-					change className: className.
-					lastChange notNil ifTrue: [lastChange lastPosition: methodPos - 1].
-					lastChange := change.
-					change timeStamp: timeStampInfo.
-					change followUp: true.
-					editingClassSource := true.
-				    ].
-
-				    first := false.
-				    "
-				     try to find the selector
-				    "
-				    sel := nil.
-				    className notNil ifTrue:[
-					p := Parser
-						 parseMethodSpecification:text
-						 in:nil
-						 ignoreErrors:true
-						 ignoreWarnings:true.
-					(p notNil and:[p ~~ #Error]) ifTrue:[
-					    sel := p selector.
-					]
-				    ].
-
-				    sel isNil ifTrue:[
-					changeString := (chunkText contractTo:maxLen).
-					changeType := 'change'.
-					headerLine := chunkText , ' (change)'.
-				    ] ifFalse:[
-					changeString :=  self contractClass:className selector:sel to:maxLen.
-					changeType := 'method definition'.
-					changeCategory := category.
-					headerLine := className , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
-				    ].
-
-				    DeltaInfoColumn ifTrue:[
-					changeClass isNil ifFalse:[
-					    changeClass isMeta ifTrue:[
-						cls := changeClass soleInstance
-					    ] ifFalse:[
-						cls := changeClass
-					    ].
-					].
-
-					(changeClass isNil or:[cls isLoaded not]) ifTrue:[
-					    changeDelta := '?'
-					] ifFalse:[
-					    (changeClass implements:sel asSymbol) ifFalse:[
-						changeDelta := '+'.
-					    ] ifTrue:[
-						|m currentText t1 t2|
-
-						m := changeClass compiledMethodAt:sel asSymbol.
-						currentText := m source.
-						currentText notNil ifTrue:[
-						    text asString = currentText asString ifTrue:[
-							changeDelta := '='
-						    ] ifFalse:[
-							t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
-							t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
-							t1 = t2 ifTrue:[
-							    changeDelta := '='
-							]
-						    ]
-						]
-					    ]
-					]
-				    ].
-				    change delta:changeDelta.
-				    change string:changeString.
-				    change type:changeType.
-				    change category: changeCategory.
-				    change timeStamp:timeStampInfo.
-				    changes add:change.
-				].
-				changeString := nil.
-				headerLine := nil.
-
-			    ]
-			].
-			changeString notNil ifTrue:[
-			    change delta:changeDelta.
-			    change string:changeString.
-			    change type:changeType.
-			    change timeStamp:timeStampInfo.
-			    changes add:change.
-
-			] ifFalse:[
-			    headerLine notNil ifTrue:[
-				changes add: change.
-			    ]
-			]
-		    ]
-		].
-		change lastPosition: aStream position.
-	    ].
-	    modified := false.
-
-	] valueNowOrOnUnwindDo:[
-	    aStream close.
-	    inBackground ifTrue:[myProcess priority:myPriority].
-	].
+                aStream skipSeparators.
+                chunkPos := aStream position.
+
+                sawExcla := aStream peekFor:excla.
+                chunkText := aStream nextChunk.
+                chunkText notNil ifTrue:[
+                    |index headerLine cls|
+
+                    (chunkText startsWith:'''---- timestamp ') ifTrue:[
+                        timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
+                    ] ifFalse:[
+
+                        "
+                         only first line is saved in changeChunks...
+                        "
+                        index := chunkText indexOf:(Character cr).
+                        (index ~~ 0) ifTrue:[
+                            chunkText := chunkText copyTo:(index - 1).
+
+                            "take care for comment changes - must still be a
+                             valid expression for classNameOfChange: to work"
+
+                            (chunkText endsWith:'comment:''') ifTrue:[
+                                chunkText := chunkText , '...'''
+                            ].
+                            (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
+                                sel := 'primitiveDefinitions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveVariables:''') ifTrue:[
+                                sel := 'primitiveVariables:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
+                                sel := 'primitiveFunctions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                        ].
+
+                        change chunk: chunkText.
+                        change position: chunkPos.
+                        lastChange notNil ifTrue: [lastChange lastPosition: chunkPos - 1].
+                        lastChange := change.
+                        change timeStamp: timeStampInfo.
+                        change followUp: false.
+                        headerLine := nil.
+                        changeDelta := ' '.
+
+                        sawExcla ifFalse:[
+                            (chunkText startsWith:'''---- snap') ifTrue:[
+                                changeType := ''.
+                                headerLine := chunkText.
+                                changeString := (chunkText contractTo:maxLen).
+                                timeStampInfo := nil.
+                            ] ifFalse:[
+
+                                |p cls|
+
+                                headerLine := chunkText , ' (doIt)'.
+
+                                "
+                                 first, assume doIt - then lets have a more detailed look...
+                                "
+                                ((chunkText startsWith:'''---- file')
+                                or:[(chunkText startsWith:'''---- check')]) ifTrue:[
+                                    changeType := ''.
+                                    timeStampInfo := nil.
+                                ] ifFalse:[
+                                    changeType := 'doIt'.
+                                ].
+                                changeString := (chunkText contractTo:maxLen).
+
+                                p := Parser parseExpression:chunkText inNameSpace:Smalltalk.
+                                (p notNil
+                                 and:[p ~~ #Error
+                                 and:[p isMessage]]) ifTrue:[
+                                    sel := p selector.
+                                ].
+                                (sel == #removeSelector:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    sel := (p args at:1) evaluate.
+
+                                    DeltaInfoColumn ifTrue:[
+                                        (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
+                                            changeDelta := '?'
+                                        ] ifFalse:[
+                                            (changeClass implements:sel asSymbol) ifTrue:[
+                                                changeDelta := '-'.
+                                            ]
+                                        ]
+                                    ].
+                                    changeType := 'remove'.
+                                    changeString := self contractClass:cls selector:sel to:maxLen.
+                                    className := cls.
+                                    selector := sel.
+                                ].
+                                (p notNil and:[p ~~ #Error
+                                and:[p isMessage
+                                and:[p receiver isMessage
+                                and:[p receiver selector == #compiledMethodAt:]]]]) ifTrue:[
+                                    p receiver receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    (sel == #category:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := '(category change)'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                    (sel == #privacy:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := 'privacy change'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                    className := cls.
+                                    selector := sel.
+                                ].
+                                (#(#'subclass:'
+                                  #'variableSubclass:'
+                                  #'variableByteSubclass:'
+                                  #'variableWordSubclass:'
+                                  #'variableLongSubclass:'
+                                  #'variableFloatSubclass:'
+                                  #'variableDoubleSubclass:'
+                                  #'primitiveDefinitions:'
+                                  #'primitiveFunctions:'
+                                  #'primitiveVariables:'
+                                 ) includes:sel) ifTrue:[
+                                    changeType := 'class definition'.
+                                ].
+                            ]
+                        ] ifTrue:[
+                            |done first p className cls text methodPos|
+
+                            "
+                             method definitions actually consist of
+                             two (or more) chunks; skip next chunk(s)
+                             up to an empty one.
+                             The system only writes one chunk,
+                             and we cannot handle more in this ChangesBrowser....
+                            "
+                            className := nil.
+                            p := Parser parseExpression:chunkText inNameSpace:Smalltalk.
+
+                            (p notNil and:[p ~~ #Error]) ifTrue:[
+                                sel := p selector.
+                                (sel == #methodsFor:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        className := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:className) class.
+                                        className := className , ' class'.
+                                    ] ifFalse:[
+                                        className := p receiver name.
+                                        changeClass := Smalltalk classNamed:className
+                                    ].
+                                    category := (p args at:1) evaluate.
+                                ].
+                            ].
+
+                            done := false.
+                            first := true.
+                            [done] whileFalse:[
+
+                                changeDelta := ' '.
+                                methodPos := aStream position.
+
+                                text := aStream nextChunk.
+                                text isNil ifTrue:[
+                                    done := true
+                                ] ifFalse:[
+                                    done := text isEmpty
+                                ].
+                                done ifFalse:[
+                                    first ifFalse:[
+                                        change := Change new.
+                                        change chunk: chunkText.
+                                        change string:changeString.
+                                        change position: methodPos.
+                                        change className: className.
+                                        lastChange notNil ifTrue: [lastChange lastPosition: methodPos - 1].
+                                        lastChange := change.
+                                        change timeStamp: timeStampInfo.
+                                        change followUp: true.
+                                        editingClassSource := true.
+                                    ].
+
+                                    first := false.
+                                    "
+                                     try to find the selector
+                                    "
+                                    sel := nil.
+                                    className notNil ifTrue:[
+                                        p := Parser
+                                                 parseMethodSpecification:text
+                                                 in:nil
+                                                 ignoreErrors:true
+                                                 ignoreWarnings:true.
+                                        (p notNil and:[p ~~ #Error]) ifTrue:[
+                                            sel := p selector.
+                                        ]
+                                    ].
+
+                                    sel isNil ifTrue:[
+                                        changeString := (chunkText contractTo:maxLen).
+                                        changeType := 'change'.
+                                        headerLine := chunkText , ' (change)'.
+                                    ] ifFalse:[
+                                        changeString :=  self contractClass:className selector:sel to:maxLen.
+                                        changeType := 'method definition'.
+                                        changeCategory := category.
+                                        headerLine := className , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
+                                        change selector:sel.
+                                    ].
+
+                                    DeltaInfoColumn ifTrue:[
+                                        changeClass isNil ifFalse:[
+                                            changeClass isMeta ifTrue:[
+                                                cls := changeClass soleInstance
+                                            ] ifFalse:[
+                                                cls := changeClass
+                                            ].
+                                        ].
+
+                                        (changeClass isNil or:[cls isLoaded not]) ifTrue:[
+                                            changeDelta := '?'
+                                        ] ifFalse:[
+                                            (changeClass implements:sel asSymbol) ifFalse:[
+                                                changeDelta := '+'.
+                                            ] ifTrue:[
+                                                |m currentText t1 t2|
+
+                                                m := changeClass compiledMethodAt:sel asSymbol.
+                                                currentText := m source.
+                                                currentText notNil ifTrue:[
+                                                    text asString = currentText asString ifTrue:[
+                                                        changeDelta := '='
+                                                    ] ifFalse:[
+                                                        t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                        t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                        t1 = t2 ifTrue:[
+                                                            changeDelta := '='
+                                                        ]
+                                                    ]
+                                                ]
+                                            ]
+                                        ]
+                                    ].
+                                    change delta:changeDelta.
+                                    change string:changeString.
+                                    change type:changeType.
+                                    change category: changeCategory.
+                                    change timeStamp:timeStampInfo.
+                                    changes add:change.
+                                ].
+                                changeString := nil.
+                                headerLine := nil.
+
+                            ]
+                        ].
+                        changeString notNil ifTrue:[
+                            change delta:changeDelta.
+                            change string:changeString.
+                            change type:changeType.
+                            change timeStamp:timeStampInfo.
+                            changes add:change.
+
+                        ] ifFalse:[
+                            headerLine notNil ifTrue:[
+                                changes add: change.
+                            ]
+                        ]
+                    ]
+                ].
+                change lastPosition: aStream position.
+            ].
+            modified := false.
+
+        ] valueNowOrOnUnwindDo:[
+            aStream close.
+            inBackground ifTrue:[myProcess priority:myPriority].
+        ].
     ].
     self setChangeList.
     self valueOfNotReading value: true.
@@ -2867,14 +3185,14 @@
     self valueOfNotSaving value ifFalse: [^ self].
 
     modified ifTrue:[
-	(OptionBox
-	      request:(resources string:'Change list was modified. Exit anyway?') withCRs
-	      label:'Changes Browser'
-	      form:(WarningBox iconBitmap)
-	      buttonLabels:(resources array:#('Cancel' 'Discard Modifications and Exit'))
-	      values:#(abort ignore)
-	      default:#save
-	) == #abort ifTrue:[^ self].
+        (OptionBox
+              request:(resources string:'Change list was modified. Exit anyway?') withCRs
+              label:'Changes Browser'
+              image:(WarningBox iconBitmap)
+              buttonLabels:(resources array:#('Cancel' 'Discard Modifications and Exit'))
+              values:#(abort ignore)
+              default:#save
+        ) == #abort ifTrue:[^ self].
     ].
     super closeRequest
 
@@ -2889,10 +3207,10 @@
 
     builder namedComponents do:
     [:aView|
-	aView allSubViewsDo:
-	[:v|
-	    v redraw
-	]
+        aView allSubViewsDo:
+        [:v|
+            v redraw
+        ]
     ].
 
     autoUpdateBlock := [self checkIfFileHasChanged].
@@ -2901,39 +3219,35 @@
 
     self filterField entryCompletionBlock:
     (filterCompletionBlock := [:value|
-	|filter filters i changesCopy|
-	self unselectChange.
-	filter := self filterField contents.
-	(filters := filter asArrayOfSubstrings) size > 0 ifTrue:
-	[
-	    i := 0.
-	    changesCopy := changes copy.
-	    filters do:
-	    [:filter|
-		i := i + 1.
-		changesCopy contents:
-		    (changesCopy select: [:row|
-			filter match: (row string asArrayOfSubstrings at: i ifAbsent: [''''])])
-	    ].
-	    self listOfChanges contents: changesCopy
-	]
-	ifFalse:
-	[
-	    self listOfChanges contents: changes
-	].
-	self autoSelectLast.
+        |filter filters i changesCopy|
+        self unselectChange.
+        filter := self filterField contents.
+        (filters := filter asArrayOfSubstrings) size > 0 ifTrue:[
+            changesCopy := changes copy.
+            i := 0.
+            filters do:[:filter|
+                i := i + 1.
+                changesCopy contents:
+                    (changesCopy select: [:row|
+                        filter match: (row string asArrayOfSubstrings at: i ifAbsent: [''''])])
+            ].
+            self listOfChanges contents: changesCopy
+        ] ifFalse:[
+            self listOfChanges contents: changes
+        ].
+        self autoSelectLast.
     ]).
 
     Object errorSignal handle: [:ex |
-	ex parameter signal == HaltSignal ifTrue:[
-	    ex reject
-	].
-	ex parameter signal == MessageTracer breakpointSignal ifTrue:[
-	    ex reject
-	].
-	self warn:'Error while reading changes file:\\' , ex errorString.
+        ex signal == HaltSignal ifTrue:[
+            ex reject
+        ].
+        ex signal == MessageTracer breakpointSignal ifTrue:[
+            ex reject
+        ].
+        self warn:'Error while reading changes file:\\' , ex errorString.
     ] do: [
-	self readChangesFileInBackground:true
+        self readChangesFileInBackground:true
     ].
 
     "Modified: / 30.7.1998 / 11:37:51 / cg"
@@ -3212,39 +3526,40 @@
 !
 
 doFindSnapshot: what
-    "finds the last made snapshot and selects it"
+    "finds the last made snapshot and selects it. what is one of last, prvious or next"
 
     |snapshotNr snapshotFound|
 
-    self listOfChanges detect: [:change| change type = 'image'] ifNone: [^self warn: 'No snapshot found!!'].
+    (self listOfChanges contains: [:change| change type = 'image']) ifFalse: [
+        self warn: 'No snapshot found!!'.
+        ^ false.
+    ].
 
     self withSelectedChangeDo:[:change|
-	snapshotNr := self listOfChanges indexOf: change.
-	snapshotFound := false.
-	[snapshotNr > 0 and: [snapshotFound not]]
-	whileTrue:
-	[
-	    what = 'last'
-	    ifTrue:
-	    [
-		snapshotNr := snapshotNr - 1.
-		snapshotNr == 0 ifTrue: [snapshotNr := self listOfChanges size].
-	    ]
-	    ifFalse:
-	    [
-		snapshotNr := snapshotNr + 1.
-		snapshotNr > self listOfChanges size ifTrue: [snapshotNr := 1].
-	    ].
-	    (self listOfChanges at: snapshotNr ifAbsent: [^self autoSelectChange: (what = 'last' ifTrue: [self listOfChanges last] ifFalse: [self listOfChanges first])]) type = 'image'
-	    ifTrue:
-	    [
-		snapshotFound := true.
-		self autoSelectChange:(self listOfChanges at: snapshotNr)
-	    ]
-	]
+        what = 'last' ifTrue:[            
+            snapshotNr := self listOfChanges size+1.
+        ] ifFalse:[
+            snapshotNr := self listOfChanges indexOf: change.
+        ].
+
+        snapshotFound := false.
+        [snapshotNr > 0 and: [snapshotFound not]] whileTrue:[
+            (what = 'last' or:[what = 'previous']) ifTrue:[
+                snapshotNr := snapshotNr - 1.
+                snapshotNr == 0 ifTrue: [snapshotNr := self listOfChanges size].
+            ] ifFalse:[
+                snapshotNr := snapshotNr + 1.
+                snapshotNr > self listOfChanges size ifTrue: [snapshotNr := 1].
+            ].
+            (self listOfChanges at: snapshotNr ifAbsent: [^self autoSelectChange: (what = 'last' ifTrue: [self listOfChanges last] ifFalse: [self listOfChanges first])]) type = 'image'
+            ifTrue:[
+                snapshotFound := true.
+                self autoSelectChange:(self listOfChanges at: snapshotNr)
+            ]
+        ]
     ].
 
-    ^snapshotFound
+    ^ snapshotFound
 !
 
 doLoad
@@ -3463,11 +3778,9 @@
 !
 
 listColor
-
-    (string at: 3) ~~ $- ifTrue:
-    [
-	(self type = 'class') ifTrue: [^Color gray].
-	^Color white
+    ((string size < 3) or:[(string at: 3) ~~ $-]) ifTrue:[
+        (self type = 'class') ifTrue: [^Color gray].
+        ^ Color white
     ].
 
     (string includesMatchString: '---- s') ifTrue: [^Color red].
@@ -3492,6 +3805,14 @@
     ^position printString, ' - ', lastPosition printString
 !
 
+selector
+    ^ selector
+!
+
+selector:something
+    selector := something.
+!
+
 string
 
     ^string
@@ -3528,5 +3849,5 @@
 !NewChangesBrowser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/NewChangesBrowser.st,v 1.29 2005-04-28 17:30:04 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/NewChangesBrowser.st,v 1.30 2008-02-04 12:25:06 cg Exp $'
 ! !