VersionDiffBrowser.st
branchjv
changeset 15623 f2b38a3b5dba
parent 15566 184cea584be5
parent 15621 853a92e576ac
child 15634 fb1ac619f9c3
--- a/VersionDiffBrowser.st	Fri May 08 06:59:19 2015 +0200
+++ b/VersionDiffBrowser.st	Sat May 09 06:56:52 2015 +0200
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2000 by eXept Software AG
 	      All Rights Reserved
@@ -24,9 +26,9 @@
 		classHolder versionAHolder versionBHolder infoHolder
 		includeExtensionsHolder canIncludeExtensionsHolder
 		includeCategoryChangesHolder includeVersionMethodsHolder
-		isMultipleVersionBrowser versionList selectedVersionHolder
-		symbolicVersionList selectedSymbolicVersionHolder
-		symbolicToVersionMapping'
+		isMultipleVersionBrowser versionInfoList versionList
+		selectedVersionHolder symbolicVersionList
+		selectedSymbolicVersionHolder symbolicToVersionMapping'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Browsers'
@@ -61,7 +63,7 @@
 "
     This is not yet finished (work in progress).
 
-    A browser to show differences between class versions,
+    A quickly hacked up browser to show differences between class versions,
     allowing easy comparison; will also eventually add capabilities
     to checkIn / load classes into / from the repository.
 
@@ -71,8 +73,6 @@
 
     [class variables:]
 "
-
-
 ! !
 
 !VersionDiffBrowser class methodsFor:'interface specs'!
@@ -1582,7 +1582,7 @@
 
 selectedVersionHolder
     selectedVersionHolder isNil ifTrue:[
-         selectedVersionHolder := nil asValue.
+        selectedVersionHolder := nil asValue.
         selectedVersionHolder onChangeSend:#selectedVersionHolderChanged to:self.
     ].
     ^ selectedVersionHolder
@@ -1708,6 +1708,8 @@
         ].
         self showDiffTextView.
         self diffTextView moveToNextChanged
+    ] ifFalse:[
+        self showVersionInfoIfNothingSelected
     ]
 
     "Modified: / 03-09-1999 / 15:01:30 / ps"
@@ -1733,7 +1735,9 @@
         change := methodsOnlyInAFiltered "self changeSetA" at:sel.
         self methodText value:(change prettyPrintedSource).
         self showSingleTextView.
-    ]
+    ] ifFalse:[
+        self showVersionInfoIfNothingSelected
+    ].
 
     "Modified: / 17-07-2012 / 18:31:22 / cg"
 !
@@ -1757,7 +1761,9 @@
         change := methodsOnlyInBFiltered "self changeSetB" at:sel.
         self methodText value:(change prettyPrintedSource).
         self showSingleTextView.
-    ]
+    ] ifFalse:[
+        self showVersionInfoIfNothingSelected
+    ].
 
     "Modified: / 17-07-2012 / 18:31:32 / cg"
 !
@@ -1768,18 +1774,61 @@
 !
 
 selectedVersionHolderChanged
-    |idx|
 
     self withWaitCursorDo:[
+        |idx prevSelectionIndexA prevSelectionIndexB prevSelectionIndexDifferent
+         previousChange previousClass previousSelector|
+
+        "/ remember the previous selected method
+        (prevSelectionIndexA := methodsOnlyInASelection value) notNil ifTrue:[
+            previousChange := methodsOnlyInAFiltered at:prevSelectionIndexA.
+        ].
+        (prevSelectionIndexB := methodsOnlyInBSelection value) notNil ifTrue:[  
+            previousChange := methodsOnlyInBFiltered at:prevSelectionIndexB.
+        ].
+        (prevSelectionIndexDifferent := methodsChangedSelection value) notNil ifTrue:[  
+            previousChange := (methodsChangedFiltered at:prevSelectionIndexDifferent) first.
+        ].
+        previousChange notNil ifTrue:[
+            previousClass := previousChange className.
+            previousSelector := previousChange selector.
+        ].
+
+        "/ possibly expand a contracted list
         selectedVersionHolder value = '...' ifTrue:[
             idx := self versionList size.
             self updateVersionList.
             selectedVersionHolder setValue:(self versionList at:idx).
         ].
 
+        "/ update the view
         self 
             setupForClass:classHolder value 
             againstVersion:(selectedVersionHolder value).
+
+        "/ try to reselect the same method again.
+        previousChange notNil ifTrue:[
+            "/ search a change for that in the three lists
+
+            (idx := methodsChangedFiltered findFirst:[:entry | entry first className = previousClass
+                                                       and:[ entry first selector = previousSelector]]) ~= 0
+            ifTrue:[
+                methodsChangedSelection value:idx. self methodsChangedSelectionChanged.
+            ] ifFalse:[
+                (idx := methodsOnlyInAFiltered findFirst:[:chg | chg className = previousClass
+                                                       and:[ chg selector = previousSelector]]) ~= 0
+                ifTrue:[
+                    methodsOnlyInASelection value:idx. self methodsOnlyInASelectionChanged
+                ] ifFalse:[
+                    (idx := methodsOnlyInBFiltered findFirst:[:chg | chg className = previousClass
+                                                          and:[ chg selector = previousSelector]]) ~= 0
+                    ifTrue:[
+                        methodsOnlyInBSelection value:idx. self methodsOnlyInBSelectionChanged.
+                    ]
+                ]
+            ].
+        ].
+        self showVersionInfoIfNothingSelected
     ]
 !
 
@@ -1880,30 +1929,24 @@
 !
 
 createPatchFile
-    "create a patchFile, to patch the old version (versionB) into the new version (versionA).
+    "create a patchFile, to patch the old version (versionA) into the new version (versionB).
      I.e. a little changeFile to transport those changes."
 
-    |defaultName f oldVersion newVersion vsnMthdA vsnMthdB vsnA vsnB info classBeingCompared|
-
+    |defaultName diffSet f oldVersion newVersion vsnMthdA vsnMthdB vsnA vsnB info classBeingCompared|
+
+self warn:'Sorry: This function is not yet implemented'.
     defaultName := 'patchFile.chg'.
 
     classBeingCompared := classChangeSet classBeingCompared.
-    classBeingCompared notNil ifTrue:[
-	defaultName := classBeingCompared nameWithoutPrefix.
-	classChangeSet versionA notNil ifTrue:[
-	    defaultName := defaultName , '-'.
-	    defaultName := defaultName , classChangeSet versionA.
-	    classChangeSet versionB notNil ifTrue:[
-		defaultName := defaultName , '-'.
-		defaultName := defaultName , classChangeSet versionB.
-	    ].
-	].
-	defaultName := defaultName , '.chg'.
-    ].
+    defaultName := '%1-%2-to-%3.chg'
+                        bindWith:(classBeingCompared isNil ifTrue:['unknown'] ifFalse:[classBeingCompared nameWithoutPrefix])
+                        with:(classChangeSet versionA ? 'old')
+                        with:(classChangeSet versionB ? 'new').
     f := Dialog
-	    requestFileNameForSave:'Name of patchFile:'
-	    default:defaultName.
-self warn:'Sorry: This function is not yet implemented'.
+            requestFileNameForSave:'Name of patchFile:'
+            default:defaultName.
+self halt.
+    diffSet := classChangeSet diffSet.
 ^ self.
 
 "/    vsnMthdA := self changeSetA
@@ -2210,6 +2253,29 @@
     self addAcceptToTextViewMenus.
 !
 
+showVersionInfoIfNothingSelected
+    "show the revision info (author, date, time and logMessage), if no method is selected"
+
+    |revInfo infoText|
+
+    self infoHolder value:''.
+
+    (methodsOnlyInASelection value isNil
+    and:[ methodsOnlyInBSelection value isNil
+    and:[ methodsChangedSelection value isNil ]]) ifTrue:[
+        revInfo := versionInfoList detect:[:info | (info at:#revision) = selectedVersionHolder value] ifNone:nil.
+        revInfo notNil ifTrue:[
+            infoText := 'Revision: %1\Author:   %2\Date:     %3\Log:\\%4' withCRs
+                            bindWith:(revInfo at:#revision) 
+                            with:(revInfo at:#author) 
+                            with:(revInfo at:#date)
+                            with:(revInfo at:#logMessage).
+        ].
+        self methodText value:infoText.
+        self showSingleTextView.
+    ].
+!
+
 updateLabels
     "update the labels of the diff text view. Show the version numbers
      of the class."
@@ -2351,6 +2417,10 @@
 !
 
 updateVersionList
+    "asks the classes source code manager for a list of revisions;
+     construct versionInfoList (containing the full info), versionList (containing version numbers only)
+     and tagList (containing symbolic names only)"
+
     |cls sourceCodeManager numShown newNumShown numOverallRevisions
      partialLog newestRev revisions symbolicNames
      stableRevision releasedRevision tagList logMessages items|
@@ -2373,9 +2443,12 @@
 '.
         ^ nil
     ].
+
     numOverallRevisions := partialLog at:#numberOfRevisions.
     newestRev := partialLog at:#newestRevision.
     revisions := partialLog at:#revisions.
+    
+    "/ fetch the symbolic (tag) version list
     symbolicNames := partialLog at:#symbolicNames ifAbsent:[].
     symbolicNames notNil ifTrue:[
         stableRevision := symbolicNames at:'stable' ifAbsent:[].
@@ -2388,21 +2461,26 @@
     ].
     logMessages := Dictionary new.
 
-    items := revisions collect:[:each | |rev date who flag|
-                                    rev := each at:#revision.
-                                    logMessages at:rev put:(each at:#logMessage).
-                                    date := (each at:#date ifAbsent:nil) ? '?'.
-                                    who := (each at:#author ifAbsent:nil) ? '?'.
-                                    rev = stableRevision ifTrue:[
-                                        flag := ' Stable' allBold.
-                                    ] ifFalse:[rev = releasedRevision ifTrue:[
-                                        flag := ' Released' allBold.
-                                    ] ifFalse:[
-                                        flag := ' '
-                                    ]].
-                                    rev allBold , flag, ' [' , date , ' by ' , who , ']'
-                               ].
-    revisions := revisions collect:[:each | each at:#revision].
+    versionInfoList := revisions.
+
+"/    items := versionInfoList collect:[:each | |rev date who flag|
+"/                                    rev := each at:#revision.
+"/                                    logMessages at:rev put:(each at:#logMessage).
+"/                                    date := (each at:#date ifAbsent:nil) ? '?'.
+"/                                    who := (each at:#author ifAbsent:nil) ? '?'.
+"/                                    rev = stableRevision ifTrue:[
+"/                                        flag := ' Stable' allBold.
+"/                                    ] ifFalse:[rev = releasedRevision ifTrue:[
+"/                                        flag := ' Released' allBold.
+"/                                    ] ifFalse:[
+"/                                        flag := ' '
+"/                                    ]].
+"/                                    rev allBold , flag, ' [' , date , ' by ' , who , ']'
+"/                               ].
+"/
+"/    revisions := revisions collect:[:eachItem | eachItem at:#revision].
+    revisions := versionInfoList collect:[:each | each at:#revision].
+
     revisions size < numOverallRevisions ifTrue:[
         revisions add:'...'
     ].          
@@ -2882,10 +2960,10 @@
 !VersionDiffBrowser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/VersionDiffBrowser.st,v 1.123 2015-02-24 11:48:54 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/VersionDiffBrowser.st,v 1.124 2015-05-08 10:02:18 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libtool/VersionDiffBrowser.st,v 1.123 2015-02-24 11:48:54 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/VersionDiffBrowser.st,v 1.124 2015-05-08 10:02:18 cg Exp $'
 ! !