Tools__DiffCodeView2.st
branchjv
changeset 12262 d25ef6bb0ef3
parent 12198 414e7b69ecda
child 12269 79f87eee62e5
--- a/Tools__DiffCodeView2.st	Wed Jul 18 10:57:46 2012 +0100
+++ b/Tools__DiffCodeView2.st	Wed Jul 18 18:00:57 2012 +0100
@@ -27,13 +27,20 @@
 
 "{ NameSpace: Tools }"
 
-SyncedMultiColumnTextView subclass:#DiffCodeView2
+TwoColumnTextView subclass:#DiffCodeView2
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-CodeView'
 !
 
+Object subclass:#DiffData
+	instanceVariableNames:'text1 text2 inserted deleted changed'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:DiffCodeView2
+!
+
 !DiffCodeView2 class methodsFor:'documentation'!
 
 copyright
@@ -91,22 +98,30 @@
     "Created: / 19-07-2011 / 12:55:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-synchronizeWith: aCodeView
+text1:t1 text2:t2 
+    |data|
 
-    textViews do:[:each|each synchronizeWith: aCodeView].
-
-    "Created: / 19-03-2012 / 14:26:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
+    data := self computeDiffDataForText1:t1 text2:t2.
 
-textViews
-    ^ textViews
-!
+    (textViews at:1) 
+        contents:(data text1);
+        deletedLines:(data deleted);
+        changedLines:(data changed);
+        insertedLines:#();    
+        originDiffText:t1;
+        emptyLines:(data inserted).
 
-unsynchronizeWith: aCodeView
+    (textViews at:2) 
+        contents:(data text2);
+        deletedLines:#();
+        changedLines:(data changed);
+        insertedLines:(data inserted);
+        originDiffText:t2;
+        emptyLines:(data deleted).
 
-    textViews do:[:each|each unsynchronizeWith: aCodeView].
-
-    "Created: / 19-03-2012 / 14:26:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 06-03-2010 / 10:45:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-06-2010 / 21:36:35 / Jakub <zelenja7@fel.cvut.cz>"
+    "Modified: / 15-07-2010 / 23:08:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !DiffCodeView2 methodsFor:'initialization'!
@@ -128,12 +143,213 @@
     "Modified: / 23-06-2010 / 19:36:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!DiffCodeView2 methodsFor:'private'!
