Merged in JV's version
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 05 Feb 2014 20:21:37 +0100
changeset 13886 8d5e6dbdeea0
parent 13885 d01470638c24
child 13887 5d04ca4e1109
Merged in JV's version
Tools__ChangeSetBrowser2.st
--- a/Tools__ChangeSetBrowser2.st	Wed Feb 05 20:13:29 2014 +0100
+++ b/Tools__ChangeSetBrowser2.st	Wed Feb 05 20:21:37 2014 +0100
@@ -1,6 +1,6 @@
 "
  COPYRIGHT (c) 2010 by Jan Vrany, SWING Research Group. CTU in Prague
-              All Rights Reserved
+	      All Rights Reserved
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
@@ -32,9 +32,12 @@
 		navigatorChangesetHolder navigatorSpecHolder list1 list1Holder
 		selection1Holder list2 list2Holder selection2Holder classHolder
 		languageHolder codeAspectHolder showRemovedAspect showSameAspect
-		sourceView changeSourceHolder imageSourceHolder targetPackage
-		targetNamespace updateChangefileHolder allowRemoveHolder
-		allowAcceptHolder showConflictsOnlyAspect'
+		showTimestampHolder sourceView changeSourceHolder
+		imageSourceHolder targetPackage allowRemoveHolder
+		allowAcceptHolder infoPanel updateChangeFileHolder
+		showFilterHolder showingRegularChangesetHolder isWorkingHolder
+		isWorkingNotHolder hasSelectionHolder showConflictsOnlyAspect
+		targetNameSpaceName'
 	classVariableNames:'ShowRemoved LastSelectionConditionString RecentTargetPackages'
 	poolDictionaries:''
 	category:'Interface-Browsers-ChangeSet'
@@ -53,7 +56,7 @@
 copyright
 "
  COPYRIGHT (c) 2010 by Jan Vrany, SWING Research Group. CTU in Prague
-              All Rights Reserved
+	      All Rights Reserved
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
@@ -80,11 +83,18 @@
 
 !ChangeSetBrowser2 class methodsFor:'instance creation'!
 
-on: aChangeSet
-
-    ^self on: aChangeSet label: aChangeSet name
-
-    "Modified: / 26-10-2010 / 22:51:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+on: aStringOrChangeSet
+    "Opens a browser on given changeset. If the argument is
+    string, then loads the changeset from given file - for
+    compatibility with other tools"
+
+    ^aStringOrChangeSet isString ifTrue:[
+        self onFile: aStringOrChangeSet
+    ] ifFalse:[
+        self on: aStringOrChangeSet label: aStringOrChangeSet name
+    ]
+
+    "Modified: / 21-05-2012 / 13:55:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 on: aChangeSet label: aString
@@ -100,12 +110,22 @@
 
     browser := self new.
     browser
-        changeset: aChangeSet;
-        title: label.
+	changeset: aChangeSet;
+	title: label.
     aBlock value: browser.
     ^browser
 
     "Created: / 26-10-2010 / 22:50:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+onFile: aString
+    | browser |
+
+    browser := self new.
+    browser enqueueDelayedAction:[browser doOpenFile: aString].
+    ^browser
+
+    "Created: / 17-05-2012 / 23:36:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetBrowser2 class methodsFor:'accessing'!
@@ -143,9 +163,474 @@
 #fileSave
 'Save the changeset in a file'
 
+#applyAll
+'Apply all changes.'
+
+#applyForClassToEnd
+'Apply changes which affect this class to the end.'
+
+#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.'
+
+#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.'
+
+#testFindPreviousSnapshot
+'Searches backward for the previous snapshot entry.'
+
+#testFindNextSnapshot
+'Searches forward for the next snapshot entry.'
+
 )
 
     "Created: / 27-12-2011 / 10:37:47 / cg"
+    "Modified: / 29-03-2012 / 12:13:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+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:Tools::ChangeSetBrowser2
+    "
+
+    <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
+'Open a changeset file (.chg or .st)'
+
+#fileOpenSelection
+''
+
+#fileReload
+'Reloads the changes file (undo your modifications).'
+
+#fileSave
+'Saves changes to current change file.'
+
+#fileSaveAs
+'Save changes to a 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.'
+
+#testFindPreviousSnapshot
+'Searches backward for the previous snapshot entry.'
+
+#fileOpenCurrent
+'Open current system changeset'
+
+#fileOpenSelection
+'Opens a new browser on currently selected changes'
+
+)
+
+    "Modified: / 01-08-2012 / 18:40:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ChangeSetBrowser2 class methodsFor:'image specs'!
+
+applyFromLastSnapshotIcon
+    ^ self applyFromLastSnapshotIcon2
+!
+
+applyFromLastSnapshotIcon1
+    "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 applyFromLastSnapshotIcon inspect
+     ImageEditor openOnClass:self andSelector:#applyFromLastSnapshotIcon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	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]
+!
+
+applyFromLastSnapshotIcon2
+    "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 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 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
+    "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 applyToEndIcon inspect
+     ImageEditor openOnClass:self andSelector:#applyToEndIcon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+	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
+    "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."
+
+    "
+     ImageEditor openOnClass:self andSelector:#compressIcon
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'NewChangesBrowser compressIcon'
+	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@????<@@@:***(@@@8@@@8@@@8@@@8@@@@@@@8@@@@@@@8A@@@@@@8@@:**0@8HC**+@@8@@@@@@@8H@@@@@@8@@@@@@@8@@@@@@@8@@@@@@@8@@C????8@@C****(@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 124 124 124 170 170 170 255 255 255]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@??0A??8A??8A??8A8A8G>A8@@A8G?98O?18_?!!8??A8@@A8G>A8@0A8C??8C??8C??8C??0@0@@D2@@G>@@D2@@') ; yourself); yourself]
+!
+
+deleteIcon
+    "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."
+
+    "
+     ImageEditor openOnClass:self andSelector:#deleteIcon
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'NewChangesBrowser deleteIcon'
+	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@AUUUU@@OA??UU@@@AUUUU@@@AUUUU@B@A???U@H@A??5U@@@A???0@@@AUUUB@B@@@@@@@@@@@@@A@BK@@@@A_:@@@@@AO2G@@@@AL2@@@@@AL2C@@@@AL2@@@@@AL2@@@@@AL2H@@@@AL2@@@@@A\:@@@@@H_8 @@@@@@@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:'_?<@_?<@_?<P_?<P_?<X_?<X_?<H_? H_?O<_?XL@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@G0') ; yourself); yourself]
+!
+
+deleteToEndIcon
+    "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."
+
+    "
+     ImageEditor openOnClass:self andSelector:#deleteToEndIcon
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'NewChangesBrowser deleteToEndIcon'
+	ifAbsentPut:[(Depth2Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@B** @@O@B** @@@@@@@ @@@@??< @B@@??<@@H@@@@L@@@@EUUL@@@@G?U@B@B@G?=@@@@@EUU@A@BK@@@@A_:@@@@@AO2G@@@@AL2@@@@@AL2C@@@@AL2@@@@@AL2@@@@@AL2H@@@@AL2@@@@@A\:@@@@@H_8 @@@@@@@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?0PO?0PO?0XO?0X??@H??@H??O<?<XL?<_<?<_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@_<@@G0') ; yourself); yourself]
+!
+
+findLastSnapshotIcon
+    "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."
+
+    "
+     ImageEditor openOnClass:self andSelector:#findLastSnapshotIcon
+    "
+
+    <resource: #image>
+
+    ^Icon
+	constantNamed:#'NewChangesBrowser findLastSnapshotIcon'
+	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]
+!
+
+findNextSnapshotIcon
+    "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."
+
+    "
+     ImageEditor openOnClass:self andSelector:#findNextSnapshotIcon
+    "
+
+    <resource: #image>
+
+    ^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]
 ! !
 
 !ChangeSetBrowser2 class methodsFor:'interface opening'!
@@ -166,48 +651,59 @@
     browser := self on: aChangeSet.
     browser allowAccept: false.
     browser allowRemove: true.
+    browser showRemovedAspect: true asValue.
+    browser beHierarchical.
     browserView := ApplicationSubView new
-                client:browser
-                spec:#windowSpecForEmbedding.
+		client:browser
+		spec:#windowSpecForEmbedding.
     dialog := (Dialog new)
-                addComponent:browserView withHeight: 300;
-                addAbortAndOkButtons;
-                yourself.
+		addComponent:browserView withHeight: 300;
+		addAbortAndOkButtons;
+		yourself.
     dialog label: aString.
     dialog buttonPanel
-        layout:(LayoutFrame fractions:(0.0 @ 1.0 corner:1.0 @ 1.0)
-                offsets:(0 @ -30 corner:0 @ 0)).
+	layout:(LayoutFrame fractions:(0.0 @ 1.0 corner:1.0 @ 1.0)
+		offsets:(0 @ -30 corner:0 @ 0)).
     browserView layout:(LayoutFrame fractions:(0.0 @ 0.0 corner:1.0 @ 1.0)
-                offsets:(0 @ 0 corner:0 @ -30)).
+		offsets:(0 @ 0 corner:0 @ -30)).
     dialog
-        okAction:
-            [^browser list1Holder value condenseChangesForRemoved];
-        abortAction:
-            [^#()].
+	okAction:
+	    [^browser list1Holder value condenseChangesForRemoved];
+	abortAction:
+	    [^#()].
     dialog openWithExtent: 800@700.
     ^#()
 
     "
-         Tools::ChangeSetBrowser2
-            confirmChanges:
-                (ChangeSet current copyFrom: ((ChangeSet current size - 10) max: 1) to: ChangeSet current size)
-            label: 'Last 10 changes...'
+	 Tools::ChangeSetBrowser2
+	    confirmChanges:
+		(ChangeSet current copyFrom: ((ChangeSet current size - 10) max: 1) to: ChangeSet current size)
+	    label: 'Last 10 changes...'
     "
 
     "Created: / 08-11-2010 / 17:59:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 07-09-2011 / 20:19:44 / cg"
-    "Modified: / 24-01-2012 / 20:00:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-07-2012 / 17:12:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 open
     "Open browser and load current changefile"
 
-    |app|
-
-    (app := super open application) 
-        enqueueMessage:#loadCurrentChangeFile
-        for:app
-        arguments:#().
+    | browser |
+
+    browser := self new.
+    browser open.
+    "JV: I would like to open current changefile only if the tool is opened from
+     launcher toolbar button"
+
+    (thisContext sender sender receiver isKindOf: AbstractLauncherApplication) ifTrue:[
+	browser builder window sensor
+	    pushUserEvent: #doOpenCurrent for: browser.
+    ] ifFalse:[
+	browser builder window sensor
+	    pushUserEvent: #doOpenNew for: browser.
+
+    ]
 
     "Created: / 25-01-2012 / 17:16:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 27-07-2012 / 21:24:19 / cg"
@@ -279,27 +775,32 @@
               subAspectHolders:
              (Array
 
-              (SubChannelInfoSpec
+               (SubChannelInfoSpec
                   subAspect: allowAcceptHolder
                   aspect: allowAcceptHolder
-                ) 
+                )
                (SubChannelInfoSpec
                   subAspect: allowRemoveHolder
                   aspect: allowRemoveHolder
                 )
+
                (SubChannelInfoSpec
                   subAspect: inGeneratorHolder
                   aspect: list1Holder
                 )
-
                (SubChannelInfoSpec
                   subAspect: menuHolder
                   aspect: list1MenuHolder
                 )
+
                (SubChannelInfoSpec
                   subAspect: selectionHolder
                   aspect: selection1Holder
                 )
+               (SubChannelInfoSpec
+                  subAspect: showFilterHolder
+                  aspect: showFilterHolder
+                )
 
                (SubChannelInfoSpec
                   subAspect: showRemovedHolder
@@ -313,7 +814,6 @@
                   subAspect: showConflictsOnlyHolder
                   aspect: showConflictsOnlyAspect
                 )
-
               )
               createNewApplication: true
               createNewBuilder: true
@@ -323,8 +823,6 @@
 
         )
       )
-
-    "Modified: / 24-01-2012 / 19:57:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 oneColumnNavigatorSpec
@@ -341,17 +839,17 @@
 
     <resource: #canvas>
 
-    ^ 
+    ^
      #(FullSpec
         name: oneColumnNavigatorSpec
-        window: 
+        window:
        (WindowSpec
           label: 'One Column Navigator'
           name: 'One Column Navigator'
           min: (Point 10 10)
           bounds: (Rectangle 0 0 300 300)
         )
-        component: 
+        component:
        (SpecCollection
           collection: (
            (SubCanvasSpec
@@ -360,43 +858,53 @@
               hasHorizontalScrollBar: false
               hasVerticalScrollBar: false
               majorKey: #'Tools::ChangeList'
-              subAspectHolders: 
+              subAspectHolders:
              (Array
-                
+
                (SubChannelInfoSpec
                   subAspect: allowAcceptHolder
                   aspect: allowAcceptHolder
-                ) 
+                )
                (SubChannelInfoSpec
                   subAspect: allowRemoveHolder
                   aspect: allowRemoveHolder
                 )
-                
+
                (SubChannelInfoSpec
                   subAspect: inGeneratorHolder
                   aspect: list1Holder
-                ) 
+                )
                (SubChannelInfoSpec
                   subAspect: menuHolder
                   aspect: list1MenuHolder
                 )
-                
+
                (SubChannelInfoSpec
                   subAspect: selectionHolder
                   aspect: selection1Holder
-                ) 
+                )
+               (SubChannelInfoSpec
+                  subAspect: showFilterHolder
+                  aspect: showFilterHolder
+                )
+
                (SubChannelInfoSpec
                   subAspect: showRemovedHolder
                   aspect: showRemovedAspect
                 )
-                
                (SubChannelInfoSpec
                   subAspect: showSameHolder
                   aspect: showSameAspect
                 )
+
+               (SubChannelInfoSpec
+                  subAspect: showTimestampHolder
+                  aspect: showTimestampHolder
+                )
                (SubChannelInfoSpec
                   subAspect: showConflictsOnlyHolder
                   aspect: showConflictsOnlyAspect
+
                 )
               )
               createNewApplication: true
@@ -404,9 +912,11 @@
               postBuildCallback: list1View:
             )
            )
-         
+
         )
       )
+
+    "Modified: / 16-04-2013 / 16:10:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 twoColumnNavigatorSpec
@@ -453,37 +963,47 @@
                      (SubChannelInfoSpec
                         subAspect: allowAcceptHolder
                         aspect: allowAcceptHolder
-                     ) 
+                      )
                      (SubChannelInfoSpec
                         subAspect: allowRemoveHolder
                         aspect: allowRemoveHolder
-                     )
+                      )
+
                      (SubChannelInfoSpec
                         subAspect: inGeneratorHolder
                         aspect: list1Holder
                       )
-
                      (SubChannelInfoSpec
                         subAspect: menuHolder
                         aspect: list1MenuHolder
                       )
+
                      (SubChannelInfoSpec
                         subAspect: outGeneratorHolder
                         aspect: list2Holder
                       )
-
                      (SubChannelInfoSpec
                         subAspect: selectionHolder
                         aspect: selection1Holder
                       )
+
+                     (SubChannelInfoSpec
+                        subAspect: showFilterHolder
+                        aspect: showFilterHolder
+                      )
                      (SubChannelInfoSpec
                         subAspect: showRemovedHolder
                         aspect: showRemovedAspect
                       )
-                    (SubChannelInfoSpec
+
+                     (SubChannelInfoSpec
                         subAspect: showSameHolder
                         aspect: showSameAspect
                       )
+                     (SubChannelInfoSpec
+                        subAspect: showTimestampHolder
+                        aspect: showTimestampHolder
+                      )
                    (SubChannelInfoSpec
                       subAspect: showConflictsOnlyHolder
                       aspect: showConflictsOnlyAspect
@@ -504,53 +1024,63 @@
                      (SubChannelInfoSpec
                         subAspect: allowAcceptHolder
                         aspect: allowAcceptHolder
-                     ) 
+                      )
                      (SubChannelInfoSpec
                         subAspect: allowRemoveHolder
                         aspect: allowRemoveHolder
-                     )
+                      )
+
                      (SubChannelInfoSpec
                         subAspect: inGeneratorHolder
                         aspect: list2Holder
                       )
-
                      (SubChannelInfoSpec
                         subAspect: menuHolder
                         aspect: list2MenuHolder
                       )
+
                      (SubChannelInfoSpec
                         subAspect: selectionHolder
                         aspect: selection2Holder
                       )
+                     (SubChannelInfoSpec
+                        subAspect: showFilterHolder
+                        aspect: showFilterHolder
+                      )
 
                      (SubChannelInfoSpec
                         subAspect: showRemovedHolder
                         aspect: showRemovedAspect
                       )
-                    (SubChannelInfoSpec
+                     (SubChannelInfoSpec
                         subAspect: showSameHolder
                         aspect: showSameAspect
                       )
-               (SubChannelInfoSpec
-                  subAspect: showConflictsOnlyHolder
-                  aspect: showConflictsOnlyAspect
-                )
+
+                     (SubChannelInfoSpec
+                        subAspect: showTimestampHolder
+                        aspect: showTimestampHolder
+                    )
+                   (SubChannelInfoSpec
+                      subAspect: showConflictsOnlyHolder
+                      aspect: showConflictsOnlyAspect
+                    )
+
                     )
                     createNewApplication: true
                     createNewBuilder: true
                     postBuildCallback: list2View:
                   )
-                 )
-
               )
               handles: (Any 0.5 1.0)
             )
            )
 
         )
-      )
-
-    "Modified: / 24-01-2012 / 19:57:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+        )
+    )
+
+    "Modified: / 01-05-2013 / 11:22:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 windowSpec
@@ -561,42 +1091,52 @@
      the UIPainter may not be able to read the specification."
 
     "
-     UIPainter new openOnClass:Tools::ChangeSetBrowser andSelector:#windowSpec
-     Tools::ChangeSetBrowser new openInterface:#windowSpec
-     Tools::ChangeSetBrowser open
+     UIPainter new openOnClass:Tools::ChangeSetBrowser2 andSelector:#windowSpec
+     Tools::ChangeSetBrowser2 new openInterface:#windowSpec
+     Tools::ChangeSetBrowser2 open
     "
 
     <resource: #canvas>
 
     ^
      #(FullSpec
-        name: windowSpec
-        window:
+	name: windowSpec
+	window:
        (WindowSpec
-          label: 'ChangeSet browser'
-          name: 'ChangeSet browser'
-          labelChannel: titleHolder
-          min: (Point 10 10)
-          bounds: (Rectangle 0 0 653 488)
-          menu: mainMenu
-        )
-        component:
+	  label: 'ChangeSet browser'
+	  name: 'ChangeSet browser'
+	  labelChannel: titleHolder
+	  min: (Point 10 10)
+	  bounds: (Rectangle 0 0 800 600)
+	  menu: mainMenu
+	)
+	component:
        (SpecCollection
-          collection: (
-           (MenuPanelSpec
-              name: 'ToolBar'
-              layout: (LayoutFrame 0 0 0 0 0 1 30 0)
-              menu: toolbarMenu
-              textDefault: true
-            )
-           (UISubSpecification
-              name: 'Contents'
-              layout: (LayoutFrame 0 0 30 0 0 1 0 1)
-              minorKey: windowSpecWithoutToolbar
-            )
-           )
-
-        )
+	  collection: (
+	   (MenuPanelSpec
+	      name: 'ToolBar'
+	      layout: (LayoutFrame 0 0 0 0 0 1 30 0)
+	      menu: toolbarMenu
+	      textDefault: true
+	    )
+	   (SubCanvasSpec
+	      name: 'InfoPanel'
+	      layout: (LayoutFrame 0 0 30 0 0 1 70 0)
+	      level: 0
+	      initiallyInvisible: true
+	      hasHorizontalScrollBar: false
+	      hasVerticalScrollBar: false
+	      clientKey: infoPanel
+	      createNewBuilder: false
+	    )
+	   (UISubSpecification
+	      name: 'Contents'
+	      layout: (LayoutFrame 0 0 30 0 0 1 0 1)
+	      minorKey: windowSpecWithoutToolbar
+	    )
+	   )
+
+	)
       )
 !
 
@@ -621,85 +1161,86 @@
 
     ^
      #(FullSpec
-        name: windowSpecWithoutToolbar
-        window:
+	name: windowSpecWithoutToolbar
+	window:
        (WindowSpec
-          label: 'ChangeSet browser'
-          name: 'ChangeSet browser'
-          min: (Point 10 10)
-          bounds: (Rectangle 0 0 653 488)
-          menu: mainMenu
-        )
-        component:
+	  label: 'ChangeSet browser'
+	  name: 'ChangeSet browser'
+	  min: (Point 10 10)
+	  bounds: (Rectangle 0 0 653 488)
+	  menu: mainMenu
+	)
+	component:
        (SpecCollection
-          collection: (
-           (VariableVerticalPanelSpec
-              name: 'VerticalPanel'
-              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-              component:
-             (SpecCollection
-                collection: (
-                 (SubCanvasSpec
-                    name: 'NavigatorPanel'
-                    hasHorizontalScrollBar: false
-                    hasVerticalScrollBar: false
-                    specHolder: navigatorSpecHolder
-                    createNewBuilder: false
-                  )
-                 (SubCanvasSpec
-                    name: 'TextDiffTool'
-                    hasHorizontalScrollBar: false
-                    hasVerticalScrollBar: false
-                    majorKey: #'Tools::TextDiffTool'
-                    minorKey: windowSpecForEmbedding
-                    subAspectHolders:
-                   (Array
-
-                     (SubChannelInfoSpec
-                        subAspect: classHolder
-                        aspect: classHolder
-                      )
-                     (SubChannelInfoSpec
-                        subAspect: languageHolder
-                        aspect: languageHolder
-                      )
-                     (SubChannelInfoSpec
-                        subAspect: codeAspectHolder
-                        aspect: codeAspectHolder
-                      )
-
-                     (SubChannelInfoSpec
-                        subAspect: labelAHolder
-                        aspect: labelAHolder
-                      )
-                     (SubChannelInfoSpec
-                        subAspect: labelBHolder
-                        aspect: labelBHolder
-                      )
-
-                     (SubChannelInfoSpec
-                        subAspect: textAHolder
-                        aspect: changeSourceHolder
-                      )
-                     (SubChannelInfoSpec
-                        subAspect: textBHolder
-                        aspect: imageSourceHolder
-                      )
-                    )
-                    createNewApplication: true
-                    createNewBuilder: true
-                  )
-                 )
-
-              )
-              handles: (Any 0.5 1.0)
-            )
-           )
-
-        )
+	  collection: (
+	   (VariableVerticalPanelSpec
+	      name: 'VerticalPanel'
+	      layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+	      component:
+	     (SpecCollection
+		collection: (
+		 (SubCanvasSpec
+		    name: 'NavigatorPanel'
+		    hasHorizontalScrollBar: false
+		    hasVerticalScrollBar: false
+		    specHolder: navigatorSpecHolder
+		    createNewBuilder: false
+		  )
+		 (SubCanvasSpec
+		    name: 'TextDiffTool'
+		    hasHorizontalScrollBar: false
+		    hasVerticalScrollBar: false
+		    majorKey: #'Tools::TextDiff2Tool'
+		    minorKey: windowSpecForEmbedding
+		    subAspectHolders:
+		   (Array
+
+		     (SubChannelInfoSpec
+			subAspect: classHolder
+			aspect: classHolder
+		      )
+		     (SubChannelInfoSpec
+			subAspect: languageHolder
+			aspect: languageHolder
+		      )
+		     (SubChannelInfoSpec
+			subAspect: codeAspectHolder
+			aspect: codeAspectHolder
+		      )
+
+		     (SubChannelInfoSpec
+			subAspect: labelAHolder
+			aspect: labelAHolder
+		      )
+		     (SubChannelInfoSpec
+			subAspect: labelBHolder
+			aspect: labelBHolder
+		      )
+
+		     (SubChannelInfoSpec
+			subAspect: textAHolder
+			aspect: changeSourceHolder
+		      )
+		     (SubChannelInfoSpec
+			subAspect: textBHolder
+			aspect: imageSourceHolder
+		      )
+		    )
+		    createNewApplication: true
+		    createNewBuilder: true
+		  )
+		 )
+
+	      )
+	      handles: (Any 0.5 1.0)
+	    )
+	   )
+
+	)
       )
 
     "Modified: / 03-12-2011 / 10:36:40 / cg"
+    "Modified: / 16-03-2012 / 13:09:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetBrowser2 class methodsFor:'menu specs'!
@@ -740,13 +1281,19 @@
             isVisible: allowAcceptHolder
           )
          (MenuItem
-            label: 'Delete'
+            label: 'Delete (selected)'
             itemValue: changeMenuDeleteSelection:
             nameKey: Delete
             isVisible: allowRemoveHolder
             shortcutKey: Delete
           )
          (MenuItem
+            label: 'Delete (unselected)'
+            itemValue: changeMenuDeleteSelectionInverted:
+            nameKey: Delete
+            isVisible: allowRemoveHolder
+          )
+         (MenuItem
             label: 'Undelete'
             itemValue: changeMenuUndeleteSelection:
             nameKey: Undelete
@@ -790,10 +1337,29 @@
                   itemValue: changeMenuSelectNone:
                 )
                (MenuItem
+                  label: 'Invert Selection'
+                  itemValue: changeMenuSelectInversion:
+                )
+               (MenuItem
                   label: '-'
                 )
                (MenuItem
-                  label: 'Select using block'
+                  label: 'Select version_XXX methods'
+                  itemValue: changeMenuSelectVersionMethods:
+                )
+               (MenuItem
+                  label: 'Select copyright methods'
+                  itemValue: changeMenuSelectCopyrightMethods:
+                )
+               (MenuItem
+                  label: 'Select class initialize doIts'
+                  itemValue: changeMenuSelectClassInitializeDoIts:
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Select Using Block...'
                   itemValue: changeMenuSelectUsingBlock:
                 )
                )
@@ -838,280 +1404,19 @@
 !
 
 changeMenu1
-    "This resource specification was automatically generated
-     by the MenuEditor of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the MenuEditor may not be able to read the specification."
-
-
-    "
-     MenuEditor new openOnClass:Tools::ChangeSetBrowser2 andSelector:#changeMenu1
-     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetBrowser2 changeMenu1)) startUp
-    "
-
     <resource: #menu>
 
-    ^ 
-     #(Menu
-        (
-         (MenuItem
-            enabled: hasChangeSelectedAndNotRemoved:
-            label: 'Apply'
-            itemValue: changeMenuApplySelection:
-            isVisible: allowAcceptHolder
-            shortcutKey: Accept
-            auxValue: 100
-          )
-         (MenuItem
-            label: 'Apply All'
-            itemValue: changeMenuApply:
-            isVisible: allowAcceptHolder
-          )
-         (MenuItem
-            label: '-'
-            isVisible: allowAcceptHolder
-          )
-         (MenuItem
-            label: 'Delete'
-            itemValue: changeMenuDeleteSelection:
-            nameKey: Delete
-            isVisible: allowRemoveHolder
-            shortcutKey: Delete
-          )
-         (MenuItem
-            label: 'Undelete'
-            itemValue: changeMenuUndeleteSelection:
-            nameKey: Undelete
-            isVisible: allowRemoveHolder
-          )
-         (MenuItem
-            label: '-'
-            isVisible: allowRemoveHolder
-          )
-         (MenuItem
-            label: 'Select...'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Select Same'
-                  itemValue: changeMenuSelectSame:
-                )
-               (MenuItem
-                  label: 'Select Additions (new Classes/Methods)'
-                  itemValue: changeMenuSelectAdditions:
-                )
-               (MenuItem
-                  label: 'Select Removals'
-                  itemValue: changeMenuSelectRemovals:
-                )
-               (MenuItem
-                  label: 'Select Differences'
-                  itemValue: changeMenuSelectDifferences:
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Select All'
-                  itemValue: changeMenuSelectAll:
-                )
-               (MenuItem
-                  label: 'Select None'
-                  itemValue: changeMenuSelectNone:
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Select using Block'
-                  itemValue: changeMenuSelectUsingBlock:
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            enabled: notShowConflictsOnlyAspect
-            label: 'Show Deleted'
-            isVisible: allowRemoveHolder
-            indication: showRemovedAspect
-          )
-         (MenuItem
-            enabled: notShowConflictsOnlyAspect
-            label: 'Show Same'
-            indication: showSameAspect
-          )
-         (MenuItem
-            label: 'Show Conflicts Only'
-            indication: showConflictsOnlyAspect
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Inspect Change'
-            itemValue: changeMenuInspect:
-          )
-         (MenuItem
-            enabled: hasSingleChangeSelectedAndCanBrowse:
-            label: 'Browse Method(s)'
-            itemValue: changeMenuBrowse:
-          )
-         (MenuItem
-            enabled: hasSingleChangeSelectedAndCanBrowse:
-            label: 'Browse Class(s)'
-            itemValue: changeMenuBrowseClass:
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            enabled: hasSingleChangeSelectedAndCanBrowse:
-            label: 'Compare Class Against...'
-            itemValue: changeMenuCompareClass:
-          )
-         )
-        nil
-        nil
-      )
+    ^self changeMenu
+
+    "Modified: / 17-05-2012 / 22:51:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenu2
-    "This resource specification was automatically generated
-     by the MenuEditor of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the MenuEditor may not be able to read the specification."
-
-
-    "
-     MenuEditor new openOnClass:Tools::ChangeSetBrowser2 andSelector:#changeMenu2
-     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetBrowser2 changeMenu2)) startUp
-    "
-
     <resource: #menu>
 
-    ^ 
-     #(Menu
-        (
-         (MenuItem
-            enabled: hasChangeSelectedAndNotRemoved:
-            label: 'Apply'
-            itemValue: changeMenuApplySelection:
-            isVisible: allowAcceptHolder
-            shortcutKey: Accept
-            auxValue: 100
-          )
-         (MenuItem
-            label: 'Apply to End'
-            itemValue: changeMenuApplyToEnd:
-            isVisible: allowAcceptHolder
-          )
-         (MenuItem
-            label: '-'
-            isVisible: allowAcceptHolder
-          )
-         (MenuItem
-            label: 'Delete'
-            itemValue: changeMenuDeleteSelection:
-            nameKey: Delete
-            isVisible: allowRemoveHolder
-            shortcutKey: Delete
-          )
-         (MenuItem
-            label: 'Undelete'
-            itemValue: changeMenuUndeleteSelection:
-            nameKey: Undelete
-            isVisible: allowRemoveHolder
-          )
-         (MenuItem
-            label: '-'
-            isVisible: allowRemoveHolder
-          )
-         (MenuItem
-            label: 'Select...'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Select Same'
-                  itemValue: changeMenuSelectSame:
-                )
-               (MenuItem
-                  label: 'Select Additions (new Classes/Methods)'
-                  itemValue: changeMenuSelectAdditions:
-                )
-               (MenuItem
-                  label: 'Select Removals'
-                  itemValue: changeMenuSelectRemovals:
-                )
-               (MenuItem
-                  label: 'Select Differences'
-                  itemValue: changeMenuSelectDifferences:
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Select All'
-                  itemValue: changeMenuSelectAll:
-                )
-               (MenuItem
-                  label: 'Select None'
-                  itemValue: changeMenuSelectNone:
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Select using Block'
-                  itemValue: changeMenuSelectUsingBlock:
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            enabled: notShowConflictsOnlyAspect
-            label: 'Show Deleted'
-            isVisible: allowRemoveHolder
-            indication: showRemovedAspect
-          )
-         (MenuItem
-            enabled: notShowConflictsOnlyAspect
-            label: 'Show Same'
-            indication: showSameAspect
-          )
-         (MenuItem
-            label: 'Show Conflicts Only'
-            indication: showConflictsOnlyAspect
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Inspect Change'
-            itemValue: changeMenuInspect:
-          )
-         (MenuItem
-            enabled: hasSingleChangeSelectedAndCanBrowse:
-            label: 'Browse Method(s)'
-            itemValue: changeMenuBrowse:
-          )
-         )
-        nil
-        nil
-      )
+    ^self changeMenu
+
+    "Modified: / 17-05-2012 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 mainMenu
@@ -1129,30 +1434,83 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
         (
          (MenuItem
             label: 'File'
-            submenu: 
+            submenu:
            (Menu
               (
                (MenuItem
+                  label: 'New'
+                  submenu:
+                 (Menu
+                    (
+                     (MenuItem
+                        activeHelpKey: fileNew
+                        label: 'New Changeset'
+                        itemValue: doOpenNew
+                      )
+                     (MenuItem
+                        label: 'New Window'
+                        itemValue: doOpenNewWindow
+                      )
+                     )
+                    nil
+                    nil
+                  )
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileOpenSelection
+                  enabled: isWorkingNotHolder
+                  label: 'Spawn Browser on Selection'
+                  itemValue: doOpenOnSelection
+                  isVisible: allowOpenHolder
+                )
+               (MenuItem
+                  activeHelpKey: fileOpenSelection
+                  enabled: isWorkingNotHolder
+                  label: 'Spawn on Selection'
+                  itemValue: doOpenOnSelection
+                  isVisible: allowOpenHolder
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  activeHelpKey: fileLoad
+                  enabled: isWorkingNotHolder
                   label: 'Open...'
                   itemValue: doOpen
                   isVisible: allowOpenHolder
                   shortcutKey: Ctrlo
                 )
                (MenuItem
-                  label: 'Open on Current Changes File'
-                  itemValue: doOpenCurrentChangeFile
+                  activeHelpKey: fileOpenCurrent
+                  enabled: isWorkingNotHolder
+                  label: 'Open Current'
+                  itemValue: doOpenCurrent
                   isVisible: allowOpenHolder
                 )
                (MenuItem
+                  activeHelpKey: fileOpenCurrent
+                  enabled: isWorkingNotHolder
+                  label: 'Open Cypress Package'
+                  itemValue: doOpenCypress
+                  isVisible: allowOpenHolderAndCypressPresent
+                )
+               (MenuItem
+                  activeHelpKey: fileSaveAs
+                  enabled: isWorkingNotHolder
                   label: 'Save'
                   itemValue: doSave
                 )
                (MenuItem
+                  enabled: isWorkingNotHolder
                   label: 'Save As...'
                   itemValue: doSaveAs
                 )
@@ -1169,22 +1527,26 @@
             )
           )
          (MenuItem
-            label: 'Change'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Apply'
-                  itemValue: doApplySelectedChanges
-                )
-               )
-              nil
-              nil
-            )
+            enabled: isWorkingNotHolder
+            label: 'Changes'
+            isVisible: isTwoColumnHolderNot
+            submenuChannel: list1MenuHolder
+          )
+         (MenuItem
+            enabled: isWorkingNotHolder
+            label: 'Left'
+            isVisible: isTwoColumnHolder
+            submenuChannel: list1MenuHolder
+          )
+         (MenuItem
+            enabled: isWorkingNotHolder
+            label: 'Right'
+            isVisible: isTwoColumnHolder
+            submenuChannel: list2MenuHolder
           )
          (MenuItem
             label: 'View'
-            submenu: 
+            submenu:
            (Menu
               (
                (MenuItem
@@ -1223,6 +1585,17 @@
                   label: '-'
                 )
                (MenuItem
+                  label: 'Show Filter'
+                  indication: showFilterHolder
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Show Timestamp'
+                  indication: showTimestampHolder
+                )
+                 (MenuItem
                   label: 'Update'
                   itemValue: menuUpdate
                 )
@@ -1233,7 +1606,7 @@
           )
          (MenuItem
             label: 'Loading'
-            submenu: 
+            submenu:
            (Menu
               (
                (MenuItem
@@ -1283,6 +1656,8 @@
         nil
         nil
       )
+
+    "Modified: / 27-07-2012 / 21:17:20 / cg"
 !
 
 toolbarMenu
@@ -1300,29 +1675,117 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
-        (
-         (MenuItem
-            activeHelpKey: fileLoad
-            label: 'Open'
-            itemValue: doOpen
-            translateLabel: true
-            isButton: true
-            isVisible: allowOpenHolder
-            labelImage: (ResourceRetriever ToolbarIconLibrary loadFromFileIcon)
-          )
-         (MenuItem
-            activeHelpKey: fileSave
-            label: 'Save'
-            itemValue: doSave
-            translateLabel: true
-            isButton: true
-            labelImage: (ResourceRetriever ToolbarIconLibrary saveToFileAsIcon)
-          )
-         )
-        nil
-        nil
+	(
+	 (MenuItem
+	    activeHelpKey: fileLoad
+	    enabled: isWorkingNotHolder
+	    label: 'Load'
+	    itemValue: doOpen
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary loadFromFileIcon)
+	  )
+	 (MenuItem
+	    activeHelpKey: fileSave
+	    enabled: isWorkingNotHolder
+	    label: 'Save'
+	    itemValue: doSave
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary saveToFileIcon)
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    activeHelpKey: applyLine
+	    enabled: hasSelectionHolder
+	    label: 'Apply'
+	    itemValue: doApply
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever nil applyIcon)
+	  )
+	 (MenuItem
+	    activeHelpKey: applyToEnd
+	    enabled: hasSelectionHolder
+	    label: 'Apply To End'
+	    itemValue: doApplyToEnd
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever nil applyToEndIcon)
+	  )
+	 (MenuItem
+	    activeHelpKey: applyFromLastSnapshot
+	    enabled: hasSelectionHolder
+	    label: 'Apply From Last Snapshot'
+	    itemValue: doApplyFromLastSnapshot
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever nil applyFromLastSnapshotIcon)
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    activeHelpKey: deleteLine
+	    enabled: hasSelectionHolder
+	    label: 'Delete'
+	    itemValue: doDelete
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever nil deleteIcon)
+	  )
+	 (MenuItem
+	    activeHelpKey: deleteToEnd
+	    enabled: hasSelectionHolder
+	    label: 'Delete To End'
+	    itemValue: doDeleteToEnd
+	    translateLabel: true
+	    isButton: true
+	    labelImage: (ResourceRetriever nil deleteToEndIcon)
+	  )
+	 (MenuItem
+	    activeHelpKey: deleteCompress
+	    enabled: isWorkingNotHolder
+	    label: 'Compress'
+	    itemValue: doCompress
+	    translateLabel: true
+	    isButton: true
+	    isVisible: showingRegularChangesetHolder
+	    labelImage: (ResourceRetriever nil compressIcon)
+	  )
+	 (MenuItem
+	    label: '-'
+	    isVisible: showingRegularChangesetHolder
+	  )
+	 (MenuItem
+	    activeHelpKey: testFindPreviousSnapshot
+	    enabled: hasSelectionHolder
+	    label: 'Find Previous Snapshot'
+	    itemValue: doFindSnapshot:
+	    translateLabel: true
+	    isButton: true
+	    isVisible: showingRegularChangesetHolder
+	    labelImage: (ResourceRetriever nil findPreviousSnapshotIcon)
+	    argument: 'previous'
+	  )
+	 (MenuItem
+	    activeHelpKey: testFindNextSnapshot
+	    enabled: hasSelectionHolder
+	    label: 'Find Next Snapshot'
+	    itemValue: doFindSnapshot:
+	    translateLabel: true
+	    isButton: true
+	    isVisible: showingRegularChangesetHolder
+	    labelImage: (ResourceRetriever nil findNextSnapshotIcon)
+	    argument: 'next'
+	  )
+	 )
+	nil
+	nil
       )
 ! !
 
@@ -1340,7 +1803,7 @@
      (if this app is embedded in a subCanvas)."
 
     ^ #(
-        #changesetHolder
+	#changesetHolder
       ).
 
 ! !
@@ -1399,6 +1862,12 @@
     self changesetHolder value: aChangeSet
 !
 
+codeAspect
+    ^self codeAspectHolder value
+
+    "Created: / 04-04-2013 / 18:28:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 readOnly: aBoolean
     self allowAcceptHolder value:false.
 
@@ -1416,8 +1885,14 @@
     ^ sel select:[:each | each notNil].
 !
 
+showFilter: aBoolean
+    self showFilterHolder value: aBoolean
+
+    "Created: / 11-02-2012 / 22:47:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 targetNamespace:something
-    targetNamespace := something.
+    targetNameSpaceName := something.
 !
 
 targetPackage:something
@@ -1425,13 +1900,22 @@
 !
 
 theSingleSelectedChange
-    | sel |
-
-    sel := self selectedChanges.
-    sel size == 1 ifTrue:[ ^ sel first ].
-    ^ nil
-
-    "Modified: / 04-08-2011 / 18:55:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    | change sel |
+    change := nil.
+    sel := selection2Holder value.
+    sel isNil ifTrue:[
+        sel := selection1Holder value.
+    ].
+    sel isNil ifTrue:[
+        ^nil
+    ].
+    sel do:
+        [:each|
+        change notNil ifTrue:[nil].
+        change isNil ifTrue:[change := each]].
+    ^change
+
+    "Modified: / 26-07-2012 / 19:33:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 title: aString
@@ -1453,11 +1937,11 @@
 
 list1MenuHolder
     ^ [
-        |menu|
-
-        menu := builder menuFor:#changeMenu1.
-        menu allItemsDo:[:item | item argument:list1 ].
-        menu
+	|menu|
+
+	menu := builder menuFor:#changeMenu1.
+	menu allItemsDo:[:item | item argument:list1 ].
+	menu
     ]
 
     "Created: / 04-08-2011 / 18:11:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -1466,11 +1950,11 @@
 
 list2MenuHolder
     ^ [
-        |menu|
-
-        menu := builder menuFor:#changeMenu2.
-        menu allItemsDo:[:item | item argument:list2 ].
-        menu
+	|menu|
+
+	menu := builder menuFor:#changeMenu2.
+	menu allItemsDo:[:item | item argument:list2 ].
+	menu
     ]
 
     "Created: / 04-08-2011 / 18:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -1485,7 +1969,7 @@
     (entry := self theSingleSelectedChange) isNil ifTrue:[^self].
     chg := entry change.
     chg isMethodCodeChange ifTrue:
-        [chg source: source asString]
+	[chg source: source asString]
 
     "Modified: / 29-11-2010 / 22:40:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 18-11-2011 / 14:56:53 / cg"
@@ -1504,7 +1988,7 @@
     "return/create the 'selectionHolder' value holder (automatically generated)"
 
     allowAcceptHolder isNil ifTrue:[
-        allowAcceptHolder := ValueHolder with: true.
+	allowAcceptHolder := ValueHolder with: true.
     ].
     ^ allowAcceptHolder
 
@@ -1516,44 +2000,55 @@
     "return/create the 'allowOpenHolder' value holder (automatically generated)"
 
     allowOpenHolder isNil ifTrue:[
-        allowOpenHolder := ValueHolder with: true.
+	allowOpenHolder := ValueHolder with: true.
     ].
     ^ allowOpenHolder
 
     "Modified: / 17-03-2011 / 22:32:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+allowOpenHolderAndCypressPresent
+
+    ^BlockValue
+	with: [:value|
+	    value and: [ ConfigurableFeatures includesFeature:#Cypress ]
+	]
+	argument: self allowOpenHolder.
+
+    "Modified (format): / 07-09-2012 / 20:09:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 allowRemoveHolder
     "return/create the 'allowRemoveHolder' value holder (automatically generated)"
-    
+
     allowRemoveHolder isNil ifTrue:[
-        allowRemoveHolder := ValueHolder with:false.
-        allowRemoveHolder addDependent:self.
+	allowRemoveHolder := ValueHolder with:false.
+	allowRemoveHolder addDependent:self.
     ].
     ^ allowRemoveHolder
 
     "Modified: / 24-01-2012 / 19:59:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-allowRemoveHolder:something 
+allowRemoveHolder:something
     "set the 'showRemovedHolder' value holder (automatically generated)"
-    
+
     |oldValue newValue|
 
     allowRemoveHolder notNil ifTrue:[
-        oldValue := allowRemoveHolder value.
-        allowRemoveHolder removeDependent:self.
+	oldValue := allowRemoveHolder value.
+	allowRemoveHolder removeDependent:self.
     ].
     allowRemoveHolder := something.
     allowRemoveHolder notNil ifTrue:[
-        allowRemoveHolder addDependent:self.
+	allowRemoveHolder addDependent:self.
     ].
     newValue := allowRemoveHolder value.
     oldValue ~~ newValue ifTrue:[
-        self 
-            update:#value
-            with:newValue
-            from:allowRemoveHolder.
+	self
+	    update:#value
+	    with:newValue
+	    from:allowRemoveHolder.
     ].
 
     "Modified (format): / 24-01-2012 / 19:48:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -1562,7 +2057,7 @@
 changeSourceHolder
     <resource: #uiAspect>
     changeSourceHolder isNil ifTrue: [
-        changeSourceHolder := nil asValue.
+	changeSourceHolder := nil asValue.
     ].
     ^ changeSourceHolder.
 
@@ -1573,8 +2068,8 @@
     "return/create the 'changesetHolder' value holder (automatically generated)"
 
     changesetHolder isNil ifTrue:[
-        changesetHolder := ValueHolder new.
-        changesetHolder addDependent:self.
+	changesetHolder := ValueHolder new.
+	changesetHolder addDependent:self.
     ].
     ^ changesetHolder
 !
@@ -1585,16 +2080,16 @@
     |oldValue newValue|
 
     changesetHolder notNil ifTrue:[
-        oldValue := changesetHolder value.
-        changesetHolder removeDependent:self.
+	oldValue := changesetHolder value.
+	changesetHolder removeDependent:self.
     ].
     changesetHolder := something.
     changesetHolder notNil ifTrue:[
-        changesetHolder addDependent:self.
+	changesetHolder addDependent:self.
     ].
     newValue := changesetHolder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:changesetHolder.
+	self update:#value with:newValue from:changesetHolder.
     ].
 !
 
@@ -1602,7 +2097,7 @@
     "return/create the 'classHolder' value holder (automatically generated)"
 
     classHolder isNil ifTrue:[
-        classHolder := ValueHolder with:nil.
+	classHolder := ValueHolder with:nil.
     ].
     ^ classHolder
 
@@ -1613,23 +2108,59 @@
     "return/create the 'codeAspectHolder' value holder (automatically generated)"
 
     codeAspectHolder isNil ifTrue:[
-        codeAspectHolder := SyntaxHighlighter codeAspectMethod asValue.
+        codeAspectHolder := ValueHolder with: nil.
     ].
     ^ codeAspectHolder
 
     "Modified: / 27-07-2012 / 22:04:12 / cg"
+    "Modified: / 04-04-2013 / 18:28:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 imageSourceHolder
     <resource: #uiAspect>
     imageSourceHolder isNil ifTrue: [
-        imageSourceHolder := nil asValue.
+	imageSourceHolder := nil asValue.
     ].
     ^ imageSourceHolder.
 
     "Created: / 19-07-2011 / 11:54:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+infoPanel
+    infoPanel isNil ifTrue:[
+	infoPanel := InlineMessageDialog new
+    ].
+    ^ infoPanel
+
+    "Created: / 09-02-2012 / 19:23:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isTwoColumnHolder
+    | holder |
+
+    holder :=  builder bindings at: #isTwoColumnHolder ifAbsentPut:[
+	BlockValue
+	    with:[:v| v value == #twoColumnNavigatorSpec]
+	    argument: self navigatorSpecHolder.
+    ].
+    ^holder
+
+    "Created: / 30-03-2012 / 12:07:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isTwoColumnHolderNot
+    | holder |
+
+    holder :=  builder bindings at: #isTwoColumnHolderNot ifAbsentPut:[
+	BlockValue
+	    with:[:v| v value ~~ #twoColumnNavigatorSpec]
+	    argument: self navigatorSpecHolder.
+    ].
+    ^holder
+
+    "Created: / 30-03-2012 / 12:08:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 labelAHolder
 
     ^'Change' asValue
@@ -1646,7 +2177,7 @@
 
 languageHolder
     languageHolder isNil ifTrue:[
-        languageHolder := ValueHolder with:nil.
+	languageHolder := ValueHolder with:nil.
     ].
     ^ languageHolder
 
@@ -1658,7 +2189,7 @@
     "return/create the 'list1Holder' value holder (automatically generated)"
 
     list1Holder isNil ifTrue:[
-        list1Holder := ValueHolder new.
+	list1Holder := ValueHolder new.
     ].
     ^ list1Holder
 !
@@ -1673,7 +2204,7 @@
     "return/create the 'list2Holder' value holder (automatically generated)"
 
     list2Holder isNil ifTrue:[
-        list2Holder := ValueHolder new.
+	list2Holder := ValueHolder new.
     ].
     ^ list2Holder
 !
@@ -1688,7 +2219,7 @@
     "return/create the 'navigatorChangesetHolder' value holder (automatically generated)"
 
     navigatorChangesetHolder isNil ifTrue:[
-        navigatorChangesetHolder := ValueHolder new.
+	navigatorChangesetHolder := ValueHolder new.
     ].
     ^ navigatorChangesetHolder
 !
@@ -1700,13 +2231,13 @@
         navigatorSpecHolder := ValueHolder with:
                                                     "/#hierarchicalNavigatorSpec
                                                     "/#twoColumnNavigatorSpec
-                                                    #oneColumnNavigatorSpec
+                                                    #oneColumnNavigatorSpec.
+        navigatorSpecHolder addDependent: self.
 
     ].
     ^ navigatorSpecHolder.
 
-
-    "Modified: / 24-01-2012 / 17:13:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-02-2012 / 21:25:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 notShowConflictsOnlyAspect
@@ -1717,8 +2248,8 @@
     "return/create the 'selection1Holder' value holder (automatically generated)"
 
     selection1Holder isNil ifTrue:[
-        selection1Holder := ValueHolder new.
-        selection1Holder addDependent:self.
+	selection1Holder := ValueHolder new.
+	selection1Holder addDependent:self.
     ].
     ^ selection1Holder
 !
@@ -1729,16 +2260,16 @@
     |oldValue newValue|
 
     selection1Holder notNil ifTrue:[
-        oldValue := selection1Holder value.
-        selection1Holder removeDependent:self.
+	oldValue := selection1Holder value.
+	selection1Holder removeDependent:self.
     ].
     selection1Holder := something.
     selection1Holder notNil ifTrue:[
-        selection1Holder addDependent:self.
+	selection1Holder addDependent:self.
     ].
     newValue := selection1Holder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:selection1Holder.
+	self update:#value with:newValue from:selection1Holder.
     ].
 !
 
@@ -1746,8 +2277,8 @@
     "return/create the 'selection2Holder' value holder (automatically generated)"
 
     selection2Holder isNil ifTrue:[
-        selection2Holder := ValueHolder new.
-        selection2Holder addDependent:self.
+	selection2Holder := ValueHolder new.
+	selection2Holder addDependent:self.
     ].
     ^ selection2Holder
 !
@@ -1758,16 +2289,16 @@
     |oldValue newValue|
 
     selection2Holder notNil ifTrue:[
-        oldValue := selection2Holder value.
-        selection2Holder removeDependent:self.
+	oldValue := selection2Holder value.
+	selection2Holder removeDependent:self.
     ].
     selection2Holder := something.
     selection2Holder notNil ifTrue:[
-        selection2Holder addDependent:self.
+	selection2Holder addDependent:self.
     ].
     newValue := selection2Holder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:selection2Holder.
+	self update:#value with:newValue from:selection2Holder.
     ].
 !
 
@@ -1784,12 +2315,29 @@
     showConflictsOnlyAspect := aValueHolder.
 !
 
+showFilterHolder
+    "return/create the 'showFilterHolder' value holder (automatically generated)"
+
+    showFilterHolder isNil ifTrue:[
+	showFilterHolder := false asValue.
+    ].
+    ^ showFilterHolder
+
+    "Modified: / 11-02-2012 / 22:46:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+showFilterHolder:something
+    "set the 'showFilterHolder' value holder (automatically generated)"
+
+    showFilterHolder := something.
+!
+
 showRemovedAspect
     "return/create the 'showDeletedAspect' value holder (automatically generated)"
 
     showRemovedAspect isNil ifTrue:[
-        showRemovedAspect := (AspectAdaptor forAspect:#showRemoved)
-                                subject: self class.
+	showRemovedAspect := (AspectAdaptor forAspect:#showRemoved)
+				subject: self class.
     ].
     ^ showRemovedAspect
 !
@@ -1802,7 +2350,7 @@
     "return/create the 'showSameAspect' value holder (automatically generated)"
 
     showSameAspect isNil ifTrue:[
-        showSameAspect := ValueHolder with: true.
+	showSameAspect := ValueHolder with: true.
     ].
     ^ showSameAspect
 
@@ -1815,23 +2363,110 @@
     showSameAspect := something.
 !
 
+showTimestampHolder
+    "return/create the 'showTimestampHolder' value holder (automatically generated)"
+
+    showTimestampHolder isNil ifTrue:[
+	showTimestampHolder := ValueHolder with: false.
+    ].
+    ^ showTimestampHolder
+
+    "Modified: / 26-07-2012 / 18:47:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+showTimestampHolder:something
+    "set the 'showTimestampHolder' value holder (automatically generated)"
+
+    showTimestampHolder := something.
+!
+
+showingRegularChangesetHolder
+    "return/create the 'showingRegularChangesetHolder' value holder (automatically generated)"
+
+    showingRegularChangesetHolder isNil ifTrue:[
+	showingRegularChangesetHolder := ValueHolder with: false.
+	showingRegularChangesetHolder addDependent:self.
+    ].
+    ^ showingRegularChangesetHolder
+
+    "Modified: / 26-07-2012 / 19:45:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+showingRegularChangesetHolder:something
+    "set the 'showingRegularChangesetHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    showingRegularChangesetHolder notNil ifTrue:[
+	oldValue := showingRegularChangesetHolder value.
+	showingRegularChangesetHolder removeDependent:self.
+    ].
+    showingRegularChangesetHolder := something.
+    showingRegularChangesetHolder notNil ifTrue:[
+	showingRegularChangesetHolder addDependent:self.
+    ].
+    newValue := showingRegularChangesetHolder value.
+    oldValue ~~ newValue ifTrue:[
+	self update:#value with:newValue from:showingRegularChangesetHolder.
+    ].
+!
+
 titleHolder
     "return/create the 'titleHolder' value holder (automatically generated)"
 
     titleHolder isNil
-        ifTrue:[ titleHolder := ValueHolder with:self defaultTitle. ].
+	ifTrue:[ titleHolder := ValueHolder with:self defaultTitle. ].
     ^ titleHolder
 
     "Modified: / 26-10-2010 / 22:54:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-updateChangefileHolder
-    updateChangefileHolder isNil ifTrue:[
-        updateChangefileHolder := false asValue.
+updateChangeFileHolder
+    updateChangeFileHolder isNil ifTrue:[
+	updateChangeFileHolder := false asValue.
     ].
-    ^ updateChangefileHolder
+    ^ updateChangeFileHolder
 
     "Created: / 07-09-2011 / 15:54:03 / cg"
+    "Created: / 11-02-2012 / 22:40:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ChangeSetBrowser2 methodsFor:'aspects-queries'!
+
+hasSelectionHolder
+
+    hasSelectionHolder isNil ifTrue:[
+	hasSelectionHolder :=
+	    BlockValue
+		with:[:sel1 :sel2|
+		    sel1 value notEmptyOrNil or:[sel2 value notEmptyOrNil]
+		]
+		argument: self selection1Holder
+		argument: self selection2Holder
+    ].
+    ^hasSelectionHolder
+
+    "Created: / 17-05-2012 / 20:45:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isWorkingHolder
+
+    isWorkingHolder isNil ifTrue:[
+	isWorkingHolder := ValueHolder with: false.
+    ].
+    ^isWorkingHolder
+
+    "Created: / 17-05-2012 / 20:45:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isWorkingNotHolder
+
+    isWorkingNotHolder isNil ifTrue:[
+	isWorkingNotHolder := BlockValue forLogicalNot: self  isWorkingHolder
+    ].
+    ^isWorkingNotHolder
+
+    "Created: / 17-05-2012 / 20:45:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetBrowser2 methodsFor:'change & update'!
@@ -1858,9 +2493,19 @@
                         ifTrue:[SyntaxHighlighter codeAspectClassDefinition]   
                         ifFalse:[SyntaxHighlighter codeAspectExpression])]).
         self classHolder value: change changeClass.
-        changeSourceHolder setValue: change changeSource"; changed: #value".
         srcImage := change imageSource.
         srcChange := change changeSource.
+        "/ Hack to make sure code is displayed in similar way
+        "/ (i.e., with no namespace pragma)
+        (change isClassDefinitionChange and:[change isPrivateClassDefinitionChange]) ifTrue:[
+            srcChange := change definitionStringInNamespace: nil.
+        ].
+        srcImage notNil ifTrue:[
+            srcImage := srcImage trimSeparators.
+        ].
+        srcChange := srcChange trimSeparators.  
+
+        changeSourceHolder setValue: srcChange"; changed: #value".
         srcImage = srcChange ifTrue:[
             imageSourceHolder setValue: nil"; changed: #value".
         ] ifFalse:[
@@ -1896,13 +2541,40 @@
 
     "Created: / 24-10-2009 / 19:49:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 27-07-2012 / 23:42:46 / cg"
+    "Modified: / 19-11-2013 / 12:16:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+showingRegularChangesetChanged
+
+    self showTimestampHolder value: showingRegularChangesetHolder value.
+
+    "Created: / 26-07-2012 / 19:40:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 update: aspect with: param from: sender
 
-    sender == changesetHolder ifTrue: [ ^ self changesetChanged ].
-    sender == selection1Holder ifTrue: [ ^ self selectionChanged ].
-    sender == selection2Holder ifTrue: [ ^ self selectionChanged ].
+    sender == changesetHolder ifTrue: [
+	self changesetChanged .
+	^self
+    ].
+    sender == navigatorSpecHolder ifTrue: [
+	self changesetChanged .
+	^self
+    ].
+    sender == selection1Holder ifTrue: [
+	self selectionChanged.
+	^self
+    ].
+    sender == selection2Holder ifTrue: [
+	self selectionChanged.
+	^self
+    ].
+
+    sender == showingRegularChangesetHolder ifTrue:[
+	self showingRegularChangesetChanged.
+	^self.
+    ].
+    super update: aspect with: param from: sender
 
     "Created: / 24-10-2009 / 19:29:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
@@ -1927,24 +2599,118 @@
 
 !ChangeSetBrowser2 methodsFor:'menu actions'!
 
+doApply
+    "Applies currently selected change"
+
+    self changeMenuApplySelection: self list.
+
+    "Modified: / 30-03-2012 / 12:18:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doApplyFromLastSnapshot
+
+    self doFindSnapshot: #last.
+    self doApplyToEnd.
+
+    "Modified: / 30-03-2012 / 12:19:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 doApplySelectedChanges
     self selectedChanges do:[:chgListEntry |
         self changeMenuApplyChange: chgListEntry change.
     ].
 !
 
+doApplyToEnd
+
+    self changeMenuApplyToEnd: self list.
+
+    "Modified: / 30-03-2012 / 12:35:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doCompress
+    self breakPoint: #jv.
+    Dialog warn: 'Sorry, not yet implemented'
+
+    "Modified: / 30-03-2012 / 12:20:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doDelete
+   self changeMenuDeleteSelection: self list.
+
+    "Modified: / 30-03-2012 / 12:21:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doDeleteToEnd
+    "automatically generated by UIEditor ..."
+
+    "*** the code below performs no action"
+    "*** (except for some feedback on the Transcript)"
+    "*** Please change as required and accept in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    "action to be added ..."
+
+    Transcript showCR:self class name, ': action for #doDeleteToEnd ...'.
+!
+
+doFindSnapshot:previousOrNext
+    self doFindSnapshot: previousOrNext in: self list.
+
+    "Modified: / 27-07-2012 / 15:40:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doFindSnapshot:previousOrNext in: changeList
+    | snapshot selection searchBlock notFoundMessage |
+
+
+    selection := self theSingleSelectedChange.
+    searchBlock := [:listEntry|
+	listEntry == selection ifTrue:[
+	    snapshot notNil ifTrue:[
+		changeList selection: (OrderedCollection with: snapshot).
+	    ] ifFalse:[
+		self infoPanel showMessage: notFoundMessage closeAfter: 5"sec".
+	    ].
+	    ^self.
+	] ifFalse:[
+	    (listEntry change isOtherChange and:[listEntry change type == #snapshot]) ifTrue:[
+		snapshot := listEntry
+	    ].
+	].
+    ].
+    previousOrNext = 'previous' ifTrue:[
+	selection isNil ifTrue:[
+	    selection := changeList list last.
+	    changeList selection: (Array with: selection).
+	].
+	notFoundMessage := resources string:'No snapshot prior selected change found.'.
+	changeList list do: searchBlock.
+    ] ifFalse:[
+	selection isNil ifTrue:[
+	    selection := changeList list first.
+	    changeList selection: (Array with: selection).
+	].
+	notFoundMessage := resources string:'No snapshot after selected change found.'.
+	changeList list reverseDo: searchBlock.
+    ]
+
+    "Created: / 27-07-2012 / 15:38:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 doOpen
-    | file changeset |
-
-    file := Dialog requestFileName:'Select Changeset to Load' pattern:'*.chg;*.st'.
+    | file |
+    [
+	file := Dialog requestFileName:'Select Changeset to Load' pattern:'*.chg;*.st'.
+    ] on: Dialog aboutToOpenBoxNotificationSignal do:[:ex|
+	| dialog |
+
+	dialog := ex parameter.
+
+	ex pass.
+    ].
     file isNil ifTrue:[^self].
-
-    [changeset := ChangeSet fromFile: file]
-        on: Error
-        do: [:ex|Dialog error: 'Error when loading changeset: ',ex description. ^self].
-    changesetFile := file.
-    self title: file asFilename baseName asString.
-    self loadChangeSet: changeset
+    self doOpenFile: file
 
     "Modified: / 08-04-2011 / 10:11:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 27-07-2012 / 21:21:40 / cg"
@@ -1959,45 +2725,183 @@
     "Modified: / 27-07-2012 / 21:21:24 / cg"
 !
 
+doOpenCurrent
+
+    self doOpenFile: ObjectMemory nameForChanges.
+    self showFilter: true.
+
+    "Created: / 05-12-2009 / 13:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 doOpenCurrentChangeFile
     self withWaitCursorDo:[
-        self class openOn: (ChangeSet fromFile: ObjectMemory nameForChanges)
+	self class openOn: (ChangeSet fromFile: ObjectMemory nameForChanges)
     ].
 
     "Created: / 05-12-2009 / 13:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Created: / 27-07-2012 / 21:16:42 / cg"
 !
 
+doOpenCypress
+
+    | file |
+    [
+	file := Dialog requestDirectoryName:(resources string: 'Select Cypress Package')."/ pattern:'*.package'.
+    ] on: Dialog aboutToOpenBoxNotificationSignal do:[:ex|
+	| dialog |
+
+	dialog := ex parameter.
+
+	ex pass.
+    ].
+
+    file isNil ifTrue:[^self].
+    self doOpenCypress: file
+
+    "Modified: / 03-09-2012 / 11:53:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doOpenCypress: aStringOrFilename
+    "Opens a Cypress package in given directory"
+
+    | dir changeset |
+
+    dir := aStringOrFilename asFilename.
+    dir exists ifFalse:[
+	Dialog warn: (resources string:'Selected directory does not exists').
+	^self.
+    ].
+    dir isDirectory ifFalse:[
+	Dialog warn: (resources string:'Selected file is not a directory').
+	^self.
+    ].
+    (dir / 'properties.json') isReadable ifFalse:[
+	Dialog warn: (resources string:'No properties.json found. Perhaps not a Cypress package directory?').
+	^self.
+    ].
+
+    self showProgress: (resources string: 'Reading Cypress Package...') while: [
+	changeset := ((Smalltalk at:#CypressPackageReader) readPackageFrom: dir) asChangeSet.
+	self doOpen: changeset.
+    ].
+
+    "Created: / 03-09-2012 / 11:44:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doOpenFile: aStringOrFilename
+    | cs fn |
+
+    self showProgress: 'Reading ' , (fn := aStringOrFilename asFilename) baseName while:[
+        [
+            cs := ChangeSet fromFile: aStringOrFilename.
+        ] on: ChangeSet::InvalidChangeChunkError do:[:ex|
+            ex proceed.
+        ].
+        ((fn suffix = 'chg') or:[fn pathName = ObjectMemory nameForChanges]) ifTrue:[
+            self list scrollToBottom: true.
+            self showingRegularChangesetHolder value: true.
+        ] ifFalse:[
+            self showingRegularChangesetHolder value: false.
+        ].
+        self allowRemove: false."/true.
+        self doOpen: cs.
+    ].
+
+    "Created: / 09-02-2012 / 19:11:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-12-2012 / 11:38:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doOpenNew
+    self doOpen: ChangeSet new.
+    self showFilterHolder value: false.
+    self infoPanel
+	reset;
+	beInformation;
+	message: (resources string:'Open file or drag''n''drop changes from other changeset/diff browser');
+	addButtonWithLabel: (resources string:'Open File') action:[self doOpen];
+	addButtonOK;
+	show.
+
+    "Modified: / 01-08-2012 / 18:36:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doOpenNewWindow
+    | new |
+
+    new := self class new.
+    new open.
+
+    "Created: / 01-08-2012 / 18:22:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doOpenOnSelection
+
+    | selection |
+
+    selection := ChangeSet new.
+    self selectionDo: [:each|selection add: each].
+    self class openOn: selection label: (self titleHolder value , ' ' , (resources string:'(Selected changes)'))
+
+    "Modified: / 25-07-2012 / 15:31:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 doSave
 
     changesetFile
-        ifNil:[self doSaveAs]
-        ifNotNil:[self doSaveAs: changesetFile]
+	ifNil:[self doSaveAs]
+	ifNotNil:[self doSaveAs: changesetFile]
 
     "Modified: / 24-10-2009 / 22:55:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doSaveAs
     | file |
-
-    file := Dialog requestFileName:'Select File for Save' default: (changesetFile ? 'somechanges.chg') pattern:('*.chg').
+    Dialog aboutToOpenBoxNotificationSignal handle:[:ex|
+"/        OOPS, not supported!!!!!!!!
+
+"/        | box |
+"/        box := ex parameter.
+"/        box verticalPanel
+"/                add:(CheckBox label:'x'
+"/                              model:true asValue).
+	ex pass.
+    ] do:[
+	file := Dialog requestFileName:'Select File for Save' default: (changesetFile ? 'somechanges.chg') pattern:('*.chg').
+    ].
     file isNil ifTrue:[^self].
     self doSaveAs: file.
 
     "Modified: / 27-12-2011 / 10:39:52 / cg"
-    "Modified (format): / 27-07-2012 / 21:22:09 / cg"
+    "Modified: / 20-03-2012 / 13:52:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doSaveAs: newFile
-    [
-        | s |
-        s := newFile asFilename writeStream.
-        [self changeset fileOutOn: s] ensure:[s close].
-        changesetFile := newFile.
-    ] on: Error do:
-        [:ex|Dialog warn: 'Erorr saving changes: ' , ex description]
-
-    "Modified (format): / 27-07-2012 / 21:22:14 / cg"
+    | changesetToSave |
+
+    changesetToSave := ChangeSet new.
+    self list1Holder value do:[:e|
+	e removed ~~ true ifTrue:[changesetToSave add:e].
+    ].
+
+"/    [
+	(newFile asFilename suffix = 'st') ifTrue:[
+	    changesetToSave saveToFile: newFile format: #classSource.
+	] ifFalse:[
+	    changesetToSave saveToFile: newFile
+	].
+	changesetFile := newFile.
+"/    ] on: Error do:
+"/        [:ex|Dialog warn: 'Erorr saving changes: ' , ex description]
+
+!
+
+doScrollToBottom
+
+    | changeList |
+    changeList := self list.
+    changeList selection: { changeList list last }
+
+    "Created: / 30-03-2012 / 16:56:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 loadChangeSet: aChangeSet
@@ -2009,7 +2913,7 @@
 
 loadCurrentChangeFile
     self withWaitCursorDo:[
-        self loadChangeSet: (ChangeSet fromFile: ObjectMemory nameForChanges)
+	self loadChangeSet: (ChangeSet fromFile: ObjectMemory nameForChanges)
     ].
 
     "Created: / 05-12-2009 / 13:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -2027,19 +2931,19 @@
 
     | nsName |
 
-    nsName := Dialog 
-                requestNameSpace:'Namepace to load code into:' 
-                initialAnswer:targetNamespace.    
+    nsName := Dialog
+		requestNameSpace:'Namepace to load code into:'
+		initialAnswer:targetNameSpaceName.
     nsName isEmptyOrNil ifTrue:[^self].
 
-    targetNamespace := nsName.
+    targetNameSpaceName := nsName.
     "/ self targetNamespaceNameHolder value:('Target-Namespace: ',targetNamespace).
 
     list1 list do:[:each |
-        each change nameSpaceOverride:nsName
+	each change nameSpaceOverride:nsName
     ].
     list2 list do:[:each |
-        each change nameSpaceOverride:nsName
+	each change nameSpaceOverride:nsName
     ].
     self changeset do:[:chg | chg nameSpaceOverride:nsName].
 
@@ -2051,14 +2955,14 @@
 
     | package |
 
-    package := Dialog 
-                requestProject:'Default Smalltalk/X package to load code into:' 
-                initialAnswer:targetPackage
-                suggestions:(RecentTargetPackages ? #()).    
+    package := Dialog
+		requestProject:'Default Smalltalk/X package to load code into:'
+		initialAnswer:targetPackage
+		suggestions:(RecentTargetPackages ? #()).
     package isNil ifTrue:[^self].
 
     RecentTargetPackages isNil ifTrue:[
-        RecentTargetPackages := OrderedCollection new.
+	RecentTargetPackages := OrderedCollection new.
     ].
     RecentTargetPackages remove:package ifAbsent:[].
     RecentTargetPackages addFirst:package.
@@ -2078,8 +2982,8 @@
     self changesDo:[:chg|chg removed ifFalse:[changesToApply add: chg]].
     self changeMenuApplyChanges: changesToApply.
     list2 notNil ifTrue:[
-        "/ to get the =-icons
-        list2 updateList
+	"/ to get the =-icons
+	list2 updateList
     ].
 
     "Created: / 04-08-2011 / 17:26:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -2088,28 +2992,46 @@
 
 changeMenuApplySelection: changeList
 
-    changeList selection do:[:change|self changeMenuApplyChange:change change].
-    list2 notNil ifTrue:[
-        "/ to get the =-icons
-        list2 updateList
+    changeList selection do:[:change|
+	| changeIdx |
+
+	self changeMenuApplyChange:change change.
+
+	"Advance to next change"
+	changeIdx := changeList list identityIndexOf: change.
+	changeIdx < changeList list size ifTrue:[
+	    changeList selection: { changeList list at: changeIdx + 1 }
+	].
     ].
 
     "Created: / 04-08-2011 / 17:27:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (format): / 28-12-2011 / 15:48:53 / cg"
+    "Modified (comment): / 30-03-2012 / 13:18:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenuApplyToEnd: changeList
-    |lastIdx|
-
-    lastIdx := changeList selectionIndices max.
-    changeList list from:lastIdx do:[:change | self changeMenuApplyChange:change change].
+    | start stop list |
+
+    list := changeList list.
+    start := changeList selectionIndices max.
+    stop  := list size.
+
+    start to: stop do:[:idx|
+	| chg |
+
+	chg := list at: idx.
+	changeList selection: { chg }.
+	self changeMenuApplyChange:chg change.
+    ].
+
     list2 notNil ifTrue:[
-        "/ to get the =-icons
-        list2 updateList
+	"/ to get the =-icons
+	list2 updateList
     ].
 
     "Created: / 04-08-2011 / 17:27:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Created: / 27-12-2011 / 10:53:00 / cg"
+    "Modified: / 30-03-2012 / 12:34:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenuBrowse: changeList
@@ -2121,7 +3043,7 @@
     (changes conform:[:c | c isClassDefinitionChange]) ifTrue:[
         classes := (changes collect:[:c | c changeClass]).
         UserPreferences systemBrowserClass 
-            browseClasses:classes title:'selected monticello classes'.
+            browseClasses:classes label:'selected monticello classes'.
     ] ifFalse:[
         methods := OrderedCollection new.
         changes do:[:each |
@@ -2144,6 +3066,7 @@
 
     "Created: / 04-08-2011 / 17:27:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 23-07-2012 / 13:13:37 / cg"
+    "Modified: / 13-11-2013 / 11:49:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenuBrowseClass: changeList
@@ -2179,7 +3102,7 @@
 !
 
 changeMenuCompareClass: changeList
-    |changes classNames classNameToClassMapping lastNameSpace 
+    |changes classNames classNameToClassMapping lastNameSpace
      addClassName addThemChanges existingClasses
      allChanges changeSet1 changeSet2 diffSet|
 
@@ -2190,73 +3113,73 @@
     allChanges := ChangeSet new.
     existingClasses := Set new.
 
-    addClassName := 
-        [:nmArg |
-            |nm ns existingClass goodAnswer cls|
-
-            nm := nmArg.
-            existingClass := Smalltalk classNamed:nm.
-
-            existingClass notNil ifTrue:[
-                goodAnswer := nm
-            ] ifFalse:[
-                ns := NameSpace allNameSpaces 
-                                    detect:[:ns | (ns classNamed:nm) notNil ]
-                                    ifNone:nil.
-                ns notNil ifTrue:[
-                    goodAnswer := (ns classNamed:nm) name.
-                ] ifFalse:[                
-                    goodAnswer := nm.
-                    (lastNameSpace notNil 
-                        and:[ lastNameSpace isNameSpace 
-                        and:[(cls := lastNameSpace classNamed:nm) notNil ]]
-                    ) ifTrue:[
-                        goodAnswer := cls name.
-                    ] ifFalse:[
-                        (lastNameSpace notNil 
-                            and:[ lastNameSpace isBehavior 
-                            and:[(cls := lastNameSpace privateClassesAt:nm asSymbol) notNil ]]
-                        ) ifTrue:[
-                            goodAnswer := cls name.
-                        ]
-                    ].
-                ].
-            ].
-            nm := Dialog 
-                    request:('Class to compare for "%1"?' bindWith:nmArg)
-                    initialAnswer:goodAnswer.
-            nm isNil ifTrue:[^ self].
-            nm notEmpty ifTrue:[
-                existingClass := Smalltalk at:nm asSymbol.
-            ].
-            existingClass notNil ifTrue:[
-                classNameToClassMapping at:nmArg put:existingClass.
-                existingClasses add:existingClass.
-            ].
-            classNames add:nmArg
-        ].
+    addClassName :=
+	[:nmArg |
+	    |nm ns existingClass goodAnswer cls|
+
+	    nm := nmArg.
+	    existingClass := Smalltalk classNamed:nm.
+
+	    existingClass notNil ifTrue:[
+		goodAnswer := nm
+	    ] ifFalse:[
+		ns := NameSpace allNameSpaces
+				    detect:[:ns | (ns classNamed:nm) notNil ]
+				    ifNone:nil.
+		ns notNil ifTrue:[
+		    goodAnswer := (ns classNamed:nm) name.
+		] ifFalse:[
+		    goodAnswer := nm.
+		    (lastNameSpace notNil
+			and:[ lastNameSpace isNameSpace
+			and:[(cls := lastNameSpace classNamed:nm) notNil ]]
+		    ) ifTrue:[
+			goodAnswer := cls name.
+		    ] ifFalse:[
+			(lastNameSpace notNil
+			    and:[ lastNameSpace isBehavior
+			    and:[(cls := lastNameSpace privateClassesAt:nm asSymbol) notNil ]]
+			) ifTrue:[
+			    goodAnswer := cls name.
+			]
+		    ].
+		].
+	    ].
+	    nm := Dialog
+		    request:('Class to compare for "%1"?' bindWith:nmArg)
+		    initialAnswer:goodAnswer.
+	    nm isNil ifTrue:[^ self].
+	    nm notEmpty ifTrue:[
+		existingClass := Smalltalk at:nm asSymbol.
+	    ].
+	    existingClass notNil ifTrue:[
+		classNameToClassMapping at:nmArg put:existingClass.
+		existingClasses add:existingClass.
+	    ].
+	    classNames add:nmArg
+	].
 
     addThemChanges := [:changes |
-        "/ collect classes and mappings
-        changes do:[:c |
-            c isClassDefinitionChange ifTrue:[
-                addClassName value:(c className).
-                allChanges add:c.
-            ]].
-
-        changes do:[:c |
-            c isMethodChange ifTrue:[
-                (classNames includes:(c className)) ifFalse:[
-                    addClassName value:(c className).
-                ].
-                allChanges add:c.
-            ]].
-
-        changes do:[:c |
-            c isCompositeChange ifTrue:[
-                addThemChanges value:(c changes)
-            ].
-        ].
+	"/ collect classes and mappings
+	changes do:[:c |
+	    c isClassDefinitionChange ifTrue:[
+		addClassName value:(c className).
+		allChanges add:c.
+	    ]].
+
+	changes do:[:c |
+	    c isMethodChange ifTrue:[
+		(classNames includes:(c className)) ifFalse:[
+		    addClassName value:(c className).
+		].
+		allChanges add:c.
+	    ]].
+
+	changes do:[:c |
+	    c isCompositeChange ifTrue:[
+		addThemChanges value:(c changes)
+	    ].
+	].
     ].
 
     changes do:addThemChanges.
@@ -2265,16 +3188,16 @@
     changeSet1 := allChanges.
     changeSet2 := ChangeSet new.
     existingClasses do:[:cls |
-        changeSet2 addAll:(ChangeSet forExistingClass:cls).
+	changeSet2 addAll:(ChangeSet forExistingClass:cls).
     ].
     diffSet := changeSet1 diffSetsAgainst:changeSet2.
 
     (UserPreferences versionDiffViewerClass)
-        openOnDiffSet:diffSet 
-        labelA:'Monticello'
-        labelB:'Current (In Image)'
-        title:'Diffs'
-        ignoreExtensions:false.
+	openOnDiffSet:diffSet
+	labelA:'Monticello'
+	labelB:'Current (In Image)'
+	title:'Diffs'
+	ignoreExtensions:false.
 
     "Created: / 04-08-2011 / 17:27:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Created: / 01-12-2011 / 18:36:44 / cg"
@@ -2282,20 +3205,55 @@
 
 changeMenuDeleteSelection: changeList
 
-    self selectionDo:[:chg|chg removed: true]
-
-    "Modified: / 29-10-2010 / 13:53:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    changeList selection do:[:change|self changeMenuDeleteChange:change change].
+    changeList updateList.
+    (list2 notNil and:[changeList ~~ list2]) ifTrue:[
+	"/ to get the =-icons
+	list2 updateList
+    ].
+
     "Created: / 04-08-2011 / 17:28:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+changeMenuDeleteSelectionInverted: changeList
+    | sel |
+
+    sel := changeList selection ? #().
+    changeList list do:[:change|
+	(sel includes: change) ifFalse:[
+	    self changeMenuDeleteChange:change change
+	].
+    ].
+    changeList updateList.
+    (list2 notNil and:[changeList ~~ list2]) ifTrue:[
+	"/ to get the =-icons
+	list2 updateList
+    ].
+
+    "Created: / 17-05-2012 / 22:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+changeMenuDeleteToEnd: changeList
+    |lastIdx|
+
+    lastIdx := changeList selectionIndices max.
+    changeList list from:lastIdx do:[:change | self changeMenuDeleteChange:change change].
+    list2 notNil ifTrue:[
+	"/ to get the =-icons
+	list2 updateList
+    ].
+
+    "Created: / 27-12-2011 / 10:53:00 / cg"
+    "Created: / 30-03-2012 / 12:22:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 changeMenuInspect: changeList
 
-    | changes |
-    changes := OrderedCollection new: 1.
-    self selectionDo:[:chg|changes add: chg].
-    changes size = 1
-        ifTrue:[changes anyOne inspect]
-        ifFalse:[changes inspect].
+    changeList selection size == 1 ifTrue:[
+	changeList selection anyOne change inspect
+    ] ifFalse:[
+	(changeList selection collect:[:each|each change]) inspect
+    ]
 
     "Created: / 04-08-2011 / 17:28:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -2320,6 +3278,33 @@
     "Created: / 04-08-2011 / 17:29:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+changeMenuSelectClassInitializeDoIts: changeList
+
+    self changeMenuSelectIn: changeList suchThat:[:changeEntry|
+        | change |
+
+        change :=  changeEntry change.
+        change isDoIt 
+            and:[change source endsWith: ' initialize']
+    ]
+
+    "Created: / 13-11-2013 / 18:40:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+changeMenuSelectCopyrightMethods: changeList
+
+    self changeMenuSelectIn: changeList suchThat:[:changeEntry|
+        | change |
+
+        change :=  changeEntry change.
+        change isMethodCodeChange 
+            and:[change selector == #copyright
+            and:[change isForMeta]]
+    ]
+
+    "Created: / 12-11-2013 / 17:22:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 changeMenuSelectDifferences: changeList
 
     self changeMenuSelectIn: changeList suchThat:[:change|change delta = #~]
@@ -2327,6 +3312,21 @@
     "Created: / 04-08-2011 / 17:29:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+changeMenuSelectInversion: changeList
+
+    | oldSel newSel |
+    oldSel := changeList selection.
+    newSel := OrderedCollection new.
+    changeList list do:[:change|
+	(oldSel includes: change) ifFalse:[
+	    newSel add: change.
+	]
+    ].
+    changeList selection: newSel.
+
+    "Created: / 17-05-2012 / 23:03:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 changeMenuSelectNone: changeList
 
     self changeMenuSelectIn: changeList suchThat:[:change|false]
@@ -2390,10 +3390,24 @@
         ^ self
     ].
 
-    self changeMenuSelectIn: changeList suchThat: conditionBlock
-
-    "Modified: / 29-10-2010 / 13:05:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    self changeMenuSelectIn: changeList suchThat: [:change|conditionBlock value: change change].
+
     "Created: / 04-08-2011 / 17:42:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-01-2013 / 17:13:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+changeMenuSelectVersionMethods: changeList
+
+    self changeMenuSelectIn: changeList suchThat:[:changeEntry|
+        | change |
+
+        change :=  changeEntry change.
+        change isMethodCodeChange 
+            and:[((AbstractSourceCodeManager isVersionMethodSelector: change selector) or:[AbstractSourceCodeManager isExtensionsVersionMethodSelector:change selector])
+            and:[change isForMeta]]
+    ]
+
+    "Created: / 12-11-2013 / 17:22:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenuUndeleteSelection: changeList
@@ -2407,9 +3421,9 @@
 selectedChangesIn: changeList
     |changes|
 
-    changes := (changeList == list1 
-                    ifTrue:[ selection1Holder ] 
-                    ifFalse:[ selection2Holder ]) value.
+    changes := (changeList == list1
+		    ifTrue:[ selection1Holder ]
+		    ifFalse:[ selection2Holder ]) value.
     ^ changes collect:[:eachListEntry | eachListEntry change].
 
     "Created: / 23-07-2012 / 13:13:11 / cg"
@@ -2423,32 +3437,51 @@
 "/        [(Smalltalk at: aChange superClassName asSymbol)
 "/            ifNil:[^self error: 'Nil superclass']].
 
-    self withWaitCursorDo:[      
-        (MCStXNamespaceQuery , Class nameSpaceQuerySignal)
-            answer:(NameSpace name:(targetNamespace ? 'Smalltalk'))   
-            do: [
-                (MCStXPackageQuery , Class packageQuerySignal)
-                    answer: self targetPackage   
-                    do: [
-                        MCInteractiveLoadingQuery answer: true do:[
-                            self updateChangefileHolder value ifTrue:[
-                                aChange apply
-                            ] ifFalse:[
-                                Class withoutUpdatingChangesDo:[
-                                    ParseError handle:[:ex |
-                                        Dialog information:(ex description).
-                                    ] do:[
-                                        aChange apply
-                                    ]
-                                ]
-                            ].
-                        ]
-                    ].
-            ].
+    | nsQueries packageQueries hasMC apply targetNameSpace |
+
+    aChange removed ifTrue:[ ^ self ].
+
+
+    nsQueries := Class nameSpaceQuerySignal.
+    packageQueries := Class packageQuerySignal.
+    hasMC := ConfigurableFeatures includesFeature:#MonticelloSupport.
+    hasMC ifTrue:[
+        nsQueries := nsQueries , MCStXNamespaceQuery.
+        packageQueries := packageQueries , MCStXPackageQuery.
+    ].
+    apply := [
+        targetNameSpaceName notNil ifTrue:[ 
+            aChange applyWithNameSpaceOverride: targetNameSpaceName
+        ] ifFalse:[ 
+            aChange apply
+        ].
     ].
 
-    "Modified: / 29-10-2010 / 14:57:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    targetNameSpaceName notNil ifTrue:[
+        targetNameSpace := NameSpace name: targetNameSpaceName.
+        apply := [
+            nsQueries answer: targetNameSpace do:apply.
+        ]
+    ].
+
+    hasMC ifTrue:[
+        apply := [
+            MCInteractiveLoadingQuery answer: true do: apply
+        ].
+    ].
+
+    self withWaitCursorDo:[
+        updateChangeFileHolder value ifTrue:[
+            packageQueries answer: self targetPackage do: apply            
+        ] ifFalse:[
+            Class updateChangeFileQuerySignal answer: false do:[
+                packageQueries answer: self targetPackage do: apply
+            ]
+        ].                              
+    ].
+
     "Modified: / 07-09-2011 / 22:24:57 / cg"
+    "Modified: / 04-02-2014 / 18:27:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 changeMenuApplyChanges: changesToApply
@@ -2470,6 +3503,13 @@
     "Created: / 04-08-2011 / 17:26:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+changeMenuDeleteChange: change
+
+    change removed: true
+
+    "Created: / 30-03-2012 / 12:22:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 changeMenuSelectIn: changeList suchThat:conditionBlock
 
     | sel |
@@ -2478,6 +3518,7 @@
     changeList selectionHolder value: sel.
 
     "Created: / 04-08-2011 / 17:29:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-01-2013 / 17:12:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetBrowser2 methodsFor:'private'!
@@ -2491,18 +3532,18 @@
 getNavigatorChangeSet
 
     | changeset |
-    changeset := changesetHolder value deepCopy.
+    changeset := changesetHolder value. "/deepCopy.
     (changeset isKindOf: ChangeSet) ifFalse:
-        [changeset := ChangeSet withAll: changeset].
-
-    (self navigatorSpecHolder value ~= #oneColumnNavigatorSpec)
-        ifTrue:[^changeset groupByClass].
-
-    "Default"
-    ^changeset
+	[changeset := ChangeSet withAll: changeset].
+
+    ^ (self navigatorSpecHolder value ~~ #oneColumnNavigatorSpec) ifTrue:[
+	changeset groupByClass
+    ] ifFalse:[
+	changeset flatten
+    ]
 
     "Created: / 24-10-2009 / 19:31:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 20-07-2010 / 09:46:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-07-2012 / 17:02:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 iconSelectorForChange:aChange
@@ -2520,13 +3561,21 @@
     ^ nil.
 !
 
+list
+    "Returns list to operate on"
+
+    ^self isTwoColumn ifTrue:[list2] ifFalse:[list1]
+
+    "Created: / 30-03-2012 / 12:02:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 redrawChangeListViews
 
     list1 notNil ifTrue:[
-        list1 builder window allSubViewsDo: [:v|v redraw]
+	list1 builder window allSubViewsDo: [:v|v redraw]
     ].
     list2 notNil ifTrue:[
-        list2 builder window allSubViewsDo: [:v|v redraw]
+	list2 builder window allSubViewsDo: [:v|v redraw]
     ].
 
     "Created: / 16-03-2011 / 22:41:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -2542,14 +3591,28 @@
 "/        (self navigatorChangesetHolder value ? #()) do: aBlock
 "/    ] ifFalse:[
         selection2Holder value isEmptyOrNil not
-            ifTrue:[selection2Holder value do: applyBlock]
-            ifFalse:[selection1Holder value do: applyBlock].
+            ifTrue:[selection2Holder value do: [:e|e notNil ifTrue:[applyBlock value:e]]]
+            ifFalse:[selection1Holder value do: [:e|e notNil ifTrue:[applyBlock value:e]]].
 "/    ].
     self redrawChangeListViews
 
     "Created: / 29-10-2010 / 13:47:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 08-04-2011 / 10:15:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 20-03-2012 / 17:16:40 / cg"
+    "Modified: / 18-05-2012 / 09:05:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+showProgress: label while: block
+
+    self infoPanel progress: label while: [
+	[
+	    self isWorkingHolder value: true.
+	    block value
+	] ensure:[
+	    self isWorkingHolder value: false.
+	]
+    ]
+
+    "Created: / 10-02-2012 / 10:35:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 showSource: aBoolean
@@ -2619,6 +3682,32 @@
     "Created: / 04-08-2011 / 18:25:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!ChangeSetBrowser2 methodsFor:'testing'!
+
+isHierarchical
+
+    ^self navigatorSpecHolder == #hierarchicalNavigatorSpec
+
+    "Modified: / 14-10-2010 / 15:52:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 30-03-2012 / 11:59:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isOneColumn
+
+    ^self navigatorSpecHolder value == #oneColumnNavigatorSpec
+
+    "Modified: / 14-10-2010 / 15:52:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 30-03-2012 / 11:59:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isTwoColumn
+
+    ^self navigatorSpecHolder == #twoColumnNavigatorSpec
+
+    "Modified: / 14-10-2010 / 15:51:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 30-03-2012 / 11:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ChangeSetBrowser2::ChangeEditor class methodsFor:'documentation'!
 
 documentation
@@ -2628,7 +3717,7 @@
     allowed to edit the change (i.e., modify the source code)
 
     [author:]
-        Jan Vrany <jan.vrany@fit.cvut.cz>
+	Jan Vrany <jan.vrany@fit.cvut.cz>
 
     [instance variables:]
 
@@ -2642,16 +3731,16 @@
 examples
 "
   Starting the application:
-                                                                [exBegin]
+								[exBegin]
     Tools::ChangeEditor open
 
-                                                                [exEnd]
+								[exEnd]
 
   more examples to be added:
-                                                                [exBegin]
-    ... add code fragment for 
+								[exBegin]
+    ... add code fragment for
     ... executable example here ...
-                                                                [exEnd]
+								[exEnd]
 "
 ! !
 
@@ -2672,68 +3761,70 @@
 
     <resource: #canvas>
 
-    ^ 
+    ^
      #(FullSpec
-        name: windowSpec
-        window: 
+	name: windowSpec
+	window:
        (WindowSpec
-          label: 'Change Editor'
-          name: 'Change Editor'
-          min: (Point 10 10)
-          bounds: (Rectangle 0 0 579 341)
-        )
-        component: 
+	  label: 'Change Editor'
+	  name: 'Change Editor'
+	  min: (Point 10 10)
+	  bounds: (Rectangle 0 0 579 341)
+	)
+	component:
        (SpecCollection
-          collection: (
-           (SubCanvasSpec
-              name: 'TextDiffTool'
-              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-              hasHorizontalScrollBar: false
-              hasVerticalScrollBar: false
-              majorKey: #'Tools::TextDiffTool'
-              minorKey: windowSpecForEmbedding
-              subAspectHolders: 
-             (Array
-                
-               (SubChannelInfoSpec
-                  subAspect: classHolder
-                  aspect: classAspect
-                ) 
-               (SubChannelInfoSpec
-                  subAspect: codeAspectHolder
-                  aspect: codeAspect
-                )
-                
-               (SubChannelInfoSpec
-                  subAspect: labelAHolder
-                  aspect: labelAHolder
-                ) 
-               (SubChannelInfoSpec
-                  subAspect: labelBHolder
-                  aspect: labelBHolder
-                )
-                
-               (SubChannelInfoSpec
-                  subAspect: showDiffHolder
-                  aspect: showdiffHolder
-                ) 
-               (SubChannelInfoSpec
-                  subAspect: textAHolder
-                  aspect: sourceChangeHolder
-                )
-                
-               (SubChannelInfoSpec
-                  subAspect: textBHolder
-                  aspect: sourceImageHolder
-                )
-              )
-              createNewApplication: true
-              createNewBuilder: true
-            )
-           )
-         
-        )
+	  collection: (
+	   (SubCanvasSpec
+	      name: 'TextDiffTool'
+	      layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+	      hasHorizontalScrollBar: false
+	      hasVerticalScrollBar: false
+	      majorKey: #'Tools::TextDiff2Tool'
+	      minorKey: windowSpecForEmbedding
+	      subAspectHolders:
+	     (Array
+
+	       (SubChannelInfoSpec
+		  subAspect: classHolder
+		  aspect: classAspect
+		)
+	       (SubChannelInfoSpec
+		  subAspect: codeAspectHolder
+		  aspect: codeAspect
+		)
+
+	       (SubChannelInfoSpec
+		  subAspect: labelAHolder
+		  aspect: labelAHolder
+		)
+	       (SubChannelInfoSpec
+		  subAspect: labelBHolder
+		  aspect: labelBHolder
+		)
+
+	       (SubChannelInfoSpec
+		  subAspect: showDiffHolder
+		  aspect: showdiffHolder
+		)
+	       (SubChannelInfoSpec
+		  subAspect: textAHolder
+		  aspect: sourceChangeHolder
+		)
+
+	       (SubChannelInfoSpec
+		  subAspect: textBHolder
+		  aspect: sourceImageHolder
+		)
+	      )
+	      createNewApplication: true
+	      createNewBuilder: true
+	    )
+	   )
+
+	)
       )
+
+    "Modified: / 16-03-2012 / 13:08:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetBrowser2::ChangeEditor methodsFor:'accessing'!
@@ -2760,8 +3851,8 @@
     "return/create the 'changeHolder' value holder (automatically generated)"
 
     changeHolder isNil ifTrue:[
-        changeHolder := ValueHolder new.
-        changeHolder addDependent:self.
+	changeHolder := ValueHolder new.
+	changeHolder addDependent:self.
     ].
     ^ changeHolder
 !
@@ -2772,23 +3863,23 @@
     |oldValue newValue|
 
     changeHolder notNil ifTrue:[
-        oldValue := changeHolder value.
-        changeHolder removeDependent:self.
+	oldValue := changeHolder value.
+	changeHolder removeDependent:self.
     ].
     changeHolder := something.
     changeHolder notNil ifTrue:[
-        changeHolder addDependent:self.
+	changeHolder addDependent:self.
     ].
     newValue := changeHolder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:changeHolder.
+	self update:#value with:newValue from:changeHolder.
     ].
 !
 
 classAspect
 
-    ^(AspectAdaptor forAspect: #changeClass) 
-        subjectChannel: self changeHolder
+    ^(AspectAdaptor forAspect: #changeClass)
+	subjectChannel: self changeHolder
 
     "Created: / 29-11-2011 / 11:21:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -2796,11 +3887,11 @@
 codeAspect
 
     ^BlockValue
-        with: [:change|
-            change isMethodCodeChange
-                ifTrue:[ SyntaxHighlighter codeAspectMethod ]
-                ifFalse:[ SyntaxHighlighter codeAspectExpression ]
-        ] argument: self changeHolder
+	with: [:change|
+	    change isMethodCodeChange
+		ifTrue:[ SyntaxHighlighter codeAspectMethod ]
+		ifFalse:[ SyntaxHighlighter codeAspectExpression ]
+	] argument: self changeHolder
 
     "Created: / 29-11-2011 / 11:21:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 27-07-2012 / 22:03:31 / cg"
@@ -2824,8 +3915,8 @@
     "return/create the 'readonlyHolder' value holder (automatically generated)"
 
     readonlyHolder isNil ifTrue:[
-        readonlyHolder := ValueHolder new.
-        readonlyHolder addDependent:self.
+	readonlyHolder := ValueHolder new.
+	readonlyHolder addDependent:self.
     ].
     ^ readonlyHolder
 !
@@ -2836,16 +3927,16 @@
     |oldValue newValue|
 
     readonlyHolder notNil ifTrue:[
-        oldValue := readonlyHolder value.
-        readonlyHolder removeDependent:self.
+	oldValue := readonlyHolder value.
+	readonlyHolder removeDependent:self.
     ].
     readonlyHolder := something.
     readonlyHolder notNil ifTrue:[
-        readonlyHolder addDependent:self.
+	readonlyHolder addDependent:self.
     ].
     newValue := readonlyHolder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:readonlyHolder.
+	self update:#value with:newValue from:readonlyHolder.
     ].
 !
 
@@ -2853,7 +3944,7 @@
     "return/create the 'showdiffHolder' value holder (automatically generated)"
 
     showdiffHolder isNil ifTrue:[
-        showdiffHolder := ValueHolder new.
+	showdiffHolder := ValueHolder new.
     ].
     ^ showdiffHolder
 !
@@ -2885,8 +3976,8 @@
 
 
     changedObject == changeHolder ifTrue:[
-         self changeChanged.
-         ^ self.
+	 self changeChanged.
+	 ^ self.
     ].
     super update:something with:aParameter from:changedObject
 
@@ -2896,14 +3987,19 @@
 !ChangeSetBrowser2 class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Tools__ChangeSetBrowser2.st,v 1.53 2013-06-25 17:12:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Tools__ChangeSetBrowser2.st,v 1.54 2014-02-05 19:21:37 vrany Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libtool/Tools__ChangeSetBrowser2.st,v 1.53 2013-06-25 17:12:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Tools__ChangeSetBrowser2.st,v 1.54 2014-02-05 19:21:37 vrany Exp $'
+!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
 !
 
 version_SVN
-    ^ '$Id: Tools__ChangeSetBrowser2.st,v 1.53 2013-06-25 17:12:44 cg Exp $'
+    ^ '$Id: Tools__ChangeSetBrowser2.st,v 1.54 2014-02-05 19:21:37 vrany Exp $'
 ! !