+
+computeDiffDataForText1:t1 text2:t2 
+    "created diffText object from two strings
+     This processes the DiffData as returned by the (now internal) Diff-tool"
+    
+    |array1 array2 diff change index1 index2 text1 text2 i diffData deleted inserted helperText addConstant1 addConstant2 changed helper ins del pom|
+
+    "create line arrays from origin text(1 item/row)"
+    array1 := self createArray:t1.
+    array2 := self createArray:t2.
+     "inserted,deleted, cahnged lines"
+    inserted := OrderedCollection new.
+    deleted := OrderedCollection new.
+    changed := OrderedCollection new.
+     "indicates which row of origin text is added to ne text"
+    index1 := 1.
+    index2 := 1.
+     "indicate how much rows were deleted or inserted "
+    addConstant1 := 0.
+    addConstant2 := 0.
+    text1 := ''.
+    text2 := ''.
+    diff := Diff new.
+    diff a:array1 b:array2.
+    change := diff diff:false.
+    diffData := DiffData new.
+    [ change notNil ] whileTrue:[
+        "check first lines which are same"
+        (((change line0) > 0) and:[ ((change line1) > 0) ]) ifTrue:[
+            [
+                index1 <= (change line0)
+            ] whileTrue:[
+                helperText := (array1 at:index1) asText.
+                text1 := text1 asString , helperText asString.
+                index1 := index1 + 1.
+            ].
+            [
+                index2 <= (change line1)
+            ] whileTrue:[
+                helperText := (array2 at:index2) asText.
+                text2 := text2 , helperText.
+                index2 := index2 + 1.
+            ].
+        ].
+        ins := change inserted.
+        del := change deleted.
+        index1 := (change line0) + 1.
+        index2 := (change line1) + 1.
+         "find replace files "
+        ((del > 0) and:[ ins > 0 ]) ifTrue:[
+            helper := del - ins.
+            (helper <= 0) ifTrue:[
+                pom := change deleted.
+            ].
+            (helper > 0) ifTrue:[
+                pom := change inserted.
+            ].
+             "its same count row"
+            i := 1.
+            [ i <= pom ] whileTrue:[
+                changed add:index1 + addConstant1.
+                text1 := text1 , (array1 at:index1) asString.
+                text2 := text2 , (array2 at:index2) asString.
+                index1 := index1 + 1.
+                index2 := index2 + 1.
+                del := del - 1.
+                ins := ins - 1.
+                i := i + 1.
+            ].
+        ].
+         "find deleted files"
+        (del > 0) ifTrue:[
+            i := 1.
+            [ i <= del ] whileTrue:[
+                deleted add:index1 + addConstant1.
+                text2 := text2 , Character cr.
+                addConstant2 := addConstant2 + 1.
+                text1 := text1 , (array1 at:index1) asString.
+                index1 := index1 + 1.
+                i := i + 1.
+            ].
+        ].
+         "find inserted lines"
+        (ins > 0) ifTrue:[
+            i := 1.
+            [ i <= ins ] whileTrue:[
+                inserted add:index2 + addConstant2.
+                text1 := text1 , Character cr.
+                addConstant1 := addConstant1 + 1.
+                text2 := text2 , (array2 at:index2) asString.
+                index2 := index2 + 1.
+                i := i + 1.
+            ].
+        ].
+        change := change nextLink.
+    ].
+     "kontrola zda nam nechybi posledni znaky"
+    (index1 <= (array1 size)) ifTrue:[
+        [
+            index1 <= (array1 size)
+        ] whileTrue:[
+            helperText := (array1 at:index1) asText.
+            text1 := text1 , helperText.
+            index1 := index1 + 1.
+        ].
+    ].
+    (index2 <= (array2 size)) ifTrue:[
+        [
+            index2 <= (array2 size)
+        ] whileTrue:[
+            helperText := (array2 at:index2) asText.
+            text2 := text2 , helperText.
+            index2 := index2 + 1.
+        ].
+    ].
+    diffData text1:text1.
+    diffData text2:text2.
+    diffData changed:changed.
+    diffData inserted:inserted.
+    diffData deleted:deleted.
+    ^ diffData.
+
+    "Modified: / 22-06-2010 / 21:02:50 / Jakub <zelenja7@fel.cvut.cz>"
+    "Modified: / 24-06-2010 / 21:07:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-07-2012 / 18:55:01 / cg"
+!
+
+createArray:text1
+    "cg: isn't that an obfuscated variation of #asCollectionOfLines ?"
+
+    ^ text1 asStringCollection. "/ yes, it looks like !! 
+"/    | array src line c |
+"/
+"/    array := StringCollection new.
+"/    src := text1 readStream.
+"/    line := (String new: 80) writeStream.
+"/    [ src atEnd ] whileFalse:[
+"/        c := src next.
+"/        line nextPut: c.
+"/        c == Character cr ifTrue:[
+"/            array add: line contents.
+"/            line reset.
+"/        ]        
+"/    ].
+"/    line position ~~ 0 ifTrue:[
+"/        array add: line contents
+"/    ].
+"/    ^array
+
+    "Created: / 22-03-2010 / 14:48:27 / Jakub <zelenja7@fel.cvut.cz>"
+    "Modified (comment): / 19-07-2011 / 11:14:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-07-2012 / 18:55:21 / cg"
+! !
+
+!DiffCodeView2::DiffData methodsFor:'accessing'!
+
+changed
+
+    ^changed copy
+
+    "Modified: / 02-05-2010 / 19:31:18 / Jakub <zelenja7@fel.cvut.cz>"
+    "Modified: / 16-07-2010 / 09:35:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+changed:something
+    changed := something.
+!
+
+deleted
+    ^ deleted
+!
+
+deleted:something
+    deleted := something.
+!
+
+inserted
+    ^ inserted
+!
+
+inserted:something
+    inserted := something.
+!
+
+text1
+    ^ text1
+!
+
+text1:something
+    text1 := something.
+!
+
+text2
+    ^ text2
+!
+
+text2:something
+    text2 := something.
+! !
+
 !DiffCodeView2 class methodsFor:'documentation'!
 
 version_CVS
-    ^ '§Header: /cvs/stx/stx/libtool/Tools__DiffCodeView2.st,v 1.3 2011/07/19 12:32:44 vrany Exp §'
+    ^ 'Header: /cvs/stx/stx/libtool/Tools__DiffCodeView2.st,v 1.4 2012/07/17 17:03:25 cg Exp '
 !
 
 version_SVN
-    ^ '$Id: Tools__DiffCodeView2.st 7944 2012-03-19 15:32:45Z vranyj1 $'
-! !
+    ^ '$Id: Tools__DiffCodeView2.st 8018 2012-07-18 17:00:57Z vranyj1 $'
+! !
\ No newline at end of